diff --git a/packages/plugin-rsc/e2e/source-map.test.ts b/packages/plugin-rsc/e2e/source-map.test.ts index 9ad059dc7..6e10af98e 100644 --- a/packages/plugin-rsc/e2e/source-map.test.ts +++ b/packages/plugin-rsc/e2e/source-map.test.ts @@ -49,18 +49,16 @@ const serverReferenceCases: { route: '/defaults', references: [ { - // Currently resolves to the end of the declaration. name: 'default-named-function', - rolldown: '/src/features/defaults/named.ts:4:0', + rolldown: '/src/features/defaults/named.ts:2:0', }, { - // Currently resolves to the end of the declaration. name: 'default-anonymous-function', - rolldown: '/src/features/defaults/anonymous.ts:4:0', + rolldown: '/src/features/defaults/anonymous.ts:2:0', }, { name: 'default-identifier', - rolldown: '/src/features/defaults/identifier.ts:6:15', + rolldown: '/src/features/defaults/identifier.ts:6:0', }, ], }, @@ -68,21 +66,16 @@ const serverReferenceCases: { route: '/specifiers', references: [ { - // Currently resolves to the end of the local declaration. name: 'local-alias', - rolldown: '/src/features/specifiers/local-alias.ts:4:0', + rolldown: '/src/features/specifiers/local-alias.ts:6:0', }, { - // Rolldown resolves to the directive while Rollup has no mapping. name: 're-export', - rolldown: '/src/features/specifiers/reexport.ts:0:0', - rollup: null, + rolldown: '/src/features/specifiers/reexport.ts:2:0', }, { - // Rolldown resolves to the directive while Rollup has no mapping. name: 'export-all', - rolldown: '/src/features/specifiers/export-all.ts:0:0', - rollup: null, + rolldown: '/src/features/specifiers/export-all.ts:2:0', }, ], }, diff --git a/packages/plugin-rsc/examples/custom-server-function/custom-server-function-plugin.ts b/packages/plugin-rsc/examples/custom-server-function/custom-server-function-plugin.ts index 03a9510f6..84db95ae1 100644 --- a/packages/plugin-rsc/examples/custom-server-function/custom-server-function-plugin.ts +++ b/packages/plugin-rsc/examples/custom-server-function/custom-server-function-plugin.ts @@ -3,7 +3,7 @@ import { hasDirective, transformDirectiveProxyExport, transformHoistInlineDirective, - transformWrapExport, + transformModuleExportEffect, } from '@vitejs/plugin-rsc/transforms' import { parseAstAsync, type Plugin } from 'vite' @@ -37,9 +37,10 @@ export function customServerFunctionPlugin(): Plugin { const runtime = (value: string, name: string) => `$$CustomReactServer.registerServerReference(${value}, ${JSON.stringify(reference.referenceKey)}, ${JSON.stringify(name)})` const result = hasDirective(ast.body, directive) - ? transformWrapExport(code, ast, { - runtime, + ? transformModuleExportEffect(code, ast, { rejectNonAsyncFunction: true, + runtime: ({ binding, exportName }) => + runtime(binding, exportName), }) : transformHoistInlineDirective(code, ast, { directive, @@ -53,7 +54,7 @@ export function customServerFunctionPlugin(): 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 * as $$CustomReactServer from "@vitejs/plugin-rsc/react/rsc/server";\n`, diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/hoist/inline.js.map.snap.txt b/packages/plugin-rsc/src/transforms/fixtures/source-map/hoist/inline.js.map.snap.md similarity index 99% rename from packages/plugin-rsc/src/transforms/fixtures/source-map/hoist/inline.js.map.snap.txt rename to packages/plugin-rsc/src/transforms/fixtures/source-map/hoist/inline.js.map.snap.md index ea6ef1f51..b4ff152db 100644 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/hoist/inline.js.map.snap.txt +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/hoist/inline.js.map.snap.md @@ -1,3 +1,6 @@ +## hoist + +```txt (0:0) "export function InlineDirective() {\n" --> (0:0) "export function InlineDirective() {\n" (1:0) " const captured = 'captured'\n" --> (1:0) " const captured = 'captured'\n" (3:0) " async function inlineAction() {\n" --> (3:0) " const inlineAction = /* #__PURE__ */ registerServerReference($$hoist_0_inlineAction, \"$$hoist_0_inlineAction\");\n" @@ -27,3 +30,4 @@ (15:0) " return 'inline function expression called'\n" --> (25:0) " return 'inline function expression called'\n" (16:0) " })\n" --> (26:0) " };\n" [unmapped] --> (27:0) "/* #__PURE__ */ Object.defineProperty($$hoist_2_anonymous_server_function, \"name\", { value: \"anonymous_server_function\" });\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/hoist/inline.js.snap.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/hoist/inline.js.snap.js deleted file mode 100644 index 117fb2135..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/hoist/inline.js.snap.js +++ /dev/null @@ -1,34 +0,0 @@ -/* -Source map visualization: - -https://evanw.github.io/source-map-visualization/#MTI0MABleHBvcnQgZnVuY3Rpb24gSW5saW5lRGlyZWN0aXZlKCkgewogIGNvbnN0IGNhcHR1cmVkID0gJ2NhcHR1cmVkJwoKICBjb25zdCBpbmxpbmVBY3Rpb24gPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoJCRob2lzdF8wX2lubGluZUFjdGlvbiwgIiQkaG9pc3RfMF9pbmxpbmVBY3Rpb24iKTsKCiAgY29uc3QgaW5saW5lQXJyb3cgPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoJCRob2lzdF8xX2lubGluZUFycm93LCAiJCRob2lzdF8xX2lubGluZUFycm93IikuYmluZChudWxsLCBlbmNyeXB0KFtjYXB0dXJlZF0pKQoKICBjb25zdW1lKGlubGluZUFjdGlvbiwgaW5saW5lQXJyb3csIC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJGhvaXN0XzJfYW5vbnltb3VzX3NlcnZlcl9mdW5jdGlvbiwgIiQkaG9pc3RfMl9hbm9ueW1vdXNfc2VydmVyX2Z1bmN0aW9uIikpCn0KCjtleHBvcnQgYXN5bmMgZnVuY3Rpb24gJCRob2lzdF8wX2lubGluZUFjdGlvbigpIHsKICAgICd1c2Ugc2VydmVyJwogICAgcmV0dXJuICdpbmxpbmUgZGlyZWN0aXZlIGNhbGxlZCcKICB9OwovKiAjX19QVVJFX18gKi8gT2JqZWN0LmRlZmluZVByb3BlcnR5KCQkaG9pc3RfMF9pbmxpbmVBY3Rpb24sICJuYW1lIiwgeyB2YWx1ZTogImlubGluZUFjdGlvbiIgfSk7Cgo7ZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICQkaG9pc3RfMV9pbmxpbmVBcnJvdygkJGhvaXN0X2VuY29kZWQsIHN1ZmZpeCA9ICdhcnJvdycpIHsKICAgIGNvbnN0IFtjYXB0dXJlZF0gPSBhd2FpdCBkZWNyeXB0KCQkaG9pc3RfZW5jb2RlZCk7Cid1c2Ugc2VydmVyJwogICAgcmV0dXJuIGAke2NhcHR1cmVkfSAke3N1ZmZpeH0gY2FsbGVkYAogIH07Ci8qICNfX1BVUkVfXyAqLyBPYmplY3QuZGVmaW5lUHJvcGVydHkoJCRob2lzdF8xX2lubGluZUFycm93LCAibmFtZSIsIHsgdmFsdWU6ICJpbmxpbmVBcnJvdyIgfSk7Cgo7ZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICQkaG9pc3RfMl9hbm9ueW1vdXNfc2VydmVyX2Z1bmN0aW9uKCkgewogICAgJ3VzZSBzZXJ2ZXInCiAgICByZXR1cm4gJ2lubGluZSBmdW5jdGlvbiBleHByZXNzaW9uIGNhbGxlZCcKICB9OwovKiAjX19QVVJFX18gKi8gT2JqZWN0LmRlZmluZVByb3BlcnR5KCQkaG9pc3RfMl9hbm9ueW1vdXNfc2VydmVyX2Z1bmN0aW9uLCAibmFtZSIsIHsgdmFsdWU6ICJhbm9ueW1vdXNfc2VydmVyX2Z1bmN0aW9uIiB9KTsKMTE5MgB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBJbmxpbmVEaXJlY3RpdmUoKSB7XG4gIGNvbnN0IGNhcHR1cmVkID0gJ2NhcHR1cmVkJ1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGlubGluZUFjdGlvbigpIHtcbiAgICAndXNlIHNlcnZlcidcbiAgICByZXR1cm4gJ2lubGluZSBkaXJlY3RpdmUgY2FsbGVkJ1xuICB9XG5cbiAgY29uc3QgaW5saW5lQXJyb3cgPSBhc3luYyAoc3VmZml4ID0gJ2Fycm93JykgPT4ge1xuICAgICd1c2Ugc2VydmVyJ1xuICAgIHJldHVybiBgJHtjYXB0dXJlZH0gJHtzdWZmaXh9IGNhbGxlZGBcbiAgfVxuXG4gIGNvbnN1bWUoaW5saW5lQWN0aW9uLCBpbmxpbmVBcnJvdywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc2VydmVyJ1xuICAgIHJldHVybiAnaW5saW5lIGZ1bmN0aW9uIGV4cHJlc3Npb24gY2FsbGVkJ1xuICB9KVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFROztBQUU1QixDQUFDOztBQUtELENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7O0FBS3JCLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsV0FBVyxDQUFDLG9IQUdqQztBQUNIO0FBZEU7QUFBQSxnREFBOEI7QUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNO0FBQ2YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU07QUFDbkMsQ0FBQyxDQUFDOztBQUVvQjtBQUFBLGdGQUE0QjtBQUNsRCxDQUFDLENBQUMsQ0FBQztBQUFDLENBQUMsR0FBRyxDQUFDLE1BQU07QUFDZixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTTtBQUN4QyxDQUFDLENBQUM7O0FBRW1DO0FBQUEsNkRBQWtCO0FBQ3ZELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTTtBQUNmLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTTtBQUM3QyxDQUFDLENBQUM7OyJ9 -*/ - -export function InlineDirective() { - const captured = 'captured' - - const inlineAction = /* #__PURE__ */ registerServerReference($$hoist_0_inlineAction, "$$hoist_0_inlineAction"); - - const inlineArrow = /* #__PURE__ */ registerServerReference($$hoist_1_inlineArrow, "$$hoist_1_inlineArrow").bind(null, encrypt([captured])) - - consume(inlineAction, inlineArrow, /* #__PURE__ */ registerServerReference($$hoist_2_anonymous_server_function, "$$hoist_2_anonymous_server_function")) -} - -;export async function $$hoist_0_inlineAction() { - 'use server' - return 'inline directive called' - }; -/* #__PURE__ */ Object.defineProperty($$hoist_0_inlineAction, "name", { value: "inlineAction" }); - -;export async function $$hoist_1_inlineArrow($$hoist_encoded, suffix = 'arrow') { - const [captured] = await decrypt($$hoist_encoded); -'use server' - return `${captured} ${suffix} called` - }; -/* #__PURE__ */ Object.defineProperty($$hoist_1_inlineArrow, "name", { value: "inlineArrow" }); - -;export async function $$hoist_2_anonymous_server_function() { - 'use server' - return 'inline function expression called' - }; -/* #__PURE__ */ Object.defineProperty($$hoist_2_anonymous_server_function, "name", { value: "anonymous_server_function" }); diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/hoist/inline.js.snap.md b/packages/plugin-rsc/src/transforms/fixtures/source-map/hoist/inline.js.snap.md new file mode 100644 index 000000000..608b835c8 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/hoist/inline.js.snap.md @@ -0,0 +1,61 @@ +## Input + +```js +export function InlineDirective() { + const captured = 'captured' + + async function inlineAction() { + 'use server' + return 'inline directive called' + } + + const inlineArrow = async (suffix = 'arrow') => { + 'use server' + return `${captured} ${suffix} called` + } + + consume(inlineAction, inlineArrow, async function () { + 'use server' + return 'inline function expression called' + }) +} +``` + +## hoist + +**Status:** transformed + +**References:** $$hoist_0_inlineAction, $$hoist_1_inlineArrow, $$hoist_2_anonymous_server_function + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTI0MABleHBvcnQgZnVuY3Rpb24gSW5saW5lRGlyZWN0aXZlKCkgewogIGNvbnN0IGNhcHR1cmVkID0gJ2NhcHR1cmVkJwoKICBjb25zdCBpbmxpbmVBY3Rpb24gPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoJCRob2lzdF8wX2lubGluZUFjdGlvbiwgIiQkaG9pc3RfMF9pbmxpbmVBY3Rpb24iKTsKCiAgY29uc3QgaW5saW5lQXJyb3cgPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoJCRob2lzdF8xX2lubGluZUFycm93LCAiJCRob2lzdF8xX2lubGluZUFycm93IikuYmluZChudWxsLCBlbmNyeXB0KFtjYXB0dXJlZF0pKQoKICBjb25zdW1lKGlubGluZUFjdGlvbiwgaW5saW5lQXJyb3csIC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJGhvaXN0XzJfYW5vbnltb3VzX3NlcnZlcl9mdW5jdGlvbiwgIiQkaG9pc3RfMl9hbm9ueW1vdXNfc2VydmVyX2Z1bmN0aW9uIikpCn0KCjtleHBvcnQgYXN5bmMgZnVuY3Rpb24gJCRob2lzdF8wX2lubGluZUFjdGlvbigpIHsKICAgICd1c2Ugc2VydmVyJwogICAgcmV0dXJuICdpbmxpbmUgZGlyZWN0aXZlIGNhbGxlZCcKICB9OwovKiAjX19QVVJFX18gKi8gT2JqZWN0LmRlZmluZVByb3BlcnR5KCQkaG9pc3RfMF9pbmxpbmVBY3Rpb24sICJuYW1lIiwgeyB2YWx1ZTogImlubGluZUFjdGlvbiIgfSk7Cgo7ZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICQkaG9pc3RfMV9pbmxpbmVBcnJvdygkJGhvaXN0X2VuY29kZWQsIHN1ZmZpeCA9ICdhcnJvdycpIHsKICAgIGNvbnN0IFtjYXB0dXJlZF0gPSBhd2FpdCBkZWNyeXB0KCQkaG9pc3RfZW5jb2RlZCk7Cid1c2Ugc2VydmVyJwogICAgcmV0dXJuIGAke2NhcHR1cmVkfSAke3N1ZmZpeH0gY2FsbGVkYAogIH07Ci8qICNfX1BVUkVfXyAqLyBPYmplY3QuZGVmaW5lUHJvcGVydHkoJCRob2lzdF8xX2lubGluZUFycm93LCAibmFtZSIsIHsgdmFsdWU6ICJpbmxpbmVBcnJvdyIgfSk7Cgo7ZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICQkaG9pc3RfMl9hbm9ueW1vdXNfc2VydmVyX2Z1bmN0aW9uKCkgewogICAgJ3VzZSBzZXJ2ZXInCiAgICByZXR1cm4gJ2lubGluZSBmdW5jdGlvbiBleHByZXNzaW9uIGNhbGxlZCcKICB9OwovKiAjX19QVVJFX18gKi8gT2JqZWN0LmRlZmluZVByb3BlcnR5KCQkaG9pc3RfMl9hbm9ueW1vdXNfc2VydmVyX2Z1bmN0aW9uLCAibmFtZSIsIHsgdmFsdWU6ICJhbm9ueW1vdXNfc2VydmVyX2Z1bmN0aW9uIiB9KTsKMTE5MgB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBJbmxpbmVEaXJlY3RpdmUoKSB7XG4gIGNvbnN0IGNhcHR1cmVkID0gJ2NhcHR1cmVkJ1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGlubGluZUFjdGlvbigpIHtcbiAgICAndXNlIHNlcnZlcidcbiAgICByZXR1cm4gJ2lubGluZSBkaXJlY3RpdmUgY2FsbGVkJ1xuICB9XG5cbiAgY29uc3QgaW5saW5lQXJyb3cgPSBhc3luYyAoc3VmZml4ID0gJ2Fycm93JykgPT4ge1xuICAgICd1c2Ugc2VydmVyJ1xuICAgIHJldHVybiBgJHtjYXB0dXJlZH0gJHtzdWZmaXh9IGNhbGxlZGBcbiAgfVxuXG4gIGNvbnN1bWUoaW5saW5lQWN0aW9uLCBpbmxpbmVBcnJvdywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc2VydmVyJ1xuICAgIHJldHVybiAnaW5saW5lIGZ1bmN0aW9uIGV4cHJlc3Npb24gY2FsbGVkJ1xuICB9KVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFROztBQUU1QixDQUFDOztBQUtELENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7O0FBS3JCLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsV0FBVyxDQUFDLG9IQUdqQztBQUNIO0FBZEU7QUFBQSxnREFBOEI7QUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNO0FBQ2YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU07QUFDbkMsQ0FBQyxDQUFDOztBQUVvQjtBQUFBLGdGQUE0QjtBQUNsRCxDQUFDLENBQUMsQ0FBQztBQUFDLENBQUMsR0FBRyxDQUFDLE1BQU07QUFDZixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTTtBQUN4QyxDQUFDLENBQUM7O0FBRW1DO0FBQUEsNkRBQWtCO0FBQ3ZELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTTtBQUNmLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTTtBQUM3QyxDQUFDLENBQUM7OyJ9) + +```js +export function InlineDirective() { + const captured = 'captured' + + const inlineAction = /* #__PURE__ */ registerServerReference($$hoist_0_inlineAction, "$$hoist_0_inlineAction"); + + const inlineArrow = /* #__PURE__ */ registerServerReference($$hoist_1_inlineArrow, "$$hoist_1_inlineArrow").bind(null, encrypt([captured])) + + consume(inlineAction, inlineArrow, /* #__PURE__ */ registerServerReference($$hoist_2_anonymous_server_function, "$$hoist_2_anonymous_server_function")) +} + +;export async function $$hoist_0_inlineAction() { + 'use server' + return 'inline directive called' + }; +/* #__PURE__ */ Object.defineProperty($$hoist_0_inlineAction, "name", { value: "inlineAction" }); + +;export async function $$hoist_1_inlineArrow($$hoist_encoded, suffix = 'arrow') { + const [captured] = await decrypt($$hoist_encoded); +'use server' + return `${captured} ${suffix} called` + }; +/* #__PURE__ */ Object.defineProperty($$hoist_1_inlineArrow, "name", { value: "inlineArrow" }); + +;export async function $$hoist_2_anonymous_server_function() { + 'use server' + return 'inline function expression called' + }; +/* #__PURE__ */ Object.defineProperty($$hoist_2_anonymous_server_function, "name", { value: "anonymous_server_function" }); +``` 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 new file mode 100644 index 000000000..392988413 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.map.snap.md @@ -0,0 +1,25 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "export default " --> (2:0) "const $$default = " +(2:15) "async function () {\n" --> (2:18) "async function () {\n" +(3:0) " return 'default anonymous function called'\n" --> (3:0) " return 'default anonymous function called'\n" +(4:0) "}\n" --> (4:0) "}\n" +[unmapped] --> (5:0) ";\n" +[unmapped] --> (6:0) "const $$wrap_$$default = /* #__PURE__ */ registerServerReference($$default, \"default\");\n" +[unmapped] --> (7:0) "export { $$wrap_$$default as default };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:6) " default " --> (2:0) "const $$effect_default = " +(2:15) "async function () {\n" --> (2:25) "async function () {\n" +(3:0) " return 'default anonymous function called'\n" --> (3:0) " return 'default anonymous function called'\n" +(4:0) "}\n" --> (4:0) "}\n" +(2:0) "export default async function () {\n" --> (5:0) "\n" +(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" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.map.snap.txt b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.map.snap.txt deleted file mode 100644 index 6d29f5d87..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.map.snap.txt +++ /dev/null @@ -1,8 +0,0 @@ -(0:0) "'use server'\n" --> (0:0) "'use server'\n" -(2:0) "export default " --> (2:0) "const $$default = " -(2:15) "async function () {\n" --> (2:18) "async function () {\n" -(3:0) " return 'default anonymous function called'\n" --> (3:0) " return 'default anonymous function called'\n" -(4:0) "}\n" --> (4:0) "}\n" -[unmapped] --> (5:0) ";\n" -[unmapped] --> (6:0) "const $$wrap_$$default = /* #__PURE__ */ registerServerReference($$default, \"default\");\n" -[unmapped] --> (7:0) "export { $$wrap_$$default as default };\n" diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.snap.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.snap.js deleted file mode 100644 index d1fd45515..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.snap.js +++ /dev/null @@ -1,14 +0,0 @@ -/* -Source map visualization: - -https://evanw.github.io/source-map-visualization/#MjI5ACd1c2Ugc2VydmVyJwoKY29uc3QgJCRkZWZhdWx0ID0gYXN5bmMgZnVuY3Rpb24gKCkgewogIHJldHVybiAnZGVmYXVsdCBhbm9ueW1vdXMgZnVuY3Rpb24gY2FsbGVkJwp9CjsKY29uc3QgJCR3cmFwXyQkZGVmYXVsdCA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJGRlZmF1bHQsICJkZWZhdWx0Iik7CmV4cG9ydCB7ICQkd3JhcF8kJGRlZmF1bHQgYXMgZGVmYXVsdCB9OwozMjMAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2RlZmF1bHQgYW5vbnltb3VzIGZ1bmN0aW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVYLGtCQUFlLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU07QUFDM0M7Ozs7In0= -*/ - -'use server' - -const $$default = async function () { - return 'default anonymous function called' -} -; -const $$wrap_$$default = /* #__PURE__ */ registerServerReference($$default, "default"); -export { $$wrap_$$default as default }; 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 new file mode 100644 index 000000000..2c88b1a97 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-anonymous.js.snap.md @@ -0,0 +1,47 @@ +## Input + +```js +'use server' + +export default async function () { + return 'default anonymous function called' +} +``` + +## wrap-export + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjI5ACd1c2Ugc2VydmVyJwoKY29uc3QgJCRkZWZhdWx0ID0gYXN5bmMgZnVuY3Rpb24gKCkgewogIHJldHVybiAnZGVmYXVsdCBhbm9ueW1vdXMgZnVuY3Rpb24gY2FsbGVkJwp9CjsKY29uc3QgJCR3cmFwXyQkZGVmYXVsdCA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJGRlZmF1bHQsICJkZWZhdWx0Iik7CmV4cG9ydCB7ICQkd3JhcF8kJGRlZmF1bHQgYXMgZGVmYXVsdCB9OwozMjMAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2RlZmF1bHQgYW5vbnltb3VzIGZ1bmN0aW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVYLGtCQUFlLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU07QUFDM0M7Ozs7In0=) + +```js +'use server' + +const $$default = async function () { + return 'default anonymous function called' +} +; +const $$wrap_$$default = /* #__PURE__ */ registerServerReference($$default, "default"); +export { $$wrap_$$default as default }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTk0ACd1c2Ugc2VydmVyJwoKY29uc3QgJCRlZmZlY3RfZGVmYXVsdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHsKICByZXR1cm4gJ2RlZmF1bHQgYW5vbnltb3VzIGZ1bmN0aW9uIGNhbGxlZCcKfQoKcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoJCRlZmZlY3RfZGVmYXVsdCwgImRlZmF1bHQiKTsKZXhwb3J0IGRlZmF1bHQgJCRlZmZlY3RfZGVmYXVsdDsKMzM1AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdkZWZhdWx0IGFub255bW91cyBmdW5jdGlvbiBjYWxsZWQnXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFTCx5QkFBUyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0FBQzNDO0FBRkE7QUFBQTtBQUFBOyJ9) + +```js +'use server' + +const $$effect_default = async function () { + return 'default anonymous function called' +} + +registerServerReference($$effect_default, "default"); +export default $$effect_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 new file mode 100644 index 000000000..a7c2a494c --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.map.snap.md @@ -0,0 +1,26 @@ +## wrap-export + +```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 $$default = " +(6:15) "defaultIdentifier\n" --> (6:18) "defaultIdentifier\n" +[unmapped] --> (7:0) ";\n" +[unmapped] --> (8:0) "const $$wrap_$$default = /* #__PURE__ */ registerServerReference($$default, \"default\");\n" +[unmapped] --> (9:0) "export { $$wrap_$$default as default };\n" +``` + +## module-export-effect + +```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:6) " default defaultIdentifier\n" --> (6:0) "const $$effect_default = defaultIdentifier;\n" +(6:0) "export default defaultIdentifier\n" --> (7:0) "\n" +(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" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.snap.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.snap.js deleted file mode 100644 index 8f8865f1e..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.snap.js +++ /dev/null @@ -1,16 +0,0 @@ -/* -Source map visualization: - -https://evanw.github.io/source-map-visualization/#MjU3ACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZGVmYXVsdElkZW50aWZpZXIoKSB7CiAgcmV0dXJuICdkZWZhdWx0IGlkZW50aWZpZXIgY2FsbGVkJwp9Cgpjb25zdCAkJGRlZmF1bHQgPSBkZWZhdWx0SWRlbnRpZmllcgo7CmNvbnN0ICQkd3JhcF8kJGRlZmF1bHQgPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoJCRkZWZhdWx0LCAiZGVmYXVsdCIpOwpleHBvcnQgeyAkJHdyYXBfJCRkZWZhdWx0IGFzIGRlZmF1bHQgfTsKMzU2AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRJZGVudGlmaWVyKCkge1xuICByZXR1cm4gJ2RlZmF1bHQgaWRlbnRpZmllciBjYWxsZWQnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRJZGVudGlmaWVyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFWCxLQUFLLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNO0FBQ25DOztBQUVBLGtCQUFlOzs7OyJ9 -*/ - -'use server' - -async function defaultIdentifier() { - return 'default identifier called' -} - -const $$default = defaultIdentifier -; -const $$wrap_$$default = /* #__PURE__ */ registerServerReference($$default, "default"); -export { $$wrap_$$default as default }; 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 new file mode 100644 index 000000000..d8039095b --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-identifier.js.snap.md @@ -0,0 +1,53 @@ +## Input + +```js +'use server' + +async function defaultIdentifier() { + return 'default identifier called' +} + +export default defaultIdentifier +``` + +## wrap-export + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjU3ACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZGVmYXVsdElkZW50aWZpZXIoKSB7CiAgcmV0dXJuICdkZWZhdWx0IGlkZW50aWZpZXIgY2FsbGVkJwp9Cgpjb25zdCAkJGRlZmF1bHQgPSBkZWZhdWx0SWRlbnRpZmllcgo7CmNvbnN0ICQkd3JhcF8kJGRlZmF1bHQgPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoJCRkZWZhdWx0LCAiZGVmYXVsdCIpOwpleHBvcnQgeyAkJHdyYXBfJCRkZWZhdWx0IGFzIGRlZmF1bHQgfTsKMzU2AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRJZGVudGlmaWVyKCkge1xuICByZXR1cm4gJ2RlZmF1bHQgaWRlbnRpZmllciBjYWxsZWQnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRJZGVudGlmaWVyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFWCxLQUFLLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNO0FBQ25DOztBQUVBLGtCQUFlOzs7OyJ9) + +```js +'use server' + +async function defaultIdentifier() { + return 'default identifier called' +} + +const $$default = defaultIdentifier +; +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/#MjIzACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZGVmYXVsdElkZW50aWZpZXIoKSB7CiAgcmV0dXJuICdkZWZhdWx0IGlkZW50aWZpZXIgY2FsbGVkJwp9Cgpjb25zdCAkJGVmZmVjdF9kZWZhdWx0ID0gZGVmYXVsdElkZW50aWZpZXI7CgpyZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJGVmZmVjdF9kZWZhdWx0LCAiZGVmYXVsdCIpOwpleHBvcnQgZGVmYXVsdCAkJGVmZmVjdF9kZWZhdWx0OwozNjIAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuYXN5bmMgZnVuY3Rpb24gZGVmYXVsdElkZW50aWZpZXIoKSB7XG4gIHJldHVybiAnZGVmYXVsdCBpZGVudGlmaWVyIGNhbGxlZCdcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdElkZW50aWZpZXJcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVYLEtBQUssQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU07QUFDbkM7O0FBRU07QUFBTjtBQUFBO0FBQUE7In0=) + +```js +'use server' + +async function defaultIdentifier() { + return 'default identifier called' +} + +const $$effect_default = defaultIdentifier; + +registerServerReference($$effect_default, "default"); +export default $$effect_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 new file mode 100644 index 000000000..86fa79fd2 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.map.snap.md @@ -0,0 +1,23 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:15) "async function defaultNamedFunction() {\n" --> (2:0) "async function defaultNamedFunction() {\n" +(3:0) " return 'default named function called'\n" --> (3:0) " return 'default named function called'\n" +(4:0) "}\n" --> (4:0) "}\n" +[unmapped] --> (5:0) ";\n" +[unmapped] --> (6:0) "const $$wrap_defaultNamedFunction = /* #__PURE__ */ registerServerReference(defaultNamedFunction, \"default\");\n" +[unmapped] --> (7:0) "export { $$wrap_defaultNamedFunction as default };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:15) "async function defaultNamedFunction() {\n" --> (2:0) "async function defaultNamedFunction() {\n" +(3:0) " return 'default named function called'\n" --> (3:0) " return 'default named function called'\n" +(4:0) "}\n" --> (4:0) "}\n" +(2:0) "export default async function defaultNamedFunction() {\n" --> (5:0) "\n" +(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" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.map.snap.txt b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.map.snap.txt deleted file mode 100644 index c54867b2f..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.map.snap.txt +++ /dev/null @@ -1,7 +0,0 @@ -(0:0) "'use server'\n" --> (0:0) "'use server'\n" -(2:15) "async function defaultNamedFunction() {\n" --> (2:0) "async function defaultNamedFunction() {\n" -(3:0) " return 'default named function called'\n" --> (3:0) " return 'default named function called'\n" -(4:0) "}\n" --> (4:0) "}\n" -[unmapped] --> (5:0) ";\n" -[unmapped] --> (6:0) "const $$wrap_defaultNamedFunction = /* #__PURE__ */ registerServerReference(defaultNamedFunction, \"default\");\n" -[unmapped] --> (7:0) "export { $$wrap_defaultNamedFunction as default };\n" diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.snap.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.snap.js deleted file mode 100644 index 6480fb172..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.snap.js +++ /dev/null @@ -1,14 +0,0 @@ -/* -Source map visualization: - -https://evanw.github.io/source-map-visualization/#MjYwACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZGVmYXVsdE5hbWVkRnVuY3Rpb24oKSB7CiAgcmV0dXJuICdkZWZhdWx0IG5hbWVkIGZ1bmN0aW9uIGNhbGxlZCcKfQo7CmNvbnN0ICQkd3JhcF9kZWZhdWx0TmFtZWRGdW5jdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShkZWZhdWx0TmFtZWRGdW5jdGlvbiwgImRlZmF1bHQiKTsKZXhwb3J0IHsgJCR3cmFwX2RlZmF1bHROYW1lZEZ1bmN0aW9uIGFzIGRlZmF1bHQgfTsKMzQwAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHROYW1lZEZ1bmN0aW9uKCkge1xuICByZXR1cm4gJ2RlZmF1bHQgbmFtZWQgZnVuY3Rpb24gY2FsbGVkJ1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU07QUFDdkM7Ozs7In0= -*/ - -'use server' - -async function defaultNamedFunction() { - return 'default named function called' -} -; -const $$wrap_defaultNamedFunction = /* #__PURE__ */ registerServerReference(defaultNamedFunction, "default"); -export { $$wrap_defaultNamedFunction as default }; 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 new file mode 100644 index 000000000..b31b20bea --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/default-named.js.snap.md @@ -0,0 +1,47 @@ +## Input + +```js +'use server' + +export default async function defaultNamedFunction() { + return 'default named function called' +} +``` + +## wrap-export + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjYwACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZGVmYXVsdE5hbWVkRnVuY3Rpb24oKSB7CiAgcmV0dXJuICdkZWZhdWx0IG5hbWVkIGZ1bmN0aW9uIGNhbGxlZCcKfQo7CmNvbnN0ICQkd3JhcF9kZWZhdWx0TmFtZWRGdW5jdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShkZWZhdWx0TmFtZWRGdW5jdGlvbiwgImRlZmF1bHQiKTsKZXhwb3J0IHsgJCR3cmFwX2RlZmF1bHROYW1lZEZ1bmN0aW9uIGFzIGRlZmF1bHQgfTsKMzQwAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHROYW1lZEZ1bmN0aW9uKCkge1xuICByZXR1cm4gJ2RlZmF1bHQgbmFtZWQgZnVuY3Rpb24gY2FsbGVkJ1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU07QUFDdkM7Ozs7In0=) + +```js +'use server' + +async function defaultNamedFunction() { + return 'default named function called' +} +; +const $$wrap_defaultNamedFunction = /* #__PURE__ */ registerServerReference(defaultNamedFunction, "default"); +export { $$wrap_defaultNamedFunction as default }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** default + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTkzACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZGVmYXVsdE5hbWVkRnVuY3Rpb24oKSB7CiAgcmV0dXJuICdkZWZhdWx0IG5hbWVkIGZ1bmN0aW9uIGNhbGxlZCcKfQoKcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoZGVmYXVsdE5hbWVkRnVuY3Rpb24sICJkZWZhdWx0Iik7CmV4cG9ydCBkZWZhdWx0IGRlZmF1bHROYW1lZEZ1bmN0aW9uOwozNTIAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZGVmYXVsdE5hbWVkRnVuY3Rpb24oKSB7XG4gIHJldHVybiAnZGVmYXVsdCBuYW1lZCBmdW5jdGlvbiBjYWxsZWQnXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFSSxLQUFLLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTTtBQUN2QztBQUZBO0FBQUE7QUFBQTsifQ==) + +```js +'use server' + +async function defaultNamedFunction() { + return 'default named function called' +} + +registerServerReference(defaultNamedFunction, "default"); +export default defaultNamedFunction; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js new file mode 100644 index 000000000..95a50e601 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js @@ -0,0 +1,4 @@ +'use server' + +export const first = async () => 'first action called', + second = first 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 new file mode 100644 index 000000000..eef48cd07 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js.map.snap.md @@ -0,0 +1,24 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "const" --> (2:0) "let" +(2:12) " first = async () => 'first action called',\n" --> (2:3) " first = async () => 'first action called',\n" +(3:0) " second = first\n" --> (3:0) " second = first\n" +(2:0) "export const first = async () => 'first action called',\n" --> (4:0) "first = /* #__PURE__ */ registerServerReference(first, \"first\");\n" +(2:0) "export const first = async () => 'first action called',\n" --> (5:0) "export { first };\n" +(2:0) "export const first = async () => 'first action called',\n" --> (6:0) "second = /* #__PURE__ */ registerServerReference(second, \"second\");\n" +(2:0) "export const first = async () => 'first action called',\n" --> (7:0) "export { second };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "const first = async () => 'first action called',\n" --> (2:0) "const first = async () => 'first action called',\n" +(3:0) " second = first\n" --> (3:0) " second = first\n" +(2:0) "export const first = async () => 'first action called',\n" --> (4:0) "\n" +(2:0) "export const first = async () => 'first action called',\n" --> (5:0) "registerServerReference(first, \"first\");\n" +(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" +``` 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 new file mode 100644 index 000000000..e7a106b22 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/dependent-declarators.js.snap.md @@ -0,0 +1,46 @@ +## Input + +```js +'use server' + +export const first = async () => 'first action called', + second = first +``` + +## wrap-export + +**Status:** transformed + +**References:** first, second + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjQ4ACd1c2Ugc2VydmVyJwoKbGV0IGZpcnN0ID0gYXN5bmMgKCkgPT4gJ2ZpcnN0IGFjdGlvbiBjYWxsZWQnLAogIHNlY29uZCA9IGZpcnN0CmZpcnN0ID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGZpcnN0LCAiZmlyc3QiKTsKZXhwb3J0IHsgZmlyc3QgfTsKc2Vjb25kID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKHNlY29uZCwgInNlY29uZCIpOwpleHBvcnQgeyBzZWNvbmQgfTsKMzU4AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBjb25zdCBmaXJzdCA9IGFzeW5jICgpID0+ICdmaXJzdCBhY3Rpb24gY2FsbGVkJyxcbiAgc2Vjb25kID0gZmlyc3RcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLEdBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ3RELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRFg7QUFBQTtBQUFBO0FBQUE7In0=) + +```js +'use server' + +let first = async () => 'first action called', + second = first +first = /* #__PURE__ */ registerServerReference(first, "first"); +export { first }; +second = /* #__PURE__ */ registerServerReference(second, "second"); +export { second }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** first, second + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTkxACd1c2Ugc2VydmVyJwoKY29uc3QgZmlyc3QgPSBhc3luYyAoKSA9PiAnZmlyc3QgYWN0aW9uIGNhbGxlZCcsCiAgc2Vjb25kID0gZmlyc3QKCnJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGZpcnN0LCAiZmlyc3QiKTsKcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2Uoc2Vjb25kLCAic2Vjb25kIik7CmV4cG9ydCB7IGZpcnN0LCBzZWNvbmQgfTsKMzU4AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBjb25zdCBmaXJzdCA9IGFzeW5jICgpID0+ICdmaXJzdCBhY3Rpb24gY2FsbGVkJyxcbiAgc2Vjb25kID0gZmlyc3RcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ3RELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRFg7QUFBQTtBQUFBO0FBQUE7In0=) + +```js +'use server' + +const first = async () => 'first action called', + second = first + +registerServerReference(first, "first"); +registerServerReference(second, "second"); +export { first, second }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js new file mode 100644 index 000000000..488a76ef3 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js @@ -0,0 +1,5 @@ +'use server' + +const source = async () => 'destructured export called' + +export const { action } = { action: source } 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 new file mode 100644 index 000000000..045aecee0 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js.map.snap.md @@ -0,0 +1,21 @@ +## wrap-export + +```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" --> (4:0) "let" +(4:12) " { action } = { action: source }\n" --> (4:3) " { action } = { action: source }\n" +(4:0) "export const { action } = { action: source }\n" --> (5:0) "action = /* #__PURE__ */ registerServerReference(action, \"action\");\n" +(4:0) "export const { action } = { action: source }\n" --> (6:0) "export { action };\n" +``` + +## module-export-effect + +```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" +(4:0) "export const { action } = { action: source }\n" --> (5:0) "\n" +(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" +``` 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 new file mode 100644 index 000000000..87aabfcc0 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/destructured-export.js.snap.md @@ -0,0 +1,46 @@ +## Input + +```js +'use server' + +const source = async () => 'destructured export called' + +export const { action } = { action: source } +``` + +## wrap-export + +**Status:** transformed + +**References:** action + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTk0ACd1c2Ugc2VydmVyJwoKY29uc3Qgc291cmNlID0gYXN5bmMgKCkgPT4gJ2Rlc3RydWN0dXJlZCBleHBvcnQgY2FsbGVkJwoKbGV0IHsgYWN0aW9uIH0gPSB7IGFjdGlvbjogc291cmNlIH0KYWN0aW9uID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGFjdGlvbiwgImFjdGlvbiIpOwpleHBvcnQgeyBhY3Rpb24gfTsKNDMwAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmNvbnN0IHNvdXJjZSA9IGFzeW5jICgpID0+ICdkZXN0cnVjdHVyZWQgZXhwb3J0IGNhbGxlZCdcblxuZXhwb3J0IGNvbnN0IHsgYWN0aW9uIH0gPSB7IGFjdGlvbjogc291cmNlIH1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVYLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTTs7QUFFL0MsR0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQTNDO0FBQUE7In0=) + +```js +'use server' + +const source = async () => 'destructured export called' + +let { action } = { action: source } +action = /* #__PURE__ */ registerServerReference(action, "action"); +export { action }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** action + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTcyACd1c2Ugc2VydmVyJwoKY29uc3Qgc291cmNlID0gYXN5bmMgKCkgPT4gJ2Rlc3RydWN0dXJlZCBleHBvcnQgY2FsbGVkJwoKY29uc3QgeyBhY3Rpb24gfSA9IHsgYWN0aW9uOiBzb3VyY2UgfQoKcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoYWN0aW9uLCAiYWN0aW9uIik7CmV4cG9ydCB7IGFjdGlvbiB9Owo0MzUAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuY29uc3Qgc291cmNlID0gYXN5bmMgKCkgPT4gJ2Rlc3RydWN0dXJlZCBleHBvcnQgY2FsbGVkJ1xuXG5leHBvcnQgY29uc3QgeyBhY3Rpb24gfSA9IHsgYWN0aW9uOiBzb3VyY2UgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRVgsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNOztBQUUvQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFBM0M7QUFBQTtBQUFBOyJ9) + +```js +'use server' + +const source = async () => 'destructured export called' + +const { action } = { action: source } + +registerServerReference(action, "action"); +export { action }; +``` 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 new file mode 100644 index 000000000..c3ac63ed7 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.map.snap.md @@ -0,0 +1,23 @@ +## wrap-export + +```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] --> (7:0) ";\n" +[unmapped] --> (8:0) "const $$wrap_localAlias = /* #__PURE__ */ registerServerReference(localAlias, \"aliasedAction\");\n" +[unmapped] --> (9:0) "export { $$wrap_localAlias as aliasedAction };\n" +``` + +## module-export-effect + +```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" +(6:0) "export { localAlias as aliasedAction }\n" --> (7:0) "\n" +(6:0) "export { localAlias as aliasedAction }\n" --> (8:0) "registerServerReference(localAlias, \"aliasedAction\");\n" +(6:0) "export { localAlias as aliasedAction }\n" --> (9:0) "export { localAlias as aliasedAction }\n" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.map.snap.txt b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.map.snap.txt deleted file mode 100644 index 423001662..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.map.snap.txt +++ /dev/null @@ -1,7 +0,0 @@ -(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] --> (7:0) ";\n" -[unmapped] --> (8:0) "const $$wrap_localAlias = /* #__PURE__ */ registerServerReference(localAlias, \"aliasedAction\");\n" -[unmapped] --> (9:0) "export { $$wrap_localAlias as aliasedAction };\n" diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.snap.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.snap.js deleted file mode 100644 index ec5c2b8f0..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.snap.js +++ /dev/null @@ -1,16 +0,0 @@ -/* -Source map visualization: - -https://evanw.github.io/source-map-visualization/#MjIzACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gbG9jYWxBbGlhcygpIHsKICByZXR1cm4gJ2xvY2FsIGFsaWFzIGNhbGxlZCcKfQoKCjsKY29uc3QgJCR3cmFwX2xvY2FsQWxpYXMgPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UobG9jYWxBbGlhcywgImFsaWFzZWRBY3Rpb24iKTsKZXhwb3J0IHsgJCR3cmFwX2xvY2FsQWxpYXMgYXMgYWxpYXNlZEFjdGlvbiB9OwozMzYAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuYXN5bmMgZnVuY3Rpb24gbG9jYWxBbGlhcygpIHtcbiAgcmV0dXJuICdsb2NhbCBhbGlhcyBjYWxsZWQnXG59XG5cbmV4cG9ydCB7IGxvY2FsQWxpYXMgYXMgYWxpYXNlZEFjdGlvbiB9XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFWCxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTTtBQUM1Qjs7Ozs7OyJ9 -*/ - -'use server' - -async function localAlias() { - return 'local alias called' -} - - -; -const $$wrap_localAlias = /* #__PURE__ */ registerServerReference(localAlias, "aliasedAction"); -export { $$wrap_localAlias as aliasedAction }; 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 new file mode 100644 index 000000000..3f4054e24 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/local-alias.js.snap.md @@ -0,0 +1,53 @@ +## Input + +```js +'use server' + +async function localAlias() { + return 'local alias called' +} + +export { localAlias as aliasedAction } +``` + +## wrap-export + +**Status:** transformed + +**References:** aliasedAction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjIzACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gbG9jYWxBbGlhcygpIHsKICByZXR1cm4gJ2xvY2FsIGFsaWFzIGNhbGxlZCcKfQoKCjsKY29uc3QgJCR3cmFwX2xvY2FsQWxpYXMgPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UobG9jYWxBbGlhcywgImFsaWFzZWRBY3Rpb24iKTsKZXhwb3J0IHsgJCR3cmFwX2xvY2FsQWxpYXMgYXMgYWxpYXNlZEFjdGlvbiB9OwozMzYAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuYXN5bmMgZnVuY3Rpb24gbG9jYWxBbGlhcygpIHtcbiAgcmV0dXJuICdsb2NhbCBhbGlhcyBjYWxsZWQnXG59XG5cbmV4cG9ydCB7IGxvY2FsQWxpYXMgYXMgYWxpYXNlZEFjdGlvbiB9XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFWCxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTTtBQUM1Qjs7Ozs7OyJ9) + +```js +'use server' + +async function localAlias() { + return 'local alias called' +} + + +; +const $$wrap_localAlias = /* #__PURE__ */ registerServerReference(localAlias, "aliasedAction"); +export { $$wrap_localAlias as aliasedAction }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** aliasedAction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTcyACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gbG9jYWxBbGlhcygpIHsKICByZXR1cm4gJ2xvY2FsIGFsaWFzIGNhbGxlZCcKfQoKCgpyZWdpc3RlclNlcnZlclJlZmVyZW5jZShsb2NhbEFsaWFzLCAiYWxpYXNlZEFjdGlvbiIpOwpleHBvcnQgeyBsb2NhbEFsaWFzIGFzIGFsaWFzZWRBY3Rpb24gfQozNDgAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuYXN5bmMgZnVuY3Rpb24gbG9jYWxBbGlhcygpIHtcbiAgcmV0dXJuICdsb2NhbCBhbGlhcyBjYWxsZWQnXG59XG5cbmV4cG9ydCB7IGxvY2FsQWxpYXMgYXMgYWxpYXNlZEFjdGlvbiB9XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFWCxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTTtBQUM1Qjs7O0FBRUE7QUFBQTtBQUFBOyJ9) + +```js +'use server' + +async function localAlias() { + return 'local alias called' +} + + + +registerServerReference(localAlias, "aliasedAction"); +export { localAlias as aliasedAction } +``` 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 new file mode 100644 index 000000000..72485f5a2 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.map.snap.md @@ -0,0 +1,33 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "async function firstAction() {\n" --> (2:0) "async function firstAction() {\n" +(3:0) " return 'first action called'\n" --> (3:0) " return 'first action called'\n" +(4:0) "}\n" --> (4:0) "}\n" +(6:7) "async function secondAction() {\n" --> (6:0) "async function secondAction() {\n" +(7:0) " return 'second action called'\n" --> (7:0) " return 'second action called'\n" +(8:0) "}\n" --> (8:0) "}\n" +(2:0) "export async function firstAction() {\n" --> (9:0) "firstAction = /* #__PURE__ */ registerServerReference(firstAction, \"firstAction\");\n" +(2:0) "export async function firstAction() {\n" --> (10:0) "export { firstAction };\n" +(6:0) "export async function secondAction() {\n" --> (11:0) "secondAction = /* #__PURE__ */ registerServerReference(secondAction, \"secondAction\");\n" +(6:0) "export async function secondAction() {\n" --> (12:0) "export { secondAction };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "async function firstAction() {\n" --> (2:0) "async function firstAction() {\n" +(3:0) " return 'first action called'\n" --> (3:0) " return 'first action called'\n" +(4:0) "}\n" --> (4:0) "}\n" +(6:7) "async function secondAction() {\n" --> (6:0) "async function secondAction() {\n" +(7:0) " return 'second action called'\n" --> (7:0) " return 'second action called'\n" +(8:0) "}\n" --> (8:0) "}\n" +(2:0) "export async function firstAction() {\n" --> (9:0) "\n" +(2:0) "export async function firstAction() {\n" --> (10:0) "registerServerReference(firstAction, \"firstAction\");\n" +(2:0) "export async function firstAction() {\n" --> (11:0) "export { firstAction };\n" +(6:0) "export async function secondAction() {\n" --> (12:0) "\n" +(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" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.snap.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.snap.js deleted file mode 100644 index 4cdb47bf3..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.snap.js +++ /dev/null @@ -1,19 +0,0 @@ -/* -Source map visualization: - -https://evanw.github.io/source-map-visualization/#MzYzACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZmlyc3RBY3Rpb24oKSB7CiAgcmV0dXJuICdmaXJzdCBhY3Rpb24gY2FsbGVkJwp9Cgphc3luYyBmdW5jdGlvbiBzZWNvbmRBY3Rpb24oKSB7CiAgcmV0dXJuICdzZWNvbmQgYWN0aW9uIGNhbGxlZCcKfQpmaXJzdEFjdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShmaXJzdEFjdGlvbiwgImZpcnN0QWN0aW9uIik7CmV4cG9ydCB7IGZpcnN0QWN0aW9uIH07CnNlY29uZEFjdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShzZWNvbmRBY3Rpb24sICJzZWNvbmRBY3Rpb24iKTsKZXhwb3J0IHsgc2Vjb25kQWN0aW9uIH07CjUwNAB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlyc3RBY3Rpb24oKSB7XG4gIHJldHVybiAnZmlyc3QgYWN0aW9uIGNhbGxlZCdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlY29uZEFjdGlvbigpIHtcbiAgcmV0dXJuICdzZWNvbmQgYWN0aW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNO0FBQzdCOztBQUVPLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNO0FBQzlCO0FBTkE7QUFBQTtBQUlBO0FBQUE7In0= -*/ - -'use server' - -async function firstAction() { - return 'first action called' -} - -async function secondAction() { - return 'second action called' -} -firstAction = /* #__PURE__ */ registerServerReference(firstAction, "firstAction"); -export { firstAction }; -secondAction = /* #__PURE__ */ registerServerReference(secondAction, "secondAction"); -export { secondAction }; 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 new file mode 100644 index 000000000..20e24de54 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/multiple-exports.js.snap.md @@ -0,0 +1,63 @@ +## Input + +```js +'use server' + +export async function firstAction() { + return 'first action called' +} + +export async function secondAction() { + return 'second action called' +} +``` + +## wrap-export + +**Status:** transformed + +**References:** firstAction, secondAction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzYzACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZmlyc3RBY3Rpb24oKSB7CiAgcmV0dXJuICdmaXJzdCBhY3Rpb24gY2FsbGVkJwp9Cgphc3luYyBmdW5jdGlvbiBzZWNvbmRBY3Rpb24oKSB7CiAgcmV0dXJuICdzZWNvbmQgYWN0aW9uIGNhbGxlZCcKfQpmaXJzdEFjdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShmaXJzdEFjdGlvbiwgImZpcnN0QWN0aW9uIik7CmV4cG9ydCB7IGZpcnN0QWN0aW9uIH07CnNlY29uZEFjdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZShzZWNvbmRBY3Rpb24sICJzZWNvbmRBY3Rpb24iKTsKZXhwb3J0IHsgc2Vjb25kQWN0aW9uIH07CjUwNAB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlyc3RBY3Rpb24oKSB7XG4gIHJldHVybiAnZmlyc3QgYWN0aW9uIGNhbGxlZCdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlY29uZEFjdGlvbigpIHtcbiAgcmV0dXJuICdzZWNvbmQgYWN0aW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNO0FBQzdCOztBQUVPLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNO0FBQzlCO0FBTkE7QUFBQTtBQUlBO0FBQUE7In0=) + +```js +'use server' + +async function firstAction() { + return 'first action called' +} + +async function secondAction() { + return 'second action called' +} +firstAction = /* #__PURE__ */ registerServerReference(firstAction, "firstAction"); +export { firstAction }; +secondAction = /* #__PURE__ */ registerServerReference(secondAction, "secondAction"); +export { secondAction }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** firstAction, secondAction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzA0ACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gZmlyc3RBY3Rpb24oKSB7CiAgcmV0dXJuICdmaXJzdCBhY3Rpb24gY2FsbGVkJwp9Cgphc3luYyBmdW5jdGlvbiBzZWNvbmRBY3Rpb24oKSB7CiAgcmV0dXJuICdzZWNvbmQgYWN0aW9uIGNhbGxlZCcKfQoKcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoZmlyc3RBY3Rpb24sICJmaXJzdEFjdGlvbiIpOwpleHBvcnQgeyBmaXJzdEFjdGlvbiB9OwoKcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2Uoc2Vjb25kQWN0aW9uLCAic2Vjb25kQWN0aW9uIik7CmV4cG9ydCB7IHNlY29uZEFjdGlvbiB9Owo1MTQAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpcnN0QWN0aW9uKCkge1xuICByZXR1cm4gJ2ZpcnN0IGFjdGlvbiBjYWxsZWQnXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWNvbmRBY3Rpb24oKSB7XG4gIHJldHVybiAnc2Vjb25kIGFjdGlvbiBjYWxsZWQnXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7QUFFSixLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTTtBQUM3Qjs7QUFFTyxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTTtBQUM5QjtBQU5BO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFBQTsifQ==) + +```js +'use server' + +async function firstAction() { + return 'first action called' +} + +async function secondAction() { + return 'second action called' +} + +registerServerReference(firstAction, "firstAction"); +export { firstAction }; + +registerServerReference(secondAction, "secondAction"); +export { secondAction }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js new file mode 100644 index 000000000..169221675 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js @@ -0,0 +1,5 @@ +'use server' + +export const action = async function actionImplementation() { + return 'named function expression called' +} 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 new file mode 100644 index 000000000..930094923 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js.map.snap.md @@ -0,0 +1,23 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "const" --> (2:0) "let" +(2:12) " action = async function actionImplementation() {\n" --> (2:3) " action = async function actionImplementation() {\n" +(3:0) " return 'named function expression called'\n" --> (3:0) " return 'named function expression called'\n" +(4:0) "}\n" --> (4:0) "}\n" +(2:0) "export const action = async function actionImplementation() {\n" --> (5:0) "action = /* #__PURE__ */ registerServerReference(action, \"action\");\n" +(2:0) "export const action = async function actionImplementation() {\n" --> (6:0) "export { action };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "const action = async function actionImplementation() {\n" --> (2:0) "const action = async function actionImplementation() {\n" +(3:0) " return 'named function expression called'\n" --> (3:0) " return 'named function expression called'\n" +(4:0) "}\n" --> (4:0) "}\n" +(2:0) "export const action = async function actionImplementation() {\n" --> (5:0) "\n" +(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" +``` 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 new file mode 100644 index 000000000..585c9c147 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function-expression.js.snap.md @@ -0,0 +1,46 @@ +## Input + +```js +'use server' + +export const action = async function actionImplementation() { + return 'named function expression called' +} +``` + +## wrap-export + +**Status:** transformed + +**References:** action + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjAwACd1c2Ugc2VydmVyJwoKbGV0IGFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkltcGxlbWVudGF0aW9uKCkgewogIHJldHVybiAnbmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbiBjYWxsZWQnCn0KYWN0aW9uID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGFjdGlvbiwgImFjdGlvbiIpOwpleHBvcnQgeyBhY3Rpb24gfTsKMzg3AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBjb25zdCBhY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBhY3Rpb25JbXBsZW1lbnRhdGlvbigpIHtcbiAgcmV0dXJuICduYW1lZCBmdW5jdGlvbiBleHByZXNzaW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLEdBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNO0FBQzFDO0FBRkE7QUFBQTsifQ==) + +```js +'use server' + +let action = async function actionImplementation() { + return 'named function expression called' +} +action = /* #__PURE__ */ registerServerReference(action, "action"); +export { action }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** action + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTc4ACd1c2Ugc2VydmVyJwoKY29uc3QgYWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gYWN0aW9uSW1wbGVtZW50YXRpb24oKSB7CiAgcmV0dXJuICduYW1lZCBmdW5jdGlvbiBleHByZXNzaW9uIGNhbGxlZCcKfQoKcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoYWN0aW9uLCAiYWN0aW9uIik7CmV4cG9ydCB7IGFjdGlvbiB9OwozOTIAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGNvbnN0IGFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkltcGxlbWVudGF0aW9uKCkge1xuICByZXR1cm4gJ25hbWVkIGZ1bmN0aW9uIGV4cHJlc3Npb24gY2FsbGVkJ1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRUosS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU07QUFDMUM7QUFGQTtBQUFBO0FBQUE7In0=) + +```js +'use server' + +const action = async function actionImplementation() { + return 'named function expression called' +} + +registerServerReference(action, "action"); +export { 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 new file mode 100644 index 000000000..291d2b0c3 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.map.snap.md @@ -0,0 +1,22 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "async function namedFunction() {\n" --> (2:0) "async function namedFunction() {\n" +(3:0) " return 'named function called'\n" --> (3:0) " return 'named function called'\n" +(4:0) "}\n" --> (4:0) "}\n" +(2:0) "export async function namedFunction() {\n" --> (5:0) "namedFunction = /* #__PURE__ */ registerServerReference(namedFunction, \"namedFunction\");\n" +(2:0) "export async function namedFunction() {\n" --> (6:0) "export { namedFunction };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "async function namedFunction() {\n" --> (2:0) "async function namedFunction() {\n" +(3:0) " return 'named function called'\n" --> (3:0) " return 'named function called'\n" +(4:0) "}\n" --> (4:0) "}\n" +(2:0) "export async function namedFunction() {\n" --> (5:0) "\n" +(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" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.map.snap.txt b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.map.snap.txt deleted file mode 100644 index 55aaef07d..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.map.snap.txt +++ /dev/null @@ -1,6 +0,0 @@ -(0:0) "'use server'\n" --> (0:0) "'use server'\n" -(2:7) "async function namedFunction() {\n" --> (2:0) "async function namedFunction() {\n" -(3:0) " return 'named function called'\n" --> (3:0) " return 'named function called'\n" -(4:0) "}\n" --> (4:0) "}\n" -(2:0) "export async function namedFunction() {\n" --> (5:0) "namedFunction = /* #__PURE__ */ registerServerReference(namedFunction, \"namedFunction\");\n" -(2:0) "export async function namedFunction() {\n" --> (6:0) "export { namedFunction };\n" diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.snap.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.snap.js deleted file mode 100644 index 3f597bb58..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.snap.js +++ /dev/null @@ -1,13 +0,0 @@ -/* -Source map visualization: - -https://evanw.github.io/source-map-visualization/#MTk3ACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gbmFtZWRGdW5jdGlvbigpIHsKICByZXR1cm4gJ25hbWVkIGZ1bmN0aW9uIGNhbGxlZCcKfQpuYW1lZEZ1bmN0aW9uID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKG5hbWVkRnVuY3Rpb24sICJuYW1lZEZ1bmN0aW9uIik7CmV4cG9ydCB7IG5hbWVkRnVuY3Rpb24gfTsKMzEyAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuYW1lZEZ1bmN0aW9uKCkge1xuICByZXR1cm4gJ25hbWVkIGZ1bmN0aW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0FBQy9CO0FBRkE7QUFBQTsifQ== -*/ - -'use server' - -async function namedFunction() { - return 'named function called' -} -namedFunction = /* #__PURE__ */ registerServerReference(namedFunction, "namedFunction"); -export { namedFunction }; 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 new file mode 100644 index 000000000..e6fb50e56 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/named-function.js.snap.md @@ -0,0 +1,46 @@ +## Input + +```js +'use server' + +export async function namedFunction() { + return 'named function called' +} +``` + +## wrap-export + +**Status:** transformed + +**References:** namedFunction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTk3ACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gbmFtZWRGdW5jdGlvbigpIHsKICByZXR1cm4gJ25hbWVkIGZ1bmN0aW9uIGNhbGxlZCcKfQpuYW1lZEZ1bmN0aW9uID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKG5hbWVkRnVuY3Rpb24sICJuYW1lZEZ1bmN0aW9uIik7CmV4cG9ydCB7IG5hbWVkRnVuY3Rpb24gfTsKMzEyAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuYW1lZEZ1bmN0aW9uKCkge1xuICByZXR1cm4gJ25hbWVkIGZ1bmN0aW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVKLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0FBQy9CO0FBRkE7QUFBQTsifQ==) + +```js +'use server' + +async function namedFunction() { + return 'named function called' +} +namedFunction = /* #__PURE__ */ registerServerReference(namedFunction, "namedFunction"); +export { namedFunction }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** namedFunction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTY2ACd1c2Ugc2VydmVyJwoKYXN5bmMgZnVuY3Rpb24gbmFtZWRGdW5jdGlvbigpIHsKICByZXR1cm4gJ25hbWVkIGZ1bmN0aW9uIGNhbGxlZCcKfQoKcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UobmFtZWRGdW5jdGlvbiwgIm5hbWVkRnVuY3Rpb24iKTsKZXhwb3J0IHsgbmFtZWRGdW5jdGlvbiB9OwozMTcAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5hbWVkRnVuY3Rpb24oKSB7XG4gIHJldHVybiAnbmFtZWQgZnVuY3Rpb24gY2FsbGVkJ1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRUosS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU07QUFDL0I7QUFGQTtBQUFBO0FBQUE7In0=) + +```js +'use server' + +async function namedFunction() { + return 'named function called' +} + +registerServerReference(namedFunction, "namedFunction"); +export { namedFunction }; +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js new file mode 100644 index 000000000..151114097 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js @@ -0,0 +1,7 @@ +'use server' + +void action + +export async function action() { + return 'action called' +} 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 new file mode 100644 index 000000000..8ac8287a0 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js.map.snap.md @@ -0,0 +1,24 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "void action\n" --> (2:0) "void action\n" +(4:7) "async function action() {\n" --> (4:0) "async function action() {\n" +(5:0) " return 'action called'\n" --> (5:0) " return 'action called'\n" +(6:0) "}\n" --> (6:0) "}\n" +(4:0) "export async function action() {\n" --> (7:0) "action = /* #__PURE__ */ registerServerReference(action, \"action\");\n" +(4:0) "export async function action() {\n" --> (8:0) "export { action };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "void action\n" --> (2:0) "void action\n" +(4:7) "async function action() {\n" --> (4:0) "async function action() {\n" +(5:0) " return 'action called'\n" --> (5:0) " return 'action called'\n" +(6:0) "}\n" --> (6:0) "}\n" +(4:0) "export async function action() {\n" --> (7:0) "\n" +(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" +``` 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 new file mode 100644 index 000000000..1229c1c36 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/pre-declaration-reference.js.snap.md @@ -0,0 +1,52 @@ +## Input + +```js +'use server' + +void action + +export async function action() { + return 'action called' +} +``` + +## wrap-export + +**Status:** transformed + +**References:** action + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTY3ACd1c2Ugc2VydmVyJwoKdm9pZCBhY3Rpb24KCmFzeW5jIGZ1bmN0aW9uIGFjdGlvbigpIHsKICByZXR1cm4gJ2FjdGlvbiBjYWxsZWQnCn0KYWN0aW9uID0gLyogI19fUFVSRV9fICovIHJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGFjdGlvbiwgImFjdGlvbiIpOwpleHBvcnQgeyBhY3Rpb24gfTsKMzE4AHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbnZvaWQgYWN0aW9uXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb24oKSB7XG4gIHJldHVybiAnYWN0aW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVYLElBQUksQ0FBQzs7QUFFRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNO0FBQ3ZCO0FBRkE7QUFBQTsifQ==) + +```js +'use server' + +void action + +async function action() { + return 'action called' +} +action = /* #__PURE__ */ registerServerReference(action, "action"); +export { action }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** action + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MTQzACd1c2Ugc2VydmVyJwoKdm9pZCBhY3Rpb24KCmFzeW5jIGZ1bmN0aW9uIGFjdGlvbigpIHsKICByZXR1cm4gJ2FjdGlvbiBjYWxsZWQnCn0KCnJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKGFjdGlvbiwgImFjdGlvbiIpOwpleHBvcnQgeyBhY3Rpb24gfTsKMzIzAHsidmVyc2lvbiI6Mywic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzZXJ2ZXInXG5cbnZvaWQgYWN0aW9uXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb24oKSB7XG4gIHJldHVybiAnYWN0aW9uIGNhbGxlZCdcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLEdBQUcsQ0FBQyxNQUFNOztBQUVYLElBQUksQ0FBQzs7QUFFRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNO0FBQ3ZCO0FBRkE7QUFBQTtBQUFBOyJ9) + +```js +'use server' + +void action + +async function action() { + return 'action called' +} + +registerServerReference(action, "action"); +export { action }; +``` 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 new file mode 100644 index 000000000..62a46b8fe --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.map.snap.md @@ -0,0 +1,19 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +[unmapped] --> (3:0) ";\n" +[unmapped] --> (4:0) "import { reexportedAction as $$import_reexportedAction } from './reexport-source';\n" +[unmapped] --> (5:0) "const $$wrap_$$import_reexportedAction = /* #__PURE__ */ registerServerReference($$import_reexportedAction, \"reexportedAction\");\n" +[unmapped] --> (6:0) "export { $$wrap_$$import_reexportedAction as reexportedAction };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:0) "export { reexportedAction } from './reexport-source'\n" --> (3:0) "\n" +(2:0) "export { reexportedAction } from './reexport-source'\n" --> (4:0) "export { reexportedAction } from './reexport-source'\n" +(2:0) "export { reexportedAction } from './reexport-source'\n" --> (5:0) "registerServerReference($$effect_import_reexportedAction, \"reexportedAction\");\n" +[unmapped] --> (7:0) "import { reexportedAction as $$effect_import_reexportedAction } from './reexport-source';" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.map.snap.txt b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.map.snap.txt deleted file mode 100644 index 3d792327d..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.map.snap.txt +++ /dev/null @@ -1,5 +0,0 @@ -(0:0) "'use server'\n" --> (0:0) "'use server'\n" -[unmapped] --> (3:0) ";\n" -[unmapped] --> (4:0) "import { reexportedAction as $$import_reexportedAction } from './reexport-source';\n" -[unmapped] --> (5:0) "const $$wrap_$$import_reexportedAction = /* #__PURE__ */ registerServerReference($$import_reexportedAction, \"reexportedAction\");\n" -[unmapped] --> (6:0) "export { $$wrap_$$import_reexportedAction as reexportedAction };\n" diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.snap.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.snap.js deleted file mode 100644 index f8c3429ef..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.snap.js +++ /dev/null @@ -1,13 +0,0 @@ -/* -Source map visualization: - -https://evanw.github.io/source-map-visualization/#Mjk0ACd1c2Ugc2VydmVyJwoKCjsKaW1wb3J0IHsgcmVleHBvcnRlZEFjdGlvbiBhcyAkJGltcG9ydF9yZWV4cG9ydGVkQWN0aW9uIH0gZnJvbSAnLi9yZWV4cG9ydC1zb3VyY2UnOwpjb25zdCAkJHdyYXBfJCRpbXBvcnRfcmVleHBvcnRlZEFjdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJGltcG9ydF9yZWV4cG9ydGVkQWN0aW9uLCAicmVleHBvcnRlZEFjdGlvbiIpOwpleHBvcnQgeyAkJHdyYXBfJCRpbXBvcnRfcmVleHBvcnRlZEFjdGlvbiBhcyByZWV4cG9ydGVkQWN0aW9uIH07CjE3NgB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5leHBvcnQgeyByZWV4cG9ydGVkQWN0aW9uIH0gZnJvbSAnLi9yZWV4cG9ydC1zb3VyY2UnXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7Ozs7OzsifQ== -*/ - -'use server' - - -; -import { reexportedAction as $$import_reexportedAction } from './reexport-source'; -const $$wrap_$$import_reexportedAction = /* #__PURE__ */ registerServerReference($$import_reexportedAction, "reexportedAction"); -export { $$wrap_$$import_reexportedAction as reexportedAction }; 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 new file mode 100644 index 000000000..84a29982d --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/reexport.js.snap.md @@ -0,0 +1,44 @@ +## Input + +```js +'use server' + +export { reexportedAction } from './reexport-source' +``` + +## wrap-export + +**Status:** transformed + +**References:** reexportedAction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#Mjk0ACd1c2Ugc2VydmVyJwoKCjsKaW1wb3J0IHsgcmVleHBvcnRlZEFjdGlvbiBhcyAkJGltcG9ydF9yZWV4cG9ydGVkQWN0aW9uIH0gZnJvbSAnLi9yZWV4cG9ydC1zb3VyY2UnOwpjb25zdCAkJHdyYXBfJCRpbXBvcnRfcmVleHBvcnRlZEFjdGlvbiA9IC8qICNfX1BVUkVfXyAqLyByZWdpc3RlclNlcnZlclJlZmVyZW5jZSgkJGltcG9ydF9yZWV4cG9ydGVkQWN0aW9uLCAicmVleHBvcnRlZEFjdGlvbiIpOwpleHBvcnQgeyAkJHdyYXBfJCRpbXBvcnRfcmVleHBvcnRlZEFjdGlvbiBhcyByZWV4cG9ydGVkQWN0aW9uIH07CjE3NgB7InZlcnNpb24iOjMsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc2VydmVyJ1xuXG5leHBvcnQgeyByZWV4cG9ydGVkQWN0aW9uIH0gZnJvbSAnLi9yZWV4cG9ydC1zb3VyY2UnXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxHQUFHLENBQUMsTUFBTTs7Ozs7OzsifQ==) + +```js +'use server' + + +; +import { reexportedAction as $$import_reexportedAction } from './reexport-source'; +const $$wrap_$$import_reexportedAction = /* #__PURE__ */ registerServerReference($$import_reexportedAction, "reexportedAction"); +export { $$wrap_$$import_reexportedAction as reexportedAction }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** reexportedAction + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MjM4ACd1c2Ugc2VydmVyJwoKCgpleHBvcnQgeyByZWV4cG9ydGVkQWN0aW9uIH0gZnJvbSAnLi9yZWV4cG9ydC1zb3VyY2UnCnJlZ2lzdGVyU2VydmVyUmVmZXJlbmNlKCQkZWZmZWN0X2ltcG9ydF9yZWV4cG9ydGVkQWN0aW9uLCAicmVleHBvcnRlZEFjdGlvbiIpOwoKaW1wb3J0IHsgcmVleHBvcnRlZEFjdGlvbiBhcyAkJGVmZmVjdF9pbXBvcnRfcmVleHBvcnRlZEFjdGlvbiB9IGZyb20gJy4vcmVleHBvcnQtc291cmNlJzsxODgAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IHsgcmVleHBvcnRlZEFjdGlvbiB9IGZyb20gJy4vcmVleHBvcnQtc291cmNlJ1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07OztBQUVYO0FBQUE7QUFBQTs7In0=) + +```js +'use server' + + + +export { reexportedAction } from './reexport-source' +registerServerReference($$effect_import_reexportedAction, "reexportedAction"); + +import { reexportedAction as $$effect_import_reexportedAction } from './reexport-source'; +``` 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 new file mode 100644 index 000000000..d9a0477ce --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.map.snap.md @@ -0,0 +1,31 @@ +## wrap-export + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "const" --> (2:0) "let" +(2:12) " arrowFunction = async () => 'arrow function called'\n" --> (2:3) " arrowFunction = async () => 'arrow function called'\n" +(4:7) "const" --> (4:0) "let" +(4:12) " functionExpression = async function () {\n" --> (4:3) " functionExpression = async function () {\n" +(5:0) " return 'function expression called'\n" --> (5:0) " return 'function expression called'\n" +(6:0) "}\n" --> (6:0) "}\n" +(2:0) "export const arrowFunction = async () => 'arrow function called'\n" --> (7:0) "arrowFunction = /* #__PURE__ */ registerServerReference(arrowFunction, \"arrowFunction\");\n" +(2:0) "export const arrowFunction = async () => 'arrow function called'\n" --> (8:0) "export { arrowFunction };\n" +(4:0) "export const functionExpression = async function () {\n" --> (9:0) "functionExpression = /* #__PURE__ */ registerServerReference(functionExpression, \"functionExpression\");\n" +(4:0) "export const functionExpression = async function () {\n" --> (10:0) "export { functionExpression };\n" +``` + +## module-export-effect + +```txt +(0:0) "'use server'\n" --> (0:0) "'use server'\n" +(2:7) "const arrowFunction = async () => 'arrow function called'\n" --> (2:0) "const arrowFunction = async () => 'arrow function called'\n" +(4:7) "const functionExpression = async function () {\n" --> (4:0) "const functionExpression = async function () {\n" +(5:0) " return 'function expression called'\n" --> (5:0) " return 'function expression called'\n" +(6:0) "}\n" --> (6:0) "}\n" +(2:0) "export const arrowFunction = async () => 'arrow function called'\n" --> (7:0) "\n" +(2:0) "export const arrowFunction = async () => 'arrow function called'\n" --> (8:0) "registerServerReference(arrowFunction, \"arrowFunction\");\n" +(2:0) "export const arrowFunction = async () => 'arrow function called'\n" --> (9:0) "export { arrowFunction };\n" +(4:0) "export const functionExpression = async function () {\n" --> (10:0) "\n" +(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" +``` diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.map.snap.txt b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.map.snap.txt deleted file mode 100644 index 4ae4a9a12..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.map.snap.txt +++ /dev/null @@ -1,11 +0,0 @@ -(0:0) "'use server'\n" --> (0:0) "'use server'\n" -(2:7) "const" --> (2:0) "let" -(2:12) " arrowFunction = async () => 'arrow function called'\n" --> (2:3) " arrowFunction = async () => 'arrow function called'\n" -(4:7) "const" --> (4:0) "let" -(4:12) " functionExpression = async function () {\n" --> (4:3) " functionExpression = async function () {\n" -(5:0) " return 'function expression called'\n" --> (5:0) " return 'function expression called'\n" -(6:0) "}\n" --> (6:0) "}\n" -(2:0) "export const arrowFunction = async () => 'arrow function called'\n" --> (7:0) "arrowFunction = /* #__PURE__ */ registerServerReference(arrowFunction, \"arrowFunction\");\n" -(2:0) "export const arrowFunction = async () => 'arrow function called'\n" --> (8:0) "export { arrowFunction };\n" -(4:0) "export const functionExpression = async function () {\n" --> (9:0) "functionExpression = /* #__PURE__ */ registerServerReference(functionExpression, \"functionExpression\");\n" -(4:0) "export const functionExpression = async function () {\n" --> (10:0) "export { functionExpression };\n" diff --git a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.snap.js b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.snap.js deleted file mode 100644 index 0c9760023..000000000 --- a/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.snap.js +++ /dev/null @@ -1,17 +0,0 @@ -/* -Source map visualization: - -https://evanw.github.io/source-map-visualization/#NDA2ACd1c2Ugc2VydmVyJwoKbGV0IGFycm93RnVuY3Rpb24gPSBhc3luYyAoKSA9PiAnYXJyb3cgZnVuY3Rpb24gY2FsbGVkJwoKbGV0IGZ1bmN0aW9uRXhwcmVzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uICgpIHsKICByZXR1cm4gJ2Z1bmN0aW9uIGV4cHJlc3Npb24gY2FsbGVkJwp9CmFycm93RnVuY3Rpb24gPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoYXJyb3dGdW5jdGlvbiwgImFycm93RnVuY3Rpb24iKTsKZXhwb3J0IHsgYXJyb3dGdW5jdGlvbiB9OwpmdW5jdGlvbkV4cHJlc3Npb24gPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoZnVuY3Rpb25FeHByZXNzaW9uLCAiZnVuY3Rpb25FeHByZXNzaW9uIik7CmV4cG9ydCB7IGZ1bmN0aW9uRXhwcmVzc2lvbiB9Owo1NDMAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGNvbnN0IGFycm93RnVuY3Rpb24gPSBhc3luYyAoKSA9PiAnYXJyb3cgZnVuY3Rpb24gY2FsbGVkJ1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25FeHByZXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2Z1bmN0aW9uIGV4cHJlc3Npb24gY2FsbGVkJ1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRUosR0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNOztBQUV4RCxHQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTTtBQUNwQztBQUpBO0FBQUE7QUFFQTtBQUFBOyJ9 -*/ - -'use server' - -let arrowFunction = async () => 'arrow function called' - -let functionExpression = async function () { - return 'function expression called' -} -arrowFunction = /* #__PURE__ */ registerServerReference(arrowFunction, "arrowFunction"); -export { arrowFunction }; -functionExpression = /* #__PURE__ */ registerServerReference(functionExpression, "functionExpression"); -export { functionExpression }; 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 new file mode 100644 index 000000000..b806e656f --- /dev/null +++ b/packages/plugin-rsc/src/transforms/fixtures/source-map/wrap-export/variables.js.snap.md @@ -0,0 +1,57 @@ +## Input + +```js +'use server' + +export const arrowFunction = async () => 'arrow function called' + +export const functionExpression = async function () { + return 'function expression called' +} +``` + +## wrap-export + +**Status:** transformed + +**References:** arrowFunction, functionExpression + +[Source map visualization](https://evanw.github.io/source-map-visualization/#NDA2ACd1c2Ugc2VydmVyJwoKbGV0IGFycm93RnVuY3Rpb24gPSBhc3luYyAoKSA9PiAnYXJyb3cgZnVuY3Rpb24gY2FsbGVkJwoKbGV0IGZ1bmN0aW9uRXhwcmVzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uICgpIHsKICByZXR1cm4gJ2Z1bmN0aW9uIGV4cHJlc3Npb24gY2FsbGVkJwp9CmFycm93RnVuY3Rpb24gPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoYXJyb3dGdW5jdGlvbiwgImFycm93RnVuY3Rpb24iKTsKZXhwb3J0IHsgYXJyb3dGdW5jdGlvbiB9OwpmdW5jdGlvbkV4cHJlc3Npb24gPSAvKiAjX19QVVJFX18gKi8gcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoZnVuY3Rpb25FeHByZXNzaW9uLCAiZnVuY3Rpb25FeHByZXNzaW9uIik7CmV4cG9ydCB7IGZ1bmN0aW9uRXhwcmVzc2lvbiB9Owo1NDMAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGNvbnN0IGFycm93RnVuY3Rpb24gPSBhc3luYyAoKSA9PiAnYXJyb3cgZnVuY3Rpb24gY2FsbGVkJ1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25FeHByZXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2Z1bmN0aW9uIGV4cHJlc3Npb24gY2FsbGVkJ1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRUosR0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNOztBQUV4RCxHQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTTtBQUNwQztBQUpBO0FBQUE7QUFFQTtBQUFBOyJ9) + +```js +'use server' + +let arrowFunction = async () => 'arrow function called' + +let functionExpression = async function () { + return 'function expression called' +} +arrowFunction = /* #__PURE__ */ registerServerReference(arrowFunction, "arrowFunction"); +export { arrowFunction }; +functionExpression = /* #__PURE__ */ registerServerReference(functionExpression, "functionExpression"); +export { functionExpression }; +``` + +## module-export-effect + +**Status:** transformed + +**References:** arrowFunction, functionExpression + +[Source map visualization](https://evanw.github.io/source-map-visualization/#MzQzACd1c2Ugc2VydmVyJwoKY29uc3QgYXJyb3dGdW5jdGlvbiA9IGFzeW5jICgpID0+ICdhcnJvdyBmdW5jdGlvbiBjYWxsZWQnCgpjb25zdCBmdW5jdGlvbkV4cHJlc3Npb24gPSBhc3luYyBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuICdmdW5jdGlvbiBleHByZXNzaW9uIGNhbGxlZCcKfQoKcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoYXJyb3dGdW5jdGlvbiwgImFycm93RnVuY3Rpb24iKTsKZXhwb3J0IHsgYXJyb3dGdW5jdGlvbiB9OwoKcmVnaXN0ZXJTZXJ2ZXJSZWZlcmVuY2UoZnVuY3Rpb25FeHByZXNzaW9uLCAiZnVuY3Rpb25FeHByZXNzaW9uIik7CmV4cG9ydCB7IGZ1bmN0aW9uRXhwcmVzc2lvbiB9Owo1NTMAeyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcidcblxuZXhwb3J0IGNvbnN0IGFycm93RnVuY3Rpb24gPSBhc3luYyAoKSA9PiAnYXJyb3cgZnVuY3Rpb24gY2FsbGVkJ1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25FeHByZXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2Z1bmN0aW9uIGV4cHJlc3Npb24gY2FsbGVkJ1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsR0FBRyxDQUFDLE1BQU07O0FBRUosS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNOztBQUV4RCxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTTtBQUNwQztBQUpBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTsifQ==) + +```js +'use server' + +const arrowFunction = async () => 'arrow function called' + +const functionExpression = async function () { + return 'function expression called' +} + +registerServerReference(arrowFunction, "arrowFunction"); +export { arrowFunction }; + +registerServerReference(functionExpression, "functionExpression"); +export { functionExpression }; +``` diff --git a/packages/plugin-rsc/src/transforms/index.ts b/packages/plugin-rsc/src/transforms/index.ts index b37480dae..6147430da 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-effect' export * from './wrap-export' export * from './proxy-export' export * from './utils' diff --git a/packages/plugin-rsc/src/transforms/module-export-effect.test.ts b/packages/plugin-rsc/src/transforms/module-export-effect.test.ts new file mode 100644 index 000000000..7ec711fc8 --- /dev/null +++ b/packages/plugin-rsc/src/transforms/module-export-effect.test.ts @@ -0,0 +1,90 @@ +import { parseAstAsync } from 'vite' +import { describe, expect, test } from 'vitest' +import { + transformModuleExportEffect, + type TransformModuleExportEffectOptions, +} from './module-export-effect' + +async function transform( + input: string, + options: Omit = {}, +) { + const ast = await parseAstAsync(input) + return transformModuleExportEffect(input, ast, { + ...options, + runtime: ({ binding, exportName }) => + `register(${binding}, ${JSON.stringify(exportName)})`, + }) +} + +// TODO: port wrap-export unit test like options to exercise TransformModuleExportEffectOptions + +describe(transformModuleExportEffect, () => { + test('preserves declarations and emits effects after initialization', async () => { + const result = await transform(`\ +export async function action() {} +export const loader = async () => {}, value = 1 +export default async function Page() {} +`) + + expect(result.referenceNames).toEqual([ + 'action', + 'loader', + 'value', + 'default', + ]) + expect(result.output.toString()).toMatchInlineSnapshot(` + "async function action() {} + const loader = async () => {}, value = 1 + async function Page() {} + + register(action, "action"); + export { action }; + + register(loader, "loader"); + register(value, "value"); + export { loader, value }; + + register(Page, "default"); + export default Page; + " + `) + }) + + test('preserves mutable bindings and local export aliases', async () => { + const result = await transform(`\ +export { action as renamed } +let action = async () => 'first' +action = async () => 'second' +`) + + expect(result.referenceNames).toEqual(['renamed']) + expect(result.output.toString()).toMatchInlineSnapshot(` + " + let action = async () => 'first' + action = async () => 'second' + + register(action, "renamed"); + export { action as renamed } + " + `) + }) + + test('captures a default identifier before later reassignment', async () => { + const result = await transform(`\ +let action = async () => 'first' +export default action +action = async () => 'second' +`) + + expect(result.output.toString()).toMatchInlineSnapshot(` + "let action = async () => 'first' + const $$effect_default = action; + action = async () => 'second' + + register($$effect_default, "default"); + export default $$effect_default; + " + `) + }) +}) diff --git a/packages/plugin-rsc/src/transforms/module-export-effect.ts b/packages/plugin-rsc/src/transforms/module-export-effect.ts new file mode 100644 index 000000000..b25ef97cd --- /dev/null +++ b/packages/plugin-rsc/src/transforms/module-export-effect.ts @@ -0,0 +1,287 @@ +import { tinyassert } from '@hiogawa/utils' +import type { + ExportDefaultDeclaration, + Node, + Program, + VariableDeclaration, +} from 'estree' +import MagicString from 'magic-string' +import type { ESTree } from 'vite' +import { extractNames, validateNonAsyncFunction } from './utils' + +export type TransformModuleExportEffectMeta = { + localName?: string + declarationKind?: 'function' | 'class' | VariableDeclaration['kind'] + isFunction?: boolean + defaultExportIdentifierName?: string +} + +export type TransformModuleExportEffectFilter = ( + name: string, + meta: TransformModuleExportEffectMeta, +) => boolean + +export type TransformModuleExportEffectContext = { + binding: string + exportName: string + meta: TransformModuleExportEffectMeta +} + +export type TransformModuleExportEffectOptions = { + runtime: (context: TransformModuleExportEffectContext) => string + filter?: TransformModuleExportEffectFilter + rejectNonAsyncFunction?: boolean + exportAll?: 'error' | 'preserve' +} + +/** + * Preserves source bindings and emits registration effects at module end. + * + * The start of each generated runtime expression remains mapped to its original + * Server Function export site. React captures the `registerServerReference` + * caller as the reference source location, so unmapped generated code can fall + * back to an adjacent location. Re-exports map to their export statement. + */ +export function transformModuleExportEffect( + input: string, + viteAst: ESTree.Program, + options: TransformModuleExportEffectOptions, +): { + output: MagicString + references: TransformModuleExportEffectContext[] + referenceNames: string[] +} { + const ast = viteAst as unknown as Program + const output = new MagicString(input) + const filter = options.filter ?? (() => true) + const references: TransformModuleExportEffectContext[] = [] + + // Generated-name collision detection is intentionally out of scope, matching + // the other transform helpers. + + function generate(context: TransformModuleExportEffectContext): string { + references.push(context) + return `${options.runtime(context)};` + } + + // Rewrite and move an existing source range so the generated runtime + // expression retains that range's original mapping at module end. + function replaceAndMove( + start: number, + end: number, + destination: number, + code: string, + ): void { + output.update(start, end, `\n${code}\n`) + if (end !== destination) output.move(start, end, destination) + } + + for (const node of ast.body) { + if (node.type === 'ExportNamedDeclaration') { + if (node.declaration) { + if ( + node.declaration.type === 'FunctionDeclaration' || + node.declaration.type === 'ClassDeclaration' + ) { + tinyassert(node.declaration.id) + const binding = node.declaration.id.name + const meta: TransformModuleExportEffectMeta = { + localName: binding, + declarationKind: + node.declaration.type === 'FunctionDeclaration' + ? 'function' + : 'class', + isFunction: + node.declaration.type === 'FunctionDeclaration' ? true : false, + } + if (!filter(binding, meta)) continue + validateNonAsyncFunction(options, node.declaration) + replaceAndMove( + node.start, + node.declaration.start, + input.length, + `${generate({ binding, exportName: binding, meta })}\nexport { ${binding} };`, + ) + } else if (node.declaration.type === 'VariableDeclaration') { + const exportNames: string[] = [] + const effects: string[] = [] + for (const declaration of node.declaration.declarations) { + const names = extractNames(declaration.id) + exportNames.push(...names) + const isFunction = + declaration.id.type === 'Identifier' && declaration.init + ? getIsFunction(declaration.init) + : undefined + let validate = false + for (const binding of names) { + const meta: TransformModuleExportEffectMeta = { + localName: binding, + declarationKind: node.declaration.kind, + isFunction, + } + if (filter(binding, meta)) { + validate = true + effects.push(generate({ binding, exportName: binding, meta })) + } + } + if (validate && declaration.init) { + validateNonAsyncFunction(options, declaration.init) + } + } + if (effects.length > 0) { + replaceAndMove( + node.start, + node.declaration.start, + input.length, + `${effects.join('\n')}\nexport { ${exportNames.join(', ')} };`, + ) + } + } + } else { + const effects: string[] = [] + for (const specifier of node.specifiers) { + tinyassert(specifier.local.type === 'Identifier') + if (specifier.exported.type !== 'Identifier') { + throw Object.assign( + new Error('unsupported string literal export name'), + { pos: specifier.exported.start }, + ) + } + const exportName = specifier.exported.name + const meta: TransformModuleExportEffectMeta = {} + if (!filter(exportName, meta)) continue + + let binding = specifier.local.name + if (node.source) { + binding = `$$effect_import_${exportName}` + const sourceTail = input + .slice(node.source.end, node.end) + .replace(/;?\s*$/, ';') + output.append( + `\nimport { ${specifier.local.name} as ${binding} } from ${node.source.raw}${sourceTail}`, + ) + } + effects.push(generate({ binding, exportName, meta })) + } + if (effects.length > 0) { + const originalExport = input.slice(node.start, node.end) + if (node.source) { + replaceAndMove( + node.start, + node.end, + input.length, + `${originalExport}\n${effects.join('\n')}`, + ) + } else { + replaceAndMove( + node.start, + node.end, + input.length, + `${effects.join('\n')}\n${originalExport}`, + ) + } + } + } + } else if (node.type === 'ExportAllDeclaration') { + if (options.exportAll !== 'preserve') { + throw Object.assign(new Error('unsupported ExportAllDeclaration'), { + pos: node.start, + }) + } + } else if (node.type === 'ExportDefaultDeclaration') { + let binding: string + let meta: TransformModuleExportEffectMeta + if ( + (node.declaration.type === 'FunctionDeclaration' || + node.declaration.type === 'ClassDeclaration') && + node.declaration.id + ) { + binding = node.declaration.id.name + meta = { + localName: binding, + declarationKind: + node.declaration.type === 'FunctionDeclaration' + ? 'function' + : 'class', + isFunction: + node.declaration.type === 'FunctionDeclaration' ? true : false, + } + } else if (node.declaration.type === 'Identifier') { + binding = '$$effect_default' + meta = { defaultExportIdentifierName: node.declaration.name } + } else { + binding = '$$effect_default' + meta = { isFunction: getIsFunction(node.declaration) } + } + if (!filter('default', meta)) continue + validateNonAsyncFunction(options, node.declaration) + const effect = generate({ binding, exportName: 'default', meta }) + + if (node.declaration.type === 'Identifier') { + const exportTokenEnd = node.start + 'export'.length + output.update( + exportTokenEnd, + node.end, + `const ${binding} = ${node.declaration.name};`, + ) + replaceAndMove( + node.start, + exportTokenEnd, + input.length, + `${effect}\nexport default ${binding};`, + ) + } else if ( + (node.declaration.type === 'FunctionDeclaration' || + node.declaration.type === 'ClassDeclaration') && + node.declaration.id + ) { + replaceAndMove( + node.start, + node.declaration.start, + input.length, + `${effect}\nexport default ${binding};`, + ) + } else { + const exportTokenEnd = node.start + 'export'.length + output.update( + exportTokenEnd, + node.declaration.start, + `const ${binding} = `, + ) + replaceAndMove( + node.start, + exportTokenEnd, + input.length, + `${effect}\nexport default ${binding};`, + ) + } + } + } + + return { + output, + references, + referenceNames: references.map((reference) => reference.exportName), + } +} + +function getIsFunction( + node: Node | ExportDefaultDeclaration['declaration'], +): boolean | undefined { + if ( + node.type === 'FunctionDeclaration' || + node.type === 'FunctionExpression' || + node.type === 'ArrowFunctionExpression' + ) { + return true + } + if ( + node.type === 'ClassDeclaration' || + node.type === 'Literal' || + node.type === 'ObjectExpression' || + node.type === 'ArrayExpression' || + node.type === 'ClassExpression' + ) { + return false + } +} diff --git a/packages/plugin-rsc/src/transforms/server-action.ts b/packages/plugin-rsc/src/transforms/server-action.ts index 6f97bf09c..19e650ad3 100644 --- a/packages/plugin-rsc/src/transforms/server-action.ts +++ b/packages/plugin-rsc/src/transforms/server-action.ts @@ -1,15 +1,9 @@ import type MagicString from 'magic-string' import type { ESTree } from 'vite' import { transformHoistInlineDirective } from './hoist' +import { transformModuleExportEffect } from './module-export-effect' import { hasDirective } from './utils' -import { transformWrapExport } from './wrap-export' -// TODO: Map the start of every generated `runtime(...)` expression to its -// original Server Function declaration or expression. React captures the -// `registerServerReference` caller as the reference's source location, so -// unmapped generated code can fall back to an adjacent source position. For -// re-exports without a local definition, map to the export statement instead. -// https://github.com/vitejs/vite-plugin-react/issues/1361 export function transformServerActionServer( input: string, ast: ESTree.Program, @@ -32,8 +26,12 @@ export function transformServerActionServer( } { // TODO: unify (generalize transformHoistInlineDirective to support top-level directive cases) if (hasDirective(ast.body, 'use server')) { - const result = transformWrapExport(input, ast, options) - return { ...result, referenceNames: result.exportNames } + const result = transformModuleExportEffect(input, ast, { + rejectNonAsyncFunction: options.rejectNonAsyncFunction, + runtime: ({ binding, exportName }) => + options.runtime(binding, exportName), + }) + return { ...result, exportNames: result.referenceNames } } const result = transformHoistInlineDirective(input, ast, { ...options, diff --git a/packages/plugin-rsc/src/transforms/source-map.test.ts b/packages/plugin-rsc/src/transforms/source-map.test.ts index 56c03c3af..683b91b50 100644 --- a/packages/plugin-rsc/src/transforms/source-map.test.ts +++ b/packages/plugin-rsc/src/transforms/source-map.test.ts @@ -2,7 +2,11 @@ import path from 'node:path' import { parseAstAsync } from 'vite' import { describe, expect, test } from 'vitest' import { transformHoistInlineDirective } from './hoist' -import { formatDecodedSourceMap, formatSourceMapFixture } from './test-utils' +import { transformModuleExportEffect } from './module-export-effect' +import { + formatDecodedSourceMapMarkdown, + formatSourceMapMarkdownFixture, +} from './test-utils' import { transformWrapExport } from './wrap-export' describe('source map fixtures', () => { @@ -10,36 +14,39 @@ describe('source map fixtures', () => { ['./fixtures/source-map/wrap-export/**/*.js', '!**/*.snap.*'], { query: 'raw' }, ) - // Generated `registerServerReference(...)` calls should map to the original - // Server Function definition, or to the export statement for re-exports. - const textualMapFixtures = new Set([ - './fixtures/source-map/wrap-export/named-function.js', - './fixtures/source-map/wrap-export/variables.js', - - // TODO: These registrations are currently unmapped. - // https://github.com/vitejs/vite-plugin-react/issues/1361 - './fixtures/source-map/wrap-export/default-anonymous.js', - './fixtures/source-map/wrap-export/default-named.js', - './fixtures/source-map/wrap-export/local-alias.js', - './fixtures/source-map/wrap-export/reexport.js', - ]) - + // Generated runtime expressions should map to the original Server Function + // export site, or to the export statement for re-exports. React uses the + // `registerServerReference` caller as the reference's source location. for (const [file, load] of Object.entries(wrapExportFixtures)) { - test(`wrap-export/${path.basename(file)}`, async () => { + test(`module-export/${path.basename(file)}`, async () => { const input = ((await load()) as any).default as string const ast = await parseAstAsync(input) - const result = transformWrapExport(input, ast, { + const wrapResult = transformWrapExport(input, ast, { runtime: (value, name) => `registerServerReference(${value}, ${JSON.stringify(name)})`, }) - await expect(formatSourceMapFixture(result.output)).toMatchFileSnapshot( - file + '.snap.js', + const effectResult = transformModuleExportEffect(input, ast, { + runtime: ({ binding, exportName }) => + `registerServerReference(${binding}, ${JSON.stringify(exportName)})`, + }) + const outputs = [ + { + name: 'wrap-export', + output: wrapResult.output, + references: wrapResult.exportNames, + }, + { + name: 'module-export-effect', + output: effectResult.output, + references: effectResult.referenceNames, + }, + ] + await expect( + formatSourceMapMarkdownFixture(input, outputs), + ).toMatchFileSnapshot(file + '.snap.md') + await expect(formatDecodedSourceMapMarkdown(outputs)).toMatchFileSnapshot( + file + '.map.snap.md', ) - if (textualMapFixtures.has(file)) { - await expect(formatDecodedSourceMap(result.output)).toMatchFileSnapshot( - file + '.map.snap.txt', - ) - } }) } @@ -59,11 +66,18 @@ describe('source map fixtures', () => { encode: (value) => `encrypt(${value})`, decode: (value) => `await decrypt(${value})`, }) - await expect(formatSourceMapFixture(result.output)).toMatchFileSnapshot( - file + '.snap.js', - ) - await expect(formatDecodedSourceMap(result.output)).toMatchFileSnapshot( - file + '.map.snap.txt', + const outputs = [ + { + name: 'hoist', + output: result.output, + references: result.names, + }, + ] + await expect( + formatSourceMapMarkdownFixture(input, outputs), + ).toMatchFileSnapshot(file + '.snap.md') + await expect(formatDecodedSourceMapMarkdown(outputs)).toMatchFileSnapshot( + file + '.map.snap.md', ) }) } diff --git a/packages/plugin-rsc/src/transforms/test-utils.ts b/packages/plugin-rsc/src/transforms/test-utils.ts index ce090da88..78783fbd8 100644 --- a/packages/plugin-rsc/src/transforms/test-utils.ts +++ b/packages/plugin-rsc/src/transforms/test-utils.ts @@ -1,16 +1,52 @@ import type MagicString from 'magic-string' -export function formatSourceMapFixture(output: MagicString): string { - const code = output.toString() - const map = output.generateMap({ includeContent: true, hires: 'boundary' }) - const visualization = generateVisualizationLink(code, map.toString()) - return `/* -Source map visualization: +type SourceMapFixtureOutput = { + name: string + output: MagicString + references?: readonly string[] +} + +export function formatSourceMapMarkdownFixture( + input: string, + outputs: readonly SourceMapFixtureOutput[], +): string { + const sections = [] + sections.push(`\ +## Input + +${formatCodeBlock('js', input)}`) + for (const { name, output, references } of outputs) { + const code = output.toString() + const map = output.generateMap({ includeContent: true, hires: 'boundary' }) + const visualization = generateVisualizationLink(code, map.toString()) + sections.push(`\ +## ${name} + +**Status:** ${output.hasChanged() ? 'transformed' : 'unchanged'} + +**References:** ${references?.join(', ') || '(none)'} + +[Source map visualization](${visualization}) -${visualization} -*/ +${formatCodeBlock('js', code)}`) + } + return sections.join('\n\n') + '\n' +} + +export function formatDecodedSourceMapMarkdown( + outputs: readonly SourceMapFixtureOutput[], +): string { + return ( + outputs + .map( + ({ name, output }) => + `\ +## ${name} -${code}` +${formatCodeBlock('txt', formatDecodedSourceMap(output))}`, + ) + .join('\n\n') + '\n' + ) } /** @@ -18,7 +54,7 @@ ${code}` * This test-local formatter is inspired by Oxc's source map visualizer output: * https://github.com/oxc-project/oxc-sourcemap/blob/main/src/sourcemap_visualizer.rs */ -export function formatDecodedSourceMap(output: MagicString): string { +function formatDecodedSourceMap(output: MagicString): string { const generatedLines = output.toString().split('\n') const map = output.generateDecodedMap({ includeContent: true, @@ -125,6 +161,10 @@ function sliceLine( return end === undefined && line < lines.length - 1 ? result + '\n' : result } +function formatCodeBlock(language: string, code: string): string { + return `\`\`\`${language}\n${code}${code.endsWith('\n') ? '' : '\n'}\`\`\`` +} + function generateVisualizationLink(code: string, map: string): string { const codeBuffer = Buffer.from(code) const mapBuffer = Buffer.from(map) diff --git a/packages/plugin-rsc/src/transforms/waku.test.ts b/packages/plugin-rsc/src/transforms/waku.test.ts index dfe5a1e5a..37e30e410 100644 --- a/packages/plugin-rsc/src/transforms/waku.test.ts +++ b/packages/plugin-rsc/src/transforms/waku.test.ts @@ -160,7 +160,7 @@ export default async function() { const privateFunction = () => 'Secret'; - let log = async (mesg) => { + const log = async (mesg) => { console.log(mesg); }; @@ -168,16 +168,18 @@ export default async function() { return 'Hello ' + name; } - const $$default = async function() { + const $$effect_default = async function() { return Date.now(); } - log = /* #__PURE__ */ $runtime(log, "", "log"); + + $runtime(log, "", "log"); export { log }; - greet = /* #__PURE__ */ $runtime(greet, "", "greet"); + + $runtime(greet, "", "greet"); export { greet }; - ; - const $$wrap_$$default = /* #__PURE__ */ $runtime($$default, "", "default"); - export { $$wrap_$$default as default }; + + $runtime($$effect_default, "", "default"); + export default $$effect_default; " `) }) @@ -256,12 +258,13 @@ export default async () => null; return null; } - const $$default = async () => null; - exportedAction = /* #__PURE__ */ $runtime(exportedAction, "", "exportedAction"); + const $$effect_default = async () => null; + + $runtime(exportedAction, "", "exportedAction"); export { exportedAction }; - ; - const $$wrap_$$default = /* #__PURE__ */ $runtime($$default, "", "default"); - export { $$wrap_$$default as default }; + + $runtime($$effect_default, "", "default"); + export default $$effect_default; " `) })