@reckona/mreact-router 0.0.1
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/LICENSE +21 -0
- package/README.md +101 -0
- package/dist/actions.d.ts +43 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +577 -0
- package/dist/actions.js.map +1 -0
- package/dist/adapters/aws-lambda.d.ts +45 -0
- package/dist/adapters/aws-lambda.d.ts.map +1 -0
- package/dist/adapters/aws-lambda.js +168 -0
- package/dist/adapters/aws-lambda.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +94 -0
- package/dist/adapters/cloudflare.d.ts.map +1 -0
- package/dist/adapters/cloudflare.js +390 -0
- package/dist/adapters/cloudflare.js.map +1 -0
- package/dist/adapters/devtools.d.ts +4 -0
- package/dist/adapters/devtools.d.ts.map +1 -0
- package/dist/adapters/devtools.js +5 -0
- package/dist/adapters/devtools.js.map +1 -0
- package/dist/adapters/edge.d.ts +9 -0
- package/dist/adapters/edge.d.ts.map +1 -0
- package/dist/adapters/edge.js +53 -0
- package/dist/adapters/edge.js.map +1 -0
- package/dist/adapters/node.d.ts +26 -0
- package/dist/adapters/node.d.ts.map +1 -0
- package/dist/adapters/node.js +64 -0
- package/dist/adapters/node.js.map +1 -0
- package/dist/adapters/static.d.ts +10 -0
- package/dist/adapters/static.d.ts.map +1 -0
- package/dist/adapters/static.js +34 -0
- package/dist/adapters/static.js.map +1 -0
- package/dist/assets.d.ts +18 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +67 -0
- package/dist/assets.js.map +1 -0
- package/dist/build.d.ts +36 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +322 -0
- package/dist/build.js.map +1 -0
- package/dist/cache.d.ts +54 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +221 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +37 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +105 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1268 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +44 -0
- package/dist/config.js.map +1 -0
- package/dist/cookies.d.ts +14 -0
- package/dist/cookies.d.ts.map +1 -0
- package/dist/cookies.js +69 -0
- package/dist/cookies.js.map +1 -0
- package/dist/csp.d.ts +6 -0
- package/dist/csp.d.ts.map +1 -0
- package/dist/csp.js +70 -0
- package/dist/csp.js.map +1 -0
- package/dist/dev-server.d.ts +16 -0
- package/dist/dev-server.d.ts.map +1 -0
- package/dist/dev-server.js +103 -0
- package/dist/dev-server.js.map +1 -0
- package/dist/http.d.ts +23 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +106 -0
- package/dist/http.js.map +1 -0
- package/dist/i18n.d.ts +15 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +61 -0
- package/dist/i18n.js.map +1 -0
- package/dist/import-policy.d.ts +30 -0
- package/dist/import-policy.d.ts.map +1 -0
- package/dist/import-policy.js +105 -0
- package/dist/import-policy.js.map +1 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +47 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +60 -0
- package/dist/logger.js.map +1 -0
- package/dist/module-runner.d.ts +9 -0
- package/dist/module-runner.d.ts.map +1 -0
- package/dist/module-runner.js +112 -0
- package/dist/module-runner.js.map +1 -0
- package/dist/native-escape.d.ts +2 -0
- package/dist/native-escape.d.ts.map +1 -0
- package/dist/native-escape.js +43 -0
- package/dist/native-escape.js.map +1 -0
- package/dist/native-route-matcher.d.ts +5 -0
- package/dist/native-route-matcher.d.ts.map +1 -0
- package/dist/native-route-matcher.js +91 -0
- package/dist/native-route-matcher.js.map +1 -0
- package/dist/navigation.d.ts +25 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +125 -0
- package/dist/navigation.js.map +1 -0
- package/dist/prerender-store.d.ts +37 -0
- package/dist/prerender-store.d.ts.map +1 -0
- package/dist/prerender-store.js +158 -0
- package/dist/prerender-store.js.map +1 -0
- package/dist/render.d.ts +26 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +1688 -0
- package/dist/render.js.map +1 -0
- package/dist/route-path.d.ts +2 -0
- package/dist/route-path.d.ts.map +1 -0
- package/dist/route-path.js +5 -0
- package/dist/route-path.js.map +1 -0
- package/dist/route-source.d.ts +9 -0
- package/dist/route-source.d.ts.map +1 -0
- package/dist/route-source.js +44 -0
- package/dist/route-source.js.map +1 -0
- package/dist/routes.d.ts +38 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +168 -0
- package/dist/routes.js.map +1 -0
- package/dist/serve.d.ts +63 -0
- package/dist/serve.d.ts.map +1 -0
- package/dist/serve.js +445 -0
- package/dist/serve.js.map +1 -0
- package/dist/session.d.ts +25 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +104 -0
- package/dist/session.js.map +1 -0
- package/dist/vite-config.d.ts +8 -0
- package/dist/vite-config.d.ts.map +1 -0
- package/dist/vite-config.js +17 -0
- package/dist/vite-config.js.map +1 -0
- package/dist/vite.d.ts +25 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +150 -0
- package/dist/vite.js.map +1 -0
- package/package.json +91 -0
package/dist/actions.js
ADDED
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
import { randomUUID, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { access, readdir, readFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join, relative, sep } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { createServerActionHandler, } from "@reckona/mreact-server";
|
|
6
|
+
import { build as bundle } from "esbuild";
|
|
7
|
+
import { withRouteCacheContext } from "./cache.js";
|
|
8
|
+
import { importAppRouterSourceModule } from "./module-runner.js";
|
|
9
|
+
import { createAppRouterImportPolicyPlugin } from "./import-policy.js";
|
|
10
|
+
// Production cookies use the `__Host-` prefix to lock the cookie to
|
|
11
|
+
// `Path=/`, no Domain, and Secure. Local dev (HTTP) cannot send Secure
|
|
12
|
+
// cookies, so we fall back to a non-prefixed name + drop Secure when
|
|
13
|
+
// NODE_ENV !== "production". The HttpOnly flag is unconditional because
|
|
14
|
+
// the SSR layer also emits the token as a hidden form input, so client
|
|
15
|
+
// JavaScript never needs to read the cookie.
|
|
16
|
+
//
|
|
17
|
+
// Both names are checked on the read path to keep production rotations
|
|
18
|
+
// safe (a build flipping NODE_ENV should not invalidate in-flight forms).
|
|
19
|
+
const csrfCookieNameProduction = "__Host-mreact.csrf";
|
|
20
|
+
const csrfCookieNameDevelopment = "mreact.csrf";
|
|
21
|
+
const csrfCookieNamesRead = [csrfCookieNameProduction, csrfCookieNameDevelopment];
|
|
22
|
+
function isProductionEnvironment() {
|
|
23
|
+
return process.env.NODE_ENV === "production";
|
|
24
|
+
}
|
|
25
|
+
function currentCsrfCookieName() {
|
|
26
|
+
return isProductionEnvironment() ? csrfCookieNameProduction : csrfCookieNameDevelopment;
|
|
27
|
+
}
|
|
28
|
+
const formFieldModuleId = "__mreact_module_id";
|
|
29
|
+
const formFieldExportName = "__mreact_export_name";
|
|
30
|
+
const formFieldCsrf = "__mreact_csrf";
|
|
31
|
+
const formFieldNonce = "__mreact_action_nonce";
|
|
32
|
+
// Bounded default replay store for form-action nonces. The previous
|
|
33
|
+
// implementation was an unbounded Set that grew with every successful
|
|
34
|
+
// submission (Issue 069). Production callers should still pass a shared
|
|
35
|
+
// store (Redis / KV) via `serverActions.replayStore` for multi-instance
|
|
36
|
+
// deployments -- this default only guarantees replay protection within
|
|
37
|
+
// a single process and is the safe fallback for dev / single-node setups.
|
|
38
|
+
//
|
|
39
|
+
// Retention model:
|
|
40
|
+
// - TTL: 10 minutes. Form nonces are minted at SSR time and the user
|
|
41
|
+
// has to submit before the cookie's SameSite=Lax window anyway; this
|
|
42
|
+
// is generous for any realistic submit cadence.
|
|
43
|
+
// - Max size: 50_000 entries. Old entries are evicted FIFO once the cap
|
|
44
|
+
// is reached so a flood cannot trigger OOM.
|
|
45
|
+
//
|
|
46
|
+
// Both bounds are intentional defaults -- tight enough that a single
|
|
47
|
+
// process cannot leak unbounded RSS, loose enough that legitimate
|
|
48
|
+
// traffic does not trip false-positive 409s.
|
|
49
|
+
const DEFAULT_REPLAY_TTL_MS = 10 * 60 * 1000;
|
|
50
|
+
const DEFAULT_REPLAY_MAX_ENTRIES = 50_000;
|
|
51
|
+
class BoundedReplayStore {
|
|
52
|
+
ttlMs;
|
|
53
|
+
maxEntries;
|
|
54
|
+
entries = new Map();
|
|
55
|
+
constructor(ttlMs, maxEntries) {
|
|
56
|
+
this.ttlMs = ttlMs;
|
|
57
|
+
this.maxEntries = maxEntries;
|
|
58
|
+
}
|
|
59
|
+
has(value) {
|
|
60
|
+
const expiresAt = this.entries.get(value);
|
|
61
|
+
if (expiresAt === undefined)
|
|
62
|
+
return false;
|
|
63
|
+
if (expiresAt < Date.now()) {
|
|
64
|
+
this.entries.delete(value);
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
add(value) {
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
// Cheap opportunistic sweep: drop the oldest expired entries first,
|
|
72
|
+
// then enforce the hard cap with FIFO eviction.
|
|
73
|
+
if (this.entries.size >= this.maxEntries) {
|
|
74
|
+
for (const [key, expiresAt] of this.entries) {
|
|
75
|
+
if (expiresAt < now) {
|
|
76
|
+
this.entries.delete(key);
|
|
77
|
+
}
|
|
78
|
+
if (this.entries.size < this.maxEntries)
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
while (this.entries.size >= this.maxEntries) {
|
|
82
|
+
const oldest = this.entries.keys().next().value;
|
|
83
|
+
if (oldest === undefined)
|
|
84
|
+
break;
|
|
85
|
+
this.entries.delete(oldest);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
this.entries.set(value, now + this.ttlMs);
|
|
89
|
+
}
|
|
90
|
+
// Exposed for tests; not part of the ServerActionReplayStore interface.
|
|
91
|
+
size() {
|
|
92
|
+
return this.entries.size;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const usedFormActionNonces = new BoundedReplayStore(DEFAULT_REPLAY_TTL_MS, DEFAULT_REPLAY_MAX_ENTRIES);
|
|
96
|
+
// Test helpers: drop all entries between cases / expose the bounded store
|
|
97
|
+
// so tests can drive its eviction semantics directly. Not part of the
|
|
98
|
+
// public surface (prefixed with `__`).
|
|
99
|
+
export function __clearDefaultReplayStore() {
|
|
100
|
+
usedFormActionNonces.entries.clear();
|
|
101
|
+
}
|
|
102
|
+
export function __readDefaultReplayStore() {
|
|
103
|
+
return usedFormActionNonces;
|
|
104
|
+
}
|
|
105
|
+
// Validates the cookie shape the caller might have set so we don't reuse
|
|
106
|
+
// a manipulated token. randomUUID() is hex + dashes, length 36.
|
|
107
|
+
const CSRF_TOKEN_SHAPE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
108
|
+
function readExistingCsrfToken(request) {
|
|
109
|
+
if (request === undefined)
|
|
110
|
+
return undefined;
|
|
111
|
+
const cookieHeader = request.headers.get("cookie");
|
|
112
|
+
for (const name of csrfCookieNamesRead) {
|
|
113
|
+
const token = readCookie(cookieHeader, name);
|
|
114
|
+
if (token !== undefined && CSRF_TOKEN_SHAPE.test(token)) {
|
|
115
|
+
return token;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
export async function prepareRouteServerActions(options) {
|
|
121
|
+
if (!hasFormActionCandidate(options.code)) {
|
|
122
|
+
return { code: options.code, hasFormActions: false };
|
|
123
|
+
}
|
|
124
|
+
const references = await collectImportedServerActions(options);
|
|
125
|
+
if (references.size === 0) {
|
|
126
|
+
return { code: options.code, hasFormActions: false };
|
|
127
|
+
}
|
|
128
|
+
// Reuse the existing CSRF token when the browser already sent one.
|
|
129
|
+
// Rotating the cookie on every render (Issue 070) broke concurrent
|
|
130
|
+
// forms because the older tab's hidden input no longer matched the
|
|
131
|
+
// cookie value. The actionNonce stays per-render -- that is the field
|
|
132
|
+
// tied to a specific submission via replay protection.
|
|
133
|
+
const existingToken = readExistingCsrfToken(options.request);
|
|
134
|
+
const csrfToken = existingToken ?? randomUUID();
|
|
135
|
+
const csrfTokenIsNew = existingToken === undefined;
|
|
136
|
+
const actionNonce = randomUUID();
|
|
137
|
+
const lowered = lowerFormActions({
|
|
138
|
+
actionNonce,
|
|
139
|
+
code: options.code,
|
|
140
|
+
csrfToken,
|
|
141
|
+
references,
|
|
142
|
+
});
|
|
143
|
+
return lowered === options.code
|
|
144
|
+
? { code: options.code, hasFormActions: false }
|
|
145
|
+
: {
|
|
146
|
+
actionNonce,
|
|
147
|
+
code: lowered,
|
|
148
|
+
csrfToken,
|
|
149
|
+
csrfTokenIsNew,
|
|
150
|
+
hasFormActions: true,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function hasFormActionCandidate(code) {
|
|
154
|
+
return /<form\b[^>]*\saction=\{[A-Za-z_$][\w$]*\}/.test(code);
|
|
155
|
+
}
|
|
156
|
+
export async function dispatchServerActionRequest(options) {
|
|
157
|
+
const { revalidatedPaths, value } = await withRouteCacheContext(options.routeCache, () => dispatchServerActionRequestWithoutCacheContext(options));
|
|
158
|
+
return withRevalidationHeader(value, revalidatedPaths);
|
|
159
|
+
}
|
|
160
|
+
async function dispatchServerActionRequestWithoutCacheContext(options) {
|
|
161
|
+
// Validate everything we can statically before touching the filesystem
|
|
162
|
+
// / esbuild. A flood of malformed POSTs must not pay the registry-load
|
|
163
|
+
// cost (Issue 067).
|
|
164
|
+
if (options.request.method !== "POST") {
|
|
165
|
+
return jsonResponse({ ok: false, error: "Method not allowed." }, 405);
|
|
166
|
+
}
|
|
167
|
+
const contentType = options.request.headers.get("content-type") ?? "";
|
|
168
|
+
if (contentType.includes("application/json")) {
|
|
169
|
+
// JSON path delegates CSRF/replay to createServerActionHandler. The
|
|
170
|
+
// registry is still needed here, but the handler short-circuits on
|
|
171
|
+
// CSRF mismatch before invoking the action.
|
|
172
|
+
let registry;
|
|
173
|
+
try {
|
|
174
|
+
registry = await loadServerActionRegistry({
|
|
175
|
+
appDir: options.appDir,
|
|
176
|
+
cacheVersion: options.serverActionCacheVersion,
|
|
177
|
+
importPolicy: options.importPolicy,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
return jsonResponse({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);
|
|
182
|
+
}
|
|
183
|
+
const replayStore = options.serverActions?.replayStore ?? usedFormActionNonces;
|
|
184
|
+
const handle = createServerActionHandler(registry, {
|
|
185
|
+
...(options.serverActions?.authorize === undefined
|
|
186
|
+
? {}
|
|
187
|
+
: { authorize: options.serverActions.authorize }),
|
|
188
|
+
csrf: true,
|
|
189
|
+
replayProtection: { seen: replayStore },
|
|
190
|
+
});
|
|
191
|
+
return handle(options.request);
|
|
192
|
+
}
|
|
193
|
+
if (!contentType.includes("application/x-www-form-urlencoded") &&
|
|
194
|
+
!contentType.includes("multipart/form-data")) {
|
|
195
|
+
return jsonResponse({ ok: false, error: "Unsupported server action content type." }, 415);
|
|
196
|
+
}
|
|
197
|
+
const formData = await options.request.formData();
|
|
198
|
+
const csrfResponse = validateFormCsrf(options.request, formData);
|
|
199
|
+
if (csrfResponse !== undefined) {
|
|
200
|
+
return csrfResponse;
|
|
201
|
+
}
|
|
202
|
+
const nonceResponse = validateFormNonce(formData, options.serverActions?.replayStore ?? usedFormActionNonces);
|
|
203
|
+
if (nonceResponse !== undefined) {
|
|
204
|
+
return nonceResponse;
|
|
205
|
+
}
|
|
206
|
+
const moduleId = stringFormValue(formData.get(formFieldModuleId));
|
|
207
|
+
const exportName = stringFormValue(formData.get(formFieldExportName));
|
|
208
|
+
if (moduleId === undefined || exportName === undefined) {
|
|
209
|
+
return jsonResponse({ ok: false, error: "Invalid server action reference." }, 400);
|
|
210
|
+
}
|
|
211
|
+
let registry;
|
|
212
|
+
try {
|
|
213
|
+
registry = await loadServerActionRegistry({
|
|
214
|
+
appDir: options.appDir,
|
|
215
|
+
cacheVersion: options.serverActionCacheVersion,
|
|
216
|
+
importPolicy: options.importPolicy,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
return jsonResponse({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);
|
|
221
|
+
}
|
|
222
|
+
const action = registry[`${moduleId}#${exportName}`];
|
|
223
|
+
if (typeof action !== "function") {
|
|
224
|
+
return jsonResponse({ ok: false, error: "Unknown server action." }, 404);
|
|
225
|
+
}
|
|
226
|
+
const actionFormData = cleanActionFormData(formData);
|
|
227
|
+
const authorizationResponse = await authorizeFormAction({
|
|
228
|
+
args: [actionFormData],
|
|
229
|
+
authorize: options.serverActions?.authorize,
|
|
230
|
+
exportName,
|
|
231
|
+
moduleId,
|
|
232
|
+
request: options.request,
|
|
233
|
+
});
|
|
234
|
+
if (authorizationResponse !== undefined) {
|
|
235
|
+
return authorizationResponse;
|
|
236
|
+
}
|
|
237
|
+
try {
|
|
238
|
+
const value = await action(actionFormData);
|
|
239
|
+
if (value instanceof Response) {
|
|
240
|
+
return value;
|
|
241
|
+
}
|
|
242
|
+
if (value === undefined || value === null) {
|
|
243
|
+
return redirectToFormReferer(options.request);
|
|
244
|
+
}
|
|
245
|
+
return jsonResponse({ ok: true, value }, 200);
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
return jsonResponse({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function redirectToFormReferer(request) {
|
|
252
|
+
return new Response(null, {
|
|
253
|
+
status: 303,
|
|
254
|
+
headers: {
|
|
255
|
+
location: sameOriginRefererPath(request) ?? "/",
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
function sameOriginRefererPath(request) {
|
|
260
|
+
const referer = request.headers.get("referer");
|
|
261
|
+
if (referer === null) {
|
|
262
|
+
return undefined;
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
const requestUrl = new URL(request.url);
|
|
266
|
+
const refererUrl = new URL(referer, requestUrl);
|
|
267
|
+
return refererUrl.origin === requestUrl.origin
|
|
268
|
+
? `${refererUrl.pathname}${refererUrl.search}`
|
|
269
|
+
: undefined;
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
return undefined;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function withRevalidationHeader(response, paths) {
|
|
276
|
+
if (paths.length > 0) {
|
|
277
|
+
response.headers.set("x-mreact-revalidate", paths.join(","));
|
|
278
|
+
}
|
|
279
|
+
return response;
|
|
280
|
+
}
|
|
281
|
+
async function authorizeFormAction(options) {
|
|
282
|
+
const reference = {
|
|
283
|
+
exportName: options.exportName,
|
|
284
|
+
moduleId: options.moduleId,
|
|
285
|
+
};
|
|
286
|
+
const authorizationResult = await options.authorize?.(options.request, reference, options.args);
|
|
287
|
+
return authorizationResult !== undefined && authorizationResult !== true
|
|
288
|
+
? jsonResponse({
|
|
289
|
+
ok: false,
|
|
290
|
+
error: authorizationError(authorizationResult),
|
|
291
|
+
}, 403)
|
|
292
|
+
: undefined;
|
|
293
|
+
}
|
|
294
|
+
function authorizationError(result) {
|
|
295
|
+
return typeof result === "string" ? result : "Server action not authorized.";
|
|
296
|
+
}
|
|
297
|
+
export function serverActionCookie(csrfToken) {
|
|
298
|
+
const production = isProductionEnvironment();
|
|
299
|
+
const parts = [
|
|
300
|
+
`${currentCsrfCookieName()}=${encodeURIComponent(csrfToken)}`,
|
|
301
|
+
"Path=/",
|
|
302
|
+
"SameSite=Lax",
|
|
303
|
+
"HttpOnly",
|
|
304
|
+
];
|
|
305
|
+
if (production) {
|
|
306
|
+
parts.push("Secure");
|
|
307
|
+
}
|
|
308
|
+
return parts.join("; ");
|
|
309
|
+
}
|
|
310
|
+
function lowerFormActions(options) {
|
|
311
|
+
return options.code.replace(/<form(?<before>[^>]*)\saction=\{(?<name>[A-Za-z_$][\w$]*)\}(?<after>[^>]*)>/g, (match, before, name, after) => {
|
|
312
|
+
const reference = options.references.get(name);
|
|
313
|
+
if (reference === undefined) {
|
|
314
|
+
return match;
|
|
315
|
+
}
|
|
316
|
+
const attrs = `${before}${after}`.replace(/\s+method=(?:"[^"]*"|'[^']*'|\{[^}]*\})/g, "");
|
|
317
|
+
const hidden = [
|
|
318
|
+
hiddenInput(formFieldModuleId, reference.moduleId),
|
|
319
|
+
hiddenInput(formFieldExportName, reference.exportName),
|
|
320
|
+
hiddenInput(formFieldCsrf, options.csrfToken),
|
|
321
|
+
hiddenInput(formFieldNonce, options.actionNonce),
|
|
322
|
+
].join("");
|
|
323
|
+
return `<form${attrs} method="post" action="/_mreact/actions">${hidden}`;
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
function hiddenInput(name, value) {
|
|
327
|
+
return `<input type="hidden" name="${escapeAttribute(name)}" value="${escapeAttribute(value)}" />`;
|
|
328
|
+
}
|
|
329
|
+
async function collectImportedServerActions(options) {
|
|
330
|
+
const references = new Map();
|
|
331
|
+
const imports = options.code.matchAll(/^import\s+\{\s*(?<specifiers>[^}]+)\s*\}\s+from\s+["'](?<source>[^"']+)["'];?/gm);
|
|
332
|
+
for (const match of imports) {
|
|
333
|
+
const source = match.groups?.source;
|
|
334
|
+
const specifiers = match.groups?.specifiers;
|
|
335
|
+
if (source === undefined || specifiers === undefined || !source.startsWith(".")) {
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
const file = await resolveSourceFile(dirname(options.pageFile), source);
|
|
339
|
+
if (file === undefined || !(await isUseServerFile(file))) {
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
const moduleId = moduleIdForFile(options.appDir, file);
|
|
343
|
+
for (const specifier of specifiers.split(",")) {
|
|
344
|
+
const [exportName, localName] = specifier.trim().split(/\s+as\s+/);
|
|
345
|
+
const imported = exportName?.trim();
|
|
346
|
+
if (imported !== undefined && imported.length > 0) {
|
|
347
|
+
references.set(localName?.trim() ?? imported, {
|
|
348
|
+
exportName: imported,
|
|
349
|
+
moduleId,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return references;
|
|
355
|
+
}
|
|
356
|
+
// Cache the (expensive) collect+esbuild+evaluate work keyed by appDir +
|
|
357
|
+
// caller-supplied version. Production callers pass the build-time hash
|
|
358
|
+
// (serverModuleCacheVersion) so the registry is reused for the lifetime
|
|
359
|
+
// of one deployment. Dev callers omit the version; the entry is then
|
|
360
|
+
// keyed on "dev" so the work happens once per process — restarts handle
|
|
361
|
+
// invalidation. Concurrent callers share a single in-flight promise.
|
|
362
|
+
const serverActionRegistryCache = new Map();
|
|
363
|
+
async function loadServerActionRegistry(options) {
|
|
364
|
+
const cacheKey = `${options.appDir}::${options.cacheVersion ?? "dev"}`;
|
|
365
|
+
const cached = serverActionRegistryCache.get(cacheKey);
|
|
366
|
+
if (cached !== undefined) {
|
|
367
|
+
return cached;
|
|
368
|
+
}
|
|
369
|
+
const pending = buildServerActionRegistry(options).catch((error) => {
|
|
370
|
+
// Drop the failed promise so a retry can re-run the load.
|
|
371
|
+
serverActionRegistryCache.delete(cacheKey);
|
|
372
|
+
throw error;
|
|
373
|
+
});
|
|
374
|
+
serverActionRegistryCache.set(cacheKey, pending);
|
|
375
|
+
return pending;
|
|
376
|
+
}
|
|
377
|
+
async function buildServerActionRegistry(options) {
|
|
378
|
+
const files = await collectFiles(options.appDir);
|
|
379
|
+
const registry = {};
|
|
380
|
+
for (const file of files) {
|
|
381
|
+
if (!(await isUseServerFile(file))) {
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
const module = await importServerActionModule({
|
|
385
|
+
appDir: options.appDir,
|
|
386
|
+
file,
|
|
387
|
+
importPolicy: options.importPolicy,
|
|
388
|
+
});
|
|
389
|
+
const moduleId = moduleIdForFile(options.appDir, file);
|
|
390
|
+
for (const [exportName, value] of Object.entries(module)) {
|
|
391
|
+
if (typeof value === "function") {
|
|
392
|
+
registry[`${moduleId}#${exportName}`] = value;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return registry;
|
|
397
|
+
}
|
|
398
|
+
// Exposed for tests that need a clean slate between cases (in-process state).
|
|
399
|
+
export function __clearServerActionRegistryCache() {
|
|
400
|
+
serverActionRegistryCache.clear();
|
|
401
|
+
}
|
|
402
|
+
async function importServerActionModule(options) {
|
|
403
|
+
const bundled = await bundle({
|
|
404
|
+
bundle: true,
|
|
405
|
+
format: "esm",
|
|
406
|
+
logLevel: "silent",
|
|
407
|
+
platform: "node",
|
|
408
|
+
plugins: [
|
|
409
|
+
serverActionRuntimePlugin(),
|
|
410
|
+
createAppRouterImportPolicyPlugin({
|
|
411
|
+
appDir: options.appDir,
|
|
412
|
+
importPolicy: options.importPolicy,
|
|
413
|
+
label: "Server action",
|
|
414
|
+
}),
|
|
415
|
+
],
|
|
416
|
+
write: false,
|
|
417
|
+
entryPoints: [options.file],
|
|
418
|
+
});
|
|
419
|
+
const code = bundled.outputFiles[0]?.text;
|
|
420
|
+
if (code === undefined) {
|
|
421
|
+
throw new Error(`Failed to compile server action module ${options.file}.`);
|
|
422
|
+
}
|
|
423
|
+
return importAppRouterSourceModule({
|
|
424
|
+
code,
|
|
425
|
+
label: `server-action:${options.file}`,
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
function serverActionRuntimePlugin() {
|
|
429
|
+
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
430
|
+
const cachePath = join(currentDir, currentDir.endsWith(`${sep}dist`) ? "cache.js" : "cache.ts");
|
|
431
|
+
return {
|
|
432
|
+
name: "mreact-router-server-action-runtime",
|
|
433
|
+
setup(buildApi) {
|
|
434
|
+
buildApi.onResolve({ filter: /^@reckona\/mreact-router$/ }, () => ({
|
|
435
|
+
namespace: "mreact-router-server-api",
|
|
436
|
+
path: "index",
|
|
437
|
+
}));
|
|
438
|
+
buildApi.onLoad({ filter: /^index$/, namespace: "mreact-router-server-api" }, () => ({
|
|
439
|
+
contents: `export { revalidatePath } from ${JSON.stringify(cachePath)};`,
|
|
440
|
+
loader: "ts",
|
|
441
|
+
resolveDir: dirname(cachePath),
|
|
442
|
+
}));
|
|
443
|
+
},
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
async function collectFiles(directory) {
|
|
447
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
448
|
+
const files = [];
|
|
449
|
+
for (const entry of entries) {
|
|
450
|
+
const path = join(directory, entry.name);
|
|
451
|
+
if (entry.isDirectory()) {
|
|
452
|
+
files.push(...(await collectFiles(path)));
|
|
453
|
+
continue;
|
|
454
|
+
}
|
|
455
|
+
if (entry.isFile() && /\.(?:mreact\.tsx|tsx|ts)$/.test(entry.name)) {
|
|
456
|
+
files.push(path);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
return files;
|
|
460
|
+
}
|
|
461
|
+
async function resolveSourceFile(directory, source) {
|
|
462
|
+
const base = join(directory, source);
|
|
463
|
+
const tsEsmBase = /\.[cm]?js$/.test(base) ? base.replace(/\.[cm]?js$/, "") : undefined;
|
|
464
|
+
const candidates = [
|
|
465
|
+
base,
|
|
466
|
+
...(tsEsmBase === undefined
|
|
467
|
+
? []
|
|
468
|
+
: [
|
|
469
|
+
`${tsEsmBase}.ts`,
|
|
470
|
+
`${tsEsmBase}.tsx`,
|
|
471
|
+
`${tsEsmBase}.mreact.tsx`,
|
|
472
|
+
join(tsEsmBase, "index.ts"),
|
|
473
|
+
join(tsEsmBase, "index.tsx"),
|
|
474
|
+
]),
|
|
475
|
+
`${base}.ts`,
|
|
476
|
+
`${base}.tsx`,
|
|
477
|
+
`${base}.mreact.tsx`,
|
|
478
|
+
join(base, "index.ts"),
|
|
479
|
+
join(base, "index.tsx"),
|
|
480
|
+
];
|
|
481
|
+
for (const candidate of candidates) {
|
|
482
|
+
try {
|
|
483
|
+
await access(candidate);
|
|
484
|
+
return candidate;
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
// Try the next candidate.
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
return undefined;
|
|
491
|
+
}
|
|
492
|
+
async function isUseServerFile(file) {
|
|
493
|
+
const code = await readFile(file, "utf8");
|
|
494
|
+
return /^\s*["']use server["'];?/.test(code);
|
|
495
|
+
}
|
|
496
|
+
function moduleIdForFile(appDir, file) {
|
|
497
|
+
return relative(appDir, file).split(sep).join("/");
|
|
498
|
+
}
|
|
499
|
+
function validateFormCsrf(request, formData) {
|
|
500
|
+
const formToken = stringFormValue(formData.get(formFieldCsrf));
|
|
501
|
+
const cookieHeader = request.headers.get("cookie");
|
|
502
|
+
const cookieToken = csrfCookieNamesRead
|
|
503
|
+
.map((name) => readCookie(cookieHeader, name))
|
|
504
|
+
.find((token) => token !== undefined);
|
|
505
|
+
if (formToken === undefined || cookieToken === undefined) {
|
|
506
|
+
return jsonResponse({ ok: false, error: "Invalid CSRF token." }, 403);
|
|
507
|
+
}
|
|
508
|
+
return timingSafeStringEqual(formToken, cookieToken)
|
|
509
|
+
? undefined
|
|
510
|
+
: jsonResponse({ ok: false, error: "Invalid CSRF token." }, 403);
|
|
511
|
+
}
|
|
512
|
+
function timingSafeStringEqual(a, b) {
|
|
513
|
+
const bufA = Buffer.from(a, "utf8");
|
|
514
|
+
const bufB = Buffer.from(b, "utf8");
|
|
515
|
+
if (bufA.length !== bufB.length)
|
|
516
|
+
return false;
|
|
517
|
+
return timingSafeEqual(bufA, bufB);
|
|
518
|
+
}
|
|
519
|
+
function validateFormNonce(formData, replayStore) {
|
|
520
|
+
const nonce = stringFormValue(formData.get(formFieldNonce));
|
|
521
|
+
if (nonce === undefined || nonce.length === 0) {
|
|
522
|
+
return jsonResponse({ ok: false, error: "Missing server action nonce." }, 400);
|
|
523
|
+
}
|
|
524
|
+
if (replayStore.has(nonce)) {
|
|
525
|
+
return jsonResponse({ ok: false, error: "Server action nonce was already used." }, 409);
|
|
526
|
+
}
|
|
527
|
+
replayStore.add(nonce);
|
|
528
|
+
return undefined;
|
|
529
|
+
}
|
|
530
|
+
function cleanActionFormData(formData) {
|
|
531
|
+
const cleaned = new FormData();
|
|
532
|
+
for (const [name, value] of formData.entries()) {
|
|
533
|
+
if (name !== formFieldModuleId &&
|
|
534
|
+
name !== formFieldExportName &&
|
|
535
|
+
name !== formFieldCsrf &&
|
|
536
|
+
name !== formFieldNonce) {
|
|
537
|
+
cleaned.append(name, value);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
return cleaned;
|
|
541
|
+
}
|
|
542
|
+
function stringFormValue(value) {
|
|
543
|
+
return typeof value === "string" ? value : undefined;
|
|
544
|
+
}
|
|
545
|
+
function readCookie(cookieHeader, name) {
|
|
546
|
+
if (cookieHeader === null) {
|
|
547
|
+
return undefined;
|
|
548
|
+
}
|
|
549
|
+
for (const part of cookieHeader.split(";")) {
|
|
550
|
+
const [rawKey, ...rawValue] = part.trim().split("=");
|
|
551
|
+
if (rawKey === name) {
|
|
552
|
+
// Issue 072: malformed `%`-escapes raise URIError; treat the
|
|
553
|
+
// cookie as absent rather than 500ing the whole request.
|
|
554
|
+
try {
|
|
555
|
+
return decodeURIComponent(rawValue.join("="));
|
|
556
|
+
}
|
|
557
|
+
catch {
|
|
558
|
+
return undefined;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
return undefined;
|
|
563
|
+
}
|
|
564
|
+
function jsonResponse(payload, status) {
|
|
565
|
+
return new Response(JSON.stringify(payload), {
|
|
566
|
+
headers: { "content-type": "application/json; charset=utf-8" },
|
|
567
|
+
status,
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
function escapeAttribute(value) {
|
|
571
|
+
return value
|
|
572
|
+
.replaceAll("&", "&")
|
|
573
|
+
.replaceAll('"', """)
|
|
574
|
+
.replaceAll("<", "<")
|
|
575
|
+
.replaceAll(">", ">");
|
|
576
|
+
}
|
|
577
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { AppRouterServerActionOptions } from "../actions.js";
|
|
2
|
+
import type { AppRouterCache } from "../cache.js";
|
|
3
|
+
import type { AppRouterImportPolicy } from "../import-policy.js";
|
|
4
|
+
import { type AppRouterLogger } from "../logger.js";
|
|
5
|
+
import { type AppRouterPrerenderStore, type ResponseSinkStrategy } from "../serve.js";
|
|
6
|
+
export interface AwsLambdaHttpEventV2 {
|
|
7
|
+
body?: string | undefined;
|
|
8
|
+
cookies?: string[] | undefined;
|
|
9
|
+
headers?: Record<string, string | undefined> | undefined;
|
|
10
|
+
isBase64Encoded?: boolean | undefined;
|
|
11
|
+
rawPath?: string | undefined;
|
|
12
|
+
rawQueryString?: string | undefined;
|
|
13
|
+
requestContext?: {
|
|
14
|
+
http?: {
|
|
15
|
+
method?: string | undefined;
|
|
16
|
+
} | undefined;
|
|
17
|
+
} | undefined;
|
|
18
|
+
version?: "2.0" | string | undefined;
|
|
19
|
+
}
|
|
20
|
+
export interface AwsLambdaHttpResultV2 {
|
|
21
|
+
body: string;
|
|
22
|
+
cookies?: string[] | undefined;
|
|
23
|
+
headers?: Record<string, string> | undefined;
|
|
24
|
+
isBase64Encoded: boolean;
|
|
25
|
+
statusCode: number;
|
|
26
|
+
}
|
|
27
|
+
export interface AwsLambdaRequestHandlerOptions {
|
|
28
|
+
allowedHosts?: readonly string[] | undefined;
|
|
29
|
+
errorHandler?: ((error: unknown) => {
|
|
30
|
+
body: string;
|
|
31
|
+
headers?: Record<string, string>;
|
|
32
|
+
status: number;
|
|
33
|
+
}) | undefined;
|
|
34
|
+
hostname?: string | undefined;
|
|
35
|
+
importPolicy?: AppRouterImportPolicy | undefined;
|
|
36
|
+
logger?: AppRouterLogger | undefined;
|
|
37
|
+
outDir: string;
|
|
38
|
+
prerenderStore?: AppRouterPrerenderStore | undefined;
|
|
39
|
+
routeCache?: AppRouterCache | undefined;
|
|
40
|
+
serverActions?: AppRouterServerActionOptions | undefined;
|
|
41
|
+
sinkStrategy?: ResponseSinkStrategy | undefined;
|
|
42
|
+
}
|
|
43
|
+
export type AwsLambdaRequestHandler = (event: AwsLambdaHttpEventV2) => Promise<AwsLambdaHttpResultV2>;
|
|
44
|
+
export declare function createAwsLambdaRequestHandler(options: AwsLambdaRequestHandlerOptions): AwsLambdaRequestHandler;
|
|
45
|
+
//# sourceMappingURL=aws-lambda.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-lambda.d.ts","sourceRoot":"","sources":["../../src/adapters/aws-lambda.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EAC1B,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IACzD,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,cAAc,CAAC,EAAE;QACf,IAAI,CAAC,EAAE;YACL,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;SAC7B,GAAG,SAAS,CAAC;KACf,GAAG,SAAS,CAAC;IACd,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC7C,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7C,YAAY,CAAC,EACT,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,GACF,SAAS,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACjD,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACrD,UAAU,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACxC,aAAa,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;IACzD,YAAY,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,MAAM,uBAAuB,GAAG,CACpC,KAAK,EAAE,oBAAoB,KACxB,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,8BAA8B,GACtC,uBAAuB,CAoDzB"}
|