@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.
Files changed (140) hide show
  1. package/README.md +53 -9
  2. package/dist/actions.d.ts +6 -0
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +70 -10
  5. package/dist/actions.js.map +1 -1
  6. package/dist/adapters/aws-lambda.d.ts +15 -4
  7. package/dist/adapters/aws-lambda.d.ts.map +1 -1
  8. package/dist/adapters/aws-lambda.js +301 -63
  9. package/dist/adapters/aws-lambda.js.map +1 -1
  10. package/dist/adapters/cloudflare.d.ts +2 -1
  11. package/dist/adapters/cloudflare.d.ts.map +1 -1
  12. package/dist/adapters/cloudflare.js +18 -10
  13. package/dist/adapters/cloudflare.js.map +1 -1
  14. package/dist/adapters/edge.d.ts +1 -1
  15. package/dist/adapters/edge.d.ts.map +1 -1
  16. package/dist/adapters/edge.js.map +1 -1
  17. package/dist/adapters/node.d.ts +5 -3
  18. package/dist/adapters/node.d.ts.map +1 -1
  19. package/dist/adapters/node.js +2 -1
  20. package/dist/adapters/node.js.map +1 -1
  21. package/dist/adapters/static.d.ts.map +1 -1
  22. package/dist/adapters/static.js +24 -2
  23. package/dist/adapters/static.js.map +1 -1
  24. package/dist/build.d.ts +1 -0
  25. package/dist/build.d.ts.map +1 -1
  26. package/dist/build.js +91 -5
  27. package/dist/build.js.map +1 -1
  28. package/dist/built-runtime.d.ts +2 -0
  29. package/dist/built-runtime.d.ts.map +1 -1
  30. package/dist/built-runtime.js +16 -0
  31. package/dist/built-runtime.js.map +1 -1
  32. package/dist/cache.d.ts +3 -1
  33. package/dist/cache.d.ts.map +1 -1
  34. package/dist/cache.js +211 -13
  35. package/dist/cache.js.map +1 -1
  36. package/dist/cli.js +12 -1
  37. package/dist/cli.js.map +1 -1
  38. package/dist/client.d.ts.map +1 -1
  39. package/dist/client.js +32 -1
  40. package/dist/client.js.map +1 -1
  41. package/dist/config.d.ts +3 -0
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js +21 -2
  44. package/dist/config.js.map +1 -1
  45. package/dist/csp.d.ts +1 -0
  46. package/dist/csp.d.ts.map +1 -1
  47. package/dist/csp.js +11 -6
  48. package/dist/csp.js.map +1 -1
  49. package/dist/dehydrate-policy.d.ts +3 -0
  50. package/dist/dehydrate-policy.d.ts.map +1 -0
  51. package/dist/dehydrate-policy.js +16 -0
  52. package/dist/dehydrate-policy.js.map +1 -0
  53. package/dist/dev-server.d.ts +7 -2
  54. package/dist/dev-server.d.ts.map +1 -1
  55. package/dist/dev-server.js +120 -11
  56. package/dist/dev-server.js.map +1 -1
  57. package/dist/http.d.ts +1 -1
  58. package/dist/http.d.ts.map +1 -1
  59. package/dist/http.js +147 -7
  60. package/dist/http.js.map +1 -1
  61. package/dist/index.d.ts +4 -3
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +1 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/logger.d.ts +22 -1
  66. package/dist/logger.d.ts.map +1 -1
  67. package/dist/logger.js +22 -8
  68. package/dist/logger.js.map +1 -1
  69. package/dist/metadata.d.ts +8 -0
  70. package/dist/metadata.d.ts.map +1 -1
  71. package/dist/metadata.js +60 -22
  72. package/dist/metadata.js.map +1 -1
  73. package/dist/navigation-marker.d.ts.map +1 -1
  74. package/dist/navigation-marker.js +72 -9
  75. package/dist/navigation-marker.js.map +1 -1
  76. package/dist/navigation.d.ts +1 -0
  77. package/dist/navigation.d.ts.map +1 -1
  78. package/dist/navigation.js +1 -1
  79. package/dist/navigation.js.map +1 -1
  80. package/dist/node-server.d.ts +5 -2
  81. package/dist/node-server.d.ts.map +1 -1
  82. package/dist/node-server.js +75 -6
  83. package/dist/node-server.js.map +1 -1
  84. package/dist/prerender-entry.d.ts +14 -0
  85. package/dist/prerender-entry.d.ts.map +1 -1
  86. package/dist/prerender-entry.js +40 -3
  87. package/dist/prerender-entry.js.map +1 -1
  88. package/dist/render.d.ts +9 -1
  89. package/dist/render.d.ts.map +1 -1
  90. package/dist/render.js +102 -123
  91. package/dist/render.js.map +1 -1
  92. package/dist/serve.d.ts +8 -2
  93. package/dist/serve.d.ts.map +1 -1
  94. package/dist/serve.js +22 -20
  95. package/dist/serve.js.map +1 -1
  96. package/dist/session.d.ts.map +1 -1
  97. package/dist/session.js +52 -19
  98. package/dist/session.js.map +1 -1
  99. package/dist/upgrade.d.ts +59 -2
  100. package/dist/upgrade.d.ts.map +1 -1
  101. package/dist/upgrade.js +282 -1
  102. package/dist/upgrade.js.map +1 -1
  103. package/dist/vite-config.d.ts +2 -0
  104. package/dist/vite-config.d.ts.map +1 -1
  105. package/dist/vite-config.js +2 -0
  106. package/dist/vite-config.js.map +1 -1
  107. package/dist/vite.d.ts +4 -1
  108. package/dist/vite.d.ts.map +1 -1
  109. package/dist/vite.js +117 -6
  110. package/dist/vite.js.map +1 -1
  111. package/package.json +11 -11
  112. package/src/actions.ts +81 -11
  113. package/src/adapters/aws-lambda.ts +426 -115
  114. package/src/adapters/cloudflare.ts +29 -13
  115. package/src/adapters/edge.ts +2 -0
  116. package/src/adapters/node.ts +8 -10
  117. package/src/adapters/static.ts +31 -2
  118. package/src/build.ts +117 -10
  119. package/src/built-runtime.ts +28 -0
  120. package/src/cache.ts +262 -15
  121. package/src/cli.ts +14 -1
  122. package/src/client.ts +32 -1
  123. package/src/config.ts +43 -6
  124. package/src/csp.ts +14 -11
  125. package/src/dehydrate-policy.ts +23 -0
  126. package/src/dev-server.ts +188 -15
  127. package/src/http.ts +172 -6
  128. package/src/index.ts +14 -1
  129. package/src/logger.ts +47 -10
  130. package/src/metadata.ts +125 -60
  131. package/src/navigation-marker.ts +79 -9
  132. package/src/navigation.ts +1 -1
  133. package/src/node-server.ts +128 -22
  134. package/src/prerender-entry.ts +52 -3
  135. package/src/render.ts +807 -753
  136. package/src/serve.ts +49 -56
  137. package/src/session.ts +56 -25
  138. package/src/upgrade.ts +402 -3
  139. package/src/vite-config.ts +6 -0
  140. package/src/vite.ts +157 -5
@@ -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":"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"}
1
+ {"version":3,"file":"built-runtime.d.ts","sourceRoot":"","sources":["../src/built-runtime.ts"],"names":[],"mappings":"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"}
@@ -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":"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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 { 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; outside a request it is queued for the next cache access.
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>;
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
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
- return {
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 (options.cache ?? cacheState.memoryCache).set(options.key, {
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: normalizeRevalidationPath(options.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; outside a request it is queued for the next cache access.
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
- cacheState.invalidatedPaths.add(normalizedPath);
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
- if (cacheState.invalidatedPaths.size === 0) {
458
+ registerRouteCache(cache);
459
+ await startPendingInvalidations(cache);
460
+ }
461
+ function registerRouteCache(cache) {
462
+ if (cacheInvalidationState.registeredCaches.has(cache)) {
375
463
  return;
376
464
  }
377
- for (const path of cacheState.invalidatedPaths) {
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: cache ?? cacheState.memoryCache,
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: cache ?? cacheState.memoryCache,
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
  },