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

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 (343) hide show
  1. package/README.md +1 -0
  2. package/package.json +90 -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/README.md +23 -0
  249. package/src/router/client/link-intent.js +55 -39
  250. package/src/router/client/link-intent.test.browser.js +49 -49
  251. package/src/router/client/link-navigation-policy.js +114 -93
  252. package/src/router/client/link-navigation-policy.test.browser.js +70 -80
  253. package/src/router/client/navigation-coordinator.js +235 -211
  254. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  255. package/src/router/client/navigation-lifecycle.js +50 -0
  256. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  257. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  258. package/src/router/server/route-registry.js +237 -242
  259. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
  260. package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
  261. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  262. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  263. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  264. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
  265. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
  266. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
  267. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
  268. package/src/services/assets/asset-processing-service/index.js +8 -8
  269. package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
  270. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
  271. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  272. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  273. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  274. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  275. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
  276. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  277. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
  278. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
  279. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  280. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
  281. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
  282. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
  283. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
  284. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
  285. package/src/services/assets/browser-bundle.service.js +52 -47
  286. package/src/services/cache/cache.types.js +5 -0
  287. package/src/services/cache/index.js +6 -7
  288. package/src/services/cache/memory-cache-store.js +101 -89
  289. package/src/services/cache/page-cache-service.js +156 -145
  290. package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
  291. package/src/services/html/html-rewriter-provider.service.js +61 -61
  292. package/src/services/html/html-transformer.service.js +249 -266
  293. package/src/services/invalidation/development-invalidation.service.js +252 -241
  294. package/src/services/module-loading/app-module-loader.service.js +1 -0
  295. package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
  296. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  297. package/src/services/module-loading/module-loading-types.js +1 -0
  298. package/src/services/module-loading/page-module-import.service.js +235 -243
  299. package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
  300. package/src/services/module-loading/route-module-build-cache.js +3 -38
  301. package/src/services/module-loading/route-module-build-cache.store.js +195 -200
  302. package/src/services/module-loading/route-module-build-manifest.js +61 -74
  303. package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
  304. package/src/services/module-loading/server-module-transpiler.service.js +68 -62
  305. package/src/services/module-loading/source-module-support.js +15 -7
  306. package/src/services/runtime-state/dev-graph.service.js +165 -157
  307. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  308. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  309. package/src/services/validation/schema-validation-service.js +157 -95
  310. package/src/services/validation/standard-schema.types.js +1 -0
  311. package/src/services/validation/validate-standard-schema.js +13 -13
  312. package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
  313. package/src/static-site-generator/sitemap-routes.js +33 -28
  314. package/src/static-site-generator/sitemap.js +38 -29
  315. package/src/static-site-generator/static-build-invalidation.js +34 -56
  316. package/src/static-site-generator/static-export-context.js +1 -0
  317. package/src/static-site-generator/static-site-generator.js +517 -553
  318. package/src/types/internal-types.d.ts +19 -3
  319. package/src/types/internal-types.js +1 -0
  320. package/src/types/public-types.d.ts +16 -46
  321. package/src/types/public-types.js +1 -0
  322. package/src/utils/deep-merge.js +39 -26
  323. package/src/utils/ecopages-route-info.js +27 -23
  324. package/src/utils/hash.js +3 -6
  325. package/src/utils/html-escaping.js +21 -8
  326. package/src/utils/html.js +1 -4
  327. package/src/utils/invariant.js +11 -10
  328. package/src/utils/locals-utils.js +32 -22
  329. package/src/utils/parse-cli-args.js +73 -65
  330. package/src/utils/path-pattern.js +38 -23
  331. package/src/utils/path-utils.module.js +8 -11
  332. package/src/utils/resolve-entry-file.js +70 -38
  333. package/src/utils/resolve-work-dir.js +23 -27
  334. package/src/utils/runtime.js +24 -33
  335. package/src/utils/server-utils.module.js +60 -52
  336. package/src/utils/static-file-extensions.js +52 -46
  337. package/src/watchers/project-watcher-ignore.js +16 -15
  338. package/src/watchers/project-watcher.js +385 -366
  339. package/src/watchers/project-watcher.test-helpers.js +45 -50
  340. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
  341. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
  342. package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
  343. package/src/build/cache/dev-browser-script-cache.js +0 -90
@@ -1,66 +1,59 @@
1
- import { appLogger } from "../../../global/app-logger.js";
2
- import { prepareExplicitStaticRender } from "./explicit-static-render-preparation.js";
3
- import { matchExplicitStaticPathPattern } from "../../abstract/segment-path-matcher.js";
4
- const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS = {
5
- missingIntegration: (routePath) => `View at ${routePath} is missing __eco.integration. Ensure it's defined with eco.page() and exported as default.`,
6
- noRendererForIntegration: (integrationName) => `No renderer found for integration: ${integrationName}`
1
+ import { appLogger } from '../../../global/app-logger.js';
2
+ import { prepareExplicitStaticRender } from './explicit-static-render-preparation.js';
3
+ import { matchExplicitStaticPathPattern } from '../../abstract/segment-path-matcher.js';
4
+ export const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS = {
5
+ missingIntegration: (routePath) => `View at ${routePath} is missing __eco.integration. Ensure it's defined with eco.page() and exported as default.`,
6
+ noRendererForIntegration: (integrationName) => `No renderer found for integration: ${integrationName}`,
7
7
  };
8
- class ExplicitStaticRouteMatcher {
9
- appConfig;
10
- routeRendererFactory;
11
- staticRoutes;
12
- constructor({ appConfig, routeRendererFactory, staticRoutes }) {
13
- this.appConfig = appConfig;
14
- this.routeRendererFactory = routeRendererFactory;
15
- this.staticRoutes = staticRoutes;
16
- }
17
- /**
18
- * Match a request URL against explicit static routes.
19
- * Returns the matched route and extracted params, or null if no match.
20
- */
21
- match(url) {
22
- const pathname = new URL(url).pathname;
23
- for (const route of this.staticRoutes) {
24
- const params = matchExplicitStaticPathPattern(route.path, pathname);
25
- if (params !== null) {
26
- return { route, params };
27
- }
8
+ /**
9
+ * Matches and renders explicit static routes declared through `app.static()`.
10
+ */
11
+ export class ExplicitStaticRouteMatcher {
12
+ appConfig;
13
+ routeRendererFactory;
14
+ staticRoutes;
15
+ constructor({ appConfig, routeRendererFactory, staticRoutes }) {
16
+ this.appConfig = appConfig;
17
+ this.routeRendererFactory = routeRendererFactory;
18
+ this.staticRoutes = staticRoutes;
28
19
  }
29
- return null;
30
- }
31
- /**
32
- * Handle a matched explicit static route.
33
- * Resolves the loader and renders the view using the appropriate integration renderer.
34
- */
35
- async handleMatch(match) {
36
- const { route, params } = match;
37
- try {
38
- const mod = await route.loader();
39
- const view = mod.default;
40
- const {
41
- renderer,
42
- props,
43
- view: renderableView
44
- } = await prepareExplicitStaticRender({
45
- routePath: route.path,
46
- view,
47
- params,
48
- appConfig: this.appConfig,
49
- runtimeOrigin: this.appConfig.baseUrl,
50
- routeRendererFactory: this.routeRendererFactory,
51
- errors: EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS
52
- });
53
- return renderer.renderToResponse(renderableView, props, {});
54
- } catch (error) {
55
- appLogger.error(
56
- `Error rendering explicit static route ${route.path}:`,
57
- error instanceof Error ? error : String(error)
58
- );
59
- throw error;
20
+ /**
21
+ * Match a request URL against explicit static routes.
22
+ * Returns the matched route and extracted params, or null if no match.
23
+ */
24
+ match(url) {
25
+ const pathname = new URL(url).pathname;
26
+ for (const route of this.staticRoutes) {
27
+ const params = matchExplicitStaticPathPattern(route.path, pathname);
28
+ if (params !== null) {
29
+ return { route, params };
30
+ }
31
+ }
32
+ return null;
33
+ }
34
+ /**
35
+ * Handle a matched explicit static route.
36
+ * Resolves the loader and renders the view using the appropriate integration renderer.
37
+ */
38
+ async handleMatch(match) {
39
+ const { route, params } = match;
40
+ try {
41
+ const mod = await route.loader();
42
+ const view = mod.default;
43
+ const { renderer, props, view: renderableView, } = await prepareExplicitStaticRender({
44
+ routePath: route.path,
45
+ view,
46
+ params,
47
+ appConfig: this.appConfig,
48
+ runtimeOrigin: this.appConfig.baseUrl,
49
+ routeRendererFactory: this.routeRendererFactory,
50
+ errors: EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS,
51
+ });
52
+ return renderer.renderToResponse(renderableView, props, {});
53
+ }
54
+ catch (error) {
55
+ appLogger.error(`Error rendering explicit static route ${route.path}:`, error instanceof Error ? error : String(error));
56
+ throw error;
57
+ }
60
58
  }
61
- }
62
59
  }
63
- export {
64
- EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS,
65
- ExplicitStaticRouteMatcher
66
- };
@@ -1,78 +1,84 @@
1
- import { createRequire } from "../../../utils/locals-utils.js";
2
- import { ApiResponseBuilder } from "./api-response.js";
3
- import { runMiddlewareChain } from "./run-middleware-chain.js";
4
- import { LocalsAccessError } from "../../../errors/locals-access-error.js";
5
- const FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS = {
6
- middlewareRequiresDynamic: (filePath) => `[ecopages] Page middleware requires cache: 'dynamic'. Page: ${filePath}`
1
+ import { createRequire } from '../../../utils/locals-utils.js';
2
+ import { ApiResponseBuilder } from './api-response.js';
3
+ import { runMiddlewareChain } from './run-middleware-chain.js';
4
+ import { LocalsAccessError } from '../../../errors/locals-access-error.js';
5
+ export const FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS = {
6
+ middlewareRequiresDynamic: (filePath) => `[ecopages] Page middleware requires cache: 'dynamic'. Page: ${filePath}`,
7
7
  };
8
- class FileRouteMiddlewarePipeline {
9
- cacheService;
10
- constructor(cacheService) {
11
- this.cacheService = cacheService;
12
- }
13
- /**
14
- * Enforces the current middleware contract for file-routed pages.
15
- *
16
- * Middleware depends on request-scoped locals and therefore must not run when
17
- * the page is treated as statically cacheable.
18
- *
19
- * @param input Middleware list, effective cache strategy, and page path.
20
- * @throws LocalsAccessError When middleware is configured for a non-dynamic page.
21
- */
22
- assertValidConfiguration(input) {
23
- if (input.middleware.length > 0 && input.pageCacheStrategy !== "dynamic") {
24
- throw new LocalsAccessError(
25
- FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS.middlewareRequiresDynamic(input.filePath)
26
- );
8
+ /**
9
+ * Executes middleware for file-based page routes.
10
+ *
11
+ * This pipeline owns the middleware-specific rules that are distinct from route
12
+ * matching and rendering, including request-local storage, the middleware
13
+ * execution context, and the invariant that page middleware only runs for
14
+ * request-time dynamic rendering.
15
+ */
16
+ export class FileRouteMiddlewarePipeline {
17
+ cacheService;
18
+ constructor(cacheService) {
19
+ this.cacheService = cacheService;
20
+ }
21
+ /**
22
+ * Enforces the current middleware contract for file-routed pages.
23
+ *
24
+ * Middleware depends on request-scoped locals and therefore must not run when
25
+ * the page is treated as statically cacheable.
26
+ *
27
+ * @param input Middleware list, effective cache strategy, and page path.
28
+ * @throws LocalsAccessError When middleware is configured for a non-dynamic page.
29
+ */
30
+ assertValidConfiguration(input) {
31
+ if (input.middleware.length > 0 && input.pageCacheStrategy !== 'dynamic') {
32
+ throw new LocalsAccessError(FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS.middlewareRequiresDynamic(input.filePath));
33
+ }
34
+ }
35
+ /**
36
+ * Creates the request-scoped middleware context used by page middleware.
37
+ *
38
+ * The context intentionally omits `render()` and `renderPartial()` because
39
+ * rendering is owned by the page route pipeline, not by middleware stages.
40
+ *
41
+ * @param input Request details and the mutable locals store.
42
+ * @returns Middleware execution context.
43
+ */
44
+ createContext(input) {
45
+ const context = {
46
+ request: input.request,
47
+ params: input.params,
48
+ response: new ApiResponseBuilder(),
49
+ server: null,
50
+ services: {
51
+ cache: this.cacheService,
52
+ },
53
+ locals: input.locals,
54
+ require: createRequire(() => context.locals),
55
+ json: (data, options) => {
56
+ if (options?.status)
57
+ context.response.status(options.status);
58
+ if (options?.headers)
59
+ context.response.headers(options.headers);
60
+ return context.response.json(data);
61
+ },
62
+ html: (content, options) => {
63
+ if (options?.status)
64
+ context.response.status(options.status);
65
+ if (options?.headers)
66
+ context.response.headers(options.headers);
67
+ return context.response.html(content);
68
+ },
69
+ };
70
+ return context;
71
+ }
72
+ /**
73
+ * Runs the middleware chain and eventually delegates to the render callback.
74
+ *
75
+ * Middleware may short-circuit by returning a response directly. If the chain
76
+ * completes, the supplied `renderResponse` callback is executed exactly once.
77
+ *
78
+ * @param input Middleware context, chain, and terminal render callback.
79
+ * @returns Response from middleware or final render stage.
80
+ */
81
+ async run(input) {
82
+ return runMiddlewareChain(input.middleware, input.context, input.renderResponse);
27
83
  }
28
- }
29
- /**
30
- * Creates the request-scoped middleware context used by page middleware.
31
- *
32
- * The context intentionally omits `render()` and `renderPartial()` because
33
- * rendering is owned by the page route pipeline, not by middleware stages.
34
- *
35
- * @param input Request details and the mutable locals store.
36
- * @returns Middleware execution context.
37
- */
38
- createContext(input) {
39
- const context = {
40
- request: input.request,
41
- params: input.params,
42
- response: new ApiResponseBuilder(),
43
- server: null,
44
- services: {
45
- cache: this.cacheService
46
- },
47
- locals: input.locals,
48
- require: createRequire(() => context.locals),
49
- json: (data, options) => {
50
- if (options?.status) context.response.status(options.status);
51
- if (options?.headers) context.response.headers(options.headers);
52
- return context.response.json(data);
53
- },
54
- html: (content, options) => {
55
- if (options?.status) context.response.status(options.status);
56
- if (options?.headers) context.response.headers(options.headers);
57
- return context.response.html(content);
58
- }
59
- };
60
- return context;
61
- }
62
- /**
63
- * Runs the middleware chain and eventually delegates to the render callback.
64
- *
65
- * Middleware may short-circuit by returning a response directly. If the chain
66
- * completes, the supplied `renderResponse` callback is executed exactly once.
67
- *
68
- * @param input Middleware context, chain, and terminal render callback.
69
- * @returns Response from middleware or final render stage.
70
- */
71
- async run(input) {
72
- return runMiddlewareChain(input.middleware, input.context, input.renderResponse);
73
- }
74
84
  }
75
- export {
76
- FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS,
77
- FileRouteMiddlewarePipeline
78
- };
@@ -1,101 +1,106 @@
1
- import { STATUS_MESSAGE } from "../../../config/constants.js";
2
- import { appLogger } from "../../../global/app-logger.js";
3
- import { fileSystem } from "@ecopages/file-system";
4
- class FileSystemServerResponseFactory {
5
- options;
6
- constructor({ options }) {
7
- this.options = options;
8
- }
9
- isHtml(contentType) {
10
- return contentType === "text/html";
11
- }
12
- shouldEnableGzip(contentType) {
13
- if (this.options.watchMode) return false;
14
- const gzipEnabledExtensions = ["text/javascript", "text/css"];
15
- return gzipEnabledExtensions.includes(contentType);
16
- }
17
- async createResponseWithBody(body, init = {
18
- headers: {
19
- "Content-Type": "text/html"
1
+ import { STATUS_MESSAGE } from '../../../config/constants.js';
2
+ import { appLogger } from '../../../global/app-logger.js';
3
+ import { fileSystem } from '@ecopages/file-system';
4
+ /**
5
+ * Builds HTTP responses for static files and shared file-system fallbacks.
6
+ */
7
+ export class FileSystemServerResponseFactory {
8
+ options;
9
+ constructor({ options }) {
10
+ this.options = options;
20
11
  }
21
- }) {
22
- return new Response(body, init);
23
- }
24
- async createDefaultNotFoundResponse() {
25
- return new Response(STATUS_MESSAGE[404], {
26
- status: 404
27
- });
28
- }
29
- /**
30
- * Wraps already-rendered HTML in a 404 response envelope.
31
- */
32
- async createHtmlNotFoundResponse(body) {
33
- return await this.createResponseWithBody(body, {
34
- status: 404,
35
- statusText: STATUS_MESSAGE[404],
36
- headers: {
37
- "Content-Type": "text/html"
38
- }
39
- });
40
- }
41
- async createDefaultServerErrorResponse() {
42
- return new Response(STATUS_MESSAGE[500], {
43
- status: 500,
44
- headers: {
45
- "Content-Type": "text/plain; charset=utf-8"
46
- }
47
- });
48
- }
49
- /**
50
- * Wraps already-rendered HTML in a 500 response envelope.
51
- */
52
- async createHtmlServerErrorResponse(body) {
53
- return await this.createResponseWithBody(body, {
54
- status: 500,
55
- statusText: STATUS_MESSAGE[500],
56
- headers: {
57
- "Content-Type": "text/html"
58
- }
59
- });
60
- }
61
- /**
62
- * Reads a static file response, returning `null` when the file is missing.
63
- */
64
- async createFileResponse(filePath, contentType) {
65
- try {
66
- let file;
67
- const contentEncodingHeader = {};
68
- if (this.shouldEnableGzip(contentType)) {
69
- const gzipPath = `${filePath}.gz`;
70
- if (fileSystem.exists(gzipPath)) {
71
- file = fileSystem.readFileAsBuffer(gzipPath);
72
- contentEncodingHeader["Content-Encoding"] = "gzip";
73
- contentEncodingHeader["Vary"] = "Accept-Encoding";
74
- } else {
75
- appLogger.debug("Gzip file not found, serving uncompressed", gzipPath);
76
- file = fileSystem.readFileAsBuffer(filePath);
77
- }
78
- } else {
79
- file = fileSystem.readFileAsBuffer(filePath);
80
- }
81
- return await this.createResponseWithBody(file, {
12
+ isHtml(contentType) {
13
+ return contentType === 'text/html';
14
+ }
15
+ shouldEnableGzip(contentType) {
16
+ if (this.options.watchMode)
17
+ return false;
18
+ const gzipEnabledExtensions = ['text/javascript', 'text/css'];
19
+ return gzipEnabledExtensions.includes(contentType);
20
+ }
21
+ async createResponseWithBody(body, init = {
82
22
  headers: {
83
- "Content-Type": contentType,
84
- ...contentEncodingHeader
23
+ 'Content-Type': 'text/html',
24
+ },
25
+ }) {
26
+ return new Response(body, init);
27
+ }
28
+ async createDefaultNotFoundResponse() {
29
+ return new Response(STATUS_MESSAGE[404], {
30
+ status: 404,
31
+ });
32
+ }
33
+ /**
34
+ * Wraps already-rendered HTML in a 404 response envelope.
35
+ */
36
+ async createHtmlNotFoundResponse(body) {
37
+ return await this.createResponseWithBody(body, {
38
+ status: 404,
39
+ statusText: STATUS_MESSAGE[404],
40
+ headers: {
41
+ 'Content-Type': 'text/html',
42
+ },
43
+ });
44
+ }
45
+ async createDefaultServerErrorResponse() {
46
+ return new Response(STATUS_MESSAGE[500], {
47
+ status: 500,
48
+ headers: {
49
+ 'Content-Type': 'text/plain; charset=utf-8',
50
+ },
51
+ });
52
+ }
53
+ /**
54
+ * Wraps already-rendered HTML in a 500 response envelope.
55
+ */
56
+ async createHtmlServerErrorResponse(body) {
57
+ return await this.createResponseWithBody(body, {
58
+ status: 500,
59
+ statusText: STATUS_MESSAGE[500],
60
+ headers: {
61
+ 'Content-Type': 'text/html',
62
+ },
63
+ });
64
+ }
65
+ /**
66
+ * Reads a static file response, returning `null` when the file is missing.
67
+ */
68
+ async createFileResponse(filePath, contentType) {
69
+ try {
70
+ let file;
71
+ const contentEncodingHeader = {};
72
+ if (this.shouldEnableGzip(contentType)) {
73
+ const gzipPath = `${filePath}.gz`;
74
+ if (fileSystem.exists(gzipPath)) {
75
+ file = fileSystem.readFileAsBuffer(gzipPath);
76
+ contentEncodingHeader['Content-Encoding'] = 'gzip';
77
+ contentEncodingHeader['Vary'] = 'Accept-Encoding';
78
+ }
79
+ else {
80
+ appLogger.debug('Gzip file not found, serving uncompressed', gzipPath);
81
+ file = fileSystem.readFileAsBuffer(filePath);
82
+ }
83
+ }
84
+ else {
85
+ file = fileSystem.readFileAsBuffer(filePath);
86
+ }
87
+ return await this.createResponseWithBody(file, {
88
+ headers: {
89
+ 'Content-Type': contentType,
90
+ ...contentEncodingHeader,
91
+ },
92
+ });
93
+ }
94
+ catch (error) {
95
+ const err = error;
96
+ const code = err.code || err.cause?.code;
97
+ if (code === 'ENOENT') {
98
+ appLogger.debug('File not found', filePath);
99
+ }
100
+ else {
101
+ appLogger.error('Error reading file', filePath, err);
102
+ }
103
+ return null;
85
104
  }
86
- });
87
- } catch (error) {
88
- const err = error;
89
- const code = err.code || err.cause?.code;
90
- if (code === "ENOENT") {
91
- appLogger.debug("File not found", filePath);
92
- } else {
93
- appLogger.error("Error reading file", filePath, err);
94
- }
95
- return null;
96
105
  }
97
- }
98
106
  }
99
- export {
100
- FileSystemServerResponseFactory
101
- };