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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/README.md +1 -0
  2. package/package.json +82 -3
  3. package/src/adapters/abstract/application-adapter.d.ts +0 -8
  4. package/src/adapters/abstract/application-adapter.js +252 -261
  5. package/src/adapters/abstract/router-adapter.js +12 -4
  6. package/src/adapters/abstract/segment-path-matcher.js +132 -134
  7. package/src/adapters/abstract/server-adapter.js +22 -14
  8. package/src/adapters/abstract/ws-pattern-matcher.js +24 -26
  9. package/src/adapters/bun/bun-user-websocket-lifecycle.js +83 -86
  10. package/src/adapters/bun/client-bridge.js +51 -50
  11. package/src/adapters/bun/create-app.js +171 -161
  12. package/src/adapters/bun/hmr-manager.js +62 -57
  13. package/src/adapters/bun/index.js +2 -31
  14. package/src/adapters/bun/runtime-host.js +61 -54
  15. package/src/adapters/bun/server-adapter.d.ts +0 -1
  16. package/src/adapters/bun/server-adapter.js +561 -561
  17. package/src/adapters/bun/static-preview-host.js +43 -46
  18. package/src/adapters/create-app.js +11 -14
  19. package/src/adapters/index.js +2 -30
  20. package/src/adapters/node/create-app.js +123 -129
  21. package/src/adapters/node/http-request-bridge.js +147 -106
  22. package/src/adapters/node/node-client-bridge.js +62 -64
  23. package/src/adapters/node/node-hmr-manager.js +58 -48
  24. package/src/adapters/node/runtime-host.js +96 -89
  25. package/src/adapters/node/server-adapter-dependencies.js +18 -21
  26. package/src/adapters/node/server-adapter.d.ts +0 -1
  27. package/src/adapters/node/server-adapter.js +347 -326
  28. package/src/adapters/node/static-content-server.js +172 -191
  29. package/src/adapters/node/static-preview-host.js +87 -78
  30. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  31. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  32. package/src/adapters/shared/hmr/hmr-html-response.js +46 -32
  33. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +29 -38
  34. package/src/adapters/shared/hmr/shared-hmr-manager.js +439 -425
  35. package/src/adapters/shared/http/api-request-pipeline.js +122 -119
  36. package/src/adapters/shared/http/api-response.js +77 -77
  37. package/src/adapters/shared/http/create-body-response.js +22 -19
  38. package/src/adapters/shared/http/define-api-handler.js +41 -55
  39. package/src/adapters/shared/http/explicit-static-render-preparation.js +26 -23
  40. package/src/adapters/shared/http/explicit-static-route-matcher.js +55 -62
  41. package/src/adapters/shared/http/file-route-middleware-pipeline.js +81 -75
  42. package/src/adapters/shared/http/fs-server-response-factory.js +101 -96
  43. package/src/adapters/shared/http/fs-server-response-matcher.js +239 -257
  44. package/src/adapters/shared/http/run-middleware-chain.js +15 -15
  45. package/src/adapters/shared/runtime/application-adapter.js +72 -87
  46. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +25 -22
  47. package/src/adapters/shared/runtime/port-manager.js +207 -177
  48. package/src/adapters/shared/runtime/render-context.js +94 -79
  49. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +33 -38
  50. package/src/adapters/shared/runtime/runtime-host.js +1 -0
  51. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +2 -3
  52. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +65 -51
  53. package/src/adapters/shared/runtime/server-adapter.d.ts +1 -0
  54. package/src/adapters/shared/runtime/server-adapter.js +233 -217
  55. package/src/adapters/shared/runtime/server-route-handler.js +74 -70
  56. package/src/adapters/shared/runtime/server-static-builder.js +165 -184
  57. package/src/adapters/shared/runtime/static-preview-host.js +1 -0
  58. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +97 -88
  59. package/src/adapters/shared/ws/websocket-lifecycle.js +57 -50
  60. package/src/build/README.md +52 -1
  61. package/src/build/app-build-manifest-runtime.js +129 -108
  62. package/src/build/browser/browser-runtime-manifest.js +47 -50
  63. package/src/build/browser/browser-runtime-plugin-helpers.js +32 -12
  64. package/src/build/browser/browser-runtime-plugin.js +206 -160
  65. package/src/build/browser/jsx-ownership-plugins.js +51 -37
  66. package/src/build/browser/lit-static-render-worker-context.js +3 -5
  67. package/src/build/build-adapter.js +276 -139
  68. package/src/build/cache/build-input-fingerprint.js +28 -26
  69. package/src/build/cache/cache-constants.js +4 -6
  70. package/src/build/cache/cache-keys.js +64 -56
  71. package/src/build/cache/pages-unified-graph-build.js +179 -178
  72. package/src/build/cache/production-build-cache.js +47 -54
  73. package/src/build/cache/server-entry-build-cache.js +134 -146
  74. package/src/build/contracts/build-contracts.d.ts +4 -4
  75. package/src/build/contracts/build-contracts.js +1 -0
  76. package/src/build/contracts/build-manifest.js +58 -43
  77. package/src/build/contracts/build-types.js +1 -0
  78. package/src/build/rolldown/rolldown-adapter-helpers.d.ts +9 -0
  79. package/src/build/rolldown/rolldown-adapter-helpers.js +405 -298
  80. package/src/build/rolldown/rolldown-build-adapter.js +53 -61
  81. package/src/build/rolldown/rolldown-build-invocation-metrics.js +31 -35
  82. package/src/build/rolldown/rolldown-plugin-bridge.js +264 -194
  83. package/src/build/rolldown/rolldown-source-transform-pass.js +59 -50
  84. package/src/build/rolldown/runtime-build-output-normalizer.js +227 -175
  85. package/src/build/rolldown/server-side-css-shim-plugin.js +54 -31
  86. package/src/build/runtime/build-profile-options.js +36 -36
  87. package/src/build/runtime/build-request-identity.js +70 -45
  88. package/src/build/runtime/build-request-policy.js +80 -42
  89. package/src/build/runtime/build-runtime.js +64 -54
  90. package/src/build/runtime/deduping-build-executor.js +38 -32
  91. package/src/build/runtime/parallel-build-executor.js +58 -50
  92. package/src/build/runtime/serialized-build-executor.js +78 -62
  93. package/src/cache/index.js +6 -6
  94. package/src/cache/module-parse-cache.js +99 -68
  95. package/src/client/navigation-scripts/classification.js +45 -37
  96. package/src/client/navigation-scripts/index.js +3 -23
  97. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +58 -62
  98. package/src/client/navigation-scripts/registry.js +15 -11
  99. package/src/client/navigation-scripts/rerun-queue.js +81 -64
  100. package/src/client/scroll.js +32 -24
  101. package/src/client/scroll.test.browser.js +27 -33
  102. package/src/client/view-transitions.js +68 -55
  103. package/src/config/config-builder.d.ts +8 -0
  104. package/src/config/config-builder.js +637 -642
  105. package/src/config/constants.js +44 -24
  106. package/src/declarations.d.ts +1 -0
  107. package/src/dev/README.md +24 -0
  108. package/src/dev/client-bridge-registry.js +7 -12
  109. package/src/dev/dev-client-ownership.js +7 -5
  110. package/src/dev/hmr-manager-registry.js +7 -12
  111. package/src/dev/host-runtime.js +25 -30
  112. package/src/dev/runtime-server-started-message.js +2 -5
  113. package/src/dev/sc-server.js +106 -103
  114. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  115. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  116. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  117. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  118. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  119. package/src/dev/transform-server/dev-transform-import-rewriter.js +110 -0
  120. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  121. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  122. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  123. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  124. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  125. package/src/dev/transform-server/dev-transform-server.js +191 -0
  126. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  127. package/src/dev/transform-server/dev-transform-url.js +58 -0
  128. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +27 -0
  129. package/src/dev/transform-server/dev-transform-vendor-registry.js +145 -0
  130. package/src/dev/transform-server/index.d.ts +6 -0
  131. package/src/dev/transform-server/index.js +4 -0
  132. package/src/dev/transform-server/types.d.ts +15 -0
  133. package/src/dev/transform-server/types.js +1 -0
  134. package/src/dev-toolbar/README.md +51 -0
  135. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  136. package/src/dev-toolbar/define-dev-tool.js +9 -0
  137. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  138. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  139. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  140. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  141. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  142. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  143. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  144. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  145. package/src/dev-toolbar/dev-toolbar-package.d.ts +31 -0
  146. package/src/dev-toolbar/dev-toolbar-package.js +72 -0
  147. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  148. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  149. package/src/diagnostics/request-build-dedupe.js +34 -28
  150. package/src/diagnostics/startup-trace.d.ts +10 -1
  151. package/src/diagnostics/startup-trace.js +269 -241
  152. package/src/eco/README.md +6 -0
  153. package/src/eco/eco-declared-component.js +19 -14
  154. package/src/eco/eco.browser.js +56 -69
  155. package/src/eco/eco.js +156 -96
  156. package/src/eco/eco.types.js +5 -0
  157. package/src/eco/eco.utils.js +1 -10
  158. package/src/eco/global-injector-map.js +55 -41
  159. package/src/eco/lazy-injector-map.js +90 -60
  160. package/src/eco/module-dependencies.js +52 -44
  161. package/src/eco/page-layout-normalization.js +59 -49
  162. package/src/errors/http-error.js +50 -49
  163. package/src/errors/index.js +3 -12
  164. package/src/errors/locals-access-error.js +5 -8
  165. package/src/errors/undeclared-component-dependency-error.js +15 -15
  166. package/src/global/app-logger.js +3 -6
  167. package/src/hmr/README.md +10 -0
  168. package/src/hmr/client/hmr-runtime.js +117 -113
  169. package/src/hmr/client/module-update.d.ts +13 -0
  170. package/src/hmr/client/module-update.js +39 -0
  171. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  172. package/src/hmr/hmr-asset-paths.js +22 -0
  173. package/src/hmr/hmr-entrypoint-output.d.ts +11 -39
  174. package/src/hmr/hmr-entrypoint-output.js +28 -54
  175. package/src/hmr/hmr-file-change-prep.js +13 -16
  176. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  177. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  178. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  179. package/src/hmr/hmr-runtime-paths.js +13 -0
  180. package/src/hmr/hmr-strategy.d.ts +5 -11
  181. package/src/hmr/hmr-strategy.js +113 -61
  182. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  183. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -95
  184. package/src/hmr/strategies/js-hmr-strategy.js +104 -217
  185. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +33 -27
  186. package/src/index.browser.js +1 -4
  187. package/src/index.d.ts +1 -0
  188. package/src/index.js +6 -47
  189. package/src/integrations/ghtml/ghtml-renderer.js +12 -7
  190. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  191. package/src/integrations/ghtml/ghtml.plugin.js +9 -12
  192. package/src/islands/README.md +25 -0
  193. package/src/islands/island-host.d.ts +37 -0
  194. package/src/islands/island-host.js +55 -0
  195. package/src/plugins/alias-resolver-cache.js +114 -97
  196. package/src/plugins/alias-resolver-plugin.js +33 -47
  197. package/src/plugins/define-integration.js +18 -17
  198. package/src/plugins/eco-component-meta-plugin.js +387 -145
  199. package/src/plugins/foreign-jsx-override-plugin.js +49 -35
  200. package/src/plugins/integration-plugin.js +212 -203
  201. package/src/plugins/jsx-import-source.utils.js +16 -21
  202. package/src/plugins/processor.js +159 -149
  203. package/src/plugins/runtime-capability.js +1 -0
  204. package/src/plugins/source-transform.js +109 -79
  205. package/src/plugins/tsconfig-import-resolver.d.ts +17 -0
  206. package/src/plugins/tsconfig-import-resolver.js +218 -142
  207. package/src/route-renderer/README.md +12 -1
  208. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +143 -136
  209. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +33 -27
  210. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +173 -126
  211. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +165 -154
  212. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +329 -341
  213. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +33 -32
  214. package/src/route-renderer/orchestration/integration-renderer.d.ts +1 -0
  215. package/src/route-renderer/orchestration/integration-renderer.js +731 -750
  216. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +168 -172
  217. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +119 -131
  218. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +82 -91
  219. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +82 -76
  220. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +29 -31
  221. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +10 -6
  222. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +31 -28
  223. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +3 -0
  224. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +430 -413
  225. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +191 -212
  226. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +20 -24
  227. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +4 -0
  228. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +24 -24
  229. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +22 -24
  230. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +41 -34
  231. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +5 -0
  232. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +42 -22
  233. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +50 -48
  234. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +29 -32
  235. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +150 -156
  236. package/src/route-renderer/orchestration/string-markup-renderer.js +48 -51
  237. package/src/route-renderer/page-loading/component-dependency-collection.js +120 -124
  238. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  239. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  240. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +68 -54
  241. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  242. package/src/route-renderer/page-loading/lazy-trigger-planning.js +46 -36
  243. package/src/route-renderer/page-loading/module-declaration-aggregation.js +38 -31
  244. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  245. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  246. package/src/route-renderer/page-loading/page-module-loader.js +130 -124
  247. package/src/route-renderer/route-renderer.js +74 -76
  248. package/src/router/client/link-intent.js +55 -39
  249. package/src/router/client/link-intent.test.browser.js +49 -49
  250. package/src/router/client/link-navigation-policy.js +114 -93
  251. package/src/router/client/link-navigation-policy.test.browser.js +70 -80
  252. package/src/router/client/navigation-coordinator.js +235 -211
  253. package/src/router/server/route-registry.js +237 -242
  254. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
  255. package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
  256. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  257. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  258. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  259. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
  260. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
  261. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
  262. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
  263. package/src/services/assets/asset-processing-service/index.js +8 -8
  264. package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
  265. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
  266. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  267. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  268. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  269. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  270. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
  271. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  272. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
  273. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
  274. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  275. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
  276. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
  277. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
  278. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
  279. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
  280. package/src/services/assets/browser-bundle.service.js +52 -47
  281. package/src/services/cache/cache.types.js +5 -0
  282. package/src/services/cache/index.js +6 -7
  283. package/src/services/cache/memory-cache-store.js +101 -89
  284. package/src/services/cache/page-cache-service.js +156 -145
  285. package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
  286. package/src/services/html/html-rewriter-provider.service.js +61 -61
  287. package/src/services/html/html-transformer.service.js +249 -266
  288. package/src/services/invalidation/development-invalidation.service.js +252 -241
  289. package/src/services/module-loading/app-module-loader.service.js +1 -0
  290. package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
  291. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  292. package/src/services/module-loading/module-loading-types.js +1 -0
  293. package/src/services/module-loading/page-module-import.service.js +235 -243
  294. package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
  295. package/src/services/module-loading/route-module-build-cache.js +3 -38
  296. package/src/services/module-loading/route-module-build-cache.store.js +195 -200
  297. package/src/services/module-loading/route-module-build-manifest.js +61 -74
  298. package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
  299. package/src/services/module-loading/server-module-transpiler.service.js +68 -62
  300. package/src/services/module-loading/source-module-support.js +15 -7
  301. package/src/services/runtime-state/dev-graph.service.js +165 -157
  302. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  303. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  304. package/src/services/validation/schema-validation-service.js +157 -95
  305. package/src/services/validation/standard-schema.types.js +1 -0
  306. package/src/services/validation/validate-standard-schema.js +13 -13
  307. package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
  308. package/src/static-site-generator/sitemap-routes.js +33 -28
  309. package/src/static-site-generator/sitemap.js +38 -29
  310. package/src/static-site-generator/static-build-invalidation.js +34 -56
  311. package/src/static-site-generator/static-export-context.js +1 -0
  312. package/src/static-site-generator/static-site-generator.js +517 -553
  313. package/src/types/internal-types.d.ts +19 -3
  314. package/src/types/internal-types.js +1 -0
  315. package/src/types/public-types.d.ts +16 -46
  316. package/src/types/public-types.js +1 -0
  317. package/src/utils/deep-merge.js +39 -26
  318. package/src/utils/ecopages-route-info.js +27 -23
  319. package/src/utils/hash.js +3 -6
  320. package/src/utils/html-escaping.js +21 -8
  321. package/src/utils/html.js +1 -4
  322. package/src/utils/invariant.js +11 -10
  323. package/src/utils/locals-utils.js +32 -22
  324. package/src/utils/parse-cli-args.js +73 -65
  325. package/src/utils/path-pattern.js +38 -23
  326. package/src/utils/path-utils.module.js +8 -11
  327. package/src/utils/resolve-entry-file.js +70 -38
  328. package/src/utils/resolve-work-dir.js +23 -27
  329. package/src/utils/runtime.js +24 -33
  330. package/src/utils/server-utils.module.js +60 -52
  331. package/src/utils/static-file-extensions.js +52 -46
  332. package/src/watchers/project-watcher-ignore.js +16 -15
  333. package/src/watchers/project-watcher.js +385 -366
  334. package/src/watchers/project-watcher.test-helpers.js +45 -50
  335. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
  336. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
  337. package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
  338. package/src/build/cache/dev-browser-script-cache.js +0 -90
@@ -1,225 +1,249 @@
1
- const ECO_DOCUMENT_OWNER_ATTRIBUTE = "data-eco-document-owner";
2
- function getEcoDocumentOwner(doc) {
3
- const owner = doc.documentElement.getAttribute(ECO_DOCUMENT_OWNER_ATTRIBUTE);
4
- return owner && owner.length > 0 ? owner : null;
1
+ /**
2
+ * Shared browser-side navigation coordinator.
3
+ *
4
+ * This module is the client runtime contract used by browser-router,
5
+ * react-router, and HMR code to coordinate ownership, cross-runtime handoff,
6
+ * current-page reloads, and stale-navigation cancellation.
7
+ *
8
+ * The coordinator stays framework-agnostic: browser runtimes register their
9
+ * capabilities here, and the coordinator arbitrates which runtime currently
10
+ * owns the document and which navigation transaction is still current.
11
+ *
12
+ * @module
13
+ */
14
+ /** HTML attribute used to persist the rendered document owner across navigations. */
15
+ export const ECO_DOCUMENT_OWNER_ATTRIBUTE = 'data-eco-document-owner';
16
+ /**
17
+ * Reads the explicit browser document owner marker from a rendered HTML document.
18
+ *
19
+ * Documents without a marker return `null`, allowing runtimes to fall back to
20
+ * their local default behavior without scanning hydration scripts.
21
+ */
22
+ export function getEcoDocumentOwner(doc) {
23
+ const owner = doc.documentElement.getAttribute(ECO_DOCUMENT_OWNER_ATTRIBUTE);
24
+ return owner && owner.length > 0 ? owner : null;
5
25
  }
6
26
  function getCandidateOwners(currentOwner, registrations, excludedOwner) {
7
- const owners = [];
8
- if (currentOwner !== "none" && currentOwner !== excludedOwner) {
9
- owners.push(currentOwner);
10
- }
11
- for (const owner of registrations.keys()) {
12
- if (owner === currentOwner || owner === excludedOwner) {
13
- continue;
27
+ const owners = [];
28
+ if (currentOwner !== 'none' && currentOwner !== excludedOwner) {
29
+ owners.push(currentOwner);
14
30
  }
15
- owners.push(owner);
16
- }
17
- return owners;
31
+ for (const owner of registrations.keys()) {
32
+ if (owner === currentOwner || owner === excludedOwner) {
33
+ continue;
34
+ }
35
+ owners.push(owner);
36
+ }
37
+ return owners;
18
38
  }
19
39
  function createEcoNavigationRuntime() {
20
- const registrations = /* @__PURE__ */ new Map();
21
- const listeners = /* @__PURE__ */ new Set();
22
- let owner = "none";
23
- let navigationSequence = 0;
24
- let navigationAbortController = null;
25
- const emit = (event) => {
26
- for (const listener of listeners) {
27
- listener(event);
28
- }
29
- };
30
- const updateOwner = (nextOwner, reason) => {
31
- if (owner === nextOwner) {
32
- return;
33
- }
34
- const previousOwner = owner;
35
- owner = nextOwner;
36
- emit({
37
- type: "owner-change",
38
- owner: nextOwner,
39
- previousOwner,
40
- reason
41
- });
42
- };
43
- const cancelNavigationTransaction = (navigationId, abortController) => {
44
- if (navigationSequence !== navigationId || navigationAbortController !== abortController) {
45
- return;
46
- }
47
- navigationSequence += 1;
48
- navigationAbortController = null;
49
- abortController.abort();
50
- };
51
- const completeNavigationTransaction = (navigationId, abortController) => {
52
- if (navigationSequence !== navigationId || navigationAbortController !== abortController) {
53
- return;
54
- }
55
- navigationAbortController = null;
56
- };
57
- const runtime = {
58
- getOwnerState() {
59
- const activeRuntime = registrations.get(owner);
60
- return {
61
- owner,
62
- canHandleSpaNavigation: typeof activeRuntime?.navigate === "function"
63
- };
64
- },
65
- hasPendingNavigationTransaction() {
66
- return navigationAbortController !== null;
67
- },
68
- beginNavigationTransaction() {
69
- navigationAbortController?.abort();
70
- const abortController = new AbortController();
71
- const navigationId = ++navigationSequence;
72
- navigationAbortController = abortController;
73
- return {
74
- id: navigationId,
75
- signal: abortController.signal,
76
- isCurrent: () => navigationSequence === navigationId && navigationAbortController === abortController,
77
- cancel: () => {
78
- cancelNavigationTransaction(navigationId, abortController);
79
- },
80
- complete: () => {
81
- completeNavigationTransaction(navigationId, abortController);
40
+ const registrations = new Map();
41
+ const listeners = new Set();
42
+ let owner = 'none';
43
+ let navigationSequence = 0;
44
+ let navigationAbortController = null;
45
+ const emit = (event) => {
46
+ for (const listener of listeners) {
47
+ listener(event);
82
48
  }
83
- };
84
- },
85
- cancelCurrentNavigationTransaction() {
86
- if (!navigationAbortController) {
87
- return;
88
- }
89
- cancelNavigationTransaction(navigationSequence, navigationAbortController);
90
- },
91
- setOwner(nextOwner) {
92
- updateOwner(nextOwner, "set");
93
- },
94
- claimOwnership(nextOwner) {
95
- updateOwner(nextOwner, "claim");
96
- },
97
- releaseOwnership(currentOwner) {
98
- if (owner !== currentOwner) {
99
- return;
100
- }
101
- updateOwner("none", "release");
102
- },
103
- resolveDocumentOwner(doc, fallbackOwner = "none") {
104
- return getEcoDocumentOwner(doc) ?? fallbackOwner;
105
- },
106
- adoptDocumentOwner(doc, fallbackOwner = "none") {
107
- const nextOwner = runtime.resolveDocumentOwner(doc, fallbackOwner);
108
- updateOwner(nextOwner, "document");
109
- return nextOwner;
110
- },
111
- isOwnedByAnotherRuntime(candidateOwner) {
112
- return owner !== "none" && owner !== candidateOwner;
113
- },
114
- subscribe(listener) {
115
- listeners.add(listener);
116
- return () => {
117
- listeners.delete(listener);
118
- };
119
- },
120
- register(registration) {
121
- registrations.set(registration.owner, registration);
122
- emit({
123
- type: "registration-change",
124
- owner: registration.owner,
125
- status: "registered"
126
- });
127
- return () => {
128
- const currentRegistration = registrations.get(registration.owner);
129
- if (currentRegistration !== registration) {
130
- return;
49
+ };
50
+ const updateOwner = (nextOwner, reason) => {
51
+ if (owner === nextOwner) {
52
+ return;
131
53
  }
132
- registrations.delete(registration.owner);
54
+ const previousOwner = owner;
55
+ owner = nextOwner;
133
56
  emit({
134
- type: "registration-change",
135
- owner: registration.owner,
136
- status: "unregistered"
57
+ type: 'owner-change',
58
+ owner: nextOwner,
59
+ previousOwner,
60
+ reason,
137
61
  });
138
- if (owner === registration.owner) {
139
- updateOwner("none", "unregister");
140
- }
141
- };
142
- },
143
- async requestNavigation(request) {
144
- for (const candidateOwner of getCandidateOwners(owner, registrations, request.source)) {
145
- const registration = registrations.get(candidateOwner);
146
- if (!registration?.navigate) {
147
- continue;
62
+ };
63
+ const cancelNavigationTransaction = (navigationId, abortController) => {
64
+ if (navigationSequence !== navigationId || navigationAbortController !== abortController) {
65
+ return;
148
66
  }
149
- const handled = await registration.navigate(request);
150
- if (handled !== false) {
151
- return true;
67
+ navigationSequence += 1;
68
+ navigationAbortController = null;
69
+ abortController.abort();
70
+ };
71
+ const completeNavigationTransaction = (navigationId, abortController) => {
72
+ if (navigationSequence !== navigationId || navigationAbortController !== abortController) {
73
+ return;
152
74
  }
153
- }
154
- return false;
155
- },
156
- async requestHandoff(request) {
157
- if (request.targetOwner === "none") {
158
- return false;
159
- }
160
- if (request.isStaleSourceNavigation?.()) {
161
- return true;
162
- }
163
- const registration = registrations.get(request.targetOwner);
164
- if (!registration?.handoffNavigation) {
165
- return false;
166
- }
167
- if (request.isStaleSourceNavigation?.()) {
168
- return true;
169
- }
170
- const handled = await registration.handoffNavigation(request);
171
- return handled !== false;
172
- },
173
- async reloadCurrentPage(request) {
174
- for (const candidateOwner of getCandidateOwners(owner, registrations)) {
175
- const registration = registrations.get(candidateOwner);
176
- if (!registration?.reloadCurrentPage) {
177
- continue;
178
- }
179
- const handled = await registration.reloadCurrentPage(request);
180
- return handled !== false;
181
- }
182
- return false;
183
- },
184
- async cleanupOwner(targetOwner) {
185
- if (targetOwner === "none") {
186
- return;
187
- }
188
- const registration = registrations.get(targetOwner);
189
- if (!registration?.cleanupBeforeHandoff) {
190
- return;
191
- }
192
- await registration.cleanupBeforeHandoff();
193
- if (owner === targetOwner) {
194
- updateOwner("none", "release");
195
- }
196
- },
197
- async cleanupCurrentOwner() {
198
- await runtime.cleanupOwner(owner);
75
+ navigationAbortController = null;
76
+ };
77
+ const runtime = {
78
+ getOwnerState() {
79
+ const activeRuntime = registrations.get(owner);
80
+ return {
81
+ owner,
82
+ canHandleSpaNavigation: typeof activeRuntime?.navigate === 'function',
83
+ };
84
+ },
85
+ hasPendingNavigationTransaction() {
86
+ return navigationAbortController !== null;
87
+ },
88
+ beginNavigationTransaction() {
89
+ navigationAbortController?.abort();
90
+ const abortController = new AbortController();
91
+ const navigationId = ++navigationSequence;
92
+ navigationAbortController = abortController;
93
+ return {
94
+ id: navigationId,
95
+ signal: abortController.signal,
96
+ isCurrent: () => navigationSequence === navigationId && navigationAbortController === abortController,
97
+ cancel: () => {
98
+ cancelNavigationTransaction(navigationId, abortController);
99
+ },
100
+ complete: () => {
101
+ completeNavigationTransaction(navigationId, abortController);
102
+ },
103
+ };
104
+ },
105
+ cancelCurrentNavigationTransaction() {
106
+ if (!navigationAbortController) {
107
+ return;
108
+ }
109
+ cancelNavigationTransaction(navigationSequence, navigationAbortController);
110
+ },
111
+ setOwner(nextOwner) {
112
+ updateOwner(nextOwner, 'set');
113
+ },
114
+ claimOwnership(nextOwner) {
115
+ updateOwner(nextOwner, 'claim');
116
+ },
117
+ releaseOwnership(currentOwner) {
118
+ if (owner !== currentOwner) {
119
+ return;
120
+ }
121
+ updateOwner('none', 'release');
122
+ },
123
+ resolveDocumentOwner(doc, fallbackOwner = 'none') {
124
+ return getEcoDocumentOwner(doc) ?? fallbackOwner;
125
+ },
126
+ adoptDocumentOwner(doc, fallbackOwner = 'none') {
127
+ const nextOwner = runtime.resolveDocumentOwner(doc, fallbackOwner);
128
+ updateOwner(nextOwner, 'document');
129
+ return nextOwner;
130
+ },
131
+ isOwnedByAnotherRuntime(candidateOwner) {
132
+ return owner !== 'none' && owner !== candidateOwner;
133
+ },
134
+ subscribe(listener) {
135
+ listeners.add(listener);
136
+ return () => {
137
+ listeners.delete(listener);
138
+ };
139
+ },
140
+ register(registration) {
141
+ registrations.set(registration.owner, registration);
142
+ emit({
143
+ type: 'registration-change',
144
+ owner: registration.owner,
145
+ status: 'registered',
146
+ });
147
+ return () => {
148
+ const currentRegistration = registrations.get(registration.owner);
149
+ if (currentRegistration !== registration) {
150
+ return;
151
+ }
152
+ registrations.delete(registration.owner);
153
+ emit({
154
+ type: 'registration-change',
155
+ owner: registration.owner,
156
+ status: 'unregistered',
157
+ });
158
+ if (owner === registration.owner) {
159
+ updateOwner('none', 'unregister');
160
+ }
161
+ };
162
+ },
163
+ async requestNavigation(request) {
164
+ for (const candidateOwner of getCandidateOwners(owner, registrations, request.source)) {
165
+ const registration = registrations.get(candidateOwner);
166
+ if (!registration?.navigate) {
167
+ continue;
168
+ }
169
+ const handled = await registration.navigate(request);
170
+ if (handled !== false) {
171
+ return true;
172
+ }
173
+ }
174
+ return false;
175
+ },
176
+ async requestHandoff(request) {
177
+ if (request.targetOwner === 'none') {
178
+ return false;
179
+ }
180
+ if (request.isStaleSourceNavigation?.()) {
181
+ return true;
182
+ }
183
+ const registration = registrations.get(request.targetOwner);
184
+ if (!registration?.handoffNavigation) {
185
+ return false;
186
+ }
187
+ if (request.isStaleSourceNavigation?.()) {
188
+ return true;
189
+ }
190
+ const handled = await registration.handoffNavigation(request);
191
+ return handled !== false;
192
+ },
193
+ async reloadCurrentPage(request) {
194
+ for (const candidateOwner of getCandidateOwners(owner, registrations)) {
195
+ const registration = registrations.get(candidateOwner);
196
+ if (!registration?.reloadCurrentPage) {
197
+ continue;
198
+ }
199
+ const handled = await registration.reloadCurrentPage(request);
200
+ return handled !== false;
201
+ }
202
+ return false;
203
+ },
204
+ async cleanupOwner(targetOwner) {
205
+ if (targetOwner === 'none') {
206
+ return;
207
+ }
208
+ const registration = registrations.get(targetOwner);
209
+ if (!registration?.cleanupBeforeHandoff) {
210
+ return;
211
+ }
212
+ await registration.cleanupBeforeHandoff();
213
+ if (owner === targetOwner) {
214
+ updateOwner('none', 'release');
215
+ }
216
+ },
217
+ async cleanupCurrentOwner() {
218
+ await runtime.cleanupOwner(owner);
219
+ },
220
+ };
221
+ if (typeof window !== 'undefined') {
222
+ window.addEventListener('pageshow', (event) => {
223
+ if (event.persisted) {
224
+ runtime.cancelCurrentNavigationTransaction();
225
+ }
226
+ });
227
+ window.addEventListener('pagehide', () => {
228
+ runtime.cancelCurrentNavigationTransaction();
229
+ });
199
230
  }
200
- };
201
- if (typeof window !== "undefined") {
202
- window.addEventListener("pageshow", (event) => {
203
- if (event.persisted) {
204
- runtime.cancelCurrentNavigationTransaction();
205
- }
206
- });
207
- window.addEventListener("pagehide", () => {
208
- runtime.cancelCurrentNavigationTransaction();
209
- });
210
- }
211
- return runtime;
231
+ return runtime;
212
232
  }
213
- function getEcoNavigationRuntime(windowObject = window) {
214
- const runtimeWindow = windowObject;
215
- runtimeWindow.__ECO_PAGES__ = runtimeWindow.__ECO_PAGES__ || {};
216
- if (!runtimeWindow.__ECO_PAGES__.navigation) {
217
- runtimeWindow.__ECO_PAGES__.navigation = createEcoNavigationRuntime();
218
- }
219
- return runtimeWindow.__ECO_PAGES__.navigation;
233
+ /**
234
+ * Returns the singleton browser-side navigation coordinator.
235
+ *
236
+ * The coordinator centralizes ownership, handoff, and current-page reload
237
+ * requests across browser runtimes through one internal protocol.
238
+ *
239
+ * @param windowObject - Window-like object that stores the singleton runtime.
240
+ * @returns The shared browser navigation coordinator.
241
+ */
242
+ export function getEcoNavigationRuntime(windowObject = window) {
243
+ const runtimeWindow = windowObject;
244
+ runtimeWindow.__ECO_PAGES__ = runtimeWindow.__ECO_PAGES__ || {};
245
+ if (!runtimeWindow.__ECO_PAGES__.navigation) {
246
+ runtimeWindow.__ECO_PAGES__.navigation = createEcoNavigationRuntime();
247
+ }
248
+ return runtimeWindow.__ECO_PAGES__.navigation;
220
249
  }
221
- export {
222
- ECO_DOCUMENT_OWNER_ATTRIBUTE,
223
- getEcoDocumentOwner,
224
- getEcoNavigationRuntime
225
- };