rwsdk 1.0.0-beta.4 → 1.0.0-beta.40

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.
Files changed (139) hide show
  1. package/dist/lib/constants.d.mts +1 -0
  2. package/dist/lib/constants.mjs +7 -4
  3. package/dist/lib/e2e/browser.mjs +6 -2
  4. package/dist/lib/e2e/constants.d.mts +4 -0
  5. package/dist/lib/e2e/constants.mjs +49 -12
  6. package/dist/lib/e2e/dev.mjs +37 -49
  7. package/dist/lib/e2e/environment.d.mts +2 -0
  8. package/dist/lib/e2e/environment.mjs +201 -64
  9. package/dist/lib/e2e/index.d.mts +1 -0
  10. package/dist/lib/e2e/index.mjs +1 -0
  11. package/dist/lib/e2e/poll.d.mts +1 -1
  12. package/dist/lib/e2e/release.d.mts +1 -0
  13. package/dist/lib/e2e/release.mjs +16 -32
  14. package/dist/lib/e2e/tarball.mjs +2 -34
  15. package/dist/lib/e2e/testHarness.d.mts +34 -3
  16. package/dist/lib/e2e/testHarness.mjs +219 -90
  17. package/dist/lib/e2e/utils.d.mts +1 -0
  18. package/dist/lib/e2e/utils.mjs +15 -0
  19. package/dist/runtime/client/client.d.ts +35 -0
  20. package/dist/runtime/client/client.js +35 -0
  21. package/dist/runtime/client/navigation.d.ts +49 -0
  22. package/dist/runtime/client/navigation.js +80 -31
  23. package/dist/runtime/entries/clientSSR.d.ts +1 -0
  24. package/dist/runtime/entries/clientSSR.js +3 -0
  25. package/dist/runtime/entries/no-react-server-ssr-bridge.d.ts +0 -0
  26. package/dist/runtime/entries/no-react-server-ssr-bridge.js +2 -0
  27. package/dist/runtime/entries/router.d.ts +1 -0
  28. package/dist/runtime/entries/routerClient.d.ts +1 -0
  29. package/dist/runtime/entries/routerClient.js +1 -0
  30. package/dist/runtime/entries/worker.d.ts +2 -0
  31. package/dist/runtime/entries/worker.js +2 -0
  32. package/dist/runtime/imports/__mocks__/use-client-lookup.d.ts +6 -0
  33. package/dist/runtime/imports/__mocks__/use-client-lookup.js +6 -0
  34. package/dist/runtime/lib/db/SqliteDurableObject.d.ts +2 -2
  35. package/dist/runtime/lib/db/SqliteDurableObject.js +2 -2
  36. package/dist/runtime/lib/db/createDb.d.ts +1 -2
  37. package/dist/runtime/lib/db/createDb.js +4 -0
  38. package/dist/runtime/lib/db/typeInference/builders/alterTable.d.ts +13 -3
  39. package/dist/runtime/lib/db/typeInference/builders/columnDefinition.d.ts +35 -21
  40. package/dist/runtime/lib/db/typeInference/builders/createTable.d.ts +9 -2
  41. package/dist/runtime/lib/db/typeInference/database.d.ts +16 -2
  42. package/dist/runtime/lib/db/typeInference/typetests/alterTable.typetest.js +80 -5
  43. package/dist/runtime/lib/db/typeInference/typetests/createTable.typetest.js +104 -2
  44. package/dist/runtime/lib/db/typeInference/typetests/testUtils.d.ts +1 -0
  45. package/dist/runtime/lib/db/typeInference/utils.d.ts +59 -9
  46. package/dist/runtime/lib/links.d.ts +21 -7
  47. package/dist/runtime/lib/links.js +82 -24
  48. package/dist/runtime/lib/links.test.js +20 -0
  49. package/dist/runtime/lib/manifest.d.ts +1 -1
  50. package/dist/runtime/lib/manifest.js +7 -4
  51. package/dist/runtime/lib/realtime/client.js +8 -2
  52. package/dist/runtime/lib/realtime/worker.d.ts +1 -1
  53. package/dist/runtime/lib/router.d.ts +153 -36
  54. package/dist/runtime/lib/router.js +169 -20
  55. package/dist/runtime/lib/router.test.js +241 -0
  56. package/dist/runtime/lib/stitchDocumentAndAppStreams.d.ts +66 -0
  57. package/dist/runtime/lib/stitchDocumentAndAppStreams.js +302 -35
  58. package/dist/runtime/lib/stitchDocumentAndAppStreams.test.d.ts +1 -0
  59. package/dist/runtime/lib/stitchDocumentAndAppStreams.test.js +418 -0
  60. package/dist/runtime/lib/{rwContext.d.ts → types.d.ts} +1 -0
  61. package/dist/runtime/lib/types.js +1 -0
  62. package/dist/runtime/render/renderDocumentHtmlStream.d.ts +1 -1
  63. package/dist/runtime/render/renderToStream.d.ts +4 -2
  64. package/dist/runtime/render/renderToStream.js +53 -24
  65. package/dist/runtime/render/renderToString.d.ts +3 -6
  66. package/dist/runtime/requestInfo/types.d.ts +4 -1
  67. package/dist/runtime/requestInfo/utils.d.ts +9 -0
  68. package/dist/runtime/requestInfo/utils.js +44 -0
  69. package/dist/runtime/requestInfo/worker.d.ts +0 -1
  70. package/dist/runtime/requestInfo/worker.js +3 -10
  71. package/dist/runtime/script.d.ts +1 -3
  72. package/dist/runtime/script.js +1 -10
  73. package/dist/runtime/state.d.ts +3 -0
  74. package/dist/runtime/state.js +13 -0
  75. package/dist/runtime/worker.d.ts +3 -1
  76. package/dist/runtime/worker.js +32 -0
  77. package/dist/scripts/debug-sync.mjs +18 -20
  78. package/dist/scripts/worker-run.d.mts +1 -1
  79. package/dist/scripts/worker-run.mjs +59 -113
  80. package/dist/use-synced-state/SyncedStateServer.d.mts +21 -0
  81. package/dist/use-synced-state/SyncedStateServer.mjs +128 -0
  82. package/dist/use-synced-state/__tests__/SyncStateServer.test.d.mts +1 -0
  83. package/dist/use-synced-state/__tests__/SyncStateServer.test.mjs +109 -0
  84. package/dist/use-synced-state/__tests__/useSyncState.test.d.ts +1 -0
  85. package/dist/use-synced-state/__tests__/useSyncState.test.js +115 -0
  86. package/dist/use-synced-state/__tests__/useSyncedState.test.d.ts +1 -0
  87. package/dist/use-synced-state/__tests__/useSyncedState.test.js +115 -0
  88. package/dist/use-synced-state/__tests__/worker.test.d.mts +1 -0
  89. package/dist/use-synced-state/__tests__/worker.test.mjs +69 -0
  90. package/dist/use-synced-state/client-core.d.ts +26 -0
  91. package/dist/use-synced-state/client-core.js +39 -0
  92. package/dist/use-synced-state/client.d.ts +3 -0
  93. package/dist/use-synced-state/client.js +4 -0
  94. package/dist/use-synced-state/constants.d.mts +1 -0
  95. package/dist/use-synced-state/constants.mjs +1 -0
  96. package/dist/use-synced-state/useSyncedState.d.ts +20 -0
  97. package/dist/use-synced-state/useSyncedState.js +58 -0
  98. package/dist/use-synced-state/worker.d.mts +13 -0
  99. package/dist/use-synced-state/worker.mjs +69 -0
  100. package/dist/vite/buildApp.mjs +34 -2
  101. package/dist/vite/cloudflarePreInitPlugin.d.mts +11 -0
  102. package/dist/vite/cloudflarePreInitPlugin.mjs +40 -0
  103. package/dist/vite/configPlugin.mjs +9 -14
  104. package/dist/vite/constants.d.mts +1 -0
  105. package/dist/vite/constants.mjs +1 -0
  106. package/dist/vite/createDirectiveLookupPlugin.mjs +10 -7
  107. package/dist/vite/devServerTimingPlugin.mjs +4 -0
  108. package/dist/vite/diagnosticAssetGraphPlugin.d.mts +4 -0
  109. package/dist/vite/diagnosticAssetGraphPlugin.mjs +41 -0
  110. package/dist/vite/directiveModulesDevPlugin.mjs +9 -1
  111. package/dist/vite/directivesPlugin.mjs +4 -4
  112. package/dist/vite/envResolvers.d.mts +11 -0
  113. package/dist/vite/envResolvers.mjs +20 -0
  114. package/dist/vite/getViteEsbuild.mjs +2 -1
  115. package/dist/vite/hmrStabilityPlugin.d.mts +2 -0
  116. package/dist/vite/hmrStabilityPlugin.mjs +73 -0
  117. package/dist/vite/injectVitePreamblePlugin.mjs +0 -4
  118. package/dist/vite/knownDepsResolverPlugin.d.mts +0 -6
  119. package/dist/vite/knownDepsResolverPlugin.mjs +25 -17
  120. package/dist/vite/linkerPlugin.d.mts +2 -1
  121. package/dist/vite/linkerPlugin.mjs +11 -3
  122. package/dist/vite/linkerPlugin.test.mjs +15 -0
  123. package/dist/vite/miniflareHMRPlugin.mjs +6 -38
  124. package/dist/vite/moveStaticAssetsPlugin.mjs +35 -4
  125. package/dist/vite/redwoodPlugin.mjs +8 -10
  126. package/dist/vite/runDirectivesScan.mjs +72 -18
  127. package/dist/vite/ssrBridgePlugin.mjs +132 -40
  128. package/dist/vite/ssrBridgeWrapPlugin.d.mts +2 -0
  129. package/dist/vite/ssrBridgeWrapPlugin.mjs +85 -0
  130. package/dist/vite/staleDepRetryPlugin.d.mts +2 -0
  131. package/dist/vite/staleDepRetryPlugin.mjs +74 -0
  132. package/dist/vite/statePlugin.d.mts +4 -0
  133. package/dist/vite/statePlugin.mjs +62 -0
  134. package/dist/vite/transformJsxScriptTagsPlugin.mjs +0 -5
  135. package/dist/vite/virtualPlugin.mjs +6 -7
  136. package/package.json +27 -10
  137. package/dist/vite/manifestPlugin.d.mts +0 -4
  138. package/dist/vite/manifestPlugin.mjs +0 -63
  139. /package/dist/runtime/lib/{rwContext.js → links.test.d.ts} +0 -0
@@ -0,0 +1,62 @@
1
+ import debug from "debug";
2
+ import fs from "node:fs/promises";
3
+ import { RW_STATE_EXPORT_PATH } from "../lib/constants.mjs";
4
+ import { maybeResolveEnvImport } from "./envResolvers.mjs";
5
+ const log = debug("rwsdk:vite:state-plugin");
6
+ const VIRTUAL_STATE_PREFIX = "virtual:rwsdk:state:";
7
+ export const statePlugin = ({ projectRootDir, }) => {
8
+ let isDev = false;
9
+ const stateModulePath = maybeResolveEnvImport({
10
+ id: RW_STATE_EXPORT_PATH,
11
+ envName: "worker",
12
+ projectRootDir,
13
+ });
14
+ if (!stateModulePath) {
15
+ throw new Error(`[rwsdk] State module path not found for project root: ${projectRootDir}. This is likely a bug in RedwoodSDK. Please report this issue at https://github.com/redwoodjs/sdk/issues/new`);
16
+ }
17
+ return {
18
+ name: "rwsdk:state",
19
+ enforce: "pre",
20
+ config(_, { command, isPreview }) {
21
+ isDev = !isPreview && command === "serve";
22
+ },
23
+ configEnvironment(env, config) {
24
+ if (env === "worker") {
25
+ config.optimizeDeps ??= {};
26
+ config.optimizeDeps.esbuildOptions ??= {};
27
+ config.optimizeDeps.esbuildOptions.plugins ??= [];
28
+ config.optimizeDeps.esbuildOptions.plugins.push({
29
+ name: "rwsdk-state-external",
30
+ setup(build) {
31
+ build.onResolve({
32
+ // context(justinvdm, 13 Oct 2025): Vite dep optimizer slugifies the export path
33
+ filter: new RegExp(`^(${RW_STATE_EXPORT_PATH}|${VIRTUAL_STATE_PREFIX}.*)$`),
34
+ }, (args) => {
35
+ log("Marking as external: %s", args.path);
36
+ return {
37
+ path: args.path,
38
+ external: true,
39
+ };
40
+ });
41
+ },
42
+ });
43
+ }
44
+ },
45
+ resolveId(id) {
46
+ if (id === RW_STATE_EXPORT_PATH) {
47
+ if (isDev && this.environment.name === "worker") {
48
+ return `${VIRTUAL_STATE_PREFIX}${id}`;
49
+ }
50
+ else {
51
+ return stateModulePath;
52
+ }
53
+ }
54
+ },
55
+ async load(id) {
56
+ if (id.startsWith(VIRTUAL_STATE_PREFIX)) {
57
+ log("Loading virtual state module from %s", stateModulePath);
58
+ return await fs.readFile(stateModulePath, "utf-8");
59
+ }
60
+ },
61
+ };
62
+ };
@@ -319,10 +319,6 @@ export const transformJsxScriptTagsPlugin = ({ clientEntryPoints, projectRootDir
319
319
  isBuild = config.command === "build";
320
320
  },
321
321
  async transform(code, id) {
322
- // Skip during directive scanning to avoid performance issues
323
- if (process.env.RWSDK_DIRECTIVE_SCAN_ACTIVE) {
324
- return;
325
- }
326
322
  if (isBuild &&
327
323
  this.environment?.name === "worker" &&
328
324
  process.env.RWSDK_BUILD_PASS !== "worker") {
@@ -330,7 +326,6 @@ export const transformJsxScriptTagsPlugin = ({ clientEntryPoints, projectRootDir
330
326
  }
331
327
  if (this.environment?.name === "worker" &&
332
328
  id.endsWith(".tsx") &&
333
- !id.includes("node_modules") &&
334
329
  hasJsxFunctions(code)) {
335
330
  log("Transforming JSX script tags in %s", id);
336
331
  process.env.VERBOSE && log("Code:\n%s", code);
@@ -3,9 +3,12 @@ export const virtualPlugin = (name, load) => {
3
3
  name = "virtual:" + name;
4
4
  return {
5
5
  name: `rwsdk:virtual-${name}`,
6
- resolveId(source, _importer, _options) {
7
- // Skip during directive scanning to avoid performance issues
8
- if (process.env.RWSDK_DIRECTIVE_SCAN_ACTIVE) {
6
+ resolveId(source, _importer, options) {
7
+ // Skip during our directive scanning to avoid performance issues
8
+ // context(justinvdm, 20 Jan 2025): We check options.custom?.rwsdk?.directiveScan to distinguish
9
+ // between our directive scan (which should skip) and external calls like Cloudflare's early
10
+ // dispatch (which should be handled normally).
11
+ if (options?.custom?.rwsdk?.directiveScan === true) {
9
12
  return;
10
13
  }
11
14
  if (source === name || source.startsWith(`${name}?`)) {
@@ -14,10 +17,6 @@ export const virtualPlugin = (name, load) => {
14
17
  return;
15
18
  },
16
19
  load(id, options) {
17
- // Skip during directive scanning to avoid performance issues
18
- if (process.env.RWSDK_DIRECTIVE_SCAN_ACTIVE) {
19
- return;
20
- }
21
20
  if (id === `\0${name}` || id.startsWith(`\0${name}?`)) {
22
21
  return load.apply(this, [id, options]);
23
22
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rwsdk",
3
- "version": "1.0.0-beta.4",
3
+ "version": "1.0.0-beta.40",
4
4
  "description": "Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime",
5
5
  "type": "module",
6
6
  "bin": {
@@ -36,6 +36,10 @@
36
36
  "types": "./dist/runtime/entries/client.d.ts",
37
37
  "default": "./dist/runtime/entries/client.js"
38
38
  },
39
+ "./__state": {
40
+ "types": "./dist/runtime/state.d.ts",
41
+ "default": "./dist/runtime/state.js"
42
+ },
39
43
  "./__ssr": {
40
44
  "react-server": "./dist/runtime/entries/no-react-server.js",
41
45
  "types": "./dist/runtime/entries/ssr.d.ts",
@@ -54,7 +58,8 @@
54
58
  },
55
59
  "./router": {
56
60
  "types": "./dist/runtime/entries/router.d.ts",
57
- "default": "./dist/runtime/entries/router.js"
61
+ "workerd": "./dist/runtime/entries/router.js",
62
+ "default": "./dist/runtime/entries/routerClient.js"
58
63
  },
59
64
  "./auth": {
60
65
  "types": "./dist/runtime/entries/auth.d.ts",
@@ -99,6 +104,14 @@
99
104
  "./realtime/durableObject": {
100
105
  "types": "./dist/runtime/lib/realtime/durableObject.d.ts",
101
106
  "default": "./dist/runtime/lib/realtime/durableObject.js"
107
+ },
108
+ "./use-synced-state/client": {
109
+ "types": "./dist/use-synced-state/client.d.ts",
110
+ "default": "./dist/use-synced-state/client.js"
111
+ },
112
+ "./use-synced-state/worker": {
113
+ "types": "./dist/use-synced-state/worker.d.mts",
114
+ "workerd": "./dist/use-synced-state/worker.mjs"
102
115
  }
103
116
  },
104
117
  "keywords": [
@@ -139,18 +152,21 @@
139
152
  "@puppeteer/browsers": "~2.10.0",
140
153
  "@types/decompress": "~4.2.7",
141
154
  "@types/fs-extra": "~11.0.4",
155
+ "@types/glob": "^8.1.0",
142
156
  "@types/react": "~19.1.2",
143
157
  "@types/react-dom": "~19.1.2",
144
158
  "@types/react-is": "~19.0.0",
145
159
  "@vitejs/plugin-react": "~5.0.0",
146
160
  "chokidar": "~4.0.0",
147
161
  "debug": "~4.4.0",
162
+ "decompress": "~4.2.1",
148
163
  "enhanced-resolve": "~5.18.1",
149
164
  "eventsource-parser": "~3.0.0",
150
165
  "execa": "~9.6.0",
151
166
  "find-up": "~8.0.0",
152
167
  "fs-extra": "~11.3.0",
153
- "glob": "~11.0.1",
168
+ "get-port": "^7.1.0",
169
+ "glob": "~11.1.0",
154
170
  "ignore": "~7.0.4",
155
171
  "jsonc-parser": "~3.3.1",
156
172
  "kysely": "~0.28.2",
@@ -166,20 +182,21 @@
166
182
  "ts-morph": "~27.0.0",
167
183
  "unique-names-generator": "~4.7.1",
168
184
  "vibe-rules": "~0.3.0",
169
- "vite-tsconfig-paths": "~5.1.4",
170
- "decompress": "~4.2.1"
185
+ "vite-tsconfig-paths": "~5.1.4"
171
186
  },
172
187
  "peerDependencies": {
173
- "@cloudflare/vite-plugin": "^1.12.4",
174
- "react": ">=19.2.0-canary-3fb190f7-20250908 <20.0.0",
175
- "react-dom": ">=19.2.0-canary-3fb190f7-20250908 <20.0.0",
176
- "react-server-dom-webpack": ">=19.2.0-canary-3fb190f7-20250908 <20.0.0",
188
+ "@cloudflare/vite-plugin": "^1.13.10",
189
+ "capnweb": "~0.2.0",
190
+ "react": ">=19.2.0-0 <19.3.0 || >=19.3.0-0 <20.0.0",
191
+ "react-dom": ">=19.2.0-0 <19.3.0 || >=19.3.0-0 <20.0.0",
192
+ "react-server-dom-webpack": ">=19.2.0-0 <19.3.0 || >=19.3.0-0 <20.0.0",
177
193
  "vite": "^6.2.6 || 7.x",
178
194
  "wrangler": "^4.35.0"
179
195
  },
180
196
  "packageManager": "pnpm@10.0.0+sha512.b8fef5494bd3fe4cbd4edabd0745df2ee5be3e4b0b8b08fa643aa3e4c6702ccc0f00d68fa8a8c9858a735a0032485a44990ed2810526c875e416f001b17df12b",
181
197
  "devDependencies": {
182
198
  "@cloudflare/vite-plugin": "1.13.3",
199
+ "capnweb": "~0.2.0",
183
200
  "@types/debug": "~4.1.12",
184
201
  "@types/js-beautify": "~1.14.3",
185
202
  "@types/lodash": "~4.17.16",
@@ -189,7 +206,7 @@
189
206
  "semver": "~7.7.1",
190
207
  "tsx": "~4.20.0",
191
208
  "typescript": "~5.9.0",
192
- "vite": "7.1.6",
209
+ "vite": "~7.2.0",
193
210
  "vitest": "~3.2.0"
194
211
  }
195
212
  }
@@ -1,4 +0,0 @@
1
- import { type Plugin } from "vite";
2
- export declare const manifestPlugin: ({ projectRootDir, }: {
3
- projectRootDir: string;
4
- }) => Plugin;
@@ -1,63 +0,0 @@
1
- import debug from "debug";
2
- const log = debug("rwsdk:vite:manifest-plugin");
3
- const virtualModuleId = "virtual:rwsdk:manifest.js";
4
- const resolvedVirtualModuleId = "\0" + virtualModuleId;
5
- export const manifestPlugin = ({ projectRootDir, }) => {
6
- let isBuild = false;
7
- return {
8
- name: "rwsdk:vite:manifest-plugin",
9
- enforce: "pre",
10
- configResolved(config) {
11
- isBuild = config.command === "build";
12
- },
13
- resolveId(id) {
14
- // Skip during directive scanning to avoid performance issues
15
- if (process.env.RWSDK_DIRECTIVE_SCAN_ACTIVE) {
16
- return;
17
- }
18
- if (id === virtualModuleId) {
19
- return resolvedVirtualModuleId;
20
- }
21
- },
22
- async load(id) {
23
- // Skip during directive scanning to avoid performance issues
24
- if (process.env.RWSDK_DIRECTIVE_SCAN_ACTIVE) {
25
- return;
26
- }
27
- if (id === resolvedVirtualModuleId) {
28
- if (isBuild) {
29
- // context(justinvdm, 28 Aug 2025): During the build, we don't have
30
- // the manifest yet. We insert a placeholder that the linker plugin
31
- // will replace in the final phase.
32
- log("Returning manifest placeholder for build");
33
- return `export default "__RWSDK_MANIFEST_PLACEHOLDER__"`;
34
- }
35
- // In dev, we can return an empty object.
36
- log("Not a build, returning empty manifest");
37
- return `export default {}`;
38
- }
39
- },
40
- configEnvironment(name, config) {
41
- if (name !== "worker" && name !== "ssr") {
42
- return;
43
- }
44
- log("Configuring environment: name=%s", name);
45
- config.optimizeDeps ??= {};
46
- config.optimizeDeps.esbuildOptions ??= {};
47
- config.optimizeDeps.esbuildOptions.plugins ??= [];
48
- config.optimizeDeps.esbuildOptions.plugins.push({
49
- name: "rwsdk:manifest:esbuild",
50
- setup(build) {
51
- log("Setting up esbuild plugin for environment: %s", name);
52
- build.onResolve({ filter: /^virtual:rwsdk:manifest\.js$/ }, () => {
53
- log("Resolving virtual manifest module in esbuild");
54
- return {
55
- path: "virtual:rwsdk:manifest.js",
56
- external: true,
57
- };
58
- });
59
- },
60
- });
61
- },
62
- };
63
- };