rwsdk 0.1.16 → 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/$.d.mts +8 -0
- package/dist/lib/$.mjs +5 -0
- package/dist/lib/compileTsModule.d.mts +1 -0
- package/dist/lib/compileTsModule.mjs +27 -0
- package/dist/lib/constants.d.mts +4 -0
- package/dist/lib/constants.mjs +6 -0
- package/dist/lib/findWranglerConfig.d.mts +1 -0
- package/dist/lib/findWranglerConfig.mjs +12 -0
- package/dist/lib/getShortName.d.mts +1 -0
- package/dist/lib/getShortName.mjs +2 -0
- package/dist/lib/getSrcPaths.d.ts +15 -0
- package/dist/lib/getSrcPaths.js +80 -0
- package/dist/lib/hasPkgScript.d.mts +1 -0
- package/dist/lib/hasPkgScript.mjs +9 -0
- package/dist/lib/jsonUtils.d.mts +28 -0
- package/dist/lib/jsonUtils.mjs +167 -0
- package/dist/lib/setupEnvFiles.d.mts +4 -0
- package/dist/lib/setupEnvFiles.mjs +31 -0
- package/dist/lib/smokeTests/artifacts.d.mts +10 -0
- package/dist/lib/smokeTests/artifacts.mjs +164 -0
- package/dist/lib/smokeTests/browser.d.mts +48 -0
- package/dist/lib/smokeTests/browser.mjs +1041 -0
- package/dist/lib/smokeTests/cleanup.d.mts +5 -0
- package/dist/lib/smokeTests/cleanup.mjs +214 -0
- package/dist/lib/smokeTests/codeUpdates.d.mts +8 -0
- package/dist/lib/smokeTests/codeUpdates.mjs +229 -0
- package/dist/lib/smokeTests/constants.d.mts +5 -0
- package/dist/lib/smokeTests/constants.mjs +10 -0
- package/dist/lib/smokeTests/development.d.mts +11 -0
- package/dist/lib/smokeTests/development.mjs +209 -0
- package/dist/lib/smokeTests/environment.d.mts +14 -0
- package/dist/lib/smokeTests/environment.mjs +163 -0
- package/dist/lib/smokeTests/release.d.mts +61 -0
- package/dist/lib/smokeTests/release.mjs +526 -0
- package/dist/lib/smokeTests/reporting.d.mts +13 -0
- package/dist/lib/smokeTests/reporting.mjs +355 -0
- package/dist/lib/smokeTests/runSmokeTests.d.mts +5 -0
- package/dist/lib/smokeTests/runSmokeTests.mjs +144 -0
- package/dist/lib/smokeTests/state.d.mts +48 -0
- package/dist/lib/smokeTests/state.mjs +57 -0
- package/dist/lib/smokeTests/templates/SmokeTest.template.d.ts +1 -0
- package/dist/lib/smokeTests/templates/SmokeTest.template.js +81 -0
- package/dist/lib/smokeTests/templates/SmokeTestClient.template.d.ts +1 -0
- package/dist/lib/smokeTests/templates/SmokeTestClient.template.js +159 -0
- package/dist/lib/smokeTests/templates/smokeTestFunctions.template.d.ts +1 -0
- package/dist/lib/smokeTests/templates/smokeTestFunctions.template.js +19 -0
- package/dist/lib/smokeTests/types.d.mts +75 -0
- package/dist/lib/smokeTests/types.mjs +1 -0
- package/dist/lib/smokeTests/utils.d.mts +15 -0
- package/dist/lib/smokeTests/utils.mjs +147 -0
- package/dist/llms/index.d.ts +3 -0
- package/dist/llms/index.js +35 -0
- package/dist/llms/rules/interruptors.d.ts +1 -0
- package/dist/llms/rules/interruptors.js +243 -0
- package/dist/llms/rules/middleware.d.ts +1 -0
- package/dist/llms/rules/middleware.js +71 -0
- package/dist/llms/rules/react.d.ts +1 -0
- package/dist/llms/rules/react.js +106 -0
- package/dist/llms/rules/request-response.d.ts +1 -0
- package/dist/llms/rules/request-response.js +209 -0
- package/dist/runtime/client.d.ts +17 -0
- package/dist/runtime/client.js +74 -0
- package/dist/runtime/clientNavigation.d.ts +4 -0
- package/dist/runtime/clientNavigation.js +53 -0
- package/dist/runtime/clientNavigation.test.d.ts +1 -0
- package/dist/runtime/clientNavigation.test.js +55 -0
- package/dist/runtime/constants.d.ts +1 -0
- package/dist/runtime/constants.js +1 -0
- package/dist/runtime/entries/auth.d.ts +1 -0
- package/dist/runtime/entries/auth.js +1 -0
- package/dist/runtime/entries/client.d.ts +4 -0
- package/dist/runtime/entries/client.js +4 -0
- package/dist/runtime/entries/clientSSR.d.ts +1 -0
- package/dist/runtime/entries/clientSSR.js +1 -0
- package/dist/runtime/entries/navigation.d.ts +1 -0
- package/dist/runtime/entries/navigation.js +1 -0
- package/dist/runtime/entries/no-react-server.d.ts +0 -0
- package/dist/runtime/entries/no-react-server.js +2 -0
- package/dist/runtime/entries/react-server-only.d.ts +0 -0
- package/dist/runtime/entries/react-server-only.js +2 -0
- package/dist/runtime/entries/router.d.ts +2 -0
- package/dist/runtime/entries/router.js +2 -0
- package/dist/runtime/entries/ssr.d.ts +1 -0
- package/dist/runtime/entries/ssr.js +1 -0
- package/dist/runtime/entries/worker.d.ts +9 -0
- package/dist/runtime/entries/worker.js +9 -0
- package/dist/runtime/error.d.ts +6 -0
- package/dist/runtime/error.js +8 -0
- package/dist/runtime/imports/ClientOnly.d.ts +3 -0
- package/dist/runtime/imports/ClientOnly.js +8 -0
- package/dist/runtime/imports/client.d.ts +4 -0
- package/dist/runtime/imports/client.js +33 -0
- package/dist/runtime/imports/ssr.d.ts +5 -0
- package/dist/runtime/imports/ssr.js +20 -0
- package/dist/runtime/imports/worker.d.ts +5 -0
- package/dist/runtime/imports/worker.js +22 -0
- package/dist/runtime/lib/auth/index.d.ts +1 -0
- package/dist/runtime/lib/auth/index.js +1 -0
- package/dist/runtime/lib/auth/session.d.ts +50 -0
- package/dist/runtime/lib/auth/session.js +148 -0
- package/dist/runtime/lib/db/DOWorkerDialect.d.ts +29 -0
- package/dist/runtime/lib/db/DOWorkerDialect.js +66 -0
- package/dist/runtime/lib/db/SqliteDurableObject.d.ts +14 -0
- package/dist/runtime/lib/db/SqliteDurableObject.js +42 -0
- package/dist/runtime/lib/db/createDb.d.ts +2 -0
- package/dist/runtime/lib/db/createDb.js +33 -0
- package/dist/runtime/lib/db/index.d.ts +4 -0
- package/dist/runtime/lib/db/index.js +3 -0
- package/dist/runtime/lib/db/migrations.d.ts +23 -0
- package/dist/runtime/lib/db/migrations.js +34 -0
- package/dist/runtime/lib/db/typeInference/assert.d.ts +2 -0
- package/dist/runtime/lib/db/typeInference/assert.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/alterColumn.d.ts +27 -0
- package/dist/runtime/lib/db/typeInference/builders/alterColumn.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/alterTable.d.ts +53 -0
- package/dist/runtime/lib/db/typeInference/builders/alterTable.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/columnDefinition.d.ts +26 -0
- package/dist/runtime/lib/db/typeInference/builders/columnDefinition.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/createTable.d.ts +49 -0
- package/dist/runtime/lib/db/typeInference/builders/createTable.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/createView.d.ts +17 -0
- package/dist/runtime/lib/db/typeInference/builders/createView.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/dropTable.d.ts +11 -0
- package/dist/runtime/lib/db/typeInference/builders/dropTable.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/dropView.d.ts +12 -0
- package/dist/runtime/lib/db/typeInference/builders/dropView.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/schema.d.ts +24 -0
- package/dist/runtime/lib/db/typeInference/builders/schema.js +1 -0
- package/dist/runtime/lib/db/typeInference/database.d.ts +27 -0
- package/dist/runtime/lib/db/typeInference/database.js +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/alterTable.typetest.d.ts +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/alterTable.typetest.js +360 -0
- package/dist/runtime/lib/db/typeInference/typetests/createTable.typetest.d.ts +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/createTable.typetest.js +33 -0
- package/dist/runtime/lib/db/typeInference/typetests/dropTable.typetest.d.ts +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/dropTable.typetest.js +143 -0
- package/dist/runtime/lib/db/typeInference/typetests/print.d.ts +3 -0
- package/dist/runtime/lib/db/typeInference/typetests/print.js +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/testUtils.d.ts +2 -0
- package/dist/runtime/lib/db/typeInference/typetests/testUtils.js +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/typeInference.typetest.d.ts +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/typeInference.typetest.js +17 -0
- package/dist/runtime/lib/db/typeInference/utils.d.ts +82 -0
- package/dist/runtime/lib/db/typeInference/utils.js +2 -0
- package/dist/runtime/lib/debug.d.ts +2 -0
- package/dist/runtime/lib/debug.js +36 -0
- package/dist/runtime/lib/links.d.ts +14 -0
- package/dist/runtime/lib/links.js +38 -0
- package/dist/runtime/lib/realtime/client.d.ts +7 -0
- package/dist/runtime/lib/realtime/client.js +166 -0
- package/dist/runtime/lib/realtime/constants.d.ts +1 -0
- package/dist/runtime/lib/realtime/constants.js +1 -0
- package/dist/runtime/lib/realtime/durableObject.d.ts +29 -0
- package/dist/runtime/lib/realtime/durableObject.js +187 -0
- package/dist/runtime/lib/realtime/renderRealtimeClients.d.ts +7 -0
- package/dist/runtime/lib/realtime/renderRealtimeClients.js +6 -0
- package/dist/runtime/lib/realtime/shared.d.ts +10 -0
- package/dist/runtime/lib/realtime/shared.js +10 -0
- package/dist/runtime/lib/realtime/validateUpgradeRequest.d.ts +6 -0
- package/dist/runtime/lib/realtime/validateUpgradeRequest.js +29 -0
- package/dist/runtime/lib/realtime/worker.d.ts +3 -0
- package/dist/runtime/lib/realtime/worker.js +16 -0
- package/dist/runtime/lib/router.d.ts +56 -0
- package/dist/runtime/lib/router.js +210 -0
- package/dist/runtime/lib/router.test.d.ts +1 -0
- package/dist/runtime/lib/router.test.js +58 -0
- package/dist/runtime/lib/streams/consumeEventStream.d.ts +4 -0
- package/dist/runtime/lib/streams/consumeEventStream.js +13 -0
- package/dist/runtime/lib/turnstile/TurnstileScript.d.ts +1 -0
- package/dist/runtime/lib/turnstile/TurnstileScript.js +2 -0
- package/dist/runtime/lib/turnstile/turnstile.d.ts +3 -0
- package/dist/runtime/lib/turnstile/turnstile.js +3 -0
- package/dist/runtime/lib/turnstile/useTurnstile.d.ts +4 -0
- package/dist/runtime/lib/turnstile/useTurnstile.js +23 -0
- package/dist/runtime/lib/turnstile/verifyTurnstileToken.d.ts +4 -0
- package/dist/runtime/lib/turnstile/verifyTurnstileToken.js +15 -0
- package/dist/runtime/lib/utils.d.ts +1 -0
- package/dist/runtime/lib/utils.js +1 -0
- package/dist/runtime/register/client.d.ts +1 -0
- package/dist/runtime/register/client.js +5 -0
- package/dist/runtime/register/ssr.d.ts +3 -0
- package/dist/runtime/register/ssr.js +26 -0
- package/dist/runtime/register/worker.d.ts +4 -0
- package/dist/runtime/register/worker.js +42 -0
- package/dist/runtime/render/createClientManifest.d.ts +1 -0
- package/dist/runtime/render/createClientManifest.js +7 -0
- package/dist/runtime/render/createModuleMap.d.ts +1 -0
- package/dist/runtime/render/createModuleMap.js +13 -0
- package/dist/runtime/render/injectRSCPayload.d.ts +3 -0
- package/dist/runtime/render/injectRSCPayload.js +79 -0
- package/dist/runtime/render/renderRscThenableToHtmlStream.d.ts +9 -0
- package/dist/runtime/render/renderRscThenableToHtmlStream.js +49 -0
- package/dist/runtime/render/renderToRscStream.d.ts +5 -0
- package/dist/runtime/render/renderToRscStream.js +46 -0
- package/dist/runtime/render/renderToStream.d.ts +9 -0
- package/dist/runtime/render/renderToStream.js +27 -0
- package/dist/runtime/render/renderToString.d.ts +7 -0
- package/dist/runtime/render/renderToString.js +26 -0
- package/dist/runtime/render/transformRscToHtmlStream.d.ts +8 -0
- package/dist/runtime/render/transformRscToHtmlStream.js +19 -0
- package/dist/runtime/requestInfo/types.d.ts +11 -0
- package/dist/runtime/requestInfo/types.js +1 -0
- package/dist/runtime/requestInfo/worker.d.ts +5 -0
- package/dist/runtime/requestInfo/worker.js +33 -0
- package/dist/runtime/script.d.ts +5 -0
- package/dist/runtime/script.js +8 -0
- package/dist/runtime/ssrBridge.d.ts +2 -0
- package/dist/runtime/ssrBridge.js +11 -0
- package/dist/runtime/worker.d.ts +18 -0
- package/dist/runtime/worker.js +173 -0
- package/dist/scripts/__sdk.d.mts +1 -0
- package/dist/scripts/__sdk.mjs +14 -0
- package/dist/scripts/build-vendor-bundles.d.mts +1 -0
- package/dist/scripts/build-vendor-bundles.mjs +92 -0
- package/dist/scripts/debug-sync.d.mts +6 -0
- package/dist/scripts/debug-sync.mjs +224 -0
- package/dist/scripts/dev-init.d.mts +1 -0
- package/dist/scripts/dev-init.mjs +25 -0
- package/dist/scripts/ensure-deploy-env.d.mts +1 -0
- package/dist/scripts/ensure-deploy-env.mjs +271 -0
- package/dist/scripts/ensure-env.d.mts +1 -0
- package/dist/scripts/ensure-env.mjs +9 -0
- package/dist/scripts/migrate-new.d.mts +1 -0
- package/dist/scripts/migrate-new.mjs +51 -0
- package/dist/scripts/smoke-test.d.mts +1 -0
- package/dist/scripts/smoke-test.mjs +166 -0
- package/dist/scripts/worker-run.d.mts +1 -0
- package/dist/scripts/worker-run.mjs +82 -0
- package/dist/vite/aliasByEnvPlugin.d.mts +2 -0
- package/dist/vite/aliasByEnvPlugin.mjs +11 -0
- package/dist/vite/asyncSetupPlugin.d.mts +6 -0
- package/dist/vite/asyncSetupPlugin.mjs +23 -0
- package/dist/vite/checkIsUsingPrisma.d.mts +6 -0
- package/dist/vite/checkIsUsingPrisma.mjs +18 -0
- package/dist/vite/configPlugin.d.mts +9 -0
- package/dist/vite/configPlugin.mjs +169 -0
- package/dist/vite/copyPrismaWasmPlugin.d.mts +4 -0
- package/dist/vite/copyPrismaWasmPlugin.mjs +32 -0
- package/dist/vite/createDirectiveLookupPlugin.d.mts +21 -0
- package/dist/vite/createDirectiveLookupPlugin.mjs +231 -0
- package/dist/vite/customReactBuildPlugin.d.mts +4 -0
- package/dist/vite/customReactBuildPlugin.mjs +61 -0
- package/dist/vite/devServerTimingPlugin.d.mts +2 -0
- package/dist/vite/devServerTimingPlugin.mjs +24 -0
- package/dist/vite/directivesPlugin.d.mts +6 -0
- package/dist/vite/directivesPlugin.mjs +200 -0
- package/dist/vite/ensureAliasArray.d.mts +2 -0
- package/dist/vite/ensureAliasArray.mjs +17 -0
- package/dist/vite/findSpecifiers.d.mts +31 -0
- package/dist/vite/findSpecifiers.mjs +230 -0
- package/dist/vite/findSsrSpecifiers.d.mts +11 -0
- package/dist/vite/findSsrSpecifiers.mjs +67 -0
- package/dist/vite/hasDirective.d.mts +7 -0
- package/dist/vite/hasDirective.mjs +54 -0
- package/dist/vite/hasOwnCloudflareVitePlugin.d.mts +3 -0
- package/dist/vite/hasOwnCloudflareVitePlugin.mjs +14 -0
- package/dist/vite/index.d.mts +1 -0
- package/dist/vite/index.mjs +1 -0
- package/dist/vite/injectHmrPreambleJsxPlugin.d.mts +2 -0
- package/dist/vite/injectHmrPreambleJsxPlugin.mjs +22 -0
- package/dist/vite/injectVitePreamblePlugin.d.mts +4 -0
- package/dist/vite/injectVitePreamblePlugin.mjs +23 -0
- package/dist/vite/invalidateCacheIfPrismaClientChanged.d.mts +3 -0
- package/dist/vite/invalidateCacheIfPrismaClientChanged.mjs +27 -0
- package/dist/vite/invalidateModule.d.mts +6 -0
- package/dist/vite/invalidateModule.mjs +30 -0
- package/dist/vite/miniflareHMRPlugin.d.mts +10 -0
- package/dist/vite/miniflareHMRPlugin.mjs +209 -0
- package/dist/vite/miniflarePlugin.d.mts +9 -0
- package/dist/vite/miniflarePlugin.mjs +135 -0
- package/dist/vite/moveStaticAssetsPlugin.d.mts +4 -0
- package/dist/vite/moveStaticAssetsPlugin.mjs +12 -0
- package/dist/vite/normalizeModulePath.d.mts +1 -0
- package/dist/vite/normalizeModulePath.mjs +13 -0
- package/dist/vite/prismaPlugin.d.mts +4 -0
- package/dist/vite/prismaPlugin.mjs +43 -0
- package/dist/vite/reactConditionsResolverPlugin.d.mts +16 -0
- package/dist/vite/reactConditionsResolverPlugin.mjs +179 -0
- package/dist/vite/redwoodPlugin.d.mts +12 -0
- package/dist/vite/redwoodPlugin.mjs +105 -0
- package/dist/vite/requestUtils.d.mts +6 -0
- package/dist/vite/requestUtils.mjs +35 -0
- package/dist/vite/setupEnvFiles.d.mts +4 -0
- package/dist/vite/setupEnvFiles.mjs +31 -0
- package/dist/vite/ssrBridgePlugin.d.mts +7 -0
- package/dist/vite/ssrBridgePlugin.mjs +137 -0
- package/dist/vite/transformClientComponents.d.mts +12 -0
- package/dist/vite/transformClientComponents.mjs +116 -0
- package/dist/vite/transformClientComponents.test.d.mts +1 -0
- package/dist/vite/transformClientComponents.test.mjs +264 -0
- package/dist/vite/transformJsxScriptTagsPlugin.d.mts +8 -0
- package/dist/vite/transformJsxScriptTagsPlugin.mjs +315 -0
- package/dist/vite/transformJsxScriptTagsPlugin.test.d.mts +1 -0
- package/dist/vite/transformJsxScriptTagsPlugin.test.mjs +334 -0
- package/dist/vite/transformServerFunctions.d.mts +16 -0
- package/dist/vite/transformServerFunctions.mjs +296 -0
- package/dist/vite/transformServerFunctions.test.d.mts +1 -0
- package/dist/vite/transformServerFunctions.test.mjs +124 -0
- package/dist/vite/useClientLookupPlugin.d.mts +5 -0
- package/dist/vite/useClientLookupPlugin.mjs +15 -0
- package/dist/vite/useClientPlugin.d.mts +8 -0
- package/dist/vite/useClientPlugin.mjs +295 -0
- package/dist/vite/useClientPlugin.test.d.mts +1 -0
- package/dist/vite/useClientPlugin.test.mjs +1204 -0
- package/dist/vite/useServerLookupPlugin.d.mts +5 -0
- package/dist/vite/useServerLookupPlugin.mjs +15 -0
- package/dist/vite/useServerPlugin.d.mts +1 -0
- package/dist/vite/useServerPlugin.mjs +1 -0
- package/dist/vite/virtualPlugin.d.mts +2 -0
- package/dist/vite/virtualPlugin.mjs +18 -0
- package/dist/vite/vitePreamblePlugin.d.mts +1 -0
- package/dist/vite/vitePreamblePlugin.mjs +11 -0
- package/dist/worker/__ssr_bridge.js +8947 -0
- package/dist/worker/__ssr_bridge.js.map +1 -0
- package/package.json +1 -1
- package/dist/vite/invalidateClientModule.d.mts +0 -2
- package/dist/vite/invalidateClientModule.mjs +0 -8
- package/dist/vite/invalidateModule copy.d.mts +0 -2
- package/dist/vite/invalidateModule copy.mjs +0 -14
- package/dist/vite/invalidateSSRModule.d.mts +0 -2
- package/dist/vite/invalidateSSRModule.mjs +0 -7
- package/dist/vite/mode.d.mts +0 -5
- package/dist/vite/mode.mjs +0 -25
- package/dist/vite/modePlugin.d.mts +0 -2
- package/dist/vite/modePlugin.mjs +0 -10
- /package/dist/vite/{isJsFile.d.ts → isJsFile.d.mts} +0 -0
- /package/dist/vite/{isJsFile.js → isJsFile.mjs} +0 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { transformJsxScriptTagsCode } from "./transformJsxScriptTagsPlugin.mjs";
|
|
3
|
+
describe("transformJsxScriptTagsCode", () => {
|
|
4
|
+
const mockManifest = {
|
|
5
|
+
"src/client.tsx": { file: "assets/client-a1b2c3d4.js" },
|
|
6
|
+
"src/entry.js": { file: "assets/entry-e5f6g7h8.js" },
|
|
7
|
+
"src/styles.css": { file: "assets/styles-i9j0k1l2.css" },
|
|
8
|
+
};
|
|
9
|
+
it("transforms script src attributes in JSX", async () => {
|
|
10
|
+
const code = `
|
|
11
|
+
jsx("script", {
|
|
12
|
+
src: "/src/client.tsx",
|
|
13
|
+
type: "module"
|
|
14
|
+
})
|
|
15
|
+
`;
|
|
16
|
+
const result = await transformJsxScriptTagsCode(code, mockManifest);
|
|
17
|
+
expect(result?.code).toEqual(`import { requestInfo } from "rwsdk/worker";
|
|
18
|
+
|
|
19
|
+
jsx("script", {
|
|
20
|
+
src: "/assets/client-a1b2c3d4.js",
|
|
21
|
+
type: "module",
|
|
22
|
+
nonce: requestInfo.rw.nonce
|
|
23
|
+
})
|
|
24
|
+
`);
|
|
25
|
+
});
|
|
26
|
+
it("transforms inline scripts with dynamic imports", async () => {
|
|
27
|
+
const code = `
|
|
28
|
+
jsx("script", {
|
|
29
|
+
type: "module",
|
|
30
|
+
children: "import('/src/client.tsx').then(module => { console.log(module); })"
|
|
31
|
+
})
|
|
32
|
+
`;
|
|
33
|
+
const result = await transformJsxScriptTagsCode(code, mockManifest);
|
|
34
|
+
expect(result?.code).toEqual(`import { requestInfo } from "rwsdk/worker";
|
|
35
|
+
|
|
36
|
+
jsx("script", {
|
|
37
|
+
type: "module",
|
|
38
|
+
children: "import(\\"\/assets\/client-a1b2c3d4.js\\").then(module => { console.log(module); })",
|
|
39
|
+
nonce: requestInfo.rw.nonce
|
|
40
|
+
})
|
|
41
|
+
`);
|
|
42
|
+
});
|
|
43
|
+
it("transforms inline scripts with type=module", async () => {
|
|
44
|
+
const code = `
|
|
45
|
+
jsx("script", { type: "module", children: "import('/src/client.tsx')" })
|
|
46
|
+
`;
|
|
47
|
+
const result = await transformJsxScriptTagsCode(code, mockManifest);
|
|
48
|
+
expect(result?.code).toEqual(`import { requestInfo } from "rwsdk/worker";
|
|
49
|
+
|
|
50
|
+
jsx("script", { type: "module", children: "import(\\"\/assets\/client-a1b2c3d4.js\\")",
|
|
51
|
+
nonce: requestInfo.rw.nonce
|
|
52
|
+
})
|
|
53
|
+
`);
|
|
54
|
+
});
|
|
55
|
+
it("transforms inline scripts with multiline content", async () => {
|
|
56
|
+
const code = `
|
|
57
|
+
jsx("script", {
|
|
58
|
+
type: "module",
|
|
59
|
+
children: \`
|
|
60
|
+
// Some comments here
|
|
61
|
+
const init = async () => {
|
|
62
|
+
await import('/src/entry.js');
|
|
63
|
+
console.log('initialized');
|
|
64
|
+
};
|
|
65
|
+
init();
|
|
66
|
+
\`
|
|
67
|
+
})
|
|
68
|
+
`;
|
|
69
|
+
const result = await transformJsxScriptTagsCode(code, mockManifest);
|
|
70
|
+
expect(result?.code).toEqual(`import { requestInfo } from "rwsdk/worker";
|
|
71
|
+
|
|
72
|
+
jsx("script", {
|
|
73
|
+
type: "module",
|
|
74
|
+
children: \`
|
|
75
|
+
// Some comments here
|
|
76
|
+
const init = async () => {
|
|
77
|
+
await import("/assets/entry-e5f6g7h8.js");
|
|
78
|
+
console.log('initialized');
|
|
79
|
+
};
|
|
80
|
+
init();
|
|
81
|
+
\`,
|
|
82
|
+
nonce: requestInfo.rw.nonce
|
|
83
|
+
})
|
|
84
|
+
`);
|
|
85
|
+
});
|
|
86
|
+
it("transforms multiple imports in the same inline script", async () => {
|
|
87
|
+
const code = `
|
|
88
|
+
jsx("script", {
|
|
89
|
+
type: "module",
|
|
90
|
+
children: \`
|
|
91
|
+
import('/src/client.tsx');
|
|
92
|
+
import('/src/entry.js');
|
|
93
|
+
\`
|
|
94
|
+
})
|
|
95
|
+
`;
|
|
96
|
+
const result = await transformJsxScriptTagsCode(code, mockManifest);
|
|
97
|
+
expect(result?.code).toEqual(`import { requestInfo } from "rwsdk/worker";
|
|
98
|
+
|
|
99
|
+
jsx("script", {
|
|
100
|
+
type: "module",
|
|
101
|
+
children: \`
|
|
102
|
+
import("/assets/client-a1b2c3d4.js");
|
|
103
|
+
import("/assets/entry-e5f6g7h8.js");
|
|
104
|
+
\`,
|
|
105
|
+
nonce: requestInfo.rw.nonce
|
|
106
|
+
})
|
|
107
|
+
`);
|
|
108
|
+
});
|
|
109
|
+
it("transforms link href attributes with preload rel", async () => {
|
|
110
|
+
const code = `
|
|
111
|
+
jsx("link", {
|
|
112
|
+
rel: "preload",
|
|
113
|
+
href: "/src/client.tsx",
|
|
114
|
+
as: "script"
|
|
115
|
+
})
|
|
116
|
+
`;
|
|
117
|
+
const result = await transformJsxScriptTagsCode(code, mockManifest);
|
|
118
|
+
expect(result?.code).toEqual(`
|
|
119
|
+
jsx("link", {
|
|
120
|
+
rel: "preload",
|
|
121
|
+
href: "/assets/client-a1b2c3d4.js",
|
|
122
|
+
as: "script"
|
|
123
|
+
})
|
|
124
|
+
`);
|
|
125
|
+
});
|
|
126
|
+
it("transforms link href attributes with modulepreload rel", async () => {
|
|
127
|
+
const code = `
|
|
128
|
+
jsx("link", {
|
|
129
|
+
href: "/src/client.tsx",
|
|
130
|
+
rel: "modulepreload"
|
|
131
|
+
})
|
|
132
|
+
`;
|
|
133
|
+
const result = await transformJsxScriptTagsCode(code, mockManifest);
|
|
134
|
+
expect(result?.code).toEqual(`
|
|
135
|
+
jsx("link", {
|
|
136
|
+
href: "/assets/client-a1b2c3d4.js",
|
|
137
|
+
rel: "modulepreload"
|
|
138
|
+
})
|
|
139
|
+
`);
|
|
140
|
+
});
|
|
141
|
+
it("transforms real-world Document component example", async () => {
|
|
142
|
+
const code = `
|
|
143
|
+
jsx("html", {
|
|
144
|
+
lang: "en",
|
|
145
|
+
children: [
|
|
146
|
+
jsx("head", {
|
|
147
|
+
children: [
|
|
148
|
+
jsx("meta", { charSet: "utf-8" }),
|
|
149
|
+
jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }),
|
|
150
|
+
jsx("title", { children: "@redwoodjs/starter-standard" }),
|
|
151
|
+
jsx("link", { rel: "modulepreload", href: "/src/client.tsx", as: "script" })
|
|
152
|
+
]
|
|
153
|
+
}),
|
|
154
|
+
jsx("body", {
|
|
155
|
+
children: [
|
|
156
|
+
jsx("div", { id: "root", children: props.children }),
|
|
157
|
+
jsx("script", { children: 'import("/src/client.tsx")' })
|
|
158
|
+
]
|
|
159
|
+
})
|
|
160
|
+
]
|
|
161
|
+
})
|
|
162
|
+
`;
|
|
163
|
+
const result = await transformJsxScriptTagsCode(code, mockManifest);
|
|
164
|
+
expect(result?.code).toEqual(`import { requestInfo } from "rwsdk/worker";
|
|
165
|
+
|
|
166
|
+
jsx("html", {
|
|
167
|
+
lang: "en",
|
|
168
|
+
children: [
|
|
169
|
+
jsx("head", {
|
|
170
|
+
children: [
|
|
171
|
+
jsx("meta", { charSet: "utf-8" }),
|
|
172
|
+
jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }),
|
|
173
|
+
jsx("title", { children: "@redwoodjs/starter-standard" }),
|
|
174
|
+
jsx("link", { rel: "modulepreload", href: "/assets/client-a1b2c3d4.js", as: "script" })
|
|
175
|
+
]
|
|
176
|
+
}),
|
|
177
|
+
jsx("body", {
|
|
178
|
+
children: [
|
|
179
|
+
jsx("div", { id: "root", children: props.children }),
|
|
180
|
+
jsx("script", { children: "import(\\"\/assets\/client-a1b2c3d4.js\\")",
|
|
181
|
+
nonce: requestInfo.rw.nonce
|
|
182
|
+
})
|
|
183
|
+
]
|
|
184
|
+
})
|
|
185
|
+
]
|
|
186
|
+
})
|
|
187
|
+
`);
|
|
188
|
+
});
|
|
189
|
+
it("returns null when no transformations are needed", async () => {
|
|
190
|
+
const code = `
|
|
191
|
+
jsx("div", { children: "No scripts or links here" })
|
|
192
|
+
`;
|
|
193
|
+
const result = await transformJsxScriptTagsCode(code, mockManifest);
|
|
194
|
+
expect(result).toBeUndefined();
|
|
195
|
+
});
|
|
196
|
+
it("handles paths not found in manifest", async () => {
|
|
197
|
+
const code = `
|
|
198
|
+
jsx("script", {
|
|
199
|
+
src: "/src/non-existent.js",
|
|
200
|
+
type: "module"
|
|
201
|
+
})
|
|
202
|
+
`;
|
|
203
|
+
const result = await transformJsxScriptTagsCode(code, mockManifest);
|
|
204
|
+
expect(result?.code).toEqual(`import { requestInfo } from "rwsdk/worker";
|
|
205
|
+
|
|
206
|
+
jsx("script", {
|
|
207
|
+
src: "/src/non-existent.js",
|
|
208
|
+
type: "module",
|
|
209
|
+
nonce: requestInfo.rw.nonce
|
|
210
|
+
})
|
|
211
|
+
`);
|
|
212
|
+
});
|
|
213
|
+
it("adds nonce to script tags with src attribute and imports requestInfo", async () => {
|
|
214
|
+
const code = `
|
|
215
|
+
jsx("script", {
|
|
216
|
+
src: "/src/client.tsx",
|
|
217
|
+
type: "module"
|
|
218
|
+
})
|
|
219
|
+
`;
|
|
220
|
+
const result = await transformJsxScriptTagsCode(code, mockManifest);
|
|
221
|
+
expect(result?.code).toEqual(`import { requestInfo } from "rwsdk/worker";
|
|
222
|
+
|
|
223
|
+
jsx("script", {
|
|
224
|
+
src: "/assets/client-a1b2c3d4.js",
|
|
225
|
+
type: "module",
|
|
226
|
+
nonce: requestInfo.rw.nonce
|
|
227
|
+
})
|
|
228
|
+
`);
|
|
229
|
+
});
|
|
230
|
+
it("adds nonce to script tags with string literal children", async () => {
|
|
231
|
+
const code = `
|
|
232
|
+
jsx("script", {
|
|
233
|
+
type: "module",
|
|
234
|
+
children: "console.log('hello world')"
|
|
235
|
+
})
|
|
236
|
+
`;
|
|
237
|
+
const result = await transformJsxScriptTagsCode(code, {});
|
|
238
|
+
expect(result?.code).toEqual(`import { requestInfo } from "rwsdk/worker";
|
|
239
|
+
|
|
240
|
+
jsx("script", {
|
|
241
|
+
type: "module",
|
|
242
|
+
children: "console.log('hello world')",
|
|
243
|
+
nonce: requestInfo.rw.nonce
|
|
244
|
+
})
|
|
245
|
+
`);
|
|
246
|
+
});
|
|
247
|
+
it("does not add nonce to script tags with dangerouslySetInnerHTML", async () => {
|
|
248
|
+
const code = `
|
|
249
|
+
jsx("script", {
|
|
250
|
+
type: "module",
|
|
251
|
+
dangerouslySetInnerHTML: { __html: "console.log('hello world')" }
|
|
252
|
+
})
|
|
253
|
+
`;
|
|
254
|
+
const result = await transformJsxScriptTagsCode(code, {});
|
|
255
|
+
expect(result?.code).toEqual(undefined);
|
|
256
|
+
});
|
|
257
|
+
it("does not add nonce to script tags that already have nonce", async () => {
|
|
258
|
+
const code = `
|
|
259
|
+
jsx("script", {
|
|
260
|
+
type: "module",
|
|
261
|
+
children: "console.log('hello world')",
|
|
262
|
+
nonce: "existing-nonce"
|
|
263
|
+
})
|
|
264
|
+
`;
|
|
265
|
+
const result = await transformJsxScriptTagsCode(code, {});
|
|
266
|
+
expect(result?.code).toEqual(undefined);
|
|
267
|
+
});
|
|
268
|
+
it("uses existing requestInfo import if already present", async () => {
|
|
269
|
+
const code = `
|
|
270
|
+
import { foo } from 'bar';
|
|
271
|
+
import { requestInfo, someOtherThing } from "rwsdk/worker";
|
|
272
|
+
|
|
273
|
+
jsx("script", {
|
|
274
|
+
type: "module",
|
|
275
|
+
children: "console.log('hello world')"
|
|
276
|
+
})
|
|
277
|
+
`;
|
|
278
|
+
const result = await transformJsxScriptTagsCode(code, {});
|
|
279
|
+
expect(result?.code).toEqual(`
|
|
280
|
+
import { foo } from 'bar';
|
|
281
|
+
import { requestInfo, someOtherThing } from "rwsdk/worker";
|
|
282
|
+
|
|
283
|
+
jsx("script", {
|
|
284
|
+
type: "module",
|
|
285
|
+
children: "console.log('hello world')",
|
|
286
|
+
nonce: requestInfo.rw.nonce
|
|
287
|
+
})
|
|
288
|
+
`);
|
|
289
|
+
// Ensure we didn't duplicate the import
|
|
290
|
+
const importCount = (result?.code.match(/from "rwsdk\/worker"/g) || [])
|
|
291
|
+
.length;
|
|
292
|
+
expect(importCount).toBe(1);
|
|
293
|
+
});
|
|
294
|
+
it("adds requestInfo to existing SDK import if module already imported", async () => {
|
|
295
|
+
const code = `
|
|
296
|
+
import { foo } from 'bar';
|
|
297
|
+
import { someOtherThing } from "rwsdk/worker";
|
|
298
|
+
|
|
299
|
+
jsx("script", {
|
|
300
|
+
type: "module",
|
|
301
|
+
children: "console.log('hello world')"
|
|
302
|
+
})
|
|
303
|
+
`;
|
|
304
|
+
const result = await transformJsxScriptTagsCode(code, {});
|
|
305
|
+
expect(result?.code).toEqual(`
|
|
306
|
+
import { foo } from 'bar';
|
|
307
|
+
import { someOtherThing, requestInfo } from "rwsdk/worker";
|
|
308
|
+
|
|
309
|
+
jsx("script", {
|
|
310
|
+
type: "module",
|
|
311
|
+
children: "console.log('hello world')",
|
|
312
|
+
nonce: requestInfo.rw.nonce
|
|
313
|
+
})
|
|
314
|
+
`);
|
|
315
|
+
});
|
|
316
|
+
it("works in development mode without a manifest", async () => {
|
|
317
|
+
const code = `
|
|
318
|
+
jsx("script", {
|
|
319
|
+
src: "/src/client.tsx",
|
|
320
|
+
type: "module"
|
|
321
|
+
})
|
|
322
|
+
`;
|
|
323
|
+
// Call without providing manifest (simulating dev mode)
|
|
324
|
+
const result = await transformJsxScriptTagsCode(code);
|
|
325
|
+
expect(result?.code).toEqual(`import { requestInfo } from "rwsdk/worker";
|
|
326
|
+
|
|
327
|
+
jsx("script", {
|
|
328
|
+
src: "/src/client.tsx",
|
|
329
|
+
type: "module",
|
|
330
|
+
nonce: requestInfo.rw.nonce
|
|
331
|
+
})
|
|
332
|
+
`);
|
|
333
|
+
});
|
|
334
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface TransformResult {
|
|
2
|
+
code: string;
|
|
3
|
+
map?: any;
|
|
4
|
+
}
|
|
5
|
+
type ExportInfoCompat = {
|
|
6
|
+
localFunctions: Set<string>;
|
|
7
|
+
reExports: Array<{
|
|
8
|
+
localName: string;
|
|
9
|
+
originalName: string;
|
|
10
|
+
moduleSpecifier: string;
|
|
11
|
+
}>;
|
|
12
|
+
};
|
|
13
|
+
export declare const findExportedFunctions: (code: string, normalizedId?: string) => Set<string>;
|
|
14
|
+
export declare const findExportInfo: (code: string, normalizedId?: string) => ExportInfoCompat;
|
|
15
|
+
export declare const transformServerFunctions: (code: string, normalizedId: string, environment: "client" | "worker" | "ssr", serverFiles?: Set<string>, addServerModule?: (environment: string, id: string) => void) => TransformResult | undefined;
|
|
16
|
+
export type { TransformResult };
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import MagicString from "magic-string";
|
|
2
|
+
import debug from "debug";
|
|
3
|
+
import { hasDirective } from "./hasDirective.mjs";
|
|
4
|
+
import { findExports } from "./findSpecifiers.mjs";
|
|
5
|
+
import { parse as sgParse, Lang as SgLang, Lang } from "@ast-grep/napi";
|
|
6
|
+
import path from "path";
|
|
7
|
+
const log = debug("rwsdk:vite:transform-server-functions");
|
|
8
|
+
export const findExportedFunctions = (code, normalizedId) => {
|
|
9
|
+
return findExportInfo(code, normalizedId).localFunctions;
|
|
10
|
+
};
|
|
11
|
+
export const findExportInfo = (code, normalizedId) => {
|
|
12
|
+
process.env.VERBOSE && log("Finding exported functions in source file");
|
|
13
|
+
const localFunctions = new Set();
|
|
14
|
+
const reExports = [];
|
|
15
|
+
const exportInfos = findExports(normalizedId || "file.ts", code, log);
|
|
16
|
+
for (const exportInfo of exportInfos) {
|
|
17
|
+
if (exportInfo.isReExport && exportInfo.moduleSpecifier) {
|
|
18
|
+
// For re-exports, we need to determine the original name by parsing the code
|
|
19
|
+
// For "export { default as multiply }", we want localName="multiply", originalName="default"
|
|
20
|
+
// For "export { sum }", we want localName="sum", originalName="sum"
|
|
21
|
+
let originalName = exportInfo.name;
|
|
22
|
+
// Check if this is a default re-export with alias
|
|
23
|
+
if (exportInfo.isDefault && exportInfo.alias) {
|
|
24
|
+
originalName = "default";
|
|
25
|
+
}
|
|
26
|
+
reExports.push({
|
|
27
|
+
localName: exportInfo.name,
|
|
28
|
+
originalName: originalName,
|
|
29
|
+
moduleSpecifier: exportInfo.moduleSpecifier,
|
|
30
|
+
});
|
|
31
|
+
process.env.VERBOSE &&
|
|
32
|
+
log("Found re-exported function: %s (original: %s) from %s", exportInfo.name, originalName, exportInfo.moduleSpecifier);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
localFunctions.add(exportInfo.name);
|
|
36
|
+
process.env.VERBOSE &&
|
|
37
|
+
log("Found exported function: %s", exportInfo.name);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
log("Found %d local functions: %O", localFunctions.size, Array.from(localFunctions));
|
|
41
|
+
log("Found %d re-exports: %O", reExports.length, reExports.map((r) => `${r.localName} from ${r.moduleSpecifier}`));
|
|
42
|
+
return { localFunctions, reExports };
|
|
43
|
+
};
|
|
44
|
+
// Helper function to find default function names using ast-grep
|
|
45
|
+
function findDefaultFunctionName(code, normalizedId) {
|
|
46
|
+
const ext = path.extname(normalizedId).toLowerCase();
|
|
47
|
+
const lang = ext === ".tsx" || ext === ".jsx" ? Lang.Tsx : SgLang.TypeScript;
|
|
48
|
+
try {
|
|
49
|
+
const root = sgParse(lang, code);
|
|
50
|
+
const matches = root
|
|
51
|
+
.root()
|
|
52
|
+
.findAll("export default function $NAME($$$) { $$$ }");
|
|
53
|
+
if (matches.length > 0) {
|
|
54
|
+
const nameCapture = matches[0].getMatch("NAME");
|
|
55
|
+
return nameCapture?.text() || null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
process.env.VERBOSE && log("Error finding default function name: %O", err);
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
// Helper function to check if there's a default export (not re-export)
|
|
64
|
+
function hasDefaultExport(code, normalizedId) {
|
|
65
|
+
const ext = path.extname(normalizedId).toLowerCase();
|
|
66
|
+
const lang = ext === ".tsx" || ext === ".jsx" ? Lang.Tsx : SgLang.TypeScript;
|
|
67
|
+
try {
|
|
68
|
+
const root = sgParse(lang, code);
|
|
69
|
+
// Check for any export default statements
|
|
70
|
+
const patterns = [
|
|
71
|
+
"export default function $$$",
|
|
72
|
+
"export default function($$$) { $$$ }",
|
|
73
|
+
"export default $$$",
|
|
74
|
+
];
|
|
75
|
+
for (const pattern of patterns) {
|
|
76
|
+
const matches = root.root().findAll(pattern);
|
|
77
|
+
if (matches.length > 0) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
process.env.VERBOSE && log("Error checking for default export: %O", err);
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
export const transformServerFunctions = (code, normalizedId, environment, serverFiles, addServerModule) => {
|
|
88
|
+
process.env.VERBOSE &&
|
|
89
|
+
log("Transform server functions called for normalizedId=%s, environment=%s", normalizedId, environment);
|
|
90
|
+
if (!hasDirective(code, "use server")) {
|
|
91
|
+
log("Skipping: no 'use server' directive in id=%s", normalizedId);
|
|
92
|
+
process.env.VERBOSE &&
|
|
93
|
+
log(":VERBOSE: Returning code unchanged for id=%s:\n%s", normalizedId, code);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
log("Processing 'use server' module: normalizedId=%s, environment=%s", normalizedId, environment);
|
|
97
|
+
addServerModule?.(environment, normalizedId);
|
|
98
|
+
if (environment === "ssr" || environment === "client") {
|
|
99
|
+
log(`Transforming for ${environment} environment: normalizedId=%s`, normalizedId);
|
|
100
|
+
const exportInfo = findExportInfo(code, normalizedId);
|
|
101
|
+
const allExports = new Set([
|
|
102
|
+
...exportInfo.localFunctions,
|
|
103
|
+
...exportInfo.reExports.map((r) => r.localName),
|
|
104
|
+
]);
|
|
105
|
+
// Check for default function exports that should also be named exports
|
|
106
|
+
const defaultFunctionName = findDefaultFunctionName(code, normalizedId);
|
|
107
|
+
if (defaultFunctionName) {
|
|
108
|
+
allExports.add(defaultFunctionName);
|
|
109
|
+
}
|
|
110
|
+
// Generate completely new code for SSR
|
|
111
|
+
const s = new MagicString("");
|
|
112
|
+
if (environment === "ssr") {
|
|
113
|
+
s.append('import { createServerReference } from "rwsdk/__ssr";\n\n');
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
s.append('import { createServerReference } from "rwsdk/client";\n\n');
|
|
117
|
+
}
|
|
118
|
+
for (const name of allExports) {
|
|
119
|
+
if (name !== "default" && name !== defaultFunctionName) {
|
|
120
|
+
s.append(`export let ${name} = createServerReference(${JSON.stringify(normalizedId)}, ${JSON.stringify(name)});\n`);
|
|
121
|
+
log(`Added ${environment} server reference for function: %s in normalizedId=%s`, name, normalizedId);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Check for default export in the actual module (not re-exports)
|
|
125
|
+
if (hasDefaultExport(code, normalizedId)) {
|
|
126
|
+
s.append(`\nexport default createServerReference(${JSON.stringify(normalizedId)}, "default");\n`);
|
|
127
|
+
log(`Added ${environment} server reference for default export in normalizedId=%s`, normalizedId);
|
|
128
|
+
}
|
|
129
|
+
log(`${environment} transformation complete for normalizedId=%s`, normalizedId);
|
|
130
|
+
return {
|
|
131
|
+
code: s.toString(),
|
|
132
|
+
map: s.generateMap({
|
|
133
|
+
source: normalizedId,
|
|
134
|
+
includeContent: true,
|
|
135
|
+
hires: true,
|
|
136
|
+
}),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
else if (environment === "worker") {
|
|
140
|
+
log("Transforming for worker environment: normalizedId=%s", normalizedId);
|
|
141
|
+
const exportInfo = findExportInfo(code, normalizedId);
|
|
142
|
+
const s = new MagicString(code);
|
|
143
|
+
// Remove "use server" directive first
|
|
144
|
+
const directiveRegex = /^(\s*)(['"]use server['"])\s*;?\s*$/gm;
|
|
145
|
+
let match;
|
|
146
|
+
while ((match = directiveRegex.exec(code)) !== null) {
|
|
147
|
+
const start = match.index;
|
|
148
|
+
const end = match.index + match[0].length;
|
|
149
|
+
s.remove(start, end);
|
|
150
|
+
process.env.VERBOSE &&
|
|
151
|
+
log("Removed 'use server' directive from normalizedId=%s", normalizedId);
|
|
152
|
+
break; // Only remove the first one
|
|
153
|
+
}
|
|
154
|
+
// Add imports at the very beginning
|
|
155
|
+
let importsToAdd = [];
|
|
156
|
+
// Add imports for re-exported functions so they exist in scope
|
|
157
|
+
for (const reExport of exportInfo.reExports) {
|
|
158
|
+
// Fix the import statement - the originalName is what we import, localName is the alias
|
|
159
|
+
const importStatement = reExport.originalName === "default"
|
|
160
|
+
? `import { default as ${reExport.localName} } from "${reExport.moduleSpecifier}";`
|
|
161
|
+
: reExport.originalName === reExport.localName
|
|
162
|
+
? `import { ${reExport.originalName} } from "${reExport.moduleSpecifier}";`
|
|
163
|
+
: `import { ${reExport.originalName} as ${reExport.localName} } from "${reExport.moduleSpecifier}";`;
|
|
164
|
+
importsToAdd.push(importStatement);
|
|
165
|
+
log("Added import for re-exported function: %s from %s in normalizedId=%s", reExport.localName, reExport.moduleSpecifier, normalizedId);
|
|
166
|
+
}
|
|
167
|
+
// Add registerServerReference import
|
|
168
|
+
importsToAdd.push('import { registerServerReference } from "rwsdk/worker";');
|
|
169
|
+
// Add imports - position depends on whether file starts with block comment
|
|
170
|
+
if (importsToAdd.length > 0) {
|
|
171
|
+
const trimmedCode = code.trim();
|
|
172
|
+
if (trimmedCode.startsWith("/*")) {
|
|
173
|
+
// Find the end of the block comment
|
|
174
|
+
const blockCommentEnd = code.indexOf("*/");
|
|
175
|
+
if (blockCommentEnd !== -1) {
|
|
176
|
+
// Insert after the block comment
|
|
177
|
+
const insertPos = blockCommentEnd + 2;
|
|
178
|
+
// Find the next newline after the block comment
|
|
179
|
+
const nextNewline = code.indexOf("\n", insertPos);
|
|
180
|
+
const actualInsertPos = nextNewline !== -1 ? nextNewline + 1 : insertPos;
|
|
181
|
+
s.appendLeft(actualInsertPos, importsToAdd.join("\n") + "\n");
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
s.prepend(importsToAdd.join("\n") + "\n");
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
// No block comment at start, add at beginning
|
|
189
|
+
s.prepend(importsToAdd.join("\n") + "\n");
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Handle default export renaming if present
|
|
193
|
+
const hasDefExport = hasDefaultExport(code, normalizedId);
|
|
194
|
+
if (hasDefExport) {
|
|
195
|
+
// Find and rename default function export using ast-grep
|
|
196
|
+
const ext = path.extname(normalizedId).toLowerCase();
|
|
197
|
+
const lang = ext === ".tsx" || ext === ".jsx" ? Lang.Tsx : SgLang.TypeScript;
|
|
198
|
+
try {
|
|
199
|
+
const root = sgParse(lang, code);
|
|
200
|
+
// Handle named default function: export default function myFunc() {}
|
|
201
|
+
const namedMatches = root
|
|
202
|
+
.root()
|
|
203
|
+
.findAll("export default function $NAME($$$) { $$$ }");
|
|
204
|
+
if (namedMatches.length > 0) {
|
|
205
|
+
const match = namedMatches[0];
|
|
206
|
+
const range = match.range();
|
|
207
|
+
const funcName = match.getMatch("NAME")?.text();
|
|
208
|
+
if (funcName) {
|
|
209
|
+
// Replace "export default function myFunc" with "function __defaultServerFunction__"
|
|
210
|
+
const newText = match
|
|
211
|
+
.text()
|
|
212
|
+
.replace(`export default function ${funcName}`, "function __defaultServerFunction__");
|
|
213
|
+
s.overwrite(range.start.index, range.end.index, newText);
|
|
214
|
+
s.append("\nexport default __defaultServerFunction__;\n");
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
// Handle anonymous default function: export default function() {}
|
|
219
|
+
const anonMatches = root
|
|
220
|
+
.root()
|
|
221
|
+
.findAll("export default function($$$) { $$$ }");
|
|
222
|
+
if (anonMatches.length > 0) {
|
|
223
|
+
const match = anonMatches[0];
|
|
224
|
+
const range = match.range();
|
|
225
|
+
const newText = match
|
|
226
|
+
.text()
|
|
227
|
+
.replace("export default function", "function __defaultServerFunction__");
|
|
228
|
+
s.overwrite(range.start.index, range.end.index, newText);
|
|
229
|
+
s.append("\nexport default __defaultServerFunction__;\n");
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
const predefinedMatches = root
|
|
233
|
+
.root()
|
|
234
|
+
.findAll("export default $NAME");
|
|
235
|
+
if (predefinedMatches.length > 0) {
|
|
236
|
+
const match = predefinedMatches[0];
|
|
237
|
+
const nameCapture = match.getMatch("NAME")?.text();
|
|
238
|
+
if (nameCapture) {
|
|
239
|
+
s.append(`const __defaultServerFunction__ = ${nameCapture};\n`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
process.env.VERBOSE &&
|
|
247
|
+
log("Error processing default function: %O", err);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Add registration calls at the end
|
|
251
|
+
let registrationCalls = [];
|
|
252
|
+
const registeredFunctions = new Set(); // Track to avoid duplicates
|
|
253
|
+
if (hasDefExport) {
|
|
254
|
+
registrationCalls.push(`registerServerReference(__defaultServerFunction__, ${JSON.stringify(normalizedId)}, "default")`);
|
|
255
|
+
registeredFunctions.add("default");
|
|
256
|
+
log("Registered worker server reference for default export in normalizedId=%s", normalizedId);
|
|
257
|
+
}
|
|
258
|
+
// Register local functions
|
|
259
|
+
const defaultFunctionName = findDefaultFunctionName(code, normalizedId);
|
|
260
|
+
for (const name of exportInfo.localFunctions) {
|
|
261
|
+
if (name === "__defaultServerFunction__" ||
|
|
262
|
+
name === "default" ||
|
|
263
|
+
name === defaultFunctionName)
|
|
264
|
+
continue;
|
|
265
|
+
// Skip if already registered
|
|
266
|
+
if (registeredFunctions.has(name))
|
|
267
|
+
continue;
|
|
268
|
+
registrationCalls.push(`registerServerReference(${name}, ${JSON.stringify(normalizedId)}, ${JSON.stringify(name)})`);
|
|
269
|
+
registeredFunctions.add(name);
|
|
270
|
+
log("Registered worker server reference for local function: %s in normalizedId=%s", name, normalizedId);
|
|
271
|
+
}
|
|
272
|
+
// Register re-exported functions
|
|
273
|
+
for (const reExport of exportInfo.reExports) {
|
|
274
|
+
// Skip if already registered
|
|
275
|
+
if (registeredFunctions.has(reExport.localName))
|
|
276
|
+
continue;
|
|
277
|
+
registrationCalls.push(`registerServerReference(${reExport.localName}, ${JSON.stringify(normalizedId)}, ${JSON.stringify(reExport.localName)})`);
|
|
278
|
+
registeredFunctions.add(reExport.localName);
|
|
279
|
+
log("Registered worker server reference for re-exported function: %s in normalizedId=%s", reExport.localName, normalizedId);
|
|
280
|
+
}
|
|
281
|
+
if (registrationCalls.length > 0) {
|
|
282
|
+
s.append(registrationCalls.join("\n") + "\n");
|
|
283
|
+
}
|
|
284
|
+
log("Worker transformation complete for normalizedId=%s", normalizedId);
|
|
285
|
+
return {
|
|
286
|
+
code: s.toString(),
|
|
287
|
+
map: s.generateMap({
|
|
288
|
+
source: normalizedId,
|
|
289
|
+
includeContent: true,
|
|
290
|
+
hires: true,
|
|
291
|
+
}),
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
process.env.VERBOSE &&
|
|
295
|
+
log("No transformation applied for environment=%s, normalizedId=%s", environment, normalizedId);
|
|
296
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|