@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
@@ -1,6 +1,24 @@
1
- import type { BuildResult, BuildTranspileProfile } from '../../build/build-adapter.js';
2
- import type { EcoBuildPlugin } from '../../build/build-types.js';
1
+ import type { BuildResult } from '../../build/build-adapter.js';
2
+ import type { BuildTranspileProfile } from '../../build/build-adapter.js';
3
+ import type { EcoBuildPlugin } from '../../build/contracts/build-types.js';
3
4
  import type { EcoPagesAppConfig } from '../../types/internal-types.js';
5
+ /**
6
+ * Browser-oriented build request accepted by {@link BrowserBundleService}.
7
+ *
8
+ * @remarks
9
+ * `profile` is a {@link BuildTranspileProfile} (transpile settings only).
10
+ * `executor` selects the {@link BuildRuntime} concurrency slot:
11
+ * - `'hmr'` + (`hmr-entrypoint` | `hmr-runtime`) → `'browser-hmr'`
12
+ * - everything else (including `browser-script`, and `'build'`) → `'route-module'`
13
+ *
14
+ * Defaults `executor` to `'hmr'`. Request options are always assembled with
15
+ * browser-hmr *defaults* via {@link createBrowserBuildRequest}; only the
16
+ * concurrency/dedupe wrapper differs.
17
+ *
18
+ * Uses request-scope {@link requestBuildDedupe} plus in-flight
19
+ * {@link DedupingBuildExecutor} coalescing; both key on
20
+ * {@link createBuildRequestIdentity}.
21
+ */
4
22
  export type BrowserBundleOptions = {
5
23
  entrypoints: string[] | Record<string, string>;
6
24
  outdir?: string;
@@ -16,28 +34,11 @@ export type BrowserBundleOptions = {
16
34
  externalPackages?: boolean;
17
35
  external?: string[];
18
36
  plugins?: EcoBuildPlugin[];
19
- [key: string]: unknown;
20
- profile: BuildTranspileProfile;
21
- excludeAppBuildPlugins?: string[];
22
- };
23
- type BrowserBundleGroupedOptions = {
24
- outdir?: string;
25
- outbase?: string;
26
- naming?: string;
27
- conditions?: string[];
28
- define?: Record<string, string>;
29
- minify?: boolean;
30
- treeshaking?: boolean;
31
- splitting?: boolean;
32
- root?: string;
33
- bundle?: boolean;
34
- externalPackages?: boolean;
35
- external?: string[];
36
- plugins?: EcoBuildPlugin[];
37
- [key: string]: unknown;
37
+ executor?: 'build' | 'hmr';
38
38
  profile: BuildTranspileProfile;
39
39
  excludeAppBuildPlugins?: string[];
40
40
  };
41
+ type BrowserBundleGroupedOptions = Omit<BrowserBundleOptions, 'entrypoints'>;
41
42
  export interface BrowserBundleExecutor {
42
43
  bundle(options: BrowserBundleOptions): Promise<BuildResult>;
43
44
  }
@@ -49,23 +50,20 @@ export type BrowserBundleGroupedEntry = {
49
50
  * App-owned boundary for browser-oriented bundle work.
50
51
  *
51
52
  * @remarks
52
- * This service owns the shared browser transpile defaults and ensures browser
53
- * builds always run through the app-owned executor rather than direct backend
54
- * calls scattered across HMR and asset processing paths.
53
+ * Owns shared browser transpile defaults and ensures browser builds run through
54
+ * the app-owned executor rather than direct backend calls. Assembles a complete
55
+ * request via {@link createBrowserBuildRequest} before scheduling.
55
56
  */
56
57
  export declare class BrowserBundleService implements BrowserBundleExecutor {
57
58
  private readonly appConfig;
58
- /**
59
- * Creates the browser bundle boundary for one finalized app instance.
60
- */
61
59
  constructor(appConfig: EcoPagesAppConfig);
62
60
  /**
63
61
  * Runs one browser-targeted build through the app-owned executor.
64
62
  *
65
63
  * @remarks
66
- * Browser defaults and app-owned browser build plugins are applied here so HMR
67
- * and runtime asset generation do not have to recreate that policy at each call
68
- * site.
64
+ * Browser defaults, app-owned browser plugins, and
65
+ * {@link getAppSourceTransforms | app source transforms} are applied here
66
+ * so HMR and asset generation do not recreate that policy at each call site.
69
67
  */
70
68
  bundle(options: BrowserBundleOptions): Promise<BuildResult>;
71
69
  bundleGroupedEntries(entries: BrowserBundleGroupedEntry[], options: BrowserBundleGroupedOptions): Promise<BuildResult>;
@@ -1,10 +1,17 @@
1
- import { getAppBrowserBuildPlugins, getAppBuildExecutor, getAppTranspileOptions } from "../../build/build-adapter.js";
2
- import { mergeEcoBuildPlugins } from "../../build/build-manifest.js";
1
+ import { createBrowserBuildRequest } from "../../build/runtime/build-request-policy.js";
2
+ import { requireBuildRuntime } from "../../build/runtime/build-runtime.js";
3
+ import { startupTrace } from "../../diagnostics/startup-trace.js";
4
+ import { requestBuildDedupe } from "../../diagnostics/request-build-dedupe.js";
5
+ import { createBuildRequestIdentity } from "../../build/runtime/build-request-identity.js";
6
+ function resolveBrowserBundleExecutor(appConfig, profile, executor) {
7
+ const buildRuntime = requireBuildRuntime(appConfig);
8
+ if (executor === "hmr" && (profile === "hmr-entrypoint" || profile === "hmr-runtime")) {
9
+ return buildRuntime.getProfile("browser-hmr");
10
+ }
11
+ return buildRuntime.getProfile("route-module");
12
+ }
3
13
  class BrowserBundleService {
4
14
  appConfig;
5
- /**
6
- * Creates the browser bundle boundary for one finalized app instance.
7
- */
8
15
  constructor(appConfig) {
9
16
  this.appConfig = appConfig;
10
17
  }
@@ -12,26 +19,28 @@ class BrowserBundleService {
12
19
  * Runs one browser-targeted build through the app-owned executor.
13
20
  *
14
21
  * @remarks
15
- * Browser defaults and app-owned browser build plugins are applied here so HMR
16
- * and runtime asset generation do not have to recreate that policy at each call
17
- * site.
22
+ * Browser defaults, app-owned browser plugins, and
23
+ * {@link getAppSourceTransforms | app source transforms} are applied here
24
+ * so HMR and asset generation do not recreate that policy at each call site.
18
25
  */
19
26
  async bundle(options) {
20
- const { profile, excludeAppBuildPlugins, plugins, ...rawBuildOptions } = options;
21
- const appBrowserPlugins = getAppBrowserBuildPlugins(this.appConfig);
22
- const filteredAppBrowserPlugins = excludeAppBuildPlugins && excludeAppBuildPlugins.length > 0 ? appBrowserPlugins.filter((plugin) => !excludeAppBuildPlugins.includes(plugin.name)) : appBrowserPlugins;
23
- const request = {
24
- ...rawBuildOptions,
25
- entrypoints: options.entrypoints,
26
- ...getAppTranspileOptions(this.appConfig, profile),
27
- plugins: mergeEcoBuildPlugins(plugins, filteredAppBrowserPlugins)
28
- };
29
- return await getAppBuildExecutor(this.appConfig).build(request);
27
+ const { profile, executor = "hmr", ...requestInput } = options;
28
+ const request = createBrowserBuildRequest(this.appConfig, {
29
+ ...requestInput,
30
+ profile
31
+ });
32
+ const buildExecutor = resolveBrowserBundleExecutor(this.appConfig, profile, executor);
33
+ const dedupeKey = createBuildRequestIdentity(request);
34
+ return requestBuildDedupe.dedupeBuild(dedupeKey, async () => {
35
+ const result = await buildExecutor.build(request);
36
+ startupTrace.recordBrowserBundle(result.outputs);
37
+ return result;
38
+ });
30
39
  }
31
40
  async bundleGroupedEntries(entries, options) {
32
41
  const request = {
33
42
  ...options,
34
- entrypoints: entries.map((entry) => entry.entrypoint)
43
+ entrypoints: Object.fromEntries(entries.map((entry) => [entry.entryName, entry.entrypoint]))
35
44
  };
36
45
  return this.bundle(request);
37
46
  }
@@ -83,7 +83,7 @@ export declare class HtmlTransformerService {
83
83
  * string-based fallback remains in place for runtimes that cannot provide one
84
84
  * of those rewriter implementations.
85
85
  */
86
- transform(res: Response, contributions?: HtmlDocumentContribution[]): Promise<Response>;
86
+ transform(res: Response, contributions?: HtmlDocumentContribution[], pagePackage?: PagePackageResult): Promise<Response>;
87
87
  /**
88
88
  * Splits processed assets into head and body injection groups.
89
89
  */
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  buildProcessedAssetDedupeKey,
6
6
  dedupeProcessedAssets
7
- } from "../../route-renderer/orchestration/processed-asset-dedupe.js";
7
+ } from "../../route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js";
8
8
  class HtmlTransformerService {
9
9
  processedDependencies = [];
10
10
  pagePackage;
@@ -188,8 +188,8 @@ class HtmlTransformerService {
188
188
  * string-based fallback remains in place for runtimes that cannot provide one
189
189
  * of those rewriter implementations.
190
190
  */
191
- async transform(res, contributions = []) {
192
- const { head, body } = this.groupDependenciesByPosition();
191
+ async transform(res, contributions = [], pagePackage) {
192
+ const { head, body } = this.groupDependenciesByPosition(pagePackage);
193
193
  const { headPrepend, headAppend, bodyPrepend, bodyAppend } = this.groupContributionsByPlacement(contributions);
194
194
  const htmlRewriter = await this.htmlRewriterProvider.createHtmlRewriter();
195
195
  if (htmlRewriter) {
@@ -239,8 +239,8 @@ class HtmlTransformerService {
239
239
  /**
240
240
  * Splits processed assets into head and body injection groups.
241
241
  */
242
- groupDependenciesByPosition() {
243
- const dependencies = this.pagePackage ? this.resolvePagePackageHtmlDependencies(this.pagePackage) : this.processedDependencies;
242
+ groupDependenciesByPosition(pagePackageOverride) {
243
+ const dependencies = pagePackageOverride ? this.resolvePagePackageHtmlDependencies(pagePackageOverride) : this.pagePackage ? this.resolvePagePackageHtmlDependencies(this.pagePackage) : this.processedDependencies;
244
244
  return dependencies.reduce(
245
245
  (acc, dep) => {
246
246
  if (dep.kind === "script") {
@@ -1,5 +1,6 @@
1
- import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
- export type DevelopmentInvalidationCategory = 'public-asset' | 'additional-watch' | 'include-source' | 'route-source' | 'processor-owned-asset' | 'server-source' | 'other';
1
+ import type { EcoPagesAppConfig, RegisteredScriptEntrypointChangeHandler } from '../../types/internal-types.js';
2
+ export type { RegisteredScriptEntrypointChangeHandler };
3
+ export type DevelopmentInvalidationCategory = 'public-asset' | 'additional-watch' | 'include-source' | 'explicit-server-view' | 'route-source' | 'processor-owned-asset' | 'server-source' | 'other';
3
4
  /**
4
5
  * Framework-owned invalidation plan for one changed file.
5
6
  *
@@ -38,6 +39,14 @@ export declare class DevelopmentInvalidationService {
38
39
  * Invalidates the app-owned server-module graph.
39
40
  */
40
41
  invalidateServerModules(changedFiles?: string[]): void;
42
+ /**
43
+ * Registers an integration-owned handler for registered script entrypoint edits.
44
+ */
45
+ registerRegisteredScriptEntrypointChangeHandler(handler: RegisteredScriptEntrypointChangeHandler): void;
46
+ /**
47
+ * Notifies integration handlers that a registered script entrypoint changed.
48
+ */
49
+ notifyRegisteredScriptEntrypointChange(filePath: string): Promise<void>;
41
50
  /**
42
51
  * Resets runtime-owned graph state and invalidates server modules.
43
52
  */
@@ -62,6 +71,15 @@ export declare class DevelopmentInvalidationService {
62
71
  * Returns whether the file is an include/template source file.
63
72
  */
64
73
  isIncludeSourceFile(filePath: string): boolean;
74
+ /**
75
+ * Returns whether the file is an explicit server-rendered view module.
76
+ *
77
+ * @remarks
78
+ * These modules are typically registered through `renderServerModule` in
79
+ * `app.ts` rather than the filesystem router. They need a full browser reload
80
+ * because their HTML is produced on the server, not through client HMR entrypoints.
81
+ */
82
+ isExplicitServerViewFile(filePath: string): boolean;
65
83
  /**
66
84
  * Returns whether the file is a server-executed source module outside the
67
85
  * special route/include buckets.
@@ -69,6 +87,11 @@ export declare class DevelopmentInvalidationService {
69
87
  isServerModuleSourceFile(filePath: string): boolean;
70
88
  /**
71
89
  * Returns whether a processor owns the changed file as an asset input.
90
+ *
91
+ * @remarks
92
+ * Watch config drives processor notifications only. Asset ownership requires
93
+ * declared capabilities so dependency-only watches (for example content
94
+ * collection MDX scans) do not skip server invalidation and HMR.
72
95
  */
73
96
  isProcessorOwnedAsset(filePath: string): boolean;
74
97
  }
@@ -1,5 +1,6 @@
1
1
  import path from "node:path";
2
2
  import { getAppServerInvalidationState } from "../runtime-state/server-invalidation-state.service.js";
3
+ import { appLogger } from "../../global/app-logger.js";
3
4
  class DevelopmentInvalidationService {
4
5
  appConfig;
5
6
  constructor(appConfig) {
@@ -18,6 +19,30 @@ class DevelopmentInvalidationService {
18
19
  getAppServerInvalidationState(this.appConfig).invalidateServerModules(changedFiles);
19
20
  this.appConfig.runtime?.appModuleLoader?.invalidateDevelopmentGraph();
20
21
  }
22
+ /**
23
+ * Registers an integration-owned handler for registered script entrypoint edits.
24
+ */
25
+ registerRegisteredScriptEntrypointChangeHandler(handler) {
26
+ const runtime = this.appConfig.runtime ?? {};
27
+ this.appConfig.runtime = runtime;
28
+ runtime.registeredScriptEntrypointChangeHandlers ??= [];
29
+ runtime.registeredScriptEntrypointChangeHandlers.push(handler);
30
+ }
31
+ /**
32
+ * Notifies integration handlers that a registered script entrypoint changed.
33
+ */
34
+ async notifyRegisteredScriptEntrypointChange(filePath) {
35
+ const handlers = this.appConfig.runtime?.registeredScriptEntrypointChangeHandlers ?? [];
36
+ for (const handler of handlers) {
37
+ try {
38
+ await handler(filePath);
39
+ } catch (error) {
40
+ appLogger.error(
41
+ `Failed to handle registered script entrypoint change for ${filePath}: ${error instanceof Error ? error.message : String(error)}`
42
+ );
43
+ }
44
+ }
45
+ }
21
46
  /**
22
47
  * Resets runtime-owned graph state and invalidates server modules.
23
48
  */
@@ -55,8 +80,18 @@ class DevelopmentInvalidationService {
55
80
  category: "include-source",
56
81
  invalidateServerModules: true,
57
82
  refreshRoutes: false,
58
- reloadBrowser: true,
59
- delegateToHmr: false,
83
+ reloadBrowser: false,
84
+ delegateToHmr: true,
85
+ processorHandledAsset: false
86
+ };
87
+ }
88
+ if (this.isExplicitServerViewFile(filePath)) {
89
+ return {
90
+ category: "explicit-server-view",
91
+ invalidateServerModules: true,
92
+ refreshRoutes: false,
93
+ reloadBrowser: false,
94
+ delegateToHmr: true,
60
95
  processorHandledAsset: false
61
96
  };
62
97
  }
@@ -148,6 +183,25 @@ class DevelopmentInvalidationService {
148
183
  }
149
184
  return /\.(?:[cm]?ts|[jt]sx?|mdx)$/u.test(resolvedPath);
150
185
  }
186
+ /**
187
+ * Returns whether the file is an explicit server-rendered view module.
188
+ *
189
+ * @remarks
190
+ * These modules are typically registered through `renderServerModule` in
191
+ * `app.ts` rather than the filesystem router. They need a full browser reload
192
+ * because their HTML is produced on the server, not through client HMR entrypoints.
193
+ */
194
+ isExplicitServerViewFile(filePath) {
195
+ const resolvedPath = path.resolve(filePath);
196
+ const viewsDir = path.join(this.appConfig.absolutePaths.srcDir, "views");
197
+ if (resolvedPath !== viewsDir && !resolvedPath.startsWith(`${viewsDir}${path.sep}`)) {
198
+ return false;
199
+ }
200
+ if (this.appConfig.templatesExt.some((extension) => resolvedPath.endsWith(extension))) {
201
+ return true;
202
+ }
203
+ return /\.(?:[cm]?ts|[jt]sx?|mdx)$/u.test(resolvedPath);
204
+ }
151
205
  /**
152
206
  * Returns whether the file is a server-executed source module outside the
153
207
  * special route/include buckets.
@@ -164,21 +218,20 @@ class DevelopmentInvalidationService {
164
218
  }
165
219
  /**
166
220
  * Returns whether a processor owns the changed file as an asset input.
221
+ *
222
+ * @remarks
223
+ * Watch config drives processor notifications only. Asset ownership requires
224
+ * declared capabilities so dependency-only watches (for example content
225
+ * collection MDX scans) do not skip server invalidation and HMR.
167
226
  */
168
227
  isProcessorOwnedAsset(filePath) {
169
228
  for (const processor of this.appConfig.processors.values()) {
170
229
  const capabilities = processor.getAssetCapabilities?.() ?? [];
171
- if (capabilities.length > 0) {
172
- const matchesConfiguredAsset = typeof processor.matchesFileFilter !== "function" || processor.matchesFileFilter(filePath);
173
- if (matchesConfiguredAsset && capabilities.some((capability) => processor.canProcessAsset?.(capability.kind, filePath))) {
174
- return true;
175
- }
230
+ if (capabilities.length === 0) {
176
231
  continue;
177
232
  }
178
- const watchConfig = processor.getWatchConfig();
179
- if (!watchConfig) continue;
180
- const { extensions = [] } = watchConfig;
181
- if (extensions.length && extensions.some((ext) => filePath.endsWith(ext))) {
233
+ const matchesConfiguredAsset = typeof processor.matchesFileFilter !== "function" || processor.matchesFileFilter(filePath);
234
+ if (matchesConfiguredAsset && capabilities.some((capability) => processor.canProcessAsset?.(capability.kind, filePath))) {
182
235
  return true;
183
236
  }
184
237
  }
@@ -0,0 +1,49 @@
1
+ # Module Loading
2
+
3
+ Server-side source loading for framework-owned page modules, includes, and related templates.
4
+
5
+ ## Import stack
6
+
7
+ ```
8
+ Call site (route scan, renderer, SSG, API)
9
+ └─ AppModuleLoader.importModule() app-server-module-transpiler.service.ts
10
+ ├─ merges server build plugins + JSX ownership plugins
11
+ ├─ resolves route-module BuildExecutor
12
+ └─ PageModuleImportService.importModule()
13
+ ├─ dev + host loader → host runtime (Node only, when configured)
14
+ ├─ production disk cache → route-module build cache
15
+ ├─ unified pages graph → prebuilt chunk import
16
+ └─ Rolldown per-page build → dynamic import of transpiled output
17
+ ```
18
+
19
+ `ServerModuleTranspiler` is a thin wrapper that injects `rootDir`, optional default plugins, and invalidation version into the same `PageModuleImportService` path. App code should prefer `getAppModuleLoader(appConfig)` or `getAppServerModuleTranspiler(appConfig)`.
20
+
21
+ ## Host vs app ownership
22
+
23
+ | Path | When |
24
+ | ----------------------- | -------------------------------------------------------------------------------------------- |
25
+ | Host loader | `appConfig.runtime.hostModuleLoader` set (Vite host) and file supports direct source loading |
26
+ | Ecopages build pipeline | Framework-owned template files under `pages/`, `includes/`, etc. |
27
+
28
+ `shouldAppUseHostModuleLoader()` encodes the directory + extension rules. Bun always uses the build pipeline today.
29
+
30
+ ## Caching layers
31
+
32
+ 1. **In-memory promise cache** (`PageModuleImportService.importCache`) — keyed by file path, resolved `outdir`, JSX/plugin inputs, file hash, and invalidation version. Cleared by `invalidateDevelopmentGraph()`.
33
+ 2. **Disk transpile cache** (`.eco/.server-modules/.build-cache.json`) — production only; see route-module build cache slice.
34
+ 3. **Unified graph manifest** — production static export fast path; see build layer docs.
35
+
36
+ ## Files
37
+
38
+ | File | Role |
39
+ | ----------------------------------------- | --------------------------------------------------------- |
40
+ | `page-module-import.service.ts` | Core import/cache/build orchestration |
41
+ | `app-module-loader.service.ts` | App-facing loader interface |
42
+ | `app-server-module-transpiler.service.ts` | Factory for app-scoped loader + transpiler |
43
+ | `server-module-transpiler.service.ts` | Injectable transpiler boundary for tests and bootstrap |
44
+ | `host-module-loader-registry.ts` | Process-global host loader fallback for embedded runtimes |
45
+ | `source-module-support.ts` | Extension allowlist for host direct loading |
46
+
47
+ ## Development invalidation
48
+
49
+ `DevelopmentInvalidationService.invalidateServerModules()` bumps the app-owned invalidation version and calls `appModuleLoader.invalidateDevelopmentGraph()`, which clears the in-memory import cache and increments the per-service invalidation counter used in cache keys and dev `?update=` query params.
@@ -5,6 +5,14 @@ import { ServerModuleTranspiler } from './server-module-transpiler.service.js';
5
5
  export declare function shouldAppUseHostModuleLoader(appConfig: EcoPagesAppConfig, filePath: string): boolean;
6
6
  export declare function getAppHostModuleLoader(appConfig: EcoPagesAppConfig): SourceModuleLoader | undefined;
7
7
  export declare function setAppHostModuleLoader(appConfig: EcoPagesAppConfig, hostModuleLoader?: SourceModuleLoader): void;
8
+ /**
9
+ * Creates the app module loader that imports route modules through the build pipeline.
10
+ *
11
+ * @remarks
12
+ * Caller `plugins` are treated as contributions only.
13
+ * {@link PageModuleImportService} assembles the complete server request via
14
+ * {@link createServerBuildRequest}; this loader does not merge app plugins.
15
+ */
8
16
  export declare function createAppModuleLoader(appConfig: EcoPagesAppConfig): AppModuleLoader;
9
17
  export declare function getAppModuleLoader(appConfig: EcoPagesAppConfig): AppModuleLoader;
10
18
  export declare function setAppModuleLoader(appConfig: EcoPagesAppConfig, appModuleLoader: AppModuleLoader): void;
@@ -1,5 +1,4 @@
1
- import { getAppBuildExecutor, getAppServerBuildPlugins } from "../../build/build-adapter.js";
2
- import { createForeignJsxOverridePlugin } from "../../plugins/foreign-jsx-override-plugin.js";
1
+ import { requireBuildRuntime } from "../../build/runtime/build-runtime.js";
3
2
  import path from "node:path";
4
3
  import { DevelopmentInvalidationService } from "../invalidation/development-invalidation.service.js";
5
4
  import {} from "./app-module-loader.service.js";
@@ -37,27 +36,12 @@ function setAppHostModuleLoader(appConfig, hostModuleLoader) {
37
36
  hostModuleLoader
38
37
  };
39
38
  }
40
- function getJsxOwnershipPlugins(appConfig) {
41
- const jsxExtensions = (appConfig.integrations ?? []).filter((integration) => integration.jsxImportSource).flatMap(
42
- (integration) => integration.extensions.filter((extension) => extension.endsWith(".tsx") || extension.endsWith(".jsx")).map((extension) => ({ integration, extension }))
43
- ).sort((left, right) => right.extension.length - left.extension.length);
44
- return jsxExtensions.map(
45
- ({ integration, extension }) => createForeignJsxOverridePlugin({
46
- hostJsxImportSource: integration.jsxImportSource,
47
- foreignExtensions: [extension],
48
- excludeExtensions: jsxExtensions.filter((candidate) => candidate.extension.length > extension.length).filter((candidate) => candidate.extension.endsWith(extension)).map((candidate) => candidate.extension),
49
- name: `ecopages-jsx-ownership-${integration.name}-${extension.replace(/[^a-zA-Z0-9]+/g, "-")}`
50
- })
51
- );
52
- }
53
39
  function createAppModuleLoader(appConfig) {
54
40
  const invalidationService = new DevelopmentInvalidationService(appConfig);
55
- const pageModuleImportService = new PageModuleImportService({
41
+ const pageModuleImportService = new PageModuleImportService(appConfig, {
56
42
  canLoadSourceModuleFromHost: (filePath) => shouldAppUseHostModuleLoader(appConfig, filePath),
57
43
  getHostModuleLoader: () => getAppHostModuleLoader(appConfig)
58
44
  });
59
- const appServerBuildPlugins = appConfig.runtime?.buildManifest ? getAppServerBuildPlugins(appConfig) : Array.from(appConfig.loaders?.values() ?? []);
60
- const jsxOwnershipPlugins = getJsxOwnershipPlugins(appConfig);
61
45
  const appModuleLoader = {
62
46
  get owner() {
63
47
  return getAppModuleLoaderOwner(appConfig);
@@ -65,11 +49,9 @@ function createAppModuleLoader(appConfig) {
65
49
  pageModuleImportService,
66
50
  async importModule(options) {
67
51
  const invalidationVersion = options.invalidationVersion ?? invalidationService.getServerModuleInvalidationVersion();
68
- const mergedPlugins = [...appServerBuildPlugins, ...jsxOwnershipPlugins, ...options.plugins ?? []];
69
52
  return await pageModuleImportService.importModule({
70
53
  ...options,
71
- ...mergedPlugins.length > 0 ? { plugins: mergedPlugins } : {},
72
- buildExecutor: options.buildExecutor ?? getAppBuildExecutor(appConfig),
54
+ buildExecutor: options.buildExecutor ?? requireBuildRuntime(appConfig).getProfile("route-module"),
73
55
  invalidationVersion
74
56
  });
75
57
  },
@@ -1,5 +1,6 @@
1
1
  import { build, type BuildExecutor, type BuildResult } from '../../build/build-adapter.js';
2
- import type { EcoBuildPlugin } from '../../build/build-types.js';
2
+ import type { EcoBuildPlugin } from '../../build/contracts/build-types.js';
3
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
3
4
  import type { SourceModuleLoaderFactory } from './module-loading-types.js';
4
5
  interface PageModuleImportBaseOptions {
5
6
  filePath: string;
@@ -59,10 +60,12 @@ export interface PageModuleImportDependencies {
59
60
  * transpilation settings, and error semantics across the different callers.
60
61
  */
61
62
  export declare class PageModuleImportService {
63
+ private readonly appConfig?;
62
64
  private readonly dependencies;
65
+ private readonly dependencyHasher;
63
66
  private readonly importCache;
64
67
  private developmentInvalidationVersion;
65
- constructor(dependencies?: Partial<PageModuleImportDependencies>);
68
+ constructor(appConfig?: EcoPagesAppConfig, dependencies?: Partial<PageModuleImportDependencies>);
66
69
  /**
67
70
  * Clears the shared import cache used by framework-owned page-module loads.
68
71
  */
@@ -91,5 +94,6 @@ export declare class PageModuleImportService {
91
94
  */
92
95
  importModule<T = unknown>(options: PageModuleBuildImportOptions): Promise<T>;
93
96
  private loadModule;
97
+ private getRouteModuleBuildCache;
94
98
  }
95
99
  export {};