From c9d4529787ade9f991fd8403521121c4b834b7ce Mon Sep 17 00:00:00 2001 From: dazzatronus Date: Tue, 11 Aug 2026 20:50:15 +1000 Subject: [PATCH] fix: inline JSON data in /json barrels so CJS bundlers don't hit createRequire(import.meta.url) --- scripts/generate-json-schema.cjs | 15 +++++++-------- tests/smoke.cjs | 13 +++++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/scripts/generate-json-schema.cjs b/scripts/generate-json-schema.cjs index 4264bd2..df8d7b6 100644 --- a/scripts/generate-json-schema.cjs +++ b/scripts/generate-json-schema.cjs @@ -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;\n`, diff --git a/tests/smoke.cjs b/tests/smoke.cjs index fc5e09a..ce5c651 100644 --- a/tests/smoke.cjs +++ b/tests/smoke.cjs @@ -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");