From 876a30a3aee27148bd230129c719e9ddf35aace4 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Wed, 8 Oct 2025 10:05:11 +0900 Subject: [PATCH] refactor(rsc): move common code for `transformCjsToEsm` --- packages/plugin-rsc/src/plugins/cjs.ts | 8 ------ .../plugin-rsc/src/transforms/cjs.test.ts | 25 +++++++++++++++---- packages/plugin-rsc/src/transforms/cjs.ts | 11 ++++++++ 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/packages/plugin-rsc/src/plugins/cjs.ts b/packages/plugin-rsc/src/plugins/cjs.ts index 60af1e22..e955fb4b 100644 --- a/packages/plugin-rsc/src/plugins/cjs.ts +++ b/packages/plugin-rsc/src/plugins/cjs.ts @@ -54,14 +54,6 @@ export function cjsModuleRunnerPlugin(): Plugin[] { const ast = await parseAstAsync(code) const result = transformCjsToEsm(code, ast) const output = result.output - // TODO: can we use cjs-module-lexer to properly define named exports? - // for re-exports, we need to eagerly transform dependencies though. - // https://github.com/nodejs/node/blob/f3adc11e37b8bfaaa026ea85c1cf22e3a0e29ae9/lib/internal/modules/esm/translators.js#L382-L409 - output.append(` -;__vite_ssr_exportAll__(module.exports); -export default module.exports; -export const __cjs_module_runner_transform = true; -`) return { code: output.toString(), map: output.generateMap({ hires: 'boundary' }), diff --git a/packages/plugin-rsc/src/transforms/cjs.test.ts b/packages/plugin-rsc/src/transforms/cjs.test.ts index b4342448..dc5a9406 100644 --- a/packages/plugin-rsc/src/transforms/cjs.test.ts +++ b/packages/plugin-rsc/src/transforms/cjs.test.ts @@ -24,6 +24,10 @@ exports.ok = true; expect(await testTransform(input)).toMatchInlineSnapshot(` "let exports = {}; const module = { exports }; exports.ok = true; + + ;__vite_ssr_exportAll__(module.exports); + export default module.exports; + export const __cjs_module_runner_transform = true; " `) }) @@ -44,6 +48,10 @@ if (true) { } else { module.exports = (__cjs_interop__(await import('./cjs/use-sync-external-store.development.js'))); } + + ;__vite_ssr_exportAll__(module.exports); + export default module.exports; + export const __cjs_module_runner_transform = true; " `) }) @@ -66,6 +74,10 @@ if (true) { var ReactDOM = __cjs_to_esm_hoist_1; exports.useSyncExternalStoreWithSelector = function () {} })() + + ;__vite_ssr_exportAll__(module.exports); + export default module.exports; + export const __cjs_module_runner_transform = true; " `) }) @@ -97,6 +109,10 @@ function test() { const y2 = __cjs_to_esm_hoist_1().test; consoe.log(__cjs_to_esm_hoist_2) } + + ;__vite_ssr_exportAll__(module.exports); + export default module.exports; + export const __cjs_module_runner_transform = true; " `) }) @@ -114,6 +130,10 @@ function test() { const require = () => {}; require("test"); } + + ;__vite_ssr_exportAll__(module.exports); + export default module.exports; + export const __cjs_module_runner_transform = true; " `) }) @@ -130,11 +150,6 @@ function test() { if (id.endsWith('.cjs')) { const ast = await parseAstAsync(code) const { output } = transformCjsToEsm(code, ast) - output.append(` -;__vite_ssr_exportAll__(module.exports); -export default module.exports; -export const __cjs_module_runner_transform = true; -`) return { code: output.toString(), map: output.generateMap({ hires: 'boundary' }), diff --git a/packages/plugin-rsc/src/transforms/cjs.ts b/packages/plugin-rsc/src/transforms/cjs.ts index fa80ec4b..ba14faec 100644 --- a/packages/plugin-rsc/src/transforms/cjs.ts +++ b/packages/plugin-rsc/src/transforms/cjs.ts @@ -75,6 +75,7 @@ export function transformCjsToEsm( parentNodes.pop()! }, }) + // TODO: prepend after shebang for (const hoisted of hoistedCodes.reverse()) { output.prepend(hoisted) } @@ -83,5 +84,15 @@ export function transformCjsToEsm( } // https://nodejs.org/docs/v22.19.0/api/modules.html#exports-shortcut output.prepend(`let exports = {}; const module = { exports };\n`) + + // TODO: can we use cjs-module-lexer to properly define named exports? + // for re-exports, we need to eagerly transform dependencies though. + // https://github.com/nodejs/node/blob/f3adc11e37b8bfaaa026ea85c1cf22e3a0e29ae9/lib/internal/modules/esm/translators.js#L382-L409 + output.append(` +;__vite_ssr_exportAll__(module.exports); +export default module.exports; +export const __cjs_module_runner_transform = true; +`) + return { output } }