rwsdk 1.0.5 → 1.0.7
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/runtime/entries/types/shared.d.ts +1 -0
- package/dist/runtime/register/methodEnforcer.d.ts +8 -0
- package/dist/runtime/register/methodEnforcer.js +41 -0
- package/dist/runtime/register/methodEnforcer.test.d.ts +1 -0
- package/dist/runtime/register/methodEnforcer.test.js +128 -0
- package/dist/runtime/register/worker.js +2 -24
- package/dist/runtime/render/assetPaths.d.ts +11 -0
- package/dist/runtime/render/assetPaths.js +11 -0
- package/dist/runtime/render/assetPaths.test.d.ts +1 -0
- package/dist/runtime/render/assetPaths.test.js +23 -0
- package/dist/runtime/render/preloads.js +2 -1
- package/dist/runtime/render/preloads.test.d.ts +1 -0
- package/dist/runtime/render/preloads.test.js +69 -0
- package/dist/runtime/render/stylesheets.js +2 -1
- package/dist/vite/directivesFilteringPlugin.mjs +2 -1
- package/package.json +8 -8
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type GetServerModuleExport = (actionId: string) => Promise<unknown>;
|
|
2
|
+
type DecodeReply = (data: string | FormData, moduleMap: null) => Promise<unknown>;
|
|
3
|
+
export interface RscActionHandlerDeps {
|
|
4
|
+
getServerModuleExport: GetServerModuleExport;
|
|
5
|
+
decodeReply: DecodeReply;
|
|
6
|
+
}
|
|
7
|
+
export declare function rscActionHandler(req: Request, { getServerModuleExport, decodeReply }: RscActionHandlerDeps): Promise<unknown>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// context(justinvdm, 2026-04-06): Extracted from rscActionHandler() for testability.
|
|
2
|
+
// The real getServerModuleExport and decodeReply require the react-server environment
|
|
3
|
+
// (virtual module lookup, react-server-dom-webpack), so we accept them as injected
|
|
4
|
+
// dependencies. worker.ts passes the real implementations; tests pass fakes.
|
|
5
|
+
export async function rscActionHandler(req, { getServerModuleExport, decodeReply }) {
|
|
6
|
+
const url = new URL(req.url);
|
|
7
|
+
const contentType = req.headers.get("content-type");
|
|
8
|
+
let args = [];
|
|
9
|
+
if (req.method === "GET") {
|
|
10
|
+
const argsParam = url.searchParams.get("args");
|
|
11
|
+
if (argsParam) {
|
|
12
|
+
args = JSON.parse(argsParam);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
const data = contentType?.startsWith("multipart/form-data")
|
|
17
|
+
? await req.formData()
|
|
18
|
+
: await req.text();
|
|
19
|
+
args = (await decodeReply(data, null));
|
|
20
|
+
}
|
|
21
|
+
const actionId = url.searchParams.get("__rsc_action_id");
|
|
22
|
+
if (import.meta.env.VITE_IS_DEV_SERVER && actionId === "__rsc_hot_update") {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const action = await getServerModuleExport(actionId);
|
|
26
|
+
if (typeof action !== "function") {
|
|
27
|
+
throw new Error(`Action ${actionId} is not a function`);
|
|
28
|
+
}
|
|
29
|
+
// context(justinvdm, 2026-04-06): Validate the declared HTTP method before
|
|
30
|
+
// invocation. serverAction() attaches .method = "POST" at creation time via
|
|
31
|
+
// createServerFunction(), serverQuery() attaches "GET". Functions without
|
|
32
|
+
// .method default to POST to match serverAction() semantics.
|
|
33
|
+
const actionMethod = action.method ?? "POST";
|
|
34
|
+
if (actionMethod !== req.method) {
|
|
35
|
+
return new Response(`Method ${req.method} is not allowed for this action. Allowed: ${actionMethod}.`, {
|
|
36
|
+
status: 405,
|
|
37
|
+
headers: { Allow: actionMethod },
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return action(...args);
|
|
41
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { rscActionHandler } from "./methodEnforcer";
|
|
3
|
+
function createDeps(action) {
|
|
4
|
+
return {
|
|
5
|
+
getServerModuleExport: vi.fn().mockResolvedValue(action),
|
|
6
|
+
decodeReply: vi.fn().mockResolvedValue([]),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function makeRequest(url, method, body) {
|
|
10
|
+
const init = { method };
|
|
11
|
+
if (body !== undefined) {
|
|
12
|
+
init.body = body;
|
|
13
|
+
init.headers = { "content-type": "application/json" };
|
|
14
|
+
}
|
|
15
|
+
return new Request(url, init);
|
|
16
|
+
}
|
|
17
|
+
const ACTION_URL = "https://app.test/page?__rsc_action_id=%2Factions.tsx%23doThing";
|
|
18
|
+
describe("rscActionHandler method enforcement", () => {
|
|
19
|
+
it("rejects GET for an action with method POST", async () => {
|
|
20
|
+
const action = Object.assign(vi.fn(), { method: "POST" });
|
|
21
|
+
const deps = createDeps(action);
|
|
22
|
+
const req = makeRequest(ACTION_URL, "GET");
|
|
23
|
+
const result = await rscActionHandler(req, deps);
|
|
24
|
+
expect(result).toBeInstanceOf(Response);
|
|
25
|
+
const res = result;
|
|
26
|
+
expect(res.status).toBe(405);
|
|
27
|
+
expect(res.headers.get("Allow")).toBe("POST");
|
|
28
|
+
expect(action).not.toHaveBeenCalled();
|
|
29
|
+
});
|
|
30
|
+
it("rejects POST for an action with method GET", async () => {
|
|
31
|
+
const action = Object.assign(vi.fn(), { method: "GET" });
|
|
32
|
+
const deps = createDeps(action);
|
|
33
|
+
const req = makeRequest(ACTION_URL, "POST", "[]");
|
|
34
|
+
const result = await rscActionHandler(req, deps);
|
|
35
|
+
expect(result).toBeInstanceOf(Response);
|
|
36
|
+
const res = result;
|
|
37
|
+
expect(res.status).toBe(405);
|
|
38
|
+
expect(res.headers.get("Allow")).toBe("GET");
|
|
39
|
+
expect(action).not.toHaveBeenCalled();
|
|
40
|
+
});
|
|
41
|
+
it("allows POST for an action with method POST", async () => {
|
|
42
|
+
const action = Object.assign(vi.fn().mockReturnValue("ok"), {
|
|
43
|
+
method: "POST",
|
|
44
|
+
});
|
|
45
|
+
const deps = createDeps(action);
|
|
46
|
+
const req = makeRequest(ACTION_URL, "POST", "[]");
|
|
47
|
+
const result = await rscActionHandler(req, deps);
|
|
48
|
+
expect(result).toBe("ok");
|
|
49
|
+
expect(action).toHaveBeenCalled();
|
|
50
|
+
});
|
|
51
|
+
it("allows GET for an action with method GET", async () => {
|
|
52
|
+
const action = Object.assign(vi.fn().mockReturnValue("data"), {
|
|
53
|
+
method: "GET",
|
|
54
|
+
});
|
|
55
|
+
const deps = createDeps(action);
|
|
56
|
+
const req = makeRequest(ACTION_URL + "&args=%5B%5D", "GET");
|
|
57
|
+
const result = await rscActionHandler(req, deps);
|
|
58
|
+
expect(result).toBe("data");
|
|
59
|
+
expect(action).toHaveBeenCalled();
|
|
60
|
+
});
|
|
61
|
+
it("defaults to POST for actions without .method property", async () => {
|
|
62
|
+
const action = vi.fn().mockReturnValue("ok");
|
|
63
|
+
const deps = createDeps(action);
|
|
64
|
+
const postReq = makeRequest(ACTION_URL, "POST", "[]");
|
|
65
|
+
const postResult = await rscActionHandler(postReq, deps);
|
|
66
|
+
expect(postResult).toBe("ok");
|
|
67
|
+
expect(action).toHaveBeenCalled();
|
|
68
|
+
});
|
|
69
|
+
it("rejects GET for actions without .method property", async () => {
|
|
70
|
+
const action = vi.fn();
|
|
71
|
+
const deps = createDeps(action);
|
|
72
|
+
const getReq = makeRequest(ACTION_URL, "GET");
|
|
73
|
+
const getResult = await rscActionHandler(getReq, deps);
|
|
74
|
+
expect(getResult).toBeInstanceOf(Response);
|
|
75
|
+
expect(getResult.status).toBe(405);
|
|
76
|
+
expect(action).not.toHaveBeenCalled();
|
|
77
|
+
});
|
|
78
|
+
it("includes allowed methods in 405 response body", async () => {
|
|
79
|
+
const action = Object.assign(vi.fn(), { method: "POST" });
|
|
80
|
+
const deps = createDeps(action);
|
|
81
|
+
const req = makeRequest(ACTION_URL, "GET");
|
|
82
|
+
const result = (await rscActionHandler(req, deps));
|
|
83
|
+
const body = await result.text();
|
|
84
|
+
expect(body).toContain("Method GET is not allowed");
|
|
85
|
+
expect(body).toContain("Allowed: POST");
|
|
86
|
+
});
|
|
87
|
+
it("rejects when .method is not a valid string", async () => {
|
|
88
|
+
const action = Object.assign(vi.fn(), {
|
|
89
|
+
method: 42,
|
|
90
|
+
});
|
|
91
|
+
const deps = createDeps(action);
|
|
92
|
+
const req = makeRequest(ACTION_URL, "GET");
|
|
93
|
+
const result = await rscActionHandler(req, deps);
|
|
94
|
+
expect(result).toBeInstanceOf(Response);
|
|
95
|
+
expect(result.status).toBe(405);
|
|
96
|
+
expect(action).not.toHaveBeenCalled();
|
|
97
|
+
});
|
|
98
|
+
it("throws when action is not a function", async () => {
|
|
99
|
+
const deps = {
|
|
100
|
+
getServerModuleExport: vi.fn().mockResolvedValue("not-a-function"),
|
|
101
|
+
decodeReply: vi.fn(),
|
|
102
|
+
};
|
|
103
|
+
const req = makeRequest(ACTION_URL, "GET");
|
|
104
|
+
await expect(rscActionHandler(req, deps)).rejects.toThrow("is not a function");
|
|
105
|
+
});
|
|
106
|
+
it("parses GET args from query string", async () => {
|
|
107
|
+
const action = Object.assign(vi.fn().mockReturnValue("result"), {
|
|
108
|
+
method: "GET",
|
|
109
|
+
});
|
|
110
|
+
const deps = createDeps(action);
|
|
111
|
+
const req = makeRequest(ACTION_URL + '&args=%5B%22hello%22%2C%2042%5D', "GET");
|
|
112
|
+
await rscActionHandler(req, deps);
|
|
113
|
+
expect(action).toHaveBeenCalledWith("hello", 42);
|
|
114
|
+
});
|
|
115
|
+
it("uses decodeReply for POST body", async () => {
|
|
116
|
+
const action = Object.assign(vi.fn().mockReturnValue("result"), {
|
|
117
|
+
method: "POST",
|
|
118
|
+
});
|
|
119
|
+
const deps = {
|
|
120
|
+
getServerModuleExport: vi.fn().mockResolvedValue(action),
|
|
121
|
+
decodeReply: vi.fn().mockResolvedValue(["decoded-arg"]),
|
|
122
|
+
};
|
|
123
|
+
const req = makeRequest(ACTION_URL, "POST", "serialized-body");
|
|
124
|
+
await rscActionHandler(req, deps);
|
|
125
|
+
expect(deps.decodeReply).toHaveBeenCalledWith("serialized-body", null);
|
|
126
|
+
expect(action).toHaveBeenCalledWith("decoded-arg");
|
|
127
|
+
});
|
|
128
|
+
});
|
|
@@ -2,6 +2,7 @@ import { isValidElementType } from "react-is";
|
|
|
2
2
|
import { registerClientReference as baseRegisterClientReference, registerServerReference as baseRegisterServerReference, decodeReply, } from "react-server-dom-webpack/server.edge";
|
|
3
3
|
import { getServerModuleExport } from "../imports/worker.js";
|
|
4
4
|
import { requestInfo } from "../requestInfo/worker.js";
|
|
5
|
+
import { rscActionHandler as rscActionHandlerImpl } from "./methodEnforcer.js";
|
|
5
6
|
export function registerServerReference(action, id, name) {
|
|
6
7
|
if (typeof action !== "function") {
|
|
7
8
|
return action;
|
|
@@ -48,28 +49,5 @@ export async function __smokeTestActionHandler(timestamp) {
|
|
|
48
49
|
return { status: "ok", timestamp };
|
|
49
50
|
}
|
|
50
51
|
export async function rscActionHandler(req) {
|
|
51
|
-
|
|
52
|
-
const contentType = req.headers.get("content-type");
|
|
53
|
-
let args = [];
|
|
54
|
-
if (req.method === "GET") {
|
|
55
|
-
const argsParam = url.searchParams.get("args");
|
|
56
|
-
if (argsParam) {
|
|
57
|
-
args = JSON.parse(argsParam);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
const data = contentType?.startsWith("multipart/form-data")
|
|
62
|
-
? await req.formData()
|
|
63
|
-
: await req.text();
|
|
64
|
-
args = (await decodeReply(data, null));
|
|
65
|
-
}
|
|
66
|
-
const actionId = url.searchParams.get("__rsc_action_id");
|
|
67
|
-
if (import.meta.env.VITE_IS_DEV_SERVER && actionId === "__rsc_hot_update") {
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
const action = await getServerModuleExport(actionId);
|
|
71
|
-
if (typeof action !== "function") {
|
|
72
|
-
throw new Error(`Action ${actionId} is not a function`);
|
|
73
|
-
}
|
|
74
|
-
return action(...args);
|
|
52
|
+
return rscActionHandlerImpl(req, { getServerModuleExport, decodeReply });
|
|
75
53
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensures asset hrefs from the Vite manifest are absolute paths.
|
|
3
|
+
*
|
|
4
|
+
* Vite's manifest stores file paths without a leading slash (e.g. "assets/foo.js").
|
|
5
|
+
* When used as href attributes, these resolve relative to the current page URL,
|
|
6
|
+
* breaking on nested routes (e.g. /dashboard/editor resolves "assets/foo.js"
|
|
7
|
+
* as "/dashboard/assets/foo.js" instead of "/assets/foo.js").
|
|
8
|
+
*
|
|
9
|
+
* Prepends import.meta.env.BASE_URL (defaults to "/") to make paths absolute.
|
|
10
|
+
*/
|
|
11
|
+
export declare const toAbsoluteHref: (href: string) => string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensures asset hrefs from the Vite manifest are absolute paths.
|
|
3
|
+
*
|
|
4
|
+
* Vite's manifest stores file paths without a leading slash (e.g. "assets/foo.js").
|
|
5
|
+
* When used as href attributes, these resolve relative to the current page URL,
|
|
6
|
+
* breaking on nested routes (e.g. /dashboard/editor resolves "assets/foo.js"
|
|
7
|
+
* as "/dashboard/assets/foo.js" instead of "/assets/foo.js").
|
|
8
|
+
*
|
|
9
|
+
* Prepends import.meta.env.BASE_URL (defaults to "/") to make paths absolute.
|
|
10
|
+
*/
|
|
11
|
+
export const toAbsoluteHref = (href) => href.startsWith("/") ? href : import.meta.env.BASE_URL + href;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, expect, it, vi, afterEach } from "vitest";
|
|
2
|
+
import { toAbsoluteHref } from "./assetPaths";
|
|
3
|
+
describe("toAbsoluteHref", () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.unstubAllEnvs();
|
|
6
|
+
});
|
|
7
|
+
it("prepends / to relative paths when BASE_URL is /", () => {
|
|
8
|
+
vi.stubEnv("BASE_URL", "/");
|
|
9
|
+
expect(toAbsoluteHref("assets/client-abc123.js")).toBe("/assets/client-abc123.js");
|
|
10
|
+
});
|
|
11
|
+
it("prepends custom base to relative paths", () => {
|
|
12
|
+
vi.stubEnv("BASE_URL", "/app/");
|
|
13
|
+
expect(toAbsoluteHref("assets/client-abc123.js")).toBe("/app/assets/client-abc123.js");
|
|
14
|
+
});
|
|
15
|
+
it("does not double-prefix already absolute paths", () => {
|
|
16
|
+
vi.stubEnv("BASE_URL", "/");
|
|
17
|
+
expect(toAbsoluteHref("/assets/client-abc123.js")).toBe("/assets/client-abc123.js");
|
|
18
|
+
});
|
|
19
|
+
it("handles CSS paths", () => {
|
|
20
|
+
vi.stubEnv("BASE_URL", "/");
|
|
21
|
+
expect(toAbsoluteHref("assets/styles-def456.css")).toBe("/assets/styles-def456.css");
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -29,13 +29,14 @@ export function findScriptForModule(id, manifest) {
|
|
|
29
29
|
}
|
|
30
30
|
return find(id);
|
|
31
31
|
}
|
|
32
|
+
import { toAbsoluteHref } from "./assetPaths.js";
|
|
32
33
|
export const Preloads = async ({ requestInfo, }) => {
|
|
33
34
|
const manifest = await getManifest();
|
|
34
35
|
const allScripts = new Set();
|
|
35
36
|
for (const scriptId of requestInfo.rw.scriptsToBeLoaded) {
|
|
36
37
|
const script = findScriptForModule(scriptId, manifest);
|
|
37
38
|
if (script) {
|
|
38
|
-
allScripts.add(script.file);
|
|
39
|
+
allScripts.add(toAbsoluteHref(script.file));
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
42
|
return (_jsx(_Fragment, { children: Array.from(allScripts).map((href) => (_jsx("link", { rel: "modulepreload", href: href }, href))) }));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { findScriptForModule } from "./preloads";
|
|
3
|
+
describe("findScriptForModule", () => {
|
|
4
|
+
it("finds a direct entry module", () => {
|
|
5
|
+
const manifest = {
|
|
6
|
+
"src/client.tsx": {
|
|
7
|
+
file: "assets/client-abc123.js",
|
|
8
|
+
isEntry: true,
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
const result = findScriptForModule("/src/client.tsx", manifest);
|
|
12
|
+
expect(result?.file).toBe("assets/client-abc123.js");
|
|
13
|
+
});
|
|
14
|
+
it("finds a dynamic entry module", () => {
|
|
15
|
+
const manifest = {
|
|
16
|
+
"src/pages/editor.tsx": {
|
|
17
|
+
file: "assets/editor-def456.js",
|
|
18
|
+
isDynamicEntry: true,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
const result = findScriptForModule("/src/pages/editor.tsx", manifest);
|
|
22
|
+
expect(result?.file).toBe("assets/editor-def456.js");
|
|
23
|
+
});
|
|
24
|
+
it("follows imports to find the entry", () => {
|
|
25
|
+
const manifest = {
|
|
26
|
+
"src/components/Button.tsx": {
|
|
27
|
+
file: "assets/button-abc.js",
|
|
28
|
+
imports: ["src/lib/utils.ts"],
|
|
29
|
+
},
|
|
30
|
+
"src/lib/utils.ts": {
|
|
31
|
+
file: "assets/utils-def.js",
|
|
32
|
+
isEntry: true,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
const result = findScriptForModule("/src/components/Button.tsx", manifest);
|
|
36
|
+
expect(result?.file).toBe("assets/utils-def.js");
|
|
37
|
+
});
|
|
38
|
+
it("returns undefined for missing modules", () => {
|
|
39
|
+
const manifest = {};
|
|
40
|
+
const result = findScriptForModule("/src/missing.tsx", manifest);
|
|
41
|
+
expect(result).toBeUndefined();
|
|
42
|
+
});
|
|
43
|
+
it("handles circular imports without infinite loop", () => {
|
|
44
|
+
const manifest = {
|
|
45
|
+
"src/a.ts": {
|
|
46
|
+
file: "assets/a.js",
|
|
47
|
+
imports: ["src/b.ts"],
|
|
48
|
+
},
|
|
49
|
+
"src/b.ts": {
|
|
50
|
+
file: "assets/b.js",
|
|
51
|
+
imports: ["src/a.ts"],
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
const result = findScriptForModule("/src/a.ts", manifest);
|
|
55
|
+
expect(result).toBeUndefined();
|
|
56
|
+
});
|
|
57
|
+
it("strips leading slash from id to match manifest keys", () => {
|
|
58
|
+
const manifest = {
|
|
59
|
+
"src/client.tsx": {
|
|
60
|
+
file: "assets/client.js",
|
|
61
|
+
isEntry: true,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
// Module IDs from scriptsToBeLoaded have leading slashes
|
|
65
|
+
expect(findScriptForModule("/src/client.tsx", manifest)?.file).toBe("assets/client.js");
|
|
66
|
+
// Should also work without leading slash
|
|
67
|
+
expect(findScriptForModule("src/client.tsx", manifest)?.file).toBe("assets/client.js");
|
|
68
|
+
});
|
|
69
|
+
});
|
|
@@ -27,13 +27,14 @@ const findCssForModule = (scriptId, manifest) => {
|
|
|
27
27
|
inner(scriptId);
|
|
28
28
|
return Array.from(css);
|
|
29
29
|
};
|
|
30
|
+
import { toAbsoluteHref } from "./assetPaths.js";
|
|
30
31
|
export const Stylesheets = async ({ requestInfo, }) => {
|
|
31
32
|
const manifest = await getManifest();
|
|
32
33
|
const allStylesheets = new Set();
|
|
33
34
|
for (const scriptId of requestInfo.rw.scriptsToBeLoaded) {
|
|
34
35
|
const css = findCssForModule(scriptId, manifest);
|
|
35
36
|
for (const entry of css) {
|
|
36
|
-
allStylesheets.add(entry);
|
|
37
|
+
allStylesheets.add(toAbsoluteHref(entry));
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
return (_jsx(_Fragment, { children: Array.from(allStylesheets).map((href) => (_jsx("link", { rel: "stylesheet", href: href, precedence: "first" }, href))) }));
|
|
@@ -19,7 +19,8 @@ export const directivesFilteringPlugin = ({ clientFiles, serverFiles, projectRoo
|
|
|
19
19
|
absolute: true,
|
|
20
20
|
});
|
|
21
21
|
const info = this.getModuleInfo(absoluteId);
|
|
22
|
-
if (!info
|
|
22
|
+
if (!info ||
|
|
23
|
+
(typeof info.isIncluded !== "undefined" && !info.isIncluded)) {
|
|
23
24
|
files.delete(id);
|
|
24
25
|
}
|
|
25
26
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rwsdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -153,8 +153,8 @@
|
|
|
153
153
|
"author": "RedwoodSDK <peter@redwoodjs.com>",
|
|
154
154
|
"license": "MIT",
|
|
155
155
|
"dependencies": {
|
|
156
|
-
"@ast-grep/napi": "~0.
|
|
157
|
-
"@cloudflare/workers-types": "~4.
|
|
156
|
+
"@ast-grep/napi": "~0.42.1",
|
|
157
|
+
"@cloudflare/workers-types": "~4.20260405.1",
|
|
158
158
|
"@mdx-js/mdx": "~3.1.1",
|
|
159
159
|
"@puppeteer/browsers": "~2.13.0",
|
|
160
160
|
"@types/decompress": "~4.2.7",
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
"chokidar": "~5.0.0",
|
|
168
168
|
"debug": "~4.4.3",
|
|
169
169
|
"decompress": "~4.2.1",
|
|
170
|
-
"enhanced-resolve": "~5.20.
|
|
170
|
+
"enhanced-resolve": "~5.20.1",
|
|
171
171
|
"eventsource-parser": "~3.0.6",
|
|
172
172
|
"execa": "~9.6.1",
|
|
173
173
|
"find-up": "~8.0.0",
|
|
@@ -178,7 +178,7 @@
|
|
|
178
178
|
"jsonc-parser": "~3.3.1",
|
|
179
179
|
"kysely": "~0.28.15",
|
|
180
180
|
"kysely-do": "~0.0.1-rc.1",
|
|
181
|
-
"lodash": "~4.
|
|
181
|
+
"lodash": "~4.18.1",
|
|
182
182
|
"magic-string": "~0.30.21",
|
|
183
183
|
"picocolors": "~1.1.1",
|
|
184
184
|
"proper-lockfile": "~4.1.2",
|
|
@@ -203,8 +203,8 @@
|
|
|
203
203
|
},
|
|
204
204
|
"packageManager": "pnpm@10.31.0",
|
|
205
205
|
"devDependencies": {
|
|
206
|
-
"@cloudflare/vite-plugin": "1.
|
|
207
|
-
"wrangler": "^4.
|
|
206
|
+
"@cloudflare/vite-plugin": "1.31.0",
|
|
207
|
+
"wrangler": "^4.80.0",
|
|
208
208
|
"capnweb": "~0.5.0",
|
|
209
209
|
"@types/debug": "~4.1.13",
|
|
210
210
|
"@types/js-beautify": "~1.14.3",
|
|
@@ -215,7 +215,7 @@
|
|
|
215
215
|
"semver": "~7.7.4",
|
|
216
216
|
"tsx": "~4.21.0",
|
|
217
217
|
"typescript": "~6.0.2",
|
|
218
|
-
"vite": "~7.3.
|
|
218
|
+
"vite": "~7.3.2",
|
|
219
219
|
"vitest": "~4.1.2"
|
|
220
220
|
}
|
|
221
221
|
}
|