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

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 (338) hide show
  1. package/README.md +1 -0
  2. package/package.json +82 -3
  3. package/src/adapters/abstract/application-adapter.d.ts +0 -8
  4. package/src/adapters/abstract/application-adapter.js +252 -261
  5. package/src/adapters/abstract/router-adapter.js +12 -4
  6. package/src/adapters/abstract/segment-path-matcher.js +132 -134
  7. package/src/adapters/abstract/server-adapter.js +22 -14
  8. package/src/adapters/abstract/ws-pattern-matcher.js +24 -26
  9. package/src/adapters/bun/bun-user-websocket-lifecycle.js +83 -86
  10. package/src/adapters/bun/client-bridge.js +51 -50
  11. package/src/adapters/bun/create-app.js +171 -161
  12. package/src/adapters/bun/hmr-manager.js +62 -57
  13. package/src/adapters/bun/index.js +2 -31
  14. package/src/adapters/bun/runtime-host.js +61 -54
  15. package/src/adapters/bun/server-adapter.d.ts +0 -1
  16. package/src/adapters/bun/server-adapter.js +561 -561
  17. package/src/adapters/bun/static-preview-host.js +43 -46
  18. package/src/adapters/create-app.js +11 -14
  19. package/src/adapters/index.js +2 -30
  20. package/src/adapters/node/create-app.js +123 -129
  21. package/src/adapters/node/http-request-bridge.js +147 -106
  22. package/src/adapters/node/node-client-bridge.js +62 -64
  23. package/src/adapters/node/node-hmr-manager.js +58 -48
  24. package/src/adapters/node/runtime-host.js +96 -89
  25. package/src/adapters/node/server-adapter-dependencies.js +18 -21
  26. package/src/adapters/node/server-adapter.d.ts +0 -1
  27. package/src/adapters/node/server-adapter.js +347 -326
  28. package/src/adapters/node/static-content-server.js +172 -191
  29. package/src/adapters/node/static-preview-host.js +87 -78
  30. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  31. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  32. package/src/adapters/shared/hmr/hmr-html-response.js +46 -32
  33. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +29 -38
  34. package/src/adapters/shared/hmr/shared-hmr-manager.js +439 -425
  35. package/src/adapters/shared/http/api-request-pipeline.js +122 -119
  36. package/src/adapters/shared/http/api-response.js +77 -77
  37. package/src/adapters/shared/http/create-body-response.js +22 -19
  38. package/src/adapters/shared/http/define-api-handler.js +41 -55
  39. package/src/adapters/shared/http/explicit-static-render-preparation.js +26 -23
  40. package/src/adapters/shared/http/explicit-static-route-matcher.js +55 -62
  41. package/src/adapters/shared/http/file-route-middleware-pipeline.js +81 -75
  42. package/src/adapters/shared/http/fs-server-response-factory.js +101 -96
  43. package/src/adapters/shared/http/fs-server-response-matcher.js +239 -257
  44. package/src/adapters/shared/http/run-middleware-chain.js +15 -15
  45. package/src/adapters/shared/runtime/application-adapter.js +72 -87
  46. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +25 -22
  47. package/src/adapters/shared/runtime/port-manager.js +207 -177
  48. package/src/adapters/shared/runtime/render-context.js +94 -79
  49. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +33 -38
  50. package/src/adapters/shared/runtime/runtime-host.js +1 -0
  51. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +2 -3
  52. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +65 -51
  53. package/src/adapters/shared/runtime/server-adapter.d.ts +1 -0
  54. package/src/adapters/shared/runtime/server-adapter.js +233 -217
  55. package/src/adapters/shared/runtime/server-route-handler.js +74 -70
  56. package/src/adapters/shared/runtime/server-static-builder.js +165 -184
  57. package/src/adapters/shared/runtime/static-preview-host.js +1 -0
  58. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +97 -88
  59. package/src/adapters/shared/ws/websocket-lifecycle.js +57 -50
  60. package/src/build/README.md +52 -1
  61. package/src/build/app-build-manifest-runtime.js +129 -108
  62. package/src/build/browser/browser-runtime-manifest.js +47 -50
  63. package/src/build/browser/browser-runtime-plugin-helpers.js +32 -12
  64. package/src/build/browser/browser-runtime-plugin.js +206 -160
  65. package/src/build/browser/jsx-ownership-plugins.js +51 -37
  66. package/src/build/browser/lit-static-render-worker-context.js +3 -5
  67. package/src/build/build-adapter.js +276 -139
  68. package/src/build/cache/build-input-fingerprint.js +28 -26
  69. package/src/build/cache/cache-constants.js +4 -6
  70. package/src/build/cache/cache-keys.js +64 -56
  71. package/src/build/cache/pages-unified-graph-build.js +179 -178
  72. package/src/build/cache/production-build-cache.js +47 -54
  73. package/src/build/cache/server-entry-build-cache.js +134 -146
  74. package/src/build/contracts/build-contracts.d.ts +4 -4
  75. package/src/build/contracts/build-contracts.js +1 -0
  76. package/src/build/contracts/build-manifest.js +58 -43
  77. package/src/build/contracts/build-types.js +1 -0
  78. package/src/build/rolldown/rolldown-adapter-helpers.d.ts +9 -0
  79. package/src/build/rolldown/rolldown-adapter-helpers.js +405 -298
  80. package/src/build/rolldown/rolldown-build-adapter.js +53 -61
  81. package/src/build/rolldown/rolldown-build-invocation-metrics.js +31 -35
  82. package/src/build/rolldown/rolldown-plugin-bridge.js +264 -194
  83. package/src/build/rolldown/rolldown-source-transform-pass.js +59 -50
  84. package/src/build/rolldown/runtime-build-output-normalizer.js +227 -175
  85. package/src/build/rolldown/server-side-css-shim-plugin.js +54 -31
  86. package/src/build/runtime/build-profile-options.js +36 -36
  87. package/src/build/runtime/build-request-identity.js +70 -45
  88. package/src/build/runtime/build-request-policy.js +80 -42
  89. package/src/build/runtime/build-runtime.js +64 -54
  90. package/src/build/runtime/deduping-build-executor.js +38 -32
  91. package/src/build/runtime/parallel-build-executor.js +58 -50
  92. package/src/build/runtime/serialized-build-executor.js +78 -62
  93. package/src/cache/index.js +6 -6
  94. package/src/cache/module-parse-cache.js +99 -68
  95. package/src/client/navigation-scripts/classification.js +45 -37
  96. package/src/client/navigation-scripts/index.js +3 -23
  97. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +58 -62
  98. package/src/client/navigation-scripts/registry.js +15 -11
  99. package/src/client/navigation-scripts/rerun-queue.js +81 -64
  100. package/src/client/scroll.js +32 -24
  101. package/src/client/scroll.test.browser.js +27 -33
  102. package/src/client/view-transitions.js +68 -55
  103. package/src/config/config-builder.d.ts +8 -0
  104. package/src/config/config-builder.js +637 -642
  105. package/src/config/constants.js +44 -24
  106. package/src/declarations.d.ts +1 -0
  107. package/src/dev/README.md +24 -0
  108. package/src/dev/client-bridge-registry.js +7 -12
  109. package/src/dev/dev-client-ownership.js +7 -5
  110. package/src/dev/hmr-manager-registry.js +7 -12
  111. package/src/dev/host-runtime.js +25 -30
  112. package/src/dev/runtime-server-started-message.js +2 -5
  113. package/src/dev/sc-server.js +106 -103
  114. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  115. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  116. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  117. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  118. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  119. package/src/dev/transform-server/dev-transform-import-rewriter.js +110 -0
  120. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  121. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  122. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  123. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  124. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  125. package/src/dev/transform-server/dev-transform-server.js +191 -0
  126. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  127. package/src/dev/transform-server/dev-transform-url.js +58 -0
  128. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +27 -0
  129. package/src/dev/transform-server/dev-transform-vendor-registry.js +145 -0
  130. package/src/dev/transform-server/index.d.ts +6 -0
  131. package/src/dev/transform-server/index.js +4 -0
  132. package/src/dev/transform-server/types.d.ts +15 -0
  133. package/src/dev/transform-server/types.js +1 -0
  134. package/src/dev-toolbar/README.md +51 -0
  135. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  136. package/src/dev-toolbar/define-dev-tool.js +9 -0
  137. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  138. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  139. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  140. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  141. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  142. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  143. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  144. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  145. package/src/dev-toolbar/dev-toolbar-package.d.ts +31 -0
  146. package/src/dev-toolbar/dev-toolbar-package.js +72 -0
  147. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  148. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  149. package/src/diagnostics/request-build-dedupe.js +34 -28
  150. package/src/diagnostics/startup-trace.d.ts +10 -1
  151. package/src/diagnostics/startup-trace.js +269 -241
  152. package/src/eco/README.md +6 -0
  153. package/src/eco/eco-declared-component.js +19 -14
  154. package/src/eco/eco.browser.js +56 -69
  155. package/src/eco/eco.js +156 -96
  156. package/src/eco/eco.types.js +5 -0
  157. package/src/eco/eco.utils.js +1 -10
  158. package/src/eco/global-injector-map.js +55 -41
  159. package/src/eco/lazy-injector-map.js +90 -60
  160. package/src/eco/module-dependencies.js +52 -44
  161. package/src/eco/page-layout-normalization.js +59 -49
  162. package/src/errors/http-error.js +50 -49
  163. package/src/errors/index.js +3 -12
  164. package/src/errors/locals-access-error.js +5 -8
  165. package/src/errors/undeclared-component-dependency-error.js +15 -15
  166. package/src/global/app-logger.js +3 -6
  167. package/src/hmr/README.md +10 -0
  168. package/src/hmr/client/hmr-runtime.js +117 -113
  169. package/src/hmr/client/module-update.d.ts +13 -0
  170. package/src/hmr/client/module-update.js +39 -0
  171. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  172. package/src/hmr/hmr-asset-paths.js +22 -0
  173. package/src/hmr/hmr-entrypoint-output.d.ts +11 -39
  174. package/src/hmr/hmr-entrypoint-output.js +28 -54
  175. package/src/hmr/hmr-file-change-prep.js +13 -16
  176. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  177. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  178. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  179. package/src/hmr/hmr-runtime-paths.js +13 -0
  180. package/src/hmr/hmr-strategy.d.ts +5 -11
  181. package/src/hmr/hmr-strategy.js +113 -61
  182. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  183. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -95
  184. package/src/hmr/strategies/js-hmr-strategy.js +104 -217
  185. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +33 -27
  186. package/src/index.browser.js +1 -4
  187. package/src/index.d.ts +1 -0
  188. package/src/index.js +6 -47
  189. package/src/integrations/ghtml/ghtml-renderer.js +12 -7
  190. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  191. package/src/integrations/ghtml/ghtml.plugin.js +9 -12
  192. package/src/islands/README.md +25 -0
  193. package/src/islands/island-host.d.ts +37 -0
  194. package/src/islands/island-host.js +55 -0
  195. package/src/plugins/alias-resolver-cache.js +114 -97
  196. package/src/plugins/alias-resolver-plugin.js +33 -47
  197. package/src/plugins/define-integration.js +18 -17
  198. package/src/plugins/eco-component-meta-plugin.js +387 -145
  199. package/src/plugins/foreign-jsx-override-plugin.js +49 -35
  200. package/src/plugins/integration-plugin.js +212 -203
  201. package/src/plugins/jsx-import-source.utils.js +16 -21
  202. package/src/plugins/processor.js +159 -149
  203. package/src/plugins/runtime-capability.js +1 -0
  204. package/src/plugins/source-transform.js +109 -79
  205. package/src/plugins/tsconfig-import-resolver.d.ts +17 -0
  206. package/src/plugins/tsconfig-import-resolver.js +218 -142
  207. package/src/route-renderer/README.md +12 -1
  208. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +143 -136
  209. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +33 -27
  210. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +173 -126
  211. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +165 -154
  212. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +329 -341
  213. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +33 -32
  214. package/src/route-renderer/orchestration/integration-renderer.d.ts +1 -0
  215. package/src/route-renderer/orchestration/integration-renderer.js +731 -750
  216. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +168 -172
  217. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +119 -131
  218. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +82 -91
  219. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +82 -76
  220. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +29 -31
  221. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +10 -6
  222. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +31 -28
  223. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +3 -0
  224. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +430 -413
  225. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +191 -212
  226. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +20 -24
  227. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +4 -0
  228. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +24 -24
  229. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +22 -24
  230. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +41 -34
  231. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +5 -0
  232. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +42 -22
  233. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +50 -48
  234. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +29 -32
  235. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +150 -156
  236. package/src/route-renderer/orchestration/string-markup-renderer.js +48 -51
  237. package/src/route-renderer/page-loading/component-dependency-collection.js +120 -124
  238. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  239. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  240. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +68 -54
  241. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  242. package/src/route-renderer/page-loading/lazy-trigger-planning.js +46 -36
  243. package/src/route-renderer/page-loading/module-declaration-aggregation.js +38 -31
  244. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  245. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  246. package/src/route-renderer/page-loading/page-module-loader.js +130 -124
  247. package/src/route-renderer/route-renderer.js +74 -76
  248. package/src/router/client/link-intent.js +55 -39
  249. package/src/router/client/link-intent.test.browser.js +49 -49
  250. package/src/router/client/link-navigation-policy.js +114 -93
  251. package/src/router/client/link-navigation-policy.test.browser.js +70 -80
  252. package/src/router/client/navigation-coordinator.js +235 -211
  253. package/src/router/server/route-registry.js +237 -242
  254. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
  255. package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
  256. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  257. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  258. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  259. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
  260. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
  261. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
  262. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
  263. package/src/services/assets/asset-processing-service/index.js +8 -8
  264. package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
  265. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
  266. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  267. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  268. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  269. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  270. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
  271. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  272. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
  273. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
  274. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  275. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
  276. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
  277. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
  278. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
  279. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
  280. package/src/services/assets/browser-bundle.service.js +52 -47
  281. package/src/services/cache/cache.types.js +5 -0
  282. package/src/services/cache/index.js +6 -7
  283. package/src/services/cache/memory-cache-store.js +101 -89
  284. package/src/services/cache/page-cache-service.js +156 -145
  285. package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
  286. package/src/services/html/html-rewriter-provider.service.js +61 -61
  287. package/src/services/html/html-transformer.service.js +249 -266
  288. package/src/services/invalidation/development-invalidation.service.js +252 -241
  289. package/src/services/module-loading/app-module-loader.service.js +1 -0
  290. package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
  291. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  292. package/src/services/module-loading/module-loading-types.js +1 -0
  293. package/src/services/module-loading/page-module-import.service.js +235 -243
  294. package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
  295. package/src/services/module-loading/route-module-build-cache.js +3 -38
  296. package/src/services/module-loading/route-module-build-cache.store.js +195 -200
  297. package/src/services/module-loading/route-module-build-manifest.js +61 -74
  298. package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
  299. package/src/services/module-loading/server-module-transpiler.service.js +68 -62
  300. package/src/services/module-loading/source-module-support.js +15 -7
  301. package/src/services/runtime-state/dev-graph.service.js +165 -157
  302. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  303. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  304. package/src/services/validation/schema-validation-service.js +157 -95
  305. package/src/services/validation/standard-schema.types.js +1 -0
  306. package/src/services/validation/validate-standard-schema.js +13 -13
  307. package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
  308. package/src/static-site-generator/sitemap-routes.js +33 -28
  309. package/src/static-site-generator/sitemap.js +38 -29
  310. package/src/static-site-generator/static-build-invalidation.js +34 -56
  311. package/src/static-site-generator/static-export-context.js +1 -0
  312. package/src/static-site-generator/static-site-generator.js +517 -553
  313. package/src/types/internal-types.d.ts +19 -3
  314. package/src/types/internal-types.js +1 -0
  315. package/src/types/public-types.d.ts +16 -46
  316. package/src/types/public-types.js +1 -0
  317. package/src/utils/deep-merge.js +39 -26
  318. package/src/utils/ecopages-route-info.js +27 -23
  319. package/src/utils/hash.js +3 -6
  320. package/src/utils/html-escaping.js +21 -8
  321. package/src/utils/html.js +1 -4
  322. package/src/utils/invariant.js +11 -10
  323. package/src/utils/locals-utils.js +32 -22
  324. package/src/utils/parse-cli-args.js +73 -65
  325. package/src/utils/path-pattern.js +38 -23
  326. package/src/utils/path-utils.module.js +8 -11
  327. package/src/utils/resolve-entry-file.js +70 -38
  328. package/src/utils/resolve-work-dir.js +23 -27
  329. package/src/utils/runtime.js +24 -33
  330. package/src/utils/server-utils.module.js +60 -52
  331. package/src/utils/static-file-extensions.js +52 -46
  332. package/src/watchers/project-watcher-ignore.js +16 -15
  333. package/src/watchers/project-watcher.js +385 -366
  334. package/src/watchers/project-watcher.test-helpers.js +45 -50
  335. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
  336. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
  337. package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
  338. package/src/build/cache/dev-browser-script-cache.js +0 -90
@@ -1,271 +1,262 @@
1
- import { appLogger } from "../../global/app-logger.js";
2
- import {
3
- getAppModuleLoader,
4
- setAppHostModuleLoader
5
- } from "../../services/module-loading/app-server-module-transpiler.service.js";
6
- import { getHostModuleLoader } from "../../services/module-loading/host-module-loader-registry.js";
7
- import { invariant } from "../../utils/invariant.js";
8
- import { fileSystem } from "@ecopages/file-system";
9
- import {
10
- formatRuntimeServerStartedMessage
11
- } from "../../dev/runtime-server-started-message.js";
12
- import { parseCliArgs } from "../../utils/parse-cli-args.js";
13
- import { startupTrace } from "../../diagnostics/startup-trace.js";
14
- class AbstractApplicationAdapter {
15
- appConfig;
16
- serverOptions;
17
- cliArgs;
18
- runtimeOptions;
19
- apiHandlers = [];
20
- staticRoutes = [];
21
- errorHandler;
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;
31
- this.appConfig = options.appConfig;
32
- this.serverOptions = options.serverOptions || {};
33
- this.runtimeOptions = options.runtime ?? {};
34
- if (options.runtime) {
35
- this.appConfig.runtime = {
36
- ...this.appConfig.runtime ?? {},
37
- ...options.runtime
38
- };
1
+ /**
2
+ * This file defines the abstract class for application adapters in EcoPages.
3
+ * It provides a common interface for different runtimes (e.g., Node.js, Deno) to implement.
4
+ * The class includes methods for handling HTTP requests and managing application state.
5
+ * It also includes a method for parsing command-line arguments.
6
+ *
7
+ * @module ApplicationAdapter
8
+ */
9
+ import { appLogger } from '../../global/app-logger.js';
10
+ import { getAppModuleLoader, setAppHostModuleLoader, } from '../../services/module-loading/app-server-module-transpiler.service.js';
11
+ import { getHostModuleLoader } from '../../services/module-loading/host-module-loader-registry.js';
12
+ import { invariant } from '../../utils/invariant.js';
13
+ import { fileSystem } from '@ecopages/file-system';
14
+ import { formatRuntimeServerStartedMessage, } from '../../dev/runtime-server-started-message.js';
15
+ import { parseCliArgs } from '../../utils/parse-cli-args.js';
16
+ import { startupTrace } from '../../diagnostics/startup-trace.js';
17
+ /**
18
+ * Abstract base class for application adapters across different runtimes
19
+ */
20
+ export class AbstractApplicationAdapter {
21
+ appConfig;
22
+ serverOptions;
23
+ cliArgs;
24
+ runtimeOptions;
25
+ apiHandlers = [];
26
+ staticRoutes = [];
27
+ errorHandler;
28
+ /**
29
+ * App-level WebSocket handlers keyed by URL path pattern (e.g. '/ws/chat/:id').
30
+ * Both Bun and Node adapters read this map to register upgrade routes.
31
+ */
32
+ websocketHandlers = new Map();
33
+ onAppStartCallback;
34
+ runtimeLabel;
35
+ constructor(options, runtimeLabel) {
36
+ this.runtimeLabel = runtimeLabel;
37
+ this.appConfig = options.appConfig;
38
+ this.serverOptions = options.serverOptions || {};
39
+ this.runtimeOptions = options.runtime ?? {};
40
+ if (options.runtime) {
41
+ this.appConfig.runtime = {
42
+ ...(this.appConfig.runtime ?? {}),
43
+ ...options.runtime,
44
+ };
45
+ }
46
+ this.cliArgs = parseCliArgs({ embeddedRuntime: this.runtimeOptions.embedded });
47
+ const hostModuleLoader = this.runtimeOptions.hostModuleLoader ?? (this.runtimeOptions.embedded ? getHostModuleLoader() : undefined);
48
+ if (hostModuleLoader) {
49
+ setAppHostModuleLoader(this.appConfig, hostModuleLoader);
50
+ }
51
+ getAppModuleLoader(this.appConfig);
52
+ startupTrace.markConfigReady();
53
+ if (options.clearOutput) {
54
+ this.clearDistFolder().catch((error) => {
55
+ appLogger.error('Error clearing dist folder', error);
56
+ });
57
+ }
39
58
  }
40
- this.cliArgs = parseCliArgs({ embeddedRuntime: this.runtimeOptions.embedded });
41
- const hostModuleLoader = this.runtimeOptions.hostModuleLoader ?? (this.runtimeOptions.embedded ? getHostModuleLoader() : void 0);
42
- if (hostModuleLoader) {
43
- setAppHostModuleLoader(this.appConfig, hostModuleLoader);
59
+ async clearDistFolder() {
60
+ const distPath = this.appConfig.absolutePaths.distDir;
61
+ const distExists = fileSystem.exists(distPath);
62
+ if (!distExists)
63
+ return;
64
+ try {
65
+ await fileSystem.removeAsync(distPath);
66
+ appLogger.debug(`Cleared dist folder: ${distPath}`);
67
+ }
68
+ catch (error) {
69
+ appLogger.error(`Error clearing dist folder: ${distPath}`, error);
70
+ }
44
71
  }
45
- getAppModuleLoader(this.appConfig);
46
- startupTrace.markConfigReady();
47
- if (options.clearOutput) {
48
- this.clearDistFolder().catch((error) => {
49
- appLogger.error("Error clearing dist folder", error);
50
- });
72
+ /**
73
+ * Internal method to add route handlers to the API handlers array
74
+ */
75
+ addRouteHandler(path, method, handler, middleware, schema) {
76
+ invariant(typeof path === 'string', `Invalid route path for ${method}: expected a string path starting with "/" but received ${Object.prototype.toString.call(path)}. If you're passing a prebuilt ApiHandler, use app.add(handler).`);
77
+ invariant(path.startsWith('/'), `Invalid route path for ${method}: "${path}". Route paths must start with '/'.`);
78
+ this.apiHandlers.push({
79
+ path,
80
+ method,
81
+ handler: handler,
82
+ middleware: middleware,
83
+ schema,
84
+ });
85
+ return this;
51
86
  }
52
- }
53
- async clearDistFolder() {
54
- const distPath = this.appConfig.absolutePaths.distDir;
55
- const distExists = fileSystem.exists(distPath);
56
- if (!distExists) return;
57
- try {
58
- await fileSystem.removeAsync(distPath);
59
- appLogger.debug(`Cleared dist folder: ${distPath}`);
60
- } catch (error) {
61
- appLogger.error(`Error clearing dist folder: ${distPath}`, error);
87
+ /**
88
+ * Get all registered API handlers
89
+ */
90
+ getApiHandlers() {
91
+ return this.apiHandlers;
62
92
  }
63
- }
64
- /**
65
- * Internal method to add route handlers to the API handlers array
66
- */
67
- addRouteHandler(path, method, handler, middleware, schema) {
68
- invariant(
69
- typeof path === "string",
70
- `Invalid route path for ${method}: expected a string path starting with "/" but received ${Object.prototype.toString.call(path)}. If you're passing a prebuilt ApiHandler, use app.add(handler).`
71
- );
72
- invariant(
73
- path.startsWith("/"),
74
- `Invalid route path for ${method}: "${path}". Route paths must start with '/'.`
75
- );
76
- this.apiHandlers.push({
77
- path,
78
- method,
79
- handler,
80
- middleware,
81
- schema
82
- });
83
- return this;
84
- }
85
- /**
86
- * Get all registered API handlers
87
- */
88
- getApiHandlers() {
89
- return this.apiHandlers;
90
- }
91
- /**
92
- * Register a view for static generation at build time.
93
- * The view must have staticPaths defined for dynamic routes.
94
- *
95
- * Uses a loader function to enable HMR in development.
96
- *
97
- * @param path - URL path pattern (e.g., '/posts/:slug')
98
- * @param loader - A function that dynamically imports the eco.page view module
99
- * @example
100
- * ```typescript
101
- * app.static('/login', () => import('./src/views/login.kita'))
102
- * app.static('/posts/:slug', () => import('./src/views/post-view.kita'))
103
- * ```
104
- */
105
- static(path, loader) {
106
- this.staticRoutes.push({ path, loader });
107
- return this;
108
- }
109
- /**
110
- * Get all registered static routes
111
- */
112
- getStaticRoutes() {
113
- return this.staticRoutes;
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
- }
93
+ /**
94
+ * Register a view for static generation at build time.
95
+ * The view must have staticPaths defined for dynamic routes.
96
+ *
97
+ * Uses a loader function to enable HMR in development.
98
+ *
99
+ * @param path - URL path pattern (e.g., '/posts/:slug')
100
+ * @param loader - A function that dynamically imports the eco.page view module
101
+ * @example
102
+ * ```typescript
103
+ * app.static('/login', () => import('./src/views/login.kita'))
104
+ * app.static('/posts/:slug', () => import('./src/views/post-view.kita'))
105
+ * ```
106
+ */
107
+ static(path, loader) {
108
+ this.staticRoutes.push({ path, loader });
109
+ return this;
168
110
  }
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
- }
180
- /**
181
- * Register a global error handler for all routes.
182
- * Useful for logging, monitoring integration, and custom error formatting.
183
- *
184
- * @example
185
- * ```typescript
186
- * app.onError(async (error, ctx) => {
187
- * logger.error(error);
188
- * return ctx.response.status(500).json({ error: 'Something went wrong' });
189
- * });
190
- * ```
191
- */
192
- onError(handler) {
193
- this.errorHandler = handler;
194
- return this;
195
- }
196
- /**
197
- * Get the registered error handler
198
- */
199
- getErrorHandler() {
200
- return this.errorHandler;
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;
111
+ /**
112
+ * Get all registered static routes
113
+ */
114
+ getStaticRoutes() {
115
+ return this.staticRoutes;
209
116
  }
210
- if (this.runtimeOptions.embedded) {
211
- return;
117
+ /**
118
+ * Register a WebSocket handler for the given path pattern.
119
+ *
120
+ * The runtime adapter handles the HTTP→WebSocket upgrade for this path
121
+ * and routes lifecycle events to `handler`.
122
+ *
123
+ * Supports dynamic segments via `:param` syntax. The handler receives
124
+ * typed `params` and `search` fields, and a typed `context` produced by
125
+ * the optional `context()` factory.
126
+ *
127
+ * One pattern registration matches infinite path variations. For example,
128
+ * `app.websocket('/ws/chat/:roomId', handler)` matches `/ws/chat/abc`,
129
+ * `/ws/chat/xyz`, etc. Each connection receives its own `params.roomId`.
130
+ *
131
+ * Works across both Bun and Node runtimes — no runtime-specific imports needed.
132
+ *
133
+ * @example
134
+ * ```typescript
135
+ * app.websocket<ChatContext, { roomId: string }>('/ws/chat/:roomId', {
136
+ * async context({ params, search }) {
137
+ * return { username: search.username ?? 'anonymous', roomId: params.roomId };
138
+ * },
139
+ * onConnect(socket) {
140
+ * socket.send(`Welcome to room ${socket.context.roomId}`);
141
+ * },
142
+ * onMessage(socket, message) {
143
+ * if (message.kind === 'text') {
144
+ * socket.send(message.text);
145
+ * }
146
+ * },
147
+ * });
148
+ * ```
149
+ */
150
+ websocket(path, handler) {
151
+ invariant(typeof path === 'string' && path.startsWith('/'), `app.websocket(): path must be a string starting with "/", got "${path}".`);
152
+ /**
153
+ * Validate the pattern at registration time. Reject empty segments
154
+ * and duplicate param names early.
155
+ */
156
+ const segments = path.split('/').filter(Boolean);
157
+ const paramNames = new Set();
158
+ for (const segment of segments) {
159
+ if (segment.startsWith(':')) {
160
+ const paramName = segment.slice(1);
161
+ invariant(paramName.length > 0, `app.websocket(): invalid pattern "${path}" — empty param name in segment ":${paramName}".`);
162
+ invariant(!paramNames.has(paramName), `app.websocket(): invalid pattern "${path}" — duplicate param name ":${paramName}".`);
163
+ paramNames.add(paramName);
164
+ }
165
+ }
166
+ this.websocketHandlers.set(path, handler);
167
+ return this;
212
168
  }
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;
169
+ /**
170
+ * Get the registered WebSocket handlers map.
171
+ *
172
+ * @returns The map of WebSocket route patterns to handlers
173
+ */
174
+ getWebsocketHandlers() {
175
+ return this.websocketHandlers;
230
176
  }
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
- );
177
+ /**
178
+ * Register a global error handler for all routes.
179
+ * Useful for logging, monitoring integration, and custom error formatting.
180
+ *
181
+ * @example
182
+ * ```typescript
183
+ * app.onError(async (error, ctx) => {
184
+ * logger.error(error);
185
+ * return ctx.response.status(500).json({ error: 'Something went wrong' });
186
+ * });
187
+ * ```
188
+ */
189
+ onError(handler) {
190
+ this.errorHandler = handler;
191
+ return this;
192
+ }
193
+ /**
194
+ * Get the registered error handler
195
+ */
196
+ getErrorHandler() {
197
+ return this.errorHandler;
198
+ }
199
+ /**
200
+ * Boot the server. When `onAppStart` is passed, it runs once the runtime can take traffic.
201
+ * Embedded apps only register the callback — the host (for example Vite) boots the port.
202
+ */
203
+ async start(onAppStart) {
204
+ if (onAppStart) {
205
+ this.onAppStartCallback = onAppStart;
206
+ }
207
+ if (this.runtimeOptions.embedded) {
208
+ return;
209
+ }
210
+ return this.bootServer();
211
+ }
212
+ logServerStarted(origin) {
213
+ appLogger.info(formatRuntimeServerStartedMessage(this.runtimeLabel, origin));
214
+ }
215
+ /**
216
+ * Invoked by embedded hosts (for example Vite) once the app can take traffic.
217
+ */
218
+ async handleListening(origin) {
219
+ await this.notifyListening(origin);
220
+ }
221
+ async notifyListening(origin) {
222
+ const normalizedOrigin = origin.replace(/\/$/, '');
223
+ startupTrace.markServerListening();
224
+ if (!this.onAppStartCallback) {
225
+ this.logServerStarted(normalizedOrigin);
226
+ return;
227
+ }
228
+ await this.invokeAppStartCallback(normalizedOrigin);
229
+ }
230
+ /**
231
+ * Resolves routes exposed on {@link AppStartInfo}.
232
+ *
233
+ * @remarks
234
+ * Default is empty. Runtime adapters override this to read from the
235
+ * initialized server route registry.
236
+ */
237
+ async resolveAppRoutes() {
238
+ return [];
239
+ }
240
+ async invokeAppStartCallback(origin) {
241
+ let routes = [];
242
+ try {
243
+ routes = await this.resolveAppRoutes();
244
+ }
245
+ catch (error) {
246
+ appLogger.debug('Failed to resolve app start routes; continuing with empty routes', error instanceof Error ? error.message : String(error));
247
+ }
248
+ this.onAppStartCallback?.({ origin, routes });
249
+ }
250
+ /**
251
+ * Stops the application server and releases runtime resources.
252
+ *
253
+ * @remarks
254
+ * Subclasses override this to shut down bound servers, watchers, and other
255
+ * dev-time resources. The default implementation is a no-op so embedded
256
+ * adapters that never call `start()` can still be used with `await using`.
257
+ */
258
+ async stop(_force = true) { }
259
+ async [Symbol.asyncDispose]() {
260
+ await this.stop(true);
252
261
  }
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
- }
268
262
  }
269
- export {
270
- AbstractApplicationAdapter
271
- };
@@ -1,5 +1,13 @@
1
- class AbstractRouterAdapter {
1
+ /**
2
+ * This file contains the abstract router adapter class and its methods.
3
+ * It is designed to be extended by specific router adapters for different runtimes.
4
+ * The class provides methods for converting paths, creating route handlers,
5
+ * and adapting routes to the expected format of the runtime.
6
+ *
7
+ * @module RouterAdapter
8
+ */
9
+ /**
10
+ * Abstract base class for router adapters across different runtimes
11
+ */
12
+ export class AbstractRouterAdapter {
2
13
  }
3
- export {
4
- AbstractRouterAdapter
5
- };