@reckona/mreact-router 0.0.138 → 0.0.140
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/README.md +1 -1
- package/dist/actions.d.ts +1 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +32 -12
- package/dist/actions.js.map +1 -1
- package/dist/adapters/static.js +10 -4
- package/dist/adapters/static.js.map +1 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +28 -21
- package/dist/build.js.map +1 -1
- package/dist/cache.d.ts +2 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +23 -1
- package/dist/cache.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +53 -14
- package/dist/client.js.map +1 -1
- package/dist/dev-server.d.ts +1 -0
- package/dist/dev-server.d.ts.map +1 -1
- package/dist/dev-server.js +6 -4
- package/dist/dev-server.js.map +1 -1
- package/dist/link.js +17 -3
- package/dist/link.js.map +1 -1
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +10 -7
- package/dist/middleware.js.map +1 -1
- package/dist/multipart.d.ts +5 -0
- package/dist/multipart.d.ts.map +1 -1
- package/dist/multipart.js +24 -1
- package/dist/multipart.js.map +1 -1
- package/dist/native-route-matcher.d.ts +9 -0
- package/dist/native-route-matcher.d.ts.map +1 -1
- package/dist/native-route-matcher.js +23 -11
- package/dist/native-route-matcher.js.map +1 -1
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +8 -1
- package/dist/navigation.js.map +1 -1
- package/dist/render.d.ts +5 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +239 -95
- package/dist/render.js.map +1 -1
- package/dist/route-source.d.ts +3 -1
- package/dist/route-source.d.ts.map +1 -1
- package/dist/route-source.js +13 -11
- package/dist/route-source.js.map +1 -1
- package/dist/route-styles.d.ts +4 -0
- package/dist/route-styles.d.ts.map +1 -1
- package/dist/route-styles.js +15 -3
- package/dist/route-styles.js.map +1 -1
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +39 -9
- package/dist/serve.js.map +1 -1
- package/dist/server-action-inference.d.ts.map +1 -1
- package/dist/server-action-inference.js +57 -0
- package/dist/server-action-inference.js.map +1 -1
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +27 -11
- package/dist/vite.js.map +1 -1
- package/package.json +11 -11
- package/src/actions.ts +44 -10
- package/src/adapters/static.ts +11 -4
- package/src/build.ts +28 -17
- package/src/cache.ts +33 -1
- package/src/client.ts +53 -14
- package/src/dev-server.ts +11 -4
- package/src/link.ts +24 -3
- package/src/middleware.ts +12 -7
- package/src/multipart.ts +32 -1
- package/src/native-route-matcher.ts +34 -13
- package/src/navigation.ts +11 -2
- package/src/render.ts +321 -113
- package/src/route-source.ts +14 -10
- package/src/route-styles.ts +28 -3
- package/src/serve.ts +68 -15
- package/src/server-action-inference.ts +86 -0
- package/src/vite.ts +39 -12
package/README.md
CHANGED
|
@@ -112,7 +112,7 @@ Client boundary inference follows rendered app-local imports through direct JSX,
|
|
|
112
112
|
|
|
113
113
|
Inferred form actions are bound to the rendered form with a hidden token derived from the CSRF token and form nonce. Single-process deployments use an automatically generated process secret; multi-instance deployments should set the same `MREACT_SERVER_ACTION_SECRET` value on every instance so forms rendered by one instance can be submitted to another.
|
|
114
114
|
|
|
115
|
-
Plain `multipart/form-data` route handlers do not automatically run the server-action CSRF guard. For cookie-authenticated upload forms that post directly to `route.ts`, render a hidden field named `formCsrfFieldName`, set `formCsrfCookie(token)` for the same token, and either call `validateFormCsrf(request, formData)` for small buffered forms or read the CSRF field with `parseMultipartStream()` before consuming a large file part. `request.formData()` buffers multipart file parts in memory; `parseMultipartStream(request, { fields })` keeps file parts as `ReadableStream<Uint8Array>` values with per-part and total byte limits
|
|
115
|
+
Plain `multipart/form-data` route handlers do not automatically run the server-action CSRF guard. For cookie-authenticated upload forms that post directly to `route.ts`, render a hidden field named `formCsrfFieldName`, set `formCsrfCookie(token)` for the same token, and either call `validateFormCsrf(request, formData)` for small buffered forms or read the CSRF field with `parseMultipartStream()` before consuming a large file part. `request.formData()` buffers multipart file parts in memory; `parseMultipartStream(request, { fields })` keeps file parts as `ReadableStream<Uint8Array>` values with per-part and total byte limits, enforces bounded defaults, and exposes both the raw `filename` and a storage-oriented `safeFilename`. Workers APIs such as R2 require known-length streams, so `part.fixedLengthStream(length).readable` is only valid when the multipart part carries a `Content-Length` header or the handler can pass the exact byte length; otherwise use a bounded `arrayBuffer()` fallback for R2. Put the CSRF field before the file field when you want early rejection without reading the file body.
|
|
116
116
|
|
|
117
117
|
Use `startDevServer()` and `startServer()` when an app needs to attach HTTP upgrade handling to the same Node server as mreact routes. Both APIs accept `onUpgrade(request, socket, head)`, and `startDevServer()` keeps Vite middleware/HMR wired to the underlying server. Production route artifacts are bundled independently, so mutable custom-server state should live in `getServerRuntimeState(key, create)` rather than in a module-scoped `let` singleton.
|
|
118
118
|
|
package/dist/actions.d.ts
CHANGED
|
@@ -25,6 +25,7 @@ export interface AppRouterServerActionOptions {
|
|
|
25
25
|
allowedActions?: readonly AppRouterAllowedServerAction[] | undefined;
|
|
26
26
|
authorize?: ServerActionHandlerOptions["authorize"] | undefined;
|
|
27
27
|
maxBodyBytes?: number | undefined;
|
|
28
|
+
maxFormFields?: number | undefined;
|
|
28
29
|
replayStore?: ServerActionReplayStore | undefined;
|
|
29
30
|
}
|
|
30
31
|
export interface AppRouterAllowedServerAction extends ServerActionRequestReference {
|
package/dist/actions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,0BAA0B,EAE/B,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EAElC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,KAAK,cAAc,EAAyB,MAAM,YAAY,CAAC;AAExE,OAAO,EAAqC,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAW,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAMnB,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
|
package/dist/actions.js
CHANGED
|
@@ -40,6 +40,7 @@ const actionTokenSecret = process.env.MREACT_SERVER_ACTION_SECRET ?? defaultActi
|
|
|
40
40
|
const DEFAULT_REPLAY_TTL_MS = 10 * 60 * 1000;
|
|
41
41
|
const DEFAULT_REPLAY_MAX_ENTRIES = 50_000;
|
|
42
42
|
const DEFAULT_ACTION_BODY_MAX_BYTES = 10 * 1024 * 1024;
|
|
43
|
+
const DEFAULT_ACTION_FORM_MAX_FIELDS = 1_000;
|
|
43
44
|
let warnedUnrestrictedServerActions = false;
|
|
44
45
|
function defaultActionTokenSecret() {
|
|
45
46
|
if (isProductionEnvironment()) {
|
|
@@ -67,21 +68,20 @@ class BoundedReplayStore {
|
|
|
67
68
|
}
|
|
68
69
|
add(value) {
|
|
69
70
|
const now = Date.now();
|
|
70
|
-
// Cheap opportunistic sweep: drop the oldest expired entries first,
|
|
71
|
-
// then enforce the hard cap with FIFO eviction.
|
|
72
71
|
if (this.entries.size >= this.maxEntries) {
|
|
73
|
-
|
|
72
|
+
const oldest = this.entries.entries().next().value;
|
|
73
|
+
if (oldest !== undefined) {
|
|
74
|
+
const [key, expiresAt] = oldest;
|
|
75
|
+
this.entries.delete(key);
|
|
74
76
|
if (expiresAt < now) {
|
|
75
|
-
this.entries.
|
|
77
|
+
while (this.entries.size >= this.maxEntries) {
|
|
78
|
+
const nextOldest = this.entries.entries().next().value;
|
|
79
|
+
if (nextOldest === undefined || nextOldest[1] >= now) {
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
this.entries.delete(nextOldest[0]);
|
|
83
|
+
}
|
|
76
84
|
}
|
|
77
|
-
if (this.entries.size < this.maxEntries)
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
while (this.entries.size >= this.maxEntries) {
|
|
81
|
-
const oldest = this.entries.keys().next().value;
|
|
82
|
-
if (oldest === undefined)
|
|
83
|
-
break;
|
|
84
|
-
this.entries.delete(oldest);
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
this.entries.set(value, now + this.ttlMs);
|
|
@@ -230,6 +230,10 @@ async function dispatchServerActionRequestWithoutCacheContext(options) {
|
|
|
230
230
|
return jsonResponse({ ok: false, error: "Unsupported server action content type." }, 415);
|
|
231
231
|
}
|
|
232
232
|
const formData = await options.request.formData();
|
|
233
|
+
const fieldCountResponse = validateServerActionFormFieldCount(formData, options.serverActions?.maxFormFields ?? DEFAULT_ACTION_FORM_MAX_FIELDS);
|
|
234
|
+
if (fieldCountResponse !== undefined) {
|
|
235
|
+
return fieldCountResponse;
|
|
236
|
+
}
|
|
233
237
|
const csrfResponse = validateFormCsrf(options.request, formData);
|
|
234
238
|
if (csrfResponse !== undefined) {
|
|
235
239
|
return csrfResponse;
|
|
@@ -336,6 +340,22 @@ function validateServerActionBodySize(request, maxBodyBytes) {
|
|
|
336
340
|
}
|
|
337
341
|
return undefined;
|
|
338
342
|
}
|
|
343
|
+
function validateServerActionFormFieldCount(formData, maxFormFields) {
|
|
344
|
+
if (!Number.isFinite(maxFormFields) || maxFormFields < 0) {
|
|
345
|
+
return undefined;
|
|
346
|
+
}
|
|
347
|
+
let count = 0;
|
|
348
|
+
for (const _ of formData.keys()) {
|
|
349
|
+
count += 1;
|
|
350
|
+
if (count > maxFormFields) {
|
|
351
|
+
return jsonResponse({
|
|
352
|
+
ok: false,
|
|
353
|
+
error: "Server action form field count is too large.",
|
|
354
|
+
}, 413);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return undefined;
|
|
358
|
+
}
|
|
339
359
|
function redirectToFormReferer(request) {
|
|
340
360
|
return new Response(null, {
|
|
341
361
|
status: 303,
|
package/dist/actions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,qCAAqC,EACrC,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,yBAAyB,GAM1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAA6B,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAuB,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,iCAAiC,EAA8B,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAE,OAAO,EAAuB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,mCAAmC,GAEpC,MAAM,8BAA8B,CAAC;AAEtC,SAAS,uBAAuB;IAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAC/C,CAAC;AACD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAC/C,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AACnD,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAC/C,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AACrD,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,wBAAwB,EAAE,CAAC;AAChG,oEAAoE;AACpE,sEAAsE;AACtE,wEAAwE;AACxE,wEAAwE;AACxE,uEAAuE;AACvE,0EAA0E;AAC1E,EAAE;AACF,mBAAmB;AACnB,qEAAqE;AACrE,uEAAuE;AACvE,kDAAkD;AAClD,wEAAwE;AACxE,8CAA8C;AAC9C,EAAE;AACF,qEAAqE;AACrE,kEAAkE;AAClE,6CAA6C;AAC7C,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7C,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAC1C,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACvD,IAAI,+BAA+B,GAAG,KAAK,CAAC;AAS5C,SAAS,wBAAwB;IAC/B,IAAI,uBAAuB,EAAE,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CACV,kKAAkK,CACnK,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,kBAAkB;IAIH;IACA;IAJF,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,YACmB,KAAa,EACb,UAAkB;QADlB,UAAK,GAAL,KAAK,CAAQ;QACb,eAAU,GAAV,UAAU,CAAQ;IAClC,CAAC;IAEJ,GAAG,CAAC,KAAa;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC1C,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,KAAa;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,oEAAoE;QACpE,gDAAgD;QAChD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACzC,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC5C,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;oBACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC3B,CAAC;gBACD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU;oBAAE,MAAM;YACjD,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;gBAChD,IAAI,MAAM,KAAK,SAAS;oBAAE,MAAM;gBAChC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,wEAAwE;IACxE,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,oBAAoB,GAAG,IAAI,kBAAkB,CACjD,qBAAqB,EACrB,0BAA0B,CAC3B,CAAC;AAEF,0EAA0E;AAC1E,sEAAsE;AACtE,uCAAuC;AACvC,MAAM,UAAU,yBAAyB;IACtC,oBAAoE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AA4CD,MAAM,8BAA8B,GAAG,IAAI,GAAG,EAAqD,CAAC;AAEpG,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,OAM/C;IACC,IAAI,OAAO,CAAC,oBAAoB,KAAK,SAAS,IAAI,OAAO,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5F,qCAAqC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,qCAAqC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,SAAS,GACb,OAAO,CAAC,oBAAoB,KAAK,SAAS;QACxC,CAAC,CAAC,MAAM,4BAA4B,CAAC,OAAO,CAAC;QAC7C,CAAC,CAAC;YACE,WAAW,EAAE,EAAE;YACf,UAAU,EAAE,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,oBAAoB,CAAC;SAC/E,CAAC;IACR,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;IAE9C,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC1B,qCAAqC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACnF,OAAO,WAAW,CAAC,MAAM,KAAK,CAAC;YAC7B,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE;YAC/C,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACjE,CAAC;IAED,mEAAmE;IACnE,mEAAmE;IACnE,mEAAmE;IACnE,sEAAsE;IACtE,uDAAuD;IACvD,MAAM,aAAa,GAAG,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,aAAa,IAAI,UAAU,EAAE,CAAC;IAChD,MAAM,cAAc,GAAG,aAAa,KAAK,SAAS,CAAC;IACnD,MAAM,WAAW,GAAG,UAAU,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC;QAC/B,WAAW;QACX,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS;QACT,UAAU;KACX,CAAC,CAAC;IAEH,IAAI,OAAO,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7B,qCAAqC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACnF,OAAO,WAAW,CAAC,MAAM,KAAK,CAAC;YAC7B,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE;YAC/C,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACjE,CAAC;IAED,qCAAqC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEpF,OAAO;QACL,WAAW;QACX,IAAI,EAAE,OAAO;QACb,SAAS;QACT,cAAc;QACd,WAAW;QACX,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,IAAY,EACZ,UAAkD;IAElD,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAE9C,OAAO,IAAI,GAAG,CACZ,UAAU;SACP,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,KAAK,UAAU,CAAC;SAC1D,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;QAClB,uBAAuB,CAAC,SAAS,CAAC;QAClC;YACE,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,QAAQ,EAAE,SAAS,CAAC,QAAQ;SAC7B;KACF,CAAC,CACL,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY,EAAE,QAAgB;IAC5D,OAAO,qCAAqC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAOjD;IACC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,CACvF,8CAA8C,CAAC,OAAO,CAAC,CACxD,CAAC;IAEF,OAAO,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,8CAA8C,CAAC,OAM7D;IACC,uEAAuE;IACvE,uEAAuE;IACvE,oBAAoB;IACpB,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACtC,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,gBAAgB,GAAG,4BAA4B,CACnD,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,aAAa,EAAE,YAAY,IAAI,6BAA6B,CACrE,CAAC;IACF,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,cAAc,GAAG,iCAAiC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1E,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAEtE,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7C,oEAAoE;QACpE,mEAAmE;QACnE,4CAA4C;QAC5C,IAAI,QAA8B,CAAC;QACnC,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,wBAAwB,CAAC;gBACxC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,YAAY,EAAE,OAAO,CAAC,wBAAwB;gBAC9C,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,YAAY,CACjB,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAC5E,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,EAAE,WAAW,IAAI,oBAAoB,CAAC;QAC/E,+BAA+B,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,yBAAyB,CAAC,wBAAwB,CAAC;YAChE,cAAc,EAAE,OAAO,CAAC,aAAa,EAAE,cAAc;YACrD,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ;SACT,CAAC,EAAE;YACF,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,KAAK,SAAS;gBAChD,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YACnD,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,KAAK,SAAS;gBACrD,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,cAAc,EAAE,wBAAwB,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;YACvF,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,OAAO,CAAC,aAAa,EAAE,YAAY,IAAI,6BAA6B;YAClF,gBAAgB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;SACxC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IACE,CAAC,WAAW,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAC1D,CAAC,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAC5C,CAAC;QACD,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yCAAyC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAClD,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEjE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IAE5D,IAAI,QAAQ,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9E,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAAE,GAAG,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,CAAC,qBAAqB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,EAAE,CAAC;QAC5F,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,IACE,+BAA+B,CAAC;QAC9B,cAAc,EAAE,OAAO,CAAC,aAAa,EAAE,cAAc;QACrD,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU;QACV,QAAQ;KACT,CAAC;QACF,CAAC,sBAAsB,CAAC;YACtB,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC3D,UAAU;YACV,QAAQ;YACR,KAAK;YACL,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;SAC3D,CAAC,EACF,CAAC;QACD,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,aAAa,GAAG,iBAAiB,CACrC,QAAQ,EACR,OAAO,CAAC,aAAa,EAAE,WAAW,IAAI,oBAAoB,CAC3D,CAAC;IAEF,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,QAA8B,CAAC;IACnC,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,wBAAwB,CAAC;YACxC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,OAAO,CAAC,wBAAwB;YAC9C,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,YAAY,CACjB,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAC5E,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC,CAAC;IAErD,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,cAAc,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,qBAAqB,GAAG,MAAM,mBAAmB,CAAC;QACtD,IAAI,EAAE,CAAC,cAAc,CAAC;QACtB,SAAS,EAAE,OAAO,CAAC,aAAa,EAAE,SAAS;QAC3C,UAAU;QACV,QAAQ;QACR,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAEvF,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1C,OAAO,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,YAAY,CACjB,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAC5E,GAAG,CACJ,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAgB;IACjD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAE9C,OAAO;QACL,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;QACzB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAEhF,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;IACxD,OAAO,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC;AAED,SAAS,4BAA4B,CACnC,OAAgB,EAChB,YAAoB;IAEpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5D,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,GAAG,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,KAAK,GAAG,YAAY,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,0CAA0C,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAgB;IAC7C,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACP,QAAQ,EAAE,qBAAqB,CAAC,OAAO,CAAC,IAAI,GAAG;SAChD;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAgB;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAE/C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEhD,OAAO,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;YAC5C,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE;YAC9C,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAkB,EAAE,KAAe;IACjE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,OAMlC;IACC,MAAM,SAAS,GAAiC;QAC9C,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;IACF,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhG,OAAO,mBAAmB,KAAK,SAAS,IAAI,mBAAmB,KAAK,IAAI;QACtE,CAAC,CAAC,YAAY,CACV;YACE,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,kBAAkB,CAAC,mBAAmB,CAAC;SAC/C,EACD,GAAG,CACJ;QACH,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAmD;IAC7E,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,+BAA+B,CAAC;AAC/E,CAAC;AAED,SAAS,wBAAwB,CAC/B,cAAuD;IAEvD,OAAO,cAAc;SAClB,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,IAAI,CAAC;SAClD,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnB,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,QAAQ,EAAE,SAAS,CAAC,QAAQ;KAC7B,CAAC,CAAC,CAAC;AACR,CAAC;AAED,SAAS,wBAAwB,CAAC,OAIjC;IACC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,KAAK,MAAM,SAAS,IAAI,oCAAoC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACtF,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;QACrD,IAAI,SAAS,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAChC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,SAAuC;IAC9D,OAAO,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,qBAAqB,CAC5B,SAAuC,EACvC,cAAmE;IAEnE,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,+BAA+B,CAAC,cAAc,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,cAAc,CAAC,IAAI,CACxB,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,CACzF,CAAC;AACJ,CAAC;AAED,SAAS,+BAA+B,CACtC,cAAmE;IAEnE,IACE,cAAc,KAAK,SAAS;QAC5B,CAAC,uBAAuB,EAAE;QAC1B,+BAA+B,EAC/B,CAAC;QACD,OAAO;IACT,CAAC;IAED,+BAA+B,GAAG,IAAI,CAAC;IACvC,OAAO,CAAC,IAAI,CACV,qNAAqN,CACtN,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,OAKzB;IACC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACxB,MAAM,cAAc,GAAG,qCAAqC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAErF,KAAK,MAAM,aAAa,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAC;QAEjF,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;QACnE,MAAM,cAAc,GAAG,sBAAsB,CAAC;YAC5C,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO;YACP,SAAS;YACT,aAAa,EAAE,aAAa,CAAC,UAAU;SACxC,CAAC,CAAC;QAEH,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IAClG,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,uBAAuB,CAAC,SAMhC;IACC,OAAO;QACL,SAAS,CAAC,KAAK;QACf,SAAS,CAAC,GAAG;QACb,SAAS,CAAC,eAAe;QACzB,SAAS,CAAC,aAAa;QACvB,SAAS,CAAC,UAAU;KACrB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,sBAAsB,CAAC,OAM/B;IACC,MAAM,aAAa,GAAG,IAAI,MAAM,CAC9B,8CAA8C,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,4BAA4B,EAC7G,GAAG,CACJ,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;IAErC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,OAAO,CAAC;IACzB,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,OAAO,CAC9D,0CAA0C,EAC1C,EAAE,CACH,CAAC;IACF,MAAM,MAAM,GAAG;QACb,WAAW,CAAC,iBAAiB,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC;QAC1D,WAAW,CAAC,mBAAmB,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC;QAC9D,WAAW,CAAC,iBAAiB,EAAE,OAAO,CAAC,SAAS,CAAC;QACjD,WAAW,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC;QAChD,WAAW,CACT,oBAAoB,EACpB,eAAe,CAAC;YACd,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU;YACxC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ;YACpC,KAAK,EAAE,OAAO,CAAC,WAAW;SAC3B,CAAC,CACH;KACF,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,OAAO,QAAQ,KAAK,4CAA4C,MAAM,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,OAAO,8BAA8B,eAAe,CAAC,IAAI,CAAC,YAAY,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC;AACrG,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,OAI3C;IAIC,OAAO,MAAM,mCAAmC,CAAC;QAC/C,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,UAAU,EAAE;YACV,eAAe;YACf,iBAAiB;SAClB;QACD,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC,CAAC;AACL,CAAC;AAED,SAAS,+BAA+B,CAAC,OAKxC;IACC,IACE,OAAO,CAAC,cAAc,EAAE,IAAI,CAC1B,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,QAAQ,KAAK,IAAI;QACzB,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;QACrC,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,CAC5C,KAAK,IAAI,EACV,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,oCAAoC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAC7D,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAC5C,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAKxB;IACC,OAAO,UAAU,CAAC,QAAQ,EAAE,iBAAiB,CAAC;SAC3C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;SAC1B,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;SACzB,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACrB,MAAM,CAAC,WAAW,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,sBAAsB,CAAC,OAM/B;IACC,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAC1B,eAAe,CAAC;QACd,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CACH,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAE1C,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,qCAAqC,CAC5C,MAAc,EACd,QAAgB,EAChB,UAAgD;IAEhD,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC;SACzC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC,CACpF,CAAC;IACF,IAAI,mBAAmB,GAAG,8BAA8B,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,kBAAkB,GAAG,mBAAmB,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;IAC3E,MAAM,OAAO,GAAG,CAAC,uBAAuB,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;IAE7E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,IAAI,cAAc,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC9B,mBAAmB,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,mBAAmB,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC;YACpC,8BAA8B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;YACtC,mBAAmB,GAAG,IAAI,GAAG,EAAE,CAAC;YAChC,8BAA8B,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAClE,CAAC;QACD,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACpD,CAAC;IAED,oCAAoC,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,uEAAuE;AACvE,uEAAuE;AACvE,wEAAwE;AACxE,qEAAqE;AACrE,wEAAwE;AACxE,qEAAqE;AACrE,MAAM,yBAAyB,GAAG,IAAI,GAAG,EAAyC,CAAC;AAEnF,KAAK,UAAU,wBAAwB,CAAC,OAIvC;IACC,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,YAAY,IAAI,KAAK,EAAE,CAAC;IACvE,MAAM,MAAM,GAAG,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEvD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACjE,0DAA0D;QAC1D,yBAAyB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IACH,yBAAyB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,OAGxC;IACC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,MAAM,kBAAkB,GAAG,oCAAoC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvD,MAAM,mBAAmB,GAAG,4BAA4B,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QACvF,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QAElD,IAAI,CAAC,aAAa,IAAI,mBAAmB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACrD,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC;YAC5C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI;YACJ,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC,CAAC;QAEH,KAAK,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACzD,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,CAAC,aAAa,IAAI,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBAC1F,QAAQ,CAAC,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC,GAAG,KAAwC,CAAC;YACnF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,gCAAgC;IAC9C,yBAAyB,CAAC,KAAK,EAAE,CAAC;IAClC,8BAA8B,CAAC,KAAK,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,oCAAoC,CAAC,MAAc;IAC1D,MAAM,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,yBAAyB,CAAC,IAAI,EAAE,EAAE,CAAC;QACnD,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,yBAAyB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAA0C,EAC1C,KAA2C;IAE3C,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oCAAoC,CAAC,MAAc;IAC1D,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IACtD,MAAM,mBAAmB,GAAG,8BAA8B,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEvE,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,MAAM,cAAc,IAAI,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1D,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,cAAc,EAAE,CAAC;YAC9C,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,4BAA4B,CACnC,UAAgD,EAChD,QAAgB;IAEhB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5C,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACpC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,OAIvC;IACC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC;QACvC,IAAI,EAAE,iBAAiB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;QACtD,QAAQ,EAAE,OAAO,CAAC,IAAI;QACtB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE;YACP,uBAAuB,EAAE;YACzB,yBAAyB,EAAE;YAC3B,iCAAiC,CAAC;gBAChC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,KAAK,EAAE,eAAe;aACvB,CAAC;SACH;KACF,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,2BAA2B,CAA0B;QAC1D,IAAI;QACJ,KAAK,EAAE,iBAAiB,OAAO,CAAC,IAAI,EAAE;KACvC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB;IAChC,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAEhG,OAAO;QACL,IAAI,EAAE,qCAAqC;QAC3C,KAAK,CAAC,QAA8B;YAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,2BAA2B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;gBACjE,SAAS,EAAE,0BAA0B;gBACrC,IAAI,EAAE,OAAO;aACd,CAAC,CAAC,CAAC;YACJ,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,0BAA0B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;gBACnF,QAAQ,EAAE,kCAAkC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG;gBACxE,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC;aAC/B,CAAC,CAAC,CAAC;QACN,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,SAAiB;IAC3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAEzC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,SAAiB,EAAE,MAAc;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvF,MAAM,UAAU,GAAG;QACjB,IAAI;QACJ,GAAG,CAAC,SAAS,KAAK,SAAS;YACzB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,GAAG,SAAS,KAAK;gBACjB,GAAG,SAAS,MAAM;gBAClB,GAAG,SAAS,aAAa;gBACzB,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;gBAC3B,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;aAC7B,CAAC;QACN,GAAG,IAAI,KAAK;QACZ,GAAG,IAAI,MAAM;QACb,GAAG,IAAI,aAAa;QACpB,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QACtB,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;KACxB,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE1C,OAAO,kBAAkB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,eAAe,CAAC,MAAc,EAAE,IAAY;IACnD,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,iCAAiC,CAAC,OAAgB;IACzD,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE7C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,MAAM,KAAK,cAAc;YAC9B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAE/C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,cAAc;YAC/C,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,QAAkB,EAClB,WAAoC;IAEpC,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IAE5D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,EAAE,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC1F,CAAC;IAED,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAkB;IAC7C,MAAM,OAAO,GAAG,IAAI,QAAQ,EAAE,CAAC;IAE/B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,IACE,IAAI,KAAK,iBAAiB;YAC1B,IAAI,KAAK,mBAAmB;YAC5B,IAAI,KAAK,iBAAiB;YAC1B,IAAI,KAAK,cAAc;YACvB,IAAI,KAAK,oBAAoB,EAC7B,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,KAAgC;IACvD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB,EAAE,MAAc;IACpD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;QAC3C,OAAO,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE;QAC9D,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC7B,CAAC","sourcesContent":["import { createHash, createHmac, randomBytes, randomUUID, timingSafeEqual } from \"node:crypto\";\nimport { access, readdir, readFile } from \"node:fs/promises\";\nimport { dirname, join, relative, sep } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n collectFormActionExpressionReferences,\n hasModuleDirective,\n} from \"@reckona/mreact-compiler\";\nimport {\n createServerActionHandler,\n type ServerActionHandlerOptions,\n type ServerActionRegistry,\n type ServerActionReplayStore,\n type ServerActionRequestReference,\n type ServerActionValidationResult,\n} from \"@reckona/mreact-server\";\nimport { bundleRouterModule, type RouterCompatBuildApi } from \"./bundle-pipeline.js\";\nimport { type AppRouterCache, withRouteCacheContext } from \"./cache.js\";\nimport { fileImportMetaUrlPlugin, importAppRouterSourceModule } from \"./module-runner.js\";\nimport { createAppRouterImportPolicyPlugin, type AppRouterImportPolicy } from \"./import-policy.js\";\nimport { cookies, type RequestCookies } from \"./navigation.js\";\nexport {\n createFormCsrfToken,\n formCsrfCookie,\n formCsrfFieldName,\n serverActionCookie,\n validateFormCsrf,\n} from \"./csrf.js\";\nimport {\n formCsrfFieldName,\n readExistingFormCsrfToken,\n validateFormCsrf,\n} from \"./csrf.js\";\nimport {\n collectRuntimeInferredServerActions,\n type ServerActionInferenceDiagnostic,\n} from \"./server-action-inference.js\";\n\nfunction isProductionEnvironment(): boolean {\n return process.env.NODE_ENV === \"production\";\n}\nconst formFieldModuleId = \"__mreact_module_id\";\nconst formFieldExportName = \"__mreact_export_name\";\nconst formFieldNonce = \"__mreact_action_nonce\";\nconst formFieldActionToken = \"__mreact_action_token\";\nconst actionTokenSecret = process.env.MREACT_SERVER_ACTION_SECRET ?? defaultActionTokenSecret();\n// Bounded default replay store for form-action nonces. The previous\n// implementation was an unbounded Set that grew with every successful\n// submission (Issue 069). Production callers should still pass a shared\n// store (Redis / KV) via `serverActions.replayStore` for multi-instance\n// deployments -- this default only guarantees replay protection within\n// a single process and is the safe fallback for dev / single-node setups.\n//\n// Retention model:\n// - TTL: 10 minutes. Form nonces are minted at SSR time and the user\n// has to submit before the cookie's SameSite=Lax window anyway; this\n// is generous for any realistic submit cadence.\n// - Max size: 50_000 entries. Old entries are evicted FIFO once the cap\n// is reached so a flood cannot trigger OOM.\n//\n// Both bounds are intentional defaults -- tight enough that a single\n// process cannot leak unbounded RSS, loose enough that legitimate\n// traffic does not trip false-positive 409s.\nconst DEFAULT_REPLAY_TTL_MS = 10 * 60 * 1000;\nconst DEFAULT_REPLAY_MAX_ENTRIES = 50_000;\nconst DEFAULT_ACTION_BODY_MAX_BYTES = 10 * 1024 * 1024;\nlet warnedUnrestrictedServerActions = false;\n\nexport interface ServerActionContext {\n clientIp?: string | undefined;\n cookies: RequestCookies;\n headers: Headers;\n request: Request;\n}\n\nfunction defaultActionTokenSecret(): string {\n if (isProductionEnvironment()) {\n console.warn(\n \"mreact-router: MREACT_SERVER_ACTION_SECRET is not set. Inferred server action tokens use a per-process secret and may fail across multiple production instances.\",\n );\n }\n\n return randomBytes(32).toString(\"base64url\");\n}\n\nclass BoundedReplayStore {\n private readonly entries = new Map<string, number>();\n\n constructor(\n private readonly ttlMs: number,\n private readonly maxEntries: number,\n ) {}\n\n has(value: string): boolean {\n const expiresAt = this.entries.get(value);\n if (expiresAt === undefined) return false;\n if (expiresAt < Date.now()) {\n this.entries.delete(value);\n return false;\n }\n return true;\n }\n\n add(value: string): void {\n const now = Date.now();\n // Cheap opportunistic sweep: drop the oldest expired entries first,\n // then enforce the hard cap with FIFO eviction.\n if (this.entries.size >= this.maxEntries) {\n for (const [key, expiresAt] of this.entries) {\n if (expiresAt < now) {\n this.entries.delete(key);\n }\n if (this.entries.size < this.maxEntries) break;\n }\n while (this.entries.size >= this.maxEntries) {\n const oldest = this.entries.keys().next().value;\n if (oldest === undefined) break;\n this.entries.delete(oldest);\n }\n }\n this.entries.set(value, now + this.ttlMs);\n }\n\n // Exposed for tests; not part of the ServerActionReplayStore interface.\n size(): number {\n return this.entries.size;\n }\n}\n\nconst usedFormActionNonces = new BoundedReplayStore(\n DEFAULT_REPLAY_TTL_MS,\n DEFAULT_REPLAY_MAX_ENTRIES,\n);\n\n// Test helpers: drop all entries between cases / expose the bounded store\n// so tests can drive its eviction semantics directly. Not part of the\n// public surface (prefixed with `__`).\nexport function __clearDefaultReplayStore(): void {\n (usedFormActionNonces as unknown as { entries: Map<string, number> }).entries.clear();\n}\n\nexport function __readDefaultReplayStore(): BoundedReplayStore {\n return usedFormActionNonces;\n}\n\nexport interface AppRouterServerActionOptions {\n allowedActions?: readonly AppRouterAllowedServerAction[] | undefined;\n authorize?: ServerActionHandlerOptions[\"authorize\"] | undefined;\n maxBodyBytes?: number | undefined;\n replayStore?: ServerActionReplayStore | undefined;\n}\n\nexport interface AppRouterAllowedServerAction extends ServerActionRequestReference {\n inferred?: boolean | undefined;\n}\n\nexport interface PreparedRouteActions {\n actionNonce?: string;\n code: string;\n csrfToken?: string;\n diagnostics?: ServerActionInferenceDiagnostic[] | undefined;\n // True when the cookie should be (re)set on the response. False means\n // the incoming request already carried a valid CSRF cookie that the\n // render is reusing -- skipping Set-Cookie avoids cookie thrash across\n // concurrent tabs (Issue 070).\n csrfTokenIsNew?: boolean;\n hasFormActions: boolean;\n}\n\ninterface ActionReference {\n exportName: string;\n inferred: boolean;\n moduleId: string;\n}\n\nexport interface PreparedFormActionReference {\n end: number;\n expression: string;\n expressionEnd: number;\n expressionStart: number;\n exportName: string;\n inferred: boolean;\n moduleId: string;\n sourceHash: string;\n start: number;\n}\n\nconst inferredServerActionReferences = new Map<string, Map<string, Map<string, ActionReference>>>();\n\nexport async function prepareRouteServerActions(options: {\n appDir: string;\n code: string;\n formActionReferences?: readonly PreparedFormActionReference[] | undefined;\n pageFile: string;\n request?: Request | undefined;\n}): Promise<PreparedRouteActions> {\n if (options.formActionReferences !== undefined && options.formActionReferences.length === 0) {\n replaceInferredServerActionReferences(options.appDir, options.pageFile, new Map());\n return { code: options.code, hasFormActions: false };\n }\n\n if (!hasFormActionCandidate(options.code, options.pageFile)) {\n replaceInferredServerActionReferences(options.appDir, options.pageFile, new Map());\n return { code: options.code, hasFormActions: false };\n }\n\n const inference =\n options.formActionReferences === undefined\n ? await collectImportedServerActions(options)\n : {\n diagnostics: [],\n references: formActionReferenceMap(options.code, options.formActionReferences),\n };\n const { diagnostics, references } = inference;\n\n if (references.size === 0) {\n replaceInferredServerActionReferences(options.appDir, options.pageFile, new Map());\n return diagnostics.length === 0\n ? { code: options.code, hasFormActions: false }\n : { code: options.code, diagnostics, hasFormActions: false };\n }\n\n // Reuse the existing CSRF token when the browser already sent one.\n // Rotating the cookie on every render (Issue 070) broke concurrent\n // forms because the older tab's hidden input no longer matched the\n // cookie value. The actionNonce stays per-render -- that is the field\n // tied to a specific submission via replay protection.\n const existingToken = readExistingFormCsrfToken(options.request);\n const csrfToken = existingToken ?? randomUUID();\n const csrfTokenIsNew = existingToken === undefined;\n const actionNonce = randomUUID();\n const lowered = lowerFormActions({\n actionNonce,\n code: options.code,\n csrfToken,\n references,\n });\n\n if (lowered === options.code) {\n replaceInferredServerActionReferences(options.appDir, options.pageFile, new Map());\n return diagnostics.length === 0\n ? { code: options.code, hasFormActions: false }\n : { code: options.code, diagnostics, hasFormActions: false };\n }\n\n replaceInferredServerActionReferences(options.appDir, options.pageFile, references);\n\n return {\n actionNonce,\n code: lowered,\n csrfToken,\n csrfTokenIsNew,\n diagnostics,\n hasFormActions: true,\n };\n}\n\nfunction formActionReferenceMap(\n code: string,\n references: readonly PreparedFormActionReference[],\n): Map<string, ActionReference> {\n const sourceHash = formActionSourceHash(code);\n\n return new Map(\n references\n .filter((reference) => reference.sourceHash === sourceHash)\n .map((reference) => [\n formActionOccurrenceKey(reference),\n {\n exportName: reference.exportName,\n inferred: reference.inferred,\n moduleId: reference.moduleId,\n },\n ]),\n );\n}\n\nfunction hasFormActionCandidate(code: string, filename: string): boolean {\n return collectFormActionExpressionReferences({ code, filename }).length > 0;\n}\n\nexport async function dispatchServerActionRequest(options: {\n appDir: string;\n importPolicy?: AppRouterImportPolicy | undefined;\n request: Request;\n routeCache?: AppRouterCache | undefined;\n serverActionCacheVersion?: string | undefined;\n serverActions?: AppRouterServerActionOptions | undefined;\n}): Promise<Response> {\n const { revalidatedPaths, value } = await withRouteCacheContext(options.routeCache, () =>\n dispatchServerActionRequestWithoutCacheContext(options),\n );\n\n return withRevalidationHeader(value, revalidatedPaths);\n}\n\nasync function dispatchServerActionRequestWithoutCacheContext(options: {\n appDir: string;\n importPolicy?: AppRouterImportPolicy | undefined;\n request: Request;\n serverActionCacheVersion?: string | undefined;\n serverActions?: AppRouterServerActionOptions | undefined;\n}): Promise<Response> {\n // Validate everything we can statically before touching the filesystem\n // / bundler. A flood of malformed POSTs must not pay the registry-load\n // cost (Issue 067).\n if (options.request.method !== \"POST\") {\n return jsonResponse({ ok: false, error: \"Method not allowed.\" }, 405);\n }\n\n const bodySizeResponse = validateServerActionBodySize(\n options.request,\n options.serverActions?.maxBodyBytes ?? DEFAULT_ACTION_BODY_MAX_BYTES,\n );\n if (bodySizeResponse !== undefined) {\n return bodySizeResponse;\n }\n\n const originResponse = validateServerActionRequestOrigin(options.request);\n if (originResponse !== undefined) {\n return originResponse;\n }\n\n const contentType = options.request.headers.get(\"content-type\") ?? \"\";\n\n if (contentType.includes(\"application/json\")) {\n // JSON path delegates CSRF/replay to createServerActionHandler. The\n // registry is still needed here, but the handler short-circuits on\n // CSRF mismatch before invoking the action.\n let registry: ServerActionRegistry;\n try {\n registry = await loadServerActionRegistry({\n appDir: options.appDir,\n cacheVersion: options.serverActionCacheVersion,\n importPolicy: options.importPolicy,\n });\n } catch (error) {\n return jsonResponse(\n { ok: false, error: error instanceof Error ? error.message : String(error) },\n 500,\n );\n }\n\n const replayStore = options.serverActions?.replayStore ?? usedFormActionNonces;\n warnIfUnrestrictedServerActions(options.serverActions?.allowedActions);\n const handle = createServerActionHandler(jsonServerActionRegistry({\n allowedActions: options.serverActions?.allowedActions,\n appDir: options.appDir,\n registry,\n }), {\n ...(options.serverActions?.authorize === undefined\n ? {}\n : { authorize: options.serverActions.authorize }),\n ...(options.serverActions?.allowedActions === undefined\n ? {}\n : { allowedActions: jsonAllowedServerActions(options.serverActions.allowedActions) }),\n csrf: true,\n maxBodyBytes: options.serverActions?.maxBodyBytes ?? DEFAULT_ACTION_BODY_MAX_BYTES,\n replayProtection: { seen: replayStore },\n });\n\n return handle(options.request);\n }\n\n if (\n !contentType.includes(\"application/x-www-form-urlencoded\") &&\n !contentType.includes(\"multipart/form-data\")\n ) {\n return jsonResponse({ ok: false, error: \"Unsupported server action content type.\" }, 415);\n }\n\n const formData = await options.request.formData();\n const csrfResponse = validateFormCsrf(options.request, formData);\n\n if (csrfResponse !== undefined) {\n return csrfResponse;\n }\n\n const moduleId = stringFormValue(formData.get(formFieldModuleId));\n const exportName = stringFormValue(formData.get(formFieldExportName));\n const nonce = stringFormValue(formData.get(formFieldNonce));\n\n if (moduleId === undefined || exportName === undefined || nonce === undefined) {\n return jsonResponse({ ok: false, error: \"Invalid server action reference.\" }, 400);\n }\n\n if (!isAllowedServerAction({ moduleId, exportName }, options.serverActions?.allowedActions)) {\n return jsonResponse({ ok: false, error: \"Unknown server action.\" }, 404);\n }\n\n if (\n isInferredServerActionReference({\n allowedActions: options.serverActions?.allowedActions,\n appDir: options.appDir,\n exportName,\n moduleId,\n }) &&\n !isValidFormActionToken({\n csrfToken: stringFormValue(formData.get(formCsrfFieldName)),\n exportName,\n moduleId,\n nonce,\n token: stringFormValue(formData.get(formFieldActionToken)),\n })\n ) {\n return jsonResponse({ ok: false, error: \"Unknown server action.\" }, 404);\n }\n\n const nonceResponse = validateFormNonce(\n formData,\n options.serverActions?.replayStore ?? usedFormActionNonces,\n );\n\n if (nonceResponse !== undefined) {\n return nonceResponse;\n }\n\n let registry: ServerActionRegistry;\n try {\n registry = await loadServerActionRegistry({\n appDir: options.appDir,\n cacheVersion: options.serverActionCacheVersion,\n importPolicy: options.importPolicy,\n });\n } catch (error) {\n return jsonResponse(\n { ok: false, error: error instanceof Error ? error.message : String(error) },\n 500,\n );\n }\n\n const action = registry[`${moduleId}#${exportName}`];\n\n if (typeof action !== \"function\") {\n return jsonResponse({ ok: false, error: \"Unknown server action.\" }, 404);\n }\n\n const actionFormData = cleanActionFormData(formData);\n const authorizationResponse = await authorizeFormAction({\n args: [actionFormData],\n authorize: options.serverActions?.authorize,\n exportName,\n moduleId,\n request: options.request,\n });\n\n if (authorizationResponse !== undefined) {\n return authorizationResponse;\n }\n\n try {\n const value = await action(actionFormData, createServerActionContext(options.request));\n\n if (value instanceof Response) {\n return value;\n }\n\n if (value === undefined || value === null) {\n return redirectToFormReferer(options.request);\n }\n\n return jsonResponse({ ok: true, value }, 200);\n } catch (error) {\n return jsonResponse(\n { ok: false, error: error instanceof Error ? error.message : String(error) },\n 500,\n );\n }\n}\n\nfunction createServerActionContext(request: Request): ServerActionContext {\n const clientIp = clientIpFromRequest(request);\n\n return {\n ...(clientIp === undefined ? {} : { clientIp }),\n cookies: cookies(request),\n headers: request.headers,\n request,\n };\n}\n\nfunction clientIpFromRequest(request: Request): string | undefined {\n const forwarded = request.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim();\n\n if (forwarded !== undefined && forwarded !== \"\") {\n return forwarded;\n }\n\n const realIp = request.headers.get(\"x-real-ip\")?.trim();\n return realIp === \"\" ? undefined : realIp;\n}\n\nfunction validateServerActionBodySize(\n request: Request,\n maxBodyBytes: number,\n): Response | undefined {\n if (!Number.isFinite(maxBodyBytes) || maxBodyBytes < 0) {\n return undefined;\n }\n\n const contentLength = request.headers.get(\"content-length\");\n if (contentLength === null) {\n return undefined;\n }\n\n const bytes = Number(contentLength);\n if (!Number.isFinite(bytes) || bytes < 0) {\n return jsonResponse({ ok: false, error: \"Invalid Content-Length header.\" }, 400);\n }\n\n if (bytes > maxBodyBytes) {\n return jsonResponse({ ok: false, error: \"Server action request body is too large.\" }, 413);\n }\n\n return undefined;\n}\n\nfunction redirectToFormReferer(request: Request): Response {\n return new Response(null, {\n status: 303,\n headers: {\n location: sameOriginRefererPath(request) ?? \"/\",\n },\n });\n}\n\nfunction sameOriginRefererPath(request: Request): string | undefined {\n const referer = request.headers.get(\"referer\");\n\n if (referer === null) {\n return undefined;\n }\n\n try {\n const requestUrl = new URL(request.url);\n const refererUrl = new URL(referer, requestUrl);\n\n return refererUrl.origin === requestUrl.origin\n ? `${refererUrl.pathname}${refererUrl.search}`\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction withRevalidationHeader(response: Response, paths: string[]): Response {\n if (paths.length > 0) {\n response.headers.set(\"x-mreact-revalidate\", paths.join(\",\"));\n }\n\n return response;\n}\n\nasync function authorizeFormAction(options: {\n args: unknown[];\n authorize?: ServerActionHandlerOptions[\"authorize\"];\n exportName: string;\n moduleId: string;\n request: Request;\n}): Promise<Response | undefined> {\n const reference: ServerActionRequestReference = {\n exportName: options.exportName,\n moduleId: options.moduleId,\n };\n const authorizationResult = await options.authorize?.(options.request, reference, options.args);\n\n return authorizationResult !== undefined && authorizationResult !== true\n ? jsonResponse(\n {\n ok: false,\n error: authorizationError(authorizationResult),\n },\n 403,\n )\n : undefined;\n}\n\nfunction authorizationError(result: Exclude<ServerActionValidationResult, true>): string {\n return typeof result === \"string\" ? result : \"Server action not authorized.\";\n}\n\nfunction jsonAllowedServerActions(\n allowedActions: readonly AppRouterAllowedServerAction[],\n): ServerActionRequestReference[] {\n return allowedActions\n .filter((reference) => reference.inferred !== true)\n .map((reference) => ({\n exportName: reference.exportName,\n moduleId: reference.moduleId,\n }));\n}\n\nfunction jsonServerActionRegistry(options: {\n allowedActions: readonly AppRouterAllowedServerAction[] | undefined;\n appDir: string;\n registry: ServerActionRegistry;\n}): ServerActionRegistry {\n const inferredKeys = new Set<string>();\n\n for (const reference of inferredServerActionReferencesForApp(options.appDir).values()) {\n inferredKeys.add(serverActionKey(reference));\n }\n\n for (const reference of options.allowedActions ?? []) {\n if (reference.inferred === true) {\n inferredKeys.add(serverActionKey(reference));\n }\n }\n\n if (inferredKeys.size === 0) {\n return options.registry;\n }\n\n const registry: ServerActionRegistry = {};\n\n for (const [key, value] of Object.entries(options.registry)) {\n if (!inferredKeys.has(key)) {\n registry[key] = value;\n }\n }\n\n return registry;\n}\n\nfunction serverActionKey(reference: ServerActionRequestReference): string {\n return `${reference.moduleId}#${reference.exportName}`;\n}\n\nfunction isAllowedServerAction(\n reference: ServerActionRequestReference,\n allowedActions: readonly AppRouterAllowedServerAction[] | undefined,\n): boolean {\n if (allowedActions === undefined) {\n warnIfUnrestrictedServerActions(allowedActions);\n return true;\n }\n\n return allowedActions.some(\n (allowed) =>\n allowed.moduleId === reference.moduleId && allowed.exportName === reference.exportName,\n );\n}\n\nfunction warnIfUnrestrictedServerActions(\n allowedActions: readonly AppRouterAllowedServerAction[] | undefined,\n): void {\n if (\n allowedActions !== undefined ||\n !isProductionEnvironment() ||\n warnedUnrestrictedServerActions\n ) {\n return;\n }\n\n warnedUnrestrictedServerActions = true;\n console.warn(\n \"[mreact] Server actions are running without an allowedActions manifest. Built app-router deployments generate this manifest automatically; direct production integrations should pass serverActions.allowedActions.\",\n );\n}\n\nfunction lowerFormActions(options: {\n actionNonce: string;\n code: string;\n csrfToken: string;\n references: Map<string, ActionReference>;\n}): string {\n let code = options.code;\n const formReferences = collectFormActionExpressionReferences({ code: options.code });\n\n for (const formReference of [...formReferences].reverse()) {\n const reference = options.references.get(formActionOccurrenceKey(formReference));\n\n if (reference === undefined) {\n continue;\n }\n\n const opening = code.slice(formReference.start, formReference.end);\n const loweredOpening = lowerFormActionOpening({\n actionNonce: options.actionNonce,\n csrfToken: options.csrfToken,\n opening,\n reference,\n referenceName: formReference.expression,\n });\n\n if (loweredOpening === opening) {\n continue;\n }\n\n code = `${code.slice(0, formReference.start)}${loweredOpening}${code.slice(formReference.end)}`;\n }\n\n return code;\n}\n\nfunction formActionOccurrenceKey(reference: {\n end: number;\n expression: string;\n expressionEnd: number;\n expressionStart: number;\n start: number;\n}): string {\n return [\n reference.start,\n reference.end,\n reference.expressionStart,\n reference.expressionEnd,\n reference.expression,\n ].join(\":\");\n}\n\nfunction formActionSourceHash(code: string): string {\n return createHash(\"sha256\").update(code).digest(\"base64url\");\n}\n\nfunction lowerFormActionOpening(options: {\n actionNonce: string;\n csrfToken: string;\n opening: string;\n reference: ActionReference;\n referenceName: string;\n}): string {\n const actionPattern = new RegExp(\n `^(?<prefix><form\\\\b[\\\\s\\\\S]*?)\\\\saction=\\\\{${escapeRegExp(options.referenceName)}\\\\}(?<suffix>[\\\\s\\\\S]*?)>$`,\n \"u\",\n );\n const match = options.opening.match(actionPattern);\n const prefix = match?.groups?.prefix;\n const suffix = match?.groups?.suffix;\n\n if (prefix === undefined || suffix === undefined) {\n return options.opening;\n }\n\n const attrs = `${prefix.slice(\"<form\".length)}${suffix}`.replace(\n /\\s+method=(?:\"[^\"]*\"|'[^']*'|\\{[^}]*\\})/g,\n \"\",\n );\n const hidden = [\n hiddenInput(formFieldModuleId, options.reference.moduleId),\n hiddenInput(formFieldExportName, options.reference.exportName),\n hiddenInput(formCsrfFieldName, options.csrfToken),\n hiddenInput(formFieldNonce, options.actionNonce),\n hiddenInput(\n formFieldActionToken,\n formActionToken({\n csrfToken: options.csrfToken,\n exportName: options.reference.exportName,\n moduleId: options.reference.moduleId,\n nonce: options.actionNonce,\n }),\n ),\n ].join(\"\");\n\n return `<form${attrs} method=\"post\" action=\"/_mreact/actions\">${hidden}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction hiddenInput(name: string, value: string): string {\n return `<input type=\"hidden\" name=\"${escapeAttribute(name)}\" value=\"${escapeAttribute(value)}\" />`;\n}\n\nasync function collectImportedServerActions(options: {\n appDir: string;\n code: string;\n pageFile: string;\n}): Promise<{\n diagnostics: ServerActionInferenceDiagnostic[];\n references: Map<string, ActionReference>;\n}> {\n return await collectRuntimeInferredServerActions({\n appDir: options.appDir,\n code: options.code,\n fileSystem: {\n isUseServerFile,\n resolveSourceFile,\n },\n pageFile: options.pageFile,\n });\n}\n\nfunction isInferredServerActionReference(options: {\n allowedActions: readonly AppRouterAllowedServerAction[] | undefined;\n appDir: string;\n exportName: string;\n moduleId: string;\n}): boolean {\n if (\n options.allowedActions?.some(\n (allowed) =>\n allowed.inferred === true &&\n allowed.moduleId === options.moduleId &&\n allowed.exportName === options.exportName,\n ) === true\n ) {\n return true;\n }\n\n return inferredServerActionReferencesForApp(options.appDir).has(\n `${options.moduleId}#${options.exportName}`,\n );\n}\n\nfunction formActionToken(options: {\n csrfToken: string;\n exportName: string;\n moduleId: string;\n nonce: string;\n}): string {\n return createHmac(\"sha256\", actionTokenSecret)\n .update(options.moduleId)\n .update(\"\\0\")\n .update(options.exportName)\n .update(\"\\0\")\n .update(options.csrfToken)\n .update(\"\\0\")\n .update(options.nonce)\n .digest(\"base64url\");\n}\n\nfunction isValidFormActionToken(options: {\n csrfToken: string | undefined;\n exportName: string;\n moduleId: string;\n nonce: string;\n token: string | undefined;\n}): boolean {\n if (options.csrfToken === undefined || options.token === undefined) {\n return false;\n }\n\n const expected = Buffer.from(\n formActionToken({\n csrfToken: options.csrfToken,\n exportName: options.exportName,\n moduleId: options.moduleId,\n nonce: options.nonce,\n }),\n );\n const actual = Buffer.from(options.token);\n\n return actual.length === expected.length && timingSafeEqual(actual, expected);\n}\n\nfunction replaceInferredServerActionReferences(\n appDir: string,\n pageFile: string,\n references: ReadonlyMap<string, ActionReference>,\n): void {\n const nextReferences = new Map(\n Array.from(references.values())\n .filter((reference) => reference.inferred)\n .map((reference) => [`${reference.moduleId}#${reference.exportName}`, reference]),\n );\n let appReferencesByPage = inferredServerActionReferences.get(appDir);\n const previousReferences = appReferencesByPage?.get(pageFile) ?? new Map();\n const changed = !sameActionReferenceKeys(previousReferences, nextReferences);\n\n if (!changed) {\n return;\n }\n\n if (nextReferences.size === 0) {\n appReferencesByPage?.delete(pageFile);\n if (appReferencesByPage?.size === 0) {\n inferredServerActionReferences.delete(appDir);\n }\n } else {\n if (appReferencesByPage === undefined) {\n appReferencesByPage = new Map();\n inferredServerActionReferences.set(appDir, appReferencesByPage);\n }\n appReferencesByPage.set(pageFile, nextReferences);\n }\n\n clearServerActionRegistryCacheForApp(appDir);\n}\n\n// Cache the (expensive) collect+bundle+evaluate work keyed by appDir +\n// caller-supplied version. Production callers pass the build-time hash\n// (serverModuleCacheVersion) so the registry is reused for the lifetime\n// of one deployment. Dev callers omit the version; the entry is then\n// keyed on \"dev\" so the work happens once per process — restarts handle\n// invalidation. Concurrent callers share a single in-flight promise.\nconst serverActionRegistryCache = new Map<string, Promise<ServerActionRegistry>>();\n\nasync function loadServerActionRegistry(options: {\n appDir: string;\n cacheVersion?: string | undefined;\n importPolicy?: AppRouterImportPolicy | undefined;\n}): Promise<ServerActionRegistry> {\n const cacheKey = `${options.appDir}::${options.cacheVersion ?? \"dev\"}`;\n const cached = serverActionRegistryCache.get(cacheKey);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const pending = buildServerActionRegistry(options).catch((error) => {\n // Drop the failed promise so a retry can re-run the load.\n serverActionRegistryCache.delete(cacheKey);\n throw error;\n });\n serverActionRegistryCache.set(cacheKey, pending);\n return pending;\n}\n\nasync function buildServerActionRegistry(options: {\n appDir: string;\n importPolicy?: AppRouterImportPolicy | undefined;\n}): Promise<ServerActionRegistry> {\n const files = await collectFiles(options.appDir);\n const registry: ServerActionRegistry = {};\n const inferredReferences = inferredServerActionReferencesForApp(options.appDir);\n\n for (const file of files) {\n const moduleId = moduleIdForFile(options.appDir, file);\n const inferredExportNames = inferredExportNamesForModule(inferredReferences, moduleId);\n const useServerFile = await isUseServerFile(file);\n\n if (!useServerFile && inferredExportNames.size === 0) {\n continue;\n }\n\n const module = await importServerActionModule({\n appDir: options.appDir,\n file,\n importPolicy: options.importPolicy,\n });\n\n for (const [exportName, value] of Object.entries(module)) {\n if (typeof value === \"function\" && (useServerFile || inferredExportNames.has(exportName))) {\n registry[`${moduleId}#${exportName}`] = value as (...args: unknown[]) => unknown;\n }\n }\n }\n\n return registry;\n}\n\n// Exposed for tests that need a clean slate between cases (in-process state).\nexport function __clearServerActionRegistryCache(): void {\n serverActionRegistryCache.clear();\n inferredServerActionReferences.clear();\n}\n\nfunction clearServerActionRegistryCacheForApp(appDir: string): void {\n const prefix = `${appDir}::`;\n\n for (const key of serverActionRegistryCache.keys()) {\n if (key.startsWith(prefix)) {\n serverActionRegistryCache.delete(key);\n }\n }\n}\n\nfunction sameActionReferenceKeys(\n left: ReadonlyMap<string, ActionReference>,\n right: ReadonlyMap<string, ActionReference>,\n): boolean {\n if (left.size !== right.size) {\n return false;\n }\n\n for (const key of left.keys()) {\n if (!right.has(key)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction inferredServerActionReferencesForApp(appDir: string): Map<string, ActionReference> {\n const references = new Map<string, ActionReference>();\n const appReferencesByPage = inferredServerActionReferences.get(appDir);\n\n if (appReferencesByPage === undefined) {\n return references;\n }\n\n for (const pageReferences of appReferencesByPage.values()) {\n for (const [key, reference] of pageReferences) {\n references.set(key, reference);\n }\n }\n\n return references;\n}\n\nfunction inferredExportNamesForModule(\n references: ReadonlyMap<string, ActionReference>,\n moduleId: string,\n): Set<string> {\n const names = new Set<string>();\n\n for (const reference of references.values()) {\n if (reference.moduleId === moduleId) {\n names.add(reference.exportName);\n }\n }\n\n return names;\n}\n\nasync function importServerActionModule(options: {\n appDir: string;\n file: string;\n importPolicy?: AppRouterImportPolicy | undefined;\n}): Promise<Record<string, unknown>> {\n const bundled = await bundleRouterModule({\n code: `export * from ${JSON.stringify(options.file)};`,\n filename: options.file,\n platform: \"node\",\n plugins: [\n fileImportMetaUrlPlugin(),\n serverActionRuntimePlugin(),\n createAppRouterImportPolicyPlugin({\n appDir: options.appDir,\n importPolicy: options.importPolicy,\n label: \"Server action\",\n }),\n ],\n });\n const code = bundled.code;\n\n if (code === undefined) {\n throw new Error(`Failed to compile server action module ${options.file}.`);\n }\n\n return importAppRouterSourceModule<Record<string, unknown>>({\n code,\n label: `server-action:${options.file}`,\n });\n}\n\nfunction serverActionRuntimePlugin() {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n const cachePath = join(currentDir, currentDir.endsWith(`${sep}dist`) ? \"cache.js\" : \"cache.ts\");\n\n return {\n name: \"mreact-router-server-action-runtime\",\n setup(buildApi: RouterCompatBuildApi) {\n buildApi.onResolve({ filter: /^@reckona\\/mreact-router$/ }, () => ({\n namespace: \"mreact-router-server-api\",\n path: \"index\",\n }));\n buildApi.onLoad({ filter: /^index$/, namespace: \"mreact-router-server-api\" }, () => ({\n contents: `export { revalidatePath } from ${JSON.stringify(cachePath)};`,\n loader: \"ts\",\n resolveDir: dirname(cachePath),\n }));\n },\n };\n}\n\nasync function collectFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const path = join(directory, entry.name);\n\n if (entry.isDirectory()) {\n files.push(...(await collectFiles(path)));\n continue;\n }\n\n if (entry.isFile() && /\\.(?:mreact\\.tsx|tsx|ts)$/.test(entry.name)) {\n files.push(path);\n }\n }\n\n return files;\n}\n\nasync function resolveSourceFile(directory: string, source: string): Promise<string | undefined> {\n const base = join(directory, source);\n const tsEsmBase = /\\.[cm]?js$/.test(base) ? base.replace(/\\.[cm]?js$/, \"\") : undefined;\n const candidates = [\n base,\n ...(tsEsmBase === undefined\n ? []\n : [\n `${tsEsmBase}.ts`,\n `${tsEsmBase}.tsx`,\n `${tsEsmBase}.mreact.tsx`,\n join(tsEsmBase, \"index.ts\"),\n join(tsEsmBase, \"index.tsx\"),\n ]),\n `${base}.ts`,\n `${base}.tsx`,\n `${base}.mreact.tsx`,\n join(base, \"index.ts\"),\n join(base, \"index.tsx\"),\n ];\n\n for (const candidate of candidates) {\n try {\n await access(candidate);\n return candidate;\n } catch {\n // Try the next candidate.\n }\n }\n\n return undefined;\n}\n\nasync function isUseServerFile(file: string): Promise<boolean> {\n const code = await readFile(file, \"utf8\");\n\n return hasModuleDirective({ code, directive: \"use server\", filename: file });\n}\n\nfunction moduleIdForFile(appDir: string, file: string): string {\n return relative(appDir, file).split(sep).join(\"/\");\n}\n\nfunction validateServerActionRequestOrigin(request: Request): Response | undefined {\n if (!isProductionEnvironment()) {\n return undefined;\n }\n\n const expectedOrigin = new URL(request.url).origin;\n const origin = request.headers.get(\"origin\");\n\n if (origin !== null) {\n return origin === expectedOrigin\n ? undefined\n : jsonResponse({ ok: false, error: \"Origin not allowed.\" }, 403);\n }\n\n const referer = request.headers.get(\"referer\");\n\n if (referer === null) {\n return jsonResponse({ ok: false, error: \"Origin not allowed.\" }, 403);\n }\n\n try {\n return new URL(referer).origin === expectedOrigin\n ? undefined\n : jsonResponse({ ok: false, error: \"Origin not allowed.\" }, 403);\n } catch {\n return jsonResponse({ ok: false, error: \"Origin not allowed.\" }, 403);\n }\n}\n\nfunction validateFormNonce(\n formData: FormData,\n replayStore: ServerActionReplayStore,\n): Response | undefined {\n const nonce = stringFormValue(formData.get(formFieldNonce));\n\n if (nonce === undefined || nonce.length === 0) {\n return jsonResponse({ ok: false, error: \"Missing server action nonce.\" }, 400);\n }\n\n if (replayStore.has(nonce)) {\n return jsonResponse({ ok: false, error: \"Server action nonce was already used.\" }, 409);\n }\n\n replayStore.add(nonce);\n return undefined;\n}\n\nfunction cleanActionFormData(formData: FormData): FormData {\n const cleaned = new FormData();\n\n for (const [name, value] of formData.entries()) {\n if (\n name !== formFieldModuleId &&\n name !== formFieldExportName &&\n name !== formCsrfFieldName &&\n name !== formFieldNonce &&\n name !== formFieldActionToken\n ) {\n cleaned.append(name, value);\n }\n }\n\n return cleaned;\n}\n\nfunction stringFormValue(value: FormDataEntryValue | null): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction jsonResponse(payload: unknown, status: number): Response {\n return new Response(JSON.stringify(payload), {\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n status,\n });\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll('\"', \""\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, createHmac, randomBytes, randomUUID, timingSafeEqual } from \"node:crypto\";\nimport { access, readdir, readFile } from \"node:fs/promises\";\nimport { dirname, join, relative, sep } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n collectFormActionExpressionReferences,\n hasModuleDirective,\n} from \"@reckona/mreact-compiler\";\nimport {\n createServerActionHandler,\n type ServerActionHandlerOptions,\n type ServerActionRegistry,\n type ServerActionReplayStore,\n type ServerActionRequestReference,\n type ServerActionValidationResult,\n} from \"@reckona/mreact-server\";\nimport { bundleRouterModule, type RouterCompatBuildApi } from \"./bundle-pipeline.js\";\nimport { type AppRouterCache, withRouteCacheContext } from \"./cache.js\";\nimport { fileImportMetaUrlPlugin, importAppRouterSourceModule } from \"./module-runner.js\";\nimport { createAppRouterImportPolicyPlugin, type AppRouterImportPolicy } from \"./import-policy.js\";\nimport { cookies, type RequestCookies } from \"./navigation.js\";\nexport {\n createFormCsrfToken,\n formCsrfCookie,\n formCsrfFieldName,\n serverActionCookie,\n validateFormCsrf,\n} from \"./csrf.js\";\nimport {\n formCsrfFieldName,\n readExistingFormCsrfToken,\n validateFormCsrf,\n} from \"./csrf.js\";\nimport {\n collectRuntimeInferredServerActions,\n type ServerActionInferenceDiagnostic,\n} from \"./server-action-inference.js\";\n\nfunction isProductionEnvironment(): boolean {\n return process.env.NODE_ENV === \"production\";\n}\nconst formFieldModuleId = \"__mreact_module_id\";\nconst formFieldExportName = \"__mreact_export_name\";\nconst formFieldNonce = \"__mreact_action_nonce\";\nconst formFieldActionToken = \"__mreact_action_token\";\nconst actionTokenSecret = process.env.MREACT_SERVER_ACTION_SECRET ?? defaultActionTokenSecret();\n// Bounded default replay store for form-action nonces. The previous\n// implementation was an unbounded Set that grew with every successful\n// submission (Issue 069). Production callers should still pass a shared\n// store (Redis / KV) via `serverActions.replayStore` for multi-instance\n// deployments -- this default only guarantees replay protection within\n// a single process and is the safe fallback for dev / single-node setups.\n//\n// Retention model:\n// - TTL: 10 minutes. Form nonces are minted at SSR time and the user\n// has to submit before the cookie's SameSite=Lax window anyway; this\n// is generous for any realistic submit cadence.\n// - Max size: 50_000 entries. Old entries are evicted FIFO once the cap\n// is reached so a flood cannot trigger OOM.\n//\n// Both bounds are intentional defaults -- tight enough that a single\n// process cannot leak unbounded RSS, loose enough that legitimate\n// traffic does not trip false-positive 409s.\nconst DEFAULT_REPLAY_TTL_MS = 10 * 60 * 1000;\nconst DEFAULT_REPLAY_MAX_ENTRIES = 50_000;\nconst DEFAULT_ACTION_BODY_MAX_BYTES = 10 * 1024 * 1024;\nconst DEFAULT_ACTION_FORM_MAX_FIELDS = 1_000;\nlet warnedUnrestrictedServerActions = false;\n\nexport interface ServerActionContext {\n clientIp?: string | undefined;\n cookies: RequestCookies;\n headers: Headers;\n request: Request;\n}\n\nfunction defaultActionTokenSecret(): string {\n if (isProductionEnvironment()) {\n console.warn(\n \"mreact-router: MREACT_SERVER_ACTION_SECRET is not set. Inferred server action tokens use a per-process secret and may fail across multiple production instances.\",\n );\n }\n\n return randomBytes(32).toString(\"base64url\");\n}\n\nclass BoundedReplayStore {\n private readonly entries = new Map<string, number>();\n\n constructor(\n private readonly ttlMs: number,\n private readonly maxEntries: number,\n ) {}\n\n has(value: string): boolean {\n const expiresAt = this.entries.get(value);\n if (expiresAt === undefined) return false;\n if (expiresAt < Date.now()) {\n this.entries.delete(value);\n return false;\n }\n return true;\n }\n\n add(value: string): void {\n const now = Date.now();\n if (this.entries.size >= this.maxEntries) {\n const oldest = this.entries.entries().next().value;\n if (oldest !== undefined) {\n const [key, expiresAt] = oldest;\n this.entries.delete(key);\n if (expiresAt < now) {\n while (this.entries.size >= this.maxEntries) {\n const nextOldest = this.entries.entries().next().value;\n if (nextOldest === undefined || nextOldest[1] >= now) {\n break;\n }\n this.entries.delete(nextOldest[0]);\n }\n }\n }\n }\n this.entries.set(value, now + this.ttlMs);\n }\n\n // Exposed for tests; not part of the ServerActionReplayStore interface.\n size(): number {\n return this.entries.size;\n }\n}\n\nconst usedFormActionNonces = new BoundedReplayStore(\n DEFAULT_REPLAY_TTL_MS,\n DEFAULT_REPLAY_MAX_ENTRIES,\n);\n\n// Test helpers: drop all entries between cases / expose the bounded store\n// so tests can drive its eviction semantics directly. Not part of the\n// public surface (prefixed with `__`).\nexport function __clearDefaultReplayStore(): void {\n (usedFormActionNonces as unknown as { entries: Map<string, number> }).entries.clear();\n}\n\nexport function __readDefaultReplayStore(): BoundedReplayStore {\n return usedFormActionNonces;\n}\n\nexport interface AppRouterServerActionOptions {\n allowedActions?: readonly AppRouterAllowedServerAction[] | undefined;\n authorize?: ServerActionHandlerOptions[\"authorize\"] | undefined;\n maxBodyBytes?: number | undefined;\n maxFormFields?: number | undefined;\n replayStore?: ServerActionReplayStore | undefined;\n}\n\nexport interface AppRouterAllowedServerAction extends ServerActionRequestReference {\n inferred?: boolean | undefined;\n}\n\nexport interface PreparedRouteActions {\n actionNonce?: string;\n code: string;\n csrfToken?: string;\n diagnostics?: ServerActionInferenceDiagnostic[] | undefined;\n // True when the cookie should be (re)set on the response. False means\n // the incoming request already carried a valid CSRF cookie that the\n // render is reusing -- skipping Set-Cookie avoids cookie thrash across\n // concurrent tabs (Issue 070).\n csrfTokenIsNew?: boolean;\n hasFormActions: boolean;\n}\n\ninterface ActionReference {\n exportName: string;\n inferred: boolean;\n moduleId: string;\n}\n\nexport interface PreparedFormActionReference {\n end: number;\n expression: string;\n expressionEnd: number;\n expressionStart: number;\n exportName: string;\n inferred: boolean;\n moduleId: string;\n sourceHash: string;\n start: number;\n}\n\nconst inferredServerActionReferences = new Map<string, Map<string, Map<string, ActionReference>>>();\n\nexport async function prepareRouteServerActions(options: {\n appDir: string;\n code: string;\n formActionReferences?: readonly PreparedFormActionReference[] | undefined;\n pageFile: string;\n request?: Request | undefined;\n}): Promise<PreparedRouteActions> {\n if (options.formActionReferences !== undefined && options.formActionReferences.length === 0) {\n replaceInferredServerActionReferences(options.appDir, options.pageFile, new Map());\n return { code: options.code, hasFormActions: false };\n }\n\n if (!hasFormActionCandidate(options.code, options.pageFile)) {\n replaceInferredServerActionReferences(options.appDir, options.pageFile, new Map());\n return { code: options.code, hasFormActions: false };\n }\n\n const inference =\n options.formActionReferences === undefined\n ? await collectImportedServerActions(options)\n : {\n diagnostics: [],\n references: formActionReferenceMap(options.code, options.formActionReferences),\n };\n const { diagnostics, references } = inference;\n\n if (references.size === 0) {\n replaceInferredServerActionReferences(options.appDir, options.pageFile, new Map());\n return diagnostics.length === 0\n ? { code: options.code, hasFormActions: false }\n : { code: options.code, diagnostics, hasFormActions: false };\n }\n\n // Reuse the existing CSRF token when the browser already sent one.\n // Rotating the cookie on every render (Issue 070) broke concurrent\n // forms because the older tab's hidden input no longer matched the\n // cookie value. The actionNonce stays per-render -- that is the field\n // tied to a specific submission via replay protection.\n const existingToken = readExistingFormCsrfToken(options.request);\n const csrfToken = existingToken ?? randomUUID();\n const csrfTokenIsNew = existingToken === undefined;\n const actionNonce = randomUUID();\n const lowered = lowerFormActions({\n actionNonce,\n code: options.code,\n csrfToken,\n references,\n });\n\n if (lowered === options.code) {\n replaceInferredServerActionReferences(options.appDir, options.pageFile, new Map());\n return diagnostics.length === 0\n ? { code: options.code, hasFormActions: false }\n : { code: options.code, diagnostics, hasFormActions: false };\n }\n\n replaceInferredServerActionReferences(options.appDir, options.pageFile, references);\n\n return {\n actionNonce,\n code: lowered,\n csrfToken,\n csrfTokenIsNew,\n diagnostics,\n hasFormActions: true,\n };\n}\n\nfunction formActionReferenceMap(\n code: string,\n references: readonly PreparedFormActionReference[],\n): Map<string, ActionReference> {\n const sourceHash = formActionSourceHash(code);\n\n return new Map(\n references\n .filter((reference) => reference.sourceHash === sourceHash)\n .map((reference) => [\n formActionOccurrenceKey(reference),\n {\n exportName: reference.exportName,\n inferred: reference.inferred,\n moduleId: reference.moduleId,\n },\n ]),\n );\n}\n\nfunction hasFormActionCandidate(code: string, filename: string): boolean {\n return collectFormActionExpressionReferences({ code, filename }).length > 0;\n}\n\nexport async function dispatchServerActionRequest(options: {\n appDir: string;\n importPolicy?: AppRouterImportPolicy | undefined;\n request: Request;\n routeCache?: AppRouterCache | undefined;\n serverActionCacheVersion?: string | undefined;\n serverActions?: AppRouterServerActionOptions | undefined;\n}): Promise<Response> {\n const { revalidatedPaths, value } = await withRouteCacheContext(options.routeCache, () =>\n dispatchServerActionRequestWithoutCacheContext(options),\n );\n\n return withRevalidationHeader(value, revalidatedPaths);\n}\n\nasync function dispatchServerActionRequestWithoutCacheContext(options: {\n appDir: string;\n importPolicy?: AppRouterImportPolicy | undefined;\n request: Request;\n serverActionCacheVersion?: string | undefined;\n serverActions?: AppRouterServerActionOptions | undefined;\n}): Promise<Response> {\n // Validate everything we can statically before touching the filesystem\n // / bundler. A flood of malformed POSTs must not pay the registry-load\n // cost (Issue 067).\n if (options.request.method !== \"POST\") {\n return jsonResponse({ ok: false, error: \"Method not allowed.\" }, 405);\n }\n\n const bodySizeResponse = validateServerActionBodySize(\n options.request,\n options.serverActions?.maxBodyBytes ?? DEFAULT_ACTION_BODY_MAX_BYTES,\n );\n if (bodySizeResponse !== undefined) {\n return bodySizeResponse;\n }\n\n const originResponse = validateServerActionRequestOrigin(options.request);\n if (originResponse !== undefined) {\n return originResponse;\n }\n\n const contentType = options.request.headers.get(\"content-type\") ?? \"\";\n\n if (contentType.includes(\"application/json\")) {\n // JSON path delegates CSRF/replay to createServerActionHandler. The\n // registry is still needed here, but the handler short-circuits on\n // CSRF mismatch before invoking the action.\n let registry: ServerActionRegistry;\n try {\n registry = await loadServerActionRegistry({\n appDir: options.appDir,\n cacheVersion: options.serverActionCacheVersion,\n importPolicy: options.importPolicy,\n });\n } catch (error) {\n return jsonResponse(\n { ok: false, error: error instanceof Error ? error.message : String(error) },\n 500,\n );\n }\n\n const replayStore = options.serverActions?.replayStore ?? usedFormActionNonces;\n warnIfUnrestrictedServerActions(options.serverActions?.allowedActions);\n const handle = createServerActionHandler(jsonServerActionRegistry({\n allowedActions: options.serverActions?.allowedActions,\n appDir: options.appDir,\n registry,\n }), {\n ...(options.serverActions?.authorize === undefined\n ? {}\n : { authorize: options.serverActions.authorize }),\n ...(options.serverActions?.allowedActions === undefined\n ? {}\n : { allowedActions: jsonAllowedServerActions(options.serverActions.allowedActions) }),\n csrf: true,\n maxBodyBytes: options.serverActions?.maxBodyBytes ?? DEFAULT_ACTION_BODY_MAX_BYTES,\n replayProtection: { seen: replayStore },\n });\n\n return handle(options.request);\n }\n\n if (\n !contentType.includes(\"application/x-www-form-urlencoded\") &&\n !contentType.includes(\"multipart/form-data\")\n ) {\n return jsonResponse({ ok: false, error: \"Unsupported server action content type.\" }, 415);\n }\n\n const formData = await options.request.formData();\n const fieldCountResponse = validateServerActionFormFieldCount(\n formData,\n options.serverActions?.maxFormFields ?? DEFAULT_ACTION_FORM_MAX_FIELDS,\n );\n\n if (fieldCountResponse !== undefined) {\n return fieldCountResponse;\n }\n\n const csrfResponse = validateFormCsrf(options.request, formData);\n\n if (csrfResponse !== undefined) {\n return csrfResponse;\n }\n\n const moduleId = stringFormValue(formData.get(formFieldModuleId));\n const exportName = stringFormValue(formData.get(formFieldExportName));\n const nonce = stringFormValue(formData.get(formFieldNonce));\n\n if (moduleId === undefined || exportName === undefined || nonce === undefined) {\n return jsonResponse({ ok: false, error: \"Invalid server action reference.\" }, 400);\n }\n\n if (!isAllowedServerAction({ moduleId, exportName }, options.serverActions?.allowedActions)) {\n return jsonResponse({ ok: false, error: \"Unknown server action.\" }, 404);\n }\n\n if (\n isInferredServerActionReference({\n allowedActions: options.serverActions?.allowedActions,\n appDir: options.appDir,\n exportName,\n moduleId,\n }) &&\n !isValidFormActionToken({\n csrfToken: stringFormValue(formData.get(formCsrfFieldName)),\n exportName,\n moduleId,\n nonce,\n token: stringFormValue(formData.get(formFieldActionToken)),\n })\n ) {\n return jsonResponse({ ok: false, error: \"Unknown server action.\" }, 404);\n }\n\n const nonceResponse = validateFormNonce(\n formData,\n options.serverActions?.replayStore ?? usedFormActionNonces,\n );\n\n if (nonceResponse !== undefined) {\n return nonceResponse;\n }\n\n let registry: ServerActionRegistry;\n try {\n registry = await loadServerActionRegistry({\n appDir: options.appDir,\n cacheVersion: options.serverActionCacheVersion,\n importPolicy: options.importPolicy,\n });\n } catch (error) {\n return jsonResponse(\n { ok: false, error: error instanceof Error ? error.message : String(error) },\n 500,\n );\n }\n\n const action = registry[`${moduleId}#${exportName}`];\n\n if (typeof action !== \"function\") {\n return jsonResponse({ ok: false, error: \"Unknown server action.\" }, 404);\n }\n\n const actionFormData = cleanActionFormData(formData);\n const authorizationResponse = await authorizeFormAction({\n args: [actionFormData],\n authorize: options.serverActions?.authorize,\n exportName,\n moduleId,\n request: options.request,\n });\n\n if (authorizationResponse !== undefined) {\n return authorizationResponse;\n }\n\n try {\n const value = await action(actionFormData, createServerActionContext(options.request));\n\n if (value instanceof Response) {\n return value;\n }\n\n if (value === undefined || value === null) {\n return redirectToFormReferer(options.request);\n }\n\n return jsonResponse({ ok: true, value }, 200);\n } catch (error) {\n return jsonResponse(\n { ok: false, error: error instanceof Error ? error.message : String(error) },\n 500,\n );\n }\n}\n\nfunction createServerActionContext(request: Request): ServerActionContext {\n const clientIp = clientIpFromRequest(request);\n\n return {\n ...(clientIp === undefined ? {} : { clientIp }),\n cookies: cookies(request),\n headers: request.headers,\n request,\n };\n}\n\nfunction clientIpFromRequest(request: Request): string | undefined {\n const forwarded = request.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim();\n\n if (forwarded !== undefined && forwarded !== \"\") {\n return forwarded;\n }\n\n const realIp = request.headers.get(\"x-real-ip\")?.trim();\n return realIp === \"\" ? undefined : realIp;\n}\n\nfunction validateServerActionBodySize(\n request: Request,\n maxBodyBytes: number,\n): Response | undefined {\n if (!Number.isFinite(maxBodyBytes) || maxBodyBytes < 0) {\n return undefined;\n }\n\n const contentLength = request.headers.get(\"content-length\");\n if (contentLength === null) {\n return undefined;\n }\n\n const bytes = Number(contentLength);\n if (!Number.isFinite(bytes) || bytes < 0) {\n return jsonResponse({ ok: false, error: \"Invalid Content-Length header.\" }, 400);\n }\n\n if (bytes > maxBodyBytes) {\n return jsonResponse({ ok: false, error: \"Server action request body is too large.\" }, 413);\n }\n\n return undefined;\n}\n\nfunction validateServerActionFormFieldCount(\n formData: FormData,\n maxFormFields: number,\n): Response | undefined {\n if (!Number.isFinite(maxFormFields) || maxFormFields < 0) {\n return undefined;\n }\n\n let count = 0;\n for (const _ of formData.keys()) {\n count += 1;\n if (count > maxFormFields) {\n return jsonResponse({\n ok: false,\n error: \"Server action form field count is too large.\",\n }, 413);\n }\n }\n\n return undefined;\n}\n\nfunction redirectToFormReferer(request: Request): Response {\n return new Response(null, {\n status: 303,\n headers: {\n location: sameOriginRefererPath(request) ?? \"/\",\n },\n });\n}\n\nfunction sameOriginRefererPath(request: Request): string | undefined {\n const referer = request.headers.get(\"referer\");\n\n if (referer === null) {\n return undefined;\n }\n\n try {\n const requestUrl = new URL(request.url);\n const refererUrl = new URL(referer, requestUrl);\n\n return refererUrl.origin === requestUrl.origin\n ? `${refererUrl.pathname}${refererUrl.search}`\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction withRevalidationHeader(response: Response, paths: string[]): Response {\n if (paths.length > 0) {\n response.headers.set(\"x-mreact-revalidate\", paths.join(\",\"));\n }\n\n return response;\n}\n\nasync function authorizeFormAction(options: {\n args: unknown[];\n authorize?: ServerActionHandlerOptions[\"authorize\"];\n exportName: string;\n moduleId: string;\n request: Request;\n}): Promise<Response | undefined> {\n const reference: ServerActionRequestReference = {\n exportName: options.exportName,\n moduleId: options.moduleId,\n };\n const authorizationResult = await options.authorize?.(options.request, reference, options.args);\n\n return authorizationResult !== undefined && authorizationResult !== true\n ? jsonResponse(\n {\n ok: false,\n error: authorizationError(authorizationResult),\n },\n 403,\n )\n : undefined;\n}\n\nfunction authorizationError(result: Exclude<ServerActionValidationResult, true>): string {\n return typeof result === \"string\" ? result : \"Server action not authorized.\";\n}\n\nfunction jsonAllowedServerActions(\n allowedActions: readonly AppRouterAllowedServerAction[],\n): ServerActionRequestReference[] {\n return allowedActions\n .filter((reference) => reference.inferred !== true)\n .map((reference) => ({\n exportName: reference.exportName,\n moduleId: reference.moduleId,\n }));\n}\n\nfunction jsonServerActionRegistry(options: {\n allowedActions: readonly AppRouterAllowedServerAction[] | undefined;\n appDir: string;\n registry: ServerActionRegistry;\n}): ServerActionRegistry {\n const inferredKeys = new Set<string>();\n\n for (const reference of inferredServerActionReferencesForApp(options.appDir).values()) {\n inferredKeys.add(serverActionKey(reference));\n }\n\n for (const reference of options.allowedActions ?? []) {\n if (reference.inferred === true) {\n inferredKeys.add(serverActionKey(reference));\n }\n }\n\n if (inferredKeys.size === 0) {\n return options.registry;\n }\n\n const registry: ServerActionRegistry = {};\n\n for (const [key, value] of Object.entries(options.registry)) {\n if (!inferredKeys.has(key)) {\n registry[key] = value;\n }\n }\n\n return registry;\n}\n\nfunction serverActionKey(reference: ServerActionRequestReference): string {\n return `${reference.moduleId}#${reference.exportName}`;\n}\n\nfunction isAllowedServerAction(\n reference: ServerActionRequestReference,\n allowedActions: readonly AppRouterAllowedServerAction[] | undefined,\n): boolean {\n if (allowedActions === undefined) {\n warnIfUnrestrictedServerActions(allowedActions);\n return true;\n }\n\n return allowedActions.some(\n (allowed) =>\n allowed.moduleId === reference.moduleId && allowed.exportName === reference.exportName,\n );\n}\n\nfunction warnIfUnrestrictedServerActions(\n allowedActions: readonly AppRouterAllowedServerAction[] | undefined,\n): void {\n if (\n allowedActions !== undefined ||\n !isProductionEnvironment() ||\n warnedUnrestrictedServerActions\n ) {\n return;\n }\n\n warnedUnrestrictedServerActions = true;\n console.warn(\n \"[mreact] Server actions are running without an allowedActions manifest. Built app-router deployments generate this manifest automatically; direct production integrations should pass serverActions.allowedActions.\",\n );\n}\n\nfunction lowerFormActions(options: {\n actionNonce: string;\n code: string;\n csrfToken: string;\n references: Map<string, ActionReference>;\n}): string {\n let code = options.code;\n const formReferences = collectFormActionExpressionReferences({ code: options.code });\n\n for (const formReference of [...formReferences].reverse()) {\n const reference = options.references.get(formActionOccurrenceKey(formReference));\n\n if (reference === undefined) {\n continue;\n }\n\n const opening = code.slice(formReference.start, formReference.end);\n const loweredOpening = lowerFormActionOpening({\n actionNonce: options.actionNonce,\n csrfToken: options.csrfToken,\n opening,\n reference,\n referenceName: formReference.expression,\n });\n\n if (loweredOpening === opening) {\n continue;\n }\n\n code = `${code.slice(0, formReference.start)}${loweredOpening}${code.slice(formReference.end)}`;\n }\n\n return code;\n}\n\nfunction formActionOccurrenceKey(reference: {\n end: number;\n expression: string;\n expressionEnd: number;\n expressionStart: number;\n start: number;\n}): string {\n return [\n reference.start,\n reference.end,\n reference.expressionStart,\n reference.expressionEnd,\n reference.expression,\n ].join(\":\");\n}\n\nfunction formActionSourceHash(code: string): string {\n return createHash(\"sha256\").update(code).digest(\"base64url\");\n}\n\nfunction lowerFormActionOpening(options: {\n actionNonce: string;\n csrfToken: string;\n opening: string;\n reference: ActionReference;\n referenceName: string;\n}): string {\n const actionPattern = new RegExp(\n `^(?<prefix><form\\\\b[\\\\s\\\\S]*?)\\\\saction=\\\\{${escapeRegExp(options.referenceName)}\\\\}(?<suffix>[\\\\s\\\\S]*?)>$`,\n \"u\",\n );\n const match = options.opening.match(actionPattern);\n const prefix = match?.groups?.prefix;\n const suffix = match?.groups?.suffix;\n\n if (prefix === undefined || suffix === undefined) {\n return options.opening;\n }\n\n const attrs = `${prefix.slice(\"<form\".length)}${suffix}`.replace(\n /\\s+method=(?:\"[^\"]*\"|'[^']*'|\\{[^}]*\\})/g,\n \"\",\n );\n const hidden = [\n hiddenInput(formFieldModuleId, options.reference.moduleId),\n hiddenInput(formFieldExportName, options.reference.exportName),\n hiddenInput(formCsrfFieldName, options.csrfToken),\n hiddenInput(formFieldNonce, options.actionNonce),\n hiddenInput(\n formFieldActionToken,\n formActionToken({\n csrfToken: options.csrfToken,\n exportName: options.reference.exportName,\n moduleId: options.reference.moduleId,\n nonce: options.actionNonce,\n }),\n ),\n ].join(\"\");\n\n return `<form${attrs} method=\"post\" action=\"/_mreact/actions\">${hidden}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction hiddenInput(name: string, value: string): string {\n return `<input type=\"hidden\" name=\"${escapeAttribute(name)}\" value=\"${escapeAttribute(value)}\" />`;\n}\n\nasync function collectImportedServerActions(options: {\n appDir: string;\n code: string;\n pageFile: string;\n}): Promise<{\n diagnostics: ServerActionInferenceDiagnostic[];\n references: Map<string, ActionReference>;\n}> {\n return await collectRuntimeInferredServerActions({\n appDir: options.appDir,\n code: options.code,\n fileSystem: {\n isUseServerFile,\n resolveSourceFile,\n },\n pageFile: options.pageFile,\n });\n}\n\nfunction isInferredServerActionReference(options: {\n allowedActions: readonly AppRouterAllowedServerAction[] | undefined;\n appDir: string;\n exportName: string;\n moduleId: string;\n}): boolean {\n if (\n options.allowedActions?.some(\n (allowed) =>\n allowed.inferred === true &&\n allowed.moduleId === options.moduleId &&\n allowed.exportName === options.exportName,\n ) === true\n ) {\n return true;\n }\n\n return inferredServerActionReferencesForApp(options.appDir).has(\n `${options.moduleId}#${options.exportName}`,\n );\n}\n\nfunction formActionToken(options: {\n csrfToken: string;\n exportName: string;\n moduleId: string;\n nonce: string;\n}): string {\n return createHmac(\"sha256\", actionTokenSecret)\n .update(options.moduleId)\n .update(\"\\0\")\n .update(options.exportName)\n .update(\"\\0\")\n .update(options.csrfToken)\n .update(\"\\0\")\n .update(options.nonce)\n .digest(\"base64url\");\n}\n\nfunction isValidFormActionToken(options: {\n csrfToken: string | undefined;\n exportName: string;\n moduleId: string;\n nonce: string;\n token: string | undefined;\n}): boolean {\n if (options.csrfToken === undefined || options.token === undefined) {\n return false;\n }\n\n const expected = Buffer.from(\n formActionToken({\n csrfToken: options.csrfToken,\n exportName: options.exportName,\n moduleId: options.moduleId,\n nonce: options.nonce,\n }),\n );\n const actual = Buffer.from(options.token);\n\n return actual.length === expected.length && timingSafeEqual(actual, expected);\n}\n\nfunction replaceInferredServerActionReferences(\n appDir: string,\n pageFile: string,\n references: ReadonlyMap<string, ActionReference>,\n): void {\n const nextReferences = new Map(\n Array.from(references.values())\n .filter((reference) => reference.inferred)\n .map((reference) => [`${reference.moduleId}#${reference.exportName}`, reference]),\n );\n let appReferencesByPage = inferredServerActionReferences.get(appDir);\n const previousReferences = appReferencesByPage?.get(pageFile) ?? new Map();\n const changed = !sameActionReferenceKeys(previousReferences, nextReferences);\n\n if (!changed) {\n return;\n }\n\n if (nextReferences.size === 0) {\n appReferencesByPage?.delete(pageFile);\n if (appReferencesByPage?.size === 0) {\n inferredServerActionReferences.delete(appDir);\n }\n } else {\n if (appReferencesByPage === undefined) {\n appReferencesByPage = new Map();\n inferredServerActionReferences.set(appDir, appReferencesByPage);\n }\n appReferencesByPage.set(pageFile, nextReferences);\n }\n\n clearServerActionRegistryCacheForApp(appDir);\n}\n\n// Cache the (expensive) collect+bundle+evaluate work keyed by appDir +\n// caller-supplied version. Production callers pass the build-time hash\n// (serverModuleCacheVersion) so the registry is reused for the lifetime\n// of one deployment. Dev callers omit the version; the entry is then\n// keyed on \"dev\" so the work happens once per process — restarts handle\n// invalidation. Concurrent callers share a single in-flight promise.\nconst serverActionRegistryCache = new Map<string, Promise<ServerActionRegistry>>();\n\nasync function loadServerActionRegistry(options: {\n appDir: string;\n cacheVersion?: string | undefined;\n importPolicy?: AppRouterImportPolicy | undefined;\n}): Promise<ServerActionRegistry> {\n const cacheKey = `${options.appDir}::${options.cacheVersion ?? \"dev\"}`;\n const cached = serverActionRegistryCache.get(cacheKey);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const pending = buildServerActionRegistry(options).catch((error) => {\n // Drop the failed promise so a retry can re-run the load.\n serverActionRegistryCache.delete(cacheKey);\n throw error;\n });\n serverActionRegistryCache.set(cacheKey, pending);\n return pending;\n}\n\nasync function buildServerActionRegistry(options: {\n appDir: string;\n importPolicy?: AppRouterImportPolicy | undefined;\n}): Promise<ServerActionRegistry> {\n const files = await collectFiles(options.appDir);\n const registry: ServerActionRegistry = {};\n const inferredReferences = inferredServerActionReferencesForApp(options.appDir);\n\n for (const file of files) {\n const moduleId = moduleIdForFile(options.appDir, file);\n const inferredExportNames = inferredExportNamesForModule(inferredReferences, moduleId);\n const useServerFile = await isUseServerFile(file);\n\n if (!useServerFile && inferredExportNames.size === 0) {\n continue;\n }\n\n const module = await importServerActionModule({\n appDir: options.appDir,\n file,\n importPolicy: options.importPolicy,\n });\n\n for (const [exportName, value] of Object.entries(module)) {\n if (typeof value === \"function\" && (useServerFile || inferredExportNames.has(exportName))) {\n registry[`${moduleId}#${exportName}`] = value as (...args: unknown[]) => unknown;\n }\n }\n }\n\n return registry;\n}\n\n// Exposed for tests that need a clean slate between cases (in-process state).\nexport function __clearServerActionRegistryCache(): void {\n serverActionRegistryCache.clear();\n inferredServerActionReferences.clear();\n}\n\nfunction clearServerActionRegistryCacheForApp(appDir: string): void {\n const prefix = `${appDir}::`;\n\n for (const key of serverActionRegistryCache.keys()) {\n if (key.startsWith(prefix)) {\n serverActionRegistryCache.delete(key);\n }\n }\n}\n\nfunction sameActionReferenceKeys(\n left: ReadonlyMap<string, ActionReference>,\n right: ReadonlyMap<string, ActionReference>,\n): boolean {\n if (left.size !== right.size) {\n return false;\n }\n\n for (const key of left.keys()) {\n if (!right.has(key)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction inferredServerActionReferencesForApp(appDir: string): Map<string, ActionReference> {\n const references = new Map<string, ActionReference>();\n const appReferencesByPage = inferredServerActionReferences.get(appDir);\n\n if (appReferencesByPage === undefined) {\n return references;\n }\n\n for (const pageReferences of appReferencesByPage.values()) {\n for (const [key, reference] of pageReferences) {\n references.set(key, reference);\n }\n }\n\n return references;\n}\n\nfunction inferredExportNamesForModule(\n references: ReadonlyMap<string, ActionReference>,\n moduleId: string,\n): Set<string> {\n const names = new Set<string>();\n\n for (const reference of references.values()) {\n if (reference.moduleId === moduleId) {\n names.add(reference.exportName);\n }\n }\n\n return names;\n}\n\nasync function importServerActionModule(options: {\n appDir: string;\n file: string;\n importPolicy?: AppRouterImportPolicy | undefined;\n}): Promise<Record<string, unknown>> {\n const bundled = await bundleRouterModule({\n code: `export * from ${JSON.stringify(options.file)};`,\n filename: options.file,\n platform: \"node\",\n plugins: [\n fileImportMetaUrlPlugin(),\n serverActionRuntimePlugin(),\n createAppRouterImportPolicyPlugin({\n appDir: options.appDir,\n importPolicy: options.importPolicy,\n label: \"Server action\",\n }),\n ],\n });\n const code = bundled.code;\n\n if (code === undefined) {\n throw new Error(`Failed to compile server action module ${options.file}.`);\n }\n\n return importAppRouterSourceModule<Record<string, unknown>>({\n code,\n label: `server-action:${options.file}`,\n });\n}\n\nfunction serverActionRuntimePlugin() {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n const cachePath = join(currentDir, currentDir.endsWith(`${sep}dist`) ? \"cache.js\" : \"cache.ts\");\n\n return {\n name: \"mreact-router-server-action-runtime\",\n setup(buildApi: RouterCompatBuildApi) {\n buildApi.onResolve({ filter: /^@reckona\\/mreact-router$/ }, () => ({\n namespace: \"mreact-router-server-api\",\n path: \"index\",\n }));\n buildApi.onLoad({ filter: /^index$/, namespace: \"mreact-router-server-api\" }, () => ({\n contents: `export { revalidatePath } from ${JSON.stringify(cachePath)};`,\n loader: \"ts\",\n resolveDir: dirname(cachePath),\n }));\n },\n };\n}\n\nasync function collectFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const path = join(directory, entry.name);\n\n if (entry.isDirectory()) {\n files.push(...(await collectFiles(path)));\n continue;\n }\n\n if (entry.isFile() && /\\.(?:mreact\\.tsx|tsx|ts)$/.test(entry.name)) {\n files.push(path);\n }\n }\n\n return files;\n}\n\nasync function resolveSourceFile(directory: string, source: string): Promise<string | undefined> {\n const base = join(directory, source);\n const tsEsmBase = /\\.[cm]?js$/.test(base) ? base.replace(/\\.[cm]?js$/, \"\") : undefined;\n const candidates = [\n base,\n ...(tsEsmBase === undefined\n ? []\n : [\n `${tsEsmBase}.ts`,\n `${tsEsmBase}.tsx`,\n `${tsEsmBase}.mreact.tsx`,\n join(tsEsmBase, \"index.ts\"),\n join(tsEsmBase, \"index.tsx\"),\n ]),\n `${base}.ts`,\n `${base}.tsx`,\n `${base}.mreact.tsx`,\n join(base, \"index.ts\"),\n join(base, \"index.tsx\"),\n ];\n\n for (const candidate of candidates) {\n try {\n await access(candidate);\n return candidate;\n } catch {\n // Try the next candidate.\n }\n }\n\n return undefined;\n}\n\nasync function isUseServerFile(file: string): Promise<boolean> {\n const code = await readFile(file, \"utf8\");\n\n return hasModuleDirective({ code, directive: \"use server\", filename: file });\n}\n\nfunction moduleIdForFile(appDir: string, file: string): string {\n return relative(appDir, file).split(sep).join(\"/\");\n}\n\nfunction validateServerActionRequestOrigin(request: Request): Response | undefined {\n if (!isProductionEnvironment()) {\n return undefined;\n }\n\n const expectedOrigin = new URL(request.url).origin;\n const origin = request.headers.get(\"origin\");\n\n if (origin !== null) {\n return origin === expectedOrigin\n ? undefined\n : jsonResponse({ ok: false, error: \"Origin not allowed.\" }, 403);\n }\n\n const referer = request.headers.get(\"referer\");\n\n if (referer === null) {\n return jsonResponse({ ok: false, error: \"Origin not allowed.\" }, 403);\n }\n\n try {\n return new URL(referer).origin === expectedOrigin\n ? undefined\n : jsonResponse({ ok: false, error: \"Origin not allowed.\" }, 403);\n } catch {\n return jsonResponse({ ok: false, error: \"Origin not allowed.\" }, 403);\n }\n}\n\nfunction validateFormNonce(\n formData: FormData,\n replayStore: ServerActionReplayStore,\n): Response | undefined {\n const nonce = stringFormValue(formData.get(formFieldNonce));\n\n if (nonce === undefined || nonce.length === 0) {\n return jsonResponse({ ok: false, error: \"Missing server action nonce.\" }, 400);\n }\n\n if (replayStore.has(nonce)) {\n return jsonResponse({ ok: false, error: \"Server action nonce was already used.\" }, 409);\n }\n\n replayStore.add(nonce);\n return undefined;\n}\n\nfunction cleanActionFormData(formData: FormData): FormData {\n const cleaned = new FormData();\n\n for (const [name, value] of formData.entries()) {\n if (\n name !== formFieldModuleId &&\n name !== formFieldExportName &&\n name !== formCsrfFieldName &&\n name !== formFieldNonce &&\n name !== formFieldActionToken\n ) {\n cleaned.append(name, value);\n }\n }\n\n return cleaned;\n}\n\nfunction stringFormValue(value: FormDataEntryValue | null): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction jsonResponse(payload: unknown, status: number): Response {\n return new Response(JSON.stringify(payload), {\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n status,\n });\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll('\"', \""\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n"]}
|
package/dist/adapters/static.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cp, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
2
|
+
import { dirname, join, resolve, sep } from "node:path";
|
|
3
3
|
export async function exportStaticApp(options) {
|
|
4
4
|
const manifest = JSON.parse(await readFile(join(options.outDir, "server", "manifest.json"), "utf8"));
|
|
5
5
|
const clientManifest = JSON.parse(await readFile(join(options.outDir, "client", "manifest.json"), "utf8"));
|
|
@@ -39,13 +39,19 @@ async function writePrerenderedRoute(exportDir, route, entry) {
|
|
|
39
39
|
if (entry.status < 200 || entry.status >= 300) {
|
|
40
40
|
throw new Error(`Cannot export route ${route} with status ${entry.status}.`);
|
|
41
41
|
}
|
|
42
|
-
const file =
|
|
42
|
+
const file = routeToHtmlFile(exportDir, route);
|
|
43
43
|
await mkdir(dirname(file), { recursive: true });
|
|
44
44
|
await writeFile(file, entry.html);
|
|
45
45
|
}
|
|
46
|
-
function routeToHtmlFile(route) {
|
|
46
|
+
function routeToHtmlFile(exportDir, route) {
|
|
47
47
|
const pathname = route.split("?")[0] ?? "/";
|
|
48
48
|
const normalized = pathname.startsWith("/") ? pathname.slice(1) : pathname;
|
|
49
|
-
|
|
49
|
+
const relativeFile = normalized === "" ? "index.html" : join(normalized, "index.html");
|
|
50
|
+
const root = resolve(exportDir);
|
|
51
|
+
const file = resolve(root, relativeFile);
|
|
52
|
+
if (file !== root && !file.startsWith(`${root}${sep}`)) {
|
|
53
|
+
throw new Error(`unsafe static export route: ${route}`);
|
|
54
|
+
}
|
|
55
|
+
return file;
|
|
50
56
|
}
|
|
51
57
|
//# sourceMappingURL=static.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/adapters/static.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/adapters/static.ts"],"names":[],"mappings":"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","sourcesContent":["import { cp, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport type { BuiltPrerenderedRoute, BuiltServerManifest } from \"../build.js\";\n\nexport interface StaticExportOptions {\n exportDir: string;\n outDir: string;\n paths?: readonly string[] | undefined;\n}\n\nexport interface StaticExportResult {\n routes: string[];\n}\n\nexport async function exportStaticApp(options: StaticExportOptions): Promise<StaticExportResult> {\n const manifest = JSON.parse(\n await readFile(join(options.outDir, \"server\", \"manifest.json\"), \"utf8\"),\n ) as BuiltServerManifest;\n const clientManifest = JSON.parse(\n await readFile(join(options.outDir, \"client\", \"manifest.json\"), \"utf8\"),\n ) as { publicAssets?: readonly string[] };\n const prerenderedRoutes = manifest.prerenderedRoutes ?? {};\n const routes = [...(options.paths ?? Object.keys(prerenderedRoutes))].sort();\n\n await rm(options.exportDir, { force: true, recursive: true });\n await mkdir(options.exportDir, { recursive: true });\n\n for (const route of routes) {\n const entry = prerenderedRoutes[route];\n\n if (entry === undefined) {\n throw new Error(`Cannot export non-prerendered route: ${route}`);\n }\n\n await writePrerenderedRoute(options.exportDir, route, entry);\n }\n\n await cp(join(options.outDir, \"client\"), join(options.exportDir, \"_mreact\", \"client\"), {\n recursive: true,\n });\n await copyPublicAssetsToExportRoot(\n join(options.outDir, \"client\"),\n options.exportDir,\n clientManifest.publicAssets ?? [],\n );\n\n return { routes };\n}\n\nasync function copyPublicAssetsToExportRoot(\n clientDir: string,\n exportDir: string,\n publicAssets: readonly string[],\n): Promise<void> {\n for (const asset of publicAssets) {\n if (\n !asset.startsWith(\"/\") ||\n asset.startsWith(\"//\") ||\n asset.includes(\"..\") ||\n asset === \"/_mreact\" ||\n asset.startsWith(\"/_mreact/\")\n ) {\n continue;\n }\n\n const relativeAsset = asset.slice(1);\n const destination = join(exportDir, relativeAsset);\n await mkdir(dirname(destination), { recursive: true });\n await cp(join(clientDir, relativeAsset), destination, { recursive: true });\n }\n}\n\nasync function writePrerenderedRoute(\n exportDir: string,\n route: string,\n entry: BuiltPrerenderedRoute,\n): Promise<void> {\n if (entry.status < 200 || entry.status >= 300) {\n throw new Error(`Cannot export route ${route} with status ${entry.status}.`);\n }\n\n const file = routeToHtmlFile(exportDir, route);\n await mkdir(dirname(file), { recursive: true });\n await writeFile(file, entry.html);\n}\n\nfunction routeToHtmlFile(exportDir: string, route: string): string {\n const pathname = route.split(\"?\")[0] ?? \"/\";\n const normalized = pathname.startsWith(\"/\") ? pathname.slice(1) : pathname;\n const relativeFile = normalized === \"\" ? \"index.html\" : join(normalized, \"index.html\");\n const root = resolve(exportDir);\n const file = resolve(root, relativeFile);\n\n if (file !== root && !file.startsWith(`${root}${sep}`)) {\n throw new Error(`unsafe static export route: ${route}`);\n }\n\n return file;\n}\n"]}
|
package/dist/build.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
|
package/dist/build.js
CHANGED
|
@@ -833,6 +833,7 @@ async function collectBuildServerActionManifest(options) {
|
|
|
833
833
|
const routeSourceFiles = new Set(options.routes
|
|
834
834
|
.filter((route) => route.kind === "page")
|
|
835
835
|
.map((route) => relative(options.projectRoot, route.file).split(sep).join("/")));
|
|
836
|
+
const inferredRouteReferences = [];
|
|
836
837
|
for (const [file, code] of Object.entries(options.files)) {
|
|
837
838
|
if (!isAppRelativeFile(file, relativeRoutesDir) || !isSourceModuleFile(file)) {
|
|
838
839
|
continue;
|
|
@@ -844,25 +845,31 @@ async function collectBuildServerActionManifest(options) {
|
|
|
844
845
|
}
|
|
845
846
|
}
|
|
846
847
|
if (routeSourceFiles.has(file)) {
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
848
|
+
inferredRouteReferences.push({ code, file });
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
const inferredRouteResults = await mapWithBuildConcurrency(inferredRouteReferences, async ({ code, file }) => ({
|
|
852
|
+
file,
|
|
853
|
+
inference: await collectBuildInferredServerActionReferences({
|
|
854
|
+
file,
|
|
855
|
+
files: options.files,
|
|
856
|
+
relativeRoutesDir,
|
|
857
|
+
source: code,
|
|
858
|
+
}),
|
|
859
|
+
}));
|
|
860
|
+
for (const { file, inference } of inferredRouteResults) {
|
|
861
|
+
for (const diagnostic of inference.diagnostics) {
|
|
862
|
+
console.warn(formatServerActionInferenceDiagnostic(diagnostic));
|
|
863
|
+
}
|
|
864
|
+
routeReferences.set(file, inference.references);
|
|
865
|
+
for (const reference of inference.references) {
|
|
866
|
+
const key = `${reference.moduleId}#${reference.exportName}`;
|
|
867
|
+
if (!entries.has(key)) {
|
|
868
|
+
entries.set(key, {
|
|
869
|
+
exportName: reference.exportName,
|
|
870
|
+
inferred: reference.inferred,
|
|
871
|
+
moduleId: reference.moduleId,
|
|
872
|
+
});
|
|
866
873
|
}
|
|
867
874
|
}
|
|
868
875
|
}
|
|
@@ -3068,8 +3075,8 @@ function cloudflareWorkspaceRuntimePlugin() {
|
|
|
3068
3075
|
});
|
|
3069
3076
|
buildApi.onLoad({ filter: /^native-escape$/, namespace: "mreact-cloudflare-native-escape" }, () => ({
|
|
3070
3077
|
contents: `function escapeHtml(value) {
|
|
3071
|
-
return String(value ?? "").replace(/[&<>"
|
|
3072
|
-
char === "&" ? "&" : char === "<" ? "<" : char === ">" ? ">" :
|
|
3078
|
+
return String(value ?? "").replace(/[&<>"]/g, (char) =>
|
|
3079
|
+
char === "&" ? "&" : char === "<" ? "<" : char === ">" ? ">" : """
|
|
3073
3080
|
);
|
|
3074
3081
|
}
|
|
3075
3082
|
export function escapeHtmlBatch(values) {
|