@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,70 +1,100 @@
1
+ /**
2
+ * Normalizes a comma-separated scripts string into absolute script URLs.
3
+ *
4
+ * @param scripts Comma-separated script paths.
5
+ * @returns Normalized script path list.
6
+ */
1
7
  function normalizeScripts(scripts) {
2
- return scripts.split(",").map((scriptPath) => scriptPath.trim()).filter(Boolean).map((scriptPath) => {
3
- if (scriptPath.startsWith("/")) {
4
- return scriptPath;
5
- }
6
- const normalizedRelativePath = scriptPath.replace(/^\/+/, "").replace(/^(\.\/)+/, "");
7
- return `/${normalizedRelativePath}`;
8
- });
8
+ return scripts
9
+ .split(',')
10
+ .map((scriptPath) => scriptPath.trim())
11
+ .filter(Boolean)
12
+ .map((scriptPath) => {
13
+ if (scriptPath.startsWith('/')) {
14
+ return scriptPath;
15
+ }
16
+ const normalizedRelativePath = scriptPath.replace(/^\/+/, '').replace(/^(\.\/)+/, '');
17
+ return `/${normalizedRelativePath}`;
18
+ });
9
19
  }
20
+ /**
21
+ * Deduplicates comma-separated values while preserving first-seen order.
22
+ *
23
+ * @param values CSV value list.
24
+ * @returns A single normalized CSV string.
25
+ */
10
26
  function dedupeCsvValues(values) {
11
- const seen = /* @__PURE__ */ new Set();
12
- for (const value of values) {
13
- for (const token of value.split(",").map((part) => part.trim()).filter(Boolean)) {
14
- seen.add(token);
27
+ const seen = new Set();
28
+ for (const value of values) {
29
+ for (const token of value
30
+ .split(',')
31
+ .map((part) => part.trim())
32
+ .filter(Boolean)) {
33
+ seen.add(token);
34
+ }
15
35
  }
16
- }
17
- return Array.from(seen).join(",");
36
+ return Array.from(seen).join(',');
18
37
  }
38
+ /**
39
+ * Builds a scripts-injector map config from resolved lazy script groups.
40
+ *
41
+ * @param lazyGroups Lazy script groups resolved during dependency processing.
42
+ * @returns Injector map config keyed by lazy trigger.
43
+ */
19
44
  function buildInjectorMap(lazyGroups) {
20
- const map = {};
21
- for (const group of lazyGroups) {
22
- const scripts = normalizeScripts(group.scripts);
23
- const lazy = group.lazy;
24
- if ("on:idle" in lazy) {
25
- map["on:idle"] = {
26
- scripts: [...map["on:idle"]?.scripts ?? [], ...scripts]
27
- };
28
- continue;
29
- }
30
- if ("on:interaction" in lazy) {
31
- const currentValue = map["on:interaction"]?.value;
32
- const nextValue = lazy["on:interaction"];
33
- map["on:interaction"] = {
34
- value: typeof currentValue === "string" ? dedupeCsvValues([currentValue, nextValue]) : nextValue,
35
- scripts: [...map["on:interaction"]?.scripts ?? [], ...scripts]
36
- };
37
- continue;
38
- }
39
- if ("on:visible" in lazy) {
40
- const currentValue = map["on:visible"]?.value;
41
- const currentThreshold = typeof currentValue === "string" ? currentValue : void 0;
42
- const nextValue = lazy["on:visible"];
43
- map["on:visible"] = {
44
- ...nextValue === true ? currentThreshold ? { value: currentThreshold } : {} : { value: String(nextValue) },
45
- scripts: [...map["on:visible"]?.scripts ?? [], ...scripts]
46
- };
47
- continue;
45
+ const map = {};
46
+ for (const group of lazyGroups) {
47
+ const scripts = normalizeScripts(group.scripts);
48
+ const lazy = group.lazy;
49
+ if ('on:idle' in lazy) {
50
+ map['on:idle'] = {
51
+ scripts: [...(map['on:idle']?.scripts ?? []), ...scripts],
52
+ };
53
+ continue;
54
+ }
55
+ if ('on:interaction' in lazy) {
56
+ const currentValue = map['on:interaction']?.value;
57
+ const nextValue = lazy['on:interaction'];
58
+ map['on:interaction'] = {
59
+ value: typeof currentValue === 'string' ? dedupeCsvValues([currentValue, nextValue]) : nextValue,
60
+ scripts: [...(map['on:interaction']?.scripts ?? []), ...scripts],
61
+ };
62
+ continue;
63
+ }
64
+ if ('on:visible' in lazy) {
65
+ const currentValue = map['on:visible']?.value;
66
+ const currentThreshold = typeof currentValue === 'string' ? currentValue : undefined;
67
+ const nextValue = lazy['on:visible'];
68
+ map['on:visible'] = {
69
+ ...(nextValue === true
70
+ ? currentThreshold
71
+ ? { value: currentThreshold }
72
+ : {}
73
+ : { value: String(nextValue) }),
74
+ scripts: [...(map['on:visible']?.scripts ?? []), ...scripts],
75
+ };
76
+ continue;
77
+ }
78
+ throw new Error(`Invalid lazy options: must specify on:idle, on:interaction, or on:visible. Received: ${JSON.stringify(lazy)}`);
48
79
  }
49
- throw new Error(
50
- `Invalid lazy options: must specify on:idle, on:interaction, or on:visible. Received: ${JSON.stringify(lazy)}`
51
- );
52
- }
53
- for (const key of Object.keys(map)) {
54
- const scripts = map[key]?.scripts;
55
- if (scripts) {
56
- map[key] = {
57
- ...map[key],
58
- scripts: Array.from(new Set(scripts))
59
- };
80
+ for (const key of Object.keys(map)) {
81
+ const scripts = map[key]?.scripts;
82
+ if (scripts) {
83
+ map[key] = {
84
+ ...map[key],
85
+ scripts: Array.from(new Set(scripts)),
86
+ };
87
+ }
60
88
  }
61
- }
62
- return map;
89
+ return map;
63
90
  }
64
- function buildInjectorMapScript(lazyGroups) {
65
- const map = buildInjectorMap(lazyGroups);
66
- return JSON.stringify(map).replace(/<\/script/gi, "<\\/script");
91
+ /**
92
+ * Creates a safe JSON payload string for `<script type="ecopages/injector-map">`.
93
+ *
94
+ * @param lazyGroups Lazy script groups resolved during dependency processing.
95
+ * @returns Escaped JSON string safe for inline script embedding.
96
+ */
97
+ export function buildInjectorMapScript(lazyGroups) {
98
+ const map = buildInjectorMap(lazyGroups);
99
+ return JSON.stringify(map).replace(/<\/script/gi, '<\\/script');
67
100
  }
68
- export {
69
- buildInjectorMapScript
70
- };
@@ -1,49 +1,57 @@
1
1
  function normalizeImports(imports) {
2
- if (!imports || imports.length === 0) {
3
- return void 0;
4
- }
5
- const normalized = Array.from(new Set(imports.map((entry) => entry.trim()).filter((entry) => entry.length > 0)));
6
- return normalized.length > 0 ? normalized : void 0;
2
+ if (!imports || imports.length === 0) {
3
+ return undefined;
4
+ }
5
+ const normalized = Array.from(new Set(imports.map((entry) => entry.trim()).filter((entry) => entry.length > 0)));
6
+ return normalized.length > 0 ? normalized : undefined;
7
7
  }
8
- function parseModuleDeclaration(value) {
9
- const source = value.trim();
10
- if (source.length === 0) {
11
- throw new Error("Module declaration cannot be empty");
12
- }
13
- const openBraceIndex = source.indexOf("{");
14
- if (openBraceIndex < 0) {
15
- return { from: source };
16
- }
17
- const closeBraceIndex = source.lastIndexOf("}");
18
- if (closeBraceIndex !== source.length - 1 || closeBraceIndex <= openBraceIndex) {
19
- throw new Error(`Invalid module declaration '${value}'`);
20
- }
21
- const from = source.slice(0, openBraceIndex).trim();
22
- if (from.length === 0) {
23
- throw new Error(`Invalid module declaration '${value}'`);
24
- }
25
- const importsSlice = source.slice(openBraceIndex + 1, closeBraceIndex);
26
- const imports = normalizeImports(importsSlice.split(","));
27
- return {
28
- from,
29
- imports
30
- };
8
+ /**
9
+ * Parses a module grammar declaration into normalized object form.
10
+ *
11
+ * Supported input examples:
12
+ * - `react-aria-components`
13
+ * - `react-aria-components{Table,Select}`
14
+ */
15
+ export function parseModuleDeclaration(value) {
16
+ const source = value.trim();
17
+ if (source.length === 0) {
18
+ throw new Error('Module declaration cannot be empty');
19
+ }
20
+ const openBraceIndex = source.indexOf('{');
21
+ if (openBraceIndex < 0) {
22
+ return { from: source };
23
+ }
24
+ const closeBraceIndex = source.lastIndexOf('}');
25
+ if (closeBraceIndex !== source.length - 1 || closeBraceIndex <= openBraceIndex) {
26
+ throw new Error(`Invalid module declaration '${value}'`);
27
+ }
28
+ const from = source.slice(0, openBraceIndex).trim();
29
+ if (from.length === 0) {
30
+ throw new Error(`Invalid module declaration '${value}'`);
31
+ }
32
+ const importsSlice = source.slice(openBraceIndex + 1, closeBraceIndex);
33
+ const imports = normalizeImports(importsSlice.split(','));
34
+ return {
35
+ from,
36
+ imports,
37
+ };
31
38
  }
32
- function normalizeModuleDeclarations(modules) {
33
- const declarations = modules ?? [];
34
- const output = [];
35
- const seen = /* @__PURE__ */ new Set();
36
- for (const declaration of declarations) {
37
- const normalized = parseModuleDeclaration(declaration);
38
- const key = `${normalized.from}::${(normalized.imports ?? []).join(",")}`;
39
- if (!seen.has(key)) {
40
- seen.add(key);
41
- output.push(normalized);
39
+ /**
40
+ * Normalizes and deduplicates module declarations from `modules`.
41
+ *
42
+ * Returns canonical object declarations suitable for downstream bundling logic.
43
+ */
44
+ export function normalizeModuleDeclarations(modules) {
45
+ const declarations = modules ?? [];
46
+ const output = [];
47
+ const seen = new Set();
48
+ for (const declaration of declarations) {
49
+ const normalized = parseModuleDeclaration(declaration);
50
+ const key = `${normalized.from}::${(normalized.imports ?? []).join(',')}`;
51
+ if (!seen.has(key)) {
52
+ seen.add(key);
53
+ output.push(normalized);
54
+ }
42
55
  }
43
- }
44
- return output;
56
+ return output;
45
57
  }
46
- export {
47
- normalizeModuleDeclarations,
48
- parseModuleDeclaration
49
- };
@@ -1,59 +1,69 @@
1
1
  function isLayoutSpecObject(spec) {
2
- return typeof spec === "object" && spec !== null && "component" in spec;
2
+ return typeof spec === 'object' && spec !== null && 'component' in spec;
3
3
  }
4
- function normalizePageLayouts(layout) {
5
- if (!layout) {
6
- return [];
7
- }
8
- const specs = Array.isArray(layout) ? layout : [layout];
9
- return specs.map((spec) => {
10
- if (isLayoutSpecObject(spec)) {
11
- return {
12
- component: spec.component,
13
- props: spec.props
14
- };
4
+ /**
5
+ * Normalizes `layout` page options to an outer→inner stack of layout entries.
6
+ */
7
+ export function normalizePageLayouts(layout) {
8
+ if (!layout) {
9
+ return [];
10
+ }
11
+ const specs = Array.isArray(layout) ? layout : [layout];
12
+ return specs.map((spec) => {
13
+ if (isLayoutSpecObject(spec)) {
14
+ return {
15
+ component: spec.component,
16
+ props: spec.props,
17
+ };
18
+ }
19
+ return {
20
+ component: spec,
21
+ };
22
+ });
23
+ }
24
+ /**
25
+ * Merges layout components into `dependencies.components` without duplicates.
26
+ */
27
+ export function mergeLayoutDependencies(dependencies, layoutEntries) {
28
+ if (layoutEntries.length === 0) {
29
+ return dependencies;
30
+ }
31
+ const mergedComponents = [...(dependencies?.components ?? [])];
32
+ for (const entry of layoutEntries) {
33
+ if (!mergedComponents.includes(entry.component)) {
34
+ mergedComponents.push(entry.component);
35
+ }
15
36
  }
16
37
  return {
17
- component: spec
38
+ ...dependencies,
39
+ components: mergedComponents,
18
40
  };
19
- });
20
41
  }
21
- function mergeLayoutDependencies(dependencies, layoutEntries) {
22
- if (layoutEntries.length === 0) {
23
- return dependencies;
24
- }
25
- const mergedComponents = [...dependencies?.components ?? []];
26
- for (const entry of layoutEntries) {
27
- if (!mergedComponents.includes(entry.component)) {
28
- mergedComponents.push(entry.component);
42
+ /**
43
+ * Writes normalized layout metadata onto a page `config`.
44
+ */
45
+ export function applyPageLayoutConfig(pageConfig, layoutEntries) {
46
+ if (layoutEntries.length === 0) {
47
+ return;
29
48
  }
30
- }
31
- return {
32
- ...dependencies,
33
- components: mergedComponents
34
- };
35
- }
36
- function applyPageLayoutConfig(pageConfig, layoutEntries) {
37
- if (layoutEntries.length === 0) {
38
- return;
39
- }
40
- pageConfig.layouts = layoutEntries.map((entry) => entry.component);
41
- pageConfig.layoutEntries = layoutEntries;
49
+ pageConfig.layouts = layoutEntries.map((entry) => entry.component);
50
+ pageConfig.layoutEntries = layoutEntries;
42
51
  }
43
- function ensurePageConfigLayouts(config) {
44
- if (!config || config.layouts && config.layouts.length > 0) {
45
- return config;
46
- }
47
- const legacyLayout = config.layout;
48
- if (!legacyLayout) {
52
+ /**
53
+ * Migrates MDX-exported `config.layout` values onto normalized layout metadata.
54
+ *
55
+ * @remarks
56
+ * `eco.page({ layout })` already normalizes at factory time. MDX modules that
57
+ * export `config.layout` directly still need this import-time migration.
58
+ */
59
+ export function ensurePageConfigLayouts(config) {
60
+ if (!config || (config.layouts && config.layouts.length > 0)) {
61
+ return config;
62
+ }
63
+ const legacyLayout = config.layout;
64
+ if (!legacyLayout) {
65
+ return config;
66
+ }
67
+ applyPageLayoutConfig(config, normalizePageLayouts(legacyLayout));
49
68
  return config;
50
- }
51
- applyPageLayoutConfig(config, normalizePageLayouts(legacyLayout));
52
- return config;
53
69
  }
54
- export {
55
- applyPageLayoutConfig,
56
- ensurePageConfigLayouts,
57
- mergeLayoutDependencies,
58
- normalizePageLayouts
59
- };
@@ -1,50 +1,51 @@
1
- class HttpError extends Error {
2
- status;
3
- details;
4
- constructor(status, message, details) {
5
- super(message);
6
- this.name = "HttpError";
7
- this.status = status;
8
- this.details = details;
9
- }
10
- /**
11
- * Serialize error to JSON for API responses.
12
- */
13
- toJSON() {
14
- const json = {
15
- error: this.message,
16
- status: this.status
17
- };
18
- if (this.details) {
19
- json.details = this.details;
20
- }
21
- return json;
22
- }
23
- /**
24
- * Create a Response object from this error.
25
- */
26
- toResponse() {
27
- return Response.json(this.toJSON(), { status: this.status });
28
- }
29
- static BadRequest(message = "Bad Request", details) {
30
- return new HttpError(400, message, details);
31
- }
32
- static Unauthorized(message = "Unauthorized") {
33
- return new HttpError(401, message);
34
- }
35
- static Forbidden(message = "Forbidden") {
36
- return new HttpError(403, message);
37
- }
38
- static NotFound(message = "Not Found") {
39
- return new HttpError(404, message);
40
- }
41
- static Conflict(message = "Conflict", details) {
42
- return new HttpError(409, message, details);
43
- }
44
- static InternalServerError(message = "Internal Server Error") {
45
- return new HttpError(500, message);
46
- }
1
+ /**
2
+ * HTTP error class for structured error handling in route handlers.
3
+ * Provides static factory methods for common HTTP error responses.
4
+ */
5
+ export class HttpError extends Error {
6
+ status;
7
+ details;
8
+ constructor(status, message, details) {
9
+ super(message);
10
+ this.name = 'HttpError';
11
+ this.status = status;
12
+ this.details = details;
13
+ }
14
+ /**
15
+ * Serialize error to JSON for API responses.
16
+ */
17
+ toJSON() {
18
+ const json = {
19
+ error: this.message,
20
+ status: this.status,
21
+ };
22
+ if (this.details) {
23
+ json.details = this.details;
24
+ }
25
+ return json;
26
+ }
27
+ /**
28
+ * Create a Response object from this error.
29
+ */
30
+ toResponse() {
31
+ return Response.json(this.toJSON(), { status: this.status });
32
+ }
33
+ static BadRequest(message = 'Bad Request', details) {
34
+ return new HttpError(400, message, details);
35
+ }
36
+ static Unauthorized(message = 'Unauthorized') {
37
+ return new HttpError(401, message);
38
+ }
39
+ static Forbidden(message = 'Forbidden') {
40
+ return new HttpError(403, message);
41
+ }
42
+ static NotFound(message = 'Not Found') {
43
+ return new HttpError(404, message);
44
+ }
45
+ static Conflict(message = 'Conflict', details) {
46
+ return new HttpError(409, message, details);
47
+ }
48
+ static InternalServerError(message = 'Internal Server Error') {
49
+ return new HttpError(500, message);
50
+ }
47
51
  }
48
- export {
49
- HttpError
50
- };
@@ -1,12 +1,3 @@
1
- import { HttpError } from "./http-error.js";
2
- import { LocalsAccessError } from "./locals-access-error.js";
3
- import {
4
- UndeclaredComponentDependencyError,
5
- getUndeclaredComponentDependencyMessage
6
- } from "./undeclared-component-dependency-error.js";
7
- export {
8
- HttpError,
9
- LocalsAccessError,
10
- UndeclaredComponentDependencyError,
11
- getUndeclaredComponentDependencyMessage
12
- };
1
+ export { HttpError } from './http-error.js';
2
+ export { LocalsAccessError } from './locals-access-error.js';
3
+ export { UndeclaredComponentDependencyError, getUndeclaredComponentDependencyMessage, } from './undeclared-component-dependency-error.js';
@@ -1,9 +1,6 @@
1
- class LocalsAccessError extends Error {
2
- name = "LocalsAccessError";
3
- constructor(message) {
4
- super(message);
5
- }
1
+ export class LocalsAccessError extends Error {
2
+ name = 'LocalsAccessError';
3
+ constructor(message) {
4
+ super(message);
5
+ }
6
6
  }
7
- export {
8
- LocalsAccessError
9
- };
@@ -1,17 +1,17 @@
1
- function getUndeclaredComponentDependencyMessage(parentComponentFile) {
2
- const parentHint = parentComponentFile ? ` (declared by ${parentComponentFile})` : "";
3
- return `[ecopages] dependencies.components entries must be eco.component(), eco.layout(), or eco.html() components with __eco metadata${parentHint}. Plain functions and untyped components are not valid dependency entries.`;
1
+ export function getUndeclaredComponentDependencyMessage(parentComponentFile) {
2
+ const parentHint = parentComponentFile ? ` (declared by ${parentComponentFile})` : '';
3
+ return `[ecopages] dependencies.components entries must be eco.component(), eco.layout(), or eco.html() components with __eco metadata${parentHint}. Plain functions and untyped components are not valid dependency entries.`;
4
4
  }
5
- class UndeclaredComponentDependencyError extends Error {
6
- name = "UndeclaredComponentDependencyError";
7
- /** Parent component file path when the invalid entry was declared. */
8
- parentComponentFile;
9
- constructor(parentComponentFile) {
10
- super(getUndeclaredComponentDependencyMessage(parentComponentFile));
11
- this.parentComponentFile = parentComponentFile;
12
- }
5
+ /**
6
+ * Thrown when `dependencies.components` contains a plain function or component
7
+ * without plugin-injected `config.__eco` metadata.
8
+ */
9
+ export class UndeclaredComponentDependencyError extends Error {
10
+ name = 'UndeclaredComponentDependencyError';
11
+ /** Parent component file path when the invalid entry was declared. */
12
+ parentComponentFile;
13
+ constructor(parentComponentFile) {
14
+ super(getUndeclaredComponentDependencyMessage(parentComponentFile));
15
+ this.parentComponentFile = parentComponentFile;
16
+ }
13
17
  }
14
- export {
15
- UndeclaredComponentDependencyError,
16
- getUndeclaredComponentDependencyMessage
17
- };
@@ -1,6 +1,3 @@
1
- import { Logger } from "@ecopages/logger";
2
- const debug = process.env.ECOPAGES_LOGGER_DEBUG === "true";
3
- const appLogger = new Logger("[@ecopages/core]", { debug });
4
- export {
5
- appLogger
6
- };
1
+ import { Logger } from '@ecopages/logger';
2
+ const debug = process.env.ECOPAGES_LOGGER_DEBUG === 'true';
3
+ export const appLogger = new Logger('[@ecopages/core]', { debug });
package/src/hmr/README.md CHANGED
@@ -24,3 +24,13 @@ It is responsible for:
24
24
  Generic invalidation policy belongs in core services.
25
25
  Framework-specific update behavior belongs in HMR strategies.
26
26
  Runtime-specific WebSocket or event-stream transport belongs in adapters.
27
+
28
+ ## Registered entrypoints and dev transform
29
+
30
+ `SharedHmrManager` in `adapters/shared/hmr/` centralizes file-change handling via `handleFileChange()`. Server invalidation, integration hooks, rebuild, and client broadcast run in one sequence.
31
+
32
+ Dev client modules are served on demand through `DevTransformServer` (`src/dev/`). `DevTransformEntrypointRegistry` tracks registered entrypoints for HMR invalidation. Registration returns a stable dev-transform URL immediately; the first request (or cache miss) runs Rolldown on demand.
33
+
34
+ `BrowserBundleService` is the sole browser-plugin resolver for HMR builds. HMR managers route `hmr-runtime` and `hmr-entrypoint` rebuilds through the `browser-hmr` executor profile.
35
+
36
+ Hosts call `prepareHmrFileChange()` before HMR dispatch (`hmr/hmr-file-change-prep.ts`) so page browser graph sessions invalidate consistently with file changes.