Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions scripts/generate-json-schema.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -122,14 +122,13 @@ fs.writeFileSync(
);

// Barrel files so `@shotstack/schemas/json` resolves for both module systems.
fs.writeFileSync(
path.join(OUT_DIR, "index.js"),
`import { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nexport const edit = require('./edit.json');\n`,
);
fs.writeFileSync(
path.join(OUT_DIR, "index.cjs"),
`module.exports = { edit: require('./edit.json') };\n`,
);
// Data is inlined as plain JS: JSON require()/import needs runtime support
// (createRequire breaks when bundlers emit CJS — import.meta.url is undefined;
// JSON import attributes vary across Node versions). Plain JS modules work
// everywhere, including esbuild/webpack Lambda bundles.
const editJs = JSON.stringify(output);
fs.writeFileSync(path.join(OUT_DIR, "index.js"), `export const edit = ${editJs};\n`);
fs.writeFileSync(path.join(OUT_DIR, "index.cjs"), `module.exports = { edit: ${editJs} };\n`);
fs.writeFileSync(
path.join(OUT_DIR, "index.d.ts"),
`export declare const edit: Record<string, unknown>;\n`,
Expand Down
13 changes: 13 additions & 0 deletions tests/smoke.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,19 @@ async function run() {
assert.ok(typeof mod.edit === "object", "edit export not found");
});

console.log("\n--- JSON barrel bundler-safety checks ---\n");

// Regression: createRequire(import.meta.url) in the ESM barrel crashed
// esbuild CJS Lambda bundles (import.meta.url is undefined there). The
// barrels must be pure data modules — no runtime module machinery.
for (const barrel of ["json-schema/index.js", "json-schema/index.cjs"]) {
check(`${barrel} is a pure data module`, () => {
const src = fs.readFileSync(path.join(distDir, barrel), "utf8");
assert.ok(!src.includes("import.meta"), "contains import.meta");
assert.ok(!src.includes("require("), "contains runtime require()");
});
}

console.log("\n--- JSON Schema validation checks ---\n");

const Ajv2020 = require("ajv/dist/2020");
Expand Down
Loading