@nifrajs/web 5.0.0 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/CHANGELOG.md +2970 -0
  2. package/README.md +8 -0
  3. package/dist/build-plan.d.ts +7 -0
  4. package/dist/build-plan.d.ts.map +1 -1
  5. package/dist/build-plan.js +19 -0
  6. package/dist/build-plan.js.map +1 -1
  7. package/dist/build-vite.d.ts +1 -0
  8. package/dist/build-vite.d.ts.map +1 -1
  9. package/dist/build-vite.js +51 -3
  10. package/dist/build-vite.js.map +1 -1
  11. package/dist/build.d.ts +12 -1
  12. package/dist/build.d.ts.map +1 -1
  13. package/dist/build.js +43 -6
  14. package/dist/build.js.map +1 -1
  15. package/dist/client.d.ts +7 -6
  16. package/dist/client.d.ts.map +1 -1
  17. package/dist/client.js +39 -22
  18. package/dist/client.js.map +1 -1
  19. package/dist/dev-port.d.ts +3 -2
  20. package/dist/dev-port.d.ts.map +1 -1
  21. package/dist/dev-port.js +2 -6
  22. package/dist/dev-port.js.map +1 -1
  23. package/dist/index.d.ts +4 -3
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/internal/codegen.d.ts +6 -0
  28. package/dist/internal/codegen.d.ts.map +1 -1
  29. package/dist/internal/codegen.js +23 -5
  30. package/dist/internal/codegen.js.map +1 -1
  31. package/dist/internal/copy-split.d.ts +27 -0
  32. package/dist/internal/copy-split.d.ts.map +1 -0
  33. package/dist/internal/copy-split.js +173 -0
  34. package/dist/internal/copy-split.js.map +1 -0
  35. package/dist/internal/package-entries.d.ts +34 -0
  36. package/dist/internal/package-entries.d.ts.map +1 -0
  37. package/dist/internal/package-entries.js +324 -0
  38. package/dist/internal/package-entries.js.map +1 -0
  39. package/dist/internal/page-execution.d.ts +19 -1
  40. package/dist/internal/page-execution.d.ts.map +1 -1
  41. package/dist/internal/page-execution.js +123 -14
  42. package/dist/internal/page-execution.js.map +1 -1
  43. package/dist/internal/parity.d.ts.map +1 -1
  44. package/dist/internal/parity.js +15 -2
  45. package/dist/internal/parity.js.map +1 -1
  46. package/dist/internal/private-env.d.ts +8 -0
  47. package/dist/internal/private-env.d.ts.map +1 -1
  48. package/dist/internal/private-env.js +25 -10
  49. package/dist/internal/private-env.js.map +1 -1
  50. package/dist/internal/render-document.d.ts +15 -46
  51. package/dist/internal/render-document.d.ts.map +1 -1
  52. package/dist/internal/render-document.js +59 -62
  53. package/dist/internal/render-document.js.map +1 -1
  54. package/dist/internal/route-path.d.ts +6 -0
  55. package/dist/internal/route-path.d.ts.map +1 -1
  56. package/dist/internal/route-path.js +11 -0
  57. package/dist/internal/route-path.js.map +1 -1
  58. package/dist/internal/secret-scan.d.ts.map +1 -1
  59. package/dist/internal/secret-scan.js +103 -1
  60. package/dist/internal/secret-scan.js.map +1 -1
  61. package/dist/internal/typescript-api.d.ts +4 -0
  62. package/dist/internal/typescript-api.d.ts.map +1 -0
  63. package/dist/internal/typescript-api.js +8 -0
  64. package/dist/internal/typescript-api.js.map +1 -0
  65. package/dist/internal/vite-plugin-compat.d.ts +28 -0
  66. package/dist/internal/vite-plugin-compat.d.ts.map +1 -0
  67. package/dist/internal/vite-plugin-compat.js +82 -0
  68. package/dist/internal/vite-plugin-compat.js.map +1 -0
  69. package/dist/internal/web-app.d.ts +38 -2
  70. package/dist/internal/web-app.d.ts.map +1 -1
  71. package/dist/internal/web-app.js +30 -3
  72. package/dist/internal/web-app.js.map +1 -1
  73. package/dist/internal/without-query.d.ts +4 -0
  74. package/dist/internal/without-query.d.ts.map +1 -0
  75. package/dist/internal/without-query.js +9 -0
  76. package/dist/internal/without-query.js.map +1 -0
  77. package/dist/internal/zone-graph.d.ts.map +1 -1
  78. package/dist/internal/zone-graph.js +17 -6
  79. package/dist/internal/zone-graph.js.map +1 -1
  80. package/dist/isr.d.ts +1 -1
  81. package/dist/isr.d.ts.map +1 -1
  82. package/dist/isr.js +15 -2
  83. package/dist/isr.js.map +1 -1
  84. package/dist/manifest.d.ts +9 -0
  85. package/dist/manifest.d.ts.map +1 -1
  86. package/dist/manifest.js +1 -0
  87. package/dist/manifest.js.map +1 -1
  88. package/dist/plugins/import-glob.d.ts +20 -0
  89. package/dist/plugins/import-glob.d.ts.map +1 -0
  90. package/dist/plugins/import-glob.js +401 -0
  91. package/dist/plugins/import-glob.js.map +1 -0
  92. package/dist/plugins/kit.d.ts +11 -0
  93. package/dist/plugins/kit.d.ts.map +1 -1
  94. package/dist/plugins/kit.js +32 -0
  95. package/dist/plugins/kit.js.map +1 -1
  96. package/dist/plugins/stylex.d.ts.map +1 -1
  97. package/dist/plugins/stylex.js +2 -2
  98. package/dist/plugins/stylex.js.map +1 -1
  99. package/dist/plugins/vite-leak-guard.d.ts +6 -0
  100. package/dist/plugins/vite-leak-guard.d.ts.map +1 -1
  101. package/dist/plugins/vite-leak-guard.js +80 -7
  102. package/dist/plugins/vite-leak-guard.js.map +1 -1
  103. package/dist/plugins/vite-zone-guard.d.ts.map +1 -1
  104. package/dist/plugins/vite-zone-guard.js +17 -21
  105. package/dist/plugins/vite-zone-guard.js.map +1 -1
  106. package/dist/plugins/zone-guard.d.ts.map +1 -1
  107. package/dist/plugins/zone-guard.js +44 -3
  108. package/dist/plugins/zone-guard.js.map +1 -1
  109. package/dist/prerender.d.ts +5 -1
  110. package/dist/prerender.d.ts.map +1 -1
  111. package/dist/prerender.js +41 -19
  112. package/dist/prerender.js.map +1 -1
  113. package/dist/render-seam.d.ts +60 -2
  114. package/dist/render-seam.d.ts.map +1 -1
  115. package/dist/render-seam.js +33 -0
  116. package/dist/render-seam.js.map +1 -1
  117. package/dist/router.d.ts +3 -2
  118. package/dist/router.d.ts.map +1 -1
  119. package/dist/router.js +13 -9
  120. package/dist/router.js.map +1 -1
  121. package/dist/seo.d.ts +49 -0
  122. package/dist/seo.d.ts.map +1 -0
  123. package/dist/seo.js +48 -0
  124. package/dist/seo.js.map +1 -0
  125. package/dist/server-components/typescript.d.ts.map +1 -1
  126. package/dist/server-components/typescript.js +2 -7
  127. package/dist/server-components/typescript.js.map +1 -1
  128. package/dist/vite.d.ts +1 -28
  129. package/dist/vite.d.ts.map +1 -1
  130. package/dist/vite.js +3 -69
  131. package/dist/vite.js.map +1 -1
  132. package/dist/zones.d.ts +30 -8
  133. package/dist/zones.d.ts.map +1 -1
  134. package/dist/zones.js +185 -46
  135. package/dist/zones.js.map +1 -1
  136. package/package.json +10 -4
  137. package/src/build-plan.ts +21 -0
  138. package/src/build-vite.ts +60 -3
  139. package/src/build.ts +57 -4
  140. package/src/client.ts +42 -22
  141. package/src/dev-port.ts +4 -10
  142. package/src/index.ts +8 -4
  143. package/src/internal/codegen.ts +32 -3
  144. package/src/internal/copy-split.ts +220 -0
  145. package/src/internal/package-entries.ts +331 -0
  146. package/src/internal/page-execution.ts +150 -13
  147. package/src/internal/parity.ts +15 -2
  148. package/src/internal/private-env.ts +27 -13
  149. package/src/internal/render-document.ts +100 -81
  150. package/src/internal/route-path.ts +16 -0
  151. package/src/internal/secret-scan.ts +101 -1
  152. package/src/internal/typescript-api.ts +11 -0
  153. package/src/internal/vite-plugin-compat.ts +81 -0
  154. package/src/internal/web-app.ts +71 -6
  155. package/src/internal/without-query.ts +8 -0
  156. package/src/internal/zone-graph.ts +19 -6
  157. package/src/isr.ts +13 -2
  158. package/src/manifest.ts +10 -0
  159. package/src/plugins/import-glob.ts +392 -0
  160. package/src/plugins/kit.ts +36 -0
  161. package/src/plugins/stylex.ts +2 -1
  162. package/src/plugins/vite-leak-guard.ts +99 -7
  163. package/src/plugins/vite-zone-guard.ts +21 -19
  164. package/src/plugins/zone-guard.ts +41 -2
  165. package/src/prerender.ts +39 -18
  166. package/src/render-seam.ts +88 -2
  167. package/src/router.ts +16 -11
  168. package/src/seo.ts +68 -0
  169. package/src/server-components/typescript.ts +2 -10
  170. package/src/vite.ts +3 -81
  171. package/src/zones.ts +237 -52
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-entries.js","sourceRoot":"","sources":["../../src/internal/package-entries.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import type { CspPolicy } from "../csp.js";
4
4
  import { type CssLoadingMode } from "../css-contract.js";
5
5
  import type { Manifest, RouteEntry } from "../manifest.js";
6
6
  import type { NonceResolver } from "../nonce.js";
7
- import type { RenderAdapter } from "../render-seam.js";
7
+ import type { PageLocales, RenderAdapter } from "../render-seam.js";
8
8
  import { type RenderedPage } from "./render-document.js";
9
9
  import { type CoreResponseControls } from "./response-controls.js";
10
10
  export type { NonceResolver } from "../nonce.js";
@@ -20,6 +20,20 @@ export interface PageRouteContext<Env = unknown> {
20
20
  readonly clientIp?: string | undefined;
21
21
  readonly waitUntil?: (promise: Promise<unknown>) => void;
22
22
  }
23
+ /** The app's locale routing, as page execution reads it. */
24
+ export interface PageI18n {
25
+ readonly locales: PageLocales;
26
+ /** The served locale key a `pathname + search` is in. */
27
+ localeOf(path: string): string;
28
+ /** The answer for a `[lang]` / `[[lang]]` segment's value (`undefined` when an optional one is
29
+ * absent), as `@nifrajs/i18n/routing`'s `matchSegment` gives it. */
30
+ matchSegment(value: string | undefined, pathname: string): {
31
+ readonly kind: "ok" | "not-found";
32
+ } | {
33
+ readonly kind: "redirect";
34
+ readonly location: string;
35
+ };
36
+ }
23
37
  export interface PageExecutionOptions<Env = unknown> {
24
38
  readonly serverComponents?: import("../server-components/types.js").ServerComponentRuntime;
25
39
  readonly rerenderOwnerGET?: (request: Request, context: PageRouteContext<Env>) => Promise<Response>;
@@ -36,6 +50,10 @@ export interface PageExecutionOptions<Env = unknown> {
36
50
  readonly prerenderedPaths?: readonly string[];
37
51
  /** Where pages fetch {@link prerenderedPaths} from when the list is too large to inline. */
38
52
  readonly prerenderedListUrl?: string;
53
+ /** Locale key -> copy chunk URL, from a build that split copy tables by locale. */
54
+ readonly copyChunks?: Readonly<Record<string, string>>;
55
+ /** The app's locale routing: each document's locale, and the check on a `[lang]` segment. */
56
+ readonly i18n?: PageI18n;
39
57
  readonly staticFallbacks?: Readonly<Record<string, "ssr" | "404">>;
40
58
  readonly staticBoundaryCache?: StaticBoundaryCache;
41
59
  /** Per-request CSP nonce for framework-owned executable document scripts. */
@@ -1 +1 @@
1
- {"version":3,"file":"page-execution.d.ts","sourceRoot":"","sources":["../../src/internal/page-execution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"page-execution.d.ts","sourceRoot":"","sources":["../../src/internal/page-execution.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { NIFRA_BACKEND_BIND_PLATFORM, NIFRA_PLATFORM_CLIENT_IP_DERIVED, } from "@nifrajs/core/mount";
2
- import { status as statusResult } from "@nifrajs/core/server";
2
+ import { isSameOriginForm, status as statusResult, } from "@nifrajs/core/server";
3
3
  import { boundaryDescriptors, resolveStaticBoundaries, startDynamicBoundaries, } from "../boundary.js";
4
4
  import { DEFAULT_CSS_LOADING, normalizeCssLoading } from "../css-contract.js";
5
5
  import { defer, ndjsonStream, prepareDeferred } from "../deferred.js";
@@ -8,7 +8,7 @@ import { routeTags } from "../isr.js";
8
8
  import { createMatcher, DATA_HEADER, NAV_FROM_HEADER, REDIRECT_HEADER, RETAIN_HEADER, REVALIDATE_HEADER, STATUS_HEADER, } from "../router.js";
9
9
  import { searchOf, searchOfChain } from "../search.js";
10
10
  import { mergeHeads, resolveChainMeta } from "./head-merge.js";
11
- import { EMPTY_RETAIN, isControlFlow, isResponseResult, isStatusSignal, layoutErrorId, renderPageResult, STATUS_SIGNAL, STATUS_TEXT, scopeParams, tagLayoutError, withDuplicateInstanceHint, } from "./render-document.js";
11
+ import { EMPTY_RETAIN, isControlFlow, isResponseResult, isStatusSignal, layoutErrorId, notFound, redirect, renderPageResult, STATUS_SIGNAL, STATUS_TEXT, scopeParams, tagLayoutError, withDuplicateInstanceHint, } from "./render-document.js";
12
12
  import { urlPartsFor } from "./request-url.js";
13
13
  import { ACTION_SCOPE, DATA_RESPONSE_HEADERS, MIDDLEWARE_SCOPE, PAGE_SCOPE, PageResponseControls, PRIVATE_NO_STORE, PRIVATE_PAGE_HEADERS, privateOutcome, varyOnDataHeader, } from "./response-controls.js";
14
14
  /** The page slot of an `ssr = false` route with no `HydrateFallback`: a component that renders nothing. */
@@ -92,10 +92,15 @@ function appTarget(location, requestUrl) {
92
92
  catch {
93
93
  return location; // the browser fails on it the same way when it loads it
94
94
  }
95
- return target.origin === new URL(requestUrl).origin
96
- ? target.pathname + target.search + target.hash
97
- : location;
95
+ if (target.origin !== new URL(requestUrl).origin)
96
+ return location;
97
+ // A path starting `//` (from `/.//host`) is a protocol-relative URL to whoever resolves it next.
98
+ return target.pathname.startsWith("//")
99
+ ? target.href
100
+ : target.pathname + target.search + target.hash;
98
101
  }
102
+ // The route directories whose first segment names the locale.
103
+ const LOCALE_SEGMENTS = new Set(["[lang]", "[[lang]]"]);
99
104
  /**
100
105
  * Own the page request program behind one private seam.
101
106
  *
@@ -121,6 +126,26 @@ export function createPageRequestExecutor(options) {
121
126
  const prerenderedHandover = options.prerenderedListUrl === undefined
122
127
  ? { prerenderedPaths: options.prerenderedPaths ?? [] }
123
128
  : { prerenderedListUrl: options.prerenderedListUrl };
129
+ const copyOption = options.copyChunks === undefined ? {} : { copyChunks: options.copyChunks };
130
+ const { i18n } = options;
131
+ const pageLocales = new Map(i18n?.locales.locales.map((locale) => [locale.key, locale]));
132
+ /** The request's locale for a document, with the served locales the client names locales from. */
133
+ const localeOption = (req) => {
134
+ if (i18n === undefined)
135
+ return {};
136
+ const locale = pageLocales.get(i18n.localeOf(pathOf(req)));
137
+ return locale === undefined ? { locales: i18n.locales } : { locale, locales: i18n.locales };
138
+ };
139
+ /** Whether a route sits under a `[lang]` or `[[lang]]` directory, which the locale routing checks. */
140
+ const localeGuarded = (route) => {
141
+ if (i18n === undefined)
142
+ return false;
143
+ for (const segment of route.id.split("/")) {
144
+ if (!(segment.startsWith("(") && segment.endsWith(")")))
145
+ return LOCALE_SEGMENTS.has(segment);
146
+ }
147
+ return false;
148
+ };
124
149
  const matchManifestRoute = createMatcher(manifest.routes.map((route) => ({ routeId: route.id, pattern: route.pattern })));
125
150
  const routeById = new Map(manifest.routes.map((route) => [route.id, route]));
126
151
  // A nested `_404` answers an unmatched URL from inside the catch-all, never as a route of its own:
@@ -213,6 +238,23 @@ export function createPageRequestExecutor(options) {
213
238
  throw tagLayoutError(value, route.layoutIds[index]);
214
239
  return value;
215
240
  };
241
+ // Development only. A layout loader that refuses access reads as a guard, and is not one: a client
242
+ // navigation can skip it and an action below it runs without it.
243
+ const warnsUngatedRefusal = typeof process !== "undefined" && process.env?.NODE_ENV === "development";
244
+ const warnedUngated = new Set();
245
+ const warnUngatedRefusal = (layoutId, outcome) => {
246
+ if (warnedUngated.has(layoutId))
247
+ return;
248
+ // notFound() and gone() say the record is missing, which a layout may decide without guarding.
249
+ const refusesAccess = isStatusSignal(outcome)
250
+ ? outcome.status === 401 || outcome.status === 403
251
+ : isControlFlow(outcome);
252
+ if (!refusesAccess)
253
+ return;
254
+ warnedUngated.add(layoutId);
255
+ const file = manifest.layouts?.[layoutId]?.file ?? layoutId;
256
+ console.warn(`[nifra/web] the loader in "${file}" refused a request, but that layout is not a gate. A client navigation that keeps the layout on screen can skip its loader, and an action below it runs without it, so it does not protect the pages under it. Export \`gate = true\` from that file, or move the check into middleware. (Shown in development only.)`);
257
+ };
216
258
  /**
217
259
  * Run layout loaders, awaiting gates before starting the page loader and retaining only safe data.
218
260
  * `gated` carries gates that already ran for this request, so none runs twice.
@@ -263,18 +305,31 @@ export function createPageRequestExecutor(options) {
263
305
  // assimilation: property-presence and prototype probes are unsafe for proxies.
264
306
  if (value !== null && (typeof value === "object" || typeof value === "function")) {
265
307
  pending.push((async () => {
308
+ let settled;
266
309
  try {
267
- results[index] = await value;
310
+ settled = await value;
268
311
  }
269
312
  catch (err) {
313
+ if (warnsUngatedRefusal)
314
+ warnUngatedRefusal(layoutId, err);
270
315
  throw tagLayoutError(err, layoutId);
271
316
  }
317
+ // A returned redirect or Response refuses exactly as a thrown one: kept as layout data,
318
+ // it would ship beside the page loader's data.
319
+ if (isControlFlow(settled)) {
320
+ if (warnsUngatedRefusal)
321
+ warnUngatedRefusal(layoutId, settled);
322
+ throw tagLayoutError(settled, layoutId);
323
+ }
324
+ results[index] = settled;
272
325
  })());
273
326
  }
274
327
  else
275
328
  results[index] = value;
276
329
  }
277
330
  catch (err) {
331
+ if (warnsUngatedRefusal)
332
+ warnUngatedRefusal(layoutId, err);
278
333
  // Preserve a synchronous throw as a pending layout failure, just like the async lane.
279
334
  pending.push(Promise.reject(tagLayoutError(err, layoutId)));
280
335
  }
@@ -304,6 +359,22 @@ export function createPageRequestExecutor(options) {
304
359
  };
305
360
  /** Outermost first; a failure carries its directory so the nearest `_error` above it renders. */
306
361
  const runMiddleware = async (route, ctx, controls) => {
362
+ if (i18n !== undefined && localeGuarded(route)) {
363
+ // Before any app middleware, as a root `_middleware` would run: an unserved locale, or a page
364
+ // missing from it, never reaches the app's code.
365
+ const match = i18n.matchSegment(ctx.params.lang, pathOf(ctx.request));
366
+ if (match.kind === "redirect") {
367
+ throw tagLayoutError(redirect(match.location, { status: 308 }), "_layout");
368
+ }
369
+ if (match.kind === "not-found") {
370
+ try {
371
+ notFound();
372
+ }
373
+ catch (signal) {
374
+ throw tagLayoutError(signal, "_layout");
375
+ }
376
+ }
377
+ }
307
378
  const ids = route.middlewareIds ?? [];
308
379
  for (let i = 0; i < ids.length; i++) {
309
380
  const id = ids[i];
@@ -484,6 +555,7 @@ export function createPageRequestExecutor(options) {
484
555
  chain: components,
485
556
  data,
486
557
  ...(wrapped === undefined ? {} : { head: wrapped.head }),
558
+ ...localeOption(req),
487
559
  clientEntry,
488
560
  routeId: errorId,
489
561
  status: 500,
@@ -620,6 +692,8 @@ export function createPageRequestExecutor(options) {
620
692
  // The build keys stylesheets by route, so a page inside the root layout links the whole-app one.
621
693
  ...(chain === undefined ? stylesOf(routeId) : stylesFrom(options.styles)),
622
694
  ...prerenderedHandover,
695
+ ...copyOption,
696
+ ...localeOption(req),
623
697
  ...titleOption,
624
698
  };
625
699
  if (chain === undefined)
@@ -736,6 +810,8 @@ export function createPageRequestExecutor(options) {
736
810
  ...preloadOf(route.id),
737
811
  ...stylesOf(route.id),
738
812
  ...prerenderedHandover,
813
+ ...copyOption,
814
+ ...localeOption(req),
739
815
  ...(responseHeaders === undefined ? {} : { headers: responseHeaders }),
740
816
  // A response that sets a cookie is one visitor's: it never advertises ISR freshness.
741
817
  ...(mod.revalidate !== undefined && !personalized && options.cacheChannel?.enabled === true
@@ -830,6 +906,7 @@ export function createPageRequestExecutor(options) {
830
906
  matchChain: matchChainOf(page.layoutIds, layoutModules, id, mod),
831
907
  status: 404,
832
908
  hydrate: false,
909
+ ...localeOption(req),
833
910
  ...(layoutData !== undefined ? { layoutData } : {}),
834
911
  ...stylesOf(id),
835
912
  ...(headers === undefined ? {} : { headers }),
@@ -897,10 +974,11 @@ export function createPageRequestExecutor(options) {
897
974
  return {
898
975
  get: (route) => {
899
976
  const is404Fallback = options.staticFallbacks?.[route.pattern] === "404";
900
- let assemblySlot;
977
+ // One shell per locale: `<html lang>` is in it, and one route serves every locale.
978
+ let assemblySlots = new Map();
901
979
  let assemblySlotMod;
902
980
  let assemblySlotLayouts;
903
- const assemblyCacheFor = (mod, layouts) => {
981
+ const assemblyCacheFor = (mod, layouts, req) => {
904
982
  if (typeof mod.meta === "function")
905
983
  return undefined;
906
984
  for (const layout of layouts)
@@ -910,11 +988,17 @@ export function createPageRequestExecutor(options) {
910
988
  assemblySlotLayouts.length === layouts.length &&
911
989
  assemblySlotLayouts.every((layout, index) => layout === layouts[index]);
912
990
  if (assemblySlotMod !== mod || !layoutsUnchanged) {
913
- assemblySlot = {};
991
+ assemblySlots = new Map();
914
992
  assemblySlotMod = mod;
915
993
  assemblySlotLayouts = layouts;
916
994
  }
917
- return assemblySlot;
995
+ const key = i18n === undefined ? "" : i18n.localeOf(pathOf(req));
996
+ let slot = assemblySlots.get(key);
997
+ if (slot === undefined) {
998
+ slot = {};
999
+ assemblySlots.set(key, slot);
1000
+ }
1001
+ return slot;
918
1002
  };
919
1003
  return withResponseControls(async (c, controls) => {
920
1004
  const componentRuntime = options.serverComponents;
@@ -956,8 +1040,9 @@ export function createPageRequestExecutor(options) {
956
1040
  search: loaderSearch(mod.searchSchema, c.req),
957
1041
  set: controls.scope(PAGE_SCOPE),
958
1042
  };
959
- if (route.middlewareIds !== undefined)
1043
+ if (route.middlewareIds !== undefined || localeGuarded(route)) {
960
1044
  await runMiddleware(route, ctx, controls);
1045
+ }
961
1046
  run = await runLayoutChain(route, ctx, controls, componentOwner ? undefined : retainContextOf(c.req));
962
1047
  layoutModules = run.modules;
963
1048
  layoutRetained = run.retained;
@@ -1049,7 +1134,7 @@ export function createPageRequestExecutor(options) {
1049
1134
  if (nested !== undefined)
1050
1135
  return nested;
1051
1136
  }
1052
- return handleDataOrDocument(c.req, c.env, route, c.params, mod, data, layoutData, layoutModules ?? (await loadLayoutModules(route)), layoutRetained, boundaryStates, layoutModules === undefined ? undefined : assemblyCacheFor(mod, layoutModules), responseHeaders, controls.personalized, componentState);
1137
+ return handleDataOrDocument(c.req, c.env, route, c.params, mod, data, layoutData, layoutModules ?? (await loadLayoutModules(route)), layoutRetained, boundaryStates, layoutModules === undefined ? undefined : assemblyCacheFor(mod, layoutModules, c.req), responseHeaders, controls.personalized, componentState);
1053
1138
  });
1054
1139
  },
1055
1140
  post: (route) => withResponseControls(async (c, controls) => {
@@ -1063,6 +1148,28 @@ export function createPageRequestExecutor(options) {
1063
1148
  headers: { allow: "GET", "content-type": "text/plain; charset=utf-8" },
1064
1149
  });
1065
1150
  }
1151
+ const isDataRequest = c.req.headers.get(DATA_HEADER) !== null;
1152
+ // Before anything runs: a form posts cross-site without a preflight and carries the visitor's
1153
+ // cookies, so an action is a CSRF target unless its route names the origins it accepts.
1154
+ const origin = c.req.headers.get("origin");
1155
+ const allowedOrigins = mod.allowedOrigins;
1156
+ const allowed = allowedOrigins === undefined
1157
+ ? origin === null ||
1158
+ isSameOriginForm(origin, c.req.headers.get("sec-fetch-site"), c.req)
1159
+ : typeof allowedOrigins === "function"
1160
+ ? allowedOrigins(origin) === true
1161
+ : origin !== null && allowedOrigins.includes(origin);
1162
+ if (!allowed) {
1163
+ return isDataRequest
1164
+ ? Response.json({ ok: false, error: "forbidden_origin" }, { status: 403, headers: { "cache-control": PRIVATE_NO_STORE } })
1165
+ : new Response("Forbidden", {
1166
+ status: 403,
1167
+ headers: {
1168
+ "content-type": "text/plain; charset=utf-8",
1169
+ "cache-control": PRIVATE_NO_STORE,
1170
+ },
1171
+ });
1172
+ }
1066
1173
  const requestApi = apiFor(c);
1067
1174
  const actionContext = {
1068
1175
  params: c.params,
@@ -1074,12 +1181,12 @@ export function createPageRequestExecutor(options) {
1074
1181
  search: loaderSearch(mod.searchSchema, c.req),
1075
1182
  set: controls.scope(ACTION_SCOPE),
1076
1183
  };
1077
- const isDataRequest = c.req.headers.get(DATA_HEADER) !== null;
1078
1184
  let gated;
1079
1185
  let result;
1080
1186
  try {
1081
- if (route.middlewareIds !== undefined)
1187
+ if (route.middlewareIds !== undefined || localeGuarded(route)) {
1082
1188
  await runMiddleware(route, actionContext, controls);
1189
+ }
1083
1190
  gated = await runLayoutGates(route, actionContext, controls);
1084
1191
  result = await mod.action(actionContext);
1085
1192
  }
@@ -1239,6 +1346,8 @@ export function createPageRequestExecutor(options) {
1239
1346
  ...preloadOf(route.id),
1240
1347
  ...stylesOf(route.id),
1241
1348
  ...prerenderedHandover,
1349
+ ...copyOption,
1350
+ ...localeOption(c.req),
1242
1351
  ...(responseHeaders === undefined ? {} : { headers: responseHeaders }),
1243
1352
  ...(nonce === undefined ? {} : { nonce }),
1244
1353
  ...cspOption,