From 35d8a2aca652625a6569de242458164ae1edd27d Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Mon, 3 Nov 2025 20:15:27 -0500 Subject: [PATCH] fix: add CJS support to @netlify/runtime-utils to fix ERR_REQUIRE_ESM @netlify/blobs is dual-format (CJS + ESM) and depends on @netlify/runtime-utils. When the CJS build of @netlify/blobs is used (e.g., in Background Functions), it tries to require() @netlify/runtime-utils, which was ESM-only, causing ERR_REQUIRE_ESM errors at runtime. This change makes @netlify/runtime-utils dual-format so it can be consumed by both CJS and ESM contexts. When @netlify/blobs becomes ESM-only in the future, we can remove CJS support from @netlify/runtime-utils as well. Fixes #437 --- packages/runtime-utils/package.json | 20 ++++++++++++++++++-- packages/runtime-utils/tsup.config.ts | 5 ++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/runtime-utils/package.json b/packages/runtime-utils/package.json index c9da00e7..7dc623fb 100644 --- a/packages/runtime-utils/package.json +++ b/packages/runtime-utils/package.json @@ -6,9 +6,25 @@ "engines": { "node": "^18.14.0 || >=20" }, - "main": "./dist/main.js", - "exports": "./dist/main.js", + "main": "./dist/main.cjs", + "module": "./dist/main.js", "types": "./dist/main.d.ts", + "exports": { + ".": { + "require": { + "types": "./dist/main.d.cts", + "default": "./dist/main.cjs" + }, + "import": { + "types": "./dist/main.d.ts", + "default": "./dist/main.js" + }, + "default": { + "types": "./dist/main.d.ts", + "default": "./dist/main.js" + } + } + }, "files": [ "dist/**/*" ], diff --git a/packages/runtime-utils/tsup.config.ts b/packages/runtime-utils/tsup.config.ts index c3b8320f..5d493d3a 100644 --- a/packages/runtime-utils/tsup.config.ts +++ b/packages/runtime-utils/tsup.config.ts @@ -7,7 +7,10 @@ export default defineConfig([ clean: true, entry: ['src/main.ts'], outDir: 'dist', - format: ['esm'], + // We build both CJS and ESM because @netlify/blobs is dual-format and depends on this package. + // When @netlify/blobs becomes ESM-only, we can remove CJS here and go ESM-only too. + // See: https://github.com/netlify/primitives/issues/437 + format: ['cjs', 'esm'], dts: true, splitting: false, watch: argv.includes('--watch'),