@ecopages/core 0.2.0-beta.3 → 0.2.0-beta.30

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 (433) hide show
  1. package/README.md +38 -9
  2. package/package.json +241 -30
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +123 -6
  5. package/src/adapters/abstract/application-adapter.js +151 -1
  6. package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
  7. package/src/adapters/abstract/segment-path-matcher.js +149 -0
  8. package/src/adapters/abstract/server-adapter.d.ts +16 -2
  9. package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
  10. package/src/adapters/abstract/ws-pattern-matcher.js +30 -0
  11. package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
  12. package/src/adapters/bun/bun-user-websocket-lifecycle.js +96 -0
  13. package/src/adapters/bun/client-bridge.d.ts +1 -0
  14. package/src/adapters/bun/client-bridge.js +3 -0
  15. package/src/adapters/bun/create-app.d.ts +9 -6
  16. package/src/adapters/bun/create-app.js +76 -45
  17. package/src/adapters/bun/hmr-manager.d.ts +1 -1
  18. package/src/adapters/bun/hmr-manager.js +1 -1
  19. package/src/adapters/bun/index.d.ts +1 -1
  20. package/src/adapters/bun/index.js +25 -2
  21. package/src/adapters/bun/runtime-host.d.ts +1 -1
  22. package/src/adapters/bun/runtime-host.js +1 -1
  23. package/src/adapters/bun/server-adapter.d.ts +92 -41
  24. package/src/adapters/bun/server-adapter.js +256 -117
  25. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  26. package/src/adapters/bun/static-preview-host.js +25 -20
  27. package/src/adapters/create-app.d.ts +13 -11
  28. package/src/adapters/create-app.js +2 -51
  29. package/src/adapters/index.d.ts +2 -2
  30. package/src/adapters/index.js +26 -4
  31. package/src/adapters/node/create-app.d.ts +8 -3
  32. package/src/adapters/node/create-app.js +61 -13
  33. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  34. package/src/adapters/node/node-client-bridge.js +3 -0
  35. package/src/adapters/node/node-hmr-manager.d.ts +1 -1
  36. package/src/adapters/node/node-hmr-manager.js +1 -1
  37. package/src/adapters/node/runtime-host.d.ts +1 -1
  38. package/src/adapters/node/runtime-host.js +1 -1
  39. package/src/adapters/node/server-adapter-dependencies.js +4 -0
  40. package/src/adapters/node/server-adapter.d.ts +64 -23
  41. package/src/adapters/node/server-adapter.js +169 -142
  42. package/src/adapters/node/static-content-server.d.ts +1 -0
  43. package/src/adapters/node/static-content-server.js +10 -2
  44. package/src/adapters/node/static-preview-host.d.ts +1 -1
  45. package/src/adapters/node/static-preview-host.js +27 -12
  46. package/src/adapters/shared/{hmr-entrypoint-registrar.d.ts → hmr/hmr-entrypoint-registrar.d.ts} +31 -30
  47. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +106 -0
  48. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  49. package/src/adapters/shared/{hmr-html-response.js → hmr/hmr-html-response.js} +4 -1
  50. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +101 -0
  51. package/src/adapters/shared/hmr/shared-hmr-manager.js +432 -0
  52. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  53. package/src/adapters/shared/http/api-request-pipeline.js +129 -0
  54. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  55. package/src/adapters/shared/{api-response.js → http/api-response.js} +6 -23
  56. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  57. package/src/adapters/shared/http/create-body-response.js +23 -0
  58. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  59. package/src/adapters/shared/http/define-api-handler.js +63 -0
  60. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  61. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  62. package/src/adapters/shared/{explicit-static-route-matcher.js → http/explicit-static-route-matcher.js} +3 -38
  63. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  64. package/src/adapters/shared/{file-route-middleware-pipeline.js → http/file-route-middleware-pipeline.js} +10 -22
  65. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  66. package/src/adapters/shared/{fs-server-response-factory.js → http/fs-server-response-factory.js} +22 -2
  67. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  68. package/src/adapters/shared/{fs-server-response-matcher.js → http/fs-server-response-matcher.js} +109 -27
  69. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  70. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  71. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  72. package/src/adapters/shared/{application-adapter.js → runtime/application-adapter.js} +1 -1
  73. package/src/adapters/shared/runtime/copy-runtime-public-dir.d.ts +6 -0
  74. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +24 -0
  75. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  76. package/src/adapters/shared/runtime/port-manager.js +196 -0
  77. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  78. package/src/adapters/shared/{render-context.js → runtime/render-context.js} +8 -17
  79. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -3
  80. package/src/adapters/shared/{runtime-app-bootstrap.js → runtime/runtime-app-bootstrap.js} +4 -7
  81. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +46 -0
  82. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +57 -0
  83. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +23 -49
  84. package/src/adapters/shared/runtime/server-adapter.js +226 -0
  85. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  86. package/src/adapters/shared/{server-route-handler.js → runtime/server-route-handler.js} +5 -43
  87. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +27 -35
  88. package/src/adapters/shared/runtime/server-static-builder.js +191 -0
  89. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  90. package/src/adapters/shared/ws/node-http-websocket-upgrades.d.ts +21 -0
  91. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +100 -0
  92. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  93. package/src/adapters/shared/ws/websocket-lifecycle.js +55 -0
  94. package/src/build/README.md +140 -31
  95. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  96. package/src/build/app-build-manifest-runtime.js +124 -0
  97. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
  98. package/src/build/{browser-runtime-plugin.js → browser/browser-runtime-plugin.js} +1 -1
  99. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  100. package/src/build/browser/jsx-ownership-plugins.js +41 -0
  101. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  102. package/src/build/browser/lit-static-render-worker-context.js +6 -0
  103. package/src/build/build-adapter.d.ts +29 -334
  104. package/src/build/build-adapter.js +32 -133
  105. package/src/build/cache/build-input-fingerprint.d.ts +28 -0
  106. package/src/build/cache/build-input-fingerprint.js +31 -0
  107. package/src/build/cache/cache-constants.d.ts +4 -0
  108. package/src/build/cache/cache-constants.js +6 -0
  109. package/src/build/cache/cache-keys.d.ts +22 -0
  110. package/src/build/cache/cache-keys.js +63 -0
  111. package/src/build/cache/dev-browser-script-cache.d.ts +34 -0
  112. package/src/build/cache/dev-browser-script-cache.js +90 -0
  113. package/src/build/cache/pages-unified-graph-build.d.ts +31 -0
  114. package/src/build/cache/pages-unified-graph-build.js +198 -0
  115. package/src/build/cache/production-build-cache.d.ts +20 -0
  116. package/src/build/cache/production-build-cache.js +63 -0
  117. package/src/build/cache/server-entry-build-cache.d.ts +43 -0
  118. package/src/build/cache/server-entry-build-cache.js +165 -0
  119. package/src/build/contracts/build-contracts.d.ts +96 -0
  120. package/src/build/contracts/build-manifest.d.ts +90 -0
  121. package/src/build/{build-manifest.js → contracts/build-manifest.js} +2 -2
  122. package/src/build/contracts/build-types.js +0 -0
  123. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +23 -9
  124. package/src/build/{rolldown-adapter-helpers.js → rolldown/rolldown-adapter-helpers.js} +99 -13
  125. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  126. package/src/build/{rolldown-build-adapter.js → rolldown/rolldown-build-adapter.js} +3 -3
  127. package/src/build/rolldown/rolldown-build-invocation-metrics.d.ts +12 -0
  128. package/src/build/rolldown/rolldown-build-invocation-metrics.js +43 -0
  129. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
  130. package/src/build/{rolldown-plugin-bridge.js → rolldown/rolldown-plugin-bridge.js} +21 -6
  131. package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
  132. package/src/build/rolldown/rolldown-source-transform-pass.js +61 -0
  133. package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -0
  134. package/src/build/rolldown/runtime-build-output-normalizer.js +201 -0
  135. package/src/build/runtime/build-profile-options.d.ts +7 -0
  136. package/src/build/runtime/build-profile-options.js +37 -0
  137. package/src/build/runtime/build-request-identity.d.ts +17 -0
  138. package/src/build/runtime/build-request-identity.js +54 -0
  139. package/src/build/runtime/build-request-policy.d.ts +59 -0
  140. package/src/build/runtime/build-request-policy.js +46 -0
  141. package/src/build/runtime/build-runtime.d.ts +28 -0
  142. package/src/build/runtime/build-runtime.js +65 -0
  143. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  144. package/src/build/runtime/deduping-build-executor.js +34 -0
  145. package/src/build/runtime/parallel-build-executor.d.ts +21 -0
  146. package/src/build/runtime/parallel-build-executor.js +52 -0
  147. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  148. package/src/client/navigation-scripts/classification.d.ts +16 -0
  149. package/src/client/navigation-scripts/classification.js +41 -0
  150. package/src/client/navigation-scripts/index.d.ts +3 -0
  151. package/src/client/navigation-scripts/index.js +23 -0
  152. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +65 -0
  153. package/src/client/navigation-scripts/registry.d.ts +11 -0
  154. package/src/client/navigation-scripts/registry.js +12 -0
  155. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  156. package/src/client/navigation-scripts/rerun-queue.js +73 -0
  157. package/src/client/scroll.d.ts +17 -0
  158. package/src/client/scroll.js +25 -0
  159. package/src/client/scroll.test.browser.js +37 -0
  160. package/src/client/view-transitions.d.ts +16 -0
  161. package/src/client/view-transitions.js +63 -0
  162. package/src/config/config-builder.d.ts +25 -10
  163. package/src/config/config-builder.js +53 -11
  164. package/src/config/constants.d.ts +1 -0
  165. package/src/config/constants.js +2 -1
  166. package/src/dev/client-bridge-registry.d.ts +5 -0
  167. package/src/dev/client-bridge-registry.js +15 -0
  168. package/src/dev/dev-client-ownership.d.ts +7 -0
  169. package/src/dev/dev-client-ownership.js +6 -0
  170. package/src/dev/hmr-manager-registry.d.ts +8 -0
  171. package/src/dev/hmr-manager-registry.js +15 -0
  172. package/src/dev/host-runtime.d.ts +3 -0
  173. package/src/dev/host-runtime.js +7 -0
  174. package/src/dev/runtime-server-started-message.d.ts +2 -0
  175. package/src/dev/runtime-server-started-message.js +6 -0
  176. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  177. package/src/diagnostics/request-build-dedupe.js +33 -0
  178. package/src/diagnostics/startup-trace.d.ts +72 -0
  179. package/src/diagnostics/startup-trace.js +253 -0
  180. package/src/eco/README.md +11 -0
  181. package/src/eco/eco-declared-component.d.ts +14 -0
  182. package/src/eco/eco-declared-component.js +16 -0
  183. package/src/eco/eco.browser.js +5 -6
  184. package/src/eco/eco.js +7 -8
  185. package/src/eco/eco.types.d.ts +14 -3
  186. package/src/eco/eco.utils.d.ts +1 -1
  187. package/src/eco/eco.utils.js +1 -1
  188. package/src/eco/page-layout-normalization.d.ts +21 -0
  189. package/src/eco/page-layout-normalization.js +59 -0
  190. package/src/env.d.ts +2 -0
  191. package/src/errors/index.d.ts +1 -0
  192. package/src/errors/index.js +7 -1
  193. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  194. package/src/errors/undeclared-component-dependency-error.js +17 -0
  195. package/src/hmr/client/hmr-runtime.js +7 -4
  196. package/src/hmr/hmr-entrypoint-output.d.ts +49 -0
  197. package/src/hmr/hmr-entrypoint-output.js +60 -0
  198. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  199. package/src/hmr/hmr-file-change-prep.js +17 -0
  200. package/src/hmr/hmr-strategy.d.ts +15 -0
  201. package/src/hmr/hmr-strategy.js +19 -0
  202. package/src/hmr/strategies/js-hmr-strategy.d.ts +3 -5
  203. package/src/hmr/strategies/js-hmr-strategy.js +72 -19
  204. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  205. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +29 -0
  206. package/src/index.d.ts +2 -1
  207. package/src/index.js +28 -2
  208. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  209. package/src/integrations/ghtml/ghtml-renderer.js +2 -51
  210. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  211. package/src/integrations/ghtml/ghtml.plugin.js +7 -14
  212. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  213. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  214. package/src/plugins/alias-resolver-plugin.js +38 -51
  215. package/src/plugins/define-integration.d.ts +26 -0
  216. package/src/plugins/define-integration.js +19 -0
  217. package/src/plugins/eco-component-meta-plugin.d.ts +1 -1
  218. package/src/plugins/eco-component-meta-plugin.js +5 -8
  219. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  220. package/src/plugins/foreign-jsx-override-plugin.js +4 -6
  221. package/src/plugins/integration-plugin.d.ts +43 -14
  222. package/src/plugins/integration-plugin.js +18 -5
  223. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  224. package/src/plugins/jsx-import-source.utils.js +26 -0
  225. package/src/plugins/processor.d.ts +61 -12
  226. package/src/plugins/processor.js +24 -5
  227. package/src/plugins/source-transform.d.ts +32 -1
  228. package/src/plugins/source-transform.js +23 -1
  229. package/src/plugins/tsconfig-import-resolver.d.ts +18 -0
  230. package/src/plugins/tsconfig-import-resolver.js +159 -0
  231. package/src/route-renderer/GRAPH.md +26 -32
  232. package/src/route-renderer/README.md +38 -31
  233. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  234. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +148 -0
  235. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  236. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +31 -0
  237. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  238. package/src/route-renderer/orchestration/{component-render-context.js → foreign-child/component-render-context.js} +4 -2
  239. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +17 -7
  240. package/src/route-renderer/orchestration/{render-output.utils.js → foreign-child/foreign-child-output.utils.js} +35 -26
  241. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  242. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.js → foreign-child/foreign-subtree-execution.service.js} +170 -37
  243. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  244. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +35 -0
  245. package/src/route-renderer/orchestration/integration-renderer.d.ts +24 -143
  246. package/src/route-renderer/orchestration/integration-renderer.js +163 -402
  247. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  248. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +177 -0
  249. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  250. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +143 -0
  251. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  252. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +96 -0
  253. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +7 -2
  254. package/src/route-renderer/orchestration/{ownership-validation.service.js → ownership-graph/ownership-validation.service.js} +30 -3
  255. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  256. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +32 -0
  257. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.d.ts +9 -0
  258. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +7 -0
  259. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  260. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +29 -0
  261. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +106 -0
  262. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +436 -0
  263. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +31 -0
  264. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +229 -0
  265. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  266. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +31 -0
  267. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +25 -0
  268. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  269. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +27 -0
  270. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  271. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +36 -0
  272. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +20 -0
  273. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +24 -0
  274. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +25 -0
  275. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +49 -0
  276. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  277. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +33 -0
  278. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +13 -53
  279. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +162 -0
  280. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  281. package/src/route-renderer/orchestration/string-markup-renderer.js +55 -0
  282. package/src/route-renderer/page-loading/component-dependency-collection.js +5 -2
  283. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +6 -0
  284. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +7 -2
  285. package/src/route-renderer/page-loading/module-declaration-aggregation.js +4 -0
  286. package/src/router/client/link-intent.d.ts +11 -21
  287. package/src/router/client/link-intent.js +10 -0
  288. package/src/router/client/link-intent.test.browser.js +12 -1
  289. package/src/router/client/link-navigation-policy.d.ts +45 -0
  290. package/src/router/client/link-navigation-policy.js +101 -0
  291. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  292. package/src/router/client/link-navigation-policy.test.browser.js +92 -0
  293. package/src/router/client/navigation-coordinator.d.ts +1 -1
  294. package/src/router/client/navigation-coordinator.js +12 -2
  295. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  296. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +3 -0
  297. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +6 -1
  298. package/src/services/assets/asset-processing-service/asset-processing.service.js +44 -5
  299. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  300. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -1
  301. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
  302. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  303. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +78 -0
  304. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  305. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +28 -13
  306. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  307. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +7 -0
  308. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  309. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +38 -12
  310. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  311. package/src/services/assets/asset-processing-service/index.js +2 -0
  312. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  313. package/src/services/assets/asset-processing-service/inline-content-script-body.js +17 -0
  314. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  315. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +18 -0
  316. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  317. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +2 -15
  318. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  319. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +73 -68
  320. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  321. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +18 -15
  322. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +17 -3
  323. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  324. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +2 -31
  325. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  326. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +2 -30
  327. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  328. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +43 -0
  329. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  330. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +17 -0
  331. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  332. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +5 -10
  333. package/src/services/assets/browser-bundle.service.d.ts +28 -30
  334. package/src/services/assets/browser-bundle.service.js +28 -19
  335. package/src/services/html/html-transformer.service.d.ts +1 -1
  336. package/src/services/html/html-transformer.service.js +5 -5
  337. package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
  338. package/src/services/invalidation/development-invalidation.service.js +64 -11
  339. package/src/services/module-loading/README.md +49 -0
  340. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  341. package/src/services/module-loading/app-server-module-transpiler.service.js +3 -21
  342. package/src/services/module-loading/page-module-import.service.d.ts +6 -2
  343. package/src/services/module-loading/page-module-import.service.js +110 -47
  344. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  345. package/src/services/module-loading/route-module-build-cache-registry.js +37 -0
  346. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  347. package/src/services/module-loading/route-module-build-cache.js +38 -0
  348. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  349. package/src/services/module-loading/route-module-build-cache.store.js +207 -0
  350. package/src/services/module-loading/route-module-build-manifest.d.ts +54 -0
  351. package/src/services/module-loading/route-module-build-manifest.js +85 -0
  352. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  353. package/src/services/module-loading/route-module-dependency-hasher.js +122 -0
  354. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -1
  355. package/src/services/module-loading/server-module-transpiler.service.js +1 -1
  356. package/src/services/validation/schema-validation-service.d.ts +1 -4
  357. package/src/services/validation/schema-validation-service.js +12 -13
  358. package/src/services/validation/standard-schema.types.d.ts +9 -62
  359. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  360. package/src/services/validation/validate-standard-schema.js +14 -0
  361. package/src/static-site-generator/README.md +41 -0
  362. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +28 -0
  363. package/src/static-site-generator/production-page-browser-graph-prebuild.js +22 -0
  364. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  365. package/src/static-site-generator/sitemap-routes.js +31 -0
  366. package/src/static-site-generator/sitemap.d.ts +15 -0
  367. package/src/static-site-generator/sitemap.js +33 -0
  368. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  369. package/src/static-site-generator/static-build-invalidation.js +59 -0
  370. package/src/static-site-generator/static-export-context.d.ts +30 -0
  371. package/src/static-site-generator/static-export-context.js +0 -0
  372. package/src/static-site-generator/static-site-generator.d.ts +43 -25
  373. package/src/static-site-generator/static-site-generator.js +381 -106
  374. package/src/types/internal-types.d.ts +39 -13
  375. package/src/types/public-types.d.ts +289 -52
  376. package/src/utils/ecopages-route-info.d.ts +26 -0
  377. package/src/utils/ecopages-route-info.js +26 -0
  378. package/src/utils/html-escaping.d.ts +7 -0
  379. package/src/utils/html-escaping.js +5 -1
  380. package/src/utils/parse-cli-args.d.ts +2 -0
  381. package/src/utils/parse-cli-args.js +6 -0
  382. package/src/utils/path-pattern.d.ts +23 -0
  383. package/src/utils/path-pattern.js +27 -0
  384. package/src/utils/server-utils.module.d.ts +3 -2
  385. package/src/utils/server-utils.module.js +5 -6
  386. package/src/utils/static-file-extensions.d.ts +12 -0
  387. package/src/utils/static-file-extensions.js +48 -0
  388. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  389. package/src/watchers/project-watcher-ignore.js +16 -0
  390. package/src/watchers/project-watcher.d.ts +29 -6
  391. package/src/watchers/project-watcher.js +146 -34
  392. package/src/watchers/project-watcher.test-helpers.js +5 -5
  393. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  394. package/src/adapters/shared/define-api-handler.js +0 -15
  395. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  396. package/src/adapters/shared/server-adapter.js +0 -436
  397. package/src/adapters/shared/server-static-builder.js +0 -162
  398. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  399. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  400. package/src/build/build-manifest.d.ts +0 -33
  401. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  402. package/src/build/rolldown-dev-build-adapter.js +0 -166
  403. package/src/build/runtime-build-executor.d.ts +0 -21
  404. package/src/build/runtime-build-executor.js +0 -19
  405. package/src/build/runtime-build-output-normalizer.d.ts +0 -3
  406. package/src/build/runtime-build-output-normalizer.js +0 -111
  407. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  408. package/src/hmr/hmr.test.e2e.js +0 -43
  409. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  410. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  411. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  412. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  413. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  414. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  415. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  416. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  417. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  418. /package/src/adapters/shared/{explicit-static-render-preparation.js → http/explicit-static-render-preparation.js} +0 -0
  419. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  420. /package/src/adapters/shared/{runtime-host.js → runtime/runtime-host.js} +0 -0
  421. /package/src/adapters/shared/{static-preview-host.js → runtime/static-preview-host.js} +0 -0
  422. /package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +0 -0
  423. /package/src/build/{browser-runtime-manifest.js → browser/browser-runtime-manifest.js} +0 -0
  424. /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
  425. /package/src/build/{browser-runtime-plugin-helpers.js → browser/browser-runtime-plugin-helpers.js} +0 -0
  426. /package/src/build/{build-types.js → contracts/build-contracts.js} +0 -0
  427. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  428. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
  429. /package/src/build/{server-side-css-shim-plugin.js → rolldown/server-side-css-shim-plugin.js} +0 -0
  430. /package/src/build/{serialized-build-executor.js → runtime/serialized-build-executor.js} +0 -0
  431. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → client/navigation-scripts/navigation-scripts.test.browser.d.ts} +0 -0
  432. /package/src/{hmr/hmr.test.e2e.d.ts → client/scroll.test.browser.d.ts} +0 -0
  433. /package/src/route-renderer/orchestration/{processed-asset-dedupe.js → page-browser-graph/processed-asset-dedupe.js} +0 -0
@@ -2,19 +2,40 @@ import path from "node:path";
2
2
  import { pathToFileURL } from "node:url";
3
3
  import { fileSystem } from "@ecopages/file-system";
4
4
  import { build } from "../../build/build-adapter.js";
5
- import { normalizeNodeRuntimeBuildOutputFile } from "../../build/runtime-build-output-normalizer.js";
5
+ import { createServerBuildRequest } from "../../build/runtime/build-request-policy.js";
6
+ import { resolveBuildProfileOptions } from "../../build/runtime/build-profile-options.js";
7
+ import {
8
+ importPagesUnifiedGraphModule,
9
+ isPagesUnifiedGraphPage,
10
+ shouldBuildPagesUnifiedGraph
11
+ } from "../../build/cache/pages-unified-graph-build.js";
12
+ import { recordPageModuleBuildInvocation } from "../../build/rolldown/rolldown-build-invocation-metrics.js";
13
+ import { resolvePageModuleOutputFileName } from "./route-module-build-cache.js";
14
+ import { createPluginCacheKey, createJsxCacheKey } from "../../build/cache/cache-keys.js";
15
+ import { getSharedRouteModuleBuildCache } from "./route-module-build-cache-registry.js";
16
+ import {
17
+ RouteModuleDependencyHasher,
18
+ resolveRouteModuleDependencyPaths
19
+ } from "./route-module-dependency-hasher.js";
6
20
  import { supportsSourceModuleLoading } from "./source-module-support.js";
7
21
  class PageModuleImportService {
22
+ appConfig;
8
23
  dependencies;
24
+ dependencyHasher;
9
25
  importCache = /* @__PURE__ */ new Map();
10
26
  developmentInvalidationVersion = 0;
11
- constructor(dependencies) {
27
+ constructor(appConfig, dependencies) {
28
+ this.appConfig = appConfig;
12
29
  this.dependencies = {
13
30
  hashFile: dependencies?.hashFile ?? ((filePath) => fileSystem.hash(filePath)),
14
31
  buildModule: dependencies?.buildModule ?? ((options, buildExecutor) => build(options, buildExecutor)),
15
32
  canLoadSourceModuleFromHost: dependencies?.canLoadSourceModuleFromHost ?? supportsSourceModuleLoading,
16
33
  getHostModuleLoader: dependencies?.getHostModuleLoader ?? (() => void 0)
17
34
  };
35
+ this.dependencyHasher = new RouteModuleDependencyHasher({
36
+ hashFile: (filePath) => this.dependencies.hashFile(filePath),
37
+ exists: (filePath) => fileSystem.exists(filePath)
38
+ });
18
39
  }
19
40
  /**
20
41
  * Clears the shared import cache used by framework-owned page-module loads.
@@ -33,6 +54,7 @@ class PageModuleImportService {
33
54
  */
34
55
  invalidateDevelopmentGraph() {
35
56
  this.clearImportCache();
57
+ this.dependencyHasher.clearMemo();
36
58
  this.developmentInvalidationVersion += 1;
37
59
  }
38
60
  /**
@@ -70,6 +92,7 @@ class PageModuleImportService {
70
92
  runtime,
71
93
  filePath,
72
94
  options.rootDir,
95
+ path.resolve(options.outdir),
73
96
  splitting ?? "default",
74
97
  externalPackages ?? "default",
75
98
  options.cacheScope ?? "default",
@@ -80,13 +103,20 @@ class PageModuleImportService {
80
103
  ].join("::");
81
104
  const cachedModule = this.importCache.get(cacheKey);
82
105
  if (cachedModule) {
83
- return await cachedModule;
106
+ if (!cachedModule.dependencyHashes) {
107
+ return await cachedModule.promise;
108
+ }
109
+ if (this.dependencyHasher.matchesStoredHashes(cachedModule.dependencyHashes, filePath, fileHash)) {
110
+ return await cachedModule.promise;
111
+ }
112
+ this.importCache.delete(cacheKey);
84
113
  }
85
114
  const importPromise = this.loadModule({
86
115
  ...options,
87
- fileHash
116
+ fileHash,
117
+ importCacheKey: cacheKey
88
118
  });
89
- this.importCache.set(cacheKey, importPromise);
119
+ this.importCache.set(cacheKey, { promise: importPromise });
90
120
  try {
91
121
  return await importPromise;
92
122
  } catch (error) {
@@ -95,7 +125,13 @@ class PageModuleImportService {
95
125
  }
96
126
  }
97
127
  async loadModule(options) {
98
- const { filePath, invalidationVersion = this.developmentInvalidationVersion, cacheScope, fileHash } = options;
128
+ const {
129
+ filePath,
130
+ invalidationVersion = this.developmentInvalidationVersion,
131
+ cacheScope,
132
+ fileHash,
133
+ importCacheKey
134
+ } = options;
99
135
  const {
100
136
  rootDir,
101
137
  outdir,
@@ -104,39 +140,85 @@ class PageModuleImportService {
104
140
  transpileErrorMessage = (details) => `Error transpiling page module: ${details}`,
105
141
  noOutputMessage = (targetFilePath) => `No transpiled output generated for page module: ${targetFilePath}`
106
142
  } = options;
107
- const fileBaseName = path.basename(filePath, path.extname(filePath));
108
- const cacheScopeSuffix = cacheScope ? `-${sanitizeCacheScope(cacheScope)}` : "";
109
- const invalidationSuffix = shouldVersionBuildOutputPath(invalidationVersion) ? `-v${invalidationVersion}` : "";
110
- const outputFileName = `${fileBaseName}-${fileHash}${cacheScopeSuffix}${invalidationSuffix}.mjs`;
111
- const outputNamingTemplate = `${fileBaseName}-${fileHash}${cacheScopeSuffix}${invalidationSuffix}.[ext]`;
112
- const buildResult = await this.dependencies.buildModule(
113
- {
143
+ const outputFileName = resolvePageModuleOutputFileName({
144
+ filePath,
145
+ fileHash,
146
+ cacheScope,
147
+ invalidationVersion
148
+ });
149
+ const outputNamingTemplate = outputFileName.replace(/\.mjs$/u, ".[ext]");
150
+ const preferredOutputPath = path.join(outdir, outputFileName);
151
+ const buildOptions = this.appConfig ? createServerBuildRequest(this.appConfig, {
152
+ profile: "route-module",
153
+ entrypoints: [filePath],
154
+ outdir,
155
+ naming: outputNamingTemplate,
156
+ splitting: splitting ?? true,
157
+ jsx: options.jsx,
158
+ plugins: options.plugins,
159
+ root: rootDir,
160
+ ...externalPackages !== void 0 ? { externalPackages } : {}
161
+ }) : {
162
+ ...resolveBuildProfileOptions("route-module", { rootDir }, {
114
163
  entrypoints: [filePath],
115
- root: rootDir,
116
164
  outdir,
117
- target: "es2022",
118
- format: "esm",
119
- sourcemap: "none",
120
- splitting: splitting ?? true,
121
- minify: false,
122
165
  naming: outputNamingTemplate,
123
- externalPackages: true,
166
+ splitting: splitting ?? true,
124
167
  jsx: options.jsx,
125
168
  plugins: options.plugins,
126
169
  ...externalPackages !== void 0 ? { externalPackages } : {}
127
- },
128
- options.buildExecutor
129
- );
170
+ }),
171
+ root: rootDir,
172
+ entrypoints: [filePath]
173
+ };
174
+ const cacheBuildOptions = {
175
+ ...options,
176
+ rootDir: buildOptions.root ?? rootDir,
177
+ outdir: buildOptions.outdir ?? outdir,
178
+ splitting: buildOptions.splitting,
179
+ externalPackages: buildOptions.externalPackages,
180
+ jsx: buildOptions.jsx,
181
+ plugins: buildOptions.plugins,
182
+ fileHash
183
+ };
184
+ const routeModuleBuildCache = this.getRouteModuleBuildCache(outdir);
185
+ const cachedBuild = routeModuleBuildCache.lookup(cacheBuildOptions);
186
+ if (cachedBuild) {
187
+ return await import(
188
+ /* @vite-ignore */
189
+ pathToFileURL(cachedBuild.outputPath).href
190
+ );
191
+ }
192
+ if (!cacheScope && shouldBuildPagesUnifiedGraph() && this.appConfig && isPagesUnifiedGraphPage(filePath, this.appConfig)) {
193
+ const graphModule = await importPagesUnifiedGraphModule(this.appConfig, filePath);
194
+ if (graphModule !== void 0) {
195
+ return graphModule;
196
+ }
197
+ }
198
+ recordPageModuleBuildInvocation();
199
+ const buildResult = await this.dependencies.buildModule(buildOptions, options.buildExecutor);
130
200
  if (!buildResult.success) {
131
201
  const details = buildResult.logs.map((log) => log.message).join(" | ");
132
202
  throw new Error(transpileErrorMessage(details));
133
203
  }
134
- const preferredOutputPath = path.join(outdir, outputFileName);
135
204
  const compiledOutput = buildResult.outputs.find((output) => output.path === preferredOutputPath)?.path ?? buildResult.outputs.find((output) => /\.(?:[cm]?js)$/u.test(output.path))?.path;
136
205
  if (!compiledOutput) {
137
206
  throw new Error(noOutputMessage(filePath));
138
207
  }
139
- normalizeNodeRuntimeBuildOutputFile(compiledOutput, rootDir);
208
+ const dependencyModulePaths = resolveRouteModuleDependencyPaths(buildResult, filePath, rootDir);
209
+ const dependencyHashes = this.dependencyHasher.createDependencyHashes(dependencyModulePaths);
210
+ dependencyHashes[path.normalize(filePath)] = fileHash;
211
+ if (importCacheKey) {
212
+ const cacheEntry = this.importCache.get(importCacheKey);
213
+ if (cacheEntry) {
214
+ cacheEntry.dependencyHashes = dependencyHashes;
215
+ }
216
+ }
217
+ routeModuleBuildCache.recordBuild({
218
+ ...cacheBuildOptions,
219
+ outputPath: compiledOutput,
220
+ dependencyModulePaths
221
+ });
140
222
  const compiledOutputUrl = pathToFileURL(compiledOutput);
141
223
  if (shouldAddRuntimeUpdateQuery(invalidationVersion, cacheScope)) {
142
224
  compiledOutputUrl.searchParams.set(
@@ -149,6 +231,9 @@ class PageModuleImportService {
149
231
  compiledOutputUrl.href
150
232
  );
151
233
  }
234
+ getRouteModuleBuildCache(outdir) {
235
+ return getSharedRouteModuleBuildCache(outdir, this.appConfig);
236
+ }
152
237
  }
153
238
  function createRuntimeModuleUrl(filePath, fileHash, invalidationVersion, cacheScope) {
154
239
  const moduleUrl = pathToFileURL(filePath);
@@ -163,31 +248,9 @@ function createRuntimeModuleUrl(filePath, fileHash, invalidationVersion, cacheSc
163
248
  function shouldAddRuntimeUpdateQuery(invalidationVersion, cacheScope) {
164
249
  return process.env.NODE_ENV === "development" || invalidationVersion > 0 || !!cacheScope;
165
250
  }
166
- function shouldVersionBuildOutputPath(invalidationVersion) {
167
- return typeof Bun !== "undefined" && invalidationVersion > 0;
168
- }
169
251
  function sanitizeCacheScope(cacheScope) {
170
252
  return cacheScope.replace(/[^a-zA-Z0-9_-]+/g, "-");
171
253
  }
172
- function createJsxCacheKey(jsx) {
173
- if (!jsx) {
174
- return "jsx:default";
175
- }
176
- return JSON.stringify({
177
- development: jsx.development ?? false,
178
- factory: jsx.factory ?? null,
179
- fragment: jsx.fragment ?? null,
180
- importSource: jsx.importSource ?? null,
181
- runtime: jsx.runtime ?? null,
182
- sideEffects: jsx.sideEffects ?? null
183
- });
184
- }
185
- function createPluginCacheKey(plugins) {
186
- if (!plugins || plugins.length === 0) {
187
- return "plugins:default";
188
- }
189
- return `plugins:${plugins.map((plugin) => plugin.name).join(",")}`;
190
- }
191
254
  export {
192
255
  PageModuleImportService
193
256
  };
@@ -0,0 +1,24 @@
1
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
+ import { RouteModuleBuildCache } from './route-module-build-cache.store.js';
3
+ /**
4
+ * Returns the outdir whose transpile cache backs incremental static generation.
5
+ *
6
+ * @remarks
7
+ * Static pages render through `.eco/.server-modules`. The manifest there carries
8
+ * import-graph hashes from transpile, so static-render reuse must read the same
9
+ * directory rather than `.server-route-modules`, which only serves route-registry
10
+ * scanning.
11
+ */
12
+ export declare function getServerModuleBuildCacheOutdir(appConfig: EcoPagesAppConfig): string;
13
+ /**
14
+ * @deprecated Use {@link getServerModuleBuildCacheOutdir}.
15
+ */
16
+ export declare const getRouteModuleBuildCacheOutdir: typeof getServerModuleBuildCacheOutdir;
17
+ /**
18
+ * Returns the shared production build cache for one server-module outdir.
19
+ *
20
+ * @remarks
21
+ * One app-scoped instance prevents manifest drift between page imports and static
22
+ * generation during the same build process.
23
+ */
24
+ export declare function getSharedRouteModuleBuildCache(outdir: string, appConfig?: EcoPagesAppConfig): RouteModuleBuildCache;
@@ -0,0 +1,37 @@
1
+ import path from "node:path";
2
+ import { resolveInternalExecutionDir } from "../../utils/resolve-work-dir.js";
3
+ import { RouteModuleBuildCache } from "./route-module-build-cache.store.js";
4
+ function getServerModuleBuildCacheOutdir(appConfig) {
5
+ return path.join(resolveInternalExecutionDir(appConfig), ".server-modules");
6
+ }
7
+ const getRouteModuleBuildCacheOutdir = getServerModuleBuildCacheOutdir;
8
+ function getRouteModuleBuildCacheMap(appConfig) {
9
+ const existing = appConfig.runtime?.routeModuleBuildCaches;
10
+ if (existing) {
11
+ return existing;
12
+ }
13
+ const routeModuleBuildCaches = /* @__PURE__ */ new Map();
14
+ appConfig.runtime = {
15
+ ...appConfig.runtime ?? {},
16
+ routeModuleBuildCaches
17
+ };
18
+ return routeModuleBuildCaches;
19
+ }
20
+ function getSharedRouteModuleBuildCache(outdir, appConfig) {
21
+ if (!appConfig) {
22
+ return new RouteModuleBuildCache(outdir);
23
+ }
24
+ const caches = getRouteModuleBuildCacheMap(appConfig);
25
+ const existingCache = caches.get(outdir);
26
+ if (existingCache) {
27
+ return existingCache;
28
+ }
29
+ const routeModuleBuildCache = new RouteModuleBuildCache(outdir);
30
+ caches.set(outdir, routeModuleBuildCache);
31
+ return routeModuleBuildCache;
32
+ }
33
+ export {
34
+ getRouteModuleBuildCacheOutdir,
35
+ getServerModuleBuildCacheOutdir,
36
+ getSharedRouteModuleBuildCache
37
+ };
@@ -0,0 +1,4 @@
1
+ export type { RouteModuleDependencyHashes } from './route-module-dependency-hasher.js';
2
+ export { ROUTE_MODULE_BUILD_CACHE_FILENAME, createEmptyRouteModuleBuildCacheManifest, createPersistedRouteModuleBuildKey, createPluginCacheKey, createJsxCacheKey, hashPluginSetup, getCorePackageVersion, normalizeRouteModuleCachePath, readRouteModuleBuildCacheManifest, resolvePageModuleOutputFileName, shouldPersistRouteModuleBuildCache, writeRouteModuleBuildCacheManifest, type RouteModuleBuildCacheEntry, type RouteModuleBuildCacheLookup, type RouteModuleBuildCacheManifest, type RouteModuleStaticRenderCacheContext, type RouteModuleStaticRenderCacheEntry, } from './route-module-build-manifest.js';
3
+ export { RouteModuleBuildCache } from './route-module-build-cache.store.js';
4
+ export { getRouteModuleBuildCacheOutdir, getServerModuleBuildCacheOutdir, getSharedRouteModuleBuildCache, } from './route-module-build-cache-registry.js';
@@ -0,0 +1,38 @@
1
+ import {
2
+ ROUTE_MODULE_BUILD_CACHE_FILENAME,
3
+ createEmptyRouteModuleBuildCacheManifest,
4
+ createPersistedRouteModuleBuildKey,
5
+ createPluginCacheKey,
6
+ createJsxCacheKey,
7
+ hashPluginSetup,
8
+ getCorePackageVersion,
9
+ normalizeRouteModuleCachePath,
10
+ readRouteModuleBuildCacheManifest,
11
+ resolvePageModuleOutputFileName,
12
+ shouldPersistRouteModuleBuildCache,
13
+ writeRouteModuleBuildCacheManifest
14
+ } from "./route-module-build-manifest.js";
15
+ import { RouteModuleBuildCache } from "./route-module-build-cache.store.js";
16
+ import {
17
+ getRouteModuleBuildCacheOutdir,
18
+ getServerModuleBuildCacheOutdir,
19
+ getSharedRouteModuleBuildCache
20
+ } from "./route-module-build-cache-registry.js";
21
+ export {
22
+ ROUTE_MODULE_BUILD_CACHE_FILENAME,
23
+ RouteModuleBuildCache,
24
+ createEmptyRouteModuleBuildCacheManifest,
25
+ createJsxCacheKey,
26
+ createPersistedRouteModuleBuildKey,
27
+ createPluginCacheKey,
28
+ getCorePackageVersion,
29
+ getRouteModuleBuildCacheOutdir,
30
+ getServerModuleBuildCacheOutdir,
31
+ getSharedRouteModuleBuildCache,
32
+ hashPluginSetup,
33
+ normalizeRouteModuleCachePath,
34
+ readRouteModuleBuildCacheManifest,
35
+ resolvePageModuleOutputFileName,
36
+ shouldPersistRouteModuleBuildCache,
37
+ writeRouteModuleBuildCacheManifest
38
+ };
@@ -0,0 +1,57 @@
1
+ import type { PageModuleBuildImportOptions } from './page-module-import.service.js';
2
+ import { RouteModuleDependencyHasher, type RouteModuleDependencyHashes } from './route-module-dependency-hasher.js';
3
+ import { type RouteModuleBuildCacheLookup, type RouteModuleBuildCacheManifest, type RouteModuleStaticRenderCacheContext } from './route-module-build-manifest.js';
4
+ export type { RouteModuleDependencyHashes };
5
+ type RouteModuleBuildCacheDependencies = {
6
+ readManifest: (manifestPath: string) => RouteModuleBuildCacheManifest | undefined;
7
+ writeManifest: (manifestPath: string, manifest: RouteModuleBuildCacheManifest) => void;
8
+ exists: (filePath: string) => boolean;
9
+ getCorePackageVersion: () => string;
10
+ createDependencyHasher: () => RouteModuleDependencyHasher;
11
+ };
12
+ /**
13
+ * Persists route-module transpile and static-render metadata under one server outdir.
14
+ */
15
+ export declare class RouteModuleBuildCache {
16
+ private readonly manifestPath;
17
+ private readonly dependencies;
18
+ private readonly dependencyHasher;
19
+ private manifest;
20
+ private manifestLoaded;
21
+ constructor(outdir: string, dependencies?: Partial<RouteModuleBuildCacheDependencies>);
22
+ lookup(options: PageModuleBuildImportOptions & {
23
+ fileHash: string;
24
+ }): RouteModuleBuildCacheLookup | undefined;
25
+ recordBuild(options: PageModuleBuildImportOptions & {
26
+ fileHash: string;
27
+ outputPath: string;
28
+ dependencyModulePaths?: readonly string[];
29
+ }): void;
30
+ isIncrementalStaticGenerationAvailable(context: RouteModuleStaticRenderCacheContext): boolean;
31
+ ensureIncrementalStaticGenerationContext(context: RouteModuleStaticRenderCacheContext): void;
32
+ canReuseStaticRender(options: {
33
+ sourceFile: string;
34
+ pathname: string;
35
+ renderedOutputPath: string;
36
+ context: RouteModuleStaticRenderCacheContext;
37
+ force?: boolean;
38
+ }): boolean;
39
+ lookupStaticRender(options: {
40
+ filePath: string;
41
+ pathname: string;
42
+ sourceHash: string;
43
+ renderedOutputPath: string;
44
+ context: RouteModuleStaticRenderCacheContext;
45
+ }): boolean;
46
+ recordStaticRender(options: {
47
+ filePath: string;
48
+ pathname: string;
49
+ sourceHash: string;
50
+ renderedOutputPath: string;
51
+ context: RouteModuleStaticRenderCacheContext;
52
+ }): void;
53
+ resetMemory(): void;
54
+ pruneStaleRenderedOutputs(activePathnames: ReadonlySet<string>): string[];
55
+ private loadManifest;
56
+ private persistManifest;
57
+ }
@@ -0,0 +1,207 @@
1
+ import path from "node:path";
2
+ import { fileSystem } from "@ecopages/file-system";
3
+ import { RouteModuleDependencyHasher } from "./route-module-dependency-hasher.js";
4
+ import {
5
+ ROUTE_MODULE_BUILD_CACHE_FILENAME,
6
+ createEmptyRouteModuleBuildCacheManifest,
7
+ createPersistedRouteModuleBuildKey,
8
+ getCorePackageVersion,
9
+ normalizeRouteModuleCachePath,
10
+ readRouteModuleBuildCacheManifest,
11
+ shouldPersistRouteModuleBuildCache,
12
+ writeRouteModuleBuildCacheManifest
13
+ } from "./route-module-build-manifest.js";
14
+ import {
15
+ isProductionCacheManifestCurrent,
16
+ matchesProductionCacheFingerprint
17
+ } from "../../build/cache/production-build-cache.js";
18
+ class RouteModuleBuildCache {
19
+ manifestPath;
20
+ dependencies;
21
+ dependencyHasher;
22
+ manifest;
23
+ manifestLoaded = false;
24
+ constructor(outdir, dependencies) {
25
+ this.manifestPath = path.join(outdir, ROUTE_MODULE_BUILD_CACHE_FILENAME);
26
+ this.dependencies = {
27
+ readManifest: dependencies?.readManifest ?? readRouteModuleBuildCacheManifest,
28
+ writeManifest: dependencies?.writeManifest ?? writeRouteModuleBuildCacheManifest,
29
+ exists: dependencies?.exists ?? ((filePath) => fileSystem.exists(filePath)),
30
+ getCorePackageVersion: dependencies?.getCorePackageVersion ?? getCorePackageVersion,
31
+ createDependencyHasher: dependencies?.createDependencyHasher ?? (() => new RouteModuleDependencyHasher())
32
+ };
33
+ this.dependencyHasher = this.dependencies.createDependencyHasher();
34
+ }
35
+ lookup(options) {
36
+ if (!shouldPersistRouteModuleBuildCache(options)) {
37
+ return void 0;
38
+ }
39
+ const manifest = this.loadManifest();
40
+ if (manifest.invalidationVersion !== this.dependencies.getCorePackageVersion()) {
41
+ return void 0;
42
+ }
43
+ const buildKey = createPersistedRouteModuleBuildKey(options);
44
+ const cacheFilePath = normalizeRouteModuleCachePath(options.filePath);
45
+ const entry = manifest.entries[cacheFilePath];
46
+ if (!entry || entry.sourceHash !== options.fileHash || entry.buildKey !== buildKey) {
47
+ return void 0;
48
+ }
49
+ if (!this.dependencyHasher.matchesStoredHashes(entry.dependencyHashes, cacheFilePath, options.fileHash)) {
50
+ return void 0;
51
+ }
52
+ const outputPath = path.isAbsolute(entry.outputPath) ? entry.outputPath : path.join(options.outdir, entry.outputPath);
53
+ if (!this.dependencies.exists(outputPath)) {
54
+ return void 0;
55
+ }
56
+ return { outputPath, entry };
57
+ }
58
+ recordBuild(options) {
59
+ if (!shouldPersistRouteModuleBuildCache(options)) {
60
+ return;
61
+ }
62
+ const cacheFilePath = normalizeRouteModuleCachePath(options.filePath);
63
+ const dependencyModulePaths = options.dependencyModulePaths && options.dependencyModulePaths.length > 0 ? options.dependencyModulePaths : [cacheFilePath];
64
+ const dependencyHashes = this.dependencyHasher.createDependencyHashes(dependencyModulePaths);
65
+ dependencyHashes[cacheFilePath] = options.fileHash;
66
+ const manifest = this.loadManifest();
67
+ const existingEntry = manifest.entries[cacheFilePath];
68
+ manifest.invalidationVersion = this.dependencies.getCorePackageVersion();
69
+ manifest.entries[cacheFilePath] = {
70
+ sourceHash: options.fileHash,
71
+ outputPath: options.outputPath,
72
+ builtAt: Date.now(),
73
+ buildKey: createPersistedRouteModuleBuildKey(options),
74
+ dependencyHashes,
75
+ renderedOutputs: existingEntry?.renderedOutputs
76
+ };
77
+ this.persistManifest(manifest);
78
+ }
79
+ isIncrementalStaticGenerationAvailable(context) {
80
+ if (process.env.NODE_ENV !== "production") {
81
+ return false;
82
+ }
83
+ const manifest = this.loadManifest();
84
+ if (!isProductionCacheManifestCurrent(manifest, this.dependencies.getCorePackageVersion())) {
85
+ return false;
86
+ }
87
+ return manifest.configHash === context.configHash && matchesProductionCacheFingerprint(manifest, context.buildInputsFingerprint);
88
+ }
89
+ ensureIncrementalStaticGenerationContext(context) {
90
+ if (process.env.NODE_ENV !== "production") {
91
+ return;
92
+ }
93
+ const manifest = this.loadManifest();
94
+ manifest.invalidationVersion = this.dependencies.getCorePackageVersion();
95
+ manifest.configHash = context.configHash;
96
+ manifest.buildInputsFingerprint = context.buildInputsFingerprint;
97
+ this.persistManifest(manifest);
98
+ }
99
+ canReuseStaticRender(options) {
100
+ if (options.force) {
101
+ return false;
102
+ }
103
+ if (!fileSystem.exists(options.sourceFile)) {
104
+ return false;
105
+ }
106
+ const sourceHash = fileSystem.hash(options.sourceFile);
107
+ return this.lookupStaticRender({
108
+ filePath: options.sourceFile,
109
+ pathname: options.pathname,
110
+ sourceHash,
111
+ renderedOutputPath: options.renderedOutputPath,
112
+ context: options.context
113
+ });
114
+ }
115
+ lookupStaticRender(options) {
116
+ if (!this.isIncrementalStaticGenerationAvailable(options.context)) {
117
+ return false;
118
+ }
119
+ const manifest = this.loadManifest();
120
+ const cacheFilePath = normalizeRouteModuleCachePath(options.filePath);
121
+ const entry = manifest.entries[cacheFilePath];
122
+ const renderedOutput = entry?.renderedOutputs?.[options.pathname];
123
+ if (!entry || !renderedOutput) {
124
+ return false;
125
+ }
126
+ if (entry.sourceHash !== options.sourceHash || renderedOutput.sourceHash !== options.sourceHash) {
127
+ return false;
128
+ }
129
+ if (!this.dependencyHasher.matchesStoredHashes(entry.dependencyHashes, cacheFilePath, options.sourceHash)) {
130
+ return false;
131
+ }
132
+ const cachedOutputPath = path.isAbsolute(renderedOutput.renderedOutputPath) ? renderedOutput.renderedOutputPath : path.resolve(renderedOutput.renderedOutputPath);
133
+ if (cachedOutputPath !== path.resolve(options.renderedOutputPath)) {
134
+ return false;
135
+ }
136
+ return this.dependencies.exists(cachedOutputPath);
137
+ }
138
+ recordStaticRender(options) {
139
+ if (process.env.NODE_ENV !== "production") {
140
+ return;
141
+ }
142
+ const cacheFilePath = normalizeRouteModuleCachePath(options.filePath);
143
+ const manifest = this.loadManifest();
144
+ const existingEntry = manifest.entries[cacheFilePath];
145
+ manifest.invalidationVersion = this.dependencies.getCorePackageVersion();
146
+ manifest.configHash = options.context.configHash;
147
+ manifest.buildInputsFingerprint = options.context.buildInputsFingerprint;
148
+ manifest.entries[cacheFilePath] = {
149
+ sourceHash: options.sourceHash,
150
+ outputPath: existingEntry?.outputPath ?? "",
151
+ builtAt: existingEntry?.builtAt ?? Date.now(),
152
+ buildKey: existingEntry?.buildKey ?? "",
153
+ dependencyHashes: existingEntry?.dependencyHashes,
154
+ renderedOutputs: {
155
+ ...existingEntry?.renderedOutputs ?? {},
156
+ [options.pathname]: {
157
+ renderedOutputPath: options.renderedOutputPath,
158
+ renderedAt: Date.now(),
159
+ sourceHash: options.sourceHash
160
+ }
161
+ }
162
+ };
163
+ this.persistManifest(manifest);
164
+ }
165
+ resetMemory() {
166
+ this.manifest = void 0;
167
+ this.manifestLoaded = false;
168
+ }
169
+ pruneStaleRenderedOutputs(activePathnames) {
170
+ if (process.env.NODE_ENV !== "production") {
171
+ return [];
172
+ }
173
+ const manifest = this.loadManifest();
174
+ const removedOutputPaths = [];
175
+ for (const entry of Object.values(manifest.entries)) {
176
+ if (!entry.renderedOutputs) {
177
+ continue;
178
+ }
179
+ for (const [pathname, renderedOutput] of Object.entries(entry.renderedOutputs)) {
180
+ if (activePathnames.has(pathname)) {
181
+ continue;
182
+ }
183
+ removedOutputPaths.push(renderedOutput.renderedOutputPath);
184
+ delete entry.renderedOutputs[pathname];
185
+ }
186
+ }
187
+ if (removedOutputPaths.length > 0) {
188
+ this.persistManifest(manifest);
189
+ }
190
+ return removedOutputPaths;
191
+ }
192
+ loadManifest() {
193
+ if (this.manifestLoaded) {
194
+ return this.manifest ?? createEmptyRouteModuleBuildCacheManifest();
195
+ }
196
+ this.manifestLoaded = true;
197
+ this.manifest = this.dependencies.readManifest(this.manifestPath) ?? createEmptyRouteModuleBuildCacheManifest();
198
+ return this.manifest;
199
+ }
200
+ persistManifest(manifest) {
201
+ this.manifest = manifest;
202
+ this.dependencies.writeManifest(this.manifestPath, manifest);
203
+ }
204
+ }
205
+ export {
206
+ RouteModuleBuildCache
207
+ };
@@ -0,0 +1,54 @@
1
+ import type { PageModuleBuildImportOptions } from './page-module-import.service.js';
2
+ import type { RouteModuleDependencyHashes } from './route-module-dependency-hasher.js';
3
+ export { createJsxCacheKey, createPluginCacheKey, getCorePackageVersion, hashPluginSetup, } from '../../build/cache/cache-keys.js';
4
+ export { ROUTE_MODULE_BUILD_CACHE_FILENAME } from '../../build/cache/cache-constants.js';
5
+ /** One persisted route-module build entry in {@link ROUTE_MODULE_BUILD_CACHE_FILENAME}. */
6
+ export interface RouteModuleBuildCacheEntry {
7
+ sourceHash: string;
8
+ outputPath: string;
9
+ builtAt: number;
10
+ buildKey: string;
11
+ dependencyHashes?: RouteModuleDependencyHashes;
12
+ renderedOutputs?: Record<string, RouteModuleStaticRenderCacheEntry>;
13
+ }
14
+ /** Metadata for one rendered static HTML artifact derived from a route module. */
15
+ export interface RouteModuleStaticRenderCacheEntry {
16
+ renderedOutputPath: string;
17
+ renderedAt: number;
18
+ sourceHash: string;
19
+ }
20
+ /** On-disk manifest describing all cached route-module builds for one server outdir. */
21
+ export interface RouteModuleBuildCacheManifest {
22
+ invalidationVersion: string;
23
+ configHash?: string;
24
+ buildInputsFingerprint?: string;
25
+ entries: Record<string, RouteModuleBuildCacheEntry>;
26
+ }
27
+ /** Successful route-module cache lookup result. */
28
+ export interface RouteModuleBuildCacheLookup {
29
+ outputPath: string;
30
+ entry: RouteModuleBuildCacheEntry;
31
+ }
32
+ /** Inputs that must remain stable for incremental static HTML generation. */
33
+ export interface RouteModuleStaticRenderCacheContext {
34
+ configHash: string;
35
+ buildInputsFingerprint: string;
36
+ }
37
+ export type RouteModuleBuildCacheManifestReader = (manifestPath: string) => RouteModuleBuildCacheManifest | undefined;
38
+ export type RouteModuleBuildCacheManifestWriter = (manifestPath: string, manifest: RouteModuleBuildCacheManifest) => void;
39
+ /** Normalizes filesystem paths used as manifest keys and build-key inputs. */
40
+ export declare function normalizeRouteModuleCachePath(filePath: string): string;
41
+ /** Returns whether route-module disk caching should run for the current import. */
42
+ export declare function shouldPersistRouteModuleBuildCache(options: PageModuleBuildImportOptions): boolean;
43
+ /** Derives the deterministic on-disk filename for one transpiled route module. */
44
+ export declare function resolvePageModuleOutputFileName(options: {
45
+ filePath: string;
46
+ fileHash: string;
47
+ cacheScope?: string;
48
+ invalidationVersion?: number;
49
+ }): string;
50
+ /** Builds the cache key for persisted production route-module builds. */
51
+ export declare function createPersistedRouteModuleBuildKey(options: PageModuleBuildImportOptions): string;
52
+ export declare function createEmptyRouteModuleBuildCacheManifest(): RouteModuleBuildCacheManifest;
53
+ export declare function readRouteModuleBuildCacheManifest(manifestPath: string): RouteModuleBuildCacheManifest | undefined;
54
+ export declare function writeRouteModuleBuildCacheManifest(manifestPath: string, manifest: RouteModuleBuildCacheManifest): void;