@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.
Files changed (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -0
  3. package/dist/actions.d.ts +43 -0
  4. package/dist/actions.d.ts.map +1 -0
  5. package/dist/actions.js +577 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/adapters/aws-lambda.d.ts +45 -0
  8. package/dist/adapters/aws-lambda.d.ts.map +1 -0
  9. package/dist/adapters/aws-lambda.js +168 -0
  10. package/dist/adapters/aws-lambda.js.map +1 -0
  11. package/dist/adapters/cloudflare.d.ts +94 -0
  12. package/dist/adapters/cloudflare.d.ts.map +1 -0
  13. package/dist/adapters/cloudflare.js +390 -0
  14. package/dist/adapters/cloudflare.js.map +1 -0
  15. package/dist/adapters/devtools.d.ts +4 -0
  16. package/dist/adapters/devtools.d.ts.map +1 -0
  17. package/dist/adapters/devtools.js +5 -0
  18. package/dist/adapters/devtools.js.map +1 -0
  19. package/dist/adapters/edge.d.ts +9 -0
  20. package/dist/adapters/edge.d.ts.map +1 -0
  21. package/dist/adapters/edge.js +53 -0
  22. package/dist/adapters/edge.js.map +1 -0
  23. package/dist/adapters/node.d.ts +26 -0
  24. package/dist/adapters/node.d.ts.map +1 -0
  25. package/dist/adapters/node.js +64 -0
  26. package/dist/adapters/node.js.map +1 -0
  27. package/dist/adapters/static.d.ts +10 -0
  28. package/dist/adapters/static.d.ts.map +1 -0
  29. package/dist/adapters/static.js +34 -0
  30. package/dist/adapters/static.js.map +1 -0
  31. package/dist/assets.d.ts +18 -0
  32. package/dist/assets.d.ts.map +1 -0
  33. package/dist/assets.js +67 -0
  34. package/dist/assets.js.map +1 -0
  35. package/dist/build.d.ts +36 -0
  36. package/dist/build.d.ts.map +1 -0
  37. package/dist/build.js +322 -0
  38. package/dist/build.js.map +1 -0
  39. package/dist/cache.d.ts +54 -0
  40. package/dist/cache.d.ts.map +1 -0
  41. package/dist/cache.js +221 -0
  42. package/dist/cache.js.map +1 -0
  43. package/dist/cli.d.ts +3 -0
  44. package/dist/cli.d.ts.map +1 -0
  45. package/dist/cli.js +37 -0
  46. package/dist/cli.js.map +1 -0
  47. package/dist/client.d.ts +105 -0
  48. package/dist/client.d.ts.map +1 -0
  49. package/dist/client.js +1268 -0
  50. package/dist/client.js.map +1 -0
  51. package/dist/config.d.ts +27 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +44 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/cookies.d.ts +14 -0
  56. package/dist/cookies.d.ts.map +1 -0
  57. package/dist/cookies.js +69 -0
  58. package/dist/cookies.js.map +1 -0
  59. package/dist/csp.d.ts +6 -0
  60. package/dist/csp.d.ts.map +1 -0
  61. package/dist/csp.js +70 -0
  62. package/dist/csp.js.map +1 -0
  63. package/dist/dev-server.d.ts +16 -0
  64. package/dist/dev-server.d.ts.map +1 -0
  65. package/dist/dev-server.js +103 -0
  66. package/dist/dev-server.js.map +1 -0
  67. package/dist/http.d.ts +23 -0
  68. package/dist/http.d.ts.map +1 -0
  69. package/dist/http.js +106 -0
  70. package/dist/http.js.map +1 -0
  71. package/dist/i18n.d.ts +15 -0
  72. package/dist/i18n.d.ts.map +1 -0
  73. package/dist/i18n.js +61 -0
  74. package/dist/i18n.js.map +1 -0
  75. package/dist/import-policy.d.ts +30 -0
  76. package/dist/import-policy.d.ts.map +1 -0
  77. package/dist/import-policy.js +105 -0
  78. package/dist/import-policy.js.map +1 -0
  79. package/dist/index.d.ts +60 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +34 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/logger.d.ts +47 -0
  84. package/dist/logger.d.ts.map +1 -0
  85. package/dist/logger.js +60 -0
  86. package/dist/logger.js.map +1 -0
  87. package/dist/module-runner.d.ts +9 -0
  88. package/dist/module-runner.d.ts.map +1 -0
  89. package/dist/module-runner.js +112 -0
  90. package/dist/module-runner.js.map +1 -0
  91. package/dist/native-escape.d.ts +2 -0
  92. package/dist/native-escape.d.ts.map +1 -0
  93. package/dist/native-escape.js +43 -0
  94. package/dist/native-escape.js.map +1 -0
  95. package/dist/native-route-matcher.d.ts +5 -0
  96. package/dist/native-route-matcher.d.ts.map +1 -0
  97. package/dist/native-route-matcher.js +91 -0
  98. package/dist/native-route-matcher.js.map +1 -0
  99. package/dist/navigation.d.ts +25 -0
  100. package/dist/navigation.d.ts.map +1 -0
  101. package/dist/navigation.js +125 -0
  102. package/dist/navigation.js.map +1 -0
  103. package/dist/prerender-store.d.ts +37 -0
  104. package/dist/prerender-store.d.ts.map +1 -0
  105. package/dist/prerender-store.js +158 -0
  106. package/dist/prerender-store.js.map +1 -0
  107. package/dist/render.d.ts +26 -0
  108. package/dist/render.d.ts.map +1 -0
  109. package/dist/render.js +1688 -0
  110. package/dist/render.js.map +1 -0
  111. package/dist/route-path.d.ts +2 -0
  112. package/dist/route-path.d.ts.map +1 -0
  113. package/dist/route-path.js +5 -0
  114. package/dist/route-path.js.map +1 -0
  115. package/dist/route-source.d.ts +9 -0
  116. package/dist/route-source.d.ts.map +1 -0
  117. package/dist/route-source.js +44 -0
  118. package/dist/route-source.js.map +1 -0
  119. package/dist/routes.d.ts +38 -0
  120. package/dist/routes.d.ts.map +1 -0
  121. package/dist/routes.js +168 -0
  122. package/dist/routes.js.map +1 -0
  123. package/dist/serve.d.ts +63 -0
  124. package/dist/serve.d.ts.map +1 -0
  125. package/dist/serve.js +445 -0
  126. package/dist/serve.js.map +1 -0
  127. package/dist/session.d.ts +25 -0
  128. package/dist/session.d.ts.map +1 -0
  129. package/dist/session.js +104 -0
  130. package/dist/session.js.map +1 -0
  131. package/dist/vite-config.d.ts +8 -0
  132. package/dist/vite-config.d.ts.map +1 -0
  133. package/dist/vite-config.js +17 -0
  134. package/dist/vite-config.js.map +1 -0
  135. package/dist/vite.d.ts +25 -0
  136. package/dist/vite.d.ts.map +1 -0
  137. package/dist/vite.js +150 -0
  138. package/dist/vite.js.map +1 -0
  139. package/package.json +91 -0
@@ -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("&", "&amp;")
573
+ .replaceAll('"', "&quot;")
574
+ .replaceAll("<", "&lt;")
575
+ .replaceAll(">", "&gt;");
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"}