@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,73 +1,90 @@
1
- import { RERUN_SRC_ATTR, getRegisteredRerunScript } from "./registry.js";
1
+ /**
2
+ * Queueing and replay of `data-eco-rerun` scripts after navigation.
3
+ * @module
4
+ */
5
+ import { RERUN_SRC_ATTR, getRegisteredRerunScript } from './registry.js';
2
6
  let rerunNonce = 0;
3
- function collectRerunScripts(document2, filter) {
4
- return Array.from(document2.querySelectorAll("script[data-eco-rerun]")).filter((script) => filter ? filter(script) : true).map((script) => ({
5
- parent: script.closest("body") ? "body" : "head",
6
- attributes: Array.from(script.attributes).map((attribute) => [attribute.name, attribute.value]),
7
- textContent: script.textContent ?? "",
8
- src: script.getAttribute("src"),
9
- scriptId: script.getAttribute("data-eco-script-id")
10
- }));
7
+ /**
8
+ * Collects rerun scripts from an incoming document.
9
+ */
10
+ export function collectRerunScripts(document, filter) {
11
+ return Array.from(document.querySelectorAll('script[data-eco-rerun]'))
12
+ .filter((script) => (filter ? filter(script) : true))
13
+ .map((script) => ({
14
+ parent: script.closest('body') ? 'body' : 'head',
15
+ attributes: Array.from(script.attributes).map((attribute) => [attribute.name, attribute.value]),
16
+ textContent: script.textContent ?? '',
17
+ src: script.getAttribute('src'),
18
+ scriptId: script.getAttribute('data-eco-script-id'),
19
+ }));
11
20
  }
12
- function isExternalModuleRerunScript(script) {
13
- if (!script.src) {
14
- return false;
15
- }
16
- return script.attributes.some(([name, value]) => name === "type" && value === "module");
21
+ /**
22
+ * Returns whether a rerun script is an external ES module that needs cache busting.
23
+ */
24
+ export function isExternalModuleRerunScript(script) {
25
+ if (!script.src) {
26
+ return false;
27
+ }
28
+ return script.attributes.some(([name, value]) => name === 'type' && value === 'module');
17
29
  }
18
- function findExistingRerunScript(root, script) {
19
- const scripts = Array.from(root.querySelectorAll("script"));
20
- if (script.scriptId) {
21
- return scripts.find((candidate) => candidate.getAttribute("data-eco-script-id") === script.scriptId) ?? null;
22
- }
23
- return scripts.find(
24
- (candidate) => (candidate.getAttribute(RERUN_SRC_ATTR) ?? candidate.getAttribute("src")) === script.src && (candidate.textContent ?? "") === script.textContent
25
- ) ?? null;
30
+ /**
31
+ * Finds an existing rerun script in `root` by id or by src and inline content.
32
+ */
33
+ export function findExistingRerunScript(root, script) {
34
+ const scripts = Array.from(root.querySelectorAll('script'));
35
+ if (script.scriptId) {
36
+ return scripts.find((candidate) => candidate.getAttribute('data-eco-script-id') === script.scriptId) ?? null;
37
+ }
38
+ return (scripts.find((candidate) => (candidate.getAttribute(RERUN_SRC_ATTR) ?? candidate.getAttribute('src')) === script.src &&
39
+ (candidate.textContent ?? '') === script.textContent) ?? null);
26
40
  }
27
- function createRerunScriptUrl(src) {
28
- const url = new URL(src, document.baseURI);
29
- url.searchParams.set("__eco_rerun", String(++rerunNonce));
30
- return url.toString();
41
+ /**
42
+ * Appends a nonce query parameter so module scripts re-execute after navigation.
43
+ */
44
+ export function createRerunScriptUrl(src) {
45
+ const url = new URL(src, document.baseURI);
46
+ url.searchParams.set('__eco_rerun', String(++rerunNonce));
47
+ return url.toString();
31
48
  }
32
- function flushPendingRerunScripts(scripts) {
33
- for (const script of scripts) {
34
- const targetParent = script.parent === "body" ? document.body : document.head;
35
- const registeredRerun = getRegisteredRerunScript(script.scriptId);
36
- const replacement = document.createElement("script");
37
- const shouldBustModuleSrc = isExternalModuleRerunScript(script) && !registeredRerun;
38
- for (const [name, value] of script.attributes) {
39
- if (name === "src" && shouldBustModuleSrc) {
40
- replacement.setAttribute(RERUN_SRC_ATTR, value);
41
- replacement.setAttribute("src", createRerunScriptUrl(value));
42
- continue;
43
- }
44
- replacement.setAttribute(name, value);
45
- }
46
- replacement.textContent = script.textContent;
47
- const existingScript = findExistingRerunScript(targetParent, script);
48
- if (registeredRerun) {
49
- const needsScriptElement = isExternalModuleRerunScript(script);
50
- if (!existingScript && needsScriptElement) {
49
+ /**
50
+ * Replays queued rerun scripts after the incoming page body is in place.
51
+ *
52
+ * @remarks
53
+ * Flushed elements keep `data-eco-rerun` so head cleanup does not treat them
54
+ * as persistable inline scripts on the next navigation.
55
+ */
56
+ export function flushPendingRerunScripts(scripts) {
57
+ for (const script of scripts) {
58
+ const targetParent = script.parent === 'body' ? document.body : document.head;
59
+ const registeredRerun = getRegisteredRerunScript(script.scriptId);
60
+ const replacement = document.createElement('script');
61
+ const shouldBustModuleSrc = isExternalModuleRerunScript(script) && !registeredRerun;
62
+ for (const [name, value] of script.attributes) {
63
+ if (name === 'src' && shouldBustModuleSrc) {
64
+ replacement.setAttribute(RERUN_SRC_ATTR, value);
65
+ replacement.setAttribute('src', createRerunScriptUrl(value));
66
+ continue;
67
+ }
68
+ replacement.setAttribute(name, value);
69
+ }
70
+ replacement.textContent = script.textContent;
71
+ const existingScript = findExistingRerunScript(targetParent, script);
72
+ if (registeredRerun) {
73
+ const needsScriptElement = isExternalModuleRerunScript(script);
74
+ if (!existingScript && needsScriptElement) {
75
+ targetParent.appendChild(replacement);
76
+ }
77
+ registeredRerun();
78
+ continue;
79
+ }
80
+ if (existingScript) {
81
+ existingScript.replaceWith(replacement);
82
+ continue;
83
+ }
51
84
  targetParent.appendChild(replacement);
52
- }
53
- registeredRerun();
54
- continue;
55
- }
56
- if (existingScript) {
57
- existingScript.replaceWith(replacement);
58
- continue;
59
85
  }
60
- targetParent.appendChild(replacement);
61
- }
62
86
  }
63
- function resetRerunNonceForTests() {
64
- rerunNonce = 0;
87
+ /** @remarks Test-only reset for nonce sequencing. */
88
+ export function resetRerunNonceForTests() {
89
+ rerunNonce = 0;
65
90
  }
66
- export {
67
- collectRerunScripts,
68
- createRerunScriptUrl,
69
- findExistingRerunScript,
70
- flushPendingRerunScripts,
71
- isExternalModuleRerunScript,
72
- resetRerunNonceForTests
73
- };
@@ -1,25 +1,33 @@
1
- function manageWindowScroll(newUrl, previousUrl, options) {
2
- const { scrollBehavior, smoothScroll } = options;
3
- if (newUrl.hash) {
4
- const target = document.getElementById(newUrl.hash.slice(1));
5
- target?.scrollIntoView({ behavior: smoothScroll ? "smooth" : "instant" });
6
- return;
7
- }
8
- const behavior = smoothScroll ? "smooth" : "instant";
9
- switch (scrollBehavior) {
10
- case "preserve":
11
- break;
12
- case "auto":
13
- if (newUrl.pathname !== previousUrl.pathname) {
14
- window.scrollTo({ top: 0, left: 0, behavior });
15
- }
16
- break;
17
- case "top":
18
- default:
19
- window.scrollTo({ top: 0, left: 0, behavior });
20
- break;
21
- }
1
+ /**
2
+ * Window scroll behavior during client-side navigations.
3
+ * @module
4
+ */
5
+ /**
6
+ * Updates window scroll position after a navigation commit.
7
+ *
8
+ * @remarks
9
+ * Hash navigations always scroll to the target element and ignore `scrollBehavior`.
10
+ * Fragment targets are resolved by element id (`#section` → `getElementById('section')`).
11
+ */
12
+ export function manageWindowScroll(newUrl, previousUrl, options) {
13
+ const { scrollBehavior, smoothScroll } = options;
14
+ if (newUrl.hash) {
15
+ const target = document.getElementById(newUrl.hash.slice(1));
16
+ target?.scrollIntoView({ behavior: smoothScroll ? 'smooth' : 'instant' });
17
+ return;
18
+ }
19
+ const behavior = smoothScroll ? 'smooth' : 'instant';
20
+ switch (scrollBehavior) {
21
+ case 'preserve':
22
+ break;
23
+ case 'auto':
24
+ if (newUrl.pathname !== previousUrl.pathname) {
25
+ window.scrollTo({ top: 0, left: 0, behavior });
26
+ }
27
+ break;
28
+ case 'top':
29
+ default:
30
+ window.scrollTo({ top: 0, left: 0, behavior });
31
+ break;
32
+ }
22
33
  }
23
- export {
24
- manageWindowScroll
25
- };
@@ -1,37 +1,31 @@
1
- import { afterEach, describe, expect, it, vi } from "vitest";
2
- import { manageWindowScroll } from "./scroll.js";
3
- const options = { scrollBehavior: "top", smoothScroll: false };
4
- describe("manageWindowScroll", () => {
5
- afterEach(() => {
6
- history.replaceState({}, "", "/");
7
- document.body.replaceChildren();
8
- vi.restoreAllMocks();
9
- });
10
- it("scrolls to top by default", () => {
11
- const scrollTo = vi.spyOn(window, "scrollTo").mockImplementation(() => {
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import { manageWindowScroll } from './scroll.js';
3
+ const options = { scrollBehavior: 'top', smoothScroll: false };
4
+ describe('manageWindowScroll', () => {
5
+ afterEach(() => {
6
+ history.replaceState({}, '', '/');
7
+ document.body.replaceChildren();
8
+ vi.restoreAllMocks();
12
9
  });
13
- manageWindowScroll(new URL("/next", window.location.origin), new URL("/prev", window.location.origin), options);
14
- expect(scrollTo).toHaveBeenCalledWith({ top: 0, left: 0, behavior: "instant" });
15
- });
16
- it("preserves scroll when scrollBehavior is preserve", () => {
17
- const scrollTo = vi.spyOn(window, "scrollTo").mockImplementation(() => {
10
+ it('scrolls to top by default', () => {
11
+ const scrollTo = vi.spyOn(window, 'scrollTo').mockImplementation(() => { });
12
+ manageWindowScroll(new URL('/next', window.location.origin), new URL('/prev', window.location.origin), options);
13
+ expect(scrollTo).toHaveBeenCalledWith({ top: 0, left: 0, behavior: 'instant' });
18
14
  });
19
- manageWindowScroll(new URL("/next", window.location.origin), new URL("/prev", window.location.origin), {
20
- ...options,
21
- scrollBehavior: "preserve"
15
+ it('preserves scroll when scrollBehavior is preserve', () => {
16
+ const scrollTo = vi.spyOn(window, 'scrollTo').mockImplementation(() => { });
17
+ manageWindowScroll(new URL('/next', window.location.origin), new URL('/prev', window.location.origin), {
18
+ ...options,
19
+ scrollBehavior: 'preserve',
20
+ });
21
+ expect(scrollTo).not.toHaveBeenCalled();
22
+ });
23
+ it('scrolls to hash target by element id', () => {
24
+ const section = document.createElement('section');
25
+ section.id = 'section';
26
+ section.scrollIntoView = vi.fn();
27
+ document.body.append(section);
28
+ manageWindowScroll(new URL('/page#section', window.location.origin), new URL('/page', window.location.origin), options);
29
+ expect(section.scrollIntoView).toHaveBeenCalledWith({ behavior: 'instant' });
22
30
  });
23
- expect(scrollTo).not.toHaveBeenCalled();
24
- });
25
- it("scrolls to hash target by element id", () => {
26
- const section = document.createElement("section");
27
- section.id = "section";
28
- section.scrollIntoView = vi.fn();
29
- document.body.append(section);
30
- manageWindowScroll(
31
- new URL("/page#section", window.location.origin),
32
- new URL("/page", window.location.origin),
33
- options
34
- );
35
- expect(section.scrollIntoView).toHaveBeenCalledWith({ behavior: "instant" });
36
- });
37
31
  });
@@ -1,63 +1,76 @@
1
- const VIEW_TRANSITION_ATTR = "data-view-transition";
2
- const VIEW_TRANSITION_ANIMATE_ATTR = "data-view-transition-animate";
3
- const VIEW_TRANSITION_DURATION_ATTR = "data-view-transition-duration";
4
- const DYNAMIC_STYLES_ID = "eco-vt-dynamic-styles";
5
- function applyViewTransitionNames() {
6
- const elements = document.querySelectorAll(`[${VIEW_TRANSITION_ATTR}]`);
7
- const morphNames = [];
8
- const customDurations = [];
9
- elements.forEach((el) => {
10
- const name = el.getAttribute(VIEW_TRANSITION_ATTR);
11
- if (!name) {
12
- return;
1
+ /**
2
+ * View Transition API helpers for `data-view-transition` markup.
3
+ * @module
4
+ */
5
+ const VIEW_TRANSITION_ATTR = 'data-view-transition';
6
+ const VIEW_TRANSITION_ANIMATE_ATTR = 'data-view-transition-animate';
7
+ const VIEW_TRANSITION_DURATION_ATTR = 'data-view-transition-duration';
8
+ const DYNAMIC_STYLES_ID = 'eco-vt-dynamic-styles';
9
+ /**
10
+ * Assigns `view-transition-name` from `data-view-transition` and injects morph styles.
11
+ *
12
+ * @remarks
13
+ * Elements without `data-view-transition-animate="fade"` get a geometric morph:
14
+ * the old snapshot is hidden so cross-fade ghosting does not appear.
15
+ */
16
+ export function applyViewTransitionNames() {
17
+ const elements = document.querySelectorAll(`[${VIEW_TRANSITION_ATTR}]`);
18
+ const morphNames = [];
19
+ const customDurations = [];
20
+ elements.forEach((el) => {
21
+ const name = el.getAttribute(VIEW_TRANSITION_ATTR);
22
+ if (!name) {
23
+ return;
24
+ }
25
+ el.style.viewTransitionName = name;
26
+ const animate = el.getAttribute(VIEW_TRANSITION_ANIMATE_ATTR);
27
+ if (animate !== 'fade') {
28
+ morphNames.push(name);
29
+ }
30
+ const duration = el.getAttribute(VIEW_TRANSITION_DURATION_ATTR);
31
+ if (duration) {
32
+ customDurations.push({ name, duration });
33
+ }
34
+ });
35
+ if (morphNames.length > 0 || customDurations.length > 0) {
36
+ injectDynamicStyles(morphNames, customDurations);
13
37
  }
14
- el.style.viewTransitionName = name;
15
- const animate = el.getAttribute(VIEW_TRANSITION_ANIMATE_ATTR);
16
- if (animate !== "fade") {
17
- morphNames.push(name);
18
- }
19
- const duration = el.getAttribute(VIEW_TRANSITION_DURATION_ATTR);
20
- if (duration) {
21
- customDurations.push({ name, duration });
22
- }
23
- });
24
- if (morphNames.length > 0 || customDurations.length > 0) {
25
- injectDynamicStyles(morphNames, customDurations);
26
- }
27
38
  }
28
- function clearViewTransitionNames() {
29
- const elements = document.querySelectorAll(`[${VIEW_TRANSITION_ATTR}]`);
30
- elements.forEach((el) => {
31
- el.style.viewTransitionName = "";
32
- });
33
- const styleEl = document.getElementById(DYNAMIC_STYLES_ID);
34
- if (styleEl) {
35
- styleEl.textContent = "";
36
- }
39
+ /**
40
+ * Clears inline transition names and dynamic morph styles after a transition ends.
41
+ */
42
+ export function clearViewTransitionNames() {
43
+ const elements = document.querySelectorAll(`[${VIEW_TRANSITION_ATTR}]`);
44
+ elements.forEach((el) => {
45
+ el.style.viewTransitionName = '';
46
+ });
47
+ const styleEl = document.getElementById(DYNAMIC_STYLES_ID);
48
+ if (styleEl) {
49
+ styleEl.textContent = '';
50
+ }
37
51
  }
38
52
  function injectDynamicStyles(morphNames, customDurations) {
39
- let styleEl = document.getElementById(DYNAMIC_STYLES_ID);
40
- if (!styleEl) {
41
- styleEl = document.createElement("style");
42
- styleEl.id = DYNAMIC_STYLES_ID;
43
- styleEl.setAttribute("data-eco-persist", "");
44
- document.head.append(styleEl);
45
- }
46
- const morphCss = morphNames.map(
47
- (name) => `
53
+ let styleEl = document.getElementById(DYNAMIC_STYLES_ID);
54
+ if (!styleEl) {
55
+ styleEl = document.createElement('style');
56
+ styleEl.id = DYNAMIC_STYLES_ID;
57
+ /**
58
+ * @remarks
59
+ * Head morphing must not drop this tag between navigations.
60
+ */
61
+ styleEl.setAttribute('data-eco-persist', '');
62
+ document.head.append(styleEl);
63
+ }
64
+ const morphCss = morphNames
65
+ .map((name) => `
48
66
  ::view-transition-old(${name}) { display: none !important; }
49
67
  ::view-transition-new(${name}) { animation: none !important; opacity: 1 !important; }
50
- `
51
- ).join("\n");
52
- const durationCss = customDurations.map(
53
- ({ name, duration }) => `
68
+ `)
69
+ .join('\n');
70
+ const durationCss = customDurations
71
+ .map(({ name, duration }) => `
54
72
  ::view-transition-group(${name}) { animation-duration: ${duration} !important; }
55
- `
56
- ).join("\n");
57
- styleEl.textContent = `${morphCss}
58
- ${durationCss}`;
73
+ `)
74
+ .join('\n');
75
+ styleEl.textContent = `${morphCss}\n${durationCss}`;
59
76
  }
60
- export {
61
- applyViewTransitionNames,
62
- clearViewTransitionNames
63
- };
@@ -148,6 +148,14 @@ export declare class ConfigBuilder {
148
148
  * during static generation (not by this config merge).
149
149
  */
150
150
  setSitemap(sitemap: SitemapConfig): this;
151
+ /**
152
+ * Configures the in-browser development toolbar shown during watch mode.
153
+ *
154
+ * @remarks
155
+ * Requires `package` to point at a browser bootstrap module installed in the app.
156
+ * Prefer {@link defineDevTool} for config authoring.
157
+ */
158
+ setDevToolbar(devToolbar: NonNullable<EcoPagesAppConfig['devToolbar']>): this;
151
159
  /**
152
160
  * Sets the integration plugins to use.
153
161
  * These plugins provide additional functionality to the application.