diff --git a/src/package.json b/src/package.json index c55c334a7..b90f9380d 100644 --- a/src/package.json +++ b/src/package.json @@ -20,6 +20,18 @@ "import": "./dist/node/eejs/index.mjs", "require": "./dist-cjs/node/eejs/index.cjs" }, + "./node/eejs/index.js": { + "import": "./dist/node/eejs/index.mjs", + "require": "./dist-cjs/node/eejs/index.cjs" + }, + "./node/eejs/index": { + "import": "./dist/node/eejs/index.mjs", + "require": "./dist-cjs/node/eejs/index.cjs" + }, + "./node/eejs/": { + "import": "./dist/node/eejs/index.mjs", + "require": "./dist-cjs/node/eejs/index.cjs" + }, "./node/*": { "import": "./dist/node/*.mjs", "require": "./dist-cjs/node/*.cjs" diff --git a/src/tests/backend/specs/exports_map.ts b/src/tests/backend/specs/exports_map.ts index 58d55128b..b6da400ed 100644 --- a/src/tests/backend/specs/exports_map.ts +++ b/src/tests/backend/specs/exports_map.ts @@ -6,6 +6,7 @@ const require = createRequire(import.meta.url); // All CJS subpaths must resolve to a .cjs file. const cjsResolvableSubpaths = [ 'ep_etherpad-lite/node/eejs', + 'ep_etherpad-lite/node/eejs/', 'ep_etherpad-lite/node/db/PadManager', 'ep_etherpad-lite/node/db/API.js', 'ep_etherpad-lite/node/db/AuthorManager', diff --git a/src/tsdown.config.ts b/src/tsdown.config.ts index 5d2a9c2df..8f1f25c9d 100644 --- a/src/tsdown.config.ts +++ b/src/tsdown.config.ts @@ -1,3 +1,4 @@ +import { writeFileSync } from 'node:fs'; import { defineConfig } from 'tsdown'; // Globs covering every subpath plugins consume from ep_etherpad-lite. @@ -33,11 +34,26 @@ export default defineConfig([ entry: commonEntries, format: 'esm', outDir: 'dist', + hooks: { + // Node's legacy trailing-slash exports mapping for "./node/eejs/" resolves + // the empty suffix to dist/node/eejs/.mjs (key + "" → value-prefix + ""). + // We emit this stub so require('ep_etherpad-lite/node/eejs/') works even + // though DEP0155 will still fire for callers using the trailing-slash form. + 'build:done': () => { + writeFileSync('dist/node/eejs/.mjs', "export * from './index.mjs';\n"); + }, + }, }, { ...common, entry: cjsEntries, format: 'cjs', outDir: 'dist-cjs', + hooks: { + // Counterpart CJS stub for the "./node/eejs/" trailing-slash exports entry. + 'build:done': () => { + writeFileSync('dist-cjs/node/eejs/.cjs', "module.exports = require('./index.cjs');\n"); + }, + }, }, ]);