diff --git a/.oxfmtrc.json b/.oxfmtrc.json index ec2b1779f..797131d57 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -10,6 +10,7 @@ }, "ignorePatterns": [ "*.snap.*", + "packages/plugin-rsc/src/transforms/fixtures/source-map/", "typescript-eslint/", "packages/*/CHANGELOG.md", "playground-temp/", diff --git a/packages/plugin-rsc/examples/use-cache-callable/callable-cache-plugin.ts b/packages/plugin-rsc/examples/use-cache-callable/callable-cache-plugin.ts index f84717491..7be016bb3 100644 --- a/packages/plugin-rsc/examples/use-cache-callable/callable-cache-plugin.ts +++ b/packages/plugin-rsc/examples/use-cache-callable/callable-cache-plugin.ts @@ -3,7 +3,7 @@ import { hasDirective, transformDirectiveProxyExport, transformHoistInlineDirective, - transformWrapExport, + transformModuleExportWrap, } from '@vitejs/plugin-rsc/transforms' import { parseAstAsync, type Plugin } from 'vite' @@ -29,21 +29,33 @@ export function callableCachePlugin(): Plugin { const environmentName = this.environment.name if (environmentName === 'rsc') { - const runtime = (value: string, name: string) => + const runtime = (value: string, name: string, originalName?: string) => `$$ReactServer.registerServerReference(` + - `$$cacheWrapper(${value}),` + + (originalName + ? `Object.defineProperty($$cacheWrapper(${value}), "name", { value: ${JSON.stringify(originalName)} }),` + : `$$cacheWrapper(${value}),`) + `${JSON.stringify(reference.referenceKey)},` + `${JSON.stringify(name)})` const result = hasDirective(ast.body, directive) - ? transformWrapExport(code, ast, { - runtime, + ? transformModuleExportWrap(code, ast, { + generate: ({ implementation, originalName, exportName }) => + `/* #__PURE__ */ ${runtime(implementation, exportName, originalName ?? exportName)}`, + // Next.js calls rejecting primitive literals while permitting + // objects and arrays arbitrary, but keeps the latter for metadata + // and viewport exports. + // https://github.com/vercel/next.js/blob/aae4179ac628e55483b62cd023a7e1827dcef122/crates/next-custom-transforms/src/transforms/server_actions.rs#L1914-L1919 + filter: (_name, meta) => + meta.valueNode?.type !== 'ObjectExpression' && + meta.valueNode?.type !== 'ArrayExpression', rejectNonAsyncFunction: true, }) : transformHoistInlineDirective(code, ast, { directive, rejectNonAsyncFunction: true, hoistRuntime: true, - runtime, + // TODO: Preserve the source function name once the inline hoist + // runtime callback exposes it. + runtime: (value, name) => runtime(value, name), }) if (!result.output.hasChanged()) { manager.serverReferences.deleteClaim(pluginName, id) @@ -52,7 +64,7 @@ export function callableCachePlugin(): Plugin { manager.serverReferences.replaceClaim(pluginName, id, { ...reference, - exportNames: 'names' in result ? result.names : result.exportNames, + exportNames: 'names' in result ? result.names : result.referenceNames, }) result.output.prepend( `import $$cacheWrapper from "/src/framework/use-cache-runtime";\n` + diff --git a/packages/plugin-rsc/examples/use-cache-callable/src/features/file-directive-from-server/action.ts b/packages/plugin-rsc/examples/use-cache-callable/src/features/file-directive-from-server/action.ts index c912d165f..056907b7e 100644 --- a/packages/plugin-rsc/examples/use-cache-callable/src/features/file-directive-from-server/action.ts +++ b/packages/plugin-rsc/examples/use-cache-callable/src/features/file-directive-from-server/action.ts @@ -2,6 +2,11 @@ import { state } from './state' +// Next.js permits object and array values as ordinary exports from "use cache" +// modules, primarily for metadata and viewport objects. +export const metadata = {} +export const tags: string[] = [] + export async function cachedFromServer(formData: FormData) { const argument = String(formData.get('argument')) state.executionCount++ diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index b29404cbc..682af5e68 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -70,12 +70,12 @@ import { slash, } from './plugins/vite-utils' import { - type TransformWrapExportFilter, + type TransformModuleExportWrapFilter, hasDirective, transformDirectiveProxyExport, transformExpandExportAll, transformServerActionServer, - transformWrapExport, + transformModuleExportWrap, findDirectives, type TransformExpandExportAllContext, } from './transforms' @@ -2419,7 +2419,7 @@ function vitePluginRscCss( }: { id: string code: string - }): false | TransformWrapExportFilter { + }): false | TransformModuleExportWrapFilter { const { filename, query } = parseIdQuery(id) if ('vite-rsc-css-export' in query) { const value = query['vite-rsc-css-export'] @@ -2753,19 +2753,19 @@ export async function transformRscCssExport(options: { ast: Awaited> code: string id?: string - filter: TransformWrapExportFilter + filter: TransformModuleExportWrapFilter }): Promise<{ output: MagicString } | undefined> { if (hasDirective(options.ast.body, 'use client')) { return } - const result = transformWrapExport(options.code, options.ast, { - runtime: (value, name, meta) => - `__vite_rsc_wrap_css__(${value}, ${JSON.stringify( - meta.defaultExportIdentifierName ?? name, + const result = transformModuleExportWrap(options.code, options.ast, { + generate: ({ implementation, originalName, exportName, meta }) => + `/* #__PURE__ */ __vite_rsc_wrap_css__(${implementation}, ${JSON.stringify( + originalName ?? meta.defaultExportIdentifierName ?? exportName, )})`, filter: options.filter, - ignoreExportAllDeclaration: true, + exportAll: 'preserve', }) if (result.output.hasChanged()) { if (!options.code.includes('__vite_rsc_react__')) { diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/classes.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/classes.js new file mode 100644 index 000000000..8f55ccbeb --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/classes.js @@ -0,0 +1,7 @@ +'use server' + +export class NamedClass {} + +export const ClassExpression = class InnerClass {} + +export default class DefaultClass {} diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/classes.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/classes.js.map.snap.md new file mode 100644 index 000000000..19c97ed8e --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/classes.js.map.snap.md @@ -0,0 +1,49 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "class NamedClass {}\n" --> (2:0) "class NamedClass {}\n" +(4:7) "const" --> (4:0) "let" +(4:12) " ClassExpression = class InnerClass {}\n" --> (4:3) " ClassExpression = class InnerClass {}\n" +(6:15) "class DefaultClass {}\n" --> (6:0) "class DefaultClass {}\n" +(2:0) "export class NamedClass {}\n" --> (7:0) "NamedClass = /* #__PURE__ */ registerServerReference(NamedClass, \"NamedClass\");\n" +(2:0) "export class NamedClass {}\n" --> (8:0) "export { NamedClass };\n" +(4:0) "export const ClassExpression = class InnerClass {}\n" --> (9:0) "ClassExpression = /* #__PURE__ */ registerServerReference(ClassExpression, \"ClassExpression\");\n" +(4:0) "export const ClassExpression = class InnerClass {}\n" --> (10:0) "export { ClassExpression };\n" +[unmapped] --> (11:0) ";\n" +[unmapped] --> (12:0) "const $$wrap_DefaultClass = /* #__PURE__ */ registerServerReference(DefaultClass, \"default\");\n" +[unmapped] --> (13:0) "export { $$wrap_DefaultClass as default };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "class NamedClass {}\n" --> (2:0) "class NamedClass {}\n" +(4:7) "const ClassExpression = class InnerClass {}\n" --> (4:0) "const ClassExpression = class InnerClass {}\n" +(6:15) "class DefaultClass {}\n" --> (6:0) "class DefaultClass {}\n" +(2:0) "export class NamedClass {}\n" --> (7:0) "\n" +(2:0) "export class NamedClass {}\n" --> (8:0) "registerServerReference(NamedClass, \"NamedClass\");\n" +(2:0) "export class NamedClass {}\n" --> (9:0) "export { NamedClass };\n" +(4:0) "export const ClassExpression = class InnerClass {}\n" --> (10:0) "\n" +(4:0) "export const ClassExpression = class InnerClass {}\n" --> (11:0) "registerServerReference(ClassExpression, \"ClassExpression\");\n" +(4:0) "export const ClassExpression = class InnerClass {}\n" --> (12:0) "export { ClassExpression };\n" +(6:0) "export default class DefaultClass {}\n" --> (13:0) "\n" +(6:0) "export default class DefaultClass {}\n" --> (14:0) "registerServerReference(DefaultClass, \"default\");\n" +(6:0) "export default class DefaultClass {}\n" --> (15:0) "export default DefaultClass;\n" +``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "class NamedClass {}\n" --> (2:0) "class NamedClass {}\n" +(4:7) "const ClassExpression = class InnerClass {}\n" --> (4:0) "const ClassExpression = class InnerClass {}\n" +(6:15) "class DefaultClass {}\n" --> (6:0) "class DefaultClass {}\n" +[unmapped] --> (8:0) "const $$module_0_binding_NamedClass = registerServerReference(NamedClass, \"NamedClass\");\n" +[unmapped] --> (9:0) "export { $$module_0_binding_NamedClass as NamedClass };\n" +[unmapped] --> (10:0) "const $$module_1_binding_ClassExpression = registerServerReference(ClassExpression, \"ClassExpression\");\n" +[unmapped] --> (11:0) "export { $$module_1_binding_ClassExpression as ClassExpression };\n" +[unmapped] --> (12:0) "const $$module_2_binding_default = registerServerReference(DefaultClass, \"default\");\n" +[unmapped] --> (13:0) "export { $$module_2_binding_default as default };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/classes.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/classes.js.snap.md new file mode 100644 index 000000000..33d6bcb85 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/classes.js.snap.md @@ -0,0 +1,88 @@ +## Input + +```js +'use server' + +export class NamedClass {} + +export const ClassExpression = class InnerClass {} + +export default class DefaultClass {} +``` + +## wrap-export + +**Status:** transformed + +**References:** NamedClass, ClassExpression, default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#NDY1ACd1c2Ugc2VydmVyJwoKY2xhc3MgTmFtZWRDbGFzcyB7fQoKbGV0IENsYXNzRXhwcmVzc2lvbiA9IGNsYXNzIElubmVyQ2xhc3Mge30KCmNsYXNzIERlZmF1bHRDbGFzcyB7fQpOYW1lZENsYXNzID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKE5hbWVkQ2xhc3MsICJOYW1lZENsYXNzIik7CmV4cG9ydCB7IE5hbWVkQ2xhc3MgfTsKQ2xhc3NFeHByZXNzaW9uID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKENsYXNzRXhwcmVzc2lvbiwgIkNsYXNzRXhwcmVzc2lvbiIpOwpleHBvcnQgeyBDbGFzc0V4cHJlc3Npb24gfTsKOwpjb25zdCAkJHdyYXBfRGVmYXVsdENsYXNzID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKERlZmF1bHRDbGFzcywgImRlZmF1bHQiKTsKZXhwb3J0IHsgJCR3cmFwX0RlZmF1bHRDbGFzcyBhcyBkZWZhdWx0IH07CjM4NwB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5leHBvcnQgY2xhc3MgTmFtZWRDbGFzcyB7fVxuXG5leHBvcnQgY29uc3QgQ2xhc3NFeHByZXNzaW9uID0gY2xhc3MgSW5uZXJDbGFzcyB7fVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWZhdWx0Q2xhc3Mge31cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQzs7QUFFbEIsR0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUVsQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7QUFKbkM7QUFBQTtBQUVBO0FBQUE7Ozs7In0=) + +```js +'use server' + +class NamedClass {} + +let ClassExpression = class InnerClass {} + +class DefaultClass {} +NamedClass = /* #__PURE__ */ registerServerReference(NamedClass, "NamedClass"); +export { NamedClass }; +ClassExpression = /* #__PURE__ */ registerServerReference(ClassExpression, "ClassExpression"); +export { ClassExpression }; +; +const $$wrap_DefaultClass = /* #__PURE__ */ registerServerReference(DefaultClass, "default"); +export { $$wrap_DefaultClass as default }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** NamedClass, ClassExpression, default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzQ3ACd1c2Ugc2VydmVyJwoKY2xhc3MgTmFtZWRDbGFzcyB7fQoKY29uc3QgQ2xhc3NFeHByZXNzaW9uID0gY2xhc3MgSW5uZXJDbGFzcyB7fQoKY2xhc3MgRGVmYXVsdENsYXNzIHt9CgpyZWdpc3RlclNlcnZlclJlZmVyZW5jZShOYW1lZENsYXNzLCAiTmFtZWRDbGFzcyIpOwpleHBvcnQgeyBOYW1lZENsYXNzIH07CgpyZWdpc3RlclNlcnZlclJlZmVyZW5jZShDbGFzc0V4cHJlc3Npb24sICJDbGFzc0V4cHJlc3Npb24iKTsKZXhwb3J0IHsgQ2xhc3NFeHByZXNzaW9uIH07CgpyZWdpc3RlclNlcnZlclJlZmVyZW5jZShEZWZhdWx0Q2xhc3MsICJkZWZhdWx0Iik7CmV4cG9ydCBkZWZhdWx0IERlZmF1bHRDbGFzczsKNDA5AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBjbGFzcyBOYW1lZENsYXNzIHt9XG5cbmV4cG9ydCBjb25zdCBDbGFzc0V4cHJlc3Npb24gPSBjbGFzcyBJbm5lckNsYXNzIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERlZmF1bHRDbGFzcyB7fVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRUosS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUVsQixLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7O0FBRWxDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUpuQztBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7In0=) + +```js +'use server' + +class NamedClass {} + +const ClassExpression = class InnerClass {} + +class DefaultClass {} + +registerServerReference(NamedClass, "NamedClass"); +export { NamedClass }; + +registerServerReference(ClassExpression, "ClassExpression"); +export { ClassExpression }; + +registerServerReference(DefaultClass, "default"); +export default DefaultClass; +``` + +## module-export-wrap + +**Status:** transformed + +**References:** NamedClass, ClassExpression, default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#NTUzACd1c2Ugc2VydmVyJwoKY2xhc3MgTmFtZWRDbGFzcyB7fQoKY29uc3QgQ2xhc3NFeHByZXNzaW9uID0gY2xhc3MgSW5uZXJDbGFzcyB7fQoKY2xhc3MgRGVmYXVsdENsYXNzIHt9Cgpjb25zdCAkJG1vZHVsZV8wX2JpbmRpbmdfTmFtZWRDbGFzcyA9IHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKE5hbWVkQ2xhc3MsICJOYW1lZENsYXNzIik7CmV4cG9ydCB7ICQkbW9kdWxlXzBfYmluZGluZ19OYW1lZENsYXNzIGFzIE5hbWVkQ2xhc3MgfTsKY29uc3QgJCRtb2R1bGVfMV9iaW5kaW5nX0NsYXNzRXhwcmVzc2lvbiA9IHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKENsYXNzRXhwcmVzc2lvbiwgIkNsYXNzRXhwcmVzc2lvbiIpOwpleHBvcnQgeyAkJG1vZHVsZV8xX2JpbmRpbmdfQ2xhc3NFeHByZXNzaW9uIGFzIENsYXNzRXhwcmVzc2lvbiB9Owpjb25zdCAkJG1vZHVsZV8yX2JpbmRpbmdfZGVmYXVsdCA9IHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKERlZmF1bHRDbGFzcywgImRlZmF1bHQiKTsKZXhwb3J0IHsgJCRtb2R1bGVfMl9iaW5kaW5nX2RlZmF1bHQgYXMgZGVmYXVsdCB9OwozNzAAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGNsYXNzIE5hbWVkQ2xhc3Mge31cblxuZXhwb3J0IGNvbnN0IENsYXNzRXhwcmVzc2lvbiA9IGNsYXNzIElubmVyQ2xhc3Mge31cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVmYXVsdENsYXNzIHt9XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFSixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7O0FBRWxCLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQzs7QUFFbEMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDOzs7Ozs7OzsifQ==) + +```js +'use server' + +class NamedClass {} + +const ClassExpression = class InnerClass {} + +class DefaultClass {} + +const $$module_0_binding_NamedClass = registerServerReference(NamedClass, "NamedClass"); +export { $$module_0_binding_NamedClass as NamedClass }; +const $$module_1_binding_ClassExpression = registerServerReference(ClassExpression, "ClassExpression"); +export { $$module_1_binding_ClassExpression as ClassExpression }; +const $$module_2_binding_default = registerServerReference(DefaultClass, "default"); +export { $$module_2_binding_default as default }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous-class.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous-class.js new file mode 100644 index 000000000..4bd0d1182 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous-class.js @@ -0,0 +1,3 @@ +'use server' + +export default class {} diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous-class.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous-class.js.map.snap.md new file mode 100644 index 000000000..5d1a1eb50 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous-class.js.map.snap.md @@ -0,0 +1,31 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "export default " --> (2:0) "const $$default = " +(2:15) "class {}\n" --> (2:18) "class {}\n" +[unmapped] --> (3:0) ";\n" +[unmapped] --> (4:0) "const $$wrap_$$default = /* #__PURE__ */ registerServerReference($$default, \"default\");\n" +[unmapped] --> (5:0) "export { $$wrap_$$default as default };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:6) " default " --> (2:0) "const $$effect_default = " +(2:15) "class {}\n" --> (2:25) "class {}\n" +(2:0) "export default class {}\n" --> (3:0) "\n" +(2:0) "export default class {}\n" --> (4:0) "registerServerReference($$effect_default, \"default\");\n" +(2:0) "export default class {}\n" --> (5:0) "export default $$effect_default;\n" +``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "export default " --> (2:0) "const $$module_0_implementation_default = " +(2:15) "class {}\n" --> (2:42) "class {}\n" +[unmapped] --> (4:0) "const $$module_0_binding_default = registerServerReference($$module_0_implementation_default, \"default\");\n" +[unmapped] --> (5:0) "export { $$module_0_binding_default as default };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous-class.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous-class.js.snap.md new file mode 100644 index 000000000..e557c2617 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous-class.js.snap.md @@ -0,0 +1,58 @@ +## Input + +```js +'use server' + +export default class {} +``` + +## wrap-export + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTcxACd1c2Ugc2VydmVyJwoKY29uc3QgJCRkZWZhdWx0ID0gY2xhc3Mge30KOwpjb25zdCAkJHdyYXBfJCRkZWZhdWx0ID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKCQkZGVmYXVsdCwgImRlZmF1bHQiKTsKZXhwb3J0IHsgJCR3cmFwXyQkZGVmYXVsdCBhcyBkZWZhdWx0IH07CjE3MQB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyB7fVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRVgsa0JBQWUsS0FBSyxDQUFDLENBQUM7Ozs7In0=) + +```js +'use server' + +const $$default = class {} +; +const $$wrap_$$default = /* #__PURE__ */ registerServerReference($$default, "default"); +export { $$wrap_$$default as default }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTM2ACd1c2Ugc2VydmVyJwoKY29uc3QgJCRlZmZlY3RfZGVmYXVsdCA9IGNsYXNzIHt9CgpyZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJGVmZmVjdF9kZWZhdWx0LCAiZGVmYXVsdCIpOwpleHBvcnQgZGVmYXVsdCAkJGVmZmVjdF9kZWZhdWx0OwoxODQAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge31cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVMLHlCQUFTLEtBQUssQ0FBQyxDQUFDO0FBQXRCO0FBQUE7QUFBQTsifQ==) + +```js +'use server' + +const $$effect_default = class {} + +registerServerReference($$effect_default, "default"); +export default $$effect_default; +``` + +## module-export-wrap + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjIyACd1c2Ugc2VydmVyJwoKY29uc3QgJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9kZWZhdWx0ID0gY2xhc3Mge30KCmNvbnN0ICQkbW9kdWxlXzBfYmluZGluZ19kZWZhdWx0ID0gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9kZWZhdWx0LCAiZGVmYXVsdCIpOwpleHBvcnQgeyAkJG1vZHVsZV8wX2JpbmRpbmdfZGVmYXVsdCBhcyBkZWZhdWx0IH07CjE3MQB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyB7fVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRVgsMENBQWUsS0FBSyxDQUFDLENBQUM7Ozs7In0=) + +```js +'use server' + +const $$module_0_implementation_default = class {} + +const $$module_0_binding_default = registerServerReference($$module_0_implementation_default, "default"); +export { $$module_0_binding_default as default }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.map.snap.md index 392988413..537821997 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.map.snap.md @@ -23,3 +23,15 @@ (2:0) "export default async function () {\n" --> (6:0) "registerServerReference($$effect_default, \"default\");\n" (2:0) "export default async function () {\n" --> (7:0) "export default $$effect_default;\n" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "export default " --> (2:0) "const $$module_0_implementation_default = " +(2:15) "async function () {\n" --> (2:42) "async function () {\n" +(3:0) " return 'default anonymous function called'\n" --> (3:0) " return 'default anonymous function called'\n" +(4:0) "}\n" --> (4:0) "}\n" +[unmapped] --> (6:0) "const $$module_0_binding_default = Object.defineProperty(registerServerReference($$module_0_implementation_default, \"default\"), \"name\", { value: \"default\" });\n" +[unmapped] --> (7:0) "export { $$module_0_binding_default as default };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.snap.md index 2c88b1a97..0da796b68 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.snap.md @@ -45,3 +45,22 @@ const $$effect_default = async function () { registerServerReference($$effect_default, "default"); export default $$effect_default; ``` + +## module-export-wrap + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzMzACd1c2Ugc2VydmVyJwoKY29uc3QgJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9kZWZhdWx0ID0gYXN5bmMgZnVuY3Rpb24gKCkgewogIHJldHVybiAnZGVmYXVsdCBhbm9ueW1vdXMgZnVuY3Rpb24gY2FsbGVkJwp9Cgpjb25zdCAkJG1vZHVsZV8wX2JpbmRpbmdfZGVmYXVsdCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX2RlZmF1bHQsICJkZWZhdWx0IiksICJuYW1lIiwgeyB2YWx1ZTogImRlZmF1bHQiIH0pOwpleHBvcnQgeyAkJG1vZHVsZV8wX2JpbmRpbmdfZGVmYXVsdCBhcyBkZWZhdWx0IH07CjMyMwB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAnZGVmYXVsdCBhbm9ueW1vdXMgZnVuY3Rpb24gY2FsbGVkJ1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRVgsMENBQWUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTTtBQUMzQzs7OzsifQ==) + +```js +'use server' + +const $$module_0_implementation_default = async function () { + return 'default anonymous function called' +} + +const $$module_0_binding_default = Object.defineProperty(registerServerReference($$module_0_implementation_default, "default"), "name", { value: "default" }); +export { $$module_0_binding_default as default }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-comments.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-comments.js new file mode 100644 index 000000000..b4c2fe4b9 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-comments.js @@ -0,0 +1,5 @@ +'use server' + +export /* before */ default /* after */ async function () { + return 'default comments called' +} diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-comments.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-comments.js.map.snap.md new file mode 100644 index 000000000..38897e7d3 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-comments.js.map.snap.md @@ -0,0 +1,37 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "export /* before */ default /* after */ " --> (2:0) "const $$default = " +(2:40) "async function () {\n" --> (2:18) "async function () {\n" +(3:0) " return 'default comments called'\n" --> (3:0) " return 'default comments called'\n" +(4:0) "}\n" --> (4:0) "}\n" +[unmapped] --> (5:0) ";\n" +[unmapped] --> (6:0) "const $$wrap_$$default = /* #__PURE__ */ registerServerReference($$default, \"default\");\n" +[unmapped] --> (7:0) "export { $$wrap_$$default as default };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:6) " /* before */ default /* after */ " --> (2:0) "const $$effect_default = " +(2:40) "async function () {\n" --> (2:25) "async function () {\n" +(3:0) " return 'default comments called'\n" --> (3:0) " return 'default comments called'\n" +(4:0) "}\n" --> (4:0) "}\n" +(2:0) "export /* before */ default /* after */ async function () {\n" --> (5:0) "\n" +(2:0) "export /* before */ default /* after */ async function () {\n" --> (6:0) "registerServerReference($$effect_default, \"default\");\n" +(2:0) "export /* before */ default /* after */ async function () {\n" --> (7:0) "export default $$effect_default;\n" +``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "export /* before */ default /* after */ " --> (2:0) "const $$module_0_implementation_default = " +(2:40) "async function () {\n" --> (2:42) "async function () {\n" +(3:0) " return 'default comments called'\n" --> (3:0) " return 'default comments called'\n" +(4:0) "}\n" --> (4:0) "}\n" +[unmapped] --> (6:0) "const $$module_0_binding_default = Object.defineProperty(registerServerReference($$module_0_implementation_default, \"default\"), \"name\", { value: \"default\" });\n" +[unmapped] --> (7:0) "export { $$module_0_binding_default as default };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-comments.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-comments.js.snap.md new file mode 100644 index 000000000..890af85d8 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-comments.js.snap.md @@ -0,0 +1,66 @@ +## Input + +```js +'use server' + +export /* before */ default /* after */ async function () { + return 'default comments called' +} +``` + +## wrap-export + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjE5ACd1c2Ugc2VydmVyJwoKY29uc3QgJCRkZWZhdWx0ID0gYXN5bmMgZnVuY3Rpb24gKCkgewogIHJldHVybiAnZGVmYXVsdCBjb21tZW50cyBjYWxsZWQnCn0KOwpjb25zdCAkJHdyYXBfJCRkZWZhdWx0ID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKCQkZGVmYXVsdCwgImRlZmF1bHQiKTsKZXhwb3J0IHsgJCR3cmFwXyQkZGVmYXVsdCBhcyBkZWZhdWx0IH07CjMyOQB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5leHBvcnQgLyogYmVmb3JlICovIGRlZmF1bHQgLyogYWZ0ZXIgKi8gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2RlZmF1bHQgY29tbWVudHMgY2FsbGVkJ1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRVgsa0JBQXdDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtBQUNqQzs7OzsifQ==) + +```js +'use server' + +const $$default = async function () { + return 'default comments called' +} +; +const $$wrap_$$default = /* #__PURE__ */ registerServerReference($$default, "default"); +export { $$wrap_$$default as default }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTg0ACd1c2Ugc2VydmVyJwoKY29uc3QgJCRlZmZlY3RfZGVmYXVsdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHsKICByZXR1cm4gJ2RlZmF1bHQgY29tbWVudHMgY2FsbGVkJwp9CgpyZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJGVmZmVjdF9kZWZhdWx0LCAiZGVmYXVsdCIpOwpleHBvcnQgZGVmYXVsdCAkJGVmZmVjdF9kZWZhdWx0OwozNDEAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IC8qIGJlZm9yZSAqLyBkZWZhdWx0IC8qIGFmdGVyICovIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdkZWZhdWx0IGNvbW1lbnRzIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVMLHlCQUFrQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07QUFDakM7QUFGQTtBQUFBO0FBQUE7In0=) + +```js +'use server' + +const $$effect_default = async function () { + return 'default comments called' +} + +registerServerReference($$effect_default, "default"); +export default $$effect_default; +``` + +## module-export-wrap + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzIzACd1c2Ugc2VydmVyJwoKY29uc3QgJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9kZWZhdWx0ID0gYXN5bmMgZnVuY3Rpb24gKCkgewogIHJldHVybiAnZGVmYXVsdCBjb21tZW50cyBjYWxsZWQnCn0KCmNvbnN0ICQkbW9kdWxlXzBfYmluZGluZ19kZWZhdWx0ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKCQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fZGVmYXVsdCwgImRlZmF1bHQiKSwgIm5hbWUiLCB7IHZhbHVlOiAiZGVmYXVsdCIgfSk7CmV4cG9ydCB7ICQkbW9kdWxlXzBfYmluZGluZ19kZWZhdWx0IGFzIGRlZmF1bHQgfTsKMzI5AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCAvKiBiZWZvcmUgKi8gZGVmYXVsdCAvKiBhZnRlciAqLyBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAnZGVmYXVsdCBjb21tZW50cyBjYWxsZWQnXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFWCwwQ0FBd0MsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0FBQ2pDOzs7OyJ9) + +```js +'use server' + +const $$module_0_implementation_default = async function () { + return 'default comments called' +} + +const $$module_0_binding_default = Object.defineProperty(registerServerReference($$module_0_implementation_default, "default"), "name", { value: "default" }); +export { $$module_0_binding_default as default }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier-reassignment.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier-reassignment.js.map.snap.md index 2610322cf..ce743d92d 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier-reassignment.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier-reassignment.js.map.snap.md @@ -22,3 +22,15 @@ (3:0) "export default action\n" --> (6:0) "registerServerReference($$effect_default, \"default\");\n" (3:0) "export default action\n" --> (7:0) "export default $$effect_default;\n" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "let action = async () => 'first'\n" --> (2:0) "let action = async () => 'first'\n" +(3:0) "export default " --> (3:0) "const $$module_0_implementation_default = " +(3:15) "action\n" --> (3:42) "action\n" +(4:0) "action = async () => 'second'\n" --> (4:0) "action = async () => 'second'\n" +[unmapped] --> (6:0) "const $$module_0_binding_default = registerServerReference($$module_0_implementation_default, \"default\");\n" +[unmapped] --> (7:0) "export { $$module_0_binding_default as default };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier-reassignment.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier-reassignment.js.snap.md index 23b84a347..b4f65a67d 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier-reassignment.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier-reassignment.js.snap.md @@ -45,3 +45,22 @@ action = async () => 'second' registerServerReference($$effect_default, "default"); export default $$effect_default; ``` + +## module-export-wrap + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjgzACd1c2Ugc2VydmVyJwoKbGV0IGFjdGlvbiA9IGFzeW5jICgpID0+ICdmaXJzdCcKY29uc3QgJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9kZWZhdWx0ID0gYWN0aW9uCmFjdGlvbiA9IGFzeW5jICgpID0+ICdzZWNvbmQnCgpjb25zdCAkJG1vZHVsZV8wX2JpbmRpbmdfZGVmYXVsdCA9IHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKCQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fZGVmYXVsdCwgImRlZmF1bHQiKTsKZXhwb3J0IHsgJCRtb2R1bGVfMF9iaW5kaW5nX2RlZmF1bHQgYXMgZGVmYXVsdCB9OwozODAAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxubGV0IGFjdGlvbiA9IGFzeW5jICgpID0+ICdmaXJzdCdcbmV4cG9ydCBkZWZhdWx0IGFjdGlvblxuYWN0aW9uID0gYXN5bmMgKCkgPT4gJ3NlY29uZCdcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVYLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7QUFDL0IsMENBQWU7QUFDZixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07Ozs7In0=) + +```js +'use server' + +let action = async () => 'first' +const $$module_0_implementation_default = action +action = async () => 'second' + +const $$module_0_binding_default = registerServerReference($$module_0_implementation_default, "default"); +export { $$module_0_binding_default as default }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.map.snap.md index a7c2a494c..6e8989b58 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.map.snap.md @@ -24,3 +24,16 @@ (6:0) "export default defaultIdentifier\n" --> (8:0) "registerServerReference($$effect_default, \"default\");\n" (6:0) "export default defaultIdentifier\n" --> (9:0) "export default $$effect_default;\n" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "async function defaultIdentifier() {\n" --> (2:0) "async function defaultIdentifier() {\n" +(3:0) " return 'default identifier called'\n" --> (3:0) " return 'default identifier called'\n" +(4:0) "}\n" --> (4:0) "}\n" +(6:0) "export default " --> (6:0) "const $$module_0_implementation_default = " +(6:15) "defaultIdentifier\n" --> (6:42) "defaultIdentifier\n" +[unmapped] --> (8:0) "const $$module_0_binding_default = registerServerReference($$module_0_implementation_default, \"default\");\n" +[unmapped] --> (9:0) "export { $$module_0_binding_default as default };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.snap.md index d8039095b..3b0a838bb 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.snap.md @@ -51,3 +51,24 @@ const $$effect_default = defaultIdentifier; registerServerReference($$effect_default, "default"); export default $$effect_default; ``` + +## module-export-wrap + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzA4ACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZGVmYXVsdElkZW50aWZpZXIoKSB7CiAgcmV0dXJuICdkZWZhdWx0IGlkZW50aWZpZXIgY2FsbGVkJwp9Cgpjb25zdCAkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX2RlZmF1bHQgPSBkZWZhdWx0SWRlbnRpZmllcgoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX2RlZmF1bHQgPSByZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX2RlZmF1bHQsICJkZWZhdWx0Iik7CmV4cG9ydCB7ICQkbW9kdWxlXzBfYmluZGluZ19kZWZhdWx0IGFzIGRlZmF1bHQgfTsKMzU2AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRJZGVudGlmaWVyKCkge1xuICByZXR1cm4gJ2RlZmF1bHQgaWRlbnRpZmllciBjYWxsZWQnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRJZGVudGlmaWVyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFWCxLQUFLLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNO0FBQ25DOztBQUVBLDBDQUFlOzs7OyJ9) + +```js +'use server' + +async function defaultIdentifier() { + return 'default identifier called' +} + +const $$module_0_implementation_default = defaultIdentifier + +const $$module_0_binding_default = registerServerReference($$module_0_implementation_default, "default"); +export { $$module_0_binding_default as default }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.map.snap.md index 86fa79fd2..4c0a33621 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.map.snap.md @@ -21,3 +21,14 @@ (2:0) "export default async function defaultNamedFunction() {\n" --> (6:0) "registerServerReference(defaultNamedFunction, \"default\");\n" (2:0) "export default async function defaultNamedFunction() {\n" --> (7:0) "export default defaultNamedFunction;\n" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:15) "async function defaultNamedFunction() {\n" --> (2:0) "async function defaultNamedFunction() {\n" +(3:0) " return 'default named function called'\n" --> (3:0) " return 'default named function called'\n" +(4:0) "}\n" --> (4:0) "}\n" +[unmapped] --> (6:0) "const $$module_0_binding_default = Object.defineProperty(registerServerReference(defaultNamedFunction, \"default\"), \"name\", { value: \"defaultNamedFunction\" });\n" +[unmapped] --> (7:0) "export { $$module_0_binding_default as default };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.snap.md index b31b20bea..55407416d 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.snap.md @@ -45,3 +45,22 @@ async function defaultNamedFunction() { registerServerReference(defaultNamedFunction, "default"); export default defaultNamedFunction; ``` + +## module-export-wrap + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzA3ACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZGVmYXVsdE5hbWVkRnVuY3Rpb24oKSB7CiAgcmV0dXJuICdkZWZhdWx0IG5hbWVkIGZ1bmN0aW9uIGNhbGxlZCcKfQoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX2RlZmF1bHQgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoZGVmYXVsdE5hbWVkRnVuY3Rpb24sICJkZWZhdWx0IiksICJuYW1lIiwgeyB2YWx1ZTogImRlZmF1bHROYW1lZEZ1bmN0aW9uIiB9KTsKZXhwb3J0IHsgJCRtb2R1bGVfMF9iaW5kaW5nX2RlZmF1bHQgYXMgZGVmYXVsdCB9OwozNDAAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZGVmYXVsdE5hbWVkRnVuY3Rpb24oKSB7XG4gIHJldHVybiAnZGVmYXVsdCBuYW1lZCBmdW5jdGlvbiBjYWxsZWQnXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFSSxLQUFLLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTTtBQUN2Qzs7OzsifQ==) + +```js +'use server' + +async function defaultNamedFunction() { + return 'default named function called' +} + +const $$module_0_binding_default = Object.defineProperty(registerServerReference(defaultNamedFunction, "default"), "name", { value: "defaultNamedFunction" }); +export { $$module_0_binding_default as default }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js.map.snap.md index eef48cd07..c10655488 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js.map.snap.md @@ -22,3 +22,15 @@ (2:0) "export const first = async () => 'first action called',\n" --> (6:0) "registerServerReference(second, \"second\");\n" (2:0) "export const first = async () => 'first action called',\n" --> (7:0) "export { first, second };\n" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "const first = async () => 'first action called',\n" --> (2:0) "const first = async () => 'first action called',\n" +(3:0) " second = first\n" --> (3:0) " second = first\n" +[unmapped] --> (5:0) "const $$module_0_binding_first = Object.defineProperty(registerServerReference(first, \"first\"), \"name\", { value: \"first\" });\n" +[unmapped] --> (6:0) "export { $$module_0_binding_first as first };\n" +[unmapped] --> (7:0) "const $$module_1_binding_second = registerServerReference(second, \"second\");\n" +[unmapped] --> (8:0) "export { $$module_1_binding_second as second };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js.snap.md index e7a106b22..abf930550 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js.snap.md @@ -44,3 +44,23 @@ registerServerReference(first, "first"); registerServerReference(second, "second"); export { first, second }; ``` + +## module-export-wrap + +**Status:** transformed + +**References:** first, second + +[Source map visualization](https://evanw.github.io/source-map-visualization/#Mzc3ACd1c2Ugc2VydmVyJwoKY29uc3QgZmlyc3QgPSBhc3luYyAoKSA9PiAnZmlyc3QgYWN0aW9uIGNhbGxlZCcsCiAgc2Vjb25kID0gZmlyc3QKCmNvbnN0ICQkbW9kdWxlXzBfYmluZGluZ19maXJzdCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWdpc3RlclNlcnZlclJlZmVyZW5jZShmaXJzdCwgImZpcnN0IiksICJuYW1lIiwgeyB2YWx1ZTogImZpcnN0IiB9KTsKZXhwb3J0IHsgJCRtb2R1bGVfMF9iaW5kaW5nX2ZpcnN0IGFzIGZpcnN0IH07CmNvbnN0ICQkbW9kdWxlXzFfYmluZGluZ19zZWNvbmQgPSByZWdpc3RlclNlcnZlclJlZmVyZW5jZShzZWNvbmQsICJzZWNvbmQiKTsKZXhwb3J0IHsgJCRtb2R1bGVfMV9iaW5kaW5nX3NlY29uZCBhcyBzZWNvbmQgfTsKMzQzAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBjb25zdCBmaXJzdCA9IGFzeW5jICgpID0+ICdmaXJzdCBhY3Rpb24gY2FsbGVkJyxcbiAgc2Vjb25kID0gZmlyc3RcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ3RELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOzs7Ozs7In0=) + +```js +'use server' + +const first = async () => 'first action called', + second = first + +const $$module_0_binding_first = Object.defineProperty(registerServerReference(first, "first"), "name", { value: "first" }); +export { $$module_0_binding_first as first }; +const $$module_1_binding_second = registerServerReference(second, "second"); +export { $$module_1_binding_second as second }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js.map.snap.md index 045aecee0..9eecb2d1a 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js.map.snap.md @@ -19,3 +19,13 @@ (4:0) "export const { action } = { action: source }\n" --> (6:0) "registerServerReference(action, \"action\");\n" (4:0) "export const { action } = { action: source }\n" --> (7:0) "export { action };\n" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "const source = async () => 'destructured export called'\n" --> (2:0) "const source = async () => 'destructured export called'\n" +(4:7) "const { action } = { action: source }\n" --> (4:0) "const { action } = { action: source }\n" +[unmapped] --> (6:0) "const $$module_0_binding_action = registerServerReference(action, \"action\");\n" +[unmapped] --> (7:0) "export { $$module_0_binding_action as action };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js.snap.md index 87aabfcc0..ee472fcbb 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js.snap.md @@ -44,3 +44,22 @@ const { action } = { action: source } registerServerReference(action, "action"); export { action }; ``` + +## module-export-wrap + +**Status:** transformed + +**References:** action + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjM1ACd1c2Ugc2VydmVyJwoKY29uc3Qgc291cmNlID0gYXN5bmMgKCkgPT4gJ2Rlc3RydWN0dXJlZCBleHBvcnQgY2FsbGVkJwoKY29uc3QgeyBhY3Rpb24gfSA9IHsgYWN0aW9uOiBzb3VyY2UgfQoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX2FjdGlvbiA9IHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGFjdGlvbiwgImFjdGlvbiIpOwpleHBvcnQgeyAkJG1vZHVsZV8wX2JpbmRpbmdfYWN0aW9uIGFzIGFjdGlvbiB9Owo0MjIAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuY29uc3Qgc291cmNlID0gYXN5bmMgKCkgPT4gJ2Rlc3RydWN0dXJlZCBleHBvcnQgY2FsbGVkJ1xuXG5leHBvcnQgY29uc3QgeyBhY3Rpb24gfSA9IHsgYWN0aW9uOiBzb3VyY2UgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRVgsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNOztBQUUvQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUM7Ozs7In0=) + +```js +'use server' + +const source = async () => 'destructured export called' + +const { action } = { action: source } + +const $$module_0_binding_action = registerServerReference(action, "action"); +export { $$module_0_binding_action as action }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias-reassignment.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias-reassignment.js.map.snap.md index 1d6db549f..0b8981a70 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias-reassignment.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias-reassignment.js.map.snap.md @@ -18,3 +18,13 @@ (4:0) "action = async () => 'second'\n" --> (4:0) "action = async () => 'second'\n" [unmapped] --> (6:0) "registerServerReference(action, \"renamed\");" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "let action = async () => 'first'\n" --> (2:0) "let action = async () => 'first'\n" +(4:0) "action = async () => 'second'\n" --> (4:0) "action = async () => 'second'\n" +[unmapped] --> (6:0) "const $$module_0_binding_renamed = registerServerReference(action, \"renamed\");\n" +[unmapped] --> (7:0) "export { $$module_0_binding_renamed as renamed };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias-reassignment.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias-reassignment.js.snap.md index 70ff1e488..0ca7add46 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias-reassignment.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias-reassignment.js.snap.md @@ -44,3 +44,22 @@ action = async () => 'second' registerServerReference(action, "renamed"); ``` + +## module-export-wrap + +**Status:** transformed + +**References:** renamed + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjA4ACd1c2Ugc2VydmVyJwoKbGV0IGFjdGlvbiA9IGFzeW5jICgpID0+ICdmaXJzdCcKCmFjdGlvbiA9IGFzeW5jICgpID0+ICdzZWNvbmQnCgpjb25zdCAkJG1vZHVsZV8wX2JpbmRpbmdfcmVuYW1lZCA9IHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGFjdGlvbiwgInJlbmFtZWQiKTsKZXhwb3J0IHsgJCRtb2R1bGVfMF9iaW5kaW5nX3JlbmFtZWQgYXMgcmVuYW1lZCB9OwozNzcAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxubGV0IGFjdGlvbiA9IGFzeW5jICgpID0+ICdmaXJzdCdcbmV4cG9ydCB7IGFjdGlvbiBhcyByZW5hbWVkIH1cbmFjdGlvbiA9IGFzeW5jICgpID0+ICdzZWNvbmQnXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFWCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLOztBQUUvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07Ozs7In0=) + +```js +'use server' + +let action = async () => 'first' + +action = async () => 'second' + +const $$module_0_binding_renamed = registerServerReference(action, "renamed"); +export { $$module_0_binding_renamed as renamed }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.map.snap.md index e51895d65..c8769cd5c 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.map.snap.md @@ -20,3 +20,14 @@ (6:0) "export { localAlias as aliasedAction }\n" --> (6:0) "export { localAlias as aliasedAction }\n" [unmapped] --> (8:0) "registerServerReference(localAlias, \"aliasedAction\");" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "async function localAlias() {\n" --> (2:0) "async function localAlias() {\n" +(3:0) " return 'local alias called'\n" --> (3:0) " return 'local alias called'\n" +(4:0) "}\n" --> (4:0) "}\n" +[unmapped] --> (8:0) "const $$module_0_binding_aliasedAction = registerServerReference(localAlias, \"aliasedAction\");\n" +[unmapped] --> (9:0) "export { $$module_0_binding_aliasedAction as aliasedAction };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.snap.md index 9b4c77666..8b76df83e 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.snap.md @@ -50,3 +50,24 @@ export { localAlias as aliasedAction } registerServerReference(localAlias, "aliasedAction"); ``` + +## module-export-wrap + +**Status:** transformed + +**References:** aliasedAction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjM2ACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gbG9jYWxBbGlhcygpIHsKICByZXR1cm4gJ2xvY2FsIGFsaWFzIGNhbGxlZCcKfQoKCgpjb25zdCAkJG1vZHVsZV8wX2JpbmRpbmdfYWxpYXNlZEFjdGlvbiA9IHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGxvY2FsQWxpYXMsICJhbGlhc2VkQWN0aW9uIik7CmV4cG9ydCB7ICQkbW9kdWxlXzBfYmluZGluZ19hbGlhc2VkQWN0aW9uIGFzIGFsaWFzZWRBY3Rpb24gfTsKMzM2AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmFzeW5jIGZ1bmN0aW9uIGxvY2FsQWxpYXMoKSB7XG4gIHJldHVybiAnbG9jYWwgYWxpYXMgY2FsbGVkJ1xufVxuXG5leHBvcnQgeyBsb2NhbEFsaWFzIGFzIGFsaWFzZWRBY3Rpb24gfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRVgsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQzVCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU07QUFDNUI7Ozs7OzsifQ==) + +```js +'use server' + +async function localAlias() { + return 'local alias called' +} + + + +const $$module_0_binding_aliasedAction = registerServerReference(localAlias, "aliasedAction"); +export { $$module_0_binding_aliasedAction as aliasedAction }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-binding-preservation.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-binding-preservation.js new file mode 100644 index 000000000..06e0bcbf2 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-binding-preservation.js @@ -0,0 +1,6 @@ +export async function direct() {} + +const indirect = async () => {} +export { indirect } + +consume(direct, indirect) diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-binding-preservation.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-binding-preservation.js.map.snap.md new file mode 100644 index 000000000..fec7c085d --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-binding-preservation.js.map.snap.md @@ -0,0 +1,37 @@ +## wrap-export + +```txt +(0:7) "async function direct() {}\n" --> (0:0) "async function direct() {}\n" +(2:0) "const indirect = async () => {}\n" --> (2:0) "const indirect = async () => {}\n" +(5:0) "consume(direct, indirect)\n" --> (5:0) "consume(direct, indirect)\n" +(0:0) "export async function direct() {}\n" --> (6:0) "direct = /* #__PURE__ */ registerServerReference(direct, \"direct\");\n" +(0:0) "export async function direct() {}\n" --> (7:0) "export { direct };\n" +[unmapped] --> (8:0) ";\n" +[unmapped] --> (9:0) "const $$wrap_indirect = /* #__PURE__ */ registerServerReference(indirect, \"indirect\");\n" +[unmapped] --> (10:0) "export { $$wrap_indirect as indirect };\n" +``` + +## module-export-effect + +```txt +(0:7) "async function direct() {}\n" --> (0:0) "async function direct() {}\n" +(2:0) "const indirect = async () => {}\n" --> (2:0) "const indirect = async () => {}\n" +(3:0) "export { indirect }\n" --> (3:0) "export { indirect }\n" +(5:0) "consume(direct, indirect)\n" --> (5:0) "consume(direct, indirect)\n" +(0:0) "export async function direct() {}\n" --> (6:0) "\n" +(0:0) "export async function direct() {}\n" --> (7:0) "registerServerReference(direct, \"direct\");\n" +(0:0) "export async function direct() {}\n" --> (8:0) "export { direct };\n" +[unmapped] --> (10:0) "registerServerReference(indirect, \"indirect\");" +``` + +## module-export-wrap + +```txt +(0:7) "async function direct() {}\n" --> (0:0) "async function direct() {}\n" +(2:0) "const indirect = async () => {}\n" --> (2:0) "const indirect = async () => {}\n" +(5:0) "consume(direct, indirect)\n" --> (5:0) "consume(direct, indirect)\n" +[unmapped] --> (7:0) "const $$module_0_binding_direct = Object.defineProperty(registerServerReference(direct, \"direct\"), \"name\", { value: \"direct\" });\n" +[unmapped] --> (8:0) "export { $$module_0_binding_direct as direct };\n" +[unmapped] --> (9:0) "const $$module_1_binding_indirect = registerServerReference(indirect, \"indirect\");\n" +[unmapped] --> (10:0) "export { $$module_1_binding_indirect as indirect };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-binding-preservation.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-binding-preservation.js.snap.md new file mode 100644 index 000000000..5893f53da --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-binding-preservation.js.snap.md @@ -0,0 +1,76 @@ +## Input + +```js +export async function direct() {} + +const indirect = async () => {} +export { indirect } + +consume(direct, indirect) +``` + +## wrap-export + +**Status:** transformed + +**References:** direct, indirect + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzA0AGFzeW5jIGZ1bmN0aW9uIGRpcmVjdCgpIHt9Cgpjb25zdCBpbmRpcmVjdCA9IGFzeW5jICgpID0+IHt9CgoKY29uc3VtZShkaXJlY3QsIGluZGlyZWN0KQpkaXJlY3QgPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoZGlyZWN0LCAiZGlyZWN0Iik7CmV4cG9ydCB7IGRpcmVjdCB9Owo7CmNvbnN0ICQkd3JhcF9pbmRpcmVjdCA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShpbmRpcmVjdCwgImluZGlyZWN0Iik7CmV4cG9ydCB7ICQkd3JhcF9pbmRpcmVjdCBhcyBpbmRpcmVjdCB9OwozNzkAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlyZWN0KCkge31cblxuY29uc3QgaW5kaXJlY3QgPSBhc3luYyAoKSA9PiB7fVxuZXhwb3J0IHsgaW5kaXJlY3QgfVxuXG5jb25zdW1lKGRpcmVjdCwgaW5kaXJlY3QpXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRWhDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7QUFHOUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVE7QUFMeEI7QUFBQTs7OzsifQ==) + +```js +async function direct() {} + +const indirect = async () => {} + + +consume(direct, indirect) +direct = /* #__PURE__ */ registerServerReference(direct, "direct"); +export { direct }; +; +const $$wrap_indirect = /* #__PURE__ */ registerServerReference(indirect, "indirect"); +export { $$wrap_indirect as indirect }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** direct, indirect + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjE3AGFzeW5jIGZ1bmN0aW9uIGRpcmVjdCgpIHt9Cgpjb25zdCBpbmRpcmVjdCA9IGFzeW5jICgpID0+IHt9CmV4cG9ydCB7IGluZGlyZWN0IH0KCmNvbnN1bWUoZGlyZWN0LCBpbmRpcmVjdCkKCnJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGRpcmVjdCwgImRpcmVjdCIpOwpleHBvcnQgeyBkaXJlY3QgfTsKCnJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGluZGlyZWN0LCAiaW5kaXJlY3QiKTs0MTcAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlyZWN0KCkge31cblxuY29uc3QgaW5kaXJlY3QgPSBhc3luYyAoKSA9PiB7fVxuZXhwb3J0IHsgaW5kaXJlY3QgfVxuXG5jb25zdW1lKGRpcmVjdCwgaW5kaXJlY3QpXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRWhDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDOztBQUVsQixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUTtBQUx4QjtBQUFBO0FBQUE7OyJ9) + +```js +async function direct() {} + +const indirect = async () => {} +export { indirect } + +consume(direct, indirect) + +registerServerReference(direct, "direct"); +export { direct }; + +registerServerReference(indirect, "indirect"); +``` + +## module-export-wrap + +**Status:** transformed + +**References:** direct, indirect + +[Source map visualization](https://evanw.github.io/source-map-visualization/#NDAxAGFzeW5jIGZ1bmN0aW9uIGRpcmVjdCgpIHt9Cgpjb25zdCBpbmRpcmVjdCA9IGFzeW5jICgpID0+IHt9CgoKY29uc3VtZShkaXJlY3QsIGluZGlyZWN0KQoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX2RpcmVjdCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWdpc3RlclNlcnZlclJlZmVyZW5jZShkaXJlY3QsICJkaXJlY3QiKSwgIm5hbWUiLCB7IHZhbHVlOiAiZGlyZWN0IiB9KTsKZXhwb3J0IHsgJCRtb2R1bGVfMF9iaW5kaW5nX2RpcmVjdCBhcyBkaXJlY3QgfTsKY29uc3QgJCRtb2R1bGVfMV9iaW5kaW5nX2luZGlyZWN0ID0gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoaW5kaXJlY3QsICJpbmRpcmVjdCIpOwpleHBvcnQgeyAkJG1vZHVsZV8xX2JpbmRpbmdfaW5kaXJlY3QgYXMgaW5kaXJlY3QgfTsKMzcwAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpcmVjdCgpIHt9XG5cbmNvbnN0IGluZGlyZWN0ID0gYXN5bmMgKCkgPT4ge31cbmV4cG9ydCB7IGluZGlyZWN0IH1cblxuY29uc3VtZShkaXJlY3QsIGluZGlyZWN0KVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVoQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O0FBRzlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFROzs7Ozs7In0=) + +```js +async function direct() {} + +const indirect = async () => {} + + +consume(direct, indirect) + +const $$module_0_binding_direct = Object.defineProperty(registerServerReference(direct, "direct"), "name", { value: "direct" }); +export { $$module_0_binding_direct as direct }; +const $$module_1_binding_indirect = registerServerReference(indirect, "indirect"); +export { $$module_1_binding_indirect as indirect }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-export-before-declaration.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-export-before-declaration.js.map.snap.md index b449c526f..21920cdcc 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-export-before-declaration.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-export-before-declaration.js.map.snap.md @@ -16,3 +16,12 @@ (3:0) "const action = async () => 'action called'\n" --> (3:0) "const action = async () => 'action called'\n" [unmapped] --> (5:0) "registerServerReference(action, \"action\");" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(3:0) "const action = async () => 'action called'\n" --> (3:0) "const action = async () => 'action called'\n" +[unmapped] --> (5:0) "const $$module_0_binding_action = registerServerReference(action, \"action\");\n" +[unmapped] --> (6:0) "export { $$module_0_binding_action as action };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-export-before-declaration.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-export-before-declaration.js.snap.md index cb2829f08..c7ff900a5 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-export-before-declaration.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-export-before-declaration.js.snap.md @@ -41,3 +41,21 @@ const action = async () => 'action called' registerServerReference(action, "action"); ``` + +## module-export-wrap + +**Status:** transformed + +**References:** action + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTg0ACd1c2Ugc2VydmVyJwoKCmNvbnN0IGFjdGlvbiA9IGFzeW5jICgpID0+ICdhY3Rpb24gY2FsbGVkJwoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX2FjdGlvbiA9IHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGFjdGlvbiwgImFjdGlvbiIpOwpleHBvcnQgeyAkJG1vZHVsZV8wX2JpbmRpbmdfYWN0aW9uIGFzIGFjdGlvbiB9OwoyNzkAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IHsgYWN0aW9uIH1cbmNvbnN0IGFjdGlvbiA9IGFzeW5jICgpID0+ICdhY3Rpb24gY2FsbGVkJ1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07OztBQUdYLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNOzs7OyJ9) + +```js +'use server' + + +const action = async () => 'action called' + +const $$module_0_binding_action = registerServerReference(action, "action"); +export { $$module_0_binding_action as action }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-aliases.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-aliases.js new file mode 100644 index 000000000..babb53a27 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-aliases.js @@ -0,0 +1,7 @@ +'use server' + +async function value() { + return 'multiple aliases called' +} + +export { value as first, value as second } diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-aliases.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-aliases.js.map.snap.md new file mode 100644 index 000000000..f7c1ef2b2 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-aliases.js.map.snap.md @@ -0,0 +1,38 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "async function value() {\n" --> (2:0) "async function value() {\n" +(3:0) " return 'multiple aliases called'\n" --> (3:0) " return 'multiple aliases called'\n" +(4:0) "}\n" --> (4:0) "}\n" +[unmapped] --> (7:0) ";\n" +[unmapped] --> (8:0) "const $$wrap_value = /* #__PURE__ */ registerServerReference(value, \"first\");\n" +[unmapped] --> (9:0) "export { $$wrap_value as first };\n" +[unmapped] --> (10:0) "const $$wrap_value = /* #__PURE__ */ registerServerReference(value, \"second\");\n" +[unmapped] --> (11:0) "export { $$wrap_value as second };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "async function value() {\n" --> (2:0) "async function value() {\n" +(3:0) " return 'multiple aliases called'\n" --> (3:0) " return 'multiple aliases called'\n" +(4:0) "}\n" --> (4:0) "}\n" +(6:0) "export { value as first, value as second }\n" --> (6:0) "export { value as first, value as second }\n" +[unmapped] --> (8:0) "registerServerReference(value, \"first\");\n" +[unmapped] --> (9:0) "registerServerReference(value, \"second\");" +``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "async function value() {\n" --> (2:0) "async function value() {\n" +(3:0) " return 'multiple aliases called'\n" --> (3:0) " return 'multiple aliases called'\n" +(4:0) "}\n" --> (4:0) "}\n" +[unmapped] --> (8:0) "const $$module_0_binding_first = registerServerReference(value, \"first\");\n" +[unmapped] --> (9:0) "export { $$module_0_binding_first as first };\n" +[unmapped] --> (10:0) "const $$module_1_binding_second = registerServerReference(value, \"second\");\n" +[unmapped] --> (11:0) "export { $$module_1_binding_second as second };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-aliases.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-aliases.js.snap.md new file mode 100644 index 000000000..157f70886 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-aliases.js.snap.md @@ -0,0 +1,78 @@ +## Input + +```js +'use server' + +async function value() { + return 'multiple aliases called' +} + +export { value as first, value as second } +``` + +## wrap-export + +**Status:** transformed + +**References:** first, second + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzA2ACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gdmFsdWUoKSB7CiAgcmV0dXJuICdtdWx0aXBsZSBhbGlhc2VzIGNhbGxlZCcKfQoKCjsKY29uc3QgJCR3cmFwX3ZhbHVlID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKHZhbHVlLCAiZmlyc3QiKTsKZXhwb3J0IHsgJCR3cmFwX3ZhbHVlIGFzIGZpcnN0IH07CmNvbnN0ICQkd3JhcF92YWx1ZSA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZSh2YWx1ZSwgInNlY29uZCIpOwpleHBvcnQgeyAkJHdyYXBfdmFsdWUgYXMgc2Vjb25kIH07CjM0MgB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5hc3luYyBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgcmV0dXJuICdtdWx0aXBsZSBhbGlhc2VzIGNhbGxlZCdcbn1cblxuZXhwb3J0IHsgdmFsdWUgYXMgZmlyc3QsIHZhbHVlIGFzIHNlY29uZCB9XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFWCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTTtBQUNqQzs7Ozs7Ozs7In0=) + +```js +'use server' + +async function value() { + return 'multiple aliases called' +} + + +; +const $$wrap_value = /* #__PURE__ */ registerServerReference(value, "first"); +export { $$wrap_value as first }; +const $$wrap_value = /* #__PURE__ */ registerServerReference(value, "second"); +export { $$wrap_value as second }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** first, second + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjAzACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gdmFsdWUoKSB7CiAgcmV0dXJuICdtdWx0aXBsZSBhbGlhc2VzIGNhbGxlZCcKfQoKZXhwb3J0IHsgdmFsdWUgYXMgZmlyc3QsIHZhbHVlIGFzIHNlY29uZCB9CgpyZWdpc3RlclNlcnZlclJlZmVyZW5jZSh2YWx1ZSwgImZpcnN0Iik7CnJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKHZhbHVlLCAic2Vjb25kIik7NDI4AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmFzeW5jIGZ1bmN0aW9uIHZhbHVlKCkge1xuICByZXR1cm4gJ211bHRpcGxlIGFsaWFzZXMgY2FsbGVkJ1xufVxuXG5leHBvcnQgeyB2YWx1ZSBhcyBmaXJzdCwgdmFsdWUgYXMgc2Vjb25kIH1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVYLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNO0FBQ2pDOztBQUVBLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQzs7OyJ9) + +```js +'use server' + +async function value() { + return 'multiple aliases called' +} + +export { value as first, value as second } + +registerServerReference(value, "first"); +registerServerReference(value, "second"); +``` + +## module-export-wrap + +**Status:** transformed + +**References:** first, second + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzIzACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gdmFsdWUoKSB7CiAgcmV0dXJuICdtdWx0aXBsZSBhbGlhc2VzIGNhbGxlZCcKfQoKCgpjb25zdCAkJG1vZHVsZV8wX2JpbmRpbmdfZmlyc3QgPSByZWdpc3RlclNlcnZlclJlZmVyZW5jZSh2YWx1ZSwgImZpcnN0Iik7CmV4cG9ydCB7ICQkbW9kdWxlXzBfYmluZGluZ19maXJzdCBhcyBmaXJzdCB9Owpjb25zdCAkJG1vZHVsZV8xX2JpbmRpbmdfc2Vjb25kID0gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UodmFsdWUsICJzZWNvbmQiKTsKZXhwb3J0IHsgJCRtb2R1bGVfMV9iaW5kaW5nX3NlY29uZCBhcyBzZWNvbmQgfTsKMzQyAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmFzeW5jIGZ1bmN0aW9uIHZhbHVlKCkge1xuICByZXR1cm4gJ211bHRpcGxlIGFsaWFzZXMgY2FsbGVkJ1xufVxuXG5leHBvcnQgeyB2YWx1ZSBhcyBmaXJzdCwgdmFsdWUgYXMgc2Vjb25kIH1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVYLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNO0FBQ2pDOzs7Ozs7OzsifQ==) + +```js +'use server' + +async function value() { + return 'multiple aliases called' +} + + + +const $$module_0_binding_first = registerServerReference(value, "first"); +export { $$module_0_binding_first as first }; +const $$module_1_binding_second = registerServerReference(value, "second"); +export { $$module_1_binding_second as second }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.map.snap.md index 72485f5a2..bd42bcfb2 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.map.snap.md @@ -31,3 +31,19 @@ (6:0) "export async function secondAction() {\n" --> (13:0) "registerServerReference(secondAction, \"secondAction\");\n" (6:0) "export async function secondAction() {\n" --> (14:0) "export { secondAction };\n" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "async function firstAction() {\n" --> (2:0) "async function firstAction() {\n" +(3:0) " return 'first action called'\n" --> (3:0) " return 'first action called'\n" +(4:0) "}\n" --> (4:0) "}\n" +(6:7) "async function secondAction() {\n" --> (6:0) "async function secondAction() {\n" +(7:0) " return 'second action called'\n" --> (7:0) " return 'second action called'\n" +(8:0) "}\n" --> (8:0) "}\n" +[unmapped] --> (10:0) "const $$module_0_binding_firstAction = Object.defineProperty(registerServerReference(firstAction, \"firstAction\"), \"name\", { value: \"firstAction\" });\n" +[unmapped] --> (11:0) "export { $$module_0_binding_firstAction as firstAction };\n" +[unmapped] --> (12:0) "const $$module_1_binding_secondAction = Object.defineProperty(registerServerReference(secondAction, \"secondAction\"), \"name\", { value: \"secondAction\" });\n" +[unmapped] --> (13:0) "export { $$module_1_binding_secondAction as secondAction };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.snap.md index 20e24de54..054a79d7f 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.snap.md @@ -61,3 +61,28 @@ export { firstAction }; registerServerReference(secondAction, "secondAction"); export { secondAction }; ``` + +## module-export-wrap + +**Status:** transformed + +**References:** firstAction, secondAction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#NTY2ACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZmlyc3RBY3Rpb24oKSB7CiAgcmV0dXJuICdmaXJzdCBhY3Rpb24gY2FsbGVkJwp9Cgphc3luYyBmdW5jdGlvbiBzZWNvbmRBY3Rpb24oKSB7CiAgcmV0dXJuICdzZWNvbmQgYWN0aW9uIGNhbGxlZCcKfQoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX2ZpcnN0QWN0aW9uID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGZpcnN0QWN0aW9uLCAiZmlyc3RBY3Rpb24iKSwgIm5hbWUiLCB7IHZhbHVlOiAiZmlyc3RBY3Rpb24iIH0pOwpleHBvcnQgeyAkJG1vZHVsZV8wX2JpbmRpbmdfZmlyc3RBY3Rpb24gYXMgZmlyc3RBY3Rpb24gfTsKY29uc3QgJCRtb2R1bGVfMV9iaW5kaW5nX3NlY29uZEFjdGlvbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWdpc3RlclNlcnZlclJlZmVyZW5jZShzZWNvbmRBY3Rpb24sICJzZWNvbmRBY3Rpb24iKSwgIm5hbWUiLCB7IHZhbHVlOiAic2Vjb25kQWN0aW9uIiB9KTsKZXhwb3J0IHsgJCRtb2R1bGVfMV9iaW5kaW5nX3NlY29uZEFjdGlvbiBhcyBzZWNvbmRBY3Rpb24gfTsKNDg5AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXJzdEFjdGlvbigpIHtcbiAgcmV0dXJuICdmaXJzdCBhY3Rpb24gY2FsbGVkJ1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2Vjb25kQWN0aW9uKCkge1xuICByZXR1cm4gJ3NlY29uZCBhY3Rpb24gY2FsbGVkJ1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRUosS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU07QUFDN0I7O0FBRU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU07QUFDOUI7Ozs7OzsifQ==) + +```js +'use server' + +async function firstAction() { + return 'first action called' +} + +async function secondAction() { + return 'second action called' +} + +const $$module_0_binding_firstAction = Object.defineProperty(registerServerReference(firstAction, "firstAction"), "name", { value: "firstAction" }); +export { $$module_0_binding_firstAction as firstAction }; +const $$module_1_binding_secondAction = Object.defineProperty(registerServerReference(secondAction, "secondAction"), "name", { value: "secondAction" }); +export { $$module_1_binding_secondAction as secondAction }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js.map.snap.md index 930094923..c2241bf91 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js.map.snap.md @@ -21,3 +21,14 @@ (2:0) "export const action = async function actionImplementation() {\n" --> (6:0) "registerServerReference(action, \"action\");\n" (2:0) "export const action = async function actionImplementation() {\n" --> (7:0) "export { action };\n" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "const action = async function actionImplementation() {\n" --> (2:0) "const action = async function actionImplementation() {\n" +(3:0) " return 'named function expression called'\n" --> (3:0) " return 'named function expression called'\n" +(4:0) "}\n" --> (4:0) "}\n" +[unmapped] --> (6:0) "const $$module_0_binding_action = Object.defineProperty(registerServerReference(action, \"action\"), \"name\", { value: \"actionImplementation\" });\n" +[unmapped] --> (7:0) "export { $$module_0_binding_action as action };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js.snap.md index 585c9c147..6135a7f18 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js.snap.md @@ -44,3 +44,22 @@ const action = async function actionImplementation() { registerServerReference(action, "action"); export { action }; ``` + +## module-export-wrap + +**Status:** transformed + +**References:** action + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzA3ACd1c2Ugc2VydmVyJwoKY29uc3QgYWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gYWN0aW9uSW1wbGVtZW50YXRpb24oKSB7CiAgcmV0dXJuICduYW1lZCBmdW5jdGlvbiBleHByZXNzaW9uIGNhbGxlZCcKfQoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX2FjdGlvbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWdpc3RlclNlcnZlclJlZmVyZW5jZShhY3Rpb24sICJhY3Rpb24iKSwgIm5hbWUiLCB7IHZhbHVlOiAiYWN0aW9uSW1wbGVtZW50YXRpb24iIH0pOwpleHBvcnQgeyAkJG1vZHVsZV8wX2JpbmRpbmdfYWN0aW9uIGFzIGFjdGlvbiB9OwozODAAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGNvbnN0IGFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkltcGxlbWVudGF0aW9uKCkge1xuICByZXR1cm4gJ25hbWVkIGZ1bmN0aW9uIGV4cHJlc3Npb24gY2FsbGVkJ1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRUosS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU07QUFDMUM7Ozs7In0=) + +```js +'use server' + +const action = async function actionImplementation() { + return 'named function expression called' +} + +const $$module_0_binding_action = Object.defineProperty(registerServerReference(action, "action"), "name", { value: "actionImplementation" }); +export { $$module_0_binding_action as action }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.map.snap.md index 291d2b0c3..ba00ab6c2 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.map.snap.md @@ -20,3 +20,14 @@ (2:0) "export async function namedFunction() {\n" --> (6:0) "registerServerReference(namedFunction, \"namedFunction\");\n" (2:0) "export async function namedFunction() {\n" --> (7:0) "export { namedFunction };\n" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "async function namedFunction() {\n" --> (2:0) "async function namedFunction() {\n" +(3:0) " return 'named function called'\n" --> (3:0) " return 'named function called'\n" +(4:0) "}\n" --> (4:0) "}\n" +[unmapped] --> (6:0) "const $$module_0_binding_namedFunction = Object.defineProperty(registerServerReference(namedFunction, \"namedFunction\"), \"name\", { value: \"namedFunction\" });\n" +[unmapped] --> (7:0) "export { $$module_0_binding_namedFunction as namedFunction };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.snap.md index e6fb50e56..7bb898376 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.snap.md @@ -44,3 +44,22 @@ async function namedFunction() { registerServerReference(namedFunction, "namedFunction"); export { namedFunction }; ``` + +## module-export-wrap + +**Status:** transformed + +**References:** namedFunction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzAyACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gbmFtZWRGdW5jdGlvbigpIHsKICByZXR1cm4gJ25hbWVkIGZ1bmN0aW9uIGNhbGxlZCcKfQoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX25hbWVkRnVuY3Rpb24gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UobmFtZWRGdW5jdGlvbiwgIm5hbWVkRnVuY3Rpb24iKSwgIm5hbWUiLCB7IHZhbHVlOiAibmFtZWRGdW5jdGlvbiIgfSk7CmV4cG9ydCB7ICQkbW9kdWxlXzBfYmluZGluZ19uYW1lZEZ1bmN0aW9uIGFzIG5hbWVkRnVuY3Rpb24gfTsKMzA1AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuYW1lZEZ1bmN0aW9uKCkge1xuICByZXR1cm4gJ25hbWVkIGZ1bmN0aW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0FBQy9COzs7OyJ9) + +```js +'use server' + +async function namedFunction() { + return 'named function called' +} + +const $$module_0_binding_namedFunction = Object.defineProperty(registerServerReference(namedFunction, "namedFunction"), "name", { value: "namedFunction" }); +export { $$module_0_binding_namedFunction as namedFunction }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js.map.snap.md index 8ac8287a0..572c58a79 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js.map.snap.md @@ -22,3 +22,15 @@ (4:0) "export async function action() {\n" --> (8:0) "registerServerReference(action, \"action\");\n" (4:0) "export async function action() {\n" --> (9:0) "export { action };\n" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "void action\n" --> (2:0) "void action\n" +(4:7) "async function action() {\n" --> (4:0) "async function action() {\n" +(5:0) " return 'action called'\n" --> (5:0) " return 'action called'\n" +(6:0) "}\n" --> (6:0) "}\n" +[unmapped] --> (8:0) "const $$module_0_binding_action = Object.defineProperty(registerServerReference(action, \"action\"), \"name\", { value: \"action\" });\n" +[unmapped] --> (9:0) "export { $$module_0_binding_action as action };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js.snap.md index 1229c1c36..325e5dd07 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js.snap.md @@ -50,3 +50,24 @@ async function action() { registerServerReference(action, "action"); export { action }; ``` + +## module-export-wrap + +**Status:** transformed + +**References:** action + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjU4ACd1c2Ugc2VydmVyJwoKdm9pZCBhY3Rpb24KCmFzeW5jIGZ1bmN0aW9uIGFjdGlvbigpIHsKICByZXR1cm4gJ2FjdGlvbiBjYWxsZWQnCn0KCmNvbnN0ICQkbW9kdWxlXzBfYmluZGluZ19hY3Rpb24gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoYWN0aW9uLCAiYWN0aW9uIiksICJuYW1lIiwgeyB2YWx1ZTogImFjdGlvbiIgfSk7CmV4cG9ydCB7ICQkbW9kdWxlXzBfYmluZGluZ19hY3Rpb24gYXMgYWN0aW9uIH07CjMxMQB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG52b2lkIGFjdGlvblxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uKCkge1xuICByZXR1cm4gJ2FjdGlvbiBjYWxsZWQnXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFWCxJQUFJLENBQUM7O0FBRUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTTtBQUN2Qjs7OzsifQ==) + +```js +'use server' + +void action + +async function action() { + return 'action called' +} + +const $$module_0_binding_action = Object.defineProperty(registerServerReference(action, "action"), "name", { value: "action" }); +export { $$module_0_binding_action as action }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/recursive.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/recursive.js new file mode 100644 index 000000000..f9953526b --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/recursive.js @@ -0,0 +1,6 @@ +'use server' + +export function recursive(depth) { + if (depth > 0) return recursive(depth - 1) + return recursive.marker +} diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/recursive.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/recursive.js.map.snap.md new file mode 100644 index 000000000..8e72caa04 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/recursive.js.map.snap.md @@ -0,0 +1,36 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "function recursive(depth) {\n" --> (2:0) "function recursive(depth) {\n" +(3:0) " if (depth > 0) return recursive(depth - 1)\n" --> (3:0) " if (depth > 0) return recursive(depth - 1)\n" +(4:0) " return recursive.marker\n" --> (4:0) " return recursive.marker\n" +(5:0) "}\n" --> (5:0) "}\n" +(2:0) "export function recursive(depth) {\n" --> (6:0) "recursive = /* #__PURE__ */ registerServerReference(recursive, \"recursive\");\n" +(2:0) "export function recursive(depth) {\n" --> (7:0) "export { recursive };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "function recursive(depth) {\n" --> (2:0) "function recursive(depth) {\n" +(3:0) " if (depth > 0) return recursive(depth - 1)\n" --> (3:0) " if (depth > 0) return recursive(depth - 1)\n" +(4:0) " return recursive.marker\n" --> (4:0) " return recursive.marker\n" +(5:0) "}\n" --> (5:0) "}\n" +(2:0) "export function recursive(depth) {\n" --> (6:0) "\n" +(2:0) "export function recursive(depth) {\n" --> (7:0) "registerServerReference(recursive, \"recursive\");\n" +(2:0) "export function recursive(depth) {\n" --> (8:0) "export { recursive };\n" +``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "function recursive(depth) {\n" --> (2:0) "function recursive(depth) {\n" +(3:0) " if (depth > 0) return recursive(depth - 1)\n" --> (3:0) " if (depth > 0) return recursive(depth - 1)\n" +(4:0) " return recursive.marker\n" --> (4:0) " return recursive.marker\n" +(5:0) "}\n" --> (5:0) "}\n" +[unmapped] --> (7:0) "const $$module_0_binding_recursive = Object.defineProperty(registerServerReference(recursive, \"recursive\"), \"name\", { value: \"recursive\" });\n" +[unmapped] --> (8:0) "export { $$module_0_binding_recursive as recursive };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/recursive.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/recursive.js.snap.md new file mode 100644 index 000000000..19f2b69dc --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/recursive.js.snap.md @@ -0,0 +1,69 @@ +## Input + +```js +'use server' + +export function recursive(depth) { + if (depth > 0) return recursive(depth - 1) + return recursive.marker +} +``` + +## wrap-export + +**Status:** transformed + +**References:** recursive + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjE0ACd1c2Ugc2VydmVyJwoKZnVuY3Rpb24gcmVjdXJzaXZlKGRlcHRoKSB7CiAgaWYgKGRlcHRoID4gMCkgcmV0dXJuIHJlY3Vyc2l2ZShkZXB0aCAtIDEpCiAgcmV0dXJuIHJlY3Vyc2l2ZS5tYXJrZXIKfQpyZWN1cnNpdmUgPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UocmVjdXJzaXZlLCAicmVjdXJzaXZlIik7CmV4cG9ydCB7IHJlY3Vyc2l2ZSB9Owo0MzIAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGZ1bmN0aW9uIHJlY3Vyc2l2ZShkZXB0aCkge1xuICBpZiAoZGVwdGggPiAwKSByZXR1cm4gcmVjdXJzaXZlKGRlcHRoIC0gMSlcbiAgcmV0dXJuIHJlY3Vyc2l2ZS5tYXJrZXJcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDbkI7QUFIQTtBQUFBOyJ9) + +```js +'use server' + +function recursive(depth) { + if (depth > 0) return recursive(depth - 1) + return recursive.marker +} +recursive = /* #__PURE__ */ registerServerReference(recursive, "recursive"); +export { recursive }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** recursive + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTg3ACd1c2Ugc2VydmVyJwoKZnVuY3Rpb24gcmVjdXJzaXZlKGRlcHRoKSB7CiAgaWYgKGRlcHRoID4gMCkgcmV0dXJuIHJlY3Vyc2l2ZShkZXB0aCAtIDEpCiAgcmV0dXJuIHJlY3Vyc2l2ZS5tYXJrZXIKfQoKcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UocmVjdXJzaXZlLCAicmVjdXJzaXZlIik7CmV4cG9ydCB7IHJlY3Vyc2l2ZSB9Owo0MzcAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGZ1bmN0aW9uIHJlY3Vyc2l2ZShkZXB0aCkge1xuICBpZiAoZGVwdGggPiAwKSByZXR1cm4gcmVjdXJzaXZlKGRlcHRoIC0gMSlcbiAgcmV0dXJuIHJlY3Vyc2l2ZS5tYXJrZXJcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDbkI7QUFIQTtBQUFBO0FBQUE7In0=) + +```js +'use server' + +function recursive(depth) { + if (depth > 0) return recursive(depth - 1) + return recursive.marker +} + +registerServerReference(recursive, "recursive"); +export { recursive }; +``` + +## module-export-wrap + +**Status:** transformed + +**References:** recursive + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzExACd1c2Ugc2VydmVyJwoKZnVuY3Rpb24gcmVjdXJzaXZlKGRlcHRoKSB7CiAgaWYgKGRlcHRoID4gMCkgcmV0dXJuIHJlY3Vyc2l2ZShkZXB0aCAtIDEpCiAgcmV0dXJuIHJlY3Vyc2l2ZS5tYXJrZXIKfQoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX3JlY3Vyc2l2ZSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWdpc3RlclNlcnZlclJlZmVyZW5jZShyZWN1cnNpdmUsICJyZWN1cnNpdmUiKSwgIm5hbWUiLCB7IHZhbHVlOiAicmVjdXJzaXZlIiB9KTsKZXhwb3J0IHsgJCRtb2R1bGVfMF9iaW5kaW5nX3JlY3Vyc2l2ZSBhcyByZWN1cnNpdmUgfTsKNDI1AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBmdW5jdGlvbiByZWN1cnNpdmUoZGVwdGgpIHtcbiAgaWYgKGRlcHRoID4gMCkgcmV0dXJuIHJlY3Vyc2l2ZShkZXB0aCAtIDEpXG4gIHJldHVybiByZWN1cnNpdmUubWFya2VyXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFSixRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO0FBQ25COzs7OyJ9) + +```js +'use server' + +function recursive(depth) { + if (depth > 0) return recursive(depth - 1) + return recursive.marker +} + +const $$module_0_binding_recursive = Object.defineProperty(registerServerReference(recursive, "recursive"), "name", { value: "recursive" }); +export { $$module_0_binding_recursive as recursive }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport-attributes.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport-attributes.js.map.snap.md index b6eb39bc0..189d3403d 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport-attributes.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport-attributes.js.map.snap.md @@ -16,3 +16,12 @@ [unmapped] --> (4:0) "import { reexportedAction as $$effect_import_reexportedAction } from './reexport-source';\n" [unmapped] --> (5:0) "registerServerReference($$effect_import_reexportedAction, \"reexportedAction\");" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +[unmapped] --> (4:0) "import { reexportedAction as $$module_0_implementation_reexportedAction } from './reexport-source';\n" +[unmapped] --> (5:0) "const $$module_0_binding_reexportedAction = registerServerReference($$module_0_implementation_reexportedAction, \"reexportedAction\");\n" +[unmapped] --> (6:0) "export { $$module_0_binding_reexportedAction as reexportedAction };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport-attributes.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport-attributes.js.snap.md index 7f5196f69..18b72efb2 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport-attributes.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport-attributes.js.snap.md @@ -40,3 +40,21 @@ export { reexportedAction } from './reexport-source' with { type: 'json' } import { reexportedAction as $$effect_import_reexportedAction } from './reexport-source'; registerServerReference($$effect_import_reexportedAction, "reexportedAction"); ``` + +## module-export-wrap + +**Status:** transformed + +**References:** reexportedAction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzE3ACd1c2Ugc2VydmVyJwoKCgppbXBvcnQgeyByZWV4cG9ydGVkQWN0aW9uIGFzICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fcmVleHBvcnRlZEFjdGlvbiB9IGZyb20gJy4vcmVleHBvcnQtc291cmNlJzsKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX3JlZXhwb3J0ZWRBY3Rpb24gPSByZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX3JlZXhwb3J0ZWRBY3Rpb24sICJyZWV4cG9ydGVkQWN0aW9uIik7CmV4cG9ydCB7ICQkbW9kdWxlXzBfYmluZGluZ19yZWV4cG9ydGVkQWN0aW9uIGFzIHJlZXhwb3J0ZWRBY3Rpb24gfTsKMTk4AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCB7IHJlZXhwb3J0ZWRBY3Rpb24gfSBmcm9tICcuL3JlZXhwb3J0LXNvdXJjZScgd2l0aCB7IHR5cGU6ICdqc29uJyB9XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7Ozs7OzsifQ==) + +```js +'use server' + + + +import { reexportedAction as $$module_0_implementation_reexportedAction } from './reexport-source'; +const $$module_0_binding_reexportedAction = registerServerReference($$module_0_implementation_reexportedAction, "reexportedAction"); +export { $$module_0_binding_reexportedAction as reexportedAction }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.map.snap.md index 740f4c074..99dc2d9d8 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.map.snap.md @@ -16,3 +16,12 @@ [unmapped] --> (4:0) "import { reexportedAction as $$effect_import_reexportedAction } from './reexport-source';\n" [unmapped] --> (5:0) "registerServerReference($$effect_import_reexportedAction, \"reexportedAction\");" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +[unmapped] --> (4:0) "import { reexportedAction as $$module_0_implementation_reexportedAction } from './reexport-source';\n" +[unmapped] --> (5:0) "const $$module_0_binding_reexportedAction = registerServerReference($$module_0_implementation_reexportedAction, \"reexportedAction\");\n" +[unmapped] --> (6:0) "export { $$module_0_binding_reexportedAction as reexportedAction };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.snap.md index e2b88993d..ba4139b9c 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.snap.md @@ -40,3 +40,21 @@ export { reexportedAction } from './reexport-source' import { reexportedAction as $$effect_import_reexportedAction } from './reexport-source'; registerServerReference($$effect_import_reexportedAction, "reexportedAction"); ``` + +## module-export-wrap + +**Status:** transformed + +**References:** reexportedAction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzE3ACd1c2Ugc2VydmVyJwoKCgppbXBvcnQgeyByZWV4cG9ydGVkQWN0aW9uIGFzICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fcmVleHBvcnRlZEFjdGlvbiB9IGZyb20gJy4vcmVleHBvcnQtc291cmNlJzsKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX3JlZXhwb3J0ZWRBY3Rpb24gPSByZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX3JlZXhwb3J0ZWRBY3Rpb24sICJyZWV4cG9ydGVkQWN0aW9uIik7CmV4cG9ydCB7ICQkbW9kdWxlXzBfYmluZGluZ19yZWV4cG9ydGVkQWN0aW9uIGFzIHJlZXhwb3J0ZWRBY3Rpb24gfTsKMTc2AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCB7IHJlZXhwb3J0ZWRBY3Rpb24gfSBmcm9tICcuL3JlZXhwb3J0LXNvdXJjZSdcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOzs7Ozs7OyJ9) + +```js +'use server' + + + +import { reexportedAction as $$module_0_implementation_reexportedAction } from './reexport-source'; +const $$module_0_binding_reexportedAction = registerServerReference($$module_0_implementation_reexportedAction, "reexportedAction"); +export { $$module_0_binding_reexportedAction as reexportedAction }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.map.snap.md index d9a0477ce..2d15d3a41 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.map.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.map.snap.md @@ -29,3 +29,17 @@ (4:0) "export const functionExpression = async function () {\n" --> (11:0) "registerServerReference(functionExpression, \"functionExpression\");\n" (4:0) "export const functionExpression = async function () {\n" --> (12:0) "export { functionExpression };\n" ``` + +## module-export-wrap + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "const arrowFunction = async () => 'arrow function called'\n" --> (2:0) "const arrowFunction = async () => 'arrow function called'\n" +(4:7) "const functionExpression = async function () {\n" --> (4:0) "const functionExpression = async function () {\n" +(5:0) " return 'function expression called'\n" --> (5:0) " return 'function expression called'\n" +(6:0) "}\n" --> (6:0) "}\n" +[unmapped] --> (8:0) "const $$module_0_binding_arrowFunction = Object.defineProperty(registerServerReference(arrowFunction, \"arrowFunction\"), \"name\", { value: \"arrowFunction\" });\n" +[unmapped] --> (9:0) "export { $$module_0_binding_arrowFunction as arrowFunction };\n" +[unmapped] --> (10:0) "const $$module_1_binding_functionExpression = Object.defineProperty(registerServerReference(functionExpression, \"functionExpression\"), \"name\", { value: \"functionExpression\" });\n" +[unmapped] --> (11:0) "export { $$module_1_binding_functionExpression as functionExpression };\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.snap.md index b806e656f..8baac85c2 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.snap.md +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.snap.md @@ -55,3 +55,26 @@ export { arrowFunction }; registerServerReference(functionExpression, "functionExpression"); export { functionExpression }; ``` + +## module-export-wrap + +**Status:** transformed + +**References:** arrowFunction, functionExpression + +[Source map visualization](https://evanw.github.io/source-map-visualization/#NjI5ACd1c2Ugc2VydmVyJwoKY29uc3QgYXJyb3dGdW5jdGlvbiA9IGFzeW5jICgpID0+ICdhcnJvdyBmdW5jdGlvbiBjYWxsZWQnCgpjb25zdCBmdW5jdGlvbkV4cHJlc3Npb24gPSBhc3luYyBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuICdmdW5jdGlvbiBleHByZXNzaW9uIGNhbGxlZCcKfQoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX2Fycm93RnVuY3Rpb24gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoYXJyb3dGdW5jdGlvbiwgImFycm93RnVuY3Rpb24iKSwgIm5hbWUiLCB7IHZhbHVlOiAiYXJyb3dGdW5jdGlvbiIgfSk7CmV4cG9ydCB7ICQkbW9kdWxlXzBfYmluZGluZ19hcnJvd0Z1bmN0aW9uIGFzIGFycm93RnVuY3Rpb24gfTsKY29uc3QgJCRtb2R1bGVfMV9iaW5kaW5nX2Z1bmN0aW9uRXhwcmVzc2lvbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWdpc3RlclNlcnZlclJlZmVyZW5jZShmdW5jdGlvbkV4cHJlc3Npb24sICJmdW5jdGlvbkV4cHJlc3Npb24iKSwgIm5hbWUiLCB7IHZhbHVlOiAiZnVuY3Rpb25FeHByZXNzaW9uIiB9KTsKZXhwb3J0IHsgJCRtb2R1bGVfMV9iaW5kaW5nX2Z1bmN0aW9uRXhwcmVzc2lvbiBhcyBmdW5jdGlvbkV4cHJlc3Npb24gfTsKNTI4AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBjb25zdCBhcnJvd0Z1bmN0aW9uID0gYXN5bmMgKCkgPT4gJ2Fycm93IGZ1bmN0aW9uIGNhbGxlZCdcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uRXhwcmVzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdmdW5jdGlvbiBleHByZXNzaW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTTs7QUFFeEQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU07QUFDcEM7Ozs7OzsifQ==) + +```js +'use server' + +const arrowFunction = async () => 'arrow function called' + +const functionExpression = async function () { + return 'function expression called' +} + +const $$module_0_binding_arrowFunction = Object.defineProperty(registerServerReference(arrowFunction, "arrowFunction"), "name", { value: "arrowFunction" }); +export { $$module_0_binding_arrowFunction as arrowFunction }; +const $$module_1_binding_functionExpression = Object.defineProperty(registerServerReference(functionExpression, "functionExpression"), "name", { value: "functionExpression" }); +export { $$module_1_binding_functionExpression as functionExpression }; +``` diff --git a/packages/plugin-rsc/src/transforms/index.ts b/packages/plugin-rsc/src/transforms/index.ts index ab49332a2..d249df8d8 100644 --- a/packages/plugin-rsc/src/transforms/index.ts +++ b/packages/plugin-rsc/src/transforms/index.ts @@ -1,4 +1,5 @@ export * from './hoist' +export * from './module-export-wrap' export * from './module-export-scan' export * from './module-export-effect' export * from './wrap-export' diff --git a/packages/plugin-rsc/src/transforms/module-export-effect.test.ts b/packages/plugin-rsc/src/transforms/module-export-effect.test.ts index cace6e975..c59181da0 100644 --- a/packages/plugin-rsc/src/transforms/module-export-effect.test.ts +++ b/packages/plugin-rsc/src/transforms/module-export-effect.test.ts @@ -81,6 +81,10 @@ export default async function Page() {} transform(input, { rejectNonAsyncFunction: true }), ).rejects.toThrow('unsupported non async function') + await expect( + transform(`export let action`, { rejectNonAsyncFunction: true }), + ).rejects.toThrow('unsupported non async function') + const filtered = await transform(input, { rejectNonAsyncFunction: true, filter: () => false, @@ -126,7 +130,7 @@ export default async function Page() {} `export function Fn() {}`, [ { - localName: 'Fn', + declName: 'Fn', isFunction: true, }, ], @@ -135,7 +139,7 @@ export default async function Page() {} `export class Cls {}`, [ { - localName: 'Cls', + declName: 'Cls', isFunction: false, }, ], @@ -144,7 +148,7 @@ export default async function Page() {} `export const Arrow = () => {}`, [ { - localName: 'Arrow', + declName: 'Arrow', isFunction: true, }, ], @@ -153,7 +157,7 @@ export default async function Page() {} `export const FnExpression = function () {}`, [ { - localName: 'FnExpression', + declName: 'FnExpression', isFunction: true, }, ], @@ -162,7 +166,7 @@ export default async function Page() {} `export const Literal = 1`, [ { - localName: 'Literal', + declName: 'Literal', isFunction: false, }, ], @@ -171,7 +175,7 @@ export default async function Page() {} `export const ObjectValue = {}`, [ { - localName: 'ObjectValue', + declName: 'ObjectValue', isFunction: false, }, ], @@ -180,7 +184,7 @@ export default async function Page() {} `export const ArrayValue = []`, [ { - localName: 'ArrayValue', + declName: 'ArrayValue', isFunction: false, }, ], @@ -189,33 +193,33 @@ export default async function Page() {} `export const ClassValue = class {}`, [ { - localName: 'ClassValue', + declName: 'ClassValue', isFunction: false, }, ], ], - [`export const Unknown = getValue()`, [{ localName: 'Unknown' }]], - [`export const { id } = getValue()`, [{ localName: 'id' }]], - [`export const [a, b] = []`, [{ localName: 'a' }, { localName: 'b' }]], + [`export const Unknown = getValue()`, [{ declName: 'Unknown' }]], + [`export const { id } = getValue()`, [{ declName: 'id' }]], + [`export const [a, b] = []`, [{ declName: 'a' }, { declName: 'b' }]], [ `export const MultiFn = () => {}, MultiValue = 1, MultiUnknown = getValue()`, [ { - localName: 'MultiFn', + declName: 'MultiFn', isFunction: true, }, { - localName: 'MultiValue', + declName: 'MultiValue', isFunction: false, }, - { localName: 'MultiUnknown' }, + { declName: 'MultiUnknown' }, ], ], [ `export default function Page() {}`, [ { - localName: 'Page', + declName: 'Page', isFunction: true, }, ], @@ -225,7 +229,7 @@ export default async function Page() {} `export default class Page {}`, [ { - localName: 'Page', + declName: 'Page', isFunction: false, }, ], @@ -243,7 +247,9 @@ export default async function Page() {} for (const [input, expected] of examples) { const result = await transform(input) - expect(result.references.map((context) => context.meta)).toEqual(expected) + expect( + result.references.map(({ meta: { valueNode: _, ...meta } }) => meta), + ).toEqual(expected) } }) }) diff --git a/packages/plugin-rsc/src/transforms/module-export-effect.ts b/packages/plugin-rsc/src/transforms/module-export-effect.ts index d6d6b633e..cdce3e84f 100644 --- a/packages/plugin-rsc/src/transforms/module-export-effect.ts +++ b/packages/plugin-rsc/src/transforms/module-export-effect.ts @@ -3,7 +3,7 @@ import type { Identifier } from 'estree' import MagicString from 'magic-string' import type { ESTree } from 'vite' import { scanModuleExports, type ModuleExportMeta } from './module-export-scan' -import { validateNonAsyncFunction } from './utils' +import { rejectNonAsyncFunction, validateNonAsyncFunction } from './utils' // TODO: Metadata, filtering, and returned reference contexts are currently // ported only for transformWrapExport compatibility. Remove them if no @@ -128,8 +128,13 @@ export function transformModuleExportEffect( effects.push(generate({ binding, exportName, meta })) } } - if (validate && declarator.node.init) { - validateNonAsyncFunction(options, declarator.node.init) + if (validate) { + const init = declarator.node.init + if (!init) { + rejectNonAsyncFunction(options, declarator.node.start) + } else { + validateNonAsyncFunction(options, init) + } } } if (effects.length > 0) { diff --git a/packages/plugin-rsc/src/transforms/module-export-scan.test.ts b/packages/plugin-rsc/src/transforms/module-export-scan.test.ts index aae47872b..f46c7a9c0 100644 --- a/packages/plugin-rsc/src/transforms/module-export-scan.test.ts +++ b/packages/plugin-rsc/src/transforms/module-export-scan.test.ts @@ -19,13 +19,18 @@ export * from './all' expect(groups[0]).toMatchObject({ type: 'declaration', declaration: { type: 'FunctionDeclaration' }, + directFunction: { + node: { type: 'FunctionDeclaration' }, + originalName: 'action', + }, exports: [ { localName: 'action', exportName: 'action', meta: { - localName: 'action', + declName: 'action', isFunction: true, + valueNode: { type: 'FunctionDeclaration' }, }, }, ], @@ -35,25 +40,32 @@ export * from './all' declaration: { kind: 'const' }, declarators: [ { + directFunction: { + node: { type: 'ArrowFunctionExpression' }, + originalName: 'loader', + }, exports: [ { localName: 'loader', exportName: 'loader', meta: { - localName: 'loader', + declName: 'loader', isFunction: true, + valueNode: { type: 'ArrowFunctionExpression' }, }, }, ], }, { + directFunction: undefined, exports: [ { localName: 'value', exportName: 'value', meta: { - localName: 'value', + declName: 'value', isFunction: false, + valueNode: { type: 'Literal' }, }, }, ], @@ -64,13 +76,15 @@ export * from './all' type: 'variable-declaration', declarators: [ { + directFunction: undefined, exports: [ { localName: 'item', exportName: 'item', meta: { - localName: 'item', + declName: 'item', isFunction: undefined, + valueNode: { type: 'Identifier', name: 'source' }, }, }, ], @@ -91,19 +105,58 @@ export * from './all' type: 'default', kind: 'identifier', localName: undefined, - meta: { defaultExportIdentifierName: 'action' }, + meta: { + defaultExportIdentifierName: 'action', + valueNode: { type: 'Identifier', name: 'action' }, + }, }) expect(groups[6]).toMatchObject({ type: 'export-all' }) }) test.each([ - ['export default function action() {}', 'named-declaration'], - ['export default action', 'identifier'], - ['export default () => {}', 'other'], -] as const)('classifies %s', async (source, kind) => { - const ast = await parseAstAsync(source) + [ + 'export default function action() {}', + 'named-declaration', + 'FunctionDeclaration', + 'action', + ], + ['export default action', 'identifier', undefined, undefined], + ['export default () => {}', 'other', 'ArrowFunctionExpression', 'default'], +] as const)( + 'classifies %s', + async (source, kind, functionType, originalName) => { + const ast = await parseAstAsync(source) + + expect(scanModuleExports(ast)).toMatchObject([ + { + type: 'default', + kind, + directFunction: functionType + ? { node: { type: functionType }, originalName } + : undefined, + }, + ]) + }, +) - expect(scanModuleExports(ast)).toMatchObject([{ type: 'default', kind }]) +test('records explicit function expression names', async () => { + const ast = await parseAstAsync( + `export const action = function implementation() {}`, + ) + + expect(scanModuleExports(ast)).toMatchObject([ + { + type: 'variable-declaration', + declarators: [ + { + directFunction: { + node: { type: 'FunctionExpression' }, + originalName: 'implementation', + }, + }, + ], + }, + ]) }) test('flags string literal export names as unsupported', async () => { diff --git a/packages/plugin-rsc/src/transforms/module-export-scan.ts b/packages/plugin-rsc/src/transforms/module-export-scan.ts index c3b8ccf2a..3c7c23868 100644 --- a/packages/plugin-rsc/src/transforms/module-export-scan.ts +++ b/packages/plugin-rsc/src/transforms/module-export-scan.ts @@ -4,17 +4,48 @@ import type { ExportDefaultDeclaration, ExportNamedDeclaration, ExportSpecifier, + ArrowFunctionExpression, FunctionDeclaration, + FunctionExpression, ClassDeclaration, Node, Program, VariableDeclaration, VariableDeclarator, + MaybeNamedFunctionDeclaration, } from 'estree' import type { ESTree } from 'vite' import { extractNames } from './utils' +export type ModuleExportFunction = + | MaybeNamedFunctionDeclaration + | FunctionExpression + | ArrowFunctionExpression + +export type ModuleExportDirectFunction = { + /** The directly exported function node. */ + node: ModuleExportFunction + /** The function's runtime name before rewriting. */ + originalName: string +} + export type ModuleExportMeta = { + /** + * The source node that evaluates to the exported value when directly + * available. Filters and generators can use it for syntax-sensitive policy. + * + * - The declaration for a function or class export. + * - The initializer for a variable export. + * - The declaration expression for a default export. + * - `undefined` for export specifiers and re-exports. + * + * The callable `"use cache"` example uses this to preserve object and array + * exports, matching an intentionally arbitrary Next.js exception without + * encoding that policy in the generic transform. + */ + valueNode?: Node | ExportDefaultDeclaration['declaration'] + // TODO: followings are used only for internal `transformRscCssExport`. + // should probably simplify to use `valueNode` directly and remove these. /** * The local declaration name when statically available. * @@ -23,7 +54,7 @@ export type ModuleExportMeta = { * - `undefined` for `export default () => {}` * - `undefined` for `export { Page }` */ - localName?: string + declName?: string /** * Whether the exported value is statically known to be a function. * @@ -67,6 +98,9 @@ export type ModuleExportGroup = type: 'declaration' node: ExportNamedDeclaration declaration: FunctionDeclaration | ClassDeclaration + /** Direct function metadata for `export function foo() {}`. */ + directFunction?: ModuleExportDirectFunction + // TODO: just `export: ModuleExportEntry` pls exports: [ModuleExportEntry] } | { @@ -78,6 +112,8 @@ export type ModuleExportGroup = declaration: VariableDeclaration declarators: { node: VariableDeclarator + /** Direct function metadata for `export const foo = () => {}`. */ + directFunction?: ModuleExportDirectFunction exports: ModuleExportEntry[] }[] } @@ -109,6 +145,8 @@ export type ModuleExportGroup = kind: ModuleExportDefaultKind node: ExportDefaultDeclaration localName?: string + /** Direct function metadata for `export default function () {}`. */ + directFunction?: ModuleExportDirectFunction meta: ModuleExportMeta } @@ -129,18 +167,27 @@ export function scanModuleExports( node, declaration, declarators: declaration.declarations.map((declarator) => { + const directFunction = + declarator.id.type === 'Identifier' && declarator.init + ? getDirectFunction(declarator.init, declarator.id.name) + : undefined const isFunction = declarator.id.type === 'Identifier' && declarator.init ? getIsFunction(declarator.init) : undefined return { node: declarator, + directFunction, + // uniformly handle destructured exports such as: + // export const { foo, bar } = ... + // though associated `meta` likely doesn't make sense. exports: extractNames(declarator.id).map((name) => ({ localName: name, exportName: name, meta: { - localName: name, + declName: name, isFunction, + valueNode: declarator.init ?? undefined, }, })), } @@ -155,13 +202,18 @@ export function scanModuleExports( type: 'declaration', node, declaration: node.declaration, + directFunction: + node.declaration.type === 'FunctionDeclaration' + ? getDirectFunction(node.declaration, name) + : undefined, exports: [ { localName: name, exportName: name, meta: { - localName: name, + declName: name, isFunction: getIsFunction(node.declaration), + valueNode: node.declaration, }, }, ], @@ -201,6 +253,7 @@ export function scanModuleExports( let kind: ModuleExportDefaultKind let localName: string | undefined let meta: ModuleExportMeta + const directFunction = getDirectFunction(node.declaration, 'default') if ( (node.declaration.type === 'FunctionDeclaration' || node.declaration.type === 'ClassDeclaration') && @@ -209,19 +262,33 @@ export function scanModuleExports( kind = 'named-declaration' localName = node.declaration.id.name meta = { - localName: node.declaration.id.name, + declName: node.declaration.id.name, isFunction: getIsFunction(node.declaration), + valueNode: node.declaration, } } else if (node.declaration.type === 'Identifier') { kind = 'identifier' - meta = { defaultExportIdentifierName: node.declaration.name } + meta = { + defaultExportIdentifierName: node.declaration.name, + valueNode: node.declaration, + } } else { // export default function () {} // export default () => {} kind = 'other' - meta = { isFunction: getIsFunction(node.declaration) } + meta = { + isFunction: getIsFunction(node.declaration), + valueNode: node.declaration, + } } - groups.push({ type: 'default', kind, node, localName, meta }) + groups.push({ + type: 'default', + kind, + node, + localName, + directFunction, + meta, + }) } } @@ -231,13 +298,7 @@ export function scanModuleExports( function getIsFunction( node: Node | ExportDefaultDeclaration['declaration'], ): boolean | undefined { - if ( - node.type === 'FunctionDeclaration' || - node.type === 'ArrowFunctionExpression' || - node.type === 'FunctionExpression' - ) { - return true - } + if (getFunctionNode(node)) return true if ( node.type === 'ClassDeclaration' || node.type === 'Literal' || @@ -248,3 +309,30 @@ function getIsFunction( return false } } + +function getFunctionNode( + node: Node | ExportDefaultDeclaration['declaration'], +): ModuleExportFunction | undefined { + if ( + node.type === 'FunctionDeclaration' || + node.type === 'ArrowFunctionExpression' || + node.type === 'FunctionExpression' + ) { + return node + } +} + +function getDirectFunction( + node: Node | ExportDefaultDeclaration['declaration'], + fallbackName: string, +): ModuleExportDirectFunction | undefined { + const functionNode = getFunctionNode(node) + if (!functionNode) return + return { + node: functionNode, + originalName: + functionNode.type !== 'ArrowFunctionExpression' && functionNode.id + ? functionNode.id.name + : fallbackName, + } +} diff --git a/packages/plugin-rsc/src/transforms/module-export-wrap.test.ts b/packages/plugin-rsc/src/transforms/module-export-wrap.test.ts new file mode 100644 index 000000000..439e388a1 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/module-export-wrap.test.ts @@ -0,0 +1,172 @@ +import { parseAstAsync } from 'vite' +import { describe, expect, test } from 'vitest' +import { + transformModuleExportWrap, + type TransformModuleExportWrapContext, + type TransformModuleExportWrapOptions, +} from './module-export-wrap' + +async function transform( + input: string, + options: Partial = {}, +) { + const ast = await parseAstAsync(input) + return transformModuleExportWrap(input, ast, { + generate: ({ implementation, originalName, exportName }) => + restoreFunctionName( + `wrap(${implementation}, ${JSON.stringify(exportName)})`, + originalName, + ), + ...options, + }) +} + +function formatContext({ + implementation, + originalName, + exportName, +}: TransformModuleExportWrapContext) { + return { + implementation, + originalName, + exportName, + } +} + +function restoreFunctionName(value: string, name?: string): string { + return name + ? `Object.defineProperty(${value}, "name", { value: ${JSON.stringify(name)} })` + : value +} + +describe(transformModuleExportWrap, () => { + test('returns generated export contexts in order', async () => { + const result = await transform(`\ +export async function action() {} +export const loader = async () => {} +const local = async () => {} +export { local as renamed } +export { remote as forwarded } from './dep' +export default async function Page() {} +`) + + expect(result.references.map(formatContext)).toEqual([ + { + implementation: 'action', + originalName: 'action', + exportName: 'action', + }, + { + implementation: 'loader', + originalName: 'loader', + exportName: 'loader', + }, + { + implementation: 'local', + originalName: undefined, + exportName: 'renamed', + }, + { + implementation: '$$module_3_implementation_forwarded', + originalName: undefined, + exportName: 'forwarded', + }, + { + implementation: 'Page', + originalName: 'Page', + exportName: 'default', + }, + ]) + expect(result.referenceNames).toEqual([ + 'action', + 'loader', + 'renamed', + 'forwarded', + 'default', + ]) + }) + + test('filters generated and reported exports', async () => { + const input = `export const selected = async () => {}, skipped = async () => {}` + const result = await transform(input, { + filter: (name) => name === 'selected', + }) + + expect(result.references.map(formatContext)).toEqual([ + { + implementation: 'selected', + originalName: 'selected', + exportName: 'selected', + }, + ]) + expect(result.referenceNames).toEqual(['selected']) + expect(result.output.toString()).toMatchInlineSnapshot(` + "const selected = async () => {}, skipped = async () => {} + + const $$module_0_binding_selected = Object.defineProperty(wrap(selected, "selected"), "name", { value: "selected" }); + export { $$module_0_binding_selected as selected }; + export { skipped }; + " + `) + + const filtered = await transform(input, { filter: () => false }) + expect(filtered.output.hasChanged()).toBe(false) + expect(filtered.references).toEqual([]) + expect(filtered.referenceNames).toEqual([]) + }) + + test.each([ + `export function action() {}`, + `export let action`, + `export class Action {}`, + `export default class Action {}`, + `export const action = 1`, + `export const action = {}`, + `export const action = []`, + ])('rejects non-async function export: %s', async (input) => { + await expect( + transform(input, { rejectNonAsyncFunction: true }), + ).rejects.toThrow('unsupported non async function') + }) + + test('only validates selected exports', async () => { + const result = await transform( + `export const action = async () => {}, object = {}, array = []`, + { + rejectNonAsyncFunction: true, + filter: (_name, meta) => + meta.valueNode?.type !== 'ObjectExpression' && + meta.valueNode?.type !== 'ArrayExpression', + }, + ) + expect(result.referenceNames).toEqual(['action']) + + const filtered = await transform(`export function action() {}`, { + rejectNonAsyncFunction: true, + filter: () => false, + }) + expect(filtered.output.hasChanged()).toBe(false) + expect(filtered.references).toEqual([]) + }) + + test('controls export-all preservation', async () => { + const input = `export * from './dep'` + + await expect(transform(input)).rejects.toThrow( + 'unsupported ExportAllDeclaration', + ) + + const preserved = await transform(input, { exportAll: 'preserve' }) + expect(preserved.output.hasChanged()).toBe(false) + expect(preserved.references).toEqual([]) + }) + + test('rejects string literal export names', async () => { + const input = `const value = 0; export { value as "my value" }` + + await expect(transform(input)).rejects.toMatchObject({ + message: 'unsupported string literal export name', + pos: input.indexOf('"my value"'), + }) + }) +}) diff --git a/packages/plugin-rsc/src/transforms/module-export-wrap.ts b/packages/plugin-rsc/src/transforms/module-export-wrap.ts new file mode 100644 index 000000000..8c27e2b79 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/module-export-wrap.ts @@ -0,0 +1,370 @@ +import { tinyassert } from '@hiogawa/utils' +import MagicString from 'magic-string' +import type { ESTree } from 'vite' +import { scanModuleExports, type ModuleExportMeta } from './module-export-scan' +import { rejectNonAsyncFunction, validateNonAsyncFunction } from './utils' + +export type TransformModuleExportWrapContext = { + /** The local expression that evaluates to the exported implementation. */ + implementation: string + /** + * The runtime name of a directly exported function. When present, the + * generated expression is responsible for assigning it to the wrapper. + * + * - `"action"` for `export const action = () => {}` + * - `"implementation"` for `export const action = function implementation() {}` + * - `"default"` for `export default () => {}` + * - `undefined` for an indirect export such as `export { action }` + */ + originalName?: string + /** The public export name, or `"default"` for a default export. */ + exportName: string + /** Static metadata collected from the original export declaration. */ + meta: ModuleExportMeta +} + +export type TransformModuleExportWrapFilter = ( + name: string, + meta: ModuleExportMeta, +) => boolean + +export type TransformModuleExportWrapOptions = { + generate: (context: TransformModuleExportWrapContext) => string + filter?: TransformModuleExportWrapFilter + // TODO: Replace this boolean with a rejection-policy callback receiving the + // normalized export metadata and optional value node. The async-function + // check can then be a reusable policy that directive consumers opt into, + // while consumers such as CSS wrapping omit it. + rejectNonAsyncFunction?: boolean + exportAll?: 'error' | 'preserve' +} + +export type TransformModuleExportWrapResult = { + output: MagicString + references: TransformModuleExportWrapContext[] + referenceNames: string[] +} + +/** + * Replaces selected module exports with runtime wrapper bindings while + * preserving their original module-local values. + * + * Conceptually: + * + * ```js + * 'use server' + * + * export async function someFn(value) { + * return value + * } + * + * export const someValue = createSomeValue() + * ``` + * + * becomes: + * + * ```js + * 'use server' + * + * async function someFn(value) { + * return value + * } + * const someValue = createSomeValue() + * + * const $$module_0_binding_someFn = __WRAP__(someFn, 'someFn') + * export { $$module_0_binding_someFn as someFn } + * const $$module_1_binding_someValue = __WRAP__(someValue, 'someValue') + * export { $$module_1_binding_someValue as someValue } + * ``` + * + * Here, `__WRAP__(...)` represents the expression returned by the `generate` + * callback for each `{ implementation, originalName, exportName, meta }` + * context. `originalName` is present for directly exported functions whose + * name should be assigned to the generated wrapper. + * The callback is responsible for marking its expression as pure when needed. + * `references` returns those contexts in wrapper creation order, while + * `referenceNames` returns only their export names. + * + * Local references to both `someFn` and `someValue` retain their original + * values. Importers receive the generated wrapper bindings. + * See `fixtures/source-map/wrap-export/local-binding-preservation.js.snap.md` + * for a side-by-side comparison with `transformWrapExport`. + * + * Generated `$$module_*` names are not deconflicted from user bindings, + * consistent with the other transform helpers. + */ +export function transformModuleExportWrap( + input: string, + viteAst: ESTree.Program, + options: TransformModuleExportWrapOptions, +): TransformModuleExportWrapResult { + // Keep appended wrapper bindings separated from source ending at EOF. + if (!input.endsWith('\n')) { + input += '\n' + } + + const output = new MagicString(input) + const filter = options.filter ?? (() => true) + const references: TransformModuleExportWrapContext[] = [] + const appendedCode: string[] = [] + + function createContext( + implementation: string, + exportName: string, + meta: ModuleExportMeta, + originalName?: string, + ): TransformModuleExportWrapContext { + const context = { + implementation, + originalName, + exportName, + meta, + } + references.push(context) + return context + } + + function exportBinding(binding: string, exportName: string): string { + return binding === exportName + ? `export { ${binding} };` + : `export { ${binding} as ${exportName} };` + } + + // TODO: maybe too long? + function createName( + kind: 'implementation' | 'binding', + name: string, + ): string { + return `$$module_${references.length}_${kind}_${name}` + } + + /** + * Wraps an export whose original local initialization must remain in place, + * such as a class, an arbitrary expression, or an export specifier. The + * generated wrapper is assigned to a separate binding and exported after the + * source declarations, leaving the original local binding unchanged. + * + * For `emitWrappedBinding('value', 'value', meta)`: + * + * ```js + * // Existing source initialization, left in place + * const value = init() + * + * // Code appended by emitWrappedBinding + * const $$module_0_binding_value = __WRAP__(value, 'value') + * export { $$module_0_binding_value as value } + * ``` + * + * @param implementation Local expression to pass to the generated wrapper. + * @param exportName Public name for the generated export. + * @param meta Static metadata collected from the original export. + */ + function emitWrappedBinding( + implementation: string, + exportName: string, + meta: ModuleExportMeta, + originalName?: string, + ): void { + const binding = createName('binding', exportName) + const context = createContext( + implementation, + exportName, + meta, + originalName, + ) + // TODO: preserve original export location for generated code? (update + move trick) + appendedCode.push( + `const ${binding} = ${options.generate(context)};`, + exportBinding(binding, exportName), + ) + } + + for (const group of scanModuleExports(viteAst)) { + if (group.type === 'declaration') { + const [entry] = group.exports + const { localName: name } = entry + const meta = entry.meta + if (!filter(entry.exportName, meta)) continue + + // export function f() {} + // ^^^^^^ + // ⬇️ + // function f() {}. << strip export + // const $$module_0_binding_f = __WRAP__(f, 'f') << emit wrapper + // export { $$module_0_binding_f as f } << emit export + validateNonAsyncFunction(options, group.declaration) + output.remove(group.node.start, group.declaration.start) + emitWrappedBinding( + name, + entry.exportName, + meta, + group.directFunction?.originalName, + ) + } else if (group.type === 'variable-declaration') { + // export const first = async () => {}, second = init() + // ^^^^^^ + // ⬇️ + // const first = async () => {}, second = init() << strip export + // const $$module_0_binding_first = __WRAP__(first, 'first') << emit wrapper + // export { $$module_0_binding_first as first } << emit export + // const $$module_1_binding_second = __WRAP__(second, 'second') << emit wrapper + // export { $$module_1_binding_second as second } << emit export + + const wrappedBindingNames = new Set() + const exportNames = group.declarators.flatMap((item) => + item.exports.map((entry) => entry.exportName), + ) + + for (const declarator of group.declarators) { + let selected = false + + for (const entry of declarator.exports) { + const meta = entry.meta + if (!filter(entry.exportName, meta)) continue + selected = true + + wrappedBindingNames.add(entry.exportName) + emitWrappedBinding( + entry.localName, + entry.exportName, + meta, + declarator.directFunction?.originalName, + ) + } + + if (selected) { + const init = declarator.node.init + if (!init) { + rejectNonAsyncFunction(options, declarator.node.start) + } else { + validateNonAsyncFunction(options, init) + } + } + } + + if (wrappedBindingNames.size > 0) { + // export const selected = x, skipped = y + // ^^^^^^ + // ⬇️ + // const selected = x, skipped = y << strip export + // export { skipped } << add back filtered-out exports + output.remove(group.node.start, group.declaration.start) + for (const name of exportNames) { + if (!wrappedBindingNames.has(name)) { + appendedCode.push(exportBinding(name, name)) + } + } + } + } else if (group.type === 'specifiers') { + // export { selected as action, skipped } + // ⬇️ + // const $$module_0_binding_action = __WRAP__(selected, 'action') + // export { $$module_0_binding_action as action } + // export { skipped } + const skippedExports: string[] = [] + let selected = false + for (const entry of group.exports) { + tinyassert(entry.node.local.type === 'Identifier') + if (entry.node.exported.type !== 'Identifier') { + throw Object.assign( + new Error('unsupported string literal export name'), + { pos: entry.node.exported.start }, + ) + } + const { localName, exportName, meta } = entry + if (!filter(exportName, meta)) { + skippedExports.push( + localName === exportName + ? localName + : `${localName} as ${exportName}`, + ) + continue + } + selected = true + + let implementation = localName + if (group.node.source) { + // export { action } from './dep' + // ⬇️ + // import { $$module_0_implementation_action } from './dep' << emit import at the end + implementation = createName('implementation', exportName) + // TODO: Preserve import attributes from the original re-export. + appendedCode.push( + `import { ${localName} as ${implementation} } from ${group.node.source.raw};`, + ) + } + emitWrappedBinding(implementation, exportName, meta) + } + + if (selected) { + // remove original export statement + output.remove(group.node.start, group.node.end) + // re-emit skipped exports + if (skippedExports.length > 0) { + const source = group.node.source + ? ` from ${group.node.source.raw}` + : '' + appendedCode.push(`export { ${skippedExports.join(', ')} }${source};`) + } + } + } else if (group.type === 'export-all') { + // export * from './dep' + if (options.exportAll !== 'preserve') { + throw Object.assign(new Error('unsupported ExportAllDeclaration'), { + pos: group.node.start, + }) + } + } else if (group.type === 'default') { + const declaration = group.node.declaration + const meta = group.meta + if (!filter('default', meta)) continue + + let implementation: string + if (group.kind === 'named-declaration') { + // export default function Page() {} + // ^^^^^^^^^^^^^^ + // ⬇️ + // function Page() {} + // const $$module_0_binding_default = __WRAP__(Page, 'default') + // export { $$module_0_binding_default as default } + tinyassert(group.localName) + implementation = group.localName + output.remove(group.node.start, declaration.start) + } else { + // export default current + // ^^^^^^^^^^^^^^ + // ⬇️ + // const $$module_0_implementation_default = current + // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + // const $$module_0_binding_default = __WRAP__($$module_0_implementation_default, 'default') + // export { $$module_0_binding_default as default } + implementation = createName('implementation', 'default') + output.update( + group.node.start, + declaration.start, + `const ${implementation} = `, + ) + } + validateNonAsyncFunction(options, declaration) + emitWrappedBinding( + implementation, + 'default', + meta, + group.directFunction?.originalName, + ) + } + } + + // emit accumulated wrap + export statements at the end, e.g. + // const $$module_0_binding_action = __WRAP__(action, 'action') + // export { $$module_0_binding_action as action } + if (appendedCode.length > 0) { + output.append(`\n${appendedCode.join('\n')}\n`) + } + + return { + output, + references, + referenceNames: references.map((reference) => reference.exportName), + } +} diff --git a/packages/plugin-rsc/src/transforms/source-map.test.ts b/packages/plugin-rsc/src/transforms/source-map.test.ts index f9f2f0c0c..cd19e0df1 100644 --- a/packages/plugin-rsc/src/transforms/source-map.test.ts +++ b/packages/plugin-rsc/src/transforms/source-map.test.ts @@ -3,6 +3,7 @@ import { parseAstAsync } from 'vite' import { describe, expect, test } from 'vitest' import { transformHoistInlineDirective } from './hoist' import { transformModuleExportEffect } from './module-export-effect' +import { transformModuleExportWrap } from './module-export-wrap' import { formatDecodedSourceMapMarkdown, formatSourceMapMarkdownFixture, @@ -19,7 +20,7 @@ describe('source map fixtures', () => { // rely on adjacent-source fallback. React uses the `registerServerReference` // caller as the reference's source location. for (const [file, load] of Object.entries(wrapExportFixtures)) { - test(`module-export/${path.basename(file)}`, async () => { + test(`module-export-wrap/${path.basename(file)}`, async () => { const input = ((await load()) as any).default as string const ast = await parseAstAsync(input) const wrapResult = transformWrapExport(input, ast, { @@ -30,6 +31,16 @@ describe('source map fixtures', () => { generate: ({ binding, exportName }) => `registerServerReference(${binding}, ${JSON.stringify(exportName)})`, }) + const moduleWrapResult = transformModuleExportWrap(input, ast, { + generate: ({ implementation, originalName, exportName }) => + restoreFunctionName( + `registerServerReference(${implementation}, ${JSON.stringify(exportName)})`, + originalName, + ), + }) + await expect( + parseAstAsync(moduleWrapResult.output.toString()), + ).resolves.toBeDefined() const outputs = [ { name: 'wrap-export', @@ -41,6 +52,11 @@ describe('source map fixtures', () => { output: effectResult.output, references: effectResult.referenceNames, }, + { + name: 'module-export-wrap', + output: moduleWrapResult.output, + references: moduleWrapResult.referenceNames, + }, ] await expect( formatSourceMapMarkdownFixture(input, outputs), @@ -83,3 +99,9 @@ describe('source map fixtures', () => { }) } }) + +function restoreFunctionName(value: string, name?: string): string { + return name + ? `Object.defineProperty(${value}, "name", { value: ${JSON.stringify(name)} })` + : value +} diff --git a/packages/plugin-rsc/src/transforms/utils.ts b/packages/plugin-rsc/src/transforms/utils.ts index 100d9ce05..3affcbdfc 100644 --- a/packages/plugin-rsc/src/transforms/utils.ts +++ b/packages/plugin-rsc/src/transforms/utils.ts @@ -78,7 +78,6 @@ export function validateNonAsyncFunction( // export default function/class can be unnamed node: Node | ExportDefaultDeclaration['declaration'], ): void { - if (!opts.rejectNonAsyncFunction) return if ( node.type === 'Literal' || node.type === 'ObjectExpression' || @@ -90,8 +89,15 @@ export function validateNonAsyncFunction( node.type === 'ArrowFunctionExpression') && !node.async) ) { - throw Object.assign(new Error(`unsupported non async function`), { - pos: node.start, - }) + rejectNonAsyncFunction(opts, node.start) + } +} + +export function rejectNonAsyncFunction( + opts: { rejectNonAsyncFunction?: boolean }, + pos: number, +): void { + if (opts.rejectNonAsyncFunction) { + throw Object.assign(new Error(`unsupported non async function`), { pos }) } } diff --git a/packages/plugin-rsc/src/transforms/wrap-export.test.ts b/packages/plugin-rsc/src/transforms/wrap-export.test.ts index 69a726c0d..c245774cc 100644 --- a/packages/plugin-rsc/src/transforms/wrap-export.test.ts +++ b/packages/plugin-rsc/src/transforms/wrap-export.test.ts @@ -465,7 +465,8 @@ export default cached; const ast = await parseAstAsync(input) transformWrapExport(input, ast, { runtime(value, _name, meta) { - actual.push(meta) + const { valueNode: _, ...rest } = meta + actual.push(rest) return value }, }) diff --git a/packages/plugin-rsc/src/transforms/wrap-export.ts b/packages/plugin-rsc/src/transforms/wrap-export.ts index aaa9fcee8..e94977c78 100644 --- a/packages/plugin-rsc/src/transforms/wrap-export.ts +++ b/packages/plugin-rsc/src/transforms/wrap-export.ts @@ -8,49 +8,22 @@ import { } from './module-export-scan' import { validateNonAsyncFunction } from './utils' -type ExportMeta = { - /** - * The local declaration name when statically available. - * - * - `"Page"` for `export function Page() {}` - * - `"Page"` for `export const Page = () => {}` - * - `undefined` for `export default () => {}` - * - `undefined` for `export { Page }` - */ - declName?: string - /** - * Whether the exported value is statically known to be a function. - * - * - `true` for `export const Page = () => {}` - * - `false` for `export const value = 1` - * - `undefined` for `export const value = getValue()` - * - `undefined` for `export default Page` - */ - isFunction?: boolean - /** - * The local identifier referenced by a default export. - * The RSC CSS transform uses this to detect a component by its capitalized - * local name and preserve that name on the generated wrapper. - * - * - `"Page"` for `const Page = () => {}; export default Page` - * - `undefined` for `export default function Page() {}` - * - `undefined` for `export default () => {}` - */ - defaultExportIdentifierName?: string -} - export type TransformWrapExportFilter = ( name: string, - meta: ExportMeta, + meta: ModuleExportMeta, ) => boolean export type TransformWrapExportOptions = { - runtime: (value: string, name: string, meta: ExportMeta) => string + runtime: (value: string, name: string, meta: ModuleExportMeta) => string ignoreExportAllDeclaration?: boolean rejectNonAsyncFunction?: boolean filter?: TransformWrapExportFilter } +/** + * @deprecated Use `transformModuleExportEffect` for registration side effects, + * or `transformModuleExportWrap` when the runtime returns a canonical wrapper. + */ export function transformWrapExport( input: string, viteAst: ESTree.Program, @@ -70,7 +43,7 @@ export function transformWrapExport( exports: ModuleExportEntry[], ) { const filteredExports = exports.map((item) => { - const meta = getExportMeta(item.meta) + const meta = item.meta return { ...item, meta, @@ -108,7 +81,11 @@ export function transformWrapExport( output.move(start, end, input.length) } - function wrapExport(name: string, exportName: string, meta: ExportMeta = {}) { + function wrapExport( + name: string, + exportName: string, + meta: ModuleExportMeta = {}, + ) { if (!filter(exportName, meta)) { toAppend.push(`export { ${name} as ${exportName} }`) return @@ -128,7 +105,7 @@ export function transformWrapExport( for (const group of scanModuleExports(viteAst)) { if (group.type === 'declaration') { const [entry] = group.exports - if (filter(entry.exportName, getExportMeta(entry.meta))) { + if (filter(entry.exportName, entry.meta)) { validateNonAsyncFunction(options, group.declaration) } wrapSimple(group.node.start, group.declaration.start, group.exports) @@ -146,7 +123,7 @@ export function transformWrapExport( if ( declarator.node.init && declarator.exports.some(({ exportName, meta }) => - filter(exportName, getExportMeta(meta)), + filter(exportName, meta), ) ) { validateNonAsyncFunction(options, declarator.node.init) @@ -170,7 +147,7 @@ export function transformWrapExport( wrapExport( `$$import_${entry.localName}`, entry.exportName, - getExportMeta(entry.meta), + entry.meta, ) } } else { @@ -183,11 +160,7 @@ export function transformWrapExport( { pos: entry.node.exported.start }, ) } - wrapExport( - entry.localName, - entry.exportName, - getExportMeta(entry.meta), - ) + wrapExport(entry.localName, entry.exportName, entry.meta) } } } else if (group.type === 'export-all') { @@ -223,7 +196,7 @@ export function transformWrapExport( 'const $$default = ', ) } - const meta = getExportMeta(group.meta) + const meta = group.meta if (filter('default', meta)) { validateNonAsyncFunction(options, group.node.declaration) } @@ -237,7 +210,3 @@ export function transformWrapExport( return { exportNames, output } } - -function getExportMeta({ localName, ...meta }: ModuleExportMeta): ExportMeta { - return { ...meta, ...(localName && { declName: localName }) } -}