@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,11 +1,12 @@
1
- import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
- import type { ApiHandler, StaticRoute } from '../../types/public-types.js';
3
- import type { RouteRegistry } from '../../router/server/route-registry.js';
4
- import type { StaticSiteGenerator } from '../../static-site-generator/static-site-generator.js';
5
- import type { StaticGenerationRendererResolver } from '../../route-renderer/route-renderer.js';
1
+ import type { EcoPagesAppConfig, IHmrManager } from '../../../types/internal-types.js';
2
+ import type { EcoBuildPlugin } from '../../../build/contracts/build-types.js';
3
+ import type { StaticRoute } from '../../../types/public-types.js';
4
+ import type { RouteRegistry } from '../../../router/server/route-registry.js';
5
+ import type { StaticSiteGenerator } from '../../../static-site-generator/static-site-generator.js';
6
+ import type { StaticGenerationRendererResolver } from '../../../route-renderer/route-renderer.js';
6
7
  export interface StaticBuildOptions {
7
- preview?: boolean;
8
8
  baseUrl?: string;
9
+ force?: boolean;
9
10
  }
10
11
  export interface ServeOptions {
11
12
  hostname?: string;
@@ -15,10 +16,17 @@ export interface ServerStaticBuilderParams {
15
16
  appConfig: EcoPagesAppConfig;
16
17
  staticSiteGenerator: StaticSiteGenerator;
17
18
  serveOptions: ServeOptions;
18
- apiHandlers?: ApiHandler[];
19
+ runtimeOrigin: string;
20
+ /**
21
+ * Whether the app requires a server entry bundle for production use.
22
+ * When `true`, the build step bundles the server entry file for `ecopages start`.
23
+ * Defaults to `false` (static-only build, no server needed).
24
+ */
25
+ needsServerBundle?: boolean;
19
26
  logger?: ServerStaticBuilderLogger;
20
- previewServerFactory?: ServerStaticPreviewServerFactory;
21
27
  entryFile?: string;
28
+ hmrManager?: IHmrManager;
29
+ onRuntimePlugin?: (plugin: EcoBuildPlugin) => void;
22
30
  }
23
31
  /**
24
32
  * Minimal logger dependency used by the static builder.
@@ -26,53 +34,38 @@ export interface ServerStaticBuilderParams {
26
34
  export interface ServerStaticBuilderLogger {
27
35
  warn(message: string, detail?: string): unknown;
28
36
  info(message: string): unknown;
37
+ debug(message: string): unknown;
29
38
  error(message: string): unknown;
30
39
  }
31
40
  /**
32
- * Preview server factory dependency used when static preview mode is enabled.
33
- */
34
- export interface ServerStaticPreviewServerFactory {
35
- createServer(args: {
36
- appConfig: EcoPagesAppConfig;
37
- options: {
38
- port: number;
39
- };
40
- }): {
41
- server?: {
42
- port?: number;
43
- } | null;
44
- };
45
- }
46
- /**
47
- * Handles static site generation and previews.
41
+ * Handles static site generation.
48
42
  */
49
43
  export declare class ServerStaticBuilder {
50
44
  private readonly appConfig;
51
45
  private readonly staticSiteGenerator;
52
46
  private readonly serveOptions;
53
- private readonly apiHandlers;
47
+ private readonly runtimeOrigin;
48
+ private readonly needsServerBundle;
54
49
  private readonly logger;
55
- private readonly previewServerFactory;
56
50
  private readonly entryFile;
57
- constructor({ appConfig, staticSiteGenerator, serveOptions, apiHandlers, logger, previewServerFactory, entryFile, }: ServerStaticBuilderParams);
58
- private warnApiHandlersUnavailableInStaticMode;
51
+ private readonly hmrManager?;
52
+ private readonly onRuntimePlugin?;
53
+ constructor({ appConfig, staticSiteGenerator, serveOptions, runtimeOrigin, needsServerBundle, logger, entryFile, hmrManager, onRuntimePlugin, }: ServerStaticBuilderParams);
59
54
  private prepareExportDirectory;
60
55
  private refreshRuntimeAssets;
61
56
  /**
62
57
  * Bundles the server entry file for production use.
63
58
  *
64
59
  * @remarks
65
- * When the project has API endpoints, the entry file must be bundled
66
- * into a single JS file so the production server can start without
67
- * on-the-fly TypeScript transpilation. The bundle is output to
68
- * `dist/{SERVER_BUNDLE_DIR}/{SERVER_BUNDLE_FILENAME}` and used by
69
- * `ecopages start` in production.
60
+ * Only invoked when the app requires a runtime server (API handlers,
61
+ * websocket handlers, etc.). Static-only apps skip this step entirely.
62
+ * Incremental builds may skip Rolldown when the `.eco/.server-entry`
63
+ * cache is still valid.
70
64
  *
71
65
  * Package imports remain external so native addons and runtime-owned
72
66
  * dependencies continue to load through the app's installed
73
67
  * `node_modules` tree. Only the app entry graph is bundled.
74
68
  *
75
- * Skips silently when no API endpoints are registered (static-only site).
76
69
  * Throws if the build adapter is unavailable, is owned by a host
77
70
  * runtime, or bundling fails.
78
71
  *
@@ -81,7 +74,6 @@ export declare class ServerStaticBuilder {
81
74
  private bundleServerEntry;
82
75
  /**
83
76
  * Generates a static build of the site for deployment.
84
- * @param options.preview - If true, starts a preview server after build
85
77
  * @param dependencies.router - The initialized router
86
78
  * @param dependencies.routeRendererFactory - The route renderer factory
87
79
  * @param dependencies.staticRoutes - Explicit static routes registered via app.static()
@@ -0,0 +1,191 @@
1
+ import path from "node:path";
2
+ import { fileSystem } from "@ecopages/file-system";
3
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../../config/constants.js";
4
+ import { appLogger } from "../../../global/app-logger.js";
5
+ import { build, getAppBuildAdapter, setupAppRuntimePlugins } from "../../../build/build-adapter.js";
6
+ import { createServerBuildRequest } from "../../../build/runtime/build-request-policy.js";
7
+ import { requireBuildRuntime } from "../../../build/runtime/build-runtime.js";
8
+ import { attachHmrToIntegrations } from "./runtime-server-lifecycle.js";
9
+ import {
10
+ getServerBundleOutputPaths,
11
+ lookupServerEntryBuildCache,
12
+ recordServerEntryBuildCache,
13
+ writeServerBundleDeployManifest
14
+ } from "../../../build/cache/server-entry-build-cache.js";
15
+ import {
16
+ clearProductionBuildCaches,
17
+ shouldResetStaticExportDirectory
18
+ } from "../../../static-site-generator/static-build-invalidation.js";
19
+ import { resolveEntryFile, SERVER_BUNDLE_FILENAME } from "../../../utils/resolve-entry-file.js";
20
+ class ServerStaticBuilder {
21
+ appConfig;
22
+ staticSiteGenerator;
23
+ serveOptions;
24
+ runtimeOrigin;
25
+ needsServerBundle;
26
+ logger;
27
+ entryFile;
28
+ hmrManager;
29
+ onRuntimePlugin;
30
+ constructor({
31
+ appConfig,
32
+ staticSiteGenerator,
33
+ serveOptions,
34
+ runtimeOrigin,
35
+ needsServerBundle,
36
+ logger,
37
+ entryFile,
38
+ hmrManager,
39
+ onRuntimePlugin
40
+ }) {
41
+ this.appConfig = appConfig;
42
+ this.staticSiteGenerator = staticSiteGenerator;
43
+ this.serveOptions = serveOptions;
44
+ this.runtimeOrigin = runtimeOrigin;
45
+ this.needsServerBundle = needsServerBundle ?? false;
46
+ this.logger = logger ?? appLogger;
47
+ this.entryFile = resolveEntryFile({ entryFile });
48
+ this.hmrManager = hmrManager;
49
+ this.onRuntimePlugin = onRuntimePlugin;
50
+ }
51
+ prepareExportDirectory(force) {
52
+ if (force) {
53
+ clearProductionBuildCaches(this.appConfig);
54
+ }
55
+ const exportDir = this.appConfig.absolutePaths?.distDir ?? path.join(this.appConfig.rootDir, this.appConfig.distDir);
56
+ const shouldCleanDist = shouldResetStaticExportDirectory(this.appConfig, force);
57
+ fileSystem.ensureDir(exportDir, shouldCleanDist);
58
+ if (shouldCleanDist) {
59
+ this.appConfig.runtime = {
60
+ ...this.appConfig.runtime ?? {},
61
+ runtimeAssetsPrepared: false
62
+ };
63
+ }
64
+ const srcPublicDir = path.join(
65
+ this.appConfig.rootDir,
66
+ this.appConfig.srcDir ?? "src",
67
+ this.appConfig.publicDir ?? "public"
68
+ );
69
+ if (fileSystem.exists(srcPublicDir)) {
70
+ fileSystem.copyDir(srcPublicDir, exportDir);
71
+ }
72
+ return !shouldCleanDist;
73
+ }
74
+ async refreshRuntimeAssets() {
75
+ appLogger.debugTime("refreshRuntimeAssets");
76
+ try {
77
+ await setupAppRuntimePlugins({
78
+ appConfig: this.appConfig,
79
+ runtimeOrigin: this.runtimeOrigin,
80
+ onRuntimePlugin: this.onRuntimePlugin
81
+ });
82
+ if (this.hmrManager?.isEnabled()) {
83
+ attachHmrToIntegrations(this.appConfig, this.hmrManager);
84
+ }
85
+ } finally {
86
+ appLogger.debugTimeEnd("refreshRuntimeAssets");
87
+ }
88
+ }
89
+ /**
90
+ * Bundles the server entry file for production use.
91
+ *
92
+ * @remarks
93
+ * Only invoked when the app requires a runtime server (API handlers,
94
+ * websocket handlers, etc.). Static-only apps skip this step entirely.
95
+ * Incremental builds may skip Rolldown when the `.eco/.server-entry`
96
+ * cache is still valid.
97
+ *
98
+ * Package imports remain external so native addons and runtime-owned
99
+ * dependencies continue to load through the app's installed
100
+ * `node_modules` tree. Only the app entry graph is bundled.
101
+ *
102
+ * Throws if the build adapter is unavailable, is owned by a host
103
+ * runtime, or bundling fails.
104
+ *
105
+ * @throws If the build adapter is unavailable, is host-owned, or bundling fails.
106
+ */
107
+ async bundleServerEntry(options) {
108
+ const buildAdapter = getAppBuildAdapter(this.appConfig);
109
+ if (buildAdapter.ownership === "vite-host") {
110
+ throw new Error(
111
+ 'Cannot bundle the server entry file: build ownership is "vite-host". The host runtime is expected to produce its own server bundle.'
112
+ );
113
+ }
114
+ const entryPath = path.isAbsolute(this.entryFile) ? this.entryFile : path.join(this.appConfig.rootDir, this.entryFile);
115
+ if (!fileSystem.exists(entryPath)) {
116
+ throw new Error(
117
+ `Cannot bundle server entry: file "${this.entryFile}" not found in "${this.appConfig.rootDir}".`
118
+ );
119
+ }
120
+ const { serverOutdir, serverEntryPath } = getServerBundleOutputPaths(this.appConfig);
121
+ const cached = lookupServerEntryBuildCache({
122
+ appConfig: this.appConfig,
123
+ entryPath,
124
+ force: options?.force
125
+ });
126
+ if (cached) {
127
+ const hasBundle = cached.outputPaths.some(
128
+ (outputPath) => path.resolve(outputPath) === path.resolve(serverEntryPath) && fileSystem.exists(outputPath)
129
+ );
130
+ if (hasBundle) {
131
+ this.logger.info("Reusing cached server entry bundle");
132
+ writeServerBundleDeployManifest(this.appConfig, serverEntryPath);
133
+ return;
134
+ }
135
+ }
136
+ this.logger.info("Bundling server entry file...");
137
+ const buildOptions = createServerBuildRequest(this.appConfig, {
138
+ profile: "server-entry",
139
+ entrypoints: [entryPath],
140
+ outdir: serverOutdir,
141
+ naming: SERVER_BUNDLE_FILENAME,
142
+ sourcemap: "hidden"
143
+ });
144
+ const result = await build(buildOptions, requireBuildRuntime(this.appConfig).getProfile("server-entry"));
145
+ if (!result.success) {
146
+ const errorMessages = result.logs.map((log) => log.message).join("\n");
147
+ throw new Error(`Failed to bundle server entry file:
148
+ ${errorMessages}`);
149
+ }
150
+ const outputPaths = result.outputs.length > 0 ? result.outputs.map((output) => output.path) : fileSystem.exists(serverEntryPath) ? [serverEntryPath] : [];
151
+ recordServerEntryBuildCache({
152
+ appConfig: this.appConfig,
153
+ entryPath,
154
+ buildResult: result,
155
+ outputPaths
156
+ });
157
+ writeServerBundleDeployManifest(this.appConfig, serverEntryPath);
158
+ this.logger.info("Server entry file bundled successfully");
159
+ }
160
+ /**
161
+ * Generates a static build of the site for deployment.
162
+ * @param dependencies.router - The initialized router
163
+ * @param dependencies.routeRendererFactory - The route renderer factory
164
+ * @param dependencies.staticRoutes - Explicit static routes registered via app.static()
165
+ */
166
+ async build(options, dependencies) {
167
+ const { baseUrl: explicitBaseUrl, force = false } = options ?? {};
168
+ const baseUrl = explicitBaseUrl ?? `http://${this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME}:${this.serveOptions.port || DEFAULT_ECOPAGES_PORT}`;
169
+ const preserveExportDirectory = this.prepareExportDirectory(force);
170
+ await this.refreshRuntimeAssets();
171
+ if (this.needsServerBundle) {
172
+ await this.bundleServerEntry({ force });
173
+ }
174
+ await this.staticSiteGenerator.run({
175
+ router: dependencies.router,
176
+ baseUrl,
177
+ routeRendererFactory: dependencies.routeRendererFactory,
178
+ staticRoutes: dependencies.staticRoutes,
179
+ force,
180
+ preserveExportDirectory
181
+ });
182
+ if (process.env.ECOPAGES_BENCH === "1" && process.env.ECOPAGES_BENCH_VERBOSE !== "1") {
183
+ this.logger.debug("Build completed");
184
+ } else {
185
+ this.logger.info("Build completed");
186
+ }
187
+ }
188
+ }
189
+ export {
190
+ ServerStaticBuilder
191
+ };
@@ -1,4 +1,4 @@
1
- import type { EcoPagesAppConfig } from '../../types/internal-types.js';
1
+ import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
2
2
  export interface StaticPreviewHost {
3
3
  start(options: StaticPreviewHostStartOptions): Promise<number | null>;
4
4
  stop(force?: boolean): Promise<void>;
@@ -7,4 +7,9 @@ export interface StaticPreviewHostStartOptions {
7
7
  appConfig: EcoPagesAppConfig;
8
8
  hostname: string;
9
9
  port: number;
10
+ /**
11
+ * When true, bind to the next available port if the preferred one is busy.
12
+ * Should remain false when the port was explicitly configured.
13
+ */
14
+ allowPortFallback?: boolean;
10
15
  }
@@ -0,0 +1,21 @@
1
+ import type { Duplex } from 'node:stream';
2
+ import type { Server as NodeHttpServer, IncomingMessage } from 'node:http';
3
+ import type { EcopagesWebSocketHandler } from '../../../types/public-types.js';
4
+ export type NodeHttpWebSocketUpgradePreflight = (req: IncomingMessage, socket: Duplex, head: Buffer) => boolean;
5
+ export type AttachNodeHttpWebSocketUpgradesOptions = {
6
+ runtimeOrigin: string;
7
+ websocketHandlers: Map<string, EcopagesWebSocketHandler<any, any>>;
8
+ /**
9
+ * When true, unmatched upgrade requests are left for other listeners (e.g.
10
+ * Vite HMR). When false, unmatched upgrades are destroyed immediately.
11
+ */
12
+ passthroughUnmatched?: boolean;
13
+ preflight?: NodeHttpWebSocketUpgradePreflight;
14
+ };
15
+ /**
16
+ * Wires Ecopages user WebSocket routes onto a Node HTTP server's `upgrade` event.
17
+ *
18
+ * Used by the Node adapter in standalone mode and by host integrations such as
19
+ * the Vite plugin that embed Ecopages behind a foreign HTTP server.
20
+ */
21
+ export declare function attachNodeHttpWebSocketUpgrades(server: NodeHttpServer, options: AttachNodeHttpWebSocketUpgradesOptions): void;
@@ -0,0 +1,100 @@
1
+ import { WebSocketServer } from "ws";
2
+ import { appLogger } from "../../../global/app-logger.js";
3
+ import { findWebSocketRoute } from "../../abstract/ws-pattern-matcher.js";
4
+ import { createEcopagesSocket, invokeWebSocketHandlerHook, toWebSocketCloseInfo } from "./websocket-lifecycle.js";
5
+ const attachedUpgradeServers = /* @__PURE__ */ new WeakSet();
6
+ function adaptNodeWebSocket(ws, kind, params, search, context) {
7
+ return createEcopagesSocket(
8
+ {
9
+ send: (data) => ws.send(data),
10
+ close: (code, reason) => ws.close(code, reason)
11
+ },
12
+ { kind, params, search, context }
13
+ );
14
+ }
15
+ function toUpgradeRequest(runtimeOrigin, req) {
16
+ const upgradeUrl = new URL(req.url ?? "/", runtimeOrigin);
17
+ return new Request(upgradeUrl, {
18
+ method: req.method,
19
+ headers: req.headers
20
+ });
21
+ }
22
+ async function resolveNodeContext(request, handler, kind, params, search) {
23
+ if (!handler.context) {
24
+ return void 0;
25
+ }
26
+ try {
27
+ return await handler.context({ request, kind, params, search });
28
+ } catch (error) {
29
+ appLogger.error(`[WS:${kind}] context() failed; closing connection.`, error);
30
+ throw error;
31
+ }
32
+ }
33
+ async function setupNodeWebSocketConnection(ws, wsMatch, req, runtimeOrigin, search) {
34
+ const handler = wsMatch.handler;
35
+ const baseRequest = toUpgradeRequest(runtimeOrigin, req);
36
+ let context;
37
+ try {
38
+ context = await resolveNodeContext(baseRequest, handler, wsMatch.kind, wsMatch.params, search);
39
+ } catch {
40
+ ws.close(1011, "context initialization failed");
41
+ return;
42
+ }
43
+ const socket = adaptNodeWebSocket(ws, wsMatch.kind, wsMatch.params, search, context);
44
+ try {
45
+ await handler.onConnect?.(socket);
46
+ } catch (error) {
47
+ appLogger.error(`[WS:${wsMatch.kind}] onConnect failed:`, error);
48
+ ws.close(1011, "onConnect failed");
49
+ return;
50
+ }
51
+ ws.on("message", (msg, isBinary) => {
52
+ const message = isBinary ? {
53
+ kind: "binary",
54
+ data: msg instanceof ArrayBuffer ? new Uint8Array(msg) : Array.isArray(msg) ? new Uint8Array(Buffer.concat(msg)) : new Uint8Array(msg)
55
+ } : { kind: "text", text: msg.toString() };
56
+ invokeWebSocketHandlerHook(wsMatch.kind, "onMessage", handler.onMessage?.(socket, message));
57
+ });
58
+ ws.on("close", (code, reason) => {
59
+ const event = toWebSocketCloseInfo(code, reason.toString());
60
+ invokeWebSocketHandlerHook(wsMatch.kind, "onClose", handler.onClose?.(socket, event));
61
+ });
62
+ ws.on("error", (err) => {
63
+ appLogger.error(`[WS:${wsMatch.kind}] error:`, err);
64
+ invokeWebSocketHandlerHook(wsMatch.kind, "onError", handler.onError?.(socket, err));
65
+ });
66
+ }
67
+ function attachNodeHttpWebSocketUpgrades(server, options) {
68
+ if (options.websocketHandlers.size === 0) {
69
+ return;
70
+ }
71
+ if (attachedUpgradeServers.has(server)) {
72
+ appLogger.warn("[WS] WebSocket upgrades already attached to this HTTP server; skipping duplicate attach.");
73
+ return;
74
+ }
75
+ attachedUpgradeServers.add(server);
76
+ const userWss = new WebSocketServer({ noServer: true });
77
+ server.on("upgrade", (req, socket, head) => {
78
+ if (options.preflight?.(req, socket, head)) {
79
+ return;
80
+ }
81
+ const url = new URL(req.url ?? "/", options.runtimeOrigin);
82
+ const wsMatch = findWebSocketRoute(options.websocketHandlers, url.pathname);
83
+ if (!wsMatch) {
84
+ if (!options.passthroughUnmatched) {
85
+ socket.destroy();
86
+ }
87
+ return;
88
+ }
89
+ userWss.handleUpgrade(req, socket, head, (ws) => {
90
+ const search = Object.fromEntries(url.searchParams.entries());
91
+ void setupNodeWebSocketConnection(ws, wsMatch, req, options.runtimeOrigin, search).catch((error) => {
92
+ appLogger.error(`[WS:${wsMatch.kind}] unexpected error:`, error);
93
+ ws.close(1011, "internal error");
94
+ });
95
+ });
96
+ });
97
+ }
98
+ export {
99
+ attachNodeHttpWebSocketUpgrades
100
+ };
@@ -0,0 +1,24 @@
1
+ import type { EcopagesSocket, WebSocketCloseInfo } from '../../../types/public-types.js';
2
+ /**
3
+ * @remarks
4
+ * Bun and Node expose different raw socket types but share the same
5
+ * {@link OutgoingWebSocketMessage} contract. Adapters supply only `send`/`close`;
6
+ * {@link createEcopagesSocket} owns message normalization and stream forwarding.
7
+ */
8
+ export interface WebSocketSendTransport {
9
+ send(data: string | Uint8Array): void;
10
+ close(code?: number, reason?: string): void;
11
+ }
12
+ /**
13
+ * @remarks
14
+ * Bun and Node adapters previously duplicated outgoing-message dispatch and
15
+ * stream forwarding; this is the shared implementation both transports delegate to.
16
+ */
17
+ export declare function createEcopagesSocket<TContext, TParams extends Record<string, string>>(transport: WebSocketSendTransport, meta: {
18
+ kind: string;
19
+ params: TParams;
20
+ search: Record<string, string>;
21
+ context: TContext;
22
+ }): EcopagesSocket<TContext, TParams>;
23
+ export declare function toWebSocketCloseInfo(code: number, reason: string): WebSocketCloseInfo;
24
+ export declare function invokeWebSocketHandlerHook(kind: string, hookName: string, result: void | Promise<void>): void;
@@ -0,0 +1,55 @@
1
+ import { appLogger } from "../../../global/app-logger.js";
2
+ function sendOutgoingMessage(transport, message) {
3
+ if (typeof message === "string") {
4
+ transport.send(message);
5
+ } else if (message instanceof Blob) {
6
+ void message.arrayBuffer().then((buffer) => transport.send(new Uint8Array(buffer)));
7
+ } else if (message instanceof ArrayBuffer) {
8
+ transport.send(new Uint8Array(message));
9
+ } else if (ArrayBuffer.isView(message)) {
10
+ transport.send(new Uint8Array(message.buffer, message.byteOffset, message.byteLength));
11
+ } else {
12
+ transport.send(message);
13
+ }
14
+ }
15
+ function createEcopagesSocket(transport, meta) {
16
+ return {
17
+ kind: meta.kind,
18
+ params: meta.params,
19
+ search: meta.search,
20
+ context: meta.context,
21
+ send: (message) => sendOutgoingMessage(transport, message),
22
+ sendStream: async (stream) => {
23
+ const reader = stream.getReader();
24
+ try {
25
+ while (true) {
26
+ const { value, done } = await reader.read();
27
+ if (done) break;
28
+ if (value) transport.send(value);
29
+ }
30
+ } finally {
31
+ reader.releaseLock();
32
+ }
33
+ },
34
+ close: (code, reason) => transport.close(code, reason)
35
+ };
36
+ }
37
+ function toWebSocketCloseInfo(code, reason) {
38
+ return {
39
+ code,
40
+ reason,
41
+ wasClean: code === 1e3 || code === 1001
42
+ };
43
+ }
44
+ function invokeWebSocketHandlerHook(kind, hookName, result) {
45
+ if (result instanceof Promise) {
46
+ result.catch((error) => {
47
+ appLogger.error(`[WS:${kind}] ${hookName} failed:`, error);
48
+ });
49
+ }
50
+ }
51
+ export {
52
+ createEcopagesSocket,
53
+ invokeWebSocketHandlerHook,
54
+ toWebSocketCloseInfo
55
+ };