From dbfafbc62a205fe4fa2730cec5d9edbfa47879d2 Mon Sep 17 00:00:00 2001 From: Katerina Skroumpelou Date: Mon, 15 Dec 2025 18:49:16 +0200 Subject: [PATCH] fix(supabase): resolve jsDelivr CDN ESM import failure with .js extensions Co-authored-by: Vaibhav <117663341+7ttp@users.noreply.github.com> --- packages/core/supabase-js/package.json | 2 +- .../scripts/fix-esm-extensions.cjs | 37 +++++++ packages/core/supabase-js/wrapper.mjs | 102 +++++++++++++++--- 3 files changed, 125 insertions(+), 16 deletions(-) create mode 100644 packages/core/supabase-js/scripts/fix-esm-extensions.cjs diff --git a/packages/core/supabase-js/package.json b/packages/core/supabase-js/package.json index 4b4d9eb74..8aa1557df 100644 --- a/packages/core/supabase-js/package.json +++ b/packages/core/supabase-js/package.json @@ -36,7 +36,7 @@ "scripts": { "build": "npm run build:main && npm run build:module && npm run build:esm && npm run build:umd", "build:main": "tsc -p tsconfig.json", - "build:module": "tsc -p tsconfig.module.json", + "build:module": "tsc -p tsconfig.module.json && node scripts/fix-esm-extensions.cjs", "build:esm": "node scripts/copy-wrapper.cjs", "build:umd": "webpack --env mode=production", "test": "npm run test:types && npm run test:run", diff --git a/packages/core/supabase-js/scripts/fix-esm-extensions.cjs b/packages/core/supabase-js/scripts/fix-esm-extensions.cjs new file mode 100644 index 000000000..c340b6160 --- /dev/null +++ b/packages/core/supabase-js/scripts/fix-esm-extensions.cjs @@ -0,0 +1,37 @@ +/** + * Post-build script to add .js extensions to relative imports in ESM output. + * + * Node.js ESM requires explicit file extensions for relative imports. + * TypeScript doesn't add these by default, so we add them after compilation. + * + * This fixes: + * - Node.js direct ESM imports (import { createClient } from '@supabase/supabase-js') + * - jsDelivr CDN ESM imports (when bundled with the module build) + */ +const fs = require('fs') +const path = require('path') + +function addJsExtensions(dir) { + const files = fs.readdirSync(dir, { withFileTypes: true }) + for (const file of files) { + const fullPath = path.join(dir, file.name) + if (file.isDirectory()) { + addJsExtensions(fullPath) + } else if (file.name.endsWith('.js')) { + let content = fs.readFileSync(fullPath, 'utf8') + // Add .js to relative imports that don't already have an extension + // Matches: from './foo' or from '../foo/bar' but not from './foo.js' + content = content.replace(/(from\s+['"])(\.\.?\/[^'"]+)(?