@ecopages/core 0.2.0-beta.4 → 0.2.0-beta.40

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 (611) hide show
  1. package/README.md +40 -9
  2. package/package.json +371 -33
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +115 -6
  5. package/src/adapters/abstract/application-adapter.js +261 -120
  6. package/src/adapters/abstract/router-adapter.js +12 -4
  7. package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
  8. package/src/adapters/abstract/segment-path-matcher.js +147 -0
  9. package/src/adapters/abstract/server-adapter.d.ts +16 -2
  10. package/src/adapters/abstract/server-adapter.js +22 -14
  11. package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
  12. package/src/adapters/abstract/ws-pattern-matcher.js +28 -0
  13. package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
  14. package/src/adapters/bun/bun-user-websocket-lifecycle.js +93 -0
  15. package/src/adapters/bun/client-bridge.d.ts +1 -0
  16. package/src/adapters/bun/client-bridge.js +51 -47
  17. package/src/adapters/bun/create-app.d.ts +9 -6
  18. package/src/adapters/bun/create-app.js +171 -130
  19. package/src/adapters/bun/hmr-manager.d.ts +1 -1
  20. package/src/adapters/bun/hmr-manager.js +62 -57
  21. package/src/adapters/bun/index.d.ts +1 -1
  22. package/src/adapters/bun/index.js +2 -8
  23. package/src/adapters/bun/runtime-host.d.ts +1 -1
  24. package/src/adapters/bun/runtime-host.js +61 -54
  25. package/src/adapters/bun/server-adapter.d.ts +91 -41
  26. package/src/adapters/bun/server-adapter.js +566 -426
  27. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  28. package/src/adapters/bun/static-preview-host.js +43 -41
  29. package/src/adapters/create-app.d.ts +13 -11
  30. package/src/adapters/create-app.js +11 -63
  31. package/src/adapters/index.d.ts +2 -2
  32. package/src/adapters/index.js +2 -8
  33. package/src/adapters/node/create-app.d.ts +8 -3
  34. package/src/adapters/node/create-app.js +126 -84
  35. package/src/adapters/node/http-request-bridge.js +147 -106
  36. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  37. package/src/adapters/node/node-client-bridge.js +62 -61
  38. package/src/adapters/node/node-hmr-manager.d.ts +1 -1
  39. package/src/adapters/node/node-hmr-manager.js +58 -48
  40. package/src/adapters/node/runtime-host.d.ts +1 -1
  41. package/src/adapters/node/runtime-host.js +96 -89
  42. package/src/adapters/node/server-adapter-dependencies.js +18 -17
  43. package/src/adapters/node/server-adapter.d.ts +63 -23
  44. package/src/adapters/node/server-adapter.js +346 -297
  45. package/src/adapters/node/static-content-server.d.ts +1 -0
  46. package/src/adapters/node/static-content-server.js +172 -183
  47. package/src/adapters/node/static-preview-host.d.ts +1 -1
  48. package/src/adapters/node/static-preview-host.js +88 -64
  49. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  50. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  51. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  52. package/src/adapters/shared/hmr/hmr-html-response.js +50 -0
  53. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +92 -0
  54. package/src/adapters/shared/hmr/shared-hmr-manager.js +446 -0
  55. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  56. package/src/adapters/shared/http/api-request-pipeline.js +132 -0
  57. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  58. package/src/adapters/shared/http/api-response.js +79 -0
  59. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  60. package/src/adapters/shared/http/create-body-response.js +26 -0
  61. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  62. package/src/adapters/shared/http/define-api-handler.js +49 -0
  63. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  64. package/src/adapters/shared/http/explicit-static-render-preparation.js +29 -0
  65. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  66. package/src/adapters/shared/http/explicit-static-route-matcher.js +59 -0
  67. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  68. package/src/adapters/shared/http/file-route-middleware-pipeline.js +84 -0
  69. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  70. package/src/adapters/shared/http/fs-server-response-factory.js +106 -0
  71. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  72. package/src/adapters/shared/http/fs-server-response-matcher.js +258 -0
  73. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  74. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  75. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  76. package/src/adapters/shared/runtime/application-adapter.js +75 -0
  77. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.d.ts +11 -0
  78. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.js +29 -0
  79. package/src/adapters/shared/runtime/copy-runtime-public-dir.d.ts +6 -0
  80. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +27 -0
  81. package/src/adapters/shared/runtime/dev-static-route-prewarm.d.ts +16 -0
  82. package/src/adapters/shared/runtime/dev-static-route-prewarm.js +66 -0
  83. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  84. package/src/adapters/shared/runtime/port-manager.js +226 -0
  85. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  86. package/src/adapters/shared/runtime/render-context.js +99 -0
  87. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -3
  88. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +38 -0
  89. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +45 -0
  90. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +71 -0
  91. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +31 -50
  92. package/src/adapters/shared/runtime/server-adapter.js +301 -0
  93. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  94. package/src/adapters/shared/runtime/server-route-handler.js +77 -0
  95. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +27 -35
  96. package/src/adapters/shared/runtime/server-static-builder.js +172 -0
  97. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  98. package/src/adapters/shared/ws/node-http-websocket-upgrades.d.ts +21 -0
  99. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +109 -0
  100. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  101. package/src/adapters/shared/ws/websocket-lifecycle.js +62 -0
  102. package/src/build/README.md +191 -31
  103. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  104. package/src/build/app-build-manifest-runtime.js +145 -0
  105. package/src/build/browser/browser-runtime-manifest.js +58 -0
  106. package/src/build/browser/browser-runtime-plugin-helpers.js +34 -0
  107. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
  108. package/src/build/browser/browser-runtime-plugin.js +216 -0
  109. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  110. package/src/build/browser/jsx-ownership-plugins.js +55 -0
  111. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  112. package/src/build/browser/lit-static-render-worker-context.js +4 -0
  113. package/src/build/build-adapter.d.ts +29 -334
  114. package/src/build/build-adapter.js +273 -237
  115. package/src/build/cache/build-input-fingerprint.d.ts +28 -0
  116. package/src/build/cache/build-input-fingerprint.js +33 -0
  117. package/src/build/cache/cache-constants.d.ts +4 -0
  118. package/src/build/cache/cache-constants.js +4 -0
  119. package/src/build/cache/cache-keys.d.ts +22 -0
  120. package/src/build/cache/cache-keys.js +71 -0
  121. package/src/build/cache/pages-unified-graph-build.d.ts +31 -0
  122. package/src/build/cache/pages-unified-graph-build.js +199 -0
  123. package/src/build/cache/production-build-cache.d.ts +21 -0
  124. package/src/build/cache/production-build-cache.js +56 -0
  125. package/src/build/cache/server-entry-build-cache.d.ts +43 -0
  126. package/src/build/cache/server-entry-build-cache.js +153 -0
  127. package/src/build/contracts/build-contracts.d.ts +96 -0
  128. package/src/build/contracts/build-contracts.js +1 -0
  129. package/src/build/contracts/build-manifest.d.ts +90 -0
  130. package/src/build/contracts/build-manifest.js +64 -0
  131. package/src/build/contracts/build-types.js +1 -0
  132. package/src/build/contracts/content-virtual-modules.d.ts +12 -0
  133. package/src/build/contracts/content-virtual-modules.js +29 -0
  134. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +32 -9
  135. package/src/build/rolldown/rolldown-adapter-helpers.js +458 -0
  136. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  137. package/src/build/rolldown/rolldown-build-adapter.js +57 -0
  138. package/src/build/rolldown/rolldown-build-invocation-metrics.d.ts +12 -0
  139. package/src/build/rolldown/rolldown-build-invocation-metrics.js +39 -0
  140. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
  141. package/src/build/rolldown/rolldown-plugin-bridge.js +284 -0
  142. package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
  143. package/src/build/rolldown/rolldown-source-transform-pass.js +70 -0
  144. package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -0
  145. package/src/build/rolldown/runtime-build-output-normalizer.js +253 -0
  146. package/src/build/rolldown/server-side-css-shim-plugin.js +58 -0
  147. package/src/build/runtime/build-profile-options.d.ts +7 -0
  148. package/src/build/runtime/build-profile-options.js +37 -0
  149. package/src/build/runtime/build-request-identity.d.ts +17 -0
  150. package/src/build/runtime/build-request-identity.js +79 -0
  151. package/src/build/runtime/build-request-policy.d.ts +58 -0
  152. package/src/build/runtime/build-request-policy.js +84 -0
  153. package/src/build/runtime/build-runtime.d.ts +28 -0
  154. package/src/build/runtime/build-runtime.js +75 -0
  155. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  156. package/src/build/runtime/deduping-build-executor.js +40 -0
  157. package/src/build/runtime/parallel-build-executor.d.ts +21 -0
  158. package/src/build/runtime/parallel-build-executor.js +60 -0
  159. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  160. package/src/build/runtime/serialized-build-executor.js +79 -0
  161. package/src/cache/index.d.ts +2 -1
  162. package/src/cache/index.js +7 -6
  163. package/src/cache/module-parse-cache.d.ts +5 -0
  164. package/src/cache/module-parse-cache.js +122 -67
  165. package/src/cache/module-transform-profiler.d.ts +8 -0
  166. package/src/cache/module-transform-profiler.js +8 -0
  167. package/src/client/navigation-scripts/classification.d.ts +16 -0
  168. package/src/client/navigation-scripts/classification.js +49 -0
  169. package/src/client/navigation-scripts/index.d.ts +3 -0
  170. package/src/client/navigation-scripts/index.js +3 -0
  171. package/src/client/navigation-scripts/navigation-scripts.test.browser.d.ts +1 -0
  172. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +61 -0
  173. package/src/client/navigation-scripts/registry.d.ts +11 -0
  174. package/src/client/navigation-scripts/registry.js +16 -0
  175. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  176. package/src/client/navigation-scripts/rerun-queue.js +90 -0
  177. package/src/client/scroll.d.ts +17 -0
  178. package/src/client/scroll.js +33 -0
  179. package/src/client/scroll.test.browser.d.ts +1 -0
  180. package/src/client/scroll.test.browser.js +31 -0
  181. package/src/client/view-transitions.d.ts +32 -0
  182. package/src/client/view-transitions.js +120 -0
  183. package/src/client/view-transitions.test.browser.d.ts +1 -0
  184. package/src/client/view-transitions.test.browser.js +56 -0
  185. package/src/config/config-builder.d.ts +40 -10
  186. package/src/config/config-builder.js +647 -600
  187. package/src/config/constants.d.ts +1 -0
  188. package/src/config/constants.js +44 -23
  189. package/src/declarations.d.ts +1 -0
  190. package/src/dev/README.md +24 -0
  191. package/src/dev/client-bridge-registry.d.ts +5 -0
  192. package/src/dev/client-bridge-registry.js +10 -0
  193. package/src/dev/dev-client-ownership.d.ts +7 -0
  194. package/src/dev/dev-client-ownership.js +8 -0
  195. package/src/dev/hmr-manager-registry.d.ts +8 -0
  196. package/src/dev/hmr-manager-registry.js +10 -0
  197. package/src/dev/host-runtime.d.ts +3 -0
  198. package/src/dev/host-runtime.js +25 -23
  199. package/src/dev/runtime-server-started-message.d.ts +2 -0
  200. package/src/dev/runtime-server-started-message.js +3 -0
  201. package/src/dev/sc-server.js +106 -103
  202. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  203. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  204. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  205. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  206. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  207. package/src/dev/transform-server/dev-transform-import-rewriter.js +126 -0
  208. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  209. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  210. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  211. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  212. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  213. package/src/dev/transform-server/dev-transform-server.js +191 -0
  214. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  215. package/src/dev/transform-server/dev-transform-url.js +58 -0
  216. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +28 -0
  217. package/src/dev/transform-server/dev-transform-vendor-registry.js +158 -0
  218. package/src/dev/transform-server/index.d.ts +6 -0
  219. package/src/dev/transform-server/index.js +4 -0
  220. package/src/dev/transform-server/types.d.ts +15 -0
  221. package/src/dev/transform-server/types.js +1 -0
  222. package/src/dev-toolbar/README.md +52 -0
  223. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  224. package/src/dev-toolbar/define-dev-tool.js +9 -0
  225. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  226. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  227. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  228. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  229. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  230. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  231. package/src/dev-toolbar/dev-toolbar-manifest-contract.d.ts +22 -0
  232. package/src/dev-toolbar/dev-toolbar-manifest-contract.js +2 -0
  233. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  234. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  235. package/src/dev-toolbar/dev-toolbar-package.d.ts +34 -0
  236. package/src/dev-toolbar/dev-toolbar-package.js +78 -0
  237. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  238. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  239. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  240. package/src/diagnostics/request-build-dedupe.js +39 -0
  241. package/src/diagnostics/request-pipeline-metrics.d.ts +38 -0
  242. package/src/diagnostics/request-pipeline-metrics.js +121 -0
  243. package/src/diagnostics/startup-trace.d.ts +81 -0
  244. package/src/diagnostics/startup-trace.js +281 -0
  245. package/src/eco/README.md +17 -0
  246. package/src/eco/component-identity.d.ts +13 -0
  247. package/src/eco/component-identity.js +18 -0
  248. package/src/eco/eco-declared-component.d.ts +15 -0
  249. package/src/eco/eco-declared-component.js +23 -0
  250. package/src/eco/eco.browser.js +63 -70
  251. package/src/eco/eco.js +163 -97
  252. package/src/eco/eco.types.d.ts +47 -8
  253. package/src/eco/eco.types.js +5 -0
  254. package/src/eco/eco.utils.d.ts +1 -1
  255. package/src/eco/eco.utils.js +1 -10
  256. package/src/eco/global-injector-map.js +55 -41
  257. package/src/eco/lazy-injector-map.js +90 -60
  258. package/src/eco/module-dependencies.js +52 -44
  259. package/src/eco/page-layout-normalization.d.ts +21 -0
  260. package/src/eco/page-layout-normalization.js +69 -0
  261. package/src/env.d.ts +2 -0
  262. package/src/errors/http-error.d.ts +8 -0
  263. package/src/errors/http-error.js +66 -49
  264. package/src/errors/index.d.ts +1 -0
  265. package/src/errors/index.js +3 -6
  266. package/src/errors/locals-access-error.js +5 -8
  267. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  268. package/src/errors/undeclared-component-dependency-error.js +17 -0
  269. package/src/global/app-logger.js +3 -6
  270. package/src/hmr/README.md +21 -0
  271. package/src/hmr/client/hmr-runtime.js +119 -110
  272. package/src/hmr/client/module-update.d.ts +13 -0
  273. package/src/hmr/client/module-update.js +39 -0
  274. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  275. package/src/hmr/hmr-asset-paths.js +22 -0
  276. package/src/hmr/hmr-entrypoint-output.d.ts +21 -0
  277. package/src/hmr/hmr-entrypoint-output.js +34 -0
  278. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  279. package/src/hmr/hmr-file-change-prep.js +14 -0
  280. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  281. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  282. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  283. package/src/hmr/hmr-runtime-paths.js +13 -0
  284. package/src/hmr/hmr-strategy.d.ts +9 -0
  285. package/src/hmr/hmr-strategy.js +113 -42
  286. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  287. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -97
  288. package/src/hmr/strategies/js-hmr-strategy.js +107 -167
  289. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  290. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +35 -0
  291. package/src/index.browser.d.ts +1 -0
  292. package/src/index.browser.js +2 -4
  293. package/src/index.d.ts +4 -1
  294. package/src/index.js +7 -21
  295. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  296. package/src/integrations/ghtml/ghtml-renderer.js +12 -56
  297. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  298. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  299. package/src/integrations/ghtml/ghtml.plugin.js +10 -20
  300. package/src/islands/README.md +25 -0
  301. package/src/islands/island-host.d.ts +37 -0
  302. package/src/islands/island-host.js +55 -0
  303. package/src/plugins/README.md +2 -1
  304. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  305. package/src/plugins/alias-resolver-cache.js +114 -97
  306. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  307. package/src/plugins/alias-resolver-plugin.js +35 -62
  308. package/src/plugins/define-integration.d.ts +26 -0
  309. package/src/plugins/define-integration.js +20 -0
  310. package/src/plugins/eco-component-meta-plugin.d.ts +6 -102
  311. package/src/plugins/eco-component-meta-plugin.js +120 -162
  312. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  313. package/src/plugins/foreign-jsx-override-plugin.js +49 -37
  314. package/src/plugins/integration-plugin.d.ts +43 -14
  315. package/src/plugins/integration-plugin.js +212 -190
  316. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  317. package/src/plugins/jsx-import-source.utils.js +21 -0
  318. package/src/plugins/processor.d.ts +71 -12
  319. package/src/plugins/processor.js +168 -130
  320. package/src/plugins/runtime-capability.js +1 -0
  321. package/src/plugins/source-transform.d.ts +32 -1
  322. package/src/plugins/source-transform.js +112 -60
  323. package/src/plugins/tsconfig-import-resolver.d.ts +35 -0
  324. package/src/plugins/tsconfig-import-resolver.js +235 -0
  325. package/src/route-renderer/GRAPH.md +26 -32
  326. package/src/route-renderer/README.md +54 -33
  327. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  328. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +155 -0
  329. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  330. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +37 -0
  331. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  332. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +196 -0
  333. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +17 -7
  334. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +191 -0
  335. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  336. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +354 -0
  337. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  338. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +36 -0
  339. package/src/route-renderer/orchestration/integration-renderer.d.ts +41 -151
  340. package/src/route-renderer/orchestration/integration-renderer.js +798 -988
  341. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  342. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +173 -0
  343. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  344. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +132 -0
  345. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  346. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +89 -0
  347. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +6 -2
  348. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +77 -0
  349. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  350. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +30 -0
  351. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.d.ts +15 -0
  352. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.js +9 -0
  353. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.d.ts +5 -0
  354. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.js +30 -0
  355. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  356. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +32 -0
  357. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +126 -0
  358. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +542 -0
  359. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +47 -0
  360. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +232 -0
  361. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  362. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +23 -0
  363. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.d.ts +29 -0
  364. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.js +54 -0
  365. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +38 -0
  366. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +26 -0
  367. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  368. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +25 -0
  369. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  370. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +43 -0
  371. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +25 -0
  372. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +44 -0
  373. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +26 -0
  374. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +49 -0
  375. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  376. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +30 -0
  377. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +24 -54
  378. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +215 -0
  379. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  380. package/src/route-renderer/orchestration/string-markup-renderer.js +52 -0
  381. package/src/route-renderer/page-loading/component-dependency-collection.js +121 -121
  382. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  383. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  384. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +1 -0
  385. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +64 -51
  386. package/src/route-renderer/page-loading/file-scoped-dependency-components.d.ts +42 -0
  387. package/src/route-renderer/page-loading/file-scoped-dependency-components.js +94 -0
  388. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  389. package/src/route-renderer/page-loading/lazy-trigger-planning.js +47 -36
  390. package/src/route-renderer/page-loading/module-declaration-aggregation.js +39 -28
  391. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  392. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  393. package/src/route-renderer/page-loading/page-module-loader.d.ts +2 -1
  394. package/src/route-renderer/page-loading/page-module-loader.js +136 -124
  395. package/src/route-renderer/page-loading/resolved-page-dependencies.d.ts +12 -0
  396. package/src/route-renderer/page-loading/resolved-page-dependencies.js +38 -0
  397. package/src/route-renderer/route-renderer.js +74 -76
  398. package/src/router/README.md +31 -0
  399. package/src/router/client/link-intent.d.ts +11 -21
  400. package/src/router/client/link-intent.js +56 -30
  401. package/src/router/client/link-intent.test.browser.js +50 -39
  402. package/src/router/client/link-navigation-policy.d.ts +45 -0
  403. package/src/router/client/link-navigation-policy.js +122 -0
  404. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  405. package/src/router/client/link-navigation-policy.test.browser.js +82 -0
  406. package/src/router/client/navigation-coordinator.d.ts +1 -1
  407. package/src/router/client/navigation-coordinator.js +235 -201
  408. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  409. package/src/router/client/navigation-lifecycle.js +50 -0
  410. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  411. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  412. package/src/router/server/route-registry.js +237 -242
  413. package/src/services/README.md +5 -0
  414. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  415. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -50
  416. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +7 -1
  417. package/src/services/assets/asset-processing-service/asset-processing.service.js +308 -268
  418. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  419. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  420. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  421. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -1
  422. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -45
  423. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  424. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +115 -0
  425. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  426. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -38
  427. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  428. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +5 -0
  429. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  430. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +85 -60
  431. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  432. package/src/services/assets/asset-processing-service/index.js +8 -6
  433. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  434. package/src/services/assets/asset-processing-service/inline-content-script-body.js +23 -0
  435. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  436. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +22 -0
  437. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  438. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  439. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  440. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  441. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  442. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -130
  443. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  444. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  445. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +111 -111
  446. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  447. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -94
  448. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -121
  449. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  450. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +26 -57
  451. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  452. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +33 -67
  453. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  454. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +44 -0
  455. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  456. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +15 -0
  457. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  458. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -44
  459. package/src/services/assets/browser-bundle.service.d.ts +28 -30
  460. package/src/services/assets/browser-bundle.service.js +54 -40
  461. package/src/services/cache/cache.types.d.ts +4 -2
  462. package/src/services/cache/cache.types.js +5 -0
  463. package/src/services/cache/html-page-cache-dependency-index.d.ts +34 -0
  464. package/src/services/cache/html-page-cache-dependency-index.js +88 -0
  465. package/src/services/cache/index.d.ts +2 -0
  466. package/src/services/cache/index.js +8 -7
  467. package/src/services/cache/memory-cache-store.js +101 -89
  468. package/src/services/cache/page-cache-service.d.ts +31 -1
  469. package/src/services/cache/page-cache-service.js +237 -150
  470. package/src/services/cache/page-request-cache-coordinator.service.js +106 -102
  471. package/src/services/html/html-rewriter-provider.service.js +61 -61
  472. package/src/services/html/html-transformer.service.d.ts +1 -1
  473. package/src/services/html/html-transformer.service.js +249 -266
  474. package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
  475. package/src/services/invalidation/development-invalidation.service.js +239 -175
  476. package/src/services/module-loading/README.md +52 -0
  477. package/src/services/module-loading/app-module-loader.service.js +1 -0
  478. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  479. package/src/services/module-loading/app-server-module-transpiler.service.js +103 -118
  480. package/src/services/module-loading/collection-server-module-build.service.d.ts +19 -0
  481. package/src/services/module-loading/collection-server-module-build.service.js +83 -0
  482. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  483. package/src/services/module-loading/module-loading-types.js +1 -0
  484. package/src/services/module-loading/page-module-import.service.d.ts +11 -13
  485. package/src/services/module-loading/page-module-import.service.js +222 -184
  486. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  487. package/src/services/module-loading/route-module-build-cache-registry.js +51 -0
  488. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  489. package/src/services/module-loading/route-module-build-cache.js +3 -0
  490. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  491. package/src/services/module-loading/route-module-build-cache.store.js +202 -0
  492. package/src/services/module-loading/route-module-build-manifest.d.ts +57 -0
  493. package/src/services/module-loading/route-module-build-manifest.js +60 -0
  494. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  495. package/src/services/module-loading/route-module-dependency-hasher.js +148 -0
  496. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -3
  497. package/src/services/module-loading/server-module-transpiler.service.js +65 -62
  498. package/src/services/module-loading/source-module-support.js +15 -7
  499. package/src/services/runtime-state/dev-graph.service.js +165 -157
  500. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  501. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  502. package/src/services/validation/schema-validation-service.d.ts +1 -4
  503. package/src/services/validation/schema-validation-service.js +156 -95
  504. package/src/services/validation/standard-schema.types.d.ts +9 -62
  505. package/src/services/validation/standard-schema.types.js +1 -0
  506. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  507. package/src/services/validation/validate-standard-schema.js +14 -0
  508. package/src/static-site-generator/README.md +41 -0
  509. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +32 -0
  510. package/src/static-site-generator/production-page-browser-graph-prebuild.js +57 -0
  511. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  512. package/src/static-site-generator/sitemap-routes.js +36 -0
  513. package/src/static-site-generator/sitemap.d.ts +15 -0
  514. package/src/static-site-generator/sitemap.js +42 -0
  515. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  516. package/src/static-site-generator/static-build-invalidation.js +37 -0
  517. package/src/static-site-generator/static-export-context.d.ts +30 -0
  518. package/src/static-site-generator/static-export-context.js +1 -0
  519. package/src/static-site-generator/static-site-generator.d.ts +43 -25
  520. package/src/static-site-generator/static-site-generator.js +536 -294
  521. package/src/types/internal-types.d.ts +59 -13
  522. package/src/types/internal-types.js +1 -0
  523. package/src/types/public-types.d.ts +310 -95
  524. package/src/types/public-types.js +1 -0
  525. package/src/utils/deep-merge.js +39 -26
  526. package/src/utils/ecopages-route-info.d.ts +26 -0
  527. package/src/utils/ecopages-route-info.js +30 -0
  528. package/src/utils/hash.js +3 -6
  529. package/src/utils/html-escaping.d.ts +7 -0
  530. package/src/utils/html-escaping.js +22 -5
  531. package/src/utils/html.js +1 -4
  532. package/src/utils/invariant.js +11 -10
  533. package/src/utils/locals-utils.js +32 -22
  534. package/src/utils/parse-cli-args.d.ts +2 -0
  535. package/src/utils/parse-cli-args.js +73 -59
  536. package/src/utils/path-pattern.d.ts +23 -0
  537. package/src/utils/path-pattern.js +42 -0
  538. package/src/utils/path-utils.module.js +8 -11
  539. package/src/utils/resolve-entry-file.js +70 -38
  540. package/src/utils/resolve-work-dir.js +23 -27
  541. package/src/utils/runtime.js +24 -33
  542. package/src/utils/server-utils.module.d.ts +3 -2
  543. package/src/utils/server-utils.module.js +60 -53
  544. package/src/utils/static-file-extensions.d.ts +12 -0
  545. package/src/utils/static-file-extensions.js +54 -0
  546. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  547. package/src/watchers/project-watcher-ignore.js +17 -0
  548. package/src/watchers/project-watcher.d.ts +29 -6
  549. package/src/watchers/project-watcher.js +402 -257
  550. package/src/watchers/project-watcher.test-helpers.js +45 -50
  551. package/src/adapters/shared/api-response.js +0 -96
  552. package/src/adapters/shared/application-adapter.js +0 -90
  553. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  554. package/src/adapters/shared/define-api-handler.js +0 -15
  555. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  556. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  557. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  558. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  559. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  560. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  561. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  562. package/src/adapters/shared/hmr-html-response.js +0 -33
  563. package/src/adapters/shared/render-context.js +0 -93
  564. package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
  565. package/src/adapters/shared/runtime-host.js +0 -0
  566. package/src/adapters/shared/server-adapter.js +0 -436
  567. package/src/adapters/shared/server-route-handler.js +0 -111
  568. package/src/adapters/shared/server-static-builder.js +0 -162
  569. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  570. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  571. package/src/adapters/shared/static-preview-host.js +0 -0
  572. package/src/build/browser-runtime-manifest.js +0 -61
  573. package/src/build/browser-runtime-plugin-helpers.js +0 -14
  574. package/src/build/browser-runtime-plugin.js +0 -173
  575. package/src/build/build-manifest.d.ts +0 -33
  576. package/src/build/build-manifest.js +0 -49
  577. package/src/build/build-types.js +0 -0
  578. package/src/build/rolldown-adapter-helpers.js +0 -265
  579. package/src/build/rolldown-build-adapter.js +0 -65
  580. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  581. package/src/build/rolldown-dev-build-adapter.js +0 -166
  582. package/src/build/rolldown-plugin-bridge.js +0 -199
  583. package/src/build/runtime-build-executor.d.ts +0 -21
  584. package/src/build/runtime-build-executor.js +0 -19
  585. package/src/build/runtime-build-output-normalizer.d.ts +0 -3
  586. package/src/build/runtime-build-output-normalizer.js +0 -111
  587. package/src/build/serialized-build-executor.js +0 -63
  588. package/src/build/server-side-css-shim-plugin.js +0 -35
  589. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  590. package/src/hmr/hmr.test.e2e.js +0 -43
  591. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  592. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  593. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  594. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -233
  595. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  596. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  597. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  598. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  599. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  600. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  601. package/src/route-renderer/orchestration/render-output.utils.js +0 -171
  602. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  603. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  604. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  605. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  606. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → adapters/shared/runtime/runtime-host.js} +0 -0
  607. /package/src/{hmr/hmr.test.e2e.d.ts → adapters/shared/runtime/static-preview-host.js} +0 -0
  608. /package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +0 -0
  609. /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
  610. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  611. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
@@ -1,98 +1,110 @@
1
- class MemoryCacheStore {
2
- cache = /* @__PURE__ */ new Map();
3
- tagIndex = /* @__PURE__ */ new Map();
4
- maxEntries;
5
- constructor(options = {}) {
6
- this.maxEntries = options.maxEntries ?? 1e3;
7
- }
8
- /**
9
- * Retrieve an entry by key.
10
- * Uses Map's insertion order for LRU tracking - accessed entries are
11
- * deleted and re-inserted to move them to the "most recently used" position.
12
- */
13
- async get(key) {
14
- const entry = this.cache.get(key);
15
- if (!entry) return null;
16
- this.cache.delete(key);
17
- this.cache.set(key, entry);
18
- return entry;
19
- }
20
- /**
21
- * Store an entry, evicting the oldest if at capacity.
22
- * When maxEntries is reached and a new key is added, the first key in
23
- * the Map (oldest/least-recently-used) is evicted to make room.
24
- * Updating an existing key refreshes its LRU position.
25
- */
26
- async set(key, entry) {
27
- const existingEntry = this.cache.get(key);
28
- if (existingEntry) {
29
- for (const tag of existingEntry.tags) {
30
- this.tagIndex.get(tag)?.delete(key);
31
- if (this.tagIndex.get(tag)?.size === 0) {
32
- this.tagIndex.delete(tag);
1
+ /**
2
+ * In-memory cache store with LRU eviction.
3
+ * Suitable for single-instance deployments and development.
4
+ * @module
5
+ */
6
+ /**
7
+ * Simple in-memory cache store with LRU eviction.
8
+ * Uses Map insertion order for LRU tracking.
9
+ */
10
+ export class MemoryCacheStore {
11
+ cache = new Map();
12
+ tagIndex = new Map();
13
+ maxEntries;
14
+ constructor(options = {}) {
15
+ this.maxEntries = options.maxEntries ?? 1000;
16
+ }
17
+ /**
18
+ * Retrieve an entry by key.
19
+ * Uses Map's insertion order for LRU tracking - accessed entries are
20
+ * deleted and re-inserted to move them to the "most recently used" position.
21
+ */
22
+ async get(key) {
23
+ const entry = this.cache.get(key);
24
+ if (!entry)
25
+ return null;
26
+ this.cache.delete(key);
27
+ this.cache.set(key, entry);
28
+ return entry;
29
+ }
30
+ /**
31
+ * Store an entry, evicting the oldest if at capacity.
32
+ * When maxEntries is reached and a new key is added, the first key in
33
+ * the Map (oldest/least-recently-used) is evicted to make room.
34
+ * Updating an existing key refreshes its LRU position.
35
+ */
36
+ async set(key, entry) {
37
+ const existingEntry = this.cache.get(key);
38
+ if (existingEntry) {
39
+ for (const tag of existingEntry.tags) {
40
+ this.tagIndex.get(tag)?.delete(key);
41
+ if (this.tagIndex.get(tag)?.size === 0) {
42
+ this.tagIndex.delete(tag);
43
+ }
44
+ }
45
+ this.cache.delete(key);
46
+ }
47
+ else if (this.cache.size >= this.maxEntries) {
48
+ const oldestKey = this.cache.keys().next().value;
49
+ if (oldestKey)
50
+ await this.delete(oldestKey);
51
+ }
52
+ this.cache.set(key, entry);
53
+ for (const tag of entry.tags) {
54
+ if (!this.tagIndex.has(tag)) {
55
+ this.tagIndex.set(tag, new Set());
56
+ }
57
+ this.tagIndex.get(tag).add(key);
33
58
  }
34
- }
35
- this.cache.delete(key);
36
- } else if (this.cache.size >= this.maxEntries) {
37
- const oldestKey = this.cache.keys().next().value;
38
- if (oldestKey) await this.delete(oldestKey);
39
59
  }
40
- this.cache.set(key, entry);
41
- for (const tag of entry.tags) {
42
- if (!this.tagIndex.has(tag)) {
43
- this.tagIndex.set(tag, /* @__PURE__ */ new Set());
44
- }
45
- this.tagIndex.get(tag).add(key);
60
+ /**
61
+ * Delete an entry and clean up its tag index references.
62
+ * Removes empty tag sets to prevent memory leaks from accumulated tags.
63
+ */
64
+ async delete(key) {
65
+ const entry = this.cache.get(key);
66
+ if (!entry)
67
+ return false;
68
+ for (const tag of entry.tags) {
69
+ this.tagIndex.get(tag)?.delete(key);
70
+ if (this.tagIndex.get(tag)?.size === 0) {
71
+ this.tagIndex.delete(tag);
72
+ }
73
+ }
74
+ return this.cache.delete(key);
46
75
  }
47
- }
48
- /**
49
- * Delete an entry and clean up its tag index references.
50
- * Removes empty tag sets to prevent memory leaks from accumulated tags.
51
- */
52
- async delete(key) {
53
- const entry = this.cache.get(key);
54
- if (!entry) return false;
55
- for (const tag of entry.tags) {
56
- this.tagIndex.get(tag)?.delete(key);
57
- if (this.tagIndex.get(tag)?.size === 0) {
58
- this.tagIndex.delete(tag);
59
- }
76
+ async invalidateByTags(tags) {
77
+ let count = 0;
78
+ const keysToDelete = new Set();
79
+ for (const tag of tags) {
80
+ const keys = this.tagIndex.get(tag);
81
+ if (keys) {
82
+ for (const key of keys) {
83
+ keysToDelete.add(key);
84
+ }
85
+ }
86
+ }
87
+ for (const key of keysToDelete) {
88
+ if (await this.delete(key))
89
+ count++;
90
+ }
91
+ return count;
60
92
  }
61
- return this.cache.delete(key);
62
- }
63
- async invalidateByTags(tags) {
64
- let count = 0;
65
- const keysToDelete = /* @__PURE__ */ new Set();
66
- for (const tag of tags) {
67
- const keys = this.tagIndex.get(tag);
68
- if (keys) {
69
- for (const key of keys) {
70
- keysToDelete.add(key);
93
+ async invalidateByPaths(paths) {
94
+ let count = 0;
95
+ for (const path of paths) {
96
+ if (await this.delete(path))
97
+ count++;
71
98
  }
72
- }
99
+ return count;
73
100
  }
74
- for (const key of keysToDelete) {
75
- if (await this.delete(key)) count++;
101
+ async clear() {
102
+ this.cache.clear();
103
+ this.tagIndex.clear();
76
104
  }
77
- return count;
78
- }
79
- async invalidateByPaths(paths) {
80
- let count = 0;
81
- for (const path of paths) {
82
- if (await this.delete(path)) count++;
105
+ async stats() {
106
+ return {
107
+ entries: this.cache.size,
108
+ };
83
109
  }
84
- return count;
85
- }
86
- async clear() {
87
- this.cache.clear();
88
- this.tagIndex.clear();
89
- }
90
- async stats() {
91
- return {
92
- entries: this.cache.size
93
- };
94
- }
95
110
  }
96
- export {
97
- MemoryCacheStore
98
- };
@@ -3,10 +3,13 @@
3
3
  * Handles stale-while-revalidate semantics and background regeneration.
4
4
  * @module
5
5
  */
6
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
6
7
  import type { CacheResult, CacheStore, CacheStrategy, RenderResult } from './cache.types.js';
8
+ import { HtmlPageCacheDependencyIndex } from './html-page-cache-dependency-index.js';
7
9
  export interface PageCacheServiceOptions {
8
10
  store?: CacheStore;
9
11
  enabled?: boolean;
12
+ dependencyIndex?: HtmlPageCacheDependencyIndex;
10
13
  }
11
14
  /**
12
15
  * Core page caching service with ISR support.
@@ -14,7 +17,9 @@ export interface PageCacheServiceOptions {
14
17
  export declare class PageCacheService {
15
18
  private store;
16
19
  private enabled;
20
+ private readonly dependencyIndex;
17
21
  private regenerationPromises;
22
+ private missPromises;
18
23
  constructor(options?: PageCacheServiceOptions);
19
24
  /**
20
25
  * Generate a cache key from URL and optional params.
@@ -35,7 +40,11 @@ export declare class PageCacheService {
35
40
  * @param defaultStrategy - Default strategy if page doesn't specify one
36
41
  * @param renderFn - Function that renders the page and returns HTML + strategy
37
42
  */
38
- getOrCreate(key: string, defaultStrategy: CacheStrategy, renderFn: () => Promise<RenderResult>): Promise<CacheResult>;
43
+ getOrCreate(key: string, defaultStrategy: CacheStrategy, renderFn: () => Promise<RenderResult>, options?: {
44
+ sourceDependencyPaths?: readonly string[];
45
+ }): Promise<CacheResult>;
46
+ private resolveOrCreate;
47
+ private registerDependencyPaths;
39
48
  /**
40
49
  * Regenerate content in the background without blocking the response.
41
50
  * Uses promise deduplication to prevent multiple concurrent regenerations.
@@ -49,6 +58,11 @@ export declare class PageCacheService {
49
58
  * Invalidate cache entries by paths.
50
59
  */
51
60
  invalidateByPaths(paths: string[]): Promise<number>;
61
+ /**
62
+ * Invalidates cached HTML entries that registered the given source paths.
63
+ */
64
+ invalidateBySourceDependencyPaths(sourcePaths: readonly string[]): Promise<number>;
65
+ getDependencyIndex(): HtmlPageCacheDependencyIndex;
52
66
  /**
53
67
  * Clear all cached entries.
54
68
  */
@@ -68,3 +82,19 @@ export declare class PageCacheService {
68
82
  * Generate Cache-Control header value from cache strategy.
69
83
  */
70
84
  export declare function getCacheControlHeader(strategy: CacheStrategy | 'disabled'): string;
85
+ /**
86
+ * Registers the page cache service for one app config instance.
87
+ */
88
+ export declare function registerAppPageCacheService(appConfig: EcoPagesAppConfig, service: PageCacheService | null): void;
89
+ /**
90
+ * Returns the registered page cache service for one app config, if any.
91
+ */
92
+ export declare function getAppPageCacheService(appConfig: EcoPagesAppConfig): PageCacheService | null;
93
+ /**
94
+ * Clears rendered HTML cache entries for one app during development invalidation.
95
+ */
96
+ export declare function clearAppPageCache(appConfig: EcoPagesAppConfig): Promise<void>;
97
+ /**
98
+ * Invalidates rendered HTML cache entries that depend on the given source paths.
99
+ */
100
+ export declare function invalidateAppPageCacheBySourcePaths(appConfig: EcoPagesAppConfig, sourcePaths: readonly string[]): Promise<number>;
@@ -1,152 +1,239 @@
1
- import { appLogger } from "../../global/app-logger.js";
2
- import { MemoryCacheStore } from "./memory-cache-store.js";
3
- class PageCacheService {
4
- store;
5
- enabled;
6
- regenerationPromises = /* @__PURE__ */ new Map();
7
- constructor(options = {}) {
8
- this.store = options.store ?? new MemoryCacheStore();
9
- this.enabled = options.enabled ?? true;
10
- }
11
- /**
12
- * Generate a cache key from URL and optional params.
13
- * Uses full URL (path + query) as the key.
14
- */
15
- generateCacheKey(url) {
16
- return url;
17
- }
18
- /**
19
- * Check if an entry is stale (past its revalidation time).
20
- */
21
- isStale(entry) {
22
- if (entry.revalidateAfter === null) return false;
23
- return Date.now() > entry.revalidateAfter;
24
- }
25
- /**
26
- * Create a cache entry from rendered HTML.
27
- */
28
- createEntry(html, strategy) {
29
- const now = Date.now();
30
- let revalidateAfter = null;
31
- let tags = [];
32
- if (strategy === "static") {
33
- revalidateAfter = null;
34
- } else if (strategy === "dynamic") {
35
- revalidateAfter = 0;
36
- } else if (typeof strategy === "object") {
37
- revalidateAfter = now + strategy.revalidate * 1e3;
38
- tags = strategy.tags ?? [];
39
- }
40
- return {
41
- html,
42
- createdAt: now,
43
- revalidateAfter,
44
- tags,
45
- strategy
46
- };
47
- }
48
- /**
49
- * Get cached content or create new content with stale-while-revalidate semantics.
50
- * @param key - Cache key (URL path + query)
51
- * @param defaultStrategy - Default strategy if page doesn't specify one
52
- * @param renderFn - Function that renders the page and returns HTML + strategy
53
- */
54
- async getOrCreate(key, defaultStrategy, renderFn) {
55
- if (!this.enabled) {
56
- const { html, strategy } = await renderFn();
57
- return { html, status: "miss", strategy };
58
- }
59
- const entry = await this.store.get(key);
60
- if (!entry) {
61
- const { html, strategy } = await renderFn();
62
- const effectiveStrategy = strategy ?? defaultStrategy;
63
- if (effectiveStrategy === "dynamic") {
64
- return { html, status: "miss", strategy: effectiveStrategy };
65
- }
66
- const newEntry = this.createEntry(html, effectiveStrategy);
67
- await this.store.set(key, newEntry);
68
- return { html, status: "miss", strategy: effectiveStrategy };
69
- }
70
- if (!this.isStale(entry)) {
71
- return { html: entry.html, status: "hit", strategy: entry.strategy };
72
- }
73
- this.regenerateInBackground(key, entry.strategy, renderFn);
74
- return { html: entry.html, status: "stale", strategy: entry.strategy };
75
- }
76
- /**
77
- * Regenerate content in the background without blocking the response.
78
- * Uses promise deduplication to prevent multiple concurrent regenerations.
79
- */
80
- regenerateInBackground(key, fallbackStrategy, renderFn) {
81
- if (this.regenerationPromises.has(key)) {
82
- return;
83
- }
84
- const regeneratePromise = (async () => {
85
- try {
86
- const { html, strategy } = await renderFn();
87
- const effectiveStrategy = strategy ?? fallbackStrategy;
88
- const newEntry = this.createEntry(html, effectiveStrategy);
89
- await this.store.set(key, newEntry);
90
- return html;
91
- } finally {
92
- this.regenerationPromises.delete(key);
93
- }
94
- })();
95
- this.regenerationPromises.set(key, regeneratePromise);
96
- queueMicrotask(() => {
97
- regeneratePromise.catch((error) => {
98
- appLogger.error(`[PageCacheService] Failed to regenerate: ${key}`, error);
99
- });
100
- });
101
- }
102
- /**
103
- * Invalidate cache entries by tags.
104
- */
105
- async invalidateByTags(tags) {
106
- return this.store.invalidateByTags(tags);
107
- }
108
- /**
109
- * Invalidate cache entries by paths.
110
- */
111
- async invalidateByPaths(paths) {
112
- return this.store.invalidateByPaths(paths);
113
- }
114
- /**
115
- * Clear all cached entries.
116
- */
117
- async clear() {
118
- return this.store.clear();
119
- }
120
- /**
121
- * Get cache statistics.
122
- */
123
- async stats() {
124
- return this.store.stats?.() ?? { entries: 0 };
125
- }
126
- /**
127
- * Get the underlying cache store.
128
- */
129
- getStore() {
130
- return this.store;
131
- }
1
+ /**
2
+ * Page cache service with ISR (Incremental Static Regeneration) support.
3
+ * Handles stale-while-revalidate semantics and background regeneration.
4
+ * @module
5
+ */
6
+ import { appLogger } from '../../global/app-logger.js';
7
+ import { MemoryCacheStore } from './memory-cache-store.js';
8
+ import { HtmlPageCacheDependencyIndex } from './html-page-cache-dependency-index.js';
9
+ /**
10
+ * Core page caching service with ISR support.
11
+ */
12
+ export class PageCacheService {
13
+ store;
14
+ enabled;
15
+ dependencyIndex;
16
+ regenerationPromises = new Map();
17
+ missPromises = new Map();
18
+ constructor(options = {}) {
19
+ this.store = options.store ?? new MemoryCacheStore();
20
+ this.enabled = options.enabled ?? true;
21
+ this.dependencyIndex = options.dependencyIndex ?? new HtmlPageCacheDependencyIndex();
22
+ }
23
+ /**
24
+ * Generate a cache key from URL and optional params.
25
+ * Uses full URL (path + query) as the key.
26
+ */
27
+ generateCacheKey(url) {
28
+ return url;
29
+ }
30
+ /**
31
+ * Check if an entry is stale (past its revalidation time).
32
+ */
33
+ isStale(entry) {
34
+ if (entry.revalidateAfter === null)
35
+ return false;
36
+ return Date.now() > entry.revalidateAfter;
37
+ }
38
+ /**
39
+ * Create a cache entry from rendered HTML.
40
+ */
41
+ createEntry(html, strategy) {
42
+ const now = Date.now();
43
+ let revalidateAfter = null;
44
+ let tags = [];
45
+ if (strategy === 'static') {
46
+ revalidateAfter = null;
47
+ }
48
+ else if (strategy === 'dynamic') {
49
+ revalidateAfter = 0;
50
+ }
51
+ else if (typeof strategy === 'object') {
52
+ revalidateAfter = now + strategy.revalidate * 1000;
53
+ tags = strategy.tags ?? [];
54
+ }
55
+ return {
56
+ html,
57
+ createdAt: now,
58
+ revalidateAfter,
59
+ tags,
60
+ strategy,
61
+ };
62
+ }
63
+ /**
64
+ * Get cached content or create new content with stale-while-revalidate semantics.
65
+ * @param key - Cache key (URL path + query)
66
+ * @param defaultStrategy - Default strategy if page doesn't specify one
67
+ * @param renderFn - Function that renders the page and returns HTML + strategy
68
+ */
69
+ async getOrCreate(key, defaultStrategy, renderFn, options) {
70
+ if (!this.enabled) {
71
+ const { html, strategy } = await renderFn();
72
+ return { html, status: 'miss', strategy };
73
+ }
74
+ const pendingMiss = this.missPromises.get(key);
75
+ if (pendingMiss) {
76
+ return pendingMiss;
77
+ }
78
+ const missPromise = this.resolveOrCreate(key, defaultStrategy, renderFn, options).finally(() => {
79
+ this.missPromises.delete(key);
80
+ });
81
+ this.missPromises.set(key, missPromise);
82
+ return missPromise;
83
+ }
84
+ async resolveOrCreate(key, defaultStrategy, renderFn, options) {
85
+ const entry = await this.store.get(key);
86
+ if (!entry) {
87
+ const { html, strategy, sourceDependencyPaths } = await renderFn();
88
+ const effectiveStrategy = strategy ?? defaultStrategy;
89
+ if (effectiveStrategy === 'dynamic') {
90
+ return { html, status: 'miss', strategy: effectiveStrategy };
91
+ }
92
+ const newEntry = this.createEntry(html, effectiveStrategy);
93
+ await this.store.set(key, newEntry);
94
+ this.registerDependencyPaths(key, options?.sourceDependencyPaths, sourceDependencyPaths);
95
+ return { html, status: 'miss', strategy: effectiveStrategy };
96
+ }
97
+ if (!this.isStale(entry)) {
98
+ return { html: entry.html, status: 'hit', strategy: entry.strategy };
99
+ }
100
+ this.regenerateInBackground(key, entry.strategy, renderFn);
101
+ return { html: entry.html, status: 'stale', strategy: entry.strategy };
102
+ }
103
+ registerDependencyPaths(key, initialPaths, renderedPaths) {
104
+ const mergedPaths = new Set();
105
+ for (const sourcePath of initialPaths ?? []) {
106
+ mergedPaths.add(sourcePath);
107
+ }
108
+ for (const sourcePath of renderedPaths ?? []) {
109
+ mergedPaths.add(sourcePath);
110
+ }
111
+ if (mergedPaths.size > 0) {
112
+ this.dependencyIndex.register(key, [...mergedPaths]);
113
+ }
114
+ }
115
+ /**
116
+ * Regenerate content in the background without blocking the response.
117
+ * Uses promise deduplication to prevent multiple concurrent regenerations.
118
+ */
119
+ regenerateInBackground(key, fallbackStrategy, renderFn) {
120
+ if (this.regenerationPromises.has(key)) {
121
+ return;
122
+ }
123
+ const regeneratePromise = (async () => {
124
+ try {
125
+ const { html, strategy, sourceDependencyPaths } = await renderFn();
126
+ const effectiveStrategy = strategy ?? fallbackStrategy;
127
+ const newEntry = this.createEntry(html, effectiveStrategy);
128
+ await this.store.set(key, newEntry);
129
+ this.registerDependencyPaths(key, undefined, sourceDependencyPaths);
130
+ return html;
131
+ }
132
+ finally {
133
+ this.regenerationPromises.delete(key);
134
+ }
135
+ })();
136
+ this.regenerationPromises.set(key, regeneratePromise);
137
+ queueMicrotask(() => {
138
+ regeneratePromise.catch((error) => {
139
+ appLogger.error(`[PageCacheService] Failed to regenerate: ${key}`, error);
140
+ });
141
+ });
142
+ }
143
+ /**
144
+ * Invalidate cache entries by tags.
145
+ */
146
+ async invalidateByTags(tags) {
147
+ return this.store.invalidateByTags(tags);
148
+ }
149
+ /**
150
+ * Invalidate cache entries by paths.
151
+ */
152
+ async invalidateByPaths(paths) {
153
+ return this.store.invalidateByPaths(paths);
154
+ }
155
+ /**
156
+ * Invalidates cached HTML entries that registered the given source paths.
157
+ */
158
+ async invalidateBySourceDependencyPaths(sourcePaths) {
159
+ const cacheKeys = this.dependencyIndex.resolveCacheKeysForSourcePaths(sourcePaths);
160
+ let count = 0;
161
+ for (const cacheKey of cacheKeys) {
162
+ if (await this.store.delete(cacheKey)) {
163
+ count += 1;
164
+ }
165
+ this.dependencyIndex.unregister(cacheKey);
166
+ }
167
+ return count;
168
+ }
169
+ getDependencyIndex() {
170
+ return this.dependencyIndex;
171
+ }
172
+ /**
173
+ * Clear all cached entries.
174
+ */
175
+ async clear() {
176
+ this.dependencyIndex.clear();
177
+ return this.store.clear();
178
+ }
179
+ /**
180
+ * Get cache statistics.
181
+ */
182
+ async stats() {
183
+ return this.store.stats?.() ?? { entries: 0 };
184
+ }
185
+ /**
186
+ * Get the underlying cache store.
187
+ */
188
+ getStore() {
189
+ return this.store;
190
+ }
191
+ }
192
+ /**
193
+ * Generate Cache-Control header value from cache strategy.
194
+ */
195
+ export function getCacheControlHeader(strategy) {
196
+ if (strategy === 'disabled') {
197
+ return 'no-store, must-revalidate';
198
+ }
199
+ if (strategy === 'static') {
200
+ return 'public, max-age=31536000, immutable';
201
+ }
202
+ if (strategy === 'dynamic') {
203
+ return 'no-store, must-revalidate';
204
+ }
205
+ if (typeof strategy === 'object') {
206
+ const swr = strategy.revalidate * 2;
207
+ return `public, max-age=${strategy.revalidate}, stale-while-revalidate=${swr}`;
208
+ }
209
+ return 'no-store';
210
+ }
211
+ const pageCacheByAppConfig = new WeakMap();
212
+ /**
213
+ * Registers the page cache service for one app config instance.
214
+ */
215
+ export function registerAppPageCacheService(appConfig, service) {
216
+ if (service) {
217
+ pageCacheByAppConfig.set(appConfig, service);
218
+ return;
219
+ }
220
+ pageCacheByAppConfig.delete(appConfig);
221
+ }
222
+ /**
223
+ * Returns the registered page cache service for one app config, if any.
224
+ */
225
+ export function getAppPageCacheService(appConfig) {
226
+ return pageCacheByAppConfig.get(appConfig) ?? null;
227
+ }
228
+ /**
229
+ * Clears rendered HTML cache entries for one app during development invalidation.
230
+ */
231
+ export async function clearAppPageCache(appConfig) {
232
+ await getAppPageCacheService(appConfig)?.clear();
132
233
  }
133
- function getCacheControlHeader(strategy) {
134
- if (strategy === "disabled") {
135
- return "no-store, must-revalidate";
136
- }
137
- if (strategy === "static") {
138
- return "public, max-age=31536000, immutable";
139
- }
140
- if (strategy === "dynamic") {
141
- return "no-store, must-revalidate";
142
- }
143
- if (typeof strategy === "object") {
144
- const swr = strategy.revalidate * 2;
145
- return `public, max-age=${strategy.revalidate}, stale-while-revalidate=${swr}`;
146
- }
147
- return "no-store";
234
+ /**
235
+ * Invalidates rendered HTML cache entries that depend on the given source paths.
236
+ */
237
+ export async function invalidateAppPageCacheBySourcePaths(appConfig, sourcePaths) {
238
+ return (await getAppPageCacheService(appConfig)?.invalidateBySourceDependencyPaths(sourcePaths)) ?? 0;
148
239
  }
149
- export {
150
- PageCacheService,
151
- getCacheControlHeader
152
- };