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..268a48611 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,26 @@ 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 }) => + runtime(implementation, exportName, originalName ?? exportName), 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 +57,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/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index b29404cbc..cb1976dca 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'] @@ -2451,7 +2451,7 @@ function vitePluginRscCss( // export const Page = () => {} return (_name: string, meta) => !!( - (meta.isFunction && meta.declName && /^[A-Z]/.test(meta.declName)) || + (meta.isFunction && meta.localName && /^[A-Z]/.test(meta.localName)) || (meta.defaultExportIdentifierName && /^[A-Z]/.test(meta.defaultExportIdentifierName)) ) @@ -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, exportName, meta }) => + `__vite_rsc_wrap_css__(${implementation}, ${JSON.stringify( + 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/canonical-vs-wrapped-binding.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/canonical-vs-wrapped-binding.js new file mode 100644 index 000000000..06e0bcbf2 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/canonical-vs-wrapped-binding.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/canonical-vs-wrapped-binding.js.map.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/canonical-vs-wrapped-binding.js.map.snap.md new file mode 100644 index 000000000..2627e5e80 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/canonical-vs-wrapped-binding.js.map.snap.md @@ -0,0 +1,38 @@ +## 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) "\n" +(0:7) "async function direct() " --> (1:0) "const $$module_0_implementation_direct = async function $$module_0_implementation_direct() " +(0:31) "{}\n" --> (1:91) "{};\n" +[unmapped] --> (2:0) "export const direct = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_direct, \"name\", { value: \"direct\" }), \"direct\");\n" +(2:0) "const indirect = async () => {}\n" --> (4:0) "const indirect = async () => {}\n" +(5:0) "consume(direct, indirect)\n" --> (7:0) "consume(direct, indirect)\n" +[unmapped] --> (9:0) "const $$module_1_binding_indirect = /* #__PURE__ */ 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/canonical-vs-wrapped-binding.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/canonical-vs-wrapped-binding.js.snap.md new file mode 100644 index 000000000..4d21726b6 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/canonical-vs-wrapped-binding.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/#NDY4AApjb25zdCAkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX2RpcmVjdCA9IGFzeW5jIGZ1bmN0aW9uICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fZGlyZWN0KCkge307CmV4cG9ydCBjb25zdCBkaXJlY3QgPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoT2JqZWN0LmRlZmluZVByb3BlcnR5KCQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fZGlyZWN0LCAibmFtZSIsIHsgdmFsdWU6ICJkaXJlY3QiIH0pLCAiZGlyZWN0Iik7Cgpjb25zdCBpbmRpcmVjdCA9IGFzeW5jICgpID0+IHt9CgoKY29uc3VtZShkaXJlY3QsIGluZGlyZWN0KQoKY29uc3QgJCRtb2R1bGVfMV9iaW5kaW5nX2luZGlyZWN0ID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGluZGlyZWN0LCAiaW5kaXJlY3QiKTsKZXhwb3J0IHsgJCRtb2R1bGVfMV9iaW5kaW5nX2luZGlyZWN0IGFzIGluZGlyZWN0IH07CjM0MQB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXJlY3QoKSB7fVxuXG5jb25zdCBpbmRpcmVjdCA9IGFzeW5jICgpID0+IHt9XG5leHBvcnQgeyBpbmRpcmVjdCB9XG5cbmNvbnN1bWUoZGlyZWN0LCBpbmRpcmVjdClcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBTztBQUFBLDJGQUF3QixDQUFDOzs7QUFFaEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7OztBQUc5QixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUTs7OzsifQ==) + +```js + +const $$module_0_implementation_direct = async function $$module_0_implementation_direct() {}; +export const direct = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_direct, "name", { value: "direct" }), "direct"); + +const indirect = async () => {} + + +consume(direct, indirect) + +const $$module_1_binding_indirect = /* #__PURE__ */ registerServerReference(indirect, "indirect"); +export { $$module_1_binding_indirect as indirect }; +``` 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..76c6ecf1f --- /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 = /* #__PURE__ */ registerServerReference(NamedClass, \"NamedClass\");\n" +[unmapped] --> (9:0) "export { $$module_0_binding_NamedClass as NamedClass };\n" +[unmapped] --> (10:0) "const $$module_1_binding_ClassExpression = /* #__PURE__ */ registerServerReference(ClassExpression, \"ClassExpression\");\n" +[unmapped] --> (11:0) "export { $$module_1_binding_ClassExpression as ClassExpression };\n" +[unmapped] --> (12:0) "const $$module_2_binding_default = /* #__PURE__ */ 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..19121f813 --- /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/#NjAxACd1c2Ugc2VydmVyJwoKY2xhc3MgTmFtZWRDbGFzcyB7fQoKY29uc3QgQ2xhc3NFeHByZXNzaW9uID0gY2xhc3MgSW5uZXJDbGFzcyB7fQoKY2xhc3MgRGVmYXVsdENsYXNzIHt9Cgpjb25zdCAkJG1vZHVsZV8wX2JpbmRpbmdfTmFtZWRDbGFzcyA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShOYW1lZENsYXNzLCAiTmFtZWRDbGFzcyIpOwpleHBvcnQgeyAkJG1vZHVsZV8wX2JpbmRpbmdfTmFtZWRDbGFzcyBhcyBOYW1lZENsYXNzIH07CmNvbnN0ICQkbW9kdWxlXzFfYmluZGluZ19DbGFzc0V4cHJlc3Npb24gPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoQ2xhc3NFeHByZXNzaW9uLCAiQ2xhc3NFeHByZXNzaW9uIik7CmV4cG9ydCB7ICQkbW9kdWxlXzFfYmluZGluZ19DbGFzc0V4cHJlc3Npb24gYXMgQ2xhc3NFeHByZXNzaW9uIH07CmNvbnN0ICQkbW9kdWxlXzJfYmluZGluZ19kZWZhdWx0ID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKERlZmF1bHRDbGFzcywgImRlZmF1bHQiKTsKZXhwb3J0IHsgJCRtb2R1bGVfMl9iaW5kaW5nX2RlZmF1bHQgYXMgZGVmYXVsdCB9OwozNzAAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGNsYXNzIE5hbWVkQ2xhc3Mge31cblxuZXhwb3J0IGNvbnN0IENsYXNzRXhwcmVzc2lvbiA9IGNsYXNzIElubmVyQ2xhc3Mge31cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVmYXVsdENsYXNzIHt9XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFSixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7O0FBRWxCLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQzs7QUFFbEMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDOzs7Ozs7OzsifQ==) + +```js +'use server' + +class NamedClass {} + +const ClassExpression = class InnerClass {} + +class DefaultClass {} + +const $$module_0_binding_NamedClass = /* #__PURE__ */ registerServerReference(NamedClass, "NamedClass"); +export { $$module_0_binding_NamedClass as NamedClass }; +const $$module_1_binding_ClassExpression = /* #__PURE__ */ registerServerReference(ClassExpression, "ClassExpression"); +export { $$module_1_binding_ClassExpression as ClassExpression }; +const $$module_2_binding_default = /* #__PURE__ */ 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..ecde934cf --- /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 = /* #__PURE__ */ 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..71aeb4286 --- /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/#MjM4ACd1c2Ugc2VydmVyJwoKY29uc3QgJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9kZWZhdWx0ID0gY2xhc3Mge30KCmNvbnN0ICQkbW9kdWxlXzBfYmluZGluZ19kZWZhdWx0ID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKCQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fZGVmYXVsdCwgImRlZmF1bHQiKTsKZXhwb3J0IHsgJCRtb2R1bGVfMF9iaW5kaW5nX2RlZmF1bHQgYXMgZGVmYXVsdCB9OwoxNzEAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge31cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVYLDBDQUFlLEtBQUssQ0FBQyxDQUFDOzs7OyJ9) + +```js +'use server' + +const $$module_0_implementation_default = class {} + +const $$module_0_binding_default = /* #__PURE__ */ 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..436cffa92 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:15) "async function () {\n" --> (2:0) "\n" +(2:15) "async function () " --> (3:0) "const $$module_0_implementation_default = async function () " +(2:33) "{\n" --> (3:60) "{\n" +(3:0) " return 'default anonymous function called'\n" --> (4:0) " return 'default anonymous function called'\n" +(4:0) "}\n" --> (5:0) "};\n" +[unmapped] --> (6:0) "export default /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_default, \"name\", { value: \"default\" }), \"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..11a221a84 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,21 @@ 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/#MjgwACd1c2Ugc2VydmVyJwoKCmNvbnN0ICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fZGVmYXVsdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHsKICByZXR1cm4gJ2RlZmF1bHQgYW5vbnltb3VzIGZ1bmN0aW9uIGNhbGxlZCcKfTsKZXhwb3J0IGRlZmF1bHQgLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX2RlZmF1bHQsICJuYW1lIiwgeyB2YWx1ZTogImRlZmF1bHQiIH0pLCAiZGVmYXVsdCIpOwoyOTIAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2RlZmF1bHQgYW5vbnltb3VzIGZ1bmN0aW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVJO0FBQUEsNERBQWtCO0FBQ2pDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0FBQzNDOzsifQ==) + +```js +'use server' + + +const $$module_0_implementation_default = async function () { + return 'default anonymous function called' +}; +export default /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_default, "name", { value: "default" }), "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..adb32e69e 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 = /* #__PURE__ */ 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..2cf9abe44 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/#Mjk5ACd1c2Ugc2VydmVyJwoKbGV0IGFjdGlvbiA9IGFzeW5jICgpID0+ICdmaXJzdCcKY29uc3QgJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9kZWZhdWx0ID0gYWN0aW9uCmFjdGlvbiA9IGFzeW5jICgpID0+ICdzZWNvbmQnCgpjb25zdCAkJG1vZHVsZV8wX2JpbmRpbmdfZGVmYXVsdCA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX2RlZmF1bHQsICJkZWZhdWx0Iik7CmV4cG9ydCB7ICQkbW9kdWxlXzBfYmluZGluZ19kZWZhdWx0IGFzIGRlZmF1bHQgfTsKMzgwAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmxldCBhY3Rpb24gPSBhc3luYyAoKSA9PiAnZmlyc3QnXG5leHBvcnQgZGVmYXVsdCBhY3Rpb25cbmFjdGlvbiA9IGFzeW5jICgpID0+ICdzZWNvbmQnXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFWCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO0FBQy9CLDBDQUFlO0FBQ2YsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNOzs7OyJ9) + +```js +'use server' + +let action = async () => 'first' +const $$module_0_implementation_default = action +action = async () => 'second' + +const $$module_0_binding_default = /* #__PURE__ */ 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..4346ba119 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 = /* #__PURE__ */ 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..b453ed846 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/#MzI0ACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZGVmYXVsdElkZW50aWZpZXIoKSB7CiAgcmV0dXJuICdkZWZhdWx0IGlkZW50aWZpZXIgY2FsbGVkJwp9Cgpjb25zdCAkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX2RlZmF1bHQgPSBkZWZhdWx0SWRlbnRpZmllcgoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX2RlZmF1bHQgPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9kZWZhdWx0LCAiZGVmYXVsdCIpOwpleHBvcnQgeyAkJG1vZHVsZV8wX2JpbmRpbmdfZGVmYXVsdCBhcyBkZWZhdWx0IH07CjM1NgB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5hc3luYyBmdW5jdGlvbiBkZWZhdWx0SWRlbnRpZmllcigpIHtcbiAgcmV0dXJuICdkZWZhdWx0IGlkZW50aWZpZXIgY2FsbGVkJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0SWRlbnRpZmllclxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRVgsS0FBSyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTTtBQUNuQzs7QUFFQSwwQ0FBZTs7OzsifQ==) + +```js +'use server' + +async function defaultIdentifier() { + return 'default identifier called' +} + +const $$module_0_implementation_default = defaultIdentifier + +const $$module_0_binding_default = /* #__PURE__ */ 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..987fb400b 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,16 @@ (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) "\n" +(2:15) "async function defaultNamedFunction() " --> (3:0) "const $$module_0_implementation_defaultNamedFunction = async function $$module_0_implementation_defaultNamedFunction() " +(2:53) "{\n" --> (3:119) "{\n" +(3:0) " return 'default named function called'\n" --> (4:0) " return 'default named function called'\n" +(4:0) "}\n" --> (5:0) "};\n" +[unmapped] --> (6:0) "const defaultNamedFunction = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_defaultNamedFunction, \"name\", { value: \"defaultNamedFunction\" }), \"default\");\n" +[unmapped] --> (7:0) "export default defaultNamedFunction;\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..2cf6ae566 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/#NDEyACd1c2Ugc2VydmVyJwoKCmNvbnN0ICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fZGVmYXVsdE5hbWVkRnVuY3Rpb24gPSBhc3luYyBmdW5jdGlvbiAkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX2RlZmF1bHROYW1lZEZ1bmN0aW9uKCkgewogIHJldHVybiAnZGVmYXVsdCBuYW1lZCBmdW5jdGlvbiBjYWxsZWQnCn07CmNvbnN0IGRlZmF1bHROYW1lZEZ1bmN0aW9uID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX2RlZmF1bHROYW1lZEZ1bmN0aW9uLCAibmFtZSIsIHsgdmFsdWU6ICJkZWZhdWx0TmFtZWRGdW5jdGlvbiIgfSksICJkZWZhdWx0Iik7CmV4cG9ydCBkZWZhdWx0IGRlZmF1bHROYW1lZEZ1bmN0aW9uOwozMDkAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZGVmYXVsdE5hbWVkRnVuY3Rpb24oKSB7XG4gIHJldHVybiAnZGVmYXVsdCBuYW1lZCBmdW5jdGlvbiBjYWxsZWQnXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFSTtBQUFBLHVIQUFzQztBQUNyRCxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTTtBQUN2Qzs7OyJ9) + +```js +'use server' + + +const $$module_0_implementation_defaultNamedFunction = async function $$module_0_implementation_defaultNamedFunction() { + return 'default named function called' +}; +const defaultNamedFunction = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_defaultNamedFunction, "name", { value: "defaultNamedFunction" }), "default"); +export default defaultNamedFunction; +``` 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..bc688b1f8 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,18 @@ (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:21) "async () => 'first action called',\n" --> (2:0) "\n" +(2:21) "async () => " --> (3:0) "const $$module_0_implementation_first = async () => " +(2:33) "'first action called',\n" --> (3:52) "'first action called';\n" +(2:7) "const first = async () => 'first action called'" --> (4:0) "const first = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_first, \"name\", { value: \"first\" }), \"first\")" +(2:54) ",\n" --> (4:146) ",\n" +(3:0) " second = first\n" --> (5:0) " second = first\n" +[unmapped] --> (7:0) "const $$module_1_binding_second = /* #__PURE__ */ registerServerReference(second, \"second\");\n" +[unmapped] --> (8:0) "export { $$module_1_binding_second as second };\n" +[unmapped] --> (9:0) "export { first };\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..824b2a8b1 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,24 @@ 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/#NDE1ACd1c2Ugc2VydmVyJwoKCmNvbnN0ICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fZmlyc3QgPSBhc3luYyAoKSA9PiAnZmlyc3QgYWN0aW9uIGNhbGxlZCc7CmNvbnN0IGZpcnN0ID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX2ZpcnN0LCAibmFtZSIsIHsgdmFsdWU6ICJmaXJzdCIgfSksICJmaXJzdCIpLAogIHNlY29uZCA9IGZpcnN0Cgpjb25zdCAkJG1vZHVsZV8xX2JpbmRpbmdfc2Vjb25kID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKHNlY29uZCwgInNlY29uZCIpOwpleHBvcnQgeyAkJG1vZHVsZV8xX2JpbmRpbmdfc2Vjb25kIGFzIHNlY29uZCB9OwpleHBvcnQgeyBmaXJzdCB9OwozMTYAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGNvbnN0IGZpcnN0ID0gYXN5bmMgKCkgPT4gJ2ZpcnN0IGFjdGlvbiBjYWxsZWQnLFxuICBzZWNvbmQgPSBmaXJzdFxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRVU7QUFBQSxvREFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTTtBQUE5QyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMscUlBQWtDO0FBQ3RELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOzs7OzsifQ==) + +```js +'use server' + + +const $$module_0_implementation_first = async () => 'first action called'; +const first = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_first, "name", { value: "first" }), "first"), + second = first + +const $$module_1_binding_second = /* #__PURE__ */ registerServerReference(second, "second"); +export { $$module_1_binding_second as second }; +export { first }; +``` 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..cdaab44b0 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 = /* #__PURE__ */ 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..fd4d34487 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/#MjUxACd1c2Ugc2VydmVyJwoKY29uc3Qgc291cmNlID0gYXN5bmMgKCkgPT4gJ2Rlc3RydWN0dXJlZCBleHBvcnQgY2FsbGVkJwoKY29uc3QgeyBhY3Rpb24gfSA9IHsgYWN0aW9uOiBzb3VyY2UgfQoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX2FjdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShhY3Rpb24sICJhY3Rpb24iKTsKZXhwb3J0IHsgJCRtb2R1bGVfMF9iaW5kaW5nX2FjdGlvbiBhcyBhY3Rpb24gfTsKNDIyAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmNvbnN0IHNvdXJjZSA9IGFzeW5jICgpID0+ICdkZXN0cnVjdHVyZWQgZXhwb3J0IGNhbGxlZCdcblxuZXhwb3J0IGNvbnN0IHsgYWN0aW9uIH0gPSB7IGFjdGlvbjogc291cmNlIH1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVYLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTTs7QUFFL0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDOzs7OyJ9) + +```js +'use server' + +const source = async () => 'destructured export called' + +const { action } = { action: source } + +const $$module_0_binding_action = /* #__PURE__ */ 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..3d1e7e000 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 = /* #__PURE__ */ 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..a27979108 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/#MjI0ACd1c2Ugc2VydmVyJwoKbGV0IGFjdGlvbiA9IGFzeW5jICgpID0+ICdmaXJzdCcKCmFjdGlvbiA9IGFzeW5jICgpID0+ICdzZWNvbmQnCgpjb25zdCAkJG1vZHVsZV8wX2JpbmRpbmdfcmVuYW1lZCA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShhY3Rpb24sICJyZW5hbWVkIik7CmV4cG9ydCB7ICQkbW9kdWxlXzBfYmluZGluZ19yZW5hbWVkIGFzIHJlbmFtZWQgfTsKMzc3AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmxldCBhY3Rpb24gPSBhc3luYyAoKSA9PiAnZmlyc3QnXG5leHBvcnQgeyBhY3Rpb24gYXMgcmVuYW1lZCB9XG5hY3Rpb24gPSBhc3luYyAoKSA9PiAnc2Vjb25kJ1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRVgsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSzs7QUFFL0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNOzs7OyJ9) + +```js +'use server' + +let action = async () => 'first' + +action = async () => 'second' + +const $$module_0_binding_renamed = /* #__PURE__ */ 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..3a5c81178 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 = /* #__PURE__ */ 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..bfbf8706e 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/#MjUyACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gbG9jYWxBbGlhcygpIHsKICByZXR1cm4gJ2xvY2FsIGFsaWFzIGNhbGxlZCcKfQoKCgpjb25zdCAkJG1vZHVsZV8wX2JpbmRpbmdfYWxpYXNlZEFjdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShsb2NhbEFsaWFzLCAiYWxpYXNlZEFjdGlvbiIpOwpleHBvcnQgeyAkJG1vZHVsZV8wX2JpbmRpbmdfYWxpYXNlZEFjdGlvbiBhcyBhbGlhc2VkQWN0aW9uIH07CjMzNgB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5hc3luYyBmdW5jdGlvbiBsb2NhbEFsaWFzKCkge1xuICByZXR1cm4gJ2xvY2FsIGFsaWFzIGNhbGxlZCdcbn1cblxuZXhwb3J0IHsgbG9jYWxBbGlhcyBhcyBhbGlhc2VkQWN0aW9uIH1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVYLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNO0FBQzVCOzs7Ozs7In0=) + +```js +'use server' + +async function localAlias() { + return 'local alias called' +} + + + +const $$module_0_binding_aliasedAction = /* #__PURE__ */ registerServerReference(localAlias, "aliasedAction"); +export { $$module_0_binding_aliasedAction as aliasedAction }; +``` 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..553b224b4 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 = /* #__PURE__ */ 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..4dd9d56de 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/#MjAwACd1c2Ugc2VydmVyJwoKCmNvbnN0IGFjdGlvbiA9IGFzeW5jICgpID0+ICdhY3Rpb24gY2FsbGVkJwoKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX2FjdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShhY3Rpb24sICJhY3Rpb24iKTsKZXhwb3J0IHsgJCRtb2R1bGVfMF9iaW5kaW5nX2FjdGlvbiBhcyBhY3Rpb24gfTsKMjc5AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCB7IGFjdGlvbiB9XG5jb25zdCBhY3Rpb24gPSBhc3luYyAoKSA9PiAnYWN0aW9uIGNhbGxlZCdcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOzs7QUFHWCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTTs7OzsifQ==) + +```js +'use server' + + +const action = async () => 'action called' + +const $$module_0_binding_action = /* #__PURE__ */ registerServerReference(action, "action"); +export { $$module_0_binding_action as action }; +``` 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..72b9b5dd7 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,21 @@ (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) "\n" +(2:7) "async function firstAction() " --> (3:0) "const $$module_0_implementation_firstAction = async function $$module_0_implementation_firstAction() " +(2:36) "{\n" --> (3:101) "{\n" +(3:0) " return 'first action called'\n" --> (4:0) " return 'first action called'\n" +(4:0) "}\n" --> (5:0) "};\n" +(6:7) "async function secondAction() {\n" --> (6:0) "\n" +(6:7) "async function secondAction() " --> (7:0) "const $$module_1_implementation_secondAction = async function $$module_1_implementation_secondAction() " +(6:37) "{\n" --> (7:103) "{\n" +(7:0) " return 'second action called'\n" --> (8:0) " return 'second action called'\n" +(8:0) "}\n" --> (9:0) "};\n" +[unmapped] --> (10:0) "export const firstAction = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_firstAction, \"name\", { value: \"firstAction\" }), \"firstAction\");\n" +[unmapped] --> (12:0) "export const secondAction = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_1_implementation_secondAction, \"name\", { value: \"secondAction\" }), \"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..b5eba5171 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,27 @@ 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/#NjU2ACd1c2Ugc2VydmVyJwoKCmNvbnN0ICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fZmlyc3RBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiAkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX2ZpcnN0QWN0aW9uKCkgewogIHJldHVybiAnZmlyc3QgYWN0aW9uIGNhbGxlZCcKfTsKCmNvbnN0ICQkbW9kdWxlXzFfaW1wbGVtZW50YXRpb25fc2Vjb25kQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gJCRtb2R1bGVfMV9pbXBsZW1lbnRhdGlvbl9zZWNvbmRBY3Rpb24oKSB7CiAgcmV0dXJuICdzZWNvbmQgYWN0aW9uIGNhbGxlZCcKfTsKZXhwb3J0IGNvbnN0IGZpcnN0QWN0aW9uID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX2ZpcnN0QWN0aW9uLCAibmFtZSIsIHsgdmFsdWU6ICJmaXJzdEFjdGlvbiIgfSksICJmaXJzdEFjdGlvbiIpOwoKZXhwb3J0IGNvbnN0IHNlY29uZEFjdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShPYmplY3QuZGVmaW5lUHJvcGVydHkoJCRtb2R1bGVfMV9pbXBsZW1lbnRhdGlvbl9zZWNvbmRBY3Rpb24sICJuYW1lIiwgeyB2YWx1ZTogInNlY29uZEFjdGlvbiIgfSksICJzZWNvbmRBY3Rpb24iKTsKNDMwAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXJzdEFjdGlvbigpIHtcbiAgcmV0dXJuICdmaXJzdCBhY3Rpb24gY2FsbGVkJ1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2Vjb25kQWN0aW9uKCkge1xuICByZXR1cm4gJ3NlY29uZCBhY3Rpb24gY2FsbGVkJ1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRUo7QUFBQSxxR0FBNkI7QUFDcEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTTtBQUM3QjtBQUVPO0FBQUEsdUdBQThCO0FBQ3JDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU07QUFDOUI7Ozs7In0=) + +```js +'use server' + + +const $$module_0_implementation_firstAction = async function $$module_0_implementation_firstAction() { + return 'first action called' +}; + +const $$module_1_implementation_secondAction = async function $$module_1_implementation_secondAction() { + return 'second action called' +}; +export const firstAction = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_firstAction, "name", { value: "firstAction" }), "firstAction"); + +export const secondAction = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_1_implementation_secondAction, "name", { value: "secondAction" }), "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..5217b019e 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,15 @@ (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:22) "async function actionImplementation() {\n" --> (2:0) "\n" +(2:22) "async function actionImplementation() " --> (3:0) "const $$module_0_implementation_action = async function actionImplementation() " +(2:60) "{\n" --> (3:79) "{\n" +(3:0) " return 'named function expression called'\n" --> (4:0) " return 'named function expression called'\n" +(4:0) "}\n" --> (5:0) "};\n" +(2:0) "export const action = async function actionImplementation() {\n" --> (6:0) "export const action = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_action, \"name\", { value: \"actionImplementation\" }), \"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..c32fad4a9 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,21 @@ 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/#MzE1ACd1c2Ugc2VydmVyJwoKCmNvbnN0ICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fYWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gYWN0aW9uSW1wbGVtZW50YXRpb24oKSB7CiAgcmV0dXJuICduYW1lZCBmdW5jdGlvbiBleHByZXNzaW9uIGNhbGxlZCcKfTsKZXhwb3J0IGNvbnN0IGFjdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShPYmplY3QuZGVmaW5lUHJvcGVydHkoJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9hY3Rpb24sICJuYW1lIiwgeyB2YWx1ZTogImFjdGlvbkltcGxlbWVudGF0aW9uIiB9KSwgImFjdGlvbiIpCjM1NwB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5leHBvcnQgY29uc3QgYWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gYWN0aW9uSW1wbGVtZW50YXRpb24oKSB7XG4gIHJldHVybiAnbmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbiBjYWxsZWQnXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFVztBQUFBLCtFQUFzQztBQUM1RCxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTTtBQUMxQztBQUZBLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7In0=) + +```js +'use server' + + +const $$module_0_implementation_action = async function actionImplementation() { + return 'named function expression called' +}; +export const action = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_action, "name", { value: "actionImplementation" }), "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..d24376038 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,15 @@ (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) "\n" +(2:7) "async function namedFunction() " --> (3:0) "const $$module_0_implementation_namedFunction = async function $$module_0_implementation_namedFunction() " +(2:38) "{\n" --> (3:105) "{\n" +(3:0) " return 'named function called'\n" --> (4:0) " return 'named function called'\n" +(4:0) "}\n" --> (5:0) "};\n" +[unmapped] --> (6:0) "export const namedFunction = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_namedFunction, \"name\", { value: \"namedFunction\" }), \"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..2f1e15f59 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,21 @@ 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/#MzQ1ACd1c2Ugc2VydmVyJwoKCmNvbnN0ICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fbmFtZWRGdW5jdGlvbiA9IGFzeW5jIGZ1bmN0aW9uICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fbmFtZWRGdW5jdGlvbigpIHsKICByZXR1cm4gJ25hbWVkIGZ1bmN0aW9uIGNhbGxlZCcKfTsKZXhwb3J0IGNvbnN0IG5hbWVkRnVuY3Rpb24gPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoT2JqZWN0LmRlZmluZVByb3BlcnR5KCQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fbmFtZWRGdW5jdGlvbiwgIm5hbWUiLCB7IHZhbHVlOiAibmFtZWRGdW5jdGlvbiIgfSksICJuYW1lZEZ1bmN0aW9uIik7CjI3NQB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmFtZWRGdW5jdGlvbigpIHtcbiAgcmV0dXJuICduYW1lZCBmdW5jdGlvbiBjYWxsZWQnXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFSjtBQUFBLHlHQUErQjtBQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0FBQy9COzsifQ==) + +```js +'use server' + + +const $$module_0_implementation_namedFunction = async function $$module_0_implementation_namedFunction() { + return 'named function called' +}; +export const namedFunction = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_namedFunction, "name", { value: "namedFunction" }), "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..c7647a2aa 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,16 @@ (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" +(4:7) "async function action() {\n" --> (2:0) "\n" +(4:7) "async function action() " --> (3:0) "const $$module_0_implementation_action = async function $$module_0_implementation_action() " +(4:31) "{\n" --> (3:91) "{\n" +(5:0) " return 'action called'\n" --> (4:0) " return 'action called'\n" +(6:0) "}\n" --> (5:0) "};\n" +(2:0) "void action\n" --> (6:0) "void action\n" +[unmapped] --> (8:0) "export const action = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_action, \"name\", { value: \"action\" }), \"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..70c83615c 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,23 @@ 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/#MzA4ACd1c2Ugc2VydmVyJwoKCmNvbnN0ICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fYWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9hY3Rpb24oKSB7CiAgcmV0dXJuICdhY3Rpb24gY2FsbGVkJwp9Owp2b2lkIGFjdGlvbgoKZXhwb3J0IGNvbnN0IGFjdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShPYmplY3QuZGVmaW5lUHJvcGVydHkoJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9hY3Rpb24sICJuYW1lIiwgeyB2YWx1ZTogImFjdGlvbiIgfSksICJhY3Rpb24iKTsKMjgxAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbnZvaWQgYWN0aW9uXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb24oKSB7XG4gIHJldHVybiAnYWN0aW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUlKO0FBQUEsMkZBQXdCO0FBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTTtBQUN2QjtBQUpBLElBQUksQ0FBQzs7OyJ9) + +```js +'use server' + + +const $$module_0_implementation_action = async function $$module_0_implementation_action() { + return 'action called' +}; +void action + +export const action = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_action, "name", { value: "action" }), "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..14bac1eaf --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/recursive.js.map.snap.md @@ -0,0 +1,37 @@ +## 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) "\n" +(2:7) "function recursive(depth) " --> (3:0) "const $$module_0_implementation_recursive = function $$module_0_implementation_recursive(depth) " +(2:33) "{\n" --> (3:96) "{\n" +(3:0) " if (depth > 0) return recursive(depth - 1)\n" --> (4:0) " if (depth > 0) return recursive(depth - 1)\n" +(4:0) " return recursive.marker\n" --> (5:0) " return recursive.marker\n" +(5:0) "}\n" --> (6:0) "};\n" +[unmapped] --> (7:0) "export const recursive = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_recursive, \"name\", { value: \"recursive\" }), \"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..a622ddfd1 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/recursive.js.snap.md @@ -0,0 +1,68 @@ +## 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/#MzU4ACd1c2Ugc2VydmVyJwoKCmNvbnN0ICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fcmVjdXJzaXZlID0gZnVuY3Rpb24gJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9yZWN1cnNpdmUoZGVwdGgpIHsKICBpZiAoZGVwdGggPiAwKSByZXR1cm4gcmVjdXJzaXZlKGRlcHRoIC0gMSkKICByZXR1cm4gcmVjdXJzaXZlLm1hcmtlcgp9OwpleHBvcnQgY29uc3QgcmVjdXJzaXZlID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgkJG1vZHVsZV8wX2ltcGxlbWVudGF0aW9uX3JlY3Vyc2l2ZSwgIm5hbWUiLCB7IHZhbHVlOiAicmVjdXJzaXZlIiB9KSwgInJlY3Vyc2l2ZSIpOwo0MDAAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGZ1bmN0aW9uIHJlY3Vyc2l2ZShkZXB0aCkge1xuICBpZiAoZGVwdGggPiAwKSByZXR1cm4gcmVjdXJzaXZlKGRlcHRoIC0gMSlcbiAgcmV0dXJuIHJlY3Vyc2l2ZS5tYXJrZXJcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKO0FBQUEsZ0dBQTBCO0FBQ2pDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO0FBQ25COzsifQ==) + +```js +'use server' + + +const $$module_0_implementation_recursive = function $$module_0_implementation_recursive(depth) { + if (depth > 0) return recursive(depth - 1) + return recursive.marker +}; +export const recursive = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_recursive, "name", { value: "recursive" }), "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..818d5ba07 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' with { type: 'json' };\n" +[unmapped] --> (5:0) "const $$module_0_binding_reexportedAction = /* #__PURE__ */ 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..41b0a029a 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/#MzU1ACd1c2Ugc2VydmVyJwoKCgppbXBvcnQgeyByZWV4cG9ydGVkQWN0aW9uIGFzICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fcmVleHBvcnRlZEFjdGlvbiB9IGZyb20gJy4vcmVleHBvcnQtc291cmNlJyB3aXRoIHsgdHlwZTogJ2pzb24nIH07CmNvbnN0ICQkbW9kdWxlXzBfYmluZGluZ19yZWV4cG9ydGVkQWN0aW9uID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKCQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fcmVleHBvcnRlZEFjdGlvbiwgInJlZXhwb3J0ZWRBY3Rpb24iKTsKZXhwb3J0IHsgJCRtb2R1bGVfMF9iaW5kaW5nX3JlZXhwb3J0ZWRBY3Rpb24gYXMgcmVleHBvcnRlZEFjdGlvbiB9OwoxOTgAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IHsgcmVleHBvcnRlZEFjdGlvbiB9IGZyb20gJy4vcmVleHBvcnQtc291cmNlJyB3aXRoIHsgdHlwZTogJ2pzb24nIH1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOzs7Ozs7OyJ9) + +```js +'use server' + + + +import { reexportedAction as $$module_0_implementation_reexportedAction } from './reexport-source' with { type: 'json' }; +const $$module_0_binding_reexportedAction = /* #__PURE__ */ 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..6bc55c701 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 = /* #__PURE__ */ 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..f3e21dda7 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/#MzMzACd1c2Ugc2VydmVyJwoKCgppbXBvcnQgeyByZWV4cG9ydGVkQWN0aW9uIGFzICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fcmVleHBvcnRlZEFjdGlvbiB9IGZyb20gJy4vcmVleHBvcnQtc291cmNlJzsKY29uc3QgJCRtb2R1bGVfMF9iaW5kaW5nX3JlZXhwb3J0ZWRBY3Rpb24gPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoJCRtb2R1bGVfMF9pbXBsZW1lbnRhdGlvbl9yZWV4cG9ydGVkQWN0aW9uLCAicmVleHBvcnRlZEFjdGlvbiIpOwpleHBvcnQgeyAkJG1vZHVsZV8wX2JpbmRpbmdfcmVleHBvcnRlZEFjdGlvbiBhcyByZWV4cG9ydGVkQWN0aW9uIH07CjE3NgB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5leHBvcnQgeyByZWV4cG9ydGVkQWN0aW9uIH0gZnJvbSAnLi9yZWV4cG9ydC1zb3VyY2UnXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7Ozs7OzsifQ==) + +```js +'use server' + + + +import { reexportedAction as $$module_0_implementation_reexportedAction } from './reexport-source'; +const $$module_0_binding_reexportedAction = /* #__PURE__ */ 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..a8121b3d5 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,19 @@ (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:29) "async () => 'arrow function called'\n" --> (2:0) "\n" +(2:29) "async () => " --> (3:0) "const $$module_0_implementation_arrowFunction = async () => " +(2:41) "'arrow function called'\n" --> (3:60) "'arrow function called';\n" +(4:34) "async function () {\n" --> (4:0) "\n" +(4:34) "async function () " --> (5:0) "const $$module_1_implementation_functionExpression = async function () " +(4:52) "{\n" --> (5:71) "{\n" +(5:0) " return 'function expression called'\n" --> (6:0) " return 'function expression called'\n" +(6:0) "}\n" --> (7:0) "};\n" +(2:0) "export const arrowFunction = async () => 'arrow function called'\n" --> (8:0) "export const arrowFunction = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_arrowFunction, \"name\", { value: \"arrowFunction\" }), \"arrowFunction\")\n" +(4:0) "export const functionExpression = async function () {\n" --> (10:0) "export const functionExpression = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_1_implementation_functionExpression, \"name\", { value: \"functionExpression\" }), \"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..158f61034 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,25 @@ 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/#NjA4ACd1c2Ugc2VydmVyJwoKCmNvbnN0ICQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fYXJyb3dGdW5jdGlvbiA9IGFzeW5jICgpID0+ICdhcnJvdyBmdW5jdGlvbiBjYWxsZWQnOwoKY29uc3QgJCRtb2R1bGVfMV9pbXBsZW1lbnRhdGlvbl9mdW5jdGlvbkV4cHJlc3Npb24gPSBhc3luYyBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuICdmdW5jdGlvbiBleHByZXNzaW9uIGNhbGxlZCcKfTsKZXhwb3J0IGNvbnN0IGFycm93RnVuY3Rpb24gPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoT2JqZWN0LmRlZmluZVByb3BlcnR5KCQkbW9kdWxlXzBfaW1wbGVtZW50YXRpb25fYXJyb3dGdW5jdGlvbiwgIm5hbWUiLCB7IHZhbHVlOiAiYXJyb3dGdW5jdGlvbiIgfSksICJhcnJvd0Z1bmN0aW9uIikKCmV4cG9ydCBjb25zdCBmdW5jdGlvbkV4cHJlc3Npb24gPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoT2JqZWN0LmRlZmluZVByb3BlcnR5KCQkbW9kdWxlXzFfaW1wbGVtZW50YXRpb25fZnVuY3Rpb25FeHByZXNzaW9uLCAibmFtZSIsIHsgdmFsdWU6ICJmdW5jdGlvbkV4cHJlc3Npb24iIH0pLCAiZnVuY3Rpb25FeHByZXNzaW9uIikKNDkzAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBjb25zdCBhcnJvd0Z1bmN0aW9uID0gYXN5bmMgKCkgPT4gJ2Fycm93IGZ1bmN0aW9uIGNhbGxlZCdcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uRXhwcmVzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdmdW5jdGlvbiBleHByZXNzaW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVrQjtBQUFBLDREQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0FBRTdCO0FBQUEsdUVBQWtCO0FBQ3BELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU07QUFDcEM7QUFKQSxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDOztBQUU1QixNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7In0=) + +```js +'use server' + + +const $$module_0_implementation_arrowFunction = async () => 'arrow function called'; + +const $$module_1_implementation_functionExpression = async function () { + return 'function expression called' +}; +export const arrowFunction = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_0_implementation_arrowFunction, "name", { value: "arrowFunction" }), "arrowFunction") + +export const functionExpression = /* #__PURE__ */ registerServerReference(Object.defineProperty($$module_1_implementation_functionExpression, "name", { value: "functionExpression" }), "functionExpression") +``` diff --git a/packages/plugin-rsc/src/transforms/hoist.ts b/packages/plugin-rsc/src/transforms/hoist.ts index 8f72cfad1..7cec8a782 100644 --- a/packages/plugin-rsc/src/transforms/hoist.ts +++ b/packages/plugin-rsc/src/transforms/hoist.ts @@ -10,6 +10,7 @@ import { walk } from 'estree-walker' import MagicString from 'magic-string' import type { ESTree } from 'vite' import { buildScopeTree, type ScopeTree } from './scope' +import { getDirectivePrologueEnd } from './utils' /** * Turns an inline directive function into a module-level registered function. @@ -247,7 +248,7 @@ export function transformHoistInlineDirective( if (runtimeHoists.length > 0) { // Define hoisted runtime wrappers after leading directives. - output.prependLeft(getRuntimeHoistPosition(ast), runtimeHoists.join('')) + output.prependLeft(getDirectivePrologueEnd(ast), runtimeHoists.join('')) } // Expose the canonical generated names. They identify the moved functions by @@ -259,21 +260,6 @@ export function transformHoistInlineDirective( } } -function getRuntimeHoistPosition(ast: Program): number { - // Preserve leading directives so directive-based transforms can - // still compose just in case. - for (const statement of ast.body) { - const isDirective = - statement.type === 'ExpressionStatement' && - statement.expression.type === 'Literal' && - typeof statement.expression.value === 'string' - if (!isDirective) { - return statement.start - } - } - return 0 -} - const exactRegex = (s: string): RegExp => new RegExp('^' + s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') + '$') 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-scan.test.ts b/packages/plugin-rsc/src/transforms/module-export-scan.test.ts index aae47872b..c1891e4e5 100644 --- a/packages/plugin-rsc/src/transforms/module-export-scan.test.ts +++ b/packages/plugin-rsc/src/transforms/module-export-scan.test.ts @@ -19,6 +19,10 @@ export * from './all' expect(groups[0]).toMatchObject({ type: 'declaration', declaration: { type: 'FunctionDeclaration' }, + directFunction: { + node: { type: 'FunctionDeclaration' }, + originalName: 'action', + }, exports: [ { localName: 'action', @@ -35,6 +39,10 @@ export * from './all' declaration: { kind: 'const' }, declarators: [ { + directFunction: { + node: { type: 'ArrowFunctionExpression' }, + originalName: 'loader', + }, exports: [ { localName: 'loader', @@ -47,6 +55,7 @@ export * from './all' ], }, { + directFunction: undefined, exports: [ { localName: 'value', @@ -64,6 +73,7 @@ export * from './all' type: 'variable-declaration', declarators: [ { + directFunction: undefined, exports: [ { localName: 'item', @@ -97,13 +107,49 @@ export * from './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 }]) + expect(scanModuleExports(ast)).toMatchObject([ + { + type: 'default', + kind, + directFunction: functionType + ? { node: { type: functionType }, originalName } + : undefined, + }, + ]) + }, +) + +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..0a55b2242 100644 --- a/packages/plugin-rsc/src/transforms/module-export-scan.ts +++ b/packages/plugin-rsc/src/transforms/module-export-scan.ts @@ -4,16 +4,31 @@ 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 local declaration name when statically available. @@ -67,6 +82,8 @@ export type ModuleExportGroup = type: 'declaration' node: ExportNamedDeclaration declaration: FunctionDeclaration | ClassDeclaration + /** Direct function metadata for `export function foo() {}`. */ + directFunction?: ModuleExportDirectFunction exports: [ModuleExportEntry] } | { @@ -78,6 +95,8 @@ export type ModuleExportGroup = declaration: VariableDeclaration declarators: { node: VariableDeclarator + /** Direct function metadata for `export const foo = () => {}`. */ + directFunction?: ModuleExportDirectFunction exports: ModuleExportEntry[] }[] } @@ -109,6 +128,8 @@ export type ModuleExportGroup = kind: ModuleExportDefaultKind node: ExportDefaultDeclaration localName?: string + /** Direct function metadata for `export default function () {}`. */ + directFunction?: ModuleExportDirectFunction meta: ModuleExportMeta } @@ -129,12 +150,17 @@ 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, exports: extractNames(declarator.id).map((name) => ({ localName: name, exportName: name, @@ -155,6 +181,10 @@ export function scanModuleExports( type: 'declaration', node, declaration: node.declaration, + directFunction: + node.declaration.type === 'FunctionDeclaration' + ? getDirectFunction(node.declaration, name) + : undefined, exports: [ { localName: name, @@ -201,6 +231,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') && @@ -221,7 +252,14 @@ export function scanModuleExports( kind = 'other' meta = { isFunction: getIsFunction(node.declaration) } } - groups.push({ type: 'default', kind, node, localName, meta }) + groups.push({ + type: 'default', + kind, + node, + localName, + directFunction, + meta, + }) } } @@ -231,13 +269,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 +280,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..2d021a919 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/module-export-wrap.test.ts @@ -0,0 +1,148 @@ +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 }) => + `wrap(${restoreFunctionName(implementation, originalName)}, ${JSON.stringify(exportName)})`, + ...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: '$$module_0_implementation_action', + originalName: 'action', + exportName: 'action', + }, + { + implementation: '$$module_1_implementation_loader', + originalName: 'loader', + exportName: 'loader', + }, + { + implementation: 'local', + originalName: undefined, + exportName: 'renamed', + }, + { + implementation: '$$module_3_implementation_forwarded', + originalName: undefined, + exportName: 'forwarded', + }, + { + implementation: '$$module_4_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: '$$module_0_implementation_selected', + originalName: 'selected', + exportName: 'selected', + }, + ]) + expect(result.referenceNames).toEqual(['selected']) + expect(result.output.toString()).toMatchInlineSnapshot(` + " + const $$module_0_implementation_selected = async () => {}; + export const selected = /* #__PURE__ */ wrap(Object.defineProperty($$module_0_implementation_selected, "name", { value: "selected" }), "selected"), skipped = async () => {} + " + `) + + const filtered = await transform(input, { filter: () => false }) + expect(filtered.output.hasChanged()).toBe(false) + expect(filtered.references).toEqual([]) + expect(filtered.referenceNames).toEqual([]) + }) + + test('only validates selected exports as async functions', async () => { + const input = `export function action() {}` + + await expect( + transform(input, { rejectNonAsyncFunction: true }), + ).rejects.toThrow('unsupported non async function') + + const filtered = await transform(input, { + 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..c089ed6dd --- /dev/null +++ b/packages/plugin-rsc/src/transforms/module-export-wrap.ts @@ -0,0 +1,491 @@ +import { tinyassert } from '@hiogawa/utils' +import type { Program } from 'estree' +import MagicString from 'magic-string' +import type { ESTree } from 'vite' +import { + scanModuleExports, + type ModuleExportDirectFunction, + type ModuleExportMeta, +} from './module-export-scan' +import { getDirectivePrologueEnd, validateNonAsyncFunction } from './utils' + +export type TransformModuleExportWrapContext = { + /** The local expression that evaluates to the exported implementation. */ + implementation: string + /** + * The function's runtime name before rewriting a direct function export. + * When present, the generated expression is responsible for restoring it. + * + * - `"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 + rejectNonAsyncFunction?: boolean + exportAll?: 'error' | 'preserve' +} + +export type TransformModuleExportWrapResult = { + output: MagicString + references: TransformModuleExportWrapContext[] + referenceNames: string[] +} + +/** + * Replaces selected module exports with canonical runtime wrapper bindings. + * + * Conceptually: + * + * ```js + * 'use server' + * + * export async function someFn(value) { + * return value + * } + * + * export const someValue = createSomeValue() + * ``` + * + * becomes: + * + * ```js + * 'use server' + * + * const $$module_0_implementation_someFn = async function $$module_0_implementation_someFn(value) { + * return value + * } + * // References within this module resolve to the wrapper. + * export const someFn = __WRAP__( + * Object.defineProperty($$module_0_implementation_someFn, 'name', { + * value: 'someFn', + * }), + * 'someFn', + * ) + * + * // References within this module resolve to the original value. + * const someValue = createSomeValue() + * 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 + * source name must be restored by the generated expression. + * `references` returns those contexts in wrapper creation order, while + * `referenceNames` returns only their export names. + * + * A direct function export makes its source name the canonical wrapper binding, + * so local and imported reads of `someFn` receive the same value. Other exports + * retain their source binding and receive a separate wrapper at the export + * boundary, so the local `someValue` above remains the unwrapped value. + * + * 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 { + const ast = viteAst as unknown as Program + + // Keep a boundary outside the parsed AST so moving an export at EOF does not + // also move code inserted at the export's end. + if (!input.endsWith('\n')) { + input += '\n' + } + + const output = new MagicString(input) + const filter = options.filter ?? (() => true) + const references: TransformModuleExportWrapContext[] = [] + const wrappedBindingCode: string[] = [] + const hoistPosition = getDirectivePrologueEnd(ast) + + function createContext( + implementation: string, + exportName: string, + meta: ModuleExportMeta, + originalName?: string, + ): TransformModuleExportWrapContext { + const context = { + implementation, + originalName, + exportName, + meta, + } + references.push(context) + return context + } + + // TODO: should we move PURE annotation to user side responsibility? + function generate(context: TransformModuleExportWrapContext): string { + return `/* #__PURE__ */ ${options.generate(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 + * export 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, + ): void { + const binding = createName('binding', exportName) + const context = createContext(implementation, exportName, meta) + wrappedBindingCode.push( + `const ${binding} = ${generate(context)};`, + exportBinding(binding, exportName), + ) + } + + /** + * Splits a directly exported function into a private implementation and a + * generated wrapper expression. The implementation is moved after the + * directive prologue, while the caller inserts the wrapper at the original + * declaration site. The context includes the source-level function name so + * the generated expression can restore it on the exported callable. + * + * For `hoistFunction({ node, originalName: 'action' }, 'action', 'action', meta)`: + * + * ```js + * // Before + * export async function action() {} + * + * // Moved into output by hoistFunction + * const $$module_0_implementation_action = + * async function $$module_0_implementation_action() {} + * + * // Returned by hoistFunction + * __WRAP__($$module_0_implementation_action, 'action') + * + * // Final declaration assembled by the caller + * export const action = __WRAP__($$module_0_implementation_action, 'action') + * ``` + * + * @param directFunction Scanner metadata for the function to move. + * @param sourceName Local declaration name used for the implementation binding. + * @param exportName Public name for the generated export. + * @param meta Static metadata collected from the original export. + * @returns Generated wrapper expression for the original declaration site. + */ + function hoistFunction( + directFunction: ModuleExportDirectFunction, + sourceName: string, + exportName: string, + meta: ModuleExportMeta, + ): string { + const { node, originalName } = directFunction + validateNonAsyncFunction(options, node) + const implementation = createName('implementation', sourceName) + const originalPrefix = + node.type === 'FunctionDeclaration' && node.id + ? input.slice(node.start, node.id.start) + + implementation + + input.slice(node.id.end, node.body.start) + : input.slice(node.start, node.body.start) + output.update( + node.start, + node.body.start, + `\nconst ${implementation} = ${originalPrefix}`, + ) + output.appendLeft(node.end, ';\n') + output.move(node.start, node.end, hoistPosition) + + const context = createContext( + implementation, + exportName, + meta, + originalName, + ) + return generate(context) + } + + 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 + + if (group.directFunction) { + // export function f() {} + // ⬇️ (hoist implementation and replace declaration) + // const $$module_0_implementation_f = function ... + // export const f = __WRAP__($$module_0_implementation_f, 'f') + const replacement = hoistFunction( + group.directFunction, + name, + entry.exportName, + meta, + ) + // strip `export` + output.remove(group.node.start, group.declaration.start) + output.appendLeft( + group.declaration.start, + `export const ${name} = ${replacement};`, + ) + } else { + // export class C {} + // ⬇️ (keep initialization in place and append wrapped binding) + // class C {} + // const $$module_0_binding_C = __WRAP__(C, 'C') + // export { $$module_0_binding_C as C } + output.remove(group.node.start, group.declaration.start) + emitWrappedBinding(name, entry.exportName, meta) + } + } else if (group.type === 'variable-declaration') { + // export const action = async () => {}, value = init() + // ⬇️ + // const $$module_0_implementation_action = async () => {} + // const action = __WRAP__($$module_0_implementation_action, 'action'), value = init() + // const $$module_1_binding_value = __WRAP__(value, 'value') + // export { $$module_1_binding_value as value } + // export { action } + const wrappedBindingNames = new Set() + const exportNames = group.declarators.flatMap((item) => + item.exports.map((entry) => entry.exportName), + ) + + for (const declarator of group.declarators) { + const directFunction = declarator.directFunction + let validate = false + + for (const entry of declarator.exports) { + const meta = entry.meta + if (!filter(entry.exportName, meta)) continue + validate = true + + if (directFunction) { + // export const action = async () => {} + // ⬇️ + // const $$module_0_implementation_action = async () => {} + // const action = __WRAP__($$module_0_implementation_action, 'action') + // export { action } + const replacement = hoistFunction( + directFunction, + entry.localName, + entry.exportName, + meta, + ) + output.appendLeft(directFunction.node.start, replacement) + } else { + // export const value = init() + // ⬇️ + // const value = init() + // const $$module_1_binding_value = __WRAP__(value, 'value') + // export { $$module_1_binding_value as value } + wrappedBindingNames.add(entry.exportName) + emitWrappedBinding(entry.localName, entry.exportName, meta) + } + } + + if (validate && declarator.node.init && !directFunction) { + validateNonAsyncFunction(options, declarator.node.init) + } + } + + if (wrappedBindingNames.size > 0) { + // export const selected = init(), skipped = init() + // ^^^^^^ + // ⬇️ (remove `export` and restore the unwrapped export separately) + // const selected = init(), skipped = init() + // export { skipped } + output.remove(group.node.start, group.declaration.start) + for (const name of exportNames) { + if (!wrappedBindingNames.has(name)) { + wrappedBindingCode.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 preserved: 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)) { + preserved.push( + localName === exportName + ? localName + : `${localName} as ${exportName}`, + ) + continue + } + selected = true + + let implementation = localName + if (group.node.source) { + // export { remote as action } from './dep' with { type: 'json' } + // ⬇️ (preserve the source tail, including attributes) + // import { remote as $$module_0_implementation_action } from './dep' with { type: 'json' } + // const $$module_0_binding_action = __WRAP__($$module_0_implementation_action, 'action') + // export { $$module_0_binding_action as action } + implementation = createName('implementation', exportName) + const sourceTail = input + .slice(group.node.source.end, group.node.end) + .replace(/;?\s*$/, ';') + wrappedBindingCode.push( + `import { ${localName} as ${implementation} } from ${group.node.source.raw}${sourceTail}`, + ) + } + emitWrappedBinding(implementation, exportName, meta) + } + + if (selected) { + output.remove(group.node.start, group.node.end) + if (preserved.length > 0) { + const source = group.node.source + ? ` from ${group.node.source.raw}` + : '' + wrappedBindingCode.push( + `export { ${preserved.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') { + let meta: ModuleExportMeta + + if (group.directFunction) { + const declaration = group.directFunction.node + // export default async function Page() {} + // ⬇️ + // const $$module_0_implementation_Page = async function ... + // const Page = __WRAP__($$module_0_implementation_Page, 'default') + // export default Page + // + // export default async () => {} + // ⬇️ + // const $$module_0_implementation_default = async () => {} + // export default __WRAP__($$module_0_implementation_default, 'default') + const sourceName = group.directFunction.originalName + meta = group.meta + if (!filter('default', meta)) continue + + const replacement = hoistFunction( + group.directFunction, + sourceName, + 'default', + meta, + ) + output.remove(group.node.start, declaration.start) + output.appendLeft( + declaration.start, + declaration.type === 'FunctionDeclaration' && declaration.id + ? `const ${sourceName} = ${replacement};\nexport default ${sourceName};` + : `export default ${replacement};`, + ) + } else { + const declaration = group.node.declaration + let implementation: string + if (declaration.type === 'ClassDeclaration' && declaration.id) { + // export default class Page {} + // ^^^^^^^^^^^^^^ + // ⬇️ (remove `export default` and append wrapped binding) + // class Page {} + // const $$module_0_binding_default = __WRAP__(Page, 'default') + // export { $$module_0_binding_default as default } + implementation = declaration.id.name + meta = group.meta + if (!filter('default', meta)) continue + output.remove(group.node.start, declaration.start) + } else { + // export default current + // ⬇️ (snapshot at the original export site) + // 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') + meta = group.meta + if (!filter('default', meta)) continue + validateNonAsyncFunction(options, declaration) + output.update( + group.node.start, + declaration.start, + `const ${implementation} = `, + ) + } + emitWrappedBinding(implementation, 'default', meta) + } + } + } + + if (wrappedBindingCode.length > 0) { + // const value = init() + // ⬇️ (append) + // const $$module_0_binding_value = __WRAP__(value, 'value') + // export { $$module_0_binding_value as value } + output.append(`\n${wrappedBindingCode.join('\n')}\n`) + } + + return { + output, + references, + referenceNames: references.map((reference) => reference.exportName), + } +} diff --git a/packages/plugin-rsc/src/transforms/server-action.test.ts b/packages/plugin-rsc/src/transforms/server-action.test.ts index ff6b343cb..9d7e90a8d 100644 --- a/packages/plugin-rsc/src/transforms/server-action.test.ts +++ b/packages/plugin-rsc/src/transforms/server-action.test.ts @@ -5,7 +5,7 @@ import { transformServerActionServer } from './server-action' async function transform(input: string) { const ast = await parseAstAsync(input) return transformServerActionServer(input, ast, { - runtime: (value) => value, + runtime: (value) => `register(${value})`, }) } @@ -18,6 +18,14 @@ test('normalizes top-level server reference names', async () => { exportNames: ['action'], referenceNames: ['action'], }) + expect(result.output.toString()).toMatchInlineSnapshot( + ` + "'use server'; async function action() {} + register(action); + export { action }; + " + `, + ) }) test('normalizes inline server reference names', async () => { diff --git a/packages/plugin-rsc/src/transforms/source-map.test.ts b/packages/plugin-rsc/src/transforms/source-map.test.ts index f9f2f0c0c..74283c1d6 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,13 @@ describe('source map fixtures', () => { generate: ({ binding, exportName }) => `registerServerReference(${binding}, ${JSON.stringify(exportName)})`, }) + const moduleWrapResult = transformModuleExportWrap(input, ast, { + generate: ({ implementation, originalName, exportName }) => + `registerServerReference(${restoreFunctionName(implementation, originalName)}, ${JSON.stringify(exportName)})`, + }) + await expect( + parseAstAsync(moduleWrapResult.output.toString()), + ).resolves.toBeDefined() const outputs = [ { name: 'wrap-export', @@ -41,6 +49,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 +96,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 b97946510..b6595877e 100644 --- a/packages/plugin-rsc/src/transforms/utils.ts +++ b/packages/plugin-rsc/src/transforms/utils.ts @@ -16,6 +16,17 @@ export function hasDirective( ) } +export function getDirectivePrologueEnd(ast: Program): number { + for (const statement of ast.body) { + const isDirective = + statement.type === 'ExpressionStatement' && + statement.expression.type === 'Literal' && + typeof statement.expression.value === 'string' + if (!isDirective) return statement.start + } + return 0 +} + // Copied from periscopic `extract_names` / `extract_identifiers` export function extractNames(param: Pattern): string[] { return extractIdentifiers(param).map((n) => n.name) diff --git a/packages/plugin-rsc/src/transforms/wrap-export.ts b/packages/plugin-rsc/src/transforms/wrap-export.ts index aaa9fcee8..c25ba25cb 100644 --- a/packages/plugin-rsc/src/transforms/wrap-export.ts +++ b/packages/plugin-rsc/src/transforms/wrap-export.ts @@ -51,6 +51,10 @@ export type TransformWrapExportOptions = { 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,