@reckona/mreact-router 0.0.175 → 0.0.177
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/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +5 -49
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/build.d.ts +1 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +90 -0
- package/dist/build.js.map +1 -1
- package/dist/built-assets.d.ts +11 -0
- package/dist/built-assets.d.ts.map +1 -0
- package/dist/built-assets.js +130 -0
- package/dist/built-assets.js.map +1 -0
- package/dist/built-runtime.d.ts +53 -0
- package/dist/built-runtime.d.ts.map +1 -0
- package/dist/built-runtime.js +178 -0
- package/dist/built-runtime.js.map +1 -0
- package/dist/built-server-module-artifacts.d.ts +19 -0
- package/dist/built-server-module-artifacts.d.ts.map +1 -0
- package/dist/built-server-module-artifacts.js +217 -0
- package/dist/built-server-module-artifacts.js.map +1 -0
- package/dist/client-manifest-assets.d.ts +16 -0
- package/dist/client-manifest-assets.d.ts.map +1 -0
- package/dist/client-manifest-assets.js +60 -0
- package/dist/client-manifest-assets.js.map +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +79 -13
- package/dist/client.js.map +1 -1
- package/dist/node-server.d.ts +29 -0
- package/dist/node-server.d.ts.map +1 -0
- package/dist/node-server.js +81 -0
- package/dist/node-server.js.map +1 -0
- package/dist/render.d.ts +9 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +20 -41
- package/dist/render.js.map +1 -1
- package/dist/route-dispatch.d.ts +2 -0
- package/dist/route-dispatch.d.ts.map +1 -0
- package/dist/route-dispatch.js +16 -0
- package/dist/route-dispatch.js.map +1 -0
- package/dist/route-loader-runtime.d.ts +22 -0
- package/dist/route-loader-runtime.d.ts.map +1 -0
- package/dist/route-loader-runtime.js +30 -0
- package/dist/route-loader-runtime.js.map +1 -0
- package/dist/routes.d.ts +2 -0
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +48 -1
- package/dist/routes.js.map +1 -1
- package/dist/serve.d.ts +4 -3
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +84 -582
- package/dist/serve.js.map +1 -1
- package/package.json +11 -11
- package/src/adapters/cloudflare.ts +5 -60
- package/src/build.ts +143 -0
- package/src/built-assets.ts +164 -0
- package/src/built-runtime.ts +312 -0
- package/src/built-server-module-artifacts.ts +340 -0
- package/src/client-manifest-assets.ts +92 -0
- package/src/client.ts +79 -13
- package/src/node-server.ts +129 -0
- package/src/render.ts +38 -60
- package/src/route-dispatch.ts +17 -0
- package/src/route-loader-runtime.ts +54 -0
- package/src/routes.ts +70 -1
- package/src/serve.ts +105 -863
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-dispatch.d.ts","sourceRoot":"","sources":["../src/route-dispatch.ts"],"names":[],"mappings":"AAAA,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAgB5E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function pageRouteMethodResponse(method) {
|
|
2
|
+
if (method === "GET" || method === "HEAD") {
|
|
3
|
+
return undefined;
|
|
4
|
+
}
|
|
5
|
+
if (method === "OPTIONS") {
|
|
6
|
+
return new Response(null, {
|
|
7
|
+
status: 204,
|
|
8
|
+
headers: { allow: "GET, HEAD, OPTIONS" },
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
return new Response("Method Not Allowed", {
|
|
12
|
+
status: 405,
|
|
13
|
+
headers: { allow: "GET, HEAD, OPTIONS" },
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=route-dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-dispatch.js","sourceRoot":"","sources":["../src/route-dispatch.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;YACxB,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE;SACzC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE;QACxC,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE;KACzC,CAAC,CAAC;AACL,CAAC","sourcesContent":["export function pageRouteMethodResponse(method: string): Response | undefined {\n if (method === \"GET\" || method === \"HEAD\") {\n return undefined;\n }\n\n if (method === \"OPTIONS\") {\n return new Response(null, {\n status: 204,\n headers: { allow: \"GET, HEAD, OPTIONS\" },\n });\n }\n\n return new Response(\"Method Not Allowed\", {\n status: 405,\n headers: { allow: \"GET, HEAD, OPTIONS\" },\n });\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { QueryClient } from "@reckona/mreact-query";
|
|
2
|
+
import type { RouteParams } from "./types.js";
|
|
3
|
+
export interface RouteDataContext {
|
|
4
|
+
env?: unknown;
|
|
5
|
+
params: RouteParams;
|
|
6
|
+
queryClient: QueryClient;
|
|
7
|
+
request: Request;
|
|
8
|
+
}
|
|
9
|
+
export interface RouteLoaderModule {
|
|
10
|
+
loader?: (context: RouteDataContext) => unknown;
|
|
11
|
+
}
|
|
12
|
+
export interface RouteLoaderRuntimeTiming {
|
|
13
|
+
finish(startedAt: number | undefined, phase: "loaderExecutionMs" | "loaderModuleLoadMs"): void;
|
|
14
|
+
start(): number | undefined;
|
|
15
|
+
}
|
|
16
|
+
export declare function loadRouteDataFromModule(options: {
|
|
17
|
+
context: RouteDataContext;
|
|
18
|
+
hasLoader: boolean;
|
|
19
|
+
loadModule(): Promise<RouteLoaderModule>;
|
|
20
|
+
timing?: RouteLoaderRuntimeTiming | undefined;
|
|
21
|
+
}): Promise<unknown>;
|
|
22
|
+
//# sourceMappingURL=route-loader-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-loader-runtime.d.ts","sourceRoot":"","sources":["../src/route-loader-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC;CACjD;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,GAAG,IAAI,CAAC;IAC/F,KAAK,IAAI,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACrD,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;CAC/C,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BnB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export async function loadRouteDataFromModule(options) {
|
|
2
|
+
if (!options.hasLoader) {
|
|
3
|
+
return undefined;
|
|
4
|
+
}
|
|
5
|
+
let module;
|
|
6
|
+
const moduleLoadStartedAt = options.timing?.start();
|
|
7
|
+
try {
|
|
8
|
+
module = await options.loadModule();
|
|
9
|
+
}
|
|
10
|
+
finally {
|
|
11
|
+
options.timing?.finish(moduleLoadStartedAt, "loaderModuleLoadMs");
|
|
12
|
+
}
|
|
13
|
+
if (module.loader === undefined) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const executionStartedAt = options.timing?.start();
|
|
17
|
+
try {
|
|
18
|
+
return await module.loader(options.context);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error instanceof Response) {
|
|
22
|
+
return error;
|
|
23
|
+
}
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
options.timing?.finish(executionStartedAt, "loaderExecutionMs");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=route-loader-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-loader-runtime.js","sourceRoot":"","sources":["../src/route-loader-runtime.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAK7C;IACC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,MAAyB,CAAC;IAC9B,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IACtC,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IACnD,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;IAClE,CAAC;AACH,CAAC","sourcesContent":["import type { QueryClient } from \"@reckona/mreact-query\";\nimport type { RouteParams } from \"./types.js\";\n\nexport interface RouteDataContext {\n env?: unknown;\n params: RouteParams;\n queryClient: QueryClient;\n request: Request;\n}\n\nexport interface RouteLoaderModule {\n loader?: (context: RouteDataContext) => unknown;\n}\n\nexport interface RouteLoaderRuntimeTiming {\n finish(startedAt: number | undefined, phase: \"loaderExecutionMs\" | \"loaderModuleLoadMs\"): void;\n start(): number | undefined;\n}\n\nexport async function loadRouteDataFromModule(options: {\n context: RouteDataContext;\n hasLoader: boolean;\n loadModule(): Promise<RouteLoaderModule>;\n timing?: RouteLoaderRuntimeTiming | undefined;\n}): Promise<unknown> {\n if (!options.hasLoader) {\n return undefined;\n }\n\n let module: RouteLoaderModule;\n const moduleLoadStartedAt = options.timing?.start();\n try {\n module = await options.loadModule();\n } finally {\n options.timing?.finish(moduleLoadStartedAt, \"loaderModuleLoadMs\");\n }\n\n if (module.loader === undefined) {\n return undefined;\n }\n\n const executionStartedAt = options.timing?.start();\n try {\n return await module.loader(options.context);\n } catch (error) {\n if (error instanceof Response) {\n return error;\n }\n\n throw error;\n } finally {\n options.timing?.finish(executionStartedAt, \"loaderExecutionMs\");\n }\n}\n"]}
|
package/dist/routes.d.ts
CHANGED
|
@@ -100,6 +100,8 @@ export declare function scanAppRoutes(options: ScanAppRoutesOptions): Promise<Ap
|
|
|
100
100
|
* Matches a request pathname against a route list.
|
|
101
101
|
*/
|
|
102
102
|
export declare function matchRoute(routes: readonly AppRoute[], pathname: string): MatchedRoute | undefined;
|
|
103
|
+
export declare function __resetMatchRouteCacheForTest(): void;
|
|
104
|
+
export declare function __getMatchRouteMatcherBuildCountForTest(): number;
|
|
103
105
|
export declare function compileRouteMatcherArtifact(routes: readonly AppRoute[]): CompiledRouteMatcherArtifact;
|
|
104
106
|
export declare function createRouteMatcher(routes: readonly AppRoute[], artifact?: CompiledRouteMatcherArtifact | undefined): RouteMatcher;
|
|
105
107
|
export declare function safeDecodeURIComponent(value: string): string | undefined;
|
package/dist/routes.d.ts.map
CHANGED
|
@@ -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;;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;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
|
package/dist/routes.js
CHANGED
|
@@ -2,6 +2,10 @@ 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
|
+
let matchRouteMatcherCache = new WeakMap();
|
|
6
|
+
let matchRouteMatcherBuildCountForTest = 0;
|
|
7
|
+
let matchRouteFingerprintIds = new WeakMap();
|
|
8
|
+
let nextMatchRouteFingerprintId = 1;
|
|
5
9
|
/**
|
|
6
10
|
* Scans an app directory and returns sorted app-router route definitions.
|
|
7
11
|
*/
|
|
@@ -31,7 +35,24 @@ export async function scanAppRoutes(options) {
|
|
|
31
35
|
* Matches a request pathname against a route list.
|
|
32
36
|
*/
|
|
33
37
|
export function matchRoute(routes, pathname) {
|
|
34
|
-
|
|
38
|
+
const fingerprint = routeMatcherFingerprint(routes);
|
|
39
|
+
const cached = matchRouteMatcherCache.get(routes);
|
|
40
|
+
if (cached !== undefined && cached.fingerprint === fingerprint) {
|
|
41
|
+
return cached.matcher.match(pathname);
|
|
42
|
+
}
|
|
43
|
+
const matcher = createRouteMatcher(routes);
|
|
44
|
+
matchRouteMatcherBuildCountForTest += 1;
|
|
45
|
+
matchRouteMatcherCache.set(routes, { fingerprint, matcher });
|
|
46
|
+
return matcher.match(pathname);
|
|
47
|
+
}
|
|
48
|
+
export function __resetMatchRouteCacheForTest() {
|
|
49
|
+
matchRouteMatcherCache = new WeakMap();
|
|
50
|
+
matchRouteMatcherBuildCountForTest = 0;
|
|
51
|
+
matchRouteFingerprintIds = new WeakMap();
|
|
52
|
+
nextMatchRouteFingerprintId = 1;
|
|
53
|
+
}
|
|
54
|
+
export function __getMatchRouteMatcherBuildCountForTest() {
|
|
55
|
+
return matchRouteMatcherBuildCountForTest;
|
|
35
56
|
}
|
|
36
57
|
export function compileRouteMatcherArtifact(routes) {
|
|
37
58
|
const sortedRoutes = routes
|
|
@@ -79,6 +100,32 @@ function compileRouteMatcherEntry(route, routeIndex) {
|
|
|
79
100
|
suffixLength: route.segments.length - catchAllIndex - 1,
|
|
80
101
|
};
|
|
81
102
|
}
|
|
103
|
+
function routeMatcherFingerprint(routes) {
|
|
104
|
+
const parts = [String(routes.length)];
|
|
105
|
+
for (const route of routes) {
|
|
106
|
+
parts.push(String(routeMatcherRouteFingerprintId(route)), route.kind, route.path, String(route.segments.length));
|
|
107
|
+
for (const segment of route.segments) {
|
|
108
|
+
parts.push(segment.kind);
|
|
109
|
+
if (segment.kind === "static") {
|
|
110
|
+
parts.push(segment.value);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
parts.push(segment.name);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return parts.map((part) => `${part.length}:${part}`).join("|");
|
|
118
|
+
}
|
|
119
|
+
function routeMatcherRouteFingerprintId(route) {
|
|
120
|
+
const cached = matchRouteFingerprintIds.get(route);
|
|
121
|
+
if (cached !== undefined) {
|
|
122
|
+
return cached;
|
|
123
|
+
}
|
|
124
|
+
const id = nextMatchRouteFingerprintId;
|
|
125
|
+
nextMatchRouteFingerprintId += 1;
|
|
126
|
+
matchRouteFingerprintIds.set(route, id);
|
|
127
|
+
return id;
|
|
128
|
+
}
|
|
82
129
|
function matchCompiledRoutes(routes, artifact, pathname) {
|
|
83
130
|
const normalized = normalizePath(pathname);
|
|
84
131
|
const pathnameSegments = normalized === "/" ? [] : normalized.slice(1).split("/");
|
package/dist/routes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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\nexport type CompiledRouteMatcherSegment =\n | { kind: \"static\"; value: string }\n | { kind: \"dynamic\"; name: string }\n | { kind: \"catch-all\"; name: string };\n\nexport interface CompiledRouteMatcherEntry {\n catchAllIndex: number;\n exactLength?: number;\n minimumLength: number;\n routeIndex: number;\n segments: readonly CompiledRouteMatcherSegment[];\n suffixLength?: number;\n}\n\nexport interface CompiledRouteMatcherArtifact {\n routes: readonly CompiledRouteMatcherEntry[];\n version: 1;\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 compileRouteMatcherArtifact(\n routes: readonly AppRoute[],\n): CompiledRouteMatcherArtifact {\n const sortedRoutes = routes\n .map((route, routeIndex) => ({ route, routeIndex }))\n .sort((left, right) => compareRoutes(left.route, right.route));\n\n return {\n version: 1,\n routes: sortedRoutes.map(({ route, routeIndex }) =>\n compileRouteMatcherEntry(route, routeIndex),\n ),\n };\n}\n\nexport function createRouteMatcher(\n routes: readonly AppRoute[],\n artifact?: CompiledRouteMatcherArtifact | undefined,\n): RouteMatcher {\n if (artifact?.version === 1) {\n return {\n match(pathname) {\n return matchCompiledRoutes(routes, artifact, pathname);\n },\n };\n }\n\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 compileRouteMatcherEntry(\n route: AppRoute,\n routeIndex: number,\n): CompiledRouteMatcherEntry {\n const catchAllIndex = route.segments.findIndex((segment) => segment.kind === \"catch-all\");\n const shared = {\n catchAllIndex,\n minimumLength: catchAllIndex === -1 ? route.segments.length : catchAllIndex + 1,\n routeIndex,\n segments: route.segments.map((segment) => ({ ...segment })),\n };\n\n return catchAllIndex === -1\n ? {\n ...shared,\n exactLength: route.segments.length,\n }\n : {\n ...shared,\n suffixLength: route.segments.length - catchAllIndex - 1,\n };\n}\n\nfunction matchCompiledRoutes(\n routes: readonly AppRoute[],\n artifact: CompiledRouteMatcherArtifact,\n pathname: string,\n): MatchedRoute | undefined {\n const normalized = normalizePath(pathname);\n const pathnameSegments = normalized === \"/\" ? [] : normalized.slice(1).split(\"/\");\n\n for (const compiledRoute of artifact.routes) {\n const route = routes[compiledRoute.routeIndex];\n if (route === undefined) {\n continue;\n }\n\n if (\n compiledRoute.exactLength !== undefined &&\n compiledRoute.exactLength !== pathnameSegments.length\n ) {\n continue;\n }\n\n if (pathnameSegments.length < compiledRoute.minimumLength) {\n continue;\n }\n\n const params: Record<string, readonly string[] | string> = {};\n let matched = true;\n\n for (const [index, segment] of compiledRoute.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 matched = false;\n break;\n }\n params[segment.name] = decoded;\n }\n\n if (segment.kind === \"catch-all\") {\n const suffixLength = compiledRoute.suffixLength ?? 0;\n const catchAllEnd = pathnameSegments.length - suffixLength;\n\n if (catchAllEnd <= index) {\n matched = false;\n break;\n }\n\n const decodedParts: string[] = [];\n for (let partIndex = index; partIndex < catchAllEnd; partIndex += 1) {\n const decoded = safeDecodeURIComponent(pathnameSegments[partIndex] ?? \"\");\n if (decoded === undefined) {\n matched = false;\n break;\n }\n decodedParts.push(decoded);\n }\n if (!matched) {\n break;\n }\n params[segment.name] = decodedParts;\n\n for (let suffixIndex = 0; suffixIndex < suffixLength; suffixIndex += 1) {\n const suffixSegment = compiledRoute.segments[index + 1 + 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\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\ninterface MatchRouteCacheEntry {\n fingerprint: string;\n matcher: RouteMatcher;\n}\n\nexport type CompiledRouteMatcherSegment =\n | { kind: \"static\"; value: string }\n | { kind: \"dynamic\"; name: string }\n | { kind: \"catch-all\"; name: string };\n\nexport interface CompiledRouteMatcherEntry {\n catchAllIndex: number;\n exactLength?: number;\n minimumLength: number;\n routeIndex: number;\n segments: readonly CompiledRouteMatcherSegment[];\n suffixLength?: number;\n}\n\nexport interface CompiledRouteMatcherArtifact {\n routes: readonly CompiledRouteMatcherEntry[];\n version: 1;\n}\n\nlet matchRouteMatcherCache = new WeakMap<readonly AppRoute[], MatchRouteCacheEntry>();\nlet matchRouteMatcherBuildCountForTest = 0;\nlet matchRouteFingerprintIds = new WeakMap<AppRoute, number>();\nlet nextMatchRouteFingerprintId = 1;\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 const fingerprint = routeMatcherFingerprint(routes);\n const cached = matchRouteMatcherCache.get(routes);\n\n if (cached !== undefined && cached.fingerprint === fingerprint) {\n return cached.matcher.match(pathname);\n }\n\n const matcher = createRouteMatcher(routes);\n matchRouteMatcherBuildCountForTest += 1;\n matchRouteMatcherCache.set(routes, { fingerprint, matcher });\n return matcher.match(pathname);\n}\n\nexport function __resetMatchRouteCacheForTest(): void {\n matchRouteMatcherCache = new WeakMap();\n matchRouteMatcherBuildCountForTest = 0;\n matchRouteFingerprintIds = new WeakMap();\n nextMatchRouteFingerprintId = 1;\n}\n\nexport function __getMatchRouteMatcherBuildCountForTest(): number {\n return matchRouteMatcherBuildCountForTest;\n}\n\nexport function compileRouteMatcherArtifact(\n routes: readonly AppRoute[],\n): CompiledRouteMatcherArtifact {\n const sortedRoutes = routes\n .map((route, routeIndex) => ({ route, routeIndex }))\n .sort((left, right) => compareRoutes(left.route, right.route));\n\n return {\n version: 1,\n routes: sortedRoutes.map(({ route, routeIndex }) =>\n compileRouteMatcherEntry(route, routeIndex),\n ),\n };\n}\n\nexport function createRouteMatcher(\n routes: readonly AppRoute[],\n artifact?: CompiledRouteMatcherArtifact | undefined,\n): RouteMatcher {\n if (artifact?.version === 1) {\n return {\n match(pathname) {\n return matchCompiledRoutes(routes, artifact, pathname);\n },\n };\n }\n\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 compileRouteMatcherEntry(\n route: AppRoute,\n routeIndex: number,\n): CompiledRouteMatcherEntry {\n const catchAllIndex = route.segments.findIndex((segment) => segment.kind === \"catch-all\");\n const shared = {\n catchAllIndex,\n minimumLength: catchAllIndex === -1 ? route.segments.length : catchAllIndex + 1,\n routeIndex,\n segments: route.segments.map((segment) => ({ ...segment })),\n };\n\n return catchAllIndex === -1\n ? {\n ...shared,\n exactLength: route.segments.length,\n }\n : {\n ...shared,\n suffixLength: route.segments.length - catchAllIndex - 1,\n };\n}\n\nfunction routeMatcherFingerprint(routes: readonly AppRoute[]): string {\n const parts: string[] = [String(routes.length)];\n\n for (const route of routes) {\n parts.push(\n String(routeMatcherRouteFingerprintId(route)),\n route.kind,\n route.path,\n String(route.segments.length),\n );\n\n for (const segment of route.segments) {\n parts.push(segment.kind);\n\n if (segment.kind === \"static\") {\n parts.push(segment.value);\n } else {\n parts.push(segment.name);\n }\n }\n }\n\n return parts.map((part) => `${part.length}:${part}`).join(\"|\");\n}\n\nfunction routeMatcherRouteFingerprintId(route: AppRoute): number {\n const cached = matchRouteFingerprintIds.get(route);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const id = nextMatchRouteFingerprintId;\n nextMatchRouteFingerprintId += 1;\n matchRouteFingerprintIds.set(route, id);\n return id;\n}\n\nfunction matchCompiledRoutes(\n routes: readonly AppRoute[],\n artifact: CompiledRouteMatcherArtifact,\n pathname: string,\n): MatchedRoute | undefined {\n const normalized = normalizePath(pathname);\n const pathnameSegments = normalized === \"/\" ? [] : normalized.slice(1).split(\"/\");\n\n for (const compiledRoute of artifact.routes) {\n const route = routes[compiledRoute.routeIndex];\n if (route === undefined) {\n continue;\n }\n\n if (\n compiledRoute.exactLength !== undefined &&\n compiledRoute.exactLength !== pathnameSegments.length\n ) {\n continue;\n }\n\n if (pathnameSegments.length < compiledRoute.minimumLength) {\n continue;\n }\n\n const params: Record<string, readonly string[] | string> = {};\n let matched = true;\n\n for (const [index, segment] of compiledRoute.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 matched = false;\n break;\n }\n params[segment.name] = decoded;\n }\n\n if (segment.kind === \"catch-all\") {\n const suffixLength = compiledRoute.suffixLength ?? 0;\n const catchAllEnd = pathnameSegments.length - suffixLength;\n\n if (catchAllEnd <= index) {\n matched = false;\n break;\n }\n\n const decodedParts: string[] = [];\n for (let partIndex = index; partIndex < catchAllEnd; partIndex += 1) {\n const decoded = safeDecodeURIComponent(pathnameSegments[partIndex] ?? \"\");\n if (decoded === undefined) {\n matched = false;\n break;\n }\n decodedParts.push(decoded);\n }\n if (!matched) {\n break;\n }\n params[segment.name] = decodedParts;\n\n for (let suffixIndex = 0; suffixIndex < suffixLength; suffixIndex += 1) {\n const suffixSegment = compiledRoute.segments[index + 1 + 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\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"]}
|
package/dist/serve.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Server } from "node:http";
|
|
2
2
|
import type { BuiltPrerenderedRoute } from "./build.js";
|
|
3
3
|
import type { AppRouterCache } from "./cache.js";
|
|
4
|
+
import { readBuiltPublicAsset } from "./built-assets.js";
|
|
4
5
|
import type { AppRouterServerActionOptions } from "./actions.js";
|
|
5
6
|
import type { AppRouterImportPolicy } from "./import-policy.js";
|
|
6
7
|
import { type AppRouterRenderPreload, type AppRouterResponseHook } from "./render.js";
|
|
@@ -132,9 +133,9 @@ export declare function startServer(options: StartServerOptions): Promise<{
|
|
|
132
133
|
server: Server;
|
|
133
134
|
url: string;
|
|
134
135
|
}>;
|
|
135
|
-
declare function readBuiltPublicAsset(outDir: string, pathname: string): Promise<Response | undefined>;
|
|
136
136
|
export declare const __readBuiltPublicAssetForTest: typeof readBuiltPublicAsset;
|
|
137
|
+
export declare function __clearBuiltRuntimeCacheForTest(): void;
|
|
138
|
+
export declare function __getBuiltRuntimeMaterializeCountForTest(): number;
|
|
137
139
|
export declare function __clearBuiltPublicAssetCacheForTest(): void;
|
|
138
140
|
export declare function __getBuiltPublicAssetCacheSizeForTest(): number;
|
|
139
|
-
export {};
|
|
140
141
|
//# sourceMappingURL=serve.d.ts.map
|
package/dist/serve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
|