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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +38 -9
  2. package/package.json +241 -30
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +123 -6
  5. package/src/adapters/abstract/application-adapter.js +151 -1
  6. package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
  7. package/src/adapters/abstract/segment-path-matcher.js +149 -0
  8. package/src/adapters/abstract/server-adapter.d.ts +16 -2
  9. package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
  10. package/src/adapters/abstract/ws-pattern-matcher.js +30 -0
  11. package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
  12. package/src/adapters/bun/bun-user-websocket-lifecycle.js +96 -0
  13. package/src/adapters/bun/client-bridge.d.ts +1 -0
  14. package/src/adapters/bun/client-bridge.js +3 -0
  15. package/src/adapters/bun/create-app.d.ts +9 -6
  16. package/src/adapters/bun/create-app.js +76 -45
  17. package/src/adapters/bun/hmr-manager.d.ts +1 -1
  18. package/src/adapters/bun/hmr-manager.js +1 -1
  19. package/src/adapters/bun/index.d.ts +1 -1
  20. package/src/adapters/bun/index.js +25 -2
  21. package/src/adapters/bun/runtime-host.d.ts +1 -1
  22. package/src/adapters/bun/runtime-host.js +1 -1
  23. package/src/adapters/bun/server-adapter.d.ts +92 -41
  24. package/src/adapters/bun/server-adapter.js +256 -117
  25. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  26. package/src/adapters/bun/static-preview-host.js +25 -20
  27. package/src/adapters/create-app.d.ts +13 -11
  28. package/src/adapters/create-app.js +2 -51
  29. package/src/adapters/index.d.ts +2 -2
  30. package/src/adapters/index.js +26 -4
  31. package/src/adapters/node/create-app.d.ts +8 -3
  32. package/src/adapters/node/create-app.js +61 -13
  33. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  34. package/src/adapters/node/node-client-bridge.js +3 -0
  35. package/src/adapters/node/node-hmr-manager.d.ts +1 -1
  36. package/src/adapters/node/node-hmr-manager.js +1 -1
  37. package/src/adapters/node/runtime-host.d.ts +1 -1
  38. package/src/adapters/node/runtime-host.js +1 -1
  39. package/src/adapters/node/server-adapter-dependencies.js +4 -0
  40. package/src/adapters/node/server-adapter.d.ts +64 -23
  41. package/src/adapters/node/server-adapter.js +169 -142
  42. package/src/adapters/node/static-content-server.d.ts +1 -0
  43. package/src/adapters/node/static-content-server.js +10 -2
  44. package/src/adapters/node/static-preview-host.d.ts +1 -1
  45. package/src/adapters/node/static-preview-host.js +27 -12
  46. package/src/adapters/shared/{hmr-entrypoint-registrar.d.ts → hmr/hmr-entrypoint-registrar.d.ts} +31 -30
  47. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +106 -0
  48. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  49. package/src/adapters/shared/{hmr-html-response.js → hmr/hmr-html-response.js} +4 -1
  50. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +101 -0
  51. package/src/adapters/shared/hmr/shared-hmr-manager.js +432 -0
  52. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  53. package/src/adapters/shared/http/api-request-pipeline.js +129 -0
  54. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  55. package/src/adapters/shared/{api-response.js → http/api-response.js} +6 -23
  56. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  57. package/src/adapters/shared/http/create-body-response.js +23 -0
  58. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  59. package/src/adapters/shared/http/define-api-handler.js +63 -0
  60. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  61. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  62. package/src/adapters/shared/{explicit-static-route-matcher.js → http/explicit-static-route-matcher.js} +3 -38
  63. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  64. package/src/adapters/shared/{file-route-middleware-pipeline.js → http/file-route-middleware-pipeline.js} +10 -22
  65. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  66. package/src/adapters/shared/{fs-server-response-factory.js → http/fs-server-response-factory.js} +22 -2
  67. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  68. package/src/adapters/shared/{fs-server-response-matcher.js → http/fs-server-response-matcher.js} +109 -27
  69. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  70. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  71. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  72. package/src/adapters/shared/{application-adapter.js → runtime/application-adapter.js} +1 -1
  73. package/src/adapters/shared/runtime/copy-runtime-public-dir.d.ts +6 -0
  74. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +24 -0
  75. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  76. package/src/adapters/shared/runtime/port-manager.js +196 -0
  77. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  78. package/src/adapters/shared/{render-context.js → runtime/render-context.js} +8 -17
  79. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -3
  80. package/src/adapters/shared/{runtime-app-bootstrap.js → runtime/runtime-app-bootstrap.js} +4 -7
  81. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +46 -0
  82. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +57 -0
  83. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +23 -49
  84. package/src/adapters/shared/runtime/server-adapter.js +226 -0
  85. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  86. package/src/adapters/shared/{server-route-handler.js → runtime/server-route-handler.js} +5 -43
  87. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +27 -35
  88. package/src/adapters/shared/runtime/server-static-builder.js +191 -0
  89. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  90. package/src/adapters/shared/ws/node-http-websocket-upgrades.d.ts +21 -0
  91. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +100 -0
  92. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  93. package/src/adapters/shared/ws/websocket-lifecycle.js +55 -0
  94. package/src/build/README.md +140 -31
  95. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  96. package/src/build/app-build-manifest-runtime.js +124 -0
  97. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
  98. package/src/build/{browser-runtime-plugin.js → browser/browser-runtime-plugin.js} +1 -1
  99. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  100. package/src/build/browser/jsx-ownership-plugins.js +41 -0
  101. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  102. package/src/build/browser/lit-static-render-worker-context.js +6 -0
  103. package/src/build/build-adapter.d.ts +29 -334
  104. package/src/build/build-adapter.js +32 -133
  105. package/src/build/cache/build-input-fingerprint.d.ts +28 -0
  106. package/src/build/cache/build-input-fingerprint.js +31 -0
  107. package/src/build/cache/cache-constants.d.ts +4 -0
  108. package/src/build/cache/cache-constants.js +6 -0
  109. package/src/build/cache/cache-keys.d.ts +22 -0
  110. package/src/build/cache/cache-keys.js +63 -0
  111. package/src/build/cache/dev-browser-script-cache.d.ts +34 -0
  112. package/src/build/cache/dev-browser-script-cache.js +90 -0
  113. package/src/build/cache/pages-unified-graph-build.d.ts +31 -0
  114. package/src/build/cache/pages-unified-graph-build.js +198 -0
  115. package/src/build/cache/production-build-cache.d.ts +20 -0
  116. package/src/build/cache/production-build-cache.js +63 -0
  117. package/src/build/cache/server-entry-build-cache.d.ts +43 -0
  118. package/src/build/cache/server-entry-build-cache.js +165 -0
  119. package/src/build/contracts/build-contracts.d.ts +96 -0
  120. package/src/build/contracts/build-manifest.d.ts +90 -0
  121. package/src/build/{build-manifest.js → contracts/build-manifest.js} +2 -2
  122. package/src/build/contracts/build-types.js +0 -0
  123. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +23 -9
  124. package/src/build/{rolldown-adapter-helpers.js → rolldown/rolldown-adapter-helpers.js} +99 -13
  125. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  126. package/src/build/{rolldown-build-adapter.js → rolldown/rolldown-build-adapter.js} +3 -3
  127. package/src/build/rolldown/rolldown-build-invocation-metrics.d.ts +12 -0
  128. package/src/build/rolldown/rolldown-build-invocation-metrics.js +43 -0
  129. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
  130. package/src/build/{rolldown-plugin-bridge.js → rolldown/rolldown-plugin-bridge.js} +21 -6
  131. package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
  132. package/src/build/rolldown/rolldown-source-transform-pass.js +61 -0
  133. package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -0
  134. package/src/build/rolldown/runtime-build-output-normalizer.js +201 -0
  135. package/src/build/runtime/build-profile-options.d.ts +7 -0
  136. package/src/build/runtime/build-profile-options.js +37 -0
  137. package/src/build/runtime/build-request-identity.d.ts +17 -0
  138. package/src/build/runtime/build-request-identity.js +54 -0
  139. package/src/build/runtime/build-request-policy.d.ts +59 -0
  140. package/src/build/runtime/build-request-policy.js +46 -0
  141. package/src/build/runtime/build-runtime.d.ts +28 -0
  142. package/src/build/runtime/build-runtime.js +65 -0
  143. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  144. package/src/build/runtime/deduping-build-executor.js +34 -0
  145. package/src/build/runtime/parallel-build-executor.d.ts +21 -0
  146. package/src/build/runtime/parallel-build-executor.js +52 -0
  147. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  148. package/src/client/navigation-scripts/classification.d.ts +16 -0
  149. package/src/client/navigation-scripts/classification.js +41 -0
  150. package/src/client/navigation-scripts/index.d.ts +3 -0
  151. package/src/client/navigation-scripts/index.js +23 -0
  152. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +65 -0
  153. package/src/client/navigation-scripts/registry.d.ts +11 -0
  154. package/src/client/navigation-scripts/registry.js +12 -0
  155. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  156. package/src/client/navigation-scripts/rerun-queue.js +73 -0
  157. package/src/client/scroll.d.ts +17 -0
  158. package/src/client/scroll.js +25 -0
  159. package/src/client/scroll.test.browser.js +37 -0
  160. package/src/client/view-transitions.d.ts +16 -0
  161. package/src/client/view-transitions.js +63 -0
  162. package/src/config/config-builder.d.ts +25 -10
  163. package/src/config/config-builder.js +53 -11
  164. package/src/config/constants.d.ts +1 -0
  165. package/src/config/constants.js +2 -1
  166. package/src/dev/client-bridge-registry.d.ts +5 -0
  167. package/src/dev/client-bridge-registry.js +15 -0
  168. package/src/dev/dev-client-ownership.d.ts +7 -0
  169. package/src/dev/dev-client-ownership.js +6 -0
  170. package/src/dev/hmr-manager-registry.d.ts +8 -0
  171. package/src/dev/hmr-manager-registry.js +15 -0
  172. package/src/dev/host-runtime.d.ts +3 -0
  173. package/src/dev/host-runtime.js +7 -0
  174. package/src/dev/runtime-server-started-message.d.ts +2 -0
  175. package/src/dev/runtime-server-started-message.js +6 -0
  176. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  177. package/src/diagnostics/request-build-dedupe.js +33 -0
  178. package/src/diagnostics/startup-trace.d.ts +72 -0
  179. package/src/diagnostics/startup-trace.js +253 -0
  180. package/src/eco/README.md +11 -0
  181. package/src/eco/eco-declared-component.d.ts +14 -0
  182. package/src/eco/eco-declared-component.js +16 -0
  183. package/src/eco/eco.browser.js +5 -6
  184. package/src/eco/eco.js +7 -8
  185. package/src/eco/eco.types.d.ts +14 -3
  186. package/src/eco/eco.utils.d.ts +1 -1
  187. package/src/eco/eco.utils.js +1 -1
  188. package/src/eco/page-layout-normalization.d.ts +21 -0
  189. package/src/eco/page-layout-normalization.js +59 -0
  190. package/src/env.d.ts +2 -0
  191. package/src/errors/index.d.ts +1 -0
  192. package/src/errors/index.js +7 -1
  193. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  194. package/src/errors/undeclared-component-dependency-error.js +17 -0
  195. package/src/hmr/client/hmr-runtime.js +7 -4
  196. package/src/hmr/hmr-entrypoint-output.d.ts +49 -0
  197. package/src/hmr/hmr-entrypoint-output.js +60 -0
  198. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  199. package/src/hmr/hmr-file-change-prep.js +17 -0
  200. package/src/hmr/hmr-strategy.d.ts +15 -0
  201. package/src/hmr/hmr-strategy.js +19 -0
  202. package/src/hmr/strategies/js-hmr-strategy.d.ts +3 -5
  203. package/src/hmr/strategies/js-hmr-strategy.js +72 -19
  204. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  205. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +29 -0
  206. package/src/index.d.ts +2 -1
  207. package/src/index.js +28 -2
  208. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  209. package/src/integrations/ghtml/ghtml-renderer.js +2 -51
  210. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  211. package/src/integrations/ghtml/ghtml.plugin.js +7 -14
  212. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  213. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  214. package/src/plugins/alias-resolver-plugin.js +38 -51
  215. package/src/plugins/define-integration.d.ts +26 -0
  216. package/src/plugins/define-integration.js +19 -0
  217. package/src/plugins/eco-component-meta-plugin.d.ts +1 -1
  218. package/src/plugins/eco-component-meta-plugin.js +5 -8
  219. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  220. package/src/plugins/foreign-jsx-override-plugin.js +4 -6
  221. package/src/plugins/integration-plugin.d.ts +43 -14
  222. package/src/plugins/integration-plugin.js +18 -5
  223. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  224. package/src/plugins/jsx-import-source.utils.js +26 -0
  225. package/src/plugins/processor.d.ts +61 -12
  226. package/src/plugins/processor.js +24 -5
  227. package/src/plugins/source-transform.d.ts +32 -1
  228. package/src/plugins/source-transform.js +23 -1
  229. package/src/plugins/tsconfig-import-resolver.d.ts +18 -0
  230. package/src/plugins/tsconfig-import-resolver.js +159 -0
  231. package/src/route-renderer/GRAPH.md +26 -32
  232. package/src/route-renderer/README.md +38 -31
  233. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  234. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +148 -0
  235. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  236. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +31 -0
  237. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  238. package/src/route-renderer/orchestration/{component-render-context.js → foreign-child/component-render-context.js} +4 -2
  239. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +17 -7
  240. package/src/route-renderer/orchestration/{render-output.utils.js → foreign-child/foreign-child-output.utils.js} +35 -26
  241. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  242. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.js → foreign-child/foreign-subtree-execution.service.js} +170 -37
  243. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  244. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +35 -0
  245. package/src/route-renderer/orchestration/integration-renderer.d.ts +24 -143
  246. package/src/route-renderer/orchestration/integration-renderer.js +163 -402
  247. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  248. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +177 -0
  249. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  250. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +143 -0
  251. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  252. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +96 -0
  253. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +7 -2
  254. package/src/route-renderer/orchestration/{ownership-validation.service.js → ownership-graph/ownership-validation.service.js} +30 -3
  255. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  256. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +32 -0
  257. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.d.ts +9 -0
  258. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +7 -0
  259. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  260. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +29 -0
  261. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +106 -0
  262. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +436 -0
  263. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +31 -0
  264. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +229 -0
  265. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  266. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +31 -0
  267. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +25 -0
  268. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  269. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +27 -0
  270. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  271. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +36 -0
  272. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +20 -0
  273. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +24 -0
  274. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +25 -0
  275. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +49 -0
  276. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  277. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +33 -0
  278. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +13 -53
  279. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +162 -0
  280. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  281. package/src/route-renderer/orchestration/string-markup-renderer.js +55 -0
  282. package/src/route-renderer/page-loading/component-dependency-collection.js +5 -2
  283. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +6 -0
  284. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +7 -2
  285. package/src/route-renderer/page-loading/module-declaration-aggregation.js +4 -0
  286. package/src/router/client/link-intent.d.ts +11 -21
  287. package/src/router/client/link-intent.js +10 -0
  288. package/src/router/client/link-intent.test.browser.js +12 -1
  289. package/src/router/client/link-navigation-policy.d.ts +45 -0
  290. package/src/router/client/link-navigation-policy.js +101 -0
  291. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  292. package/src/router/client/link-navigation-policy.test.browser.js +92 -0
  293. package/src/router/client/navigation-coordinator.d.ts +1 -1
  294. package/src/router/client/navigation-coordinator.js +12 -2
  295. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  296. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +3 -0
  297. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +6 -1
  298. package/src/services/assets/asset-processing-service/asset-processing.service.js +44 -5
  299. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  300. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -1
  301. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
  302. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  303. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +78 -0
  304. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  305. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +28 -13
  306. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  307. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +7 -0
  308. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  309. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +38 -12
  310. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  311. package/src/services/assets/asset-processing-service/index.js +2 -0
  312. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  313. package/src/services/assets/asset-processing-service/inline-content-script-body.js +17 -0
  314. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  315. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +18 -0
  316. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  317. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +2 -15
  318. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  319. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +73 -68
  320. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  321. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +18 -15
  322. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +17 -3
  323. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  324. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +2 -31
  325. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  326. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +2 -30
  327. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  328. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +43 -0
  329. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  330. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +17 -0
  331. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  332. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +5 -10
  333. package/src/services/assets/browser-bundle.service.d.ts +28 -30
  334. package/src/services/assets/browser-bundle.service.js +28 -19
  335. package/src/services/html/html-transformer.service.d.ts +1 -1
  336. package/src/services/html/html-transformer.service.js +5 -5
  337. package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
  338. package/src/services/invalidation/development-invalidation.service.js +64 -11
  339. package/src/services/module-loading/README.md +49 -0
  340. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  341. package/src/services/module-loading/app-server-module-transpiler.service.js +3 -21
  342. package/src/services/module-loading/page-module-import.service.d.ts +6 -2
  343. package/src/services/module-loading/page-module-import.service.js +110 -47
  344. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  345. package/src/services/module-loading/route-module-build-cache-registry.js +37 -0
  346. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  347. package/src/services/module-loading/route-module-build-cache.js +38 -0
  348. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  349. package/src/services/module-loading/route-module-build-cache.store.js +207 -0
  350. package/src/services/module-loading/route-module-build-manifest.d.ts +54 -0
  351. package/src/services/module-loading/route-module-build-manifest.js +85 -0
  352. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  353. package/src/services/module-loading/route-module-dependency-hasher.js +122 -0
  354. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -1
  355. package/src/services/module-loading/server-module-transpiler.service.js +1 -1
  356. package/src/services/validation/schema-validation-service.d.ts +1 -4
  357. package/src/services/validation/schema-validation-service.js +12 -13
  358. package/src/services/validation/standard-schema.types.d.ts +9 -62
  359. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  360. package/src/services/validation/validate-standard-schema.js +14 -0
  361. package/src/static-site-generator/README.md +41 -0
  362. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +28 -0
  363. package/src/static-site-generator/production-page-browser-graph-prebuild.js +22 -0
  364. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  365. package/src/static-site-generator/sitemap-routes.js +31 -0
  366. package/src/static-site-generator/sitemap.d.ts +15 -0
  367. package/src/static-site-generator/sitemap.js +33 -0
  368. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  369. package/src/static-site-generator/static-build-invalidation.js +59 -0
  370. package/src/static-site-generator/static-export-context.d.ts +30 -0
  371. package/src/static-site-generator/static-export-context.js +0 -0
  372. package/src/static-site-generator/static-site-generator.d.ts +43 -25
  373. package/src/static-site-generator/static-site-generator.js +381 -106
  374. package/src/types/internal-types.d.ts +39 -13
  375. package/src/types/public-types.d.ts +289 -52
  376. package/src/utils/ecopages-route-info.d.ts +26 -0
  377. package/src/utils/ecopages-route-info.js +26 -0
  378. package/src/utils/html-escaping.d.ts +7 -0
  379. package/src/utils/html-escaping.js +5 -1
  380. package/src/utils/parse-cli-args.d.ts +2 -0
  381. package/src/utils/parse-cli-args.js +6 -0
  382. package/src/utils/path-pattern.d.ts +23 -0
  383. package/src/utils/path-pattern.js +27 -0
  384. package/src/utils/server-utils.module.d.ts +3 -2
  385. package/src/utils/server-utils.module.js +5 -6
  386. package/src/utils/static-file-extensions.d.ts +12 -0
  387. package/src/utils/static-file-extensions.js +48 -0
  388. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  389. package/src/watchers/project-watcher-ignore.js +16 -0
  390. package/src/watchers/project-watcher.d.ts +29 -6
  391. package/src/watchers/project-watcher.js +146 -34
  392. package/src/watchers/project-watcher.test-helpers.js +5 -5
  393. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  394. package/src/adapters/shared/define-api-handler.js +0 -15
  395. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  396. package/src/adapters/shared/server-adapter.js +0 -436
  397. package/src/adapters/shared/server-static-builder.js +0 -162
  398. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  399. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  400. package/src/build/build-manifest.d.ts +0 -33
  401. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  402. package/src/build/rolldown-dev-build-adapter.js +0 -166
  403. package/src/build/runtime-build-executor.d.ts +0 -21
  404. package/src/build/runtime-build-executor.js +0 -19
  405. package/src/build/runtime-build-output-normalizer.d.ts +0 -3
  406. package/src/build/runtime-build-output-normalizer.js +0 -111
  407. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  408. package/src/hmr/hmr.test.e2e.js +0 -43
  409. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  410. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  411. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  412. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  413. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  414. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  415. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  416. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  417. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  418. /package/src/adapters/shared/{explicit-static-render-preparation.js → http/explicit-static-render-preparation.js} +0 -0
  419. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  420. /package/src/adapters/shared/{runtime-host.js → runtime/runtime-host.js} +0 -0
  421. /package/src/adapters/shared/{static-preview-host.js → runtime/static-preview-host.js} +0 -0
  422. /package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +0 -0
  423. /package/src/build/{browser-runtime-manifest.js → browser/browser-runtime-manifest.js} +0 -0
  424. /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
  425. /package/src/build/{browser-runtime-plugin-helpers.js → browser/browser-runtime-plugin-helpers.js} +0 -0
  426. /package/src/build/{build-types.js → contracts/build-contracts.js} +0 -0
  427. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  428. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
  429. /package/src/build/{server-side-css-shim-plugin.js → rolldown/server-side-css-shim-plugin.js} +0 -0
  430. /package/src/build/{serialized-build-executor.js → runtime/serialized-build-executor.js} +0 -0
  431. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → client/navigation-scripts/navigation-scripts.test.browser.d.ts} +0 -0
  432. /package/src/{hmr/hmr.test.e2e.d.ts → client/scroll.test.browser.d.ts} +0 -0
  433. /package/src/route-renderer/orchestration/{processed-asset-dedupe.js → page-browser-graph/processed-asset-dedupe.js} +0 -0
@@ -8,7 +8,9 @@
8
8
  */
9
9
  import type { SourceModuleLoader } from '../../services/module-loading/module-loading-types.js';
10
10
  import type { EcoPagesAppConfig } from '../../types/internal-types.js';
11
- import type { ApiHandler, ApiHandlerContext, ErrorHandler, Middleware, RouteOptions, StaticRoute, ViewLoader } from '../../types/public-types.js';
11
+ import type { ApiHandler, ApiHandlerContext, ErrorHandler, Middleware, RouteOptions, StaticRoute, ViewLoader, EcopagesRouteInfo } from '../../types/public-types.js';
12
+ import type { EcopagesWebSocketHandler } from '../../types/public-types.js';
13
+ import { type EcopagesRuntimeLabel } from '../../dev/runtime-server-started-message.js';
12
14
  import { type ReturnParseCliArgs } from '../../utils/parse-cli-args.js';
13
15
  /**
14
16
  * Runtime bootstrap options layered on top of the app config.
@@ -25,6 +27,21 @@ export interface ApplicationRuntimeOptions {
25
27
  * adapter auto-detects a host module loader from the global scope.
26
28
  */
27
29
  embedded?: boolean;
30
+ /**
31
+ * When true, full-page reload signaling is owned by the host dev server
32
+ * (for example Vite's `full-reload` websocket event) instead of the Ecopages
33
+ * client bridge.
34
+ *
35
+ * @deprecated Prefer `devClientOwner: 'host'`.
36
+ */
37
+ delegateBrowserReloadToHost?: boolean;
38
+ /**
39
+ * Selects which layer injects browser dev-client bootstrap (HMR runtime, reload).
40
+ *
41
+ * `host` disables core injection and reload signaling so embedded hosts like
42
+ * Vite own the full dev-client surface.
43
+ */
44
+ devClientOwner?: 'core' | 'host';
28
45
  /**
29
46
  * Explicit source module loader for request-time imports.
30
47
  *
@@ -33,6 +50,27 @@ export interface ApplicationRuntimeOptions {
33
50
  */
34
51
  hostModuleLoader?: SourceModuleLoader;
35
52
  }
53
+ export interface AppStartInfo {
54
+ origin: string;
55
+ /**
56
+ * Static-generation routes available when the runtime becomes ready.
57
+ *
58
+ * @remarks
59
+ * Empty when the server adapter has no route registry yet, or when route
60
+ * resolution fails (failures never block startup). Route resolution completes
61
+ * before the `onAppStart` callback runs.
62
+ */
63
+ routes: EcopagesRouteInfo[];
64
+ }
65
+ export type OnAppStartCallback = (info: AppStartInfo) => void;
66
+ /** @deprecated Use {@link AppStartInfo}. */
67
+ export type ApplicationListeningInfo = AppStartInfo;
68
+ /** @deprecated Use {@link OnAppStartCallback}. */
69
+ export type StartCallback = OnAppStartCallback;
70
+ /** @deprecated Use {@link OnAppStartCallback}. */
71
+ export type ListenCallback = OnAppStartCallback;
72
+ /** @deprecated Use {@link OnAppStartCallback}. */
73
+ export type ApplicationListeningCallback = OnAppStartCallback;
36
74
  /**
37
75
  * Configuration options for application adapters
38
76
  */
@@ -49,8 +87,12 @@ export interface ApplicationAdapterOptions {
49
87
  /**
50
88
  * Common interface for application adapters
51
89
  */
52
- export interface ApplicationAdapter<T = any> {
53
- start(): Promise<T | void>;
90
+ export interface ApplicationAdapter<T = any> extends AsyncDisposable {
91
+ /** Boot the server. Pass a callback to run when the runtime is ready (optional). */
92
+ start(onAppStart?: OnAppStartCallback): Promise<T | void>;
93
+ /** Invoked by embedded hosts once the app can take traffic. */
94
+ handleListening(origin: string): void | Promise<void>;
95
+ stop(force?: boolean): Promise<void>;
54
96
  }
55
97
  /**
56
98
  * Handler function type for route handlers
@@ -72,7 +114,14 @@ export declare abstract class AbstractApplicationAdapter<TOptions extends Applic
72
114
  protected apiHandlers: ApiHandler[];
73
115
  protected staticRoutes: StaticRoute[];
74
116
  protected errorHandler?: ErrorHandler;
75
- constructor(options: TOptions);
117
+ /**
118
+ * App-level WebSocket handlers keyed by URL path pattern (e.g. '/ws/chat/:id').
119
+ * Both Bun and Node adapters read this map to register upgrade routes.
120
+ */
121
+ protected websocketHandlers: Map<string, EcopagesWebSocketHandler<any, any>>;
122
+ private onAppStartCallback?;
123
+ protected readonly runtimeLabel: EcopagesRuntimeLabel;
124
+ constructor(options: TOptions, runtimeLabel: EcopagesRuntimeLabel);
76
125
  private clearDistFolder;
77
126
  /**
78
127
  * Register a GET route handler.
@@ -160,6 +209,46 @@ export declare abstract class AbstractApplicationAdapter<TOptions extends Applic
160
209
  * Get all registered static routes
161
210
  */
162
211
  getStaticRoutes(): StaticRoute[];
212
+ /**
213
+ * Register a WebSocket handler for the given path pattern.
214
+ *
215
+ * The runtime adapter handles the HTTP→WebSocket upgrade for this path
216
+ * and routes lifecycle events to `handler`.
217
+ *
218
+ * Supports dynamic segments via `:param` syntax. The handler receives
219
+ * typed `params` and `search` fields, and a typed `context` produced by
220
+ * the optional `context()` factory.
221
+ *
222
+ * One pattern registration matches infinite path variations. For example,
223
+ * `app.websocket('/ws/chat/:roomId', handler)` matches `/ws/chat/abc`,
224
+ * `/ws/chat/xyz`, etc. Each connection receives its own `params.roomId`.
225
+ *
226
+ * Works across both Bun and Node runtimes — no runtime-specific imports needed.
227
+ *
228
+ * @example
229
+ * ```typescript
230
+ * app.websocket<ChatContext, { roomId: string }>('/ws/chat/:roomId', {
231
+ * async context({ params, search }) {
232
+ * return { username: search.username ?? 'anonymous', roomId: params.roomId };
233
+ * },
234
+ * onConnect(socket) {
235
+ * socket.send(`Welcome to room ${socket.context.roomId}`);
236
+ * },
237
+ * onMessage(socket, message) {
238
+ * if (message.kind === 'text') {
239
+ * socket.send(message.text);
240
+ * }
241
+ * },
242
+ * });
243
+ * ```
244
+ */
245
+ websocket<TContext = unknown, TParams extends Record<string, string> = Record<string, string>>(path: string, handler: EcopagesWebSocketHandler<TContext, TParams>): this;
246
+ /**
247
+ * Get the registered WebSocket handlers map.
248
+ *
249
+ * @returns The map of WebSocket route patterns to handlers
250
+ */
251
+ getWebsocketHandlers(): Map<string, EcopagesWebSocketHandler<any, any>>;
163
252
  /**
164
253
  * Register a global error handler for all routes.
165
254
  * Useful for logging, monitoring integration, and custom error formatting.
@@ -182,9 +271,37 @@ export declare abstract class AbstractApplicationAdapter<TOptions extends Applic
182
271
  */
183
272
  protected abstract initializeServerAdapter(): Promise<any>;
184
273
  /**
185
- * Start the application server
274
+ * Boot the server. When `onAppStart` is passed, it runs once the runtime can take traffic.
275
+ * Embedded apps only register the callback — the host (for example Vite) boots the port.
276
+ */
277
+ start(onAppStart?: OnAppStartCallback): Promise<TServer | void>;
278
+ /** Runtime-specific server boot (dev, preview, build). */
279
+ protected abstract bootServer(): Promise<TServer | void>;
280
+ protected logServerStarted(origin: string): void;
281
+ /**
282
+ * Invoked by embedded hosts (for example Vite) once the app can take traffic.
283
+ */
284
+ handleListening(origin: string): Promise<void>;
285
+ protected notifyListening(origin: string): Promise<void>;
286
+ /**
287
+ * Resolves routes exposed on {@link AppStartInfo}.
288
+ *
289
+ * @remarks
290
+ * Default is empty. Runtime adapters override this to read from the
291
+ * initialized server route registry.
292
+ */
293
+ protected resolveAppRoutes(): Promise<EcopagesRouteInfo[]>;
294
+ private invokeAppStartCallback;
295
+ /**
296
+ * Stops the application server and releases runtime resources.
297
+ *
298
+ * @remarks
299
+ * Subclasses override this to shut down bound servers, watchers, and other
300
+ * dev-time resources. The default implementation is a no-op so embedded
301
+ * adapters that never call `start()` can still be used with `await using`.
186
302
  */
187
- abstract start(): Promise<TServer | void>;
303
+ stop(_force?: boolean): Promise<void>;
304
+ [Symbol.asyncDispose](): Promise<void>;
188
305
  /**
189
306
  * Handles a standard Web request without requiring a bound network server.
190
307
  * This is the primary interoperability surface for embedding Ecopages inside
@@ -6,7 +6,11 @@ import {
6
6
  import { getHostModuleLoader } from "../../services/module-loading/host-module-loader-registry.js";
7
7
  import { invariant } from "../../utils/invariant.js";
8
8
  import { fileSystem } from "@ecopages/file-system";
9
+ import {
10
+ formatRuntimeServerStartedMessage
11
+ } from "../../dev/runtime-server-started-message.js";
9
12
  import { parseCliArgs } from "../../utils/parse-cli-args.js";
13
+ import { startupTrace } from "../../diagnostics/startup-trace.js";
10
14
  class AbstractApplicationAdapter {
11
15
  appConfig;
12
16
  serverOptions;
@@ -15,16 +19,31 @@ class AbstractApplicationAdapter {
15
19
  apiHandlers = [];
16
20
  staticRoutes = [];
17
21
  errorHandler;
18
- constructor(options) {
22
+ /**
23
+ * App-level WebSocket handlers keyed by URL path pattern (e.g. '/ws/chat/:id').
24
+ * Both Bun and Node adapters read this map to register upgrade routes.
25
+ */
26
+ websocketHandlers = /* @__PURE__ */ new Map();
27
+ onAppStartCallback;
28
+ runtimeLabel;
29
+ constructor(options, runtimeLabel) {
30
+ this.runtimeLabel = runtimeLabel;
19
31
  this.appConfig = options.appConfig;
20
32
  this.serverOptions = options.serverOptions || {};
21
33
  this.runtimeOptions = options.runtime ?? {};
34
+ if (options.runtime) {
35
+ this.appConfig.runtime = {
36
+ ...this.appConfig.runtime ?? {},
37
+ ...options.runtime
38
+ };
39
+ }
22
40
  this.cliArgs = parseCliArgs({ embeddedRuntime: this.runtimeOptions.embedded });
23
41
  const hostModuleLoader = this.runtimeOptions.hostModuleLoader ?? (this.runtimeOptions.embedded ? getHostModuleLoader() : void 0);
24
42
  if (hostModuleLoader) {
25
43
  setAppHostModuleLoader(this.appConfig, hostModuleLoader);
26
44
  }
27
45
  getAppModuleLoader(this.appConfig);
46
+ startupTrace.markConfigReady();
28
47
  if (options.clearOutput) {
29
48
  this.clearDistFolder().catch((error) => {
30
49
  appLogger.error("Error clearing dist folder", error);
@@ -93,6 +112,71 @@ class AbstractApplicationAdapter {
93
112
  getStaticRoutes() {
94
113
  return this.staticRoutes;
95
114
  }
115
+ /**
116
+ * Register a WebSocket handler for the given path pattern.
117
+ *
118
+ * The runtime adapter handles the HTTP→WebSocket upgrade for this path
119
+ * and routes lifecycle events to `handler`.
120
+ *
121
+ * Supports dynamic segments via `:param` syntax. The handler receives
122
+ * typed `params` and `search` fields, and a typed `context` produced by
123
+ * the optional `context()` factory.
124
+ *
125
+ * One pattern registration matches infinite path variations. For example,
126
+ * `app.websocket('/ws/chat/:roomId', handler)` matches `/ws/chat/abc`,
127
+ * `/ws/chat/xyz`, etc. Each connection receives its own `params.roomId`.
128
+ *
129
+ * Works across both Bun and Node runtimes — no runtime-specific imports needed.
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * app.websocket<ChatContext, { roomId: string }>('/ws/chat/:roomId', {
134
+ * async context({ params, search }) {
135
+ * return { username: search.username ?? 'anonymous', roomId: params.roomId };
136
+ * },
137
+ * onConnect(socket) {
138
+ * socket.send(`Welcome to room ${socket.context.roomId}`);
139
+ * },
140
+ * onMessage(socket, message) {
141
+ * if (message.kind === 'text') {
142
+ * socket.send(message.text);
143
+ * }
144
+ * },
145
+ * });
146
+ * ```
147
+ */
148
+ websocket(path, handler) {
149
+ invariant(
150
+ typeof path === "string" && path.startsWith("/"),
151
+ `app.websocket(): path must be a string starting with "/", got "${path}".`
152
+ );
153
+ const segments = path.split("/").filter(Boolean);
154
+ const paramNames = /* @__PURE__ */ new Set();
155
+ for (const segment of segments) {
156
+ if (segment.startsWith(":")) {
157
+ const paramName = segment.slice(1);
158
+ invariant(
159
+ paramName.length > 0,
160
+ `app.websocket(): invalid pattern "${path}" \u2014 empty param name in segment ":${paramName}".`
161
+ );
162
+ invariant(
163
+ !paramNames.has(paramName),
164
+ `app.websocket(): invalid pattern "${path}" \u2014 duplicate param name ":${paramName}".`
165
+ );
166
+ paramNames.add(paramName);
167
+ }
168
+ }
169
+ this.websocketHandlers.set(path, handler);
170
+ return this;
171
+ }
172
+ /**
173
+ * Get the registered WebSocket handlers map.
174
+ *
175
+ * @returns The map of WebSocket route patterns to handlers
176
+ */
177
+ getWebsocketHandlers() {
178
+ return this.websocketHandlers;
179
+ }
96
180
  /**
97
181
  * Register a global error handler for all routes.
98
182
  * Useful for logging, monitoring integration, and custom error formatting.
@@ -115,6 +199,72 @@ class AbstractApplicationAdapter {
115
199
  getErrorHandler() {
116
200
  return this.errorHandler;
117
201
  }
202
+ /**
203
+ * Boot the server. When `onAppStart` is passed, it runs once the runtime can take traffic.
204
+ * Embedded apps only register the callback — the host (for example Vite) boots the port.
205
+ */
206
+ async start(onAppStart) {
207
+ if (onAppStart) {
208
+ this.onAppStartCallback = onAppStart;
209
+ }
210
+ if (this.runtimeOptions.embedded) {
211
+ return;
212
+ }
213
+ return this.bootServer();
214
+ }
215
+ logServerStarted(origin) {
216
+ appLogger.info(formatRuntimeServerStartedMessage(this.runtimeLabel, origin));
217
+ }
218
+ /**
219
+ * Invoked by embedded hosts (for example Vite) once the app can take traffic.
220
+ */
221
+ async handleListening(origin) {
222
+ await this.notifyListening(origin);
223
+ }
224
+ async notifyListening(origin) {
225
+ const normalizedOrigin = origin.replace(/\/$/, "");
226
+ startupTrace.markServerListening();
227
+ if (!this.onAppStartCallback) {
228
+ this.logServerStarted(normalizedOrigin);
229
+ return;
230
+ }
231
+ await this.invokeAppStartCallback(normalizedOrigin);
232
+ }
233
+ /**
234
+ * Resolves routes exposed on {@link AppStartInfo}.
235
+ *
236
+ * @remarks
237
+ * Default is empty. Runtime adapters override this to read from the
238
+ * initialized server route registry.
239
+ */
240
+ async resolveAppRoutes() {
241
+ return [];
242
+ }
243
+ async invokeAppStartCallback(origin) {
244
+ let routes = [];
245
+ try {
246
+ routes = await this.resolveAppRoutes();
247
+ } catch (error) {
248
+ appLogger.debug(
249
+ "Failed to resolve app start routes; continuing with empty routes",
250
+ error instanceof Error ? error.message : String(error)
251
+ );
252
+ }
253
+ this.onAppStartCallback?.({ origin, routes });
254
+ }
255
+ /**
256
+ * Stops the application server and releases runtime resources.
257
+ *
258
+ * @remarks
259
+ * Subclasses override this to shut down bound servers, watchers, and other
260
+ * dev-time resources. The default implementation is a no-op so embedded
261
+ * adapters that never call `start()` can still be used with `await using`.
262
+ */
263
+ async stop(_force = true) {
264
+ }
265
+ async [Symbol.asyncDispose]() {
266
+ await this.stop(true);
267
+ }
118
268
  }
119
269
  export {
120
270
  AbstractApplicationAdapter
@@ -0,0 +1,6 @@
1
+ export declare function normalizeSegmentPath(pathname: string): string;
2
+ export declare function matchApiPathPattern(pattern: string, pathname: string): Record<string, string | string[]> | null;
3
+ export declare function scoreApiPathPattern(pattern: string): number;
4
+ export declare function matchExplicitStaticPathPattern(pattern: string, pathname: string): Record<string, string> | null;
5
+ export declare function matchColonSegmentPath(pattern: string, pathname: string): Record<string, string> | null;
6
+ export declare function scoreColonSegmentPath(pattern: string): number;
@@ -0,0 +1,149 @@
1
+ function normalizeSegmentPath(pathname) {
2
+ if (pathname.length > 1 && pathname.endsWith("/")) {
3
+ return pathname.slice(0, -1);
4
+ }
5
+ return pathname;
6
+ }
7
+ function matchApiPathPattern(pattern, pathname) {
8
+ const normalizedPattern = normalizeSegmentPath(pattern);
9
+ const normalizedPathname = normalizeSegmentPath(pathname);
10
+ const patternSegments = normalizedPattern.split("/").filter(Boolean);
11
+ const pathSegments = normalizedPathname.split("/").filter(Boolean);
12
+ const params = {};
13
+ let patternIndex = 0;
14
+ let pathIndex = 0;
15
+ while (patternIndex < patternSegments.length && pathIndex < pathSegments.length) {
16
+ const patternSegment = patternSegments[patternIndex];
17
+ const pathSegment = pathSegments[pathIndex];
18
+ if (patternSegment === "*") {
19
+ return params;
20
+ }
21
+ if (patternSegment.startsWith("[...") && patternSegment.endsWith("]")) {
22
+ const paramName = patternSegment.slice(4, -1);
23
+ params[paramName] = pathSegments.slice(pathIndex);
24
+ return params;
25
+ }
26
+ if (patternSegment.startsWith(":")) {
27
+ params[patternSegment.slice(1)] = pathSegment;
28
+ patternIndex++;
29
+ pathIndex++;
30
+ continue;
31
+ }
32
+ if (patternSegment.startsWith("[") && patternSegment.endsWith("]")) {
33
+ params[patternSegment.slice(1, -1)] = pathSegment;
34
+ patternIndex++;
35
+ pathIndex++;
36
+ continue;
37
+ }
38
+ if (patternSegment !== pathSegment) {
39
+ return null;
40
+ }
41
+ patternIndex++;
42
+ pathIndex++;
43
+ }
44
+ if (patternIndex < patternSegments.length) {
45
+ const remaining = patternSegments.slice(patternIndex);
46
+ const catchAll = remaining[0];
47
+ if (remaining.length === 1 && (catchAll === "*" || catchAll.startsWith("[...") && catchAll.endsWith("]"))) {
48
+ if (catchAll.startsWith("[...")) {
49
+ const paramName = catchAll.slice(4, -1);
50
+ params[paramName] = [];
51
+ }
52
+ return params;
53
+ }
54
+ return null;
55
+ }
56
+ if (pathIndex < pathSegments.length) {
57
+ return null;
58
+ }
59
+ return params;
60
+ }
61
+ function scoreApiPathPattern(pattern) {
62
+ const segments = normalizeSegmentPath(pattern).split("/").filter(Boolean);
63
+ let score = 0;
64
+ for (const segment of segments) {
65
+ if (segment === "*" || segment.startsWith("[...") && segment.endsWith("]")) {
66
+ score += 10;
67
+ } else if (segment.startsWith(":") || segment.startsWith("[") && segment.endsWith("]")) {
68
+ score += 50;
69
+ } else {
70
+ score += 100;
71
+ }
72
+ }
73
+ return score;
74
+ }
75
+ function matchExplicitStaticPathPattern(pattern, pathname) {
76
+ const patternSegments = normalizeSegmentPath(pattern).split("/").filter(Boolean);
77
+ const pathSegments = normalizeSegmentPath(pathname).split("/").filter(Boolean);
78
+ if (patternSegments.length !== pathSegments.length) {
79
+ const lastPattern = patternSegments[patternSegments.length - 1];
80
+ const isCatchAll = lastPattern?.startsWith("[...") || lastPattern?.startsWith(":...");
81
+ if (!isCatchAll) {
82
+ return null;
83
+ }
84
+ }
85
+ const params = {};
86
+ for (let i = 0; i < patternSegments.length; i++) {
87
+ const patternPart = patternSegments[i];
88
+ const pathPart = pathSegments[i];
89
+ if (patternPart.startsWith(":...") || patternPart.startsWith("[...")) {
90
+ const paramName = patternPart.replace(/^(:\.\.\.|\[\.\.\.)/, "").replace(/\]$/, "");
91
+ params[paramName] = pathSegments.slice(i).join("/");
92
+ return params;
93
+ }
94
+ if (patternPart.startsWith(":")) {
95
+ params[patternPart.slice(1)] = pathPart;
96
+ } else if (patternPart.startsWith("[") && patternPart.endsWith("]")) {
97
+ params[patternPart.slice(1, -1)] = pathPart;
98
+ } else if (patternPart !== pathPart) {
99
+ return null;
100
+ }
101
+ }
102
+ return params;
103
+ }
104
+ function matchColonSegmentPath(pattern, pathname) {
105
+ const patternSegments = pattern.split("/").filter(Boolean);
106
+ const pathSegments = pathname.split("/").filter(Boolean);
107
+ if (patternSegments.length !== pathSegments.length) {
108
+ return null;
109
+ }
110
+ const params = {};
111
+ for (let i = 0; i < patternSegments.length; i++) {
112
+ const patternSegment = patternSegments[i];
113
+ const pathSegment = pathSegments[i];
114
+ if (!patternSegment || !pathSegment) {
115
+ return null;
116
+ }
117
+ if (patternSegment.startsWith(":")) {
118
+ const paramName = patternSegment.slice(1);
119
+ if (!paramName) {
120
+ return null;
121
+ }
122
+ params[paramName] = pathSegment;
123
+ } else if (patternSegment !== pathSegment) {
124
+ return null;
125
+ }
126
+ }
127
+ return params;
128
+ }
129
+ function scoreColonSegmentPath(pattern) {
130
+ const segments = pattern.split("/").filter(Boolean);
131
+ let literals = 0;
132
+ let dynamics = 0;
133
+ for (const segment of segments) {
134
+ if (segment.startsWith(":")) {
135
+ dynamics += 1;
136
+ } else {
137
+ literals += 1;
138
+ }
139
+ }
140
+ return literals * 100 - dynamics * 10 + segments.length;
141
+ }
142
+ export {
143
+ matchApiPathPattern,
144
+ matchColonSegmentPath,
145
+ matchExplicitStaticPathPattern,
146
+ normalizeSegmentPath,
147
+ scoreApiPathPattern,
148
+ scoreColonSegmentPath
149
+ };
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import type { EcoPagesAppConfig } from '../../types/internal-types.js';
10
10
  import type { ApiHandler } from '../../types/public-types.js';
11
+ import type { StaticGenerationRoute } from '../../router/server/route-registry.js';
11
12
  /**
12
13
  * Configuration options for all server adapters
13
14
  */
@@ -31,7 +32,19 @@ export interface ServerAdapterResult {
31
32
  }) => any;
32
33
  buildStatic: (options?: {
33
34
  preview?: boolean;
34
- }) => Promise<void>;
35
+ force?: boolean;
36
+ }) => Promise<string | undefined>;
37
+ servePreviewOnly: () => Promise<string | undefined>;
38
+ dispose(): Promise<void>;
39
+ /**
40
+ * Lists static-generation routes for app-start consumers.
41
+ *
42
+ * @remarks
43
+ * Optional so lightweight adapter stubs in tests need not implement routing.
44
+ */
45
+ listStaticGenerationRoutes?: (input: {
46
+ runtimeOrigin: string;
47
+ }) => Promise<readonly StaticGenerationRoute[]>;
35
48
  }
36
49
  /**
37
50
  * Abstract base class for server adapters across different runtimes
@@ -57,7 +70,8 @@ export declare abstract class AbstractServerAdapter<TOptions extends ServerAdapt
57
70
  */
58
71
  abstract buildStatic(options?: {
59
72
  preview?: boolean;
60
- }): Promise<void>;
73
+ force?: boolean;
74
+ }): Promise<string | undefined>;
61
75
  /**
62
76
  * Factory method to create a server adapter with runtime-specific functionality
63
77
  */
@@ -0,0 +1,12 @@
1
+ import type { EcopagesWebSocketHandler } from '../../types/public-types.js';
2
+ export type WebSocketRouteMatch = {
3
+ handler: EcopagesWebSocketHandler<any, any>;
4
+ params: Record<string, string>;
5
+ kind: string;
6
+ };
7
+ /**
8
+ * Pattern matcher for WebSocket route paths.
9
+ */
10
+ export declare function matchWebSocketPath(pattern: string, pathname: string): Record<string, string> | null;
11
+ export declare function scoreWebSocketPattern(pattern: string): number;
12
+ export declare function findWebSocketRoute(handlers: Map<string, EcopagesWebSocketHandler<any, any>>, pathname: string): WebSocketRouteMatch | null;
@@ -0,0 +1,30 @@
1
+ import { matchColonSegmentPath, scoreColonSegmentPath } from "./segment-path-matcher.js";
2
+ function matchWebSocketPath(pattern, pathname) {
3
+ return matchColonSegmentPath(pattern, pathname);
4
+ }
5
+ function scoreWebSocketPattern(pattern) {
6
+ return scoreColonSegmentPath(pattern);
7
+ }
8
+ function findWebSocketRoute(handlers, pathname) {
9
+ let best = null;
10
+ let index = 0;
11
+ for (const [pattern, handler] of handlers) {
12
+ const params = matchColonSegmentPath(pattern, pathname);
13
+ if (params === null) {
14
+ index += 1;
15
+ continue;
16
+ }
17
+ const score = scoreColonSegmentPath(pattern);
18
+ const match = { handler, params, kind: pattern };
19
+ if (best === null || score > best.score || score === best.score && index < best.index) {
20
+ best = { score, match, index };
21
+ }
22
+ index += 1;
23
+ }
24
+ return best?.match ?? null;
25
+ }
26
+ export {
27
+ findWebSocketRoute,
28
+ matchWebSocketPath,
29
+ scoreWebSocketPattern
30
+ };
@@ -0,0 +1,22 @@
1
+ import type { ServerWebSocket } from 'bun';
2
+ import type { EcopagesSocket, EcopagesWebSocketHandler } from '../../types/public-types.js';
3
+ export type BunUserWebSocketData = {
4
+ kind: string;
5
+ params: Record<string, string>;
6
+ search: Record<string, string>;
7
+ upgradeUrl?: string;
8
+ context?: unknown;
9
+ [key: string]: unknown;
10
+ };
11
+ export type BunUserWebSocketLifecycleDeps<TWsData extends BunUserWebSocketData> = {
12
+ runtimeOrigin: string;
13
+ userHandlers: Map<string, EcopagesWebSocketHandler<any, any>>;
14
+ resolveContext: <TContext, TParams extends Record<string, string>>(request: Request, handler: EcopagesWebSocketHandler<TContext, TParams>, kind: string, params: TParams, search: Record<string, string>) => Promise<TContext>;
15
+ adaptSocket: <TContext, TParams extends Record<string, string>>(ws: ServerWebSocket<TWsData>, kind: string, params: TParams, search: Record<string, string>, context: TContext) => EcopagesSocket<TContext, TParams>;
16
+ };
17
+ export declare function createBunUserWebSocketLifecycle<TWsData extends BunUserWebSocketData>(deps: BunUserWebSocketLifecycleDeps<TWsData>): {
18
+ open(ws: ServerWebSocket<TWsData>): void;
19
+ message(ws: ServerWebSocket<TWsData>, msg: string | Buffer): void;
20
+ close(ws: ServerWebSocket<TWsData>, code: number, reason: string): void;
21
+ error(ws: ServerWebSocket<TWsData>, error: Error): void;
22
+ };