@reckona/mreact-router 0.0.203 → 0.0.205
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -9
- package/dist/actions.d.ts +6 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +70 -10
- package/dist/actions.js.map +1 -1
- package/dist/adapters/aws-lambda.d.ts +15 -4
- package/dist/adapters/aws-lambda.d.ts.map +1 -1
- package/dist/adapters/aws-lambda.js +301 -63
- package/dist/adapters/aws-lambda.js.map +1 -1
- package/dist/adapters/cloudflare.d.ts +2 -1
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +18 -10
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/edge.d.ts +1 -1
- package/dist/adapters/edge.d.ts.map +1 -1
- package/dist/adapters/edge.js.map +1 -1
- package/dist/adapters/node.d.ts +5 -3
- package/dist/adapters/node.d.ts.map +1 -1
- package/dist/adapters/node.js +2 -1
- package/dist/adapters/node.js.map +1 -1
- package/dist/adapters/static.d.ts.map +1 -1
- package/dist/adapters/static.js +24 -2
- package/dist/adapters/static.js.map +1 -1
- package/dist/build.d.ts +1 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +91 -5
- package/dist/build.js.map +1 -1
- package/dist/built-runtime.d.ts +2 -0
- package/dist/built-runtime.d.ts.map +1 -1
- package/dist/built-runtime.js +16 -0
- package/dist/built-runtime.js.map +1 -1
- package/dist/cache.d.ts +3 -1
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +211 -13
- package/dist/cache.js.map +1 -1
- package/dist/cli.js +12 -1
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +32 -1
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +21 -2
- package/dist/config.js.map +1 -1
- package/dist/csp.d.ts +1 -0
- package/dist/csp.d.ts.map +1 -1
- package/dist/csp.js +11 -6
- package/dist/csp.js.map +1 -1
- package/dist/dehydrate-policy.d.ts +3 -0
- package/dist/dehydrate-policy.d.ts.map +1 -0
- package/dist/dehydrate-policy.js +16 -0
- package/dist/dehydrate-policy.js.map +1 -0
- package/dist/dev-server.d.ts +7 -2
- package/dist/dev-server.d.ts.map +1 -1
- package/dist/dev-server.js +120 -11
- package/dist/dev-server.js.map +1 -1
- package/dist/http.d.ts +1 -1
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +147 -7
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +22 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +22 -8
- package/dist/logger.js.map +1 -1
- package/dist/metadata.d.ts +8 -0
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +60 -22
- package/dist/metadata.js.map +1 -1
- package/dist/navigation-marker.d.ts.map +1 -1
- package/dist/navigation-marker.js +72 -9
- package/dist/navigation-marker.js.map +1 -1
- package/dist/navigation.d.ts +1 -0
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +1 -1
- package/dist/navigation.js.map +1 -1
- package/dist/node-server.d.ts +5 -2
- package/dist/node-server.d.ts.map +1 -1
- package/dist/node-server.js +75 -6
- package/dist/node-server.js.map +1 -1
- package/dist/prerender-entry.d.ts +14 -0
- package/dist/prerender-entry.d.ts.map +1 -1
- package/dist/prerender-entry.js +40 -3
- package/dist/prerender-entry.js.map +1 -1
- package/dist/render.d.ts +9 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +102 -123
- package/dist/render.js.map +1 -1
- package/dist/serve.d.ts +8 -2
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +22 -20
- package/dist/serve.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +52 -19
- package/dist/session.js.map +1 -1
- package/dist/upgrade.d.ts +59 -2
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +282 -1
- package/dist/upgrade.js.map +1 -1
- package/dist/vite-config.d.ts +2 -0
- package/dist/vite-config.d.ts.map +1 -1
- package/dist/vite-config.js +2 -0
- package/dist/vite-config.js.map +1 -1
- package/dist/vite.d.ts +4 -1
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +117 -6
- package/dist/vite.js.map +1 -1
- package/package.json +11 -11
- package/src/actions.ts +81 -11
- package/src/adapters/aws-lambda.ts +426 -115
- package/src/adapters/cloudflare.ts +29 -13
- package/src/adapters/edge.ts +2 -0
- package/src/adapters/node.ts +8 -10
- package/src/adapters/static.ts +31 -2
- package/src/build.ts +117 -10
- package/src/built-runtime.ts +28 -0
- package/src/cache.ts +262 -15
- package/src/cli.ts +14 -1
- package/src/client.ts +32 -1
- package/src/config.ts +43 -6
- package/src/csp.ts +14 -11
- package/src/dehydrate-policy.ts +23 -0
- package/src/dev-server.ts +188 -15
- package/src/http.ts +172 -6
- package/src/index.ts +14 -1
- package/src/logger.ts +47 -10
- package/src/metadata.ts +125 -60
- package/src/navigation-marker.ts +79 -9
- package/src/navigation.ts +1 -1
- package/src/node-server.ts +128 -22
- package/src/prerender-entry.ts +52 -3
- package/src/render.ts +807 -753
- package/src/serve.ts +49 -56
- package/src/session.ts +56 -25
- package/src/upgrade.ts +402 -3
- package/src/vite-config.ts +6 -0
- package/src/vite.ts +157 -5
package/dist/built-runtime.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { DehydrateOptions } from "@reckona/mreact-query";
|
|
1
2
|
import type { BuiltPrerenderedRoute } from "./build.js";
|
|
2
3
|
import type { BuiltServerModuleArtifactRuntime } from "./built-server-module-artifacts.js";
|
|
3
4
|
import type { AppRouterImportPolicy } from "./import-policy.js";
|
|
@@ -9,6 +10,7 @@ export interface BuiltRuntime extends BuiltServerModuleArtifactRuntime {
|
|
|
9
10
|
clientScripts: ReadonlyMap<string, string>;
|
|
10
11
|
clientStylesByFile: ReadonlyMap<string, readonly string[]>;
|
|
11
12
|
clientStyles: ReadonlyMap<string, readonly string[]>;
|
|
13
|
+
dehydrateOptions?: DehydrateOptions | undefined;
|
|
12
14
|
generatedImportPolicy?: AppRouterImportPolicy | undefined;
|
|
13
15
|
hasMiddleware: boolean;
|
|
14
16
|
navigationScripts: ReadonlyMap<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"built-runtime.d.ts","sourceRoot":"","sources":["../src/built-runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"built-runtime.d.ts","sourceRoot":"","sources":["../src/built-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/built-runtime.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
3
|
import { dirname, isAbsolute, join, normalize } from "node:path";
|
|
4
|
+
import { pathToFileURL } from "node:url";
|
|
4
5
|
import { builtClientAssetPaths } from "./built-assets.js";
|
|
6
|
+
import { dehydrateOptionsFromModule } from "./dehydrate-policy.js";
|
|
5
7
|
import { createRouteMatcher } from "./routes.js";
|
|
6
8
|
export async function materializeBuiltRuntime(options) {
|
|
7
9
|
options.onMaterialize?.();
|
|
@@ -61,6 +63,9 @@ export async function materializeBuiltRuntime(options) {
|
|
|
61
63
|
.slice(0, 16);
|
|
62
64
|
const allowedSourceDirs = (serverManifest.allowedSourceDirs ?? [""]).map((directory) => join(projectRoot, directory));
|
|
63
65
|
const generatedImportPolicy = builtGeneratedImportPolicy(options.importPolicyText, options.importPolicyPath);
|
|
66
|
+
const dehydrateOptions = serverManifest.dehydratePolicyModule === undefined
|
|
67
|
+
? undefined
|
|
68
|
+
: await loadBuiltDehydratePolicy(join(options.outDir, "server", safeManifestFilePath(serverManifest.dehydratePolicyModule)), serverManifest.dehydratePolicyModule);
|
|
64
69
|
return {
|
|
65
70
|
appDir: routesDir,
|
|
66
71
|
allowedSourceDirs,
|
|
@@ -71,6 +76,7 @@ export async function materializeBuiltRuntime(options) {
|
|
|
71
76
|
clientScripts,
|
|
72
77
|
clientStylesByFile,
|
|
73
78
|
clientStyles,
|
|
79
|
+
...(dehydrateOptions === undefined ? {} : { dehydrateOptions }),
|
|
74
80
|
...(generatedImportPolicy === undefined ? {} : { generatedImportPolicy }),
|
|
75
81
|
hasMiddleware,
|
|
76
82
|
navigationScripts,
|
|
@@ -97,6 +103,16 @@ export async function materializeBuiltRuntime(options) {
|
|
|
97
103
|
serverSourceFiles,
|
|
98
104
|
};
|
|
99
105
|
}
|
|
106
|
+
async function loadBuiltDehydratePolicy(policyPath, manifestPath) {
|
|
107
|
+
let policyModule;
|
|
108
|
+
try {
|
|
109
|
+
policyModule = await import(pathToFileURL(policyPath).href);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
throw builtArtifactReadError("built app dehydration policy", policyPath, error);
|
|
113
|
+
}
|
|
114
|
+
return dehydrateOptionsFromModule(policyModule, `Built dehydration policy ${manifestPath}`);
|
|
115
|
+
}
|
|
100
116
|
export async function readBuiltImportPolicyText(outDir) {
|
|
101
117
|
const policyPath = join(outDir, "server", "import-policy.json");
|
|
102
118
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"built-runtime.js","sourceRoot":"","sources":["../src/built-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, normalize } from \"node:path\";\nimport type {\n BuiltPrerenderedRoute,\n BuiltServerManifest,\n BuiltServerModuleArtifact,\n} from \"./build.js\";\nimport { builtClientAssetPaths } from \"./built-assets.js\";\nimport type { BuiltServerModuleArtifactRuntime } from \"./built-server-module-artifacts.js\";\nimport type { ClientRouteManifestEntry } from \"./client-route-inference.js\";\nimport type { AppRouterImportPolicy } from \"./import-policy.js\";\nimport { createRouteMatcher, type AppRoute, type RouteMatcher } from \"./routes.js\";\n\nexport interface BuiltRuntime extends BuiltServerModuleArtifactRuntime {\n allowedSourceDirs: readonly string[];\n assetBaseUrl?: string | undefined;\n clientAssetPaths: ReadonlySet<string>;\n clientScripts: ReadonlyMap<string, string>;\n clientStylesByFile: ReadonlyMap<string, readonly string[]>;\n clientStyles: ReadonlyMap<string, readonly string[]>;\n generatedImportPolicy?: AppRouterImportPolicy | undefined;\n hasMiddleware: boolean;\n navigationScripts: ReadonlyMap<string, string>;\n projectRoot: string;\n publicAssetBaseUrl?: string | undefined;\n prerenderableRoutes: ReadonlySet<string>;\n prerenderLocks: Map<string, Promise<{ response: Response; shareable: boolean }>>;\n prerenderedRoutes: Map<string, BuiltPrerenderedRoute>;\n routeMatcher: RouteMatcher;\n routes: readonly AppRoute[];\n serverActionReferencesByFile: ReadonlyMap<\n string,\n readonly {\n end: number;\n expression: string;\n expressionEnd: number;\n expressionStart: number;\n moduleId: string;\n exportName: string;\n inferred: boolean;\n sourceHash: string;\n start: number;\n }[]\n >;\n serverActionManifest?: readonly { moduleId: string; exportName: string; inferred?: boolean }[] | undefined;\n serverModuleCacheVersion: string;\n}\n\nexport async function materializeBuiltRuntime(options: {\n clientManifestText: string;\n clientManifestPath: string;\n importPolicyPath: string;\n importPolicyText: string | undefined;\n onMaterialize?: (() => void) | undefined;\n outDir: string;\n runtimeDir: string;\n serverManifestText: string;\n serverManifestPath: string;\n}): Promise<BuiltRuntime> {\n options.onMaterialize?.();\n const serverManifest = parseBuiltJsonArtifact<BuiltServerManifest>(\n options.serverManifestText,\n options.serverManifestPath,\n \"built app server manifest\",\n );\n const clientManifest = parseBuiltJsonArtifact<{\n assets?: readonly string[];\n routes: ClientRouteManifestEntry[];\n styles?: Array<{ css?: readonly string[]; file: string }>;\n }>(options.clientManifestText, options.clientManifestPath, \"built app client manifest\");\n const appDir = await materializeBuiltServerApp(options.runtimeDir, serverManifest);\n const projectRoot = appDir;\n const routesDir = join(projectRoot, serverManifest.routesDir ?? \"\");\n const routes = serverManifest.routes.map((route) => ({\n ...route,\n file: join(projectRoot, route.file),\n }));\n const prerenderedRoutes = new Map(Object.entries(serverManifest.prerenderedRoutes ?? {}));\n const prerenderableRoutes = new Set(prerenderedRoutes.keys());\n const prerenderLocks = new Map<string, Promise<{ response: Response; shareable: boolean }>>();\n const serverModules = new Map<string, BuiltServerModuleArtifact>(\n Object.entries(serverManifest.serverModules ?? {}).map(([file, artifact]) => [\n join(appDir, file),\n artifact,\n ]),\n );\n const serverModuleClosureFiles = new Map<string, readonly string[]>(\n Object.entries(serverManifest.serverModuleClosureFiles ?? {}).map(([file, closure]) => [\n join(appDir, safeManifestFilePath(file)),\n closure.map((closureFile) => join(appDir, safeManifestFilePath(closureFile))),\n ]),\n );\n const serverModuleFiles = new Map(\n Object.entries(serverManifest.serverModuleFiles ?? {}).map(([file, artifactFile]) => [\n join(appDir, file),\n join(options.outDir, \"server\", safeManifestFilePath(artifactFile)),\n ]),\n );\n const serverModuleRequestFiles = new Map(\n Object.entries(serverManifest.serverModuleRequestFiles ?? {}).map(([file, artifactFile]) => [\n join(appDir, file),\n join(options.outDir, \"server\", safeManifestFilePath(artifactFile)),\n ]),\n );\n const serverModuleRenderFiles = new Map(\n Object.entries(serverManifest.serverModuleRenderFiles ?? {}).map(([file, artifactFile]) => [\n join(appDir, file),\n join(options.outDir, \"server\", safeManifestFilePath(artifactFile)),\n ]),\n );\n const serverSourceFiles = new Map(\n Object.entries(serverManifest.files).map(([file, source]) => [join(appDir, file), source]),\n );\n const serverActionReferencesByFile = new Map(\n Object.entries(serverManifest.routeServerActionReferences ?? {}).map(([file, references]) => [\n join(appDir, file),\n references,\n ]),\n );\n const routeMatcher = createRouteMatcher(routes, serverManifest.routeMatcher);\n const clientScripts = new Map(\n clientManifest.routes.flatMap((route) =>\n route.client && route.script !== undefined ? [[route.path, route.script]] : [],\n ),\n );\n const clientStyles = new Map(\n clientManifest.routes.flatMap((route) =>\n route.css !== undefined && route.css.length > 0 ? [[route.path, route.css]] : [],\n ),\n );\n const clientStylesByFile = new Map(\n (clientManifest.styles ?? []).flatMap((style) =>\n style.css !== undefined && style.css.length > 0\n ? [[join(routesDir, style.file), style.css] as const]\n : [],\n ),\n );\n const navigationScripts = new Map(\n clientManifest.routes.flatMap((route) =>\n route.navigation === true && route.navigationScript !== undefined\n ? [[route.path, route.navigationScript]]\n : [],\n ),\n );\n const hasMiddleware =\n serverSourceFiles.has(join(routesDir, \"middleware.ts\")) ||\n serverSourceFiles.has(join(routesDir, \"middleware.mreact.ts\"));\n const serverModuleCacheVersion = createHash(\"sha256\")\n .update(options.serverManifestText)\n .update(\"\\0\")\n .update(options.clientManifestText)\n .digest(\"hex\")\n .slice(0, 16);\n\n const allowedSourceDirs = (serverManifest.allowedSourceDirs ?? [\"\"]).map((directory) =>\n join(projectRoot, directory),\n );\n const generatedImportPolicy = builtGeneratedImportPolicy(\n options.importPolicyText,\n options.importPolicyPath,\n );\n\n return {\n appDir: routesDir,\n allowedSourceDirs,\n ...(serverManifest.assetBaseUrl === undefined\n ? {}\n : { assetBaseUrl: serverManifest.assetBaseUrl }),\n clientAssetPaths: builtClientAssetPaths(clientManifest),\n clientScripts,\n clientStylesByFile,\n clientStyles,\n ...(generatedImportPolicy === undefined ? {} : { generatedImportPolicy }),\n hasMiddleware,\n navigationScripts,\n projectRoot,\n ...(serverManifest.publicAssetBaseUrl === undefined\n ? {}\n : { publicAssetBaseUrl: serverManifest.publicAssetBaseUrl }),\n prerenderableRoutes,\n prerenderLocks,\n prerenderedRoutes,\n routeMatcher,\n routes,\n serverActionReferencesByFile,\n ...(serverManifest.serverActionManifest === undefined\n ? {}\n : { serverActionManifest: serverManifest.serverActionManifest }),\n serverModuleArtifactLoads: new Map(),\n serverModuleClosureFiles,\n serverModuleFiles,\n serverModuleRenderFiles,\n serverModuleRequestFiles,\n serverModules,\n serverModuleCacheVersion,\n serverSourceFiles,\n };\n}\n\nexport async function readBuiltImportPolicyText(outDir: string): Promise<string | undefined> {\n const policyPath = join(outDir, \"server\", \"import-policy.json\");\n\n try {\n return await readFile(policyPath, \"utf8\");\n } catch (error) {\n if (isMissingFileError(error)) {\n return undefined;\n }\n\n throw builtArtifactReadError(\"built app import policy\", policyPath, error);\n }\n}\n\nexport function mergeBuiltRuntimeImportPolicy(\n runtime: BuiltRuntime,\n importPolicy: AppRouterImportPolicy | undefined,\n): AppRouterImportPolicy | undefined {\n const generatedImportPolicy = runtime.generatedImportPolicy;\n\n if (generatedImportPolicy === undefined) {\n return importPolicy;\n }\n\n const allowedPackages = [\n ...new Set([\n ...(generatedImportPolicy.allowedPackages ?? []),\n ...(importPolicy?.allowedPackages ?? []),\n ]),\n ];\n\n return {\n ...(allowedPackages.length === 0 ? {} : { allowedPackages }),\n ...(importPolicy?.allowedSourceDirs === undefined\n ? {}\n : { allowedSourceDirs: importPolicy.allowedSourceDirs }),\n ...(importPolicy?.projectRoot === undefined ? {} : { projectRoot: importPolicy.projectRoot }),\n };\n}\n\nfunction builtGeneratedImportPolicy(\n importPolicyText: string | undefined,\n importPolicyPath: string,\n): AppRouterImportPolicy | undefined {\n if (importPolicyText === undefined) {\n return undefined;\n }\n\n const artifact = parseBuiltJsonArtifact<{\n runtimePackages?: unknown;\n }>(importPolicyText, importPolicyPath, \"built app import policy\");\n const runtimePackages = Array.isArray(artifact.runtimePackages)\n ? artifact.runtimePackages.filter((name): name is string => typeof name === \"string\")\n : [];\n\n return runtimePackages.length === 0 ? undefined : { allowedPackages: runtimePackages };\n}\n\nasync function materializeBuiltServerApp(\n runtimeDir: string,\n manifest: BuiltServerManifest,\n): Promise<string> {\n const appDir = join(runtimeDir, \"app\");\n\n await rm(appDir, { force: true, recursive: true });\n await Promise.all(\n Object.entries(manifest.files).map(async ([file, code]) => {\n const outputFile = join(appDir, safeManifestFilePath(file));\n\n await mkdir(dirname(outputFile), { recursive: true });\n await writeFile(outputFile, code);\n }),\n );\n\n return appDir;\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n\nfunction builtArtifactReadError(label: string, artifactPath: string, error: unknown): Error {\n const prefix = isMissingFileError(error) ? \"Missing\" : \"Unable to read\";\n const detail = error instanceof Error && error.message !== \"\" ? `: ${error.message}` : \"\";\n\n return new Error(`${prefix} ${label}: ${artifactPath}${detail}`, { cause: error });\n}\n\nfunction parseBuiltJsonArtifact<T>(text: string, artifactPath: string, label: string): T {\n try {\n return JSON.parse(text) as T;\n } catch (error) {\n const detail = error instanceof Error && error.message !== \"\" ? `: ${error.message}` : \"\";\n\n throw new Error(`Invalid ${label}: ${artifactPath}${detail}`, { cause: error });\n }\n}\n\nfunction safeManifestFilePath(pathname: string): string {\n const normalized = normalize(pathname);\n\n if (isAbsolute(normalized) || normalized === \"..\" || normalized.startsWith(\"../\")) {\n throw new Error(`Invalid built app manifest file path: ${pathname}`);\n }\n\n return normalized;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"built-runtime.js","sourceRoot":"","sources":["../src/built-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAOzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAI1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAoC,MAAM,aAAa,CAAC;AAsCnF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAU7C;IACC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;IAC1B,MAAM,cAAc,GAAG,sBAAsB,CAC3C,OAAO,CAAC,kBAAkB,EAC1B,OAAO,CAAC,kBAAkB,EAC1B,2BAA2B,CAC5B,CAAC;IACF,MAAM,cAAc,GAAG,sBAAsB,CAI1C,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE,2BAA2B,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACnF,MAAM,WAAW,GAAG,MAAM,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnD,GAAG,KAAK;QACR,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC;KACpC,CAAC,CAAC,CAAC;IACJ,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1F,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,IAAI,GAAG,EAA+D,CAAC;IAC9F,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;QAC3E,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QAClB,QAAQ;KACT,CAAC,CACH,CAAC;IACF,MAAM,wBAAwB,GAAG,IAAI,GAAG,CACtC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;QACrF,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC;KAC9E,CAAC,CACH,CAAC;IACF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC;QACnF,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC;KACnE,CAAC,CACH,CAAC;IACF,MAAM,wBAAwB,GAAG,IAAI,GAAG,CACtC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC;QAC1F,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC;KACnE,CAAC,CACH,CAAC;IACF,MAAM,uBAAuB,GAAG,IAAI,GAAG,CACrC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC;QACzF,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC;KACnE,CAAC,CACH,CAAC;IACF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAC3F,CAAC;IACF,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAC1C,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;QAC3F,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QAClB,UAAU;KACX,CAAC,CACH,CAAC;IACF,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC;IAC7E,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACtC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAC/E,CACF,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACtC,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CACjF,CACF,CAAC;IACF,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAChC,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAC9C,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;QAC7C,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,GAAG,CAAU,CAAC;QACrD,CAAC,CAAC,EAAE,CACP,CACF,CAAC;IACF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACtC,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS;QAC/D,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxC,CAAC,CAAC,EAAE,CACP,CACF,CAAC;IACF,MAAM,aAAa,GACjB,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACvD,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACjE,MAAM,wBAAwB,GAAG,UAAU,CAAC,QAAQ,CAAC;SAClD,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC;SAClC,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC;SAClC,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhB,MAAM,iBAAiB,GAAG,CAAC,cAAc,CAAC,iBAAiB,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACrF,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAC7B,CAAC;IACF,MAAM,qBAAqB,GAAG,0BAA0B,CACtD,OAAO,CAAC,gBAAgB,EACxB,OAAO,CAAC,gBAAgB,CACzB,CAAC;IACF,MAAM,gBAAgB,GACpB,cAAc,CAAC,qBAAqB,KAAK,SAAS;QAChD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,wBAAwB,CAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,oBAAoB,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,EAC1F,cAAc,CAAC,qBAAqB,CACrC,CAAC;IAER,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,iBAAiB;QACjB,GAAG,CAAC,cAAc,CAAC,YAAY,KAAK,SAAS;YAC3C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC,YAAY,EAAE,CAAC;QAClD,gBAAgB,EAAE,qBAAqB,CAAC,cAAc,CAAC;QACvD,aAAa;QACb,kBAAkB;QAClB,YAAY;QACZ,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;QAC/D,GAAG,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC;QACzE,aAAa;QACb,iBAAiB;QACjB,WAAW;QACX,GAAG,CAAC,cAAc,CAAC,kBAAkB,KAAK,SAAS;YACjD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,kBAAkB,EAAE,cAAc,CAAC,kBAAkB,EAAE,CAAC;QAC9D,mBAAmB;QACnB,cAAc;QACd,iBAAiB;QACjB,YAAY;QACZ,MAAM;QACN,4BAA4B;QAC5B,GAAG,CAAC,cAAc,CAAC,oBAAoB,KAAK,SAAS;YACnD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,oBAAoB,EAAE,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAClE,yBAAyB,EAAE,IAAI,GAAG,EAAE;QACpC,wBAAwB;QACxB,iBAAiB;QACjB,uBAAuB;QACvB,wBAAwB;QACxB,aAAa;QACb,wBAAwB;QACxB,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,UAAkB,EAClB,YAAoB;IAEpB,IAAI,YAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,YAAY,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,sBAAsB,CAAC,8BAA8B,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,0BAA0B,CAC/B,YAAY,EACZ,4BAA4B,YAAY,EAAE,CAC3C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,MAAc;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,sBAAsB,CAAC,yBAAyB,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,OAAqB,EACrB,YAA+C;IAE/C,MAAM,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAE5D,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,eAAe,GAAG;QACtB,GAAG,IAAI,GAAG,CAAC;YACT,GAAG,CAAC,qBAAqB,CAAC,eAAe,IAAI,EAAE,CAAC;YAChD,GAAG,CAAC,YAAY,EAAE,eAAe,IAAI,EAAE,CAAC;SACzC,CAAC;KACH,CAAC;IAEF,OAAO;QACL,GAAG,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;QAC5D,GAAG,CAAC,YAAY,EAAE,iBAAiB,KAAK,SAAS;YAC/C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,iBAAiB,EAAE,YAAY,CAAC,iBAAiB,EAAE,CAAC;QAC1D,GAAG,CAAC,YAAY,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,WAAW,EAAE,CAAC;KAC9F,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CACjC,gBAAoC,EACpC,gBAAwB;IAExB,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,sBAAsB,CAEpC,gBAAgB,EAAE,gBAAgB,EAAE,yBAAyB,CAAC,CAAC;IAClE,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC7D,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;QACrF,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,UAAkB,EAClB,QAA6B;IAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAEvC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QAE5D,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACd,KAA4B,CAAC,IAAI,KAAK,QAAQ,CAChD,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa,EAAE,YAAoB,EAAE,KAAc;IACjF,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC;IACxE,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1F,OAAO,IAAI,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,KAAK,YAAY,GAAG,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,sBAAsB,CAAI,IAAY,EAAE,YAAoB,EAAE,KAAa;IAClF,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE1F,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,YAAY,GAAG,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,yCAAyC,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, normalize } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { DehydrateOptions } from \"@reckona/mreact-query\";\nimport type {\n BuiltPrerenderedRoute,\n BuiltServerManifest,\n BuiltServerModuleArtifact,\n} from \"./build.js\";\nimport { builtClientAssetPaths } from \"./built-assets.js\";\nimport type { BuiltServerModuleArtifactRuntime } from \"./built-server-module-artifacts.js\";\nimport type { ClientRouteManifestEntry } from \"./client-route-inference.js\";\nimport type { AppRouterImportPolicy } from \"./import-policy.js\";\nimport { dehydrateOptionsFromModule } from \"./dehydrate-policy.js\";\nimport { createRouteMatcher, type AppRoute, type RouteMatcher } from \"./routes.js\";\n\nexport interface BuiltRuntime extends BuiltServerModuleArtifactRuntime {\n allowedSourceDirs: readonly string[];\n assetBaseUrl?: string | undefined;\n clientAssetPaths: ReadonlySet<string>;\n clientScripts: ReadonlyMap<string, string>;\n clientStylesByFile: ReadonlyMap<string, readonly string[]>;\n clientStyles: ReadonlyMap<string, readonly string[]>;\n dehydrateOptions?: DehydrateOptions | undefined;\n generatedImportPolicy?: AppRouterImportPolicy | undefined;\n hasMiddleware: boolean;\n navigationScripts: ReadonlyMap<string, string>;\n projectRoot: string;\n publicAssetBaseUrl?: string | undefined;\n prerenderableRoutes: ReadonlySet<string>;\n prerenderLocks: Map<string, Promise<{ response: Response; shareable: boolean }>>;\n prerenderedRoutes: Map<string, BuiltPrerenderedRoute>;\n routeMatcher: RouteMatcher;\n routes: readonly AppRoute[];\n serverActionReferencesByFile: ReadonlyMap<\n string,\n readonly {\n end: number;\n expression: string;\n expressionEnd: number;\n expressionStart: number;\n moduleId: string;\n exportName: string;\n inferred: boolean;\n sourceHash: string;\n start: number;\n }[]\n >;\n serverActionManifest?: readonly { moduleId: string; exportName: string; inferred?: boolean }[] | undefined;\n serverModuleCacheVersion: string;\n}\n\nexport async function materializeBuiltRuntime(options: {\n clientManifestText: string;\n clientManifestPath: string;\n importPolicyPath: string;\n importPolicyText: string | undefined;\n onMaterialize?: (() => void) | undefined;\n outDir: string;\n runtimeDir: string;\n serverManifestText: string;\n serverManifestPath: string;\n}): Promise<BuiltRuntime> {\n options.onMaterialize?.();\n const serverManifest = parseBuiltJsonArtifact<BuiltServerManifest>(\n options.serverManifestText,\n options.serverManifestPath,\n \"built app server manifest\",\n );\n const clientManifest = parseBuiltJsonArtifact<{\n assets?: readonly string[];\n routes: ClientRouteManifestEntry[];\n styles?: Array<{ css?: readonly string[]; file: string }>;\n }>(options.clientManifestText, options.clientManifestPath, \"built app client manifest\");\n const appDir = await materializeBuiltServerApp(options.runtimeDir, serverManifest);\n const projectRoot = appDir;\n const routesDir = join(projectRoot, serverManifest.routesDir ?? \"\");\n const routes = serverManifest.routes.map((route) => ({\n ...route,\n file: join(projectRoot, route.file),\n }));\n const prerenderedRoutes = new Map(Object.entries(serverManifest.prerenderedRoutes ?? {}));\n const prerenderableRoutes = new Set(prerenderedRoutes.keys());\n const prerenderLocks = new Map<string, Promise<{ response: Response; shareable: boolean }>>();\n const serverModules = new Map<string, BuiltServerModuleArtifact>(\n Object.entries(serverManifest.serverModules ?? {}).map(([file, artifact]) => [\n join(appDir, file),\n artifact,\n ]),\n );\n const serverModuleClosureFiles = new Map<string, readonly string[]>(\n Object.entries(serverManifest.serverModuleClosureFiles ?? {}).map(([file, closure]) => [\n join(appDir, safeManifestFilePath(file)),\n closure.map((closureFile) => join(appDir, safeManifestFilePath(closureFile))),\n ]),\n );\n const serverModuleFiles = new Map(\n Object.entries(serverManifest.serverModuleFiles ?? {}).map(([file, artifactFile]) => [\n join(appDir, file),\n join(options.outDir, \"server\", safeManifestFilePath(artifactFile)),\n ]),\n );\n const serverModuleRequestFiles = new Map(\n Object.entries(serverManifest.serverModuleRequestFiles ?? {}).map(([file, artifactFile]) => [\n join(appDir, file),\n join(options.outDir, \"server\", safeManifestFilePath(artifactFile)),\n ]),\n );\n const serverModuleRenderFiles = new Map(\n Object.entries(serverManifest.serverModuleRenderFiles ?? {}).map(([file, artifactFile]) => [\n join(appDir, file),\n join(options.outDir, \"server\", safeManifestFilePath(artifactFile)),\n ]),\n );\n const serverSourceFiles = new Map(\n Object.entries(serverManifest.files).map(([file, source]) => [join(appDir, file), source]),\n );\n const serverActionReferencesByFile = new Map(\n Object.entries(serverManifest.routeServerActionReferences ?? {}).map(([file, references]) => [\n join(appDir, file),\n references,\n ]),\n );\n const routeMatcher = createRouteMatcher(routes, serverManifest.routeMatcher);\n const clientScripts = new Map(\n clientManifest.routes.flatMap((route) =>\n route.client && route.script !== undefined ? [[route.path, route.script]] : [],\n ),\n );\n const clientStyles = new Map(\n clientManifest.routes.flatMap((route) =>\n route.css !== undefined && route.css.length > 0 ? [[route.path, route.css]] : [],\n ),\n );\n const clientStylesByFile = new Map(\n (clientManifest.styles ?? []).flatMap((style) =>\n style.css !== undefined && style.css.length > 0\n ? [[join(routesDir, style.file), style.css] as const]\n : [],\n ),\n );\n const navigationScripts = new Map(\n clientManifest.routes.flatMap((route) =>\n route.navigation === true && route.navigationScript !== undefined\n ? [[route.path, route.navigationScript]]\n : [],\n ),\n );\n const hasMiddleware =\n serverSourceFiles.has(join(routesDir, \"middleware.ts\")) ||\n serverSourceFiles.has(join(routesDir, \"middleware.mreact.ts\"));\n const serverModuleCacheVersion = createHash(\"sha256\")\n .update(options.serverManifestText)\n .update(\"\\0\")\n .update(options.clientManifestText)\n .digest(\"hex\")\n .slice(0, 16);\n\n const allowedSourceDirs = (serverManifest.allowedSourceDirs ?? [\"\"]).map((directory) =>\n join(projectRoot, directory),\n );\n const generatedImportPolicy = builtGeneratedImportPolicy(\n options.importPolicyText,\n options.importPolicyPath,\n );\n const dehydrateOptions =\n serverManifest.dehydratePolicyModule === undefined\n ? undefined\n : await loadBuiltDehydratePolicy(\n join(options.outDir, \"server\", safeManifestFilePath(serverManifest.dehydratePolicyModule)),\n serverManifest.dehydratePolicyModule,\n );\n\n return {\n appDir: routesDir,\n allowedSourceDirs,\n ...(serverManifest.assetBaseUrl === undefined\n ? {}\n : { assetBaseUrl: serverManifest.assetBaseUrl }),\n clientAssetPaths: builtClientAssetPaths(clientManifest),\n clientScripts,\n clientStylesByFile,\n clientStyles,\n ...(dehydrateOptions === undefined ? {} : { dehydrateOptions }),\n ...(generatedImportPolicy === undefined ? {} : { generatedImportPolicy }),\n hasMiddleware,\n navigationScripts,\n projectRoot,\n ...(serverManifest.publicAssetBaseUrl === undefined\n ? {}\n : { publicAssetBaseUrl: serverManifest.publicAssetBaseUrl }),\n prerenderableRoutes,\n prerenderLocks,\n prerenderedRoutes,\n routeMatcher,\n routes,\n serverActionReferencesByFile,\n ...(serverManifest.serverActionManifest === undefined\n ? {}\n : { serverActionManifest: serverManifest.serverActionManifest }),\n serverModuleArtifactLoads: new Map(),\n serverModuleClosureFiles,\n serverModuleFiles,\n serverModuleRenderFiles,\n serverModuleRequestFiles,\n serverModules,\n serverModuleCacheVersion,\n serverSourceFiles,\n };\n}\n\nasync function loadBuiltDehydratePolicy(\n policyPath: string,\n manifestPath: string,\n): Promise<DehydrateOptions> {\n let policyModule: unknown;\n try {\n policyModule = await import(pathToFileURL(policyPath).href);\n } catch (error) {\n throw builtArtifactReadError(\"built app dehydration policy\", policyPath, error);\n }\n return dehydrateOptionsFromModule(\n policyModule,\n `Built dehydration policy ${manifestPath}`,\n );\n}\n\nexport async function readBuiltImportPolicyText(outDir: string): Promise<string | undefined> {\n const policyPath = join(outDir, \"server\", \"import-policy.json\");\n\n try {\n return await readFile(policyPath, \"utf8\");\n } catch (error) {\n if (isMissingFileError(error)) {\n return undefined;\n }\n\n throw builtArtifactReadError(\"built app import policy\", policyPath, error);\n }\n}\n\nexport function mergeBuiltRuntimeImportPolicy(\n runtime: BuiltRuntime,\n importPolicy: AppRouterImportPolicy | undefined,\n): AppRouterImportPolicy | undefined {\n const generatedImportPolicy = runtime.generatedImportPolicy;\n\n if (generatedImportPolicy === undefined) {\n return importPolicy;\n }\n\n const allowedPackages = [\n ...new Set([\n ...(generatedImportPolicy.allowedPackages ?? []),\n ...(importPolicy?.allowedPackages ?? []),\n ]),\n ];\n\n return {\n ...(allowedPackages.length === 0 ? {} : { allowedPackages }),\n ...(importPolicy?.allowedSourceDirs === undefined\n ? {}\n : { allowedSourceDirs: importPolicy.allowedSourceDirs }),\n ...(importPolicy?.projectRoot === undefined ? {} : { projectRoot: importPolicy.projectRoot }),\n };\n}\n\nfunction builtGeneratedImportPolicy(\n importPolicyText: string | undefined,\n importPolicyPath: string,\n): AppRouterImportPolicy | undefined {\n if (importPolicyText === undefined) {\n return undefined;\n }\n\n const artifact = parseBuiltJsonArtifact<{\n runtimePackages?: unknown;\n }>(importPolicyText, importPolicyPath, \"built app import policy\");\n const runtimePackages = Array.isArray(artifact.runtimePackages)\n ? artifact.runtimePackages.filter((name): name is string => typeof name === \"string\")\n : [];\n\n return runtimePackages.length === 0 ? undefined : { allowedPackages: runtimePackages };\n}\n\nasync function materializeBuiltServerApp(\n runtimeDir: string,\n manifest: BuiltServerManifest,\n): Promise<string> {\n const appDir = join(runtimeDir, \"app\");\n\n await rm(appDir, { force: true, recursive: true });\n await Promise.all(\n Object.entries(manifest.files).map(async ([file, code]) => {\n const outputFile = join(appDir, safeManifestFilePath(file));\n\n await mkdir(dirname(outputFile), { recursive: true });\n await writeFile(outputFile, code);\n }),\n );\n\n return appDir;\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n\nfunction builtArtifactReadError(label: string, artifactPath: string, error: unknown): Error {\n const prefix = isMissingFileError(error) ? \"Missing\" : \"Unable to read\";\n const detail = error instanceof Error && error.message !== \"\" ? `: ${error.message}` : \"\";\n\n return new Error(`${prefix} ${label}: ${artifactPath}${detail}`, { cause: error });\n}\n\nfunction parseBuiltJsonArtifact<T>(text: string, artifactPath: string, label: string): T {\n try {\n return JSON.parse(text) as T;\n } catch (error) {\n const detail = error instanceof Error && error.message !== \"\" ? `: ${error.message}` : \"\";\n\n throw new Error(`Invalid ${label}: ${artifactPath}${detail}`, { cause: error });\n }\n}\n\nfunction safeManifestFilePath(pathname: string): string {\n const normalized = normalize(pathname);\n\n if (isAbsolute(normalized) || normalized === \"..\" || normalized.startsWith(\"../\")) {\n throw new Error(`Invalid built app manifest file path: ${pathname}`);\n }\n\n return normalized;\n}\n"]}
|
package/dist/cache.d.ts
CHANGED
|
@@ -65,6 +65,8 @@ interface RouteCacheContext {
|
|
|
65
65
|
cache: AppRouterCache;
|
|
66
66
|
cachePolicy?: RouteCachePolicy | undefined;
|
|
67
67
|
closed?: boolean | undefined;
|
|
68
|
+
externalInvalidationOverflowed: boolean;
|
|
69
|
+
externallyInvalidatedPaths: Set<string>;
|
|
68
70
|
revalidatedPaths: Set<string>;
|
|
69
71
|
}
|
|
70
72
|
/**
|
|
@@ -102,7 +104,7 @@ export declare function cacheRouteResponse(options: {
|
|
|
102
104
|
/**
|
|
103
105
|
* Invalidates cached route responses for a normalized app-router path.
|
|
104
106
|
*
|
|
105
|
-
* During a request the invalidation is scoped to that route cache context
|
|
107
|
+
* During a request the invalidation is scoped to that route cache context. Outside a request it is broadcast to every live route cache registered in this process, and later reads wait for their cache's invalidation to finish.
|
|
106
108
|
*/
|
|
107
109
|
export declare function revalidatePath(path: string): void;
|
|
108
110
|
export declare function consumeInvalidations(cache?: AppRouterCache): Promise<void>;
|
package/dist/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/cache.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { responseHeadersContainCspNonce } from "./csp.js";
|
|
3
|
+
const MAX_PENDING_ROUTE_INVALIDATIONS = 1024;
|
|
4
|
+
const cacheInvalidationState = (globalThis.__mreactAppRouterCacheInvalidation ??= createCacheInvalidationState());
|
|
5
|
+
cacheInvalidationState.activeContexts ??= new WeakMap();
|
|
6
|
+
cacheInvalidationState.disabledCaches ??= new WeakSet();
|
|
7
|
+
cacheInvalidationState.storesBeingInvalidated ??= new WeakMap();
|
|
2
8
|
const cacheState = (globalThis.__mreactAppRouterCache ??= {
|
|
3
9
|
activeContexts: [],
|
|
4
|
-
invalidatedPaths: new Set(),
|
|
5
10
|
memoryCache: createMemoryRouteCache(),
|
|
6
11
|
storage: new AsyncLocalStorage(),
|
|
7
12
|
});
|
|
8
13
|
cacheState.storage ??= new AsyncLocalStorage();
|
|
14
|
+
registerRouteCache(cacheState.memoryCache);
|
|
9
15
|
/**
|
|
10
16
|
* Creates an in-memory route response cache for app-router rendering.
|
|
11
17
|
*
|
|
@@ -61,7 +67,7 @@ export function createMemoryRouteCache(options = {}) {
|
|
|
61
67
|
deleteEntry(oldestKey);
|
|
62
68
|
}
|
|
63
69
|
}
|
|
64
|
-
|
|
70
|
+
const cache = {
|
|
65
71
|
deleteByPath(path) {
|
|
66
72
|
const normalizedPath = normalizeRevalidationPath(path);
|
|
67
73
|
const keys = keysByPath.get(normalizedPath);
|
|
@@ -100,6 +106,8 @@ export function createMemoryRouteCache(options = {}) {
|
|
|
100
106
|
}
|
|
101
107
|
},
|
|
102
108
|
};
|
|
109
|
+
registerRouteCache(cache);
|
|
110
|
+
return cache;
|
|
103
111
|
}
|
|
104
112
|
function positiveIntegerOrDefault(value, fallback) {
|
|
105
113
|
return value === undefined || !Number.isInteger(value) || value < 1 ? fallback : value;
|
|
@@ -160,6 +168,10 @@ export function cachedRouteResponse(options) {
|
|
|
160
168
|
return undefined;
|
|
161
169
|
}
|
|
162
170
|
const cache = options.cache ?? cacheState.memoryCache;
|
|
171
|
+
registerRouteCache(cache);
|
|
172
|
+
if (routeCacheIsUnavailable(cache)) {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
163
175
|
await consumeInvalidations(cache);
|
|
164
176
|
const now = options.now ?? Date.now();
|
|
165
177
|
const cached = await cache.get(options.key, now);
|
|
@@ -170,6 +182,9 @@ export function cachedRouteResponse(options) {
|
|
|
170
182
|
return undefined;
|
|
171
183
|
}
|
|
172
184
|
const headers = new Headers(cached.headers ?? {});
|
|
185
|
+
if (responseHeadersContainCspNonce(headers)) {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
173
188
|
headers.set("cache-control", cached.cacheControl);
|
|
174
189
|
if (!headers.has("content-type")) {
|
|
175
190
|
headers.set("content-type", "text/html; charset=utf-8");
|
|
@@ -208,19 +223,29 @@ export async function cacheRouteResponse(options) {
|
|
|
208
223
|
const cacheControl = options.policy.cacheControl;
|
|
209
224
|
const status = options.response.status;
|
|
210
225
|
const contentType = options.response.headers.get("content-type") ?? "text/html; charset=utf-8";
|
|
226
|
+
const cache = options.cache ?? cacheState.memoryCache;
|
|
227
|
+
const normalizedPath = normalizeRevalidationPath(options.path);
|
|
228
|
+
registerRouteCache(cache);
|
|
229
|
+
const invalidatedBeforeStore = routeCachePathWasInvalidatedDuringActiveContext(normalizedPath);
|
|
211
230
|
// A render that read a request header only produced HTML that is correct for
|
|
212
231
|
// that header value. The cache key covers the path and query alone, so the
|
|
213
232
|
// entry cannot be shared; the response is marked uncacheable for downstream
|
|
214
233
|
// shared caches too, which are keyed the same way.
|
|
215
234
|
if (options.headerDependent === true ||
|
|
235
|
+
invalidatedBeforeStore ||
|
|
236
|
+
routeCacheIsUnavailable(cache) ||
|
|
216
237
|
requestCarriesCredentials(options.request) ||
|
|
217
|
-
options.response.headers.has("set-cookie")
|
|
238
|
+
options.response.headers.has("set-cookie") ||
|
|
239
|
+
responseHeadersContainCspNonce(options.response.headers)) {
|
|
218
240
|
const headers = new Headers(options.response.headers);
|
|
219
241
|
headers.set("cache-control", "private, no-store");
|
|
220
242
|
if (!headers.has("content-type")) {
|
|
221
243
|
headers.set("content-type", contentType);
|
|
222
244
|
}
|
|
223
|
-
if (options.headerDependent === true
|
|
245
|
+
if (options.headerDependent === true ||
|
|
246
|
+
invalidatedBeforeStore ||
|
|
247
|
+
routeCacheIsUnavailable(cache) ||
|
|
248
|
+
responseHeadersContainCspNonce(options.response.headers)) {
|
|
224
249
|
headers.set("x-mreact-cache", "DYNAMIC");
|
|
225
250
|
}
|
|
226
251
|
return new Response(body, {
|
|
@@ -245,16 +270,55 @@ export async function cacheRouteResponse(options) {
|
|
|
245
270
|
// the response would let one plain request pin an entry that withholds HSTS
|
|
246
271
|
// from every later secure visitor.
|
|
247
272
|
const hsts = options.strictTransportSecurity;
|
|
248
|
-
await
|
|
273
|
+
await cache.set(options.key, {
|
|
249
274
|
body,
|
|
250
275
|
cacheControl,
|
|
251
276
|
expiresAt: (options.now ?? Date.now()) + options.policy.revalidateSeconds * 1000,
|
|
252
277
|
headers: storedHeaders,
|
|
253
278
|
...(hsts === undefined ? {} : { strictTransportSecurity: hsts }),
|
|
254
|
-
path:
|
|
279
|
+
path: normalizedPath,
|
|
255
280
|
schemaVersion: ROUTE_CACHE_ENTRY_SCHEMA_VERSION,
|
|
256
281
|
status,
|
|
257
282
|
});
|
|
283
|
+
if (routeCachePathWasInvalidatedDuringActiveContext(normalizedPath) ||
|
|
284
|
+
routeCacheIsUnavailable(cache)) {
|
|
285
|
+
beginRouteCacheStoreInvalidation(cache);
|
|
286
|
+
try {
|
|
287
|
+
await cache.deleteByPath(normalizedPath);
|
|
288
|
+
endRouteCacheStoreInvalidation(cache);
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
// The invalidation may have completed before this asynchronous set did.
|
|
292
|
+
// If deleting the late write now fails, replace its exact key with an
|
|
293
|
+
// expired entry so another adapter object backed by the same persistent
|
|
294
|
+
// store cannot replay the stale current-schema value.
|
|
295
|
+
try {
|
|
296
|
+
await cache.set(options.key, {
|
|
297
|
+
body: "",
|
|
298
|
+
cacheControl: "no-store",
|
|
299
|
+
expiresAt: 0,
|
|
300
|
+
headers: {},
|
|
301
|
+
path: normalizedPath,
|
|
302
|
+
schemaVersion: ROUTE_CACHE_ENTRY_SCHEMA_VERSION,
|
|
303
|
+
status: 500,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
// The originating cache object still fails closed below even when the
|
|
308
|
+
// persistent backend rejects both deletion and the tombstone write.
|
|
309
|
+
}
|
|
310
|
+
cacheInvalidationState.disabledCaches.add(cache);
|
|
311
|
+
endRouteCacheStoreInvalidation(cache);
|
|
312
|
+
throw error;
|
|
313
|
+
}
|
|
314
|
+
const headers = new Headers(storedHeaders);
|
|
315
|
+
headers.set("cache-control", "private, no-store");
|
|
316
|
+
headers.set("x-mreact-cache", "DYNAMIC");
|
|
317
|
+
if (!headers.has("content-type")) {
|
|
318
|
+
headers.set("content-type", contentType);
|
|
319
|
+
}
|
|
320
|
+
return new Response(body, { headers, status });
|
|
321
|
+
}
|
|
258
322
|
const headers = new Headers(storedHeaders);
|
|
259
323
|
headers.set("cache-control", cacheControl);
|
|
260
324
|
if (!headers.has("content-type")) {
|
|
@@ -359,7 +423,7 @@ const PUBLIC_ROUTE_CACHE_REQUEST_HEADERS = new Set([
|
|
|
359
423
|
/**
|
|
360
424
|
* Invalidates cached route responses for a normalized app-router path.
|
|
361
425
|
*
|
|
362
|
-
* During a request the invalidation is scoped to that route cache context
|
|
426
|
+
* During a request the invalidation is scoped to that route cache context. Outside a request it is broadcast to every live route cache registered in this process, and later reads wait for their cache's invalidation to finish.
|
|
363
427
|
*/
|
|
364
428
|
export function revalidatePath(path) {
|
|
365
429
|
const normalizedPath = normalizeRevalidationPath(path);
|
|
@@ -368,22 +432,149 @@ export function revalidatePath(path) {
|
|
|
368
432
|
activeContext.revalidatedPaths.add(normalizedPath);
|
|
369
433
|
return;
|
|
370
434
|
}
|
|
371
|
-
|
|
435
|
+
for (const reference of cacheInvalidationState.liveReferences) {
|
|
436
|
+
const cache = reference.deref();
|
|
437
|
+
if (cache === undefined) {
|
|
438
|
+
cacheInvalidationState.liveReferences.delete(reference);
|
|
439
|
+
continue;
|
|
440
|
+
}
|
|
441
|
+
const pendingPaths = cacheInvalidationState.pendingPaths.get(cache);
|
|
442
|
+
if (pendingPaths !== undefined &&
|
|
443
|
+
!cacheInvalidationState.disabledCaches.has(cache) &&
|
|
444
|
+
!pendingPaths.has(normalizedPath)) {
|
|
445
|
+
if (pendingPaths.size >= MAX_PENDING_ROUTE_INVALIDATIONS) {
|
|
446
|
+
pendingPaths.clear();
|
|
447
|
+
cacheInvalidationState.disabledCaches.add(cache);
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
pendingPaths.add(normalizedPath);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
markActiveRouteCacheContextsInvalidated(cache, normalizedPath);
|
|
454
|
+
void startPendingInvalidations(cache).catch(() => { });
|
|
455
|
+
}
|
|
372
456
|
}
|
|
373
457
|
export async function consumeInvalidations(cache = cacheState.memoryCache) {
|
|
374
|
-
|
|
458
|
+
registerRouteCache(cache);
|
|
459
|
+
await startPendingInvalidations(cache);
|
|
460
|
+
}
|
|
461
|
+
function registerRouteCache(cache) {
|
|
462
|
+
if (cacheInvalidationState.registeredCaches.has(cache)) {
|
|
375
463
|
return;
|
|
376
464
|
}
|
|
377
|
-
|
|
465
|
+
cacheInvalidationState.registeredCaches.add(cache);
|
|
466
|
+
cacheInvalidationState.pendingPaths.set(cache, new Set());
|
|
467
|
+
const reference = new WeakRef(cache);
|
|
468
|
+
cacheInvalidationState.liveReferences.add(reference);
|
|
469
|
+
cacheInvalidationState.finalizer.register(cache, reference, reference);
|
|
470
|
+
}
|
|
471
|
+
function startPendingInvalidations(cache) {
|
|
472
|
+
const running = cacheInvalidationState.running.get(cache);
|
|
473
|
+
if (running !== undefined) {
|
|
474
|
+
return running;
|
|
475
|
+
}
|
|
476
|
+
const paths = cacheInvalidationState.pendingPaths.get(cache);
|
|
477
|
+
if (paths === undefined || paths.size === 0) {
|
|
478
|
+
return Promise.resolve();
|
|
479
|
+
}
|
|
480
|
+
const task = drainPendingInvalidations(cache, paths);
|
|
481
|
+
cacheInvalidationState.running.set(cache, task);
|
|
482
|
+
void task
|
|
483
|
+
.finally(() => {
|
|
484
|
+
if (cacheInvalidationState.running.get(cache) === task) {
|
|
485
|
+
cacheInvalidationState.running.delete(cache);
|
|
486
|
+
}
|
|
487
|
+
})
|
|
488
|
+
.catch(() => { });
|
|
489
|
+
return task;
|
|
490
|
+
}
|
|
491
|
+
function createCacheInvalidationState() {
|
|
492
|
+
const liveReferences = new Set();
|
|
493
|
+
return {
|
|
494
|
+
activeContexts: new WeakMap(),
|
|
495
|
+
disabledCaches: new WeakSet(),
|
|
496
|
+
finalizer: new FinalizationRegistry((reference) => {
|
|
497
|
+
liveReferences.delete(reference);
|
|
498
|
+
}),
|
|
499
|
+
liveReferences,
|
|
500
|
+
pendingPaths: new WeakMap(),
|
|
501
|
+
registeredCaches: new WeakSet(),
|
|
502
|
+
running: new WeakMap(),
|
|
503
|
+
storesBeingInvalidated: new WeakMap(),
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
function routeCacheIsUnavailable(cache) {
|
|
507
|
+
return (cacheInvalidationState.disabledCaches.has(cache) ||
|
|
508
|
+
(cacheInvalidationState.storesBeingInvalidated.get(cache) ?? 0) > 0);
|
|
509
|
+
}
|
|
510
|
+
function beginRouteCacheStoreInvalidation(cache) {
|
|
511
|
+
cacheInvalidationState.storesBeingInvalidated.set(cache, (cacheInvalidationState.storesBeingInvalidated.get(cache) ?? 0) + 1);
|
|
512
|
+
}
|
|
513
|
+
function endRouteCacheStoreInvalidation(cache) {
|
|
514
|
+
const remaining = (cacheInvalidationState.storesBeingInvalidated.get(cache) ?? 1) - 1;
|
|
515
|
+
if (remaining <= 0) {
|
|
516
|
+
cacheInvalidationState.storesBeingInvalidated.delete(cache);
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
cacheInvalidationState.storesBeingInvalidated.set(cache, remaining);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
function routeCachePathWasInvalidatedDuringActiveContext(path) {
|
|
523
|
+
const context = activeRouteCacheContext();
|
|
524
|
+
return (context !== undefined &&
|
|
525
|
+
(context.externalInvalidationOverflowed || context.externallyInvalidatedPaths.has(path)));
|
|
526
|
+
}
|
|
527
|
+
function markActiveRouteCacheContextsInvalidated(cache, normalizedPath) {
|
|
528
|
+
for (const context of cacheInvalidationState.activeContexts.get(cache) ?? []) {
|
|
529
|
+
if (cacheInvalidationState.disabledCaches.has(cache)) {
|
|
530
|
+
context.externalInvalidationOverflowed = true;
|
|
531
|
+
context.externallyInvalidatedPaths.clear();
|
|
532
|
+
}
|
|
533
|
+
else if (!context.externallyInvalidatedPaths.has(normalizedPath) &&
|
|
534
|
+
context.externallyInvalidatedPaths.size >= MAX_PENDING_ROUTE_INVALIDATIONS) {
|
|
535
|
+
context.externalInvalidationOverflowed = true;
|
|
536
|
+
context.externallyInvalidatedPaths.clear();
|
|
537
|
+
}
|
|
538
|
+
else {
|
|
539
|
+
context.externallyInvalidatedPaths.add(normalizedPath);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
function registerActiveRouteCacheContext(context) {
|
|
544
|
+
const contexts = cacheInvalidationState.activeContexts.get(context.cache);
|
|
545
|
+
if (contexts === undefined) {
|
|
546
|
+
cacheInvalidationState.activeContexts.set(context.cache, new Set([context]));
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
contexts.add(context);
|
|
550
|
+
}
|
|
551
|
+
function unregisterActiveRouteCacheContext(context) {
|
|
552
|
+
const contexts = cacheInvalidationState.activeContexts.get(context.cache);
|
|
553
|
+
contexts?.delete(context);
|
|
554
|
+
if (contexts?.size === 0) {
|
|
555
|
+
cacheInvalidationState.activeContexts.delete(context.cache);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
async function drainPendingInvalidations(cache, paths) {
|
|
559
|
+
while (paths.size > 0) {
|
|
560
|
+
const path = paths.values().next().value;
|
|
561
|
+
if (path === undefined) {
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
378
564
|
await cache.deleteByPath(path);
|
|
565
|
+
paths.delete(path);
|
|
379
566
|
}
|
|
380
|
-
cacheState.invalidatedPaths.clear();
|
|
381
567
|
}
|
|
382
568
|
export async function withRouteCacheContext(cache, fn) {
|
|
569
|
+
const routeCache = cache ?? cacheState.memoryCache;
|
|
570
|
+
registerRouteCache(routeCache);
|
|
383
571
|
const context = {
|
|
384
|
-
cache:
|
|
572
|
+
cache: routeCache,
|
|
573
|
+
externalInvalidationOverflowed: false,
|
|
574
|
+
externallyInvalidatedPaths: new Set(),
|
|
385
575
|
revalidatedPaths: new Set(),
|
|
386
576
|
};
|
|
577
|
+
registerActiveRouteCacheContext(context);
|
|
387
578
|
return cacheState.storage.run(context, async () => {
|
|
388
579
|
try {
|
|
389
580
|
const value = await fn();
|
|
@@ -397,15 +588,21 @@ export async function withRouteCacheContext(cache, fn) {
|
|
|
397
588
|
}
|
|
398
589
|
finally {
|
|
399
590
|
context.closed = true;
|
|
591
|
+
unregisterActiveRouteCacheContext(context);
|
|
400
592
|
}
|
|
401
593
|
});
|
|
402
594
|
}
|
|
403
595
|
export function beginRouteCacheContext(cache) {
|
|
596
|
+
const routeCache = cache ?? cacheState.memoryCache;
|
|
597
|
+
registerRouteCache(routeCache);
|
|
404
598
|
const context = {
|
|
405
|
-
cache:
|
|
599
|
+
cache: routeCache,
|
|
600
|
+
externalInvalidationOverflowed: false,
|
|
601
|
+
externallyInvalidatedPaths: new Set(),
|
|
406
602
|
revalidatedPaths: new Set(),
|
|
407
603
|
};
|
|
408
604
|
cacheState.activeContexts.push(context);
|
|
605
|
+
registerActiveRouteCacheContext(context);
|
|
409
606
|
return {
|
|
410
607
|
get cachePolicy() {
|
|
411
608
|
return context.cachePolicy;
|
|
@@ -423,6 +620,7 @@ export function beginRouteCacheContext(cache) {
|
|
|
423
620
|
if (index !== -1) {
|
|
424
621
|
cacheState.activeContexts.splice(index, 1);
|
|
425
622
|
}
|
|
623
|
+
unregisterActiveRouteCacheContext(context);
|
|
426
624
|
}
|
|
427
625
|
return { revalidatedPaths };
|
|
428
626
|
},
|