@reckona/mreact-router 0.0.159 → 0.0.161

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 (183) hide show
  1. package/dist/actions.d.ts +6 -0
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js.map +1 -1
  4. package/dist/adapters/aws-lambda.d.ts +29 -0
  5. package/dist/adapters/aws-lambda.d.ts.map +1 -1
  6. package/dist/adapters/aws-lambda.js.map +1 -1
  7. package/dist/adapters/cloudflare.d.ts +78 -0
  8. package/dist/adapters/cloudflare.d.ts.map +1 -1
  9. package/dist/adapters/cloudflare.js.map +1 -1
  10. package/dist/adapters/edge.d.ts +6 -0
  11. package/dist/adapters/edge.d.ts.map +1 -1
  12. package/dist/adapters/edge.js.map +1 -1
  13. package/dist/adapters/node.d.ts +7 -0
  14. package/dist/adapters/node.d.ts.map +1 -1
  15. package/dist/adapters/node.js.map +1 -1
  16. package/dist/adapters/static.d.ts +6 -0
  17. package/dist/adapters/static.d.ts.map +1 -1
  18. package/dist/adapters/static.js.map +1 -1
  19. package/dist/app-router-globals.d.ts +6 -0
  20. package/dist/app-router-globals.d.ts.map +1 -1
  21. package/dist/app-router-globals.js.map +1 -1
  22. package/dist/assets.d.ts +18 -0
  23. package/dist/assets.d.ts.map +1 -1
  24. package/dist/assets.js +6 -0
  25. package/dist/assets.js.map +1 -1
  26. package/dist/build.d.ts +30 -0
  27. package/dist/build.d.ts.map +1 -1
  28. package/dist/build.js +4 -0
  29. package/dist/build.js.map +1 -1
  30. package/dist/cache-stats.d.ts +3 -0
  31. package/dist/cache-stats.d.ts.map +1 -1
  32. package/dist/cache-stats.js.map +1 -1
  33. package/dist/cache.d.ts +15 -0
  34. package/dist/cache.d.ts.map +1 -1
  35. package/dist/cache.js.map +1 -1
  36. package/dist/cli-options.d.ts.map +1 -1
  37. package/dist/cli-options.js +2 -0
  38. package/dist/cli-options.js.map +1 -1
  39. package/dist/cli.js +1 -0
  40. package/dist/cli.js.map +1 -1
  41. package/dist/config.d.ts +15 -0
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js.map +1 -1
  44. package/dist/cookies.d.ts +3 -0
  45. package/dist/cookies.d.ts.map +1 -1
  46. package/dist/cookies.js.map +1 -1
  47. package/dist/csrf.d.ts +12 -0
  48. package/dist/csrf.d.ts.map +1 -1
  49. package/dist/csrf.js +12 -0
  50. package/dist/csrf.js.map +1 -1
  51. package/dist/deferred.d.ts +9 -0
  52. package/dist/deferred.d.ts.map +1 -1
  53. package/dist/deferred.js +6 -0
  54. package/dist/deferred.js.map +1 -1
  55. package/dist/dev-server.d.ts +3 -0
  56. package/dist/dev-server.d.ts.map +1 -1
  57. package/dist/dev-server.js.map +1 -1
  58. package/dist/file-conventions.d.ts +3 -0
  59. package/dist/file-conventions.d.ts.map +1 -1
  60. package/dist/file-conventions.js.map +1 -1
  61. package/dist/i18n.d.ts +15 -0
  62. package/dist/i18n.d.ts.map +1 -1
  63. package/dist/i18n.js +6 -0
  64. package/dist/i18n.js.map +1 -1
  65. package/dist/import-policy.d.ts +3 -0
  66. package/dist/import-policy.d.ts.map +1 -1
  67. package/dist/import-policy.js.map +1 -1
  68. package/dist/index.d.ts +19 -0
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +10 -0
  71. package/dist/index.js.map +1 -1
  72. package/dist/link.d.ts +34 -0
  73. package/dist/link.d.ts.map +1 -1
  74. package/dist/link.js.map +1 -1
  75. package/dist/logger.d.ts +33 -0
  76. package/dist/logger.d.ts.map +1 -1
  77. package/dist/logger.js.map +1 -1
  78. package/dist/multipart.d.ts +15 -0
  79. package/dist/multipart.d.ts.map +1 -1
  80. package/dist/multipart.js +3 -0
  81. package/dist/multipart.js.map +1 -1
  82. package/dist/native-escape.d.ts +3 -0
  83. package/dist/native-escape.d.ts.map +1 -1
  84. package/dist/native-escape.js +3 -0
  85. package/dist/native-escape.js.map +1 -1
  86. package/dist/navigation-state.d.ts +15 -0
  87. package/dist/navigation-state.d.ts.map +1 -1
  88. package/dist/navigation-state.js +6 -0
  89. package/dist/navigation-state.js.map +1 -1
  90. package/dist/navigation.d.ts +9 -0
  91. package/dist/navigation.d.ts.map +1 -1
  92. package/dist/navigation.js +6 -0
  93. package/dist/navigation.js.map +1 -1
  94. package/dist/prerender-store.d.ts +21 -0
  95. package/dist/prerender-store.d.ts.map +1 -1
  96. package/dist/prerender-store.js +9 -0
  97. package/dist/prerender-store.js.map +1 -1
  98. package/dist/render.d.ts +12 -0
  99. package/dist/render.d.ts.map +1 -1
  100. package/dist/render.js +3 -0
  101. package/dist/render.js.map +1 -1
  102. package/dist/routes.d.ts +30 -0
  103. package/dist/routes.d.ts.map +1 -1
  104. package/dist/routes.js +6 -0
  105. package/dist/routes.js.map +1 -1
  106. package/dist/runtime-cache.d.ts +4 -0
  107. package/dist/runtime-cache.d.ts.map +1 -1
  108. package/dist/runtime-cache.js +3 -0
  109. package/dist/runtime-cache.js.map +1 -1
  110. package/dist/runtime-state.d.ts +3 -0
  111. package/dist/runtime-state.d.ts.map +1 -1
  112. package/dist/runtime-state.js +3 -0
  113. package/dist/runtime-state.js.map +1 -1
  114. package/dist/serve.d.ts +24 -0
  115. package/dist/serve.d.ts.map +1 -1
  116. package/dist/serve.js +6 -0
  117. package/dist/serve.js.map +1 -1
  118. package/dist/session.d.ts +12 -0
  119. package/dist/session.d.ts.map +1 -1
  120. package/dist/session.js.map +1 -1
  121. package/dist/stream-list.d.ts +12 -0
  122. package/dist/stream-list.d.ts.map +1 -1
  123. package/dist/stream-list.js +3 -0
  124. package/dist/stream-list.js.map +1 -1
  125. package/dist/trace.d.ts +30 -0
  126. package/dist/trace.d.ts.map +1 -1
  127. package/dist/trace.js +6 -0
  128. package/dist/trace.js.map +1 -1
  129. package/dist/typed-routes.d.ts +33 -0
  130. package/dist/typed-routes.d.ts.map +1 -1
  131. package/dist/typed-routes.js.map +1 -1
  132. package/dist/types.d.ts +72 -0
  133. package/dist/types.d.ts.map +1 -1
  134. package/dist/types.js.map +1 -1
  135. package/dist/upgrade.d.ts +3 -0
  136. package/dist/upgrade.d.ts.map +1 -1
  137. package/dist/upgrade.js.map +1 -1
  138. package/dist/vite.d.ts +21 -0
  139. package/dist/vite.d.ts.map +1 -1
  140. package/dist/vite.js +15 -0
  141. package/dist/vite.js.map +1 -1
  142. package/package.json +11 -11
  143. package/src/actions.ts +6 -0
  144. package/src/adapters/aws-lambda.ts +29 -0
  145. package/src/adapters/cloudflare.ts +78 -0
  146. package/src/adapters/edge.ts +6 -0
  147. package/src/adapters/node.ts +7 -0
  148. package/src/adapters/static.ts +6 -0
  149. package/src/app-router-globals.ts +6 -0
  150. package/src/assets.ts +18 -0
  151. package/src/build.ts +38 -0
  152. package/src/cache-stats.ts +3 -0
  153. package/src/cache.ts +15 -0
  154. package/src/cli-options.ts +2 -0
  155. package/src/cli.ts +1 -0
  156. package/src/config.ts +15 -0
  157. package/src/cookies.ts +3 -0
  158. package/src/csrf.ts +12 -0
  159. package/src/deferred.ts +9 -0
  160. package/src/dev-server.ts +3 -0
  161. package/src/file-conventions.ts +3 -0
  162. package/src/i18n.ts +15 -0
  163. package/src/import-policy.ts +3 -0
  164. package/src/index.ts +19 -0
  165. package/src/link.ts +34 -0
  166. package/src/logger.ts +33 -0
  167. package/src/multipart.ts +15 -0
  168. package/src/native-escape.ts +3 -0
  169. package/src/navigation-state.ts +15 -0
  170. package/src/navigation.ts +9 -0
  171. package/src/prerender-store.ts +21 -0
  172. package/src/render.ts +12 -0
  173. package/src/routes.ts +30 -0
  174. package/src/runtime-cache.ts +5 -0
  175. package/src/runtime-state.ts +3 -0
  176. package/src/serve.ts +24 -0
  177. package/src/session.ts +12 -0
  178. package/src/stream-list.ts +12 -0
  179. package/src/trace.ts +30 -0
  180. package/src/typed-routes.ts +33 -0
  181. package/src/types.ts +72 -0
  182. package/src/upgrade.ts +3 -0
  183. package/src/vite.ts +21 -0
package/dist/routes.d.ts CHANGED
@@ -1,20 +1,35 @@
1
1
  import { type AppFileConvention } from "./file-conventions.js";
2
+ /**
3
+ * Configures app route discovery from a routes directory.
4
+ */
2
5
  export interface ScanAppRoutesOptions {
3
6
  appDir: string;
4
7
  }
8
+ /**
9
+ * Represents any route discovered by the app-router file-system scanner.
10
+ */
5
11
  export type AppRoute = AppAssetRoute | AppMetadataRoute | PageRoute | ServerRoute;
12
+ /**
13
+ * Describes a page route that renders a component.
14
+ */
6
15
  export interface PageRoute {
7
16
  kind: "page";
8
17
  path: string;
9
18
  file: string;
10
19
  segments: RouteSegment[];
11
20
  }
21
+ /**
22
+ * Describes a server route that handles HTTP methods directly.
23
+ */
12
24
  export interface ServerRoute {
13
25
  kind: "server";
14
26
  path: string;
15
27
  file: string;
16
28
  segments: RouteSegment[];
17
29
  }
30
+ /**
31
+ * Describes a generated metadata route such as robots or sitemap.
32
+ */
18
33
  export interface AppMetadataRoute {
19
34
  convention: AppFileConvention;
20
35
  kind: "metadata";
@@ -22,6 +37,9 @@ export interface AppMetadataRoute {
22
37
  file: string;
23
38
  segments: RouteSegment[];
24
39
  }
40
+ /**
41
+ * Describes a static asset route produced from an app file convention.
42
+ */
25
43
  export interface AppAssetRoute {
26
44
  convention: AppFileConvention;
27
45
  kind: "asset";
@@ -29,6 +47,9 @@ export interface AppAssetRoute {
29
47
  file: string;
30
48
  segments: RouteSegment[];
31
49
  }
50
+ /**
51
+ * Represents a static, dynamic, or catch-all segment in an app route path.
52
+ */
32
53
  export type RouteSegment = {
33
54
  kind: "static";
34
55
  value: string;
@@ -39,6 +60,9 @@ export type RouteSegment = {
39
60
  kind: "catch-all";
40
61
  name: string;
41
62
  };
63
+ /**
64
+ * Holds the route and params selected for a request pathname.
65
+ */
42
66
  export interface MatchedRoute {
43
67
  route: AppRoute;
44
68
  params: Record<string, readonly string[] | string>;
@@ -46,7 +70,13 @@ export interface MatchedRoute {
46
70
  export interface RouteMatcher {
47
71
  match(pathname: string): MatchedRoute | undefined;
48
72
  }
73
+ /**
74
+ * Scans an app directory and returns sorted app-router route definitions.
75
+ */
49
76
  export declare function scanAppRoutes(options: ScanAppRoutesOptions): Promise<AppRoute[]>;
77
+ /**
78
+ * Matches a request pathname against a route list.
79
+ */
50
80
  export declare function matchRoute(routes: readonly AppRoute[], pathname: string): MatchedRoute | undefined;
51
81
  export declare function createRouteMatcher(routes: readonly AppRoute[]): RouteMatcher;
52
82
  export declare function safeDecodeURIComponent(value: string): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,gBAAgB,GAAG,SAAS,GAAG,WAAW,CAAC;AAElF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;CACnD;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,QAAQ,EAAE,CAAC,CAwBrB;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,QAAQ,EAAE,MAAM,GACf,YAAY,GAAG,SAAS,CAE1B;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,GAAG,YAAY,CAa5E;AAuHD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMxE"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,gBAAgB,GAAG,SAAS,GAAG,WAAW,CAAC;AAElF;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;CACnD;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,QAAQ,EAAE,CAAC,CAwBrB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,QAAQ,EAAE,MAAM,GACf,YAAY,GAAG,SAAS,CAE1B;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,GAAG,YAAY,CAa5E;AAuHD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMxE"}
package/dist/routes.js CHANGED
@@ -2,6 +2,9 @@ import { readdir } from "node:fs/promises";
2
2
  import { join, relative, sep } from "node:path";
3
3
  import { createNativeRouteMatcher } from "./native-route-matcher.js";
4
4
  import { appFileConventionForRootFilename, } from "./file-conventions.js";
5
+ /**
6
+ * Scans an app directory and returns sorted app-router route definitions.
7
+ */
5
8
  export async function scanAppRoutes(options) {
6
9
  const files = await collectRouteFiles(options.appDir);
7
10
  return files
@@ -24,6 +27,9 @@ export async function scanAppRoutes(options) {
24
27
  })
25
28
  .sort(compareRouteListEntries);
26
29
  }
30
+ /**
31
+ * Matches a request pathname against a route list.
32
+ */
27
33
  export function matchRoute(routes, pathname) {
28
34
  return createRouteMatcher(routes).match(pathname);
29
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,gCAAgC,GAEjC,MAAM,uBAAuB,CAAC;AAoD/B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA6B;IAE7B,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtD,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAY,EAAE;QACtB,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,gCAAgC,CAAC,YAAY,CAAC,CAAC;QAClE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO;gBACL,UAAU,EAAE,UAAU,CAAC,UAAU;gBACjC,IAAI;gBACJ,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC;aAC5C,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QACnE,MAAM,SAAS,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAE7C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACnD,CAAC,CAAC;SACD,IAAI,CAAC,uBAAuB,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,MAA2B,EAC3B,QAAgB;IAEhB,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAA2B;IAC5D,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;IAE7D,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,QAAQ;YACZ,OAAO,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,MAA2B,EAC3B,QAAgB;IAEhB,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,gBAAgB,GAAG,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAElF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAC5C,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAC1C,CAAC;QAEF,IAAI,aAAa,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC9E,SAAS;QACX,CAAC;QAED,IAAI,aAAa,KAAK,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,aAAa,GAAG,CAAC,EAAE,CAAC;YACxE,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAA+C,EAAE,CAAC;QAC9D,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACxD,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAEtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,GAAG,KAAK,CAAC;gBAChB,MAAM;YACR,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACzD,OAAO,GAAG,KAAK,CAAC;gBAChB,MAAM;YACR,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;gBAC9C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,+DAA+D;oBAC/D,yDAAyD;oBACzD,OAAO,GAAG,KAAK,CAAC;oBAChB,MAAM;gBACR,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;YACjC,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACjC,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACvD,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;gBAEpE,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;oBACzB,OAAO,GAAG,KAAK,CAAC;oBAChB,MAAM;gBACR,CAAC;gBAED,MAAM,YAAY,GAAa,EAAE,CAAC;gBAClC,IAAI,QAAQ,GAAG,IAAI,CAAC;gBACpB,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;oBAC9D,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;oBAC7C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;wBAC1B,QAAQ,GAAG,KAAK,CAAC;wBACjB,MAAM;oBACR,CAAC;oBACD,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC7B,CAAC;gBACD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,GAAG,KAAK,CAAC;oBAChB,MAAM;gBACR,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;gBAEpC,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,EAAE,CAAC;oBAChF,MAAM,aAAa,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;oBAClD,MAAM,WAAW,GAAG,gBAAgB,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC;oBAEhE,IAAI,aAAa,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;wBAC7D,OAAO,GAAG,KAAK,CAAC;wBAChB,MAAM;oBACR,CAAC;oBAED,IAAI,aAAa,CAAC,IAAI,KAAK,QAAQ,IAAI,aAAa,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;wBAC3E,OAAO,GAAG,KAAK,CAAC;wBAChB,MAAM;oBACR,CAAC;oBAED,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBACrC,MAAM,OAAO,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;wBACpD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;4BAC1B,OAAO,GAAG,KAAK,CAAC;4BAChB,MAAM;wBACR,CAAC;wBACD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;oBACvC,CAAC;oBAED,IAAI,aAAa,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;wBACvC,OAAO,GAAG,KAAK,CAAC;wBAChB,MAAM;oBACR,CAAC;gBACH,CAAC;gBAED,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yEAAyE;AACzE,yEAAyE;AACzE,uEAAuE;AACvE,YAAY;AACZ,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,SAAiB,EAAE,aAAa,GAAG,SAAS;IAC3E,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,IAAI,4BAA4B,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;YAC9D,SAAS;QACX,CAAC;QAED,IACE,KAAK,CAAC,MAAM,EAAE;YACd,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU;gBACxB,KAAK,CAAC,IAAI,KAAK,iBAAiB;gBAChC,KAAK,CAAC,IAAI,KAAK,UAAU;gBACzB,gCAAgC,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,EAChF,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,4BAA4B,CAAC,IAAY;IAChD,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,cAAc,CAAC;AAC7E,CAAC;AAED,SAAS,gCAAgC,CACvC,YAAoB;IAEpB,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,gCAAgC,CAAC,QAAQ,CAAC,CAAC;IAE9D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,IAAI,UAAU,CAAC,UAAU,KAAK,iBAAiB,EAAE,CAAC;QAClF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,KAAK;SACrB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;SACrC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACpD,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;IAEpB,OAAO;QACL,GAAG,UAAU;QACb,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,UAAU,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;KACrE,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,YAAoB;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,KAAK;SACrB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;SACrC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtE,OAAO,aAAa,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI,KAAK,GAAG;QACjB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,IAAI;aACD,KAAK,CAAC,CAAC,CAAC;aACR,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACZ,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YACrB,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAC5C,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBACpB,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBAC1C,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CACtC,CAAC;AACV,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1E,OAAO,eAAe,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;AACxD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,aAAa,CAAC,CAAW,EAAE,CAAW;IAC7C,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAEjD,OAAO,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AACtG,CAAC;AAED,SAAS,uBAAuB,CAAC,CAAW,EAAE,CAAW;IACvD,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,KAAK,GAAG;QACjB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,UAAU,CAAC,KAAe;IACjC,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,GAAG,GAAG,CAAC;QACrB,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,KAAK,GAAG,EAAE,CAAC;QACpB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC","sourcesContent":["import { readdir } from \"node:fs/promises\";\nimport { join, relative, sep } from \"node:path\";\nimport { createNativeRouteMatcher } from \"./native-route-matcher.js\";\nimport {\n appFileConventionForRootFilename,\n type AppFileConvention,\n} from \"./file-conventions.js\";\n\nexport interface ScanAppRoutesOptions {\n appDir: string;\n}\n\nexport type AppRoute = AppAssetRoute | AppMetadataRoute | PageRoute | ServerRoute;\n\nexport interface PageRoute {\n kind: \"page\";\n path: string;\n file: string;\n segments: RouteSegment[];\n}\n\nexport interface ServerRoute {\n kind: \"server\";\n path: string;\n file: string;\n segments: RouteSegment[];\n}\n\nexport interface AppMetadataRoute {\n convention: AppFileConvention;\n kind: \"metadata\";\n path: string;\n file: string;\n segments: RouteSegment[];\n}\n\nexport interface AppAssetRoute {\n convention: AppFileConvention;\n kind: \"asset\";\n path: string;\n file: string;\n segments: RouteSegment[];\n}\n\nexport type RouteSegment =\n | { kind: \"static\"; value: string }\n | { kind: \"dynamic\"; name: string }\n | { kind: \"catch-all\"; name: string };\n\nexport interface MatchedRoute {\n route: AppRoute;\n params: Record<string, readonly string[] | string>;\n}\n\nexport interface RouteMatcher {\n match(pathname: string): MatchedRoute | undefined;\n}\n\nexport async function scanAppRoutes(\n options: ScanAppRoutesOptions,\n): Promise<AppRoute[]> {\n const files = await collectRouteFiles(options.appDir);\n\n return files\n .map((file): AppRoute => {\n const relativeFile = relative(options.appDir, file);\n const convention = appFileConventionForRelativeFile(relativeFile);\n if (convention !== undefined) {\n return {\n convention: convention.convention,\n file,\n kind: convention.kind,\n path: convention.path,\n segments: segmentsFromPath(convention.path),\n };\n }\n\n const kind = relativeFile.endsWith(\"route.ts\") ? \"server\" : \"page\";\n const routePath = routePathFromRelativeFile(relativeFile);\n const segments = segmentsFromPath(routePath);\n\n return { kind, path: routePath, file, segments };\n })\n .sort(compareRouteListEntries);\n}\n\nexport function matchRoute(\n routes: readonly AppRoute[],\n pathname: string,\n): MatchedRoute | undefined {\n return createRouteMatcher(routes).match(pathname);\n}\n\nexport function createRouteMatcher(routes: readonly AppRoute[]): RouteMatcher {\n const sortedRoutes = [...routes].sort(compareRoutes);\n const nativeMatcher = createNativeRouteMatcher(sortedRoutes);\n\n if (nativeMatcher !== undefined) {\n return nativeMatcher;\n }\n\n return {\n match(pathname) {\n return matchSortedRoutes(sortedRoutes, pathname);\n },\n };\n}\n\nfunction matchSortedRoutes(\n routes: readonly AppRoute[],\n pathname: string,\n): MatchedRoute | undefined {\n const normalized = normalizePath(pathname);\n const pathnameSegments = normalized === \"/\" ? [] : normalized.slice(1).split(\"/\");\n\n for (const route of routes) {\n const catchAllIndex = route.segments.findIndex(\n (segment) => segment.kind === \"catch-all\",\n );\n\n if (catchAllIndex === -1 && route.segments.length !== pathnameSegments.length) {\n continue;\n }\n\n if (catchAllIndex !== -1 && pathnameSegments.length < catchAllIndex + 1) {\n continue;\n }\n\n const params: Record<string, readonly string[] | string> = {};\n let matched = true;\n\n for (const [index, segment] of route.segments.entries()) {\n const value = pathnameSegments[index];\n\n if (value === undefined) {\n matched = false;\n break;\n }\n\n if (segment.kind === \"static\" && segment.value !== value) {\n matched = false;\n break;\n }\n\n if (segment.kind === \"dynamic\") {\n const decoded = safeDecodeURIComponent(value);\n if (decoded === undefined) {\n // Malformed percent-encoding -- treat as non-match rather than\n // letting URIError escape and produce a 500 (Issue 072).\n matched = false;\n break;\n }\n params[segment.name] = decoded;\n }\n\n if (segment.kind === \"catch-all\") {\n const suffixSegments = route.segments.slice(index + 1);\n const catchAllEnd = pathnameSegments.length - suffixSegments.length;\n\n if (catchAllEnd <= index) {\n matched = false;\n break;\n }\n\n const decodedParts: string[] = [];\n let decodeOk = true;\n for (const part of pathnameSegments.slice(index, catchAllEnd)) {\n const decoded = safeDecodeURIComponent(part);\n if (decoded === undefined) {\n decodeOk = false;\n break;\n }\n decodedParts.push(decoded);\n }\n if (!decodeOk) {\n matched = false;\n break;\n }\n params[segment.name] = decodedParts;\n\n for (let suffixIndex = 0; suffixIndex < suffixSegments.length; suffixIndex += 1) {\n const suffixSegment = suffixSegments[suffixIndex];\n const suffixValue = pathnameSegments[catchAllEnd + suffixIndex];\n\n if (suffixSegment === undefined || suffixValue === undefined) {\n matched = false;\n break;\n }\n\n if (suffixSegment.kind === \"static\" && suffixSegment.value !== suffixValue) {\n matched = false;\n break;\n }\n\n if (suffixSegment.kind === \"dynamic\") {\n const decoded = safeDecodeURIComponent(suffixValue);\n if (decoded === undefined) {\n matched = false;\n break;\n }\n params[suffixSegment.name] = decoded;\n }\n\n if (suffixSegment.kind === \"catch-all\") {\n matched = false;\n break;\n }\n }\n\n break;\n }\n }\n\n if (matched) {\n return { route, params };\n }\n }\n\n return undefined;\n}\n\n// Issue 072: attacker-supplied path segments / cookie values can include\n// malformed percent escapes (e.g. `%ZZ`, `%E0`). Catch the URIError so a\n// single bad byte cannot turn every request into a 500 + stack-leaking\n// response.\nexport function safeDecodeURIComponent(value: string): string | undefined {\n try {\n return decodeURIComponent(value);\n } catch {\n return undefined;\n }\n}\n\nasync function collectRouteFiles(directory: string, rootDirectory = directory): 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 if (shouldSkipRouteScanDirectory(entry.name)) {\n continue;\n }\n\n files.push(...(await collectRouteFiles(path, rootDirectory)));\n continue;\n }\n\n if (\n entry.isFile() &&\n (entry.name === \"page.tsx\" ||\n entry.name === \"page.mreact.tsx\" ||\n entry.name === \"route.ts\" ||\n appFileConventionForRelativeFile(relative(rootDirectory, path)) !== undefined)\n ) {\n files.push(path);\n }\n }\n\n return files;\n}\n\nfunction shouldSkipRouteScanDirectory(name: string): boolean {\n return name === \".vite\" || name === \"__tests__\" || name === \"node_modules\";\n}\n\nfunction appFileConventionForRelativeFile(\n relativeFile: string,\n): ReturnType<typeof appFileConventionForRootFilename> {\n const parts = relativeFile.split(sep);\n const filename = parts.at(-1);\n\n if (filename === undefined) {\n return undefined;\n }\n\n const convention = appFileConventionForRootFilename(filename);\n\n if (convention === undefined) {\n return undefined;\n }\n\n if (parts.length === 1) {\n return convention;\n }\n\n if (convention.kind !== \"metadata\" || convention.convention !== \"opengraph-image\") {\n return undefined;\n }\n\n const routeParts = parts\n .slice(0, -1)\n .filter((part) => !isRouteGroup(part))\n .map((part) => (part.startsWith(\"$\") ? `:${part.slice(1)}` : part));\n const conventionPath = convention.path.startsWith(\"/\")\n ? convention.path.slice(1)\n : convention.path;\n\n return {\n ...convention,\n path: normalizePath(`/${[...routeParts, conventionPath].join(\"/\")}`),\n };\n}\n\nfunction routePathFromRelativeFile(relativeFile: string): string {\n const parts = relativeFile.split(sep);\n const routeParts = parts\n .slice(0, -1)\n .filter((part) => !isRouteGroup(part))\n .map((part) => (part.startsWith(\"$\") ? `:${part.slice(1)}` : part));\n\n return normalizePath(`/${routeParts.join(\"/\")}`);\n}\n\nfunction segmentsFromPath(path: string): RouteSegment[] {\n return path === \"/\"\n ? []\n : path\n .slice(1)\n .split(\"/\")\n .map((part) =>\n part.startsWith(\":...\")\n ? { kind: \"catch-all\", name: part.slice(4) }\n : part.startsWith(\":\")\n ? { kind: \"dynamic\", name: part.slice(1) }\n : { kind: \"static\", value: part },\n );\n}\n\nfunction normalizePath(path: string): string {\n const withoutTrailing = path.length > 1 ? path.replace(/\\/+$/, \"\") : path;\n\n return withoutTrailing === \"\" ? \"/\" : withoutTrailing;\n}\n\nfunction isRouteGroup(part: string): boolean {\n return part.startsWith(\"(\") && part.endsWith(\")\");\n}\n\nfunction compareRoutes(a: AppRoute, b: AppRoute): number {\n const scoreDelta = routeScore(b) - routeScore(a);\n\n return scoreDelta === 0 ? a.path.localeCompare(b.path) || a.kind.localeCompare(b.kind) : scoreDelta;\n}\n\nfunction compareRouteListEntries(a: AppRoute, b: AppRoute): number {\n return routeListKey(a.path).localeCompare(routeListKey(b.path)) ||\n a.kind.localeCompare(b.kind);\n}\n\nfunction routeListKey(path: string): string {\n return path === \"/\"\n ? \"\"\n : path.replaceAll(\"/:...\", \"/zzzz-catch-all-\").replaceAll(\"/:\", \"/zzzz-dynamic-\");\n}\n\nfunction routeScore(route: AppRoute): number {\n return route.segments.reduce((score, segment) => {\n if (segment.kind === \"static\") {\n return score + 100;\n }\n\n if (segment.kind === \"dynamic\") {\n return score + 10;\n }\n\n return score;\n }, route.segments.length);\n}\n"]}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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","sourcesContent":["import { readdir } from \"node:fs/promises\";\nimport { join, relative, sep } from \"node:path\";\nimport { createNativeRouteMatcher } from \"./native-route-matcher.js\";\nimport {\n appFileConventionForRootFilename,\n type AppFileConvention,\n} from \"./file-conventions.js\";\n\n/**\n * Configures app route discovery from a routes directory.\n */\nexport interface ScanAppRoutesOptions {\n appDir: string;\n}\n\n/**\n * Represents any route discovered by the app-router file-system scanner.\n */\nexport type AppRoute = AppAssetRoute | AppMetadataRoute | PageRoute | ServerRoute;\n\n/**\n * Describes a page route that renders a component.\n */\nexport interface PageRoute {\n kind: \"page\";\n path: string;\n file: string;\n segments: RouteSegment[];\n}\n\n/**\n * Describes a server route that handles HTTP methods directly.\n */\nexport interface ServerRoute {\n kind: \"server\";\n path: string;\n file: string;\n segments: RouteSegment[];\n}\n\n/**\n * Describes a generated metadata route such as robots or sitemap.\n */\nexport interface AppMetadataRoute {\n convention: AppFileConvention;\n kind: \"metadata\";\n path: string;\n file: string;\n segments: RouteSegment[];\n}\n\n/**\n * Describes a static asset route produced from an app file convention.\n */\nexport interface AppAssetRoute {\n convention: AppFileConvention;\n kind: \"asset\";\n path: string;\n file: string;\n segments: RouteSegment[];\n}\n\n/**\n * Represents a static, dynamic, or catch-all segment in an app route path.\n */\nexport type RouteSegment =\n | { kind: \"static\"; value: string }\n | { kind: \"dynamic\"; name: string }\n | { kind: \"catch-all\"; name: string };\n\n/**\n * Holds the route and params selected for a request pathname.\n */\nexport interface MatchedRoute {\n route: AppRoute;\n params: Record<string, readonly string[] | string>;\n}\n\nexport interface RouteMatcher {\n match(pathname: string): MatchedRoute | undefined;\n}\n\n/**\n * Scans an app directory and returns sorted app-router route definitions.\n */\nexport async function scanAppRoutes(\n options: ScanAppRoutesOptions,\n): Promise<AppRoute[]> {\n const files = await collectRouteFiles(options.appDir);\n\n return files\n .map((file): AppRoute => {\n const relativeFile = relative(options.appDir, file);\n const convention = appFileConventionForRelativeFile(relativeFile);\n if (convention !== undefined) {\n return {\n convention: convention.convention,\n file,\n kind: convention.kind,\n path: convention.path,\n segments: segmentsFromPath(convention.path),\n };\n }\n\n const kind = relativeFile.endsWith(\"route.ts\") ? \"server\" : \"page\";\n const routePath = routePathFromRelativeFile(relativeFile);\n const segments = segmentsFromPath(routePath);\n\n return { kind, path: routePath, file, segments };\n })\n .sort(compareRouteListEntries);\n}\n\n/**\n * Matches a request pathname against a route list.\n */\nexport function matchRoute(\n routes: readonly AppRoute[],\n pathname: string,\n): MatchedRoute | undefined {\n return createRouteMatcher(routes).match(pathname);\n}\n\nexport function createRouteMatcher(routes: readonly AppRoute[]): RouteMatcher {\n const sortedRoutes = [...routes].sort(compareRoutes);\n const nativeMatcher = createNativeRouteMatcher(sortedRoutes);\n\n if (nativeMatcher !== undefined) {\n return nativeMatcher;\n }\n\n return {\n match(pathname) {\n return matchSortedRoutes(sortedRoutes, pathname);\n },\n };\n}\n\nfunction matchSortedRoutes(\n routes: readonly AppRoute[],\n pathname: string,\n): MatchedRoute | undefined {\n const normalized = normalizePath(pathname);\n const pathnameSegments = normalized === \"/\" ? [] : normalized.slice(1).split(\"/\");\n\n for (const route of routes) {\n const catchAllIndex = route.segments.findIndex(\n (segment) => segment.kind === \"catch-all\",\n );\n\n if (catchAllIndex === -1 && route.segments.length !== pathnameSegments.length) {\n continue;\n }\n\n if (catchAllIndex !== -1 && pathnameSegments.length < catchAllIndex + 1) {\n continue;\n }\n\n const params: Record<string, readonly string[] | string> = {};\n let matched = true;\n\n for (const [index, segment] of route.segments.entries()) {\n const value = pathnameSegments[index];\n\n if (value === undefined) {\n matched = false;\n break;\n }\n\n if (segment.kind === \"static\" && segment.value !== value) {\n matched = false;\n break;\n }\n\n if (segment.kind === \"dynamic\") {\n const decoded = safeDecodeURIComponent(value);\n if (decoded === undefined) {\n // Malformed percent-encoding -- treat as non-match rather than\n // letting URIError escape and produce a 500 (Issue 072).\n matched = false;\n break;\n }\n params[segment.name] = decoded;\n }\n\n if (segment.kind === \"catch-all\") {\n const suffixSegments = route.segments.slice(index + 1);\n const catchAllEnd = pathnameSegments.length - suffixSegments.length;\n\n if (catchAllEnd <= index) {\n matched = false;\n break;\n }\n\n const decodedParts: string[] = [];\n let decodeOk = true;\n for (const part of pathnameSegments.slice(index, catchAllEnd)) {\n const decoded = safeDecodeURIComponent(part);\n if (decoded === undefined) {\n decodeOk = false;\n break;\n }\n decodedParts.push(decoded);\n }\n if (!decodeOk) {\n matched = false;\n break;\n }\n params[segment.name] = decodedParts;\n\n for (let suffixIndex = 0; suffixIndex < suffixSegments.length; suffixIndex += 1) {\n const suffixSegment = suffixSegments[suffixIndex];\n const suffixValue = pathnameSegments[catchAllEnd + suffixIndex];\n\n if (suffixSegment === undefined || suffixValue === undefined) {\n matched = false;\n break;\n }\n\n if (suffixSegment.kind === \"static\" && suffixSegment.value !== suffixValue) {\n matched = false;\n break;\n }\n\n if (suffixSegment.kind === \"dynamic\") {\n const decoded = safeDecodeURIComponent(suffixValue);\n if (decoded === undefined) {\n matched = false;\n break;\n }\n params[suffixSegment.name] = decoded;\n }\n\n if (suffixSegment.kind === \"catch-all\") {\n matched = false;\n break;\n }\n }\n\n break;\n }\n }\n\n if (matched) {\n return { route, params };\n }\n }\n\n return undefined;\n}\n\n// Issue 072: attacker-supplied path segments / cookie values can include\n// malformed percent escapes (e.g. `%ZZ`, `%E0`). Catch the URIError so a\n// single bad byte cannot turn every request into a 500 + stack-leaking\n// response.\nexport function safeDecodeURIComponent(value: string): string | undefined {\n try {\n return decodeURIComponent(value);\n } catch {\n return undefined;\n }\n}\n\nasync function collectRouteFiles(directory: string, rootDirectory = directory): 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 if (shouldSkipRouteScanDirectory(entry.name)) {\n continue;\n }\n\n files.push(...(await collectRouteFiles(path, rootDirectory)));\n continue;\n }\n\n if (\n entry.isFile() &&\n (entry.name === \"page.tsx\" ||\n entry.name === \"page.mreact.tsx\" ||\n entry.name === \"route.ts\" ||\n appFileConventionForRelativeFile(relative(rootDirectory, path)) !== undefined)\n ) {\n files.push(path);\n }\n }\n\n return files;\n}\n\nfunction shouldSkipRouteScanDirectory(name: string): boolean {\n return name === \".vite\" || name === \"__tests__\" || name === \"node_modules\";\n}\n\nfunction appFileConventionForRelativeFile(\n relativeFile: string,\n): ReturnType<typeof appFileConventionForRootFilename> {\n const parts = relativeFile.split(sep);\n const filename = parts.at(-1);\n\n if (filename === undefined) {\n return undefined;\n }\n\n const convention = appFileConventionForRootFilename(filename);\n\n if (convention === undefined) {\n return undefined;\n }\n\n if (parts.length === 1) {\n return convention;\n }\n\n if (convention.kind !== \"metadata\" || convention.convention !== \"opengraph-image\") {\n return undefined;\n }\n\n const routeParts = parts\n .slice(0, -1)\n .filter((part) => !isRouteGroup(part))\n .map((part) => (part.startsWith(\"$\") ? `:${part.slice(1)}` : part));\n const conventionPath = convention.path.startsWith(\"/\")\n ? convention.path.slice(1)\n : convention.path;\n\n return {\n ...convention,\n path: normalizePath(`/${[...routeParts, conventionPath].join(\"/\")}`),\n };\n}\n\nfunction routePathFromRelativeFile(relativeFile: string): string {\n const parts = relativeFile.split(sep);\n const routeParts = parts\n .slice(0, -1)\n .filter((part) => !isRouteGroup(part))\n .map((part) => (part.startsWith(\"$\") ? `:${part.slice(1)}` : part));\n\n return normalizePath(`/${routeParts.join(\"/\")}`);\n}\n\nfunction segmentsFromPath(path: string): RouteSegment[] {\n return path === \"/\"\n ? []\n : path\n .slice(1)\n .split(\"/\")\n .map((part) =>\n part.startsWith(\":...\")\n ? { kind: \"catch-all\", name: part.slice(4) }\n : part.startsWith(\":\")\n ? { kind: \"dynamic\", name: part.slice(1) }\n : { kind: \"static\", value: part },\n );\n}\n\nfunction normalizePath(path: string): string {\n const withoutTrailing = path.length > 1 ? path.replace(/\\/+$/, \"\") : path;\n\n return withoutTrailing === \"\" ? \"/\" : withoutTrailing;\n}\n\nfunction isRouteGroup(part: string): boolean {\n return part.startsWith(\"(\") && part.endsWith(\")\");\n}\n\nfunction compareRoutes(a: AppRoute, b: AppRoute): number {\n const scoreDelta = routeScore(b) - routeScore(a);\n\n return scoreDelta === 0 ? a.path.localeCompare(b.path) || a.kind.localeCompare(b.kind) : scoreDelta;\n}\n\nfunction compareRouteListEntries(a: AppRoute, b: AppRoute): number {\n return routeListKey(a.path).localeCompare(routeListKey(b.path)) ||\n a.kind.localeCompare(b.kind);\n}\n\nfunction routeListKey(path: string): string {\n return path === \"/\"\n ? \"\"\n : path.replaceAll(\"/:...\", \"/zzzz-catch-all-\").replaceAll(\"/:\", \"/zzzz-dynamic-\");\n}\n\nfunction routeScore(route: AppRoute): number {\n return route.segments.reduce((score, segment) => {\n if (segment.kind === \"static\") {\n return score + 100;\n }\n\n if (segment.kind === \"dynamic\") {\n return score + 10;\n }\n\n return score;\n }, route.segments.length);\n}\n"]}
@@ -1,4 +1,8 @@
1
1
  import type { RouterRuntimeCacheStat } from "./cache-stats.js";
2
+ /** Reports a named runtime cache and its current entry count. */
2
3
  export type { RouterRuntimeCacheStat } from "./cache-stats.js";
4
+ /**
5
+ * Reads app-router runtime cache sizes for diagnostics.
6
+ */
3
7
  export declare function getRouterRuntimeCacheStats(): RouterRuntimeCacheStat[];
4
8
  //# sourceMappingURL=runtime-cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-cache.d.ts","sourceRoot":"","sources":["../src/runtime-cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,YAAY,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,wBAAgB,0BAA0B,IAAI,sBAAsB,EAAE,CAErE"}
1
+ {"version":3,"file":"runtime-cache.d.ts","sourceRoot":"","sources":["../src/runtime-cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,iEAAiE;AACjE,YAAY,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,sBAAsB,EAAE,CAErE"}
@@ -1,5 +1,8 @@
1
1
  import { routerModuleRunnerRuntimeCacheStats } from "./module-runner.js";
2
2
  import { routerRenderRuntimeCacheStats } from "./render.js";
3
+ /**
4
+ * Reads app-router runtime cache sizes for diagnostics.
5
+ */
3
6
  export function getRouterRuntimeCacheStats() {
4
7
  return [...routerRenderRuntimeCacheStats(), ...routerModuleRunnerRuntimeCacheStats()];
5
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-cache.js","sourceRoot":"","sources":["../src/runtime-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAI5D,MAAM,UAAU,0BAA0B;IACxC,OAAO,CAAC,GAAG,6BAA6B,EAAE,EAAE,GAAG,mCAAmC,EAAE,CAAC,CAAC;AACxF,CAAC","sourcesContent":["import { routerModuleRunnerRuntimeCacheStats } from \"./module-runner.js\";\nimport { routerRenderRuntimeCacheStats } from \"./render.js\";\nimport type { RouterRuntimeCacheStat } from \"./cache-stats.js\";\nexport type { RouterRuntimeCacheStat } from \"./cache-stats.js\";\n\nexport function getRouterRuntimeCacheStats(): RouterRuntimeCacheStat[] {\n return [...routerRenderRuntimeCacheStats(), ...routerModuleRunnerRuntimeCacheStats()];\n}\n"]}
1
+ {"version":3,"file":"runtime-cache.js","sourceRoot":"","sources":["../src/runtime-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAM5D;;GAEG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,CAAC,GAAG,6BAA6B,EAAE,EAAE,GAAG,mCAAmC,EAAE,CAAC,CAAC;AACxF,CAAC","sourcesContent":["import { routerModuleRunnerRuntimeCacheStats } from \"./module-runner.js\";\nimport { routerRenderRuntimeCacheStats } from \"./render.js\";\nimport type { RouterRuntimeCacheStat } from \"./cache-stats.js\";\n\n/** Reports a named runtime cache and its current entry count. */\nexport type { RouterRuntimeCacheStat } from \"./cache-stats.js\";\n\n/**\n * Reads app-router runtime cache sizes for diagnostics.\n */\nexport function getRouterRuntimeCacheStats(): RouterRuntimeCacheStat[] {\n return [...routerRenderRuntimeCacheStats(), ...routerModuleRunnerRuntimeCacheStats()];\n}\n"]}
@@ -1,2 +1,5 @@
1
+ /**
2
+ * Reads or initializes shared server runtime state stored on `globalThis`.
3
+ */
1
4
  export declare function getServerRuntimeState<TState extends object>(key: string, create: () => TState): TState;
2
5
  //# sourceMappingURL=runtime-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAKA,wBAAgB,qBAAqB,CAAC,MAAM,SAAS,MAAM,EACzD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,MAAM,GACnB,MAAM,CAYR"}
1
+ {"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,SAAS,MAAM,EACzD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,MAAM,GACnB,MAAM,CAYR"}
@@ -1,4 +1,7 @@
1
1
  const namespace = "__mreactRouterRuntimeState";
2
+ /**
3
+ * Reads or initializes shared server runtime state stored on `globalThis`.
4
+ */
2
5
  export function getServerRuntimeState(key, create) {
3
6
  const global = globalThis;
4
7
  const root = getOrCreateRoot(global);
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAGA,MAAM,SAAS,GAAG,4BAA4B,CAAC;AAE/C,MAAM,UAAU,qBAAqB,CACnC,GAAW,EACX,MAAoB;IAEpB,MAAM,MAAM,GAAG,UAA2B,CAAC;IAC3C,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAE3B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAClB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAqB;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAEnC,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAqB,EAAE,CAAC;IAClC,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC","sourcesContent":["type RuntimeGlobal = typeof globalThis & Record<string, unknown>;\ntype RuntimeStateRoot = Record<string, unknown>;\n\nconst namespace = \"__mreactRouterRuntimeState\";\n\nexport function getServerRuntimeState<TState extends object>(\n key: string,\n create: () => TState,\n): TState {\n const global = globalThis as RuntimeGlobal;\n const root = getOrCreateRoot(global);\n const existing = root[key];\n\n if (existing !== undefined) {\n return existing as TState;\n }\n\n const state = create();\n root[key] = state;\n return state;\n}\n\nfunction getOrCreateRoot(global: RuntimeGlobal): RuntimeStateRoot {\n const existing = global[namespace];\n\n if (isRuntimeGlobal(existing)) {\n return existing;\n }\n\n const root: RuntimeStateRoot = {};\n global[namespace] = root;\n return root;\n}\n\nfunction isRuntimeGlobal(value: unknown): value is RuntimeStateRoot {\n return typeof value === \"object\" && value !== null;\n}\n"]}
1
+ {"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAGA,MAAM,SAAS,GAAG,4BAA4B,CAAC;AAE/C;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAW,EACX,MAAoB;IAEpB,MAAM,MAAM,GAAG,UAA2B,CAAC;IAC3C,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAE3B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAClB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAqB;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAEnC,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAqB,EAAE,CAAC;IAClC,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC","sourcesContent":["type RuntimeGlobal = typeof globalThis & Record<string, unknown>;\ntype RuntimeStateRoot = Record<string, unknown>;\n\nconst namespace = \"__mreactRouterRuntimeState\";\n\n/**\n * Reads or initializes shared server runtime state stored on `globalThis`.\n */\nexport function getServerRuntimeState<TState extends object>(\n key: string,\n create: () => TState,\n): TState {\n const global = globalThis as RuntimeGlobal;\n const root = getOrCreateRoot(global);\n const existing = root[key];\n\n if (existing !== undefined) {\n return existing as TState;\n }\n\n const state = create();\n root[key] = state;\n return state;\n}\n\nfunction getOrCreateRoot(global: RuntimeGlobal): RuntimeStateRoot {\n const existing = global[namespace];\n\n if (isRuntimeGlobal(existing)) {\n return existing;\n }\n\n const root: RuntimeStateRoot = {};\n global[namespace] = root;\n return root;\n}\n\nfunction isRuntimeGlobal(value: unknown): value is RuntimeStateRoot {\n return typeof value === \"object\" && value !== null;\n}\n"]}
package/dist/serve.d.ts CHANGED
@@ -21,7 +21,13 @@ import type { HttpUpgradeHandler } from "./upgrade.js";
21
21
  * that on your workload.
22
22
  */
23
23
  export type ResponseSinkStrategy = "string" | "buffer";
24
+ /**
25
+ * Controls whether built request handling trusts the incoming Host header.
26
+ */
24
27
  export type RequestHostPolicy = "strict" | "trusted-proxy";
28
+ /**
29
+ * Configures rendering a request against a built app-router output directory.
30
+ */
25
31
  export interface RenderBuiltAppRequestOptions {
26
32
  outDir: string;
27
33
  importPolicy?: AppRouterImportPolicy | undefined;
@@ -48,11 +54,20 @@ export interface BuiltRequestRuntime {
48
54
  preload(preload?: BuiltAppRuntimePreloadStrategy | undefined): Promise<void>;
49
55
  render(request: Request, options?: BuiltRequestRuntimeRenderOptions | undefined): Promise<Response>;
50
56
  }
57
+ /**
58
+ * Selects which built runtime modules should be preloaded.
59
+ */
51
60
  export type BuiltAppRuntimePreloadMode = "all" | "hot-route-requests" | "hot-routes" | "middleware" | "none";
61
+ /**
62
+ * Configures built app runtime preload scope and optional hot routes.
63
+ */
52
64
  export interface BuiltAppRuntimePreloadStrategy {
53
65
  mode: BuiltAppRuntimePreloadMode;
54
66
  routes?: readonly string[] | undefined;
55
67
  }
68
+ /**
69
+ * Configures the Node HTTP server used to serve a built app-router output.
70
+ */
56
71
  export interface StartServerOptions {
57
72
  outDir: string;
58
73
  port: number;
@@ -84,6 +99,9 @@ export declare function warnIfImplicitHostTrust(options: {
84
99
  allowedHosts?: readonly string[] | undefined;
85
100
  hostPolicy?: RequestHostPolicy | undefined;
86
101
  }): void;
102
+ /**
103
+ * Defines storage for prerendered route responses used by built request rendering.
104
+ */
87
105
  export interface AppRouterPrerenderStore {
88
106
  delete(path: string): void | Promise<void>;
89
107
  get(path: string): BuiltPrerenderedRoute | undefined | Promise<BuiltPrerenderedRoute | undefined>;
@@ -91,12 +109,18 @@ export interface AppRouterPrerenderStore {
91
109
  withLock?<T>(path: string, task: () => Promise<T>): Promise<T>;
92
110
  }
93
111
  export declare function createBuiltRequestRuntime(options: BuiltRequestRuntimeOptions): Promise<BuiltRequestRuntime>;
112
+ /**
113
+ * Preloads selected modules from a built app-router runtime.
114
+ */
94
115
  export declare function preloadBuiltAppRuntime(options: {
95
116
  importPolicy?: AppRouterImportPolicy | undefined;
96
117
  outDir: string;
97
118
  preload?: BuiltAppRuntimePreloadStrategy | undefined;
98
119
  runtimeDir?: string | undefined;
99
120
  }): Promise<void>;
121
+ /**
122
+ * Renders a request using a built app-router output directory.
123
+ */
100
124
  export declare function renderBuiltAppRequest(options: RenderBuiltAppRequestOptions): Promise<Response>;
101
125
  /**
102
126
  * Starts a Node HTTP server for an already built app-router output directory.
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAItD,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAQjD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAE3B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAQxD,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AA4DvD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACvD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,eAAe,CAAC;AAI3D,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACjD,eAAe,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACpD,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACrC,UAAU,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC/C,cAAc,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACrD,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,aAAa,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;IACzD,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,OAAO,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;CAC9C;AAED,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,YAAY,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,MAAM,gCAAgC,GAAG,IAAI,CACjD,4BAA4B,EAC5B,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CACzD,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,OAAO,CAAC,EAAE,8BAA8B,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,CACJ,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,gCAAgC,GAAG,SAAS,GACrD,OAAO,CAAC,QAAQ,CAAC,CAAC;CACtB;AAED,MAAM,MAAM,0BAA0B,GAClC,KAAK,GACL,oBAAoB,GACpB,YAAY,GACZ,YAAY,GACZ,MAAM,CAAC;AAEX,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,0BAA0B,CAAC;IACjC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAKlB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAOtG,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7C,UAAU,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC3C,YAAY,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACjD,eAAe,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACpD,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACrC,UAAU,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC/C,cAAc,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACrD,UAAU,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACxC,aAAa,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;IACzD,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,SAAS,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC5C;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC3C,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,GAAG,MAAM,CAOT;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7C,UAAU,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CAC5C,GAAG,IAAI,CAcP;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAAC;IAClG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAChE;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAkC9B;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,YAAY,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,8BAA8B,GAAG,SAAS,CAAC;IACrD,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhB;AAuED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,QAAQ,CAAC,CAanB;AAuMD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC;IAAE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA+FlE;AAyGD,iBAAe,oBAAoB,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAmC/B;AAED,eAAO,MAAM,6BAA6B,6BAAuB,CAAC;AAElE,wBAAgB,mCAAmC,IAAI,IAAI,CAE1D;AAED,wBAAgB,qCAAqC,IAAI,MAAM,CAE9D"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
package/dist/serve.js CHANGED
@@ -63,6 +63,9 @@ export async function createBuiltRequestRuntime(options) {
63
63
  },
64
64
  };
65
65
  }
66
+ /**
67
+ * Preloads selected modules from a built app-router runtime.
68
+ */
66
69
  export async function preloadBuiltAppRuntime(options) {
67
70
  const runtime = await readBuiltRuntime({
68
71
  outDir: options.outDir,
@@ -119,6 +122,9 @@ function builtRuntimePreloadRoutes(runtime, strategy) {
119
122
  return route;
120
123
  });
121
124
  }
125
+ /**
126
+ * Renders a request using a built app-router output directory.
127
+ */
122
128
  export async function renderBuiltAppRequest(options) {
123
129
  const runtime = await readBuiltRuntime({
124
130
  outDir: options.outDir,