@ecopages/core 0.2.0-beta.31 → 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,84 +1,99 @@
1
- import { fileURLToPath } from "node:url";
2
- import { invariant } from "../../../utils/invariant.js";
3
- import { createBodyResponse } from "../http/create-body-response.js";
1
+ import { fileURLToPath } from 'node:url';
2
+ import { invariant } from '../../../utils/invariant.js';
3
+ import { createBodyResponse } from '../http/create-body-response.js';
4
4
  function resolveServerModulePath(filePath) {
5
- return filePath instanceof URL ? fileURLToPath(filePath) : filePath;
5
+ return filePath instanceof URL ? fileURLToPath(filePath) : filePath;
6
6
  }
7
+ /**
8
+ * Merges request locals into component props as a dedicated 'locals' property.
9
+ * This prevents naming conflicts and maintains type safety by keeping locals
10
+ * separate from other props.
11
+ *
12
+ * @param props - The original component props
13
+ * @param locals - Optional request-scoped locals from middleware
14
+ * @returns Props with locals merged in, or original props if no locals provided
15
+ */
7
16
  function mergePropsWithLocals(props, locals) {
8
- if (!locals || typeof props !== "object" || props === null) {
9
- return props;
10
- }
11
- return { ...props, locals };
12
- }
13
- function createRenderContext(options) {
14
- const { integrations } = options;
15
- const getRendererForView = (view) => {
16
- const integrationName = view.config?.integration ?? view.config?.__eco?.integration;
17
- invariant(
18
- !!integrationName,
19
- "Cannot determine integration for view. Set view.config.integration explicitly or ensure the view is defined with eco.page() in a file with a recognized extension."
20
- );
21
- const integration = integrations.find((i) => i.name === integrationName);
22
- invariant(!!integration, `No integration found for: ${integrationName}`);
23
- return integration.initializeRenderer({
24
- rendererModules: options.rendererModules
25
- });
26
- };
27
- const renderContext = {
28
- importServerModule: async (filePath) => {
29
- invariant(!!options.importServerModule, "Server module importing is not available in this render context.");
30
- return await options.importServerModule(resolveServerModulePath(filePath));
31
- },
32
- async renderServerModule(filePath, props, renderOptions) {
33
- const module = await renderContext.importServerModule(filePath);
34
- const view = module.default;
35
- const locals = this?.locals;
36
- const mergedProps = mergePropsWithLocals(props ?? {}, locals);
37
- const renderer = getRendererForView(view);
38
- const ctx = {
39
- partial: false,
40
- status: renderOptions?.status,
41
- headers: renderOptions?.headers
42
- };
43
- return await renderer.renderToResponse(view, mergedProps, ctx);
44
- },
45
- async render(view, props, renderOptions) {
46
- const locals = this?.locals;
47
- const mergedProps = mergePropsWithLocals(props ?? {}, locals);
48
- const renderer = getRendererForView(view);
49
- const ctx = {
50
- partial: false,
51
- status: renderOptions?.status,
52
- headers: renderOptions?.headers
53
- };
54
- return renderer.renderToResponse(view, mergedProps, ctx);
55
- },
56
- async renderPartial(view, props, renderOptions) {
57
- const locals = this?.locals;
58
- const mergedProps = mergePropsWithLocals(props, locals);
59
- const renderer = getRendererForView(view);
60
- const ctx = {
61
- partial: true,
62
- status: renderOptions?.status,
63
- headers: renderOptions?.headers
64
- };
65
- return renderer.renderToResponse(view, mergedProps, ctx);
66
- },
67
- json(data, responseOptions) {
68
- return createBodyResponse("json", data, {
69
- status: responseOptions?.status,
70
- headers: responseOptions?.headers
71
- });
72
- },
73
- html(content, responseOptions) {
74
- return createBodyResponse("html", content, {
75
- status: responseOptions?.status,
76
- headers: responseOptions?.headers
77
- });
17
+ if (!locals || typeof props !== 'object' || props === null) {
18
+ return props;
78
19
  }
79
- };
80
- return renderContext;
20
+ return { ...props, locals };
21
+ }
22
+ /**
23
+ * Creates a render context for route handlers.
24
+ * Provides render(), renderPartial(), json(), and html() methods that can be used
25
+ * within route handlers to generate responses.
26
+ *
27
+ * @param options - Configuration options including available integrations
28
+ * @returns A RenderContext object with methods for rendering views and creating responses
29
+ */
30
+ export function createRenderContext(options) {
31
+ const { integrations } = options;
32
+ /**
33
+ * Resolves the appropriate renderer for a given view component based on its integration.
34
+ * Throws an error if the integration cannot be determined or is not found.
35
+ */
36
+ const getRendererForView = (view) => {
37
+ const integrationName = view.config?.integration ?? view.config?.__eco?.integration;
38
+ invariant(!!integrationName, 'Cannot determine integration for view. Set view.config.integration explicitly or ensure the view is defined with eco.page() in a file with a recognized extension.');
39
+ const integration = integrations.find((i) => i.name === integrationName);
40
+ invariant(!!integration, `No integration found for: ${integrationName}`);
41
+ return integration.initializeRenderer({
42
+ rendererModules: options.rendererModules,
43
+ });
44
+ };
45
+ const renderContext = {
46
+ importServerModule: async (filePath) => {
47
+ invariant(!!options.importServerModule, 'Server module importing is not available in this render context.');
48
+ return (await options.importServerModule(resolveServerModulePath(filePath)));
49
+ },
50
+ async renderServerModule(filePath, props, renderOptions) {
51
+ const module = await renderContext.importServerModule(filePath);
52
+ const view = module.default;
53
+ const locals = this?.locals;
54
+ const mergedProps = mergePropsWithLocals(props ?? {}, locals);
55
+ const renderer = getRendererForView(view);
56
+ const ctx = {
57
+ partial: false,
58
+ status: renderOptions?.status,
59
+ headers: renderOptions?.headers,
60
+ };
61
+ return await renderer.renderToResponse(view, mergedProps, ctx);
62
+ },
63
+ async render(view, props, renderOptions) {
64
+ const locals = this?.locals;
65
+ const mergedProps = mergePropsWithLocals(props ?? {}, locals);
66
+ const renderer = getRendererForView(view);
67
+ const ctx = {
68
+ partial: false,
69
+ status: renderOptions?.status,
70
+ headers: renderOptions?.headers,
71
+ };
72
+ return renderer.renderToResponse(view, mergedProps, ctx);
73
+ },
74
+ async renderPartial(view, props, renderOptions) {
75
+ const locals = this?.locals;
76
+ const mergedProps = mergePropsWithLocals(props, locals);
77
+ const renderer = getRendererForView(view);
78
+ const ctx = {
79
+ partial: true,
80
+ status: renderOptions?.status,
81
+ headers: renderOptions?.headers,
82
+ };
83
+ return renderer.renderToResponse(view, mergedProps, ctx);
84
+ },
85
+ json(data, responseOptions) {
86
+ return createBodyResponse('json', data, {
87
+ status: responseOptions?.status,
88
+ headers: responseOptions?.headers,
89
+ });
90
+ },
91
+ html(content, responseOptions) {
92
+ return createBodyResponse('html', content, {
93
+ status: responseOptions?.status,
94
+ headers: responseOptions?.headers,
95
+ });
96
+ },
97
+ };
98
+ return renderContext;
81
99
  }
82
- export {
83
- createRenderContext
84
- };
@@ -1,43 +1,38 @@
1
- import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../../config/constants.js";
1
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from '../../../config/constants.js';
2
2
  function normalizeOriginHostname(hostname) {
3
- if (hostname.includes(":") && !hostname.startsWith("[") && !hostname.endsWith("]")) {
4
- return `[${hostname}]`;
5
- }
6
- return hostname;
3
+ if (hostname.includes(':') && !hostname.startsWith('[') && !hostname.endsWith(']')) {
4
+ return `[${hostname}]`;
5
+ }
6
+ return hostname;
7
7
  }
8
- function resolveServeRuntimeOrigin(serveOptions) {
9
- const hostname = normalizeOriginHostname(String(serveOptions.hostname ?? DEFAULT_ECOPAGES_HOSTNAME));
10
- const port = Number(serveOptions.port ?? DEFAULT_ECOPAGES_PORT);
11
- return `http://${hostname}:${port}`;
8
+ export function resolveServeRuntimeOrigin(serveOptions) {
9
+ const hostname = normalizeOriginHostname(String(serveOptions.hostname ?? DEFAULT_ECOPAGES_HOSTNAME));
10
+ const port = Number(serveOptions.port ?? DEFAULT_ECOPAGES_PORT);
11
+ return `http://${hostname}:${port}`;
12
12
  }
13
- function resolveRuntimeBinding(options) {
14
- const env = options.env ?? process.env;
15
- const portExplicitlyConfigured = options.cliArgs.port !== void 0 || Boolean(env.ECOPAGES_PORT) || options.serverOptions?.port !== void 0;
16
- const preferredPort = options.cliArgs.port ?? (env.ECOPAGES_PORT ? Number(env.ECOPAGES_PORT) : void 0) ?? DEFAULT_ECOPAGES_PORT;
17
- const preferredHostname = options.cliArgs.hostname ?? env.ECOPAGES_HOSTNAME ?? DEFAULT_ECOPAGES_HOSTNAME;
18
- return {
19
- preferredPort,
20
- preferredHostname,
21
- allowPortFallback: !portExplicitlyConfigured,
22
- runtimeOrigin: resolveServeRuntimeOrigin({
23
- hostname: preferredHostname,
24
- port: preferredPort
25
- }),
26
- serveOptions: {
27
- port: preferredPort,
28
- hostname: preferredHostname,
29
- ...options.serverOptions ?? {}
30
- },
31
- watch: options.cliArgs.dev
32
- };
13
+ export function resolveRuntimeBinding(options) {
14
+ const env = options.env ?? process.env;
15
+ const portExplicitlyConfigured = options.cliArgs.port !== undefined || Boolean(env.ECOPAGES_PORT) || options.serverOptions?.port !== undefined;
16
+ const preferredPort = options.cliArgs.port ?? (env.ECOPAGES_PORT ? Number(env.ECOPAGES_PORT) : undefined) ?? DEFAULT_ECOPAGES_PORT;
17
+ const preferredHostname = options.cliArgs.hostname ?? env.ECOPAGES_HOSTNAME ?? DEFAULT_ECOPAGES_HOSTNAME;
18
+ return {
19
+ preferredPort,
20
+ preferredHostname,
21
+ allowPortFallback: !portExplicitlyConfigured,
22
+ runtimeOrigin: resolveServeRuntimeOrigin({
23
+ hostname: preferredHostname,
24
+ port: preferredPort,
25
+ }),
26
+ serveOptions: {
27
+ port: preferredPort,
28
+ hostname: preferredHostname,
29
+ ...(options.serverOptions ?? {}),
30
+ },
31
+ watch: options.cliArgs.dev,
32
+ };
33
33
  }
34
- function resolveStaticRuntimeMode(options) {
35
- return {
36
- canBuildWithoutRuntimeServer: options.cliArgs.build || options.cliArgs.preview
37
- };
34
+ export function resolveStaticRuntimeMode(options) {
35
+ return {
36
+ canBuildWithoutRuntimeServer: options.cliArgs.build || options.cliArgs.preview,
37
+ };
38
38
  }
39
- export {
40
- resolveRuntimeBinding,
41
- resolveServeRuntimeOrigin,
42
- resolveStaticRuntimeMode
43
- };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,4 @@
1
- import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
2
- import type { IHmrManager } from '../../../types/public-types.js';
1
+ import type { EcoPagesAppConfig, IHmrManager } from '../../../types/internal-types.js';
3
2
  import type { ProjectWatcher } from '../../../watchers/project-watcher.js';
4
3
  /**
5
4
  * Copies source `public/` into dist and ensures the resolved assets directory exists.
@@ -21,7 +20,7 @@ export declare function attachHmrToIntegrations(appConfig: EcoPagesAppConfig, hm
21
20
  * coalesced {@link ensureIntegrationRuntimeReady} promise instead of paying a cold vendor build.
22
21
  * Failures are logged and do not crash the server.
23
22
  */
24
- export declare function startConfiguredIntegrationRuntimePrewarm(options: {
23
+ export declare function startDevWarmup(options: {
25
24
  appConfig: EcoPagesAppConfig;
26
25
  runtimeOrigin: string;
27
26
  }): void;
@@ -1,57 +1,71 @@
1
- import path from "node:path";
2
- import { fileSystem } from "@ecopages/file-system";
3
- import { RESOLVED_ASSETS_DIR } from "../../../config/constants.js";
4
- import { disposeAppBuildRuntime } from "../../../build/runtime/build-runtime.js";
5
- import { ensureIntegrationRuntimeReady } from "../../../build/app-build-manifest-runtime.js";
6
- import { appLogger } from "../../../global/app-logger.js";
7
- import { copyRuntimePublicDirIfChanged } from "./copy-runtime-public-dir.js";
8
- import { clearAppDevClientBridge } from "../../../dev/client-bridge-registry.js";
9
- import { clearAppHmrManager } from "../../../dev/hmr-manager-registry.js";
10
- function prepareRuntimePublicDir(appConfig) {
11
- const srcPublicDir = path.join(appConfig.rootDir, appConfig.srcDir, appConfig.publicDir);
12
- if (fileSystem.exists(srcPublicDir)) {
13
- copyRuntimePublicDirIfChanged(srcPublicDir, path.join(appConfig.rootDir, appConfig.distDir));
14
- }
15
- fileSystem.ensureDir(path.join(appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
1
+ import path from 'node:path';
2
+ import { fileSystem } from '@ecopages/file-system';
3
+ import { RESOLVED_ASSETS_DIR } from '../../../config/constants.js';
4
+ import { disposeAppBuildRuntime } from '../../../build/runtime/build-runtime.js';
5
+ import { ensureIntegrationRuntimeReady } from '../../../build/app-build-manifest-runtime.js';
6
+ import { appLogger } from '../../../global/app-logger.js';
7
+ import { copyRuntimePublicDirIfChanged } from './copy-runtime-public-dir.js';
8
+ import { clearAppDevClientBridge } from '../../../dev/client-bridge-registry.js';
9
+ import { clearAppHmrManager } from '../../../dev/hmr-manager-registry.js';
10
+ /**
11
+ * Copies source `public/` into dist and ensures the resolved assets directory exists.
12
+ */
13
+ export function prepareRuntimePublicDir(appConfig) {
14
+ const srcPublicDir = path.join(appConfig.rootDir, appConfig.srcDir, appConfig.publicDir);
15
+ if (fileSystem.exists(srcPublicDir)) {
16
+ copyRuntimePublicDirIfChanged(srcPublicDir, path.join(appConfig.rootDir, appConfig.distDir));
17
+ }
18
+ fileSystem.ensureDir(path.join(appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
16
19
  }
17
- const attachedHmrApps = /* @__PURE__ */ new WeakSet();
18
- function attachHmrToIntegrations(appConfig, hmrManager) {
19
- if (attachedHmrApps.has(appConfig)) {
20
- return;
21
- }
22
- attachedHmrApps.add(appConfig);
23
- for (const integration of appConfig.integrations) {
24
- integration.setHmrManager(hmrManager);
25
- }
20
+ const attachedHmrApps = new WeakSet();
21
+ /**
22
+ * Attaches the shared HMR manager to every integration exactly once per app config.
23
+ *
24
+ * @remarks
25
+ * Runtime plugin setup must not call `integration.setHmrManager()` directly. Adapters invoke
26
+ * this after the manager is enabled so late plugin init cannot double-bind integrations.
27
+ */
28
+ export function attachHmrToIntegrations(appConfig, hmrManager) {
29
+ if (attachedHmrApps.has(appConfig)) {
30
+ return;
31
+ }
32
+ attachedHmrApps.add(appConfig);
33
+ for (const integration of appConfig.integrations) {
34
+ integration.setHmrManager(hmrManager);
35
+ }
26
36
  }
27
- function startConfiguredIntegrationRuntimePrewarm(options) {
28
- const { appConfig, runtimeOrigin } = options;
29
- void Promise.all(
30
- appConfig.integrations.map(
31
- (integration) => ensureIntegrationRuntimeReady({
37
+ /**
38
+ * Starts background activation of every configured integration after watch-mode HMR is ready.
39
+ *
40
+ * @remarks
41
+ * Fire-and-forget: overlaps with watcher setup so first-page render can join the same
42
+ * coalesced {@link ensureIntegrationRuntimeReady} promise instead of paying a cold vendor build.
43
+ * Failures are logged and do not crash the server.
44
+ */
45
+ export function startDevWarmup(options) {
46
+ const { appConfig, runtimeOrigin } = options;
47
+ void Promise.all(appConfig.integrations.map((integration) => ensureIntegrationRuntimeReady({
32
48
  appConfig,
33
49
  integrationName: integration.name,
34
- runtimeOrigin
35
- })
36
- )
37
- ).catch((error) => {
38
- appLogger.error(
39
- `Failed to prewarm integration runtimes: ${error instanceof Error ? error.message : String(error)}`
40
- );
41
- });
50
+ runtimeOrigin,
51
+ }))).catch((error) => {
52
+ appLogger.error(`Failed to prewarm integration runtimes: ${error instanceof Error ? error.message : String(error)}`);
53
+ });
42
54
  }
43
- async function disposeDevResources(options) {
44
- await options.projectWatcher?.close();
45
- await disposeAppBuildRuntime(options.appConfig);
46
- options.hmrManager?.stop();
47
- options.bridge?.destroy();
48
- clearAppDevClientBridge(options.appConfig);
49
- clearAppHmrManager(options.appConfig);
50
- await options.previewHost.stop();
55
+ /**
56
+ * Releases shared dev resources in a consistent order across server adapters.
57
+ *
58
+ * @remarks
59
+ * Bun calls `buildRuntime()` during `initialize()` when watch is enabled; Node defers
60
+ * runtime creation to `completeInitialization()`. Transport-specific setup stays in
61
+ * each adapter — only shared teardown lives here.
62
+ */
63
+ export async function disposeDevResources(options) {
64
+ await options.projectWatcher?.close();
65
+ await disposeAppBuildRuntime(options.appConfig);
66
+ options.hmrManager?.stop();
67
+ options.bridge?.destroy();
68
+ clearAppDevClientBridge(options.appConfig);
69
+ clearAppHmrManager(options.appConfig);
70
+ await options.previewHost.stop();
51
71
  }
52
- export {
53
- attachHmrToIntegrations,
54
- disposeDevResources,
55
- prepareRuntimePublicDir,
56
- startConfiguredIntegrationRuntimePrewarm
57
- };
@@ -63,6 +63,7 @@ export declare abstract class SharedServerAdapter<TOptions extends ServerAdapter
63
63
  private createSharedPageCacheService;
64
64
  protected getCacheService(): CacheInvalidator | null;
65
65
  protected getRenderContext(): RenderContext;
66
+ private tryHandleSharedDevClientRequest;
66
67
  private tryHandleSharedHmrRequest;
67
68
  private injectSharedHmrHtmlResponse;
68
69
  private tryHandleSharedApiRequest;