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

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
@@ -1,8 +1,27 @@
1
1
  import path from "node:path";
2
+ import { availableParallelism } from "node:os";
2
3
  import { appLogger } from "../global/app-logger.js";
3
4
  import { fileSystem } from "@ecopages/file-system";
4
- import { PathUtils } from "../utils/path-utils.module.js";
5
- import { prepareExplicitStaticRender } from "../adapters/shared/explicit-static-render-preparation.js";
5
+ import { prepareExplicitStaticRender } from "../adapters/shared/http/explicit-static-render-preparation.js";
6
+ import { createRouteModuleStaticRenderCacheContext } from "./static-build-invalidation.js";
7
+ import {
8
+ getServerModuleBuildCacheOutdir,
9
+ getSharedRouteModuleBuildCache
10
+ } from "../services/module-loading/route-module-build-cache-registry.js";
11
+ import {
12
+ ensurePagesUnifiedGraphBuilt,
13
+ shouldBuildPagesUnifiedGraph
14
+ } from "../build/cache/pages-unified-graph-build.js";
15
+ import {
16
+ clearProductionPageBrowserGraphSession,
17
+ prebuildProductionPageBrowserGraphs,
18
+ shouldPrebuildProductionPageBrowserGraphs
19
+ } from "./production-page-browser-graph-prebuild.js";
20
+ import { PageModuleLoaderService } from "../route-renderer/page-loading/page-module-loader.js";
21
+ import { renderSitemap } from "./sitemap.js";
22
+ import { resolveSitemapLocations } from "./sitemap-routes.js";
23
+ import { toEcopagesRouteInfo } from "../utils/ecopages-route-info.js";
24
+ import { normalizePathname } from "../utils/path-pattern.js";
6
25
  const STATIC_SITE_GENERATOR_ERRORS = {
7
26
  ROUTE_RENDERER_FACTORY_REQUIRED: "RouteRendererFactory is required for render strategy",
8
27
  unsupportedBodyType: (bodyType) => `Unsupported body type for static generation: ${bodyType}`,
@@ -10,50 +29,53 @@ const STATIC_SITE_GENERATOR_ERRORS = {
10
29
  noRendererForIntegration: (integrationName) => `No renderer found for integration: ${integrationName}`,
11
30
  dynamicRouteRequiresStaticPaths: (routePath) => `Dynamic route ${routePath} requires staticPaths to be defined on the view.`
12
31
  };
32
+ function resolveStaticPageConcurrency() {
33
+ return Math.max(1, availableParallelism() - 1);
34
+ }
35
+ async function runWithConcurrency(items, concurrency, worker) {
36
+ if (items.length === 0) {
37
+ return;
38
+ }
39
+ const limit = Math.max(1, concurrency);
40
+ let nextIndex = 0;
41
+ const runners = Array.from({ length: Math.min(limit, items.length) }, async () => {
42
+ while (nextIndex < items.length) {
43
+ const currentIndex = nextIndex++;
44
+ await worker(items[currentIndex]);
45
+ }
46
+ });
47
+ await Promise.all(runners);
48
+ }
13
49
  class StaticSiteGenerator {
14
50
  appConfig;
51
+ routeModuleBuildCacheOverride;
52
+ staticRenderCacheContext;
53
+ forceFullStaticGeneration = false;
54
+ pageModuleLoader;
15
55
  /**
16
56
  * Creates the static-site generator for one app config.
17
57
  */
18
- constructor({ appConfig }) {
58
+ constructor({
59
+ appConfig,
60
+ routeModuleBuildCache
61
+ }) {
19
62
  this.appConfig = appConfig;
63
+ this.routeModuleBuildCacheOverride = routeModuleBuildCache;
64
+ this.staticRenderCacheContext = createRouteModuleStaticRenderCacheContext(appConfig);
65
+ }
66
+ getRouteModuleBuildCache() {
67
+ return this.routeModuleBuildCacheOverride ?? getSharedRouteModuleBuildCache(getServerModuleBuildCacheOutdir(this.appConfig), this.appConfig);
20
68
  }
21
69
  getExportDir() {
22
70
  return this.appConfig.absolutePaths?.distDir ?? path.join(this.appConfig.rootDir, this.appConfig.distDir);
23
71
  }
24
- /**
25
- * Logs the standardized warning emitted when a dynamic-cache page is skipped.
26
- */
27
- warnDynamicPageSkipped(filePath) {
28
- appLogger.warn(
29
- "Pages with cache: 'dynamic' are not supported in static generation or preview, so they will be skipped\n",
30
- `\u27A4 ${filePath}`
31
- );
32
- }
33
- /**
34
- * Determines whether one filesystem-discovered page should be excluded from
35
- * static generation.
36
- */
37
72
  async shouldSkipStaticPageFile(filePath, routeRendererFactory) {
38
- const module = await routeRendererFactory.getPageRenderer(filePath).loadPageModule(filePath, {
39
- cacheScope: "static-page-probe"
40
- });
41
- if (module.default?.cache !== "dynamic") {
42
- return false;
43
- }
44
- this.warnDynamicPageSkipped(filePath);
45
- return true;
73
+ const pageModule = await routeRendererFactory.getPageRenderer(filePath).loadPageModule(filePath);
74
+ const Page = pageModule.default;
75
+ return Page.cache === "dynamic";
46
76
  }
47
- /**
48
- * Determines whether one explicit static route view should be excluded from
49
- * static generation.
50
- */
51
- shouldSkipStaticView(routePath, view) {
52
- if (view.cache !== "dynamic") {
53
- return false;
54
- }
55
- this.warnDynamicPageSkipped(routePath);
56
- return true;
77
+ shouldSkipStaticView(_routePath, view) {
78
+ return view.cache === "dynamic";
57
79
  }
58
80
  /**
59
81
  * Writes the robots.txt file declared by the app config.
@@ -73,6 +95,14 @@ class StaticSiteGenerator {
73
95
  fileSystem.ensureDir(this.getExportDir());
74
96
  fileSystem.write(path.join(this.getExportDir(), "robots.txt"), data);
75
97
  }
98
+ /**
99
+ * Writes the configured sitemap file to the export directory.
100
+ */
101
+ generateSitemap(locations, sitemap) {
102
+ const fileName = sitemap.fileName ?? "sitemap.xml";
103
+ fileSystem.ensureDir(this.getExportDir());
104
+ fileSystem.write(path.join(this.getExportDir(), fileName), renderSitemap(locations));
105
+ }
76
106
  /**
77
107
  * Returns whether the input path points at the root directory.
78
108
  */
@@ -100,29 +130,126 @@ class StaticSiteGenerator {
100
130
  fileSystem.write(outputPath, contents);
101
131
  return outputPath;
102
132
  }
103
- getStaticBuildStrategy(filePath) {
104
- const ext = PathUtils.getEcoTemplateExtension(filePath);
105
- const integration = this.appConfig.integrations.find((plugin) => plugin.extensions.includes(ext));
106
- return integration?.staticBuildStep || "render";
133
+ async writeStaticPageArtifact(options) {
134
+ const directories = options.directories ?? this.getDirectories([options.pathname]);
135
+ const renderedOutputPath = this.getOutputPath(options.pathname, directories);
136
+ const routeModuleBuildCache = this.getRouteModuleBuildCache();
137
+ if (options.reuseRenderedOutput !== false && options.sourceFile && routeModuleBuildCache.canReuseStaticRender({
138
+ sourceFile: options.sourceFile,
139
+ pathname: options.pathname,
140
+ renderedOutputPath,
141
+ context: this.staticRenderCacheContext,
142
+ force: this.forceFullStaticGeneration
143
+ })) {
144
+ options.activeStaticPathnames?.add(options.pathname);
145
+ await options.onSuccessfulExport?.();
146
+ appLogger.debug(`Skipped unchanged static page: ${options.debugLabel ?? options.pathname}`);
147
+ return;
148
+ }
149
+ const contents = await options.createContents();
150
+ if (contents === null) {
151
+ return;
152
+ }
153
+ const outputPath = this.writeStaticOutput(options.pathname, contents, directories);
154
+ options.activeStaticPathnames?.add(options.pathname);
155
+ if (options.sourceFile) {
156
+ try {
157
+ routeModuleBuildCache.recordStaticRender({
158
+ filePath: options.sourceFile,
159
+ pathname: options.pathname,
160
+ sourceHash: fileSystem.hash(options.sourceFile),
161
+ renderedOutputPath: outputPath,
162
+ context: this.staticRenderCacheContext
163
+ });
164
+ } catch (error) {
165
+ appLogger.debug(
166
+ `Failed to record static render cache for ${options.pathname}`,
167
+ error instanceof Error ? error.message : String(error)
168
+ );
169
+ }
170
+ }
171
+ await options.onSuccessfulExport?.();
172
+ }
173
+ /**
174
+ * Marks a successfully exported pathname as sitemap-eligible when robots allow indexing.
175
+ *
176
+ * @remarks
177
+ * Fail-closed: metadata resolution errors omit the URL. `robots.index === false`
178
+ * also omits it. Eligibility is decided during generation, not by reloading modules
179
+ * after `afterStaticExport`.
180
+ */
181
+ async considerSitemapEligibility(input) {
182
+ if (!input.sitemapEligiblePathnames || !this.appConfig.sitemap?.enabled) {
183
+ return;
184
+ }
185
+ try {
186
+ const metadata = await input.resolveMetadata();
187
+ if (metadata.robots?.index === false) {
188
+ return;
189
+ }
190
+ input.sitemapEligiblePathnames.add(normalizePathname(input.pathname));
191
+ } catch (error) {
192
+ appLogger.debug(
193
+ `Sitemap eligibility skipped for ${input.pathname}; metadata resolution failed`,
194
+ error instanceof Error ? error.message : String(error)
195
+ );
196
+ }
107
197
  }
108
- async createFilesystemStaticContents(route, baseUrl, routeRendererFactory) {
109
- const {
110
- templateRoute: { filePath },
111
- params
112
- } = route;
113
- if (this.getStaticBuildStrategy(filePath) === "fetch") {
114
- const fetchUrl = this.resolveStaticFetchUrl(route.requestUrl, baseUrl);
115
- const response = await fetch(fetchUrl);
116
- if (!response.ok) {
117
- appLogger.error(`Failed to fetch ${fetchUrl}. Status: ${response.status}`);
118
- return null;
198
+ getPageModuleLoader(baseUrl) {
199
+ this.pageModuleLoader ??= new PageModuleLoaderService(this.appConfig, baseUrl);
200
+ return this.pageModuleLoader;
201
+ }
202
+ async resolveFilesystemPageMetadata(input) {
203
+ const loader = this.getPageModuleLoader(input.baseUrl);
204
+ const pageModule = await loader.resolvePageModule({
205
+ file: input.filePath,
206
+ importPageFileFn: (file) => input.routeRendererFactory.getPageRenderer(file).loadPageModule(file)
207
+ });
208
+ const { metadata } = await loader.resolvePageData({
209
+ pageModule,
210
+ routeOptions: {
211
+ file: input.filePath,
212
+ params: input.params
119
213
  }
120
- return response.text();
214
+ });
215
+ return metadata;
216
+ }
217
+ async resolveExplicitViewMetadata(input) {
218
+ if (!input.view.metadata) {
219
+ return this.appConfig.defaultMetadata;
121
220
  }
221
+ const dynamicMetadata = await input.view.metadata({
222
+ params: input.params,
223
+ query: {},
224
+ props: input.props,
225
+ appConfig: this.appConfig
226
+ });
227
+ return { ...this.appConfig.defaultMetadata, ...dynamicMetadata };
228
+ }
229
+ pruneStaleStaticOutputs(activeStaticPathnames) {
230
+ const removedOutputPaths = this.getRouteModuleBuildCache().pruneStaleRenderedOutputs(activeStaticPathnames);
231
+ for (const outputPath of removedOutputPaths) {
232
+ const resolvedOutputPath = path.isAbsolute(outputPath) ? outputPath : path.resolve(outputPath);
233
+ if (fileSystem.exists(resolvedOutputPath)) {
234
+ fileSystem.remove(resolvedOutputPath);
235
+ appLogger.debug(`Removed stale static output: ${resolvedOutputPath}`);
236
+ }
237
+ }
238
+ }
239
+ async createFilesystemStaticContents(input) {
240
+ const {
241
+ route: {
242
+ templateRoute: { filePath },
243
+ params
244
+ },
245
+ routeRendererFactory,
246
+ skipped
247
+ } = input;
122
248
  if (!routeRendererFactory) {
123
249
  throw new Error(STATIC_SITE_GENERATOR_ERRORS.ROUTE_RENDERER_FACTORY_REQUIRED);
124
250
  }
125
251
  if (await this.shouldSkipStaticPageFile(filePath, routeRendererFactory)) {
252
+ skipped?.push(filePath);
126
253
  return null;
127
254
  }
128
255
  const renderer = routeRendererFactory.getPageRenderer(filePath);
@@ -143,42 +270,73 @@ class StaticSiteGenerator {
143
270
  * Generates static output for all filesystem-discovered routes.
144
271
  *
145
272
  * @remarks
146
- * Routes whose integrations opt into fetch-based static builds are rendered by
147
- * issuing a request against the running server origin. Render-strategy routes
148
- * go through the normal route renderer directly.
273
+ * Routes are rendered through the normal route renderer directly.
149
274
  */
150
- async generateStaticPages(router, baseUrl, routeRendererFactory) {
151
- const routes = await router.listStaticGenerationRoutes({ runtimeOrigin: baseUrl });
275
+ async generateStaticPages(input) {
276
+ const { router, baseUrl, routeRendererFactory, skipped, activeStaticPathnames, sitemapEligiblePathnames } = input;
277
+ const routes = input.preloadedRoutes ?? await router.listStaticGenerationRoutes({ runtimeOrigin: baseUrl });
152
278
  appLogger.debug(
153
279
  "Static Pages",
154
280
  routes.map((route) => route.requestUrl)
155
281
  );
156
282
  const directories = this.getDirectories(routes.map((route) => route.requestUrl));
157
- for (const route of routes) {
283
+ await runWithConcurrency(routes, resolveStaticPageConcurrency(), async (route) => {
158
284
  try {
159
- const contents = await this.createFilesystemStaticContents(route, baseUrl, routeRendererFactory);
160
- if (contents === null) {
161
- continue;
162
- }
163
- this.writeStaticOutput(route.pathname, contents, directories);
285
+ await this.writeStaticPageArtifact({
286
+ pathname: route.pathname,
287
+ sourceFile: route.templateRoute.filePath,
288
+ directories,
289
+ debugLabel: route.requestUrl,
290
+ activeStaticPathnames,
291
+ onSuccessfulExport: () => this.considerSitemapEligibility({
292
+ pathname: route.pathname,
293
+ sitemapEligiblePathnames,
294
+ resolveMetadata: () => {
295
+ if (!routeRendererFactory) {
296
+ throw new Error(STATIC_SITE_GENERATOR_ERRORS.ROUTE_RENDERER_FACTORY_REQUIRED);
297
+ }
298
+ return this.resolveFilesystemPageMetadata({
299
+ filePath: route.templateRoute.filePath,
300
+ params: route.params,
301
+ baseUrl,
302
+ routeRendererFactory
303
+ });
304
+ }
305
+ }),
306
+ createContents: () => this.createFilesystemStaticContents({
307
+ route,
308
+ baseUrl,
309
+ routeRendererFactory,
310
+ skipped
311
+ })
312
+ });
164
313
  } catch (error) {
165
314
  appLogger.error(
166
315
  `Error generating static page for ${route.requestUrl}:`,
167
316
  error instanceof Error ? error : String(error)
168
317
  );
169
318
  }
170
- }
319
+ });
171
320
  }
172
- resolveStaticFetchUrl(route, baseUrl) {
173
- if (!route.startsWith("http://") && !route.startsWith("https://")) {
174
- return `${baseUrl}${route}`;
321
+ createStaticExportContext(input) {
322
+ return {
323
+ appConfig: this.appConfig,
324
+ router: input.router,
325
+ baseUrl: input.baseUrl,
326
+ routeRendererFactory: input.routeRendererFactory,
327
+ staticRoutes: input.staticRoutes,
328
+ force: input.force,
329
+ preserveExportDirectory: input.preserveExportDirectory,
330
+ routes: input.routes
331
+ };
332
+ }
333
+ async invokeStaticExportHook(hook, context) {
334
+ for (const integration of this.appConfig.integrations) {
335
+ const handler = integration[hook];
336
+ if (typeof handler === "function") {
337
+ await handler.call(integration, context);
338
+ }
175
339
  }
176
- const targetUrl = new URL(route);
177
- const buildUrl = new URL(baseUrl);
178
- buildUrl.pathname = targetUrl.pathname;
179
- buildUrl.search = targetUrl.search;
180
- buildUrl.hash = targetUrl.hash;
181
- return buildUrl.href;
182
340
  }
183
341
  /**
184
342
  * Executes the full static-generation workflow for one app run.
@@ -187,31 +345,114 @@ class StaticSiteGenerator {
187
345
  router,
188
346
  baseUrl,
189
347
  routeRendererFactory,
190
- staticRoutes
348
+ staticRoutes,
349
+ force = false,
350
+ preserveExportDirectory = false
191
351
  }) {
192
- this.generateRobotsTxt();
193
- await this.generateStaticPages(router, baseUrl, routeRendererFactory);
194
- if (staticRoutes && staticRoutes.length > 0 && routeRendererFactory) {
195
- await this.generateExplicitStaticPages(staticRoutes, routeRendererFactory);
352
+ const skippedDynamicPages = [];
353
+ const activeStaticPathnames = /* @__PURE__ */ new Set();
354
+ const sitemapEligiblePathnames = this.appConfig.sitemap?.enabled ? /* @__PURE__ */ new Set() : void 0;
355
+ this.forceFullStaticGeneration = force;
356
+ this.staticRenderCacheContext = createRouteModuleStaticRenderCacheContext(this.appConfig);
357
+ this.pageModuleLoader = void 0;
358
+ if (!force) {
359
+ this.getRouteModuleBuildCache().ensureIncrementalStaticGenerationContext(this.staticRenderCacheContext);
360
+ }
361
+ if (shouldPrebuildProductionPageBrowserGraphs() && force) {
362
+ clearProductionPageBrowserGraphSession(this.appConfig);
363
+ }
364
+ const routes = await router.listStaticGenerationRoutes({ runtimeOrigin: baseUrl });
365
+ const exportRoutes = routes.map((route) => toEcopagesRouteInfo(route));
366
+ if (shouldBuildPagesUnifiedGraph()) {
367
+ await ensurePagesUnifiedGraphBuilt({
368
+ appConfig: this.appConfig,
369
+ entryPaths: routes.map((route) => route.templateRoute.filePath),
370
+ outdir: getServerModuleBuildCacheOutdir(this.appConfig),
371
+ force
372
+ });
373
+ }
374
+ const staticExportContext = this.createStaticExportContext({
375
+ router,
376
+ baseUrl,
377
+ routeRendererFactory,
378
+ staticRoutes,
379
+ force,
380
+ preserveExportDirectory,
381
+ routes: exportRoutes
382
+ });
383
+ await this.invokeStaticExportHook("beforeStaticExport", staticExportContext);
384
+ try {
385
+ if (shouldPrebuildProductionPageBrowserGraphs() && routeRendererFactory) {
386
+ await prebuildProductionPageBrowserGraphs(
387
+ routes.map((route) => route.templateRoute.filePath),
388
+ routeRendererFactory
389
+ );
390
+ }
391
+ this.generateRobotsTxt();
392
+ await this.generateStaticPages({
393
+ router,
394
+ baseUrl,
395
+ routeRendererFactory,
396
+ skipped: skippedDynamicPages,
397
+ activeStaticPathnames,
398
+ preloadedRoutes: routes,
399
+ sitemapEligiblePathnames
400
+ });
401
+ if (staticRoutes && staticRoutes.length > 0 && routeRendererFactory) {
402
+ await this.generateExplicitStaticPages({
403
+ staticRoutes,
404
+ routeRendererFactory,
405
+ skipped: skippedDynamicPages,
406
+ activeStaticPathnames,
407
+ sitemapEligiblePathnames
408
+ });
409
+ }
410
+ if (preserveExportDirectory) {
411
+ this.pruneStaleStaticOutputs(activeStaticPathnames);
412
+ }
413
+ } catch (error) {
414
+ if (shouldPrebuildProductionPageBrowserGraphs()) {
415
+ clearProductionPageBrowserGraphSession(this.appConfig);
416
+ }
417
+ throw error;
418
+ } finally {
419
+ await this.invokeStaticExportHook("afterStaticExport", staticExportContext);
420
+ }
421
+ if (this.appConfig.sitemap?.enabled && sitemapEligiblePathnames) {
422
+ const locations = resolveSitemapLocations({
423
+ eligiblePathnames: [...sitemapEligiblePathnames],
424
+ sitemap: this.appConfig.sitemap,
425
+ baseUrl
426
+ });
427
+ this.generateSitemap(locations, this.appConfig.sitemap);
428
+ }
429
+ if (skippedDynamicPages.length > 0) {
430
+ appLogger.debug(
431
+ `Skipped ${skippedDynamicPages.length} page(s) with cache: 'dynamic' (not supported in static generation)`,
432
+ skippedDynamicPages
433
+ );
196
434
  }
197
435
  }
198
- /**
199
- * Generates static pages from explicit static routes registered via app.static().
200
- * These routes use eco.page views via loader functions for HMR support.
201
- */
202
- async generateExplicitStaticPages(staticRoutes, routeRendererFactory) {
436
+ async generateExplicitStaticPages(input) {
203
437
  appLogger.debug(
204
438
  "Generating explicit static routes",
205
- staticRoutes.map((r) => r.path)
439
+ input.staticRoutes.map((r) => r.path)
206
440
  );
207
- for (const route of staticRoutes) {
441
+ for (const route of input.staticRoutes) {
208
442
  try {
209
443
  const mod = await route.loader();
210
444
  const view = mod.default;
211
445
  if (this.shouldSkipStaticView(route.path, view)) {
446
+ input.skipped?.push(route.path);
212
447
  continue;
213
448
  }
214
- await this.generateExplicitStaticRoute(route.path, view, routeRendererFactory);
449
+ await this.generateExplicitStaticRoute({
450
+ routePath: route.path,
451
+ view,
452
+ routeRendererFactory: input.routeRendererFactory,
453
+ activeStaticPathnames: input.activeStaticPathnames,
454
+ sitemapEligiblePathnames: input.sitemapEligiblePathnames
455
+ });
215
456
  } catch (error) {
216
457
  appLogger.error(
217
458
  `Error generating explicit static page for ${route.path}:`,
@@ -220,46 +461,80 @@ class StaticSiteGenerator {
220
461
  }
221
462
  }
222
463
  }
223
- async generateExplicitStaticRoute(routePath, view, routeRendererFactory) {
224
- const { renderer, routeEntries } = await this.planExplicitStaticRoute(routePath, view, routeRendererFactory);
225
- for (const { pathname, params } of routeEntries) {
226
- const contents = await this.createExplicitStaticContents(
227
- routePath,
228
- view,
229
- params,
230
- routeRendererFactory,
231
- renderer
232
- );
233
- const outputPath = this.writeStaticOutput(pathname, contents);
234
- appLogger.debug(`Generated static page: ${pathname} -> ${outputPath}`);
464
+ resolveExplicitViewSourceFile(view) {
465
+ const sourceFile = view.config?.__eco?.file;
466
+ if (!sourceFile) {
467
+ return void 0;
235
468
  }
469
+ return path.isAbsolute(sourceFile) ? sourceFile : path.join(this.appConfig.rootDir, sourceFile);
236
470
  }
237
- async planExplicitStaticRoute(routePath, view, routeRendererFactory) {
238
- const { renderer } = await prepareExplicitStaticRender({
471
+ async generateExplicitStaticRoute(input) {
472
+ const { routePath, view, routeRendererFactory, activeStaticPathnames, sitemapEligiblePathnames } = input;
473
+ const { renderer, routeEntries } = await this.planExplicitStaticRoute({
239
474
  routePath,
240
475
  view,
476
+ routeRendererFactory
477
+ });
478
+ const sourceFile = this.resolveExplicitViewSourceFile(view);
479
+ for (const { pathname, params } of routeEntries) {
480
+ await this.writeStaticPageArtifact({
481
+ pathname,
482
+ sourceFile,
483
+ debugLabel: pathname,
484
+ activeStaticPathnames,
485
+ onSuccessfulExport: () => this.considerSitemapEligibility({
486
+ pathname,
487
+ sitemapEligiblePathnames,
488
+ resolveMetadata: async () => {
489
+ const { props } = await prepareExplicitStaticRender({
490
+ routePath,
491
+ view,
492
+ params,
493
+ appConfig: this.appConfig,
494
+ runtimeOrigin: this.appConfig.baseUrl,
495
+ routeRendererFactory,
496
+ errors: STATIC_SITE_GENERATOR_ERRORS
497
+ });
498
+ return this.resolveExplicitViewMetadata({ view, params, props });
499
+ }
500
+ }),
501
+ createContents: () => this.createExplicitStaticContents({
502
+ routePath,
503
+ view,
504
+ params,
505
+ routeRendererFactory,
506
+ renderer
507
+ })
508
+ });
509
+ appLogger.debug(`Generated static page: ${pathname}`);
510
+ }
511
+ }
512
+ async planExplicitStaticRoute(input) {
513
+ const { renderer } = await prepareExplicitStaticRender({
514
+ routePath: input.routePath,
515
+ view: input.view,
241
516
  params: {},
242
517
  appConfig: this.appConfig,
243
518
  runtimeOrigin: this.appConfig.baseUrl,
244
- routeRendererFactory,
519
+ routeRendererFactory: input.routeRendererFactory,
245
520
  errors: STATIC_SITE_GENERATOR_ERRORS
246
521
  });
247
522
  return {
248
523
  renderer,
249
- routeEntries: await this.listExplicitStaticRouteEntries(routePath, view)
524
+ routeEntries: await this.listExplicitStaticRouteEntries(input.routePath, input.view)
250
525
  };
251
526
  }
252
- async createExplicitStaticContents(routePath, view, params, routeRendererFactory, renderer) {
527
+ async createExplicitStaticContents(input) {
253
528
  const { props, view: renderableView } = await prepareExplicitStaticRender({
254
- routePath,
255
- view,
256
- params,
529
+ routePath: input.routePath,
530
+ view: input.view,
531
+ params: input.params,
257
532
  appConfig: this.appConfig,
258
533
  runtimeOrigin: this.appConfig.baseUrl,
259
- routeRendererFactory,
534
+ routeRendererFactory: input.routeRendererFactory,
260
535
  errors: STATIC_SITE_GENERATOR_ERRORS
261
536
  });
262
- const response = await renderer.renderToResponse(renderableView, props, {});
537
+ const response = await input.renderer.renderToResponse(renderableView, props, {});
263
538
  return response.text();
264
539
  }
265
540
  async listExplicitStaticRouteEntries(routePath, view) {