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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/README.md +1 -0
  2. package/package.json +90 -3
  3. package/src/adapters/abstract/application-adapter.d.ts +0 -8
  4. package/src/adapters/abstract/application-adapter.js +252 -261
  5. package/src/adapters/abstract/router-adapter.js +12 -4
  6. package/src/adapters/abstract/segment-path-matcher.js +132 -134
  7. package/src/adapters/abstract/server-adapter.js +22 -14
  8. package/src/adapters/abstract/ws-pattern-matcher.js +24 -26
  9. package/src/adapters/bun/bun-user-websocket-lifecycle.js +83 -86
  10. package/src/adapters/bun/client-bridge.js +51 -50
  11. package/src/adapters/bun/create-app.js +171 -161
  12. package/src/adapters/bun/hmr-manager.js +62 -57
  13. package/src/adapters/bun/index.js +2 -31
  14. package/src/adapters/bun/runtime-host.js +61 -54
  15. package/src/adapters/bun/server-adapter.d.ts +0 -1
  16. package/src/adapters/bun/server-adapter.js +561 -561
  17. package/src/adapters/bun/static-preview-host.js +43 -46
  18. package/src/adapters/create-app.js +11 -14
  19. package/src/adapters/index.js +2 -30
  20. package/src/adapters/node/create-app.js +123 -129
  21. package/src/adapters/node/http-request-bridge.js +147 -106
  22. package/src/adapters/node/node-client-bridge.js +62 -64
  23. package/src/adapters/node/node-hmr-manager.js +58 -48
  24. package/src/adapters/node/runtime-host.js +96 -89
  25. package/src/adapters/node/server-adapter-dependencies.js +18 -21
  26. package/src/adapters/node/server-adapter.d.ts +0 -1
  27. package/src/adapters/node/server-adapter.js +347 -326
  28. package/src/adapters/node/static-content-server.js +172 -191
  29. package/src/adapters/node/static-preview-host.js +87 -78
  30. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  31. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  32. package/src/adapters/shared/hmr/hmr-html-response.js +46 -32
  33. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +29 -38
  34. package/src/adapters/shared/hmr/shared-hmr-manager.js +439 -425
  35. package/src/adapters/shared/http/api-request-pipeline.js +122 -119
  36. package/src/adapters/shared/http/api-response.js +77 -77
  37. package/src/adapters/shared/http/create-body-response.js +22 -19
  38. package/src/adapters/shared/http/define-api-handler.js +41 -55
  39. package/src/adapters/shared/http/explicit-static-render-preparation.js +26 -23
  40. package/src/adapters/shared/http/explicit-static-route-matcher.js +55 -62
  41. package/src/adapters/shared/http/file-route-middleware-pipeline.js +81 -75
  42. package/src/adapters/shared/http/fs-server-response-factory.js +101 -96
  43. package/src/adapters/shared/http/fs-server-response-matcher.js +239 -257
  44. package/src/adapters/shared/http/run-middleware-chain.js +15 -15
  45. package/src/adapters/shared/runtime/application-adapter.js +72 -87
  46. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +25 -22
  47. package/src/adapters/shared/runtime/port-manager.js +207 -177
  48. package/src/adapters/shared/runtime/render-context.js +94 -79
  49. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +33 -38
  50. package/src/adapters/shared/runtime/runtime-host.js +1 -0
  51. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +2 -3
  52. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +65 -51
  53. package/src/adapters/shared/runtime/server-adapter.d.ts +1 -0
  54. package/src/adapters/shared/runtime/server-adapter.js +233 -217
  55. package/src/adapters/shared/runtime/server-route-handler.js +74 -70
  56. package/src/adapters/shared/runtime/server-static-builder.js +165 -184
  57. package/src/adapters/shared/runtime/static-preview-host.js +1 -0
  58. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +97 -88
  59. package/src/adapters/shared/ws/websocket-lifecycle.js +57 -50
  60. package/src/build/README.md +52 -1
  61. package/src/build/app-build-manifest-runtime.js +129 -108
  62. package/src/build/browser/browser-runtime-manifest.js +47 -50
  63. package/src/build/browser/browser-runtime-plugin-helpers.js +32 -12
  64. package/src/build/browser/browser-runtime-plugin.js +206 -160
  65. package/src/build/browser/jsx-ownership-plugins.js +51 -37
  66. package/src/build/browser/lit-static-render-worker-context.js +3 -5
  67. package/src/build/build-adapter.js +276 -139
  68. package/src/build/cache/build-input-fingerprint.js +28 -26
  69. package/src/build/cache/cache-constants.js +4 -6
  70. package/src/build/cache/cache-keys.js +64 -56
  71. package/src/build/cache/pages-unified-graph-build.js +179 -178
  72. package/src/build/cache/production-build-cache.js +47 -54
  73. package/src/build/cache/server-entry-build-cache.js +134 -146
  74. package/src/build/contracts/build-contracts.d.ts +4 -4
  75. package/src/build/contracts/build-contracts.js +1 -0
  76. package/src/build/contracts/build-manifest.js +58 -43
  77. package/src/build/contracts/build-types.js +1 -0
  78. package/src/build/rolldown/rolldown-adapter-helpers.d.ts +9 -0
  79. package/src/build/rolldown/rolldown-adapter-helpers.js +405 -298
  80. package/src/build/rolldown/rolldown-build-adapter.js +53 -61
  81. package/src/build/rolldown/rolldown-build-invocation-metrics.js +31 -35
  82. package/src/build/rolldown/rolldown-plugin-bridge.js +264 -194
  83. package/src/build/rolldown/rolldown-source-transform-pass.js +59 -50
  84. package/src/build/rolldown/runtime-build-output-normalizer.js +227 -175
  85. package/src/build/rolldown/server-side-css-shim-plugin.js +54 -31
  86. package/src/build/runtime/build-profile-options.js +36 -36
  87. package/src/build/runtime/build-request-identity.js +70 -45
  88. package/src/build/runtime/build-request-policy.js +80 -42
  89. package/src/build/runtime/build-runtime.js +64 -54
  90. package/src/build/runtime/deduping-build-executor.js +38 -32
  91. package/src/build/runtime/parallel-build-executor.js +58 -50
  92. package/src/build/runtime/serialized-build-executor.js +78 -62
  93. package/src/cache/index.js +6 -6
  94. package/src/cache/module-parse-cache.js +99 -68
  95. package/src/client/navigation-scripts/classification.js +45 -37
  96. package/src/client/navigation-scripts/index.js +3 -23
  97. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +58 -62
  98. package/src/client/navigation-scripts/registry.js +15 -11
  99. package/src/client/navigation-scripts/rerun-queue.js +81 -64
  100. package/src/client/scroll.js +32 -24
  101. package/src/client/scroll.test.browser.js +27 -33
  102. package/src/client/view-transitions.js +68 -55
  103. package/src/config/config-builder.d.ts +8 -0
  104. package/src/config/config-builder.js +637 -642
  105. package/src/config/constants.js +44 -24
  106. package/src/declarations.d.ts +1 -0
  107. package/src/dev/README.md +24 -0
  108. package/src/dev/client-bridge-registry.js +7 -12
  109. package/src/dev/dev-client-ownership.js +7 -5
  110. package/src/dev/hmr-manager-registry.js +7 -12
  111. package/src/dev/host-runtime.js +25 -30
  112. package/src/dev/runtime-server-started-message.js +2 -5
  113. package/src/dev/sc-server.js +106 -103
  114. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  115. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  116. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  117. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  118. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  119. package/src/dev/transform-server/dev-transform-import-rewriter.js +110 -0
  120. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  121. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  122. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  123. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  124. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  125. package/src/dev/transform-server/dev-transform-server.js +191 -0
  126. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  127. package/src/dev/transform-server/dev-transform-url.js +58 -0
  128. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +27 -0
  129. package/src/dev/transform-server/dev-transform-vendor-registry.js +145 -0
  130. package/src/dev/transform-server/index.d.ts +6 -0
  131. package/src/dev/transform-server/index.js +4 -0
  132. package/src/dev/transform-server/types.d.ts +15 -0
  133. package/src/dev/transform-server/types.js +1 -0
  134. package/src/dev-toolbar/README.md +51 -0
  135. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  136. package/src/dev-toolbar/define-dev-tool.js +9 -0
  137. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  138. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  139. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  140. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  141. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  142. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  143. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  144. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  145. package/src/dev-toolbar/dev-toolbar-package.d.ts +31 -0
  146. package/src/dev-toolbar/dev-toolbar-package.js +72 -0
  147. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  148. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  149. package/src/diagnostics/request-build-dedupe.js +34 -28
  150. package/src/diagnostics/startup-trace.d.ts +10 -1
  151. package/src/diagnostics/startup-trace.js +269 -241
  152. package/src/eco/README.md +6 -0
  153. package/src/eco/eco-declared-component.js +19 -14
  154. package/src/eco/eco.browser.js +56 -69
  155. package/src/eco/eco.js +156 -96
  156. package/src/eco/eco.types.js +5 -0
  157. package/src/eco/eco.utils.js +1 -10
  158. package/src/eco/global-injector-map.js +55 -41
  159. package/src/eco/lazy-injector-map.js +90 -60
  160. package/src/eco/module-dependencies.js +52 -44
  161. package/src/eco/page-layout-normalization.js +59 -49
  162. package/src/errors/http-error.js +50 -49
  163. package/src/errors/index.js +3 -12
  164. package/src/errors/locals-access-error.js +5 -8
  165. package/src/errors/undeclared-component-dependency-error.js +15 -15
  166. package/src/global/app-logger.js +3 -6
  167. package/src/hmr/README.md +10 -0
  168. package/src/hmr/client/hmr-runtime.js +117 -113
  169. package/src/hmr/client/module-update.d.ts +13 -0
  170. package/src/hmr/client/module-update.js +39 -0
  171. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  172. package/src/hmr/hmr-asset-paths.js +22 -0
  173. package/src/hmr/hmr-entrypoint-output.d.ts +11 -39
  174. package/src/hmr/hmr-entrypoint-output.js +28 -54
  175. package/src/hmr/hmr-file-change-prep.js +13 -16
  176. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  177. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  178. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  179. package/src/hmr/hmr-runtime-paths.js +13 -0
  180. package/src/hmr/hmr-strategy.d.ts +5 -11
  181. package/src/hmr/hmr-strategy.js +113 -61
  182. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  183. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -95
  184. package/src/hmr/strategies/js-hmr-strategy.js +104 -217
  185. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +33 -27
  186. package/src/index.browser.js +1 -4
  187. package/src/index.d.ts +1 -0
  188. package/src/index.js +6 -47
  189. package/src/integrations/ghtml/ghtml-renderer.js +12 -7
  190. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  191. package/src/integrations/ghtml/ghtml.plugin.js +9 -12
  192. package/src/islands/README.md +25 -0
  193. package/src/islands/island-host.d.ts +37 -0
  194. package/src/islands/island-host.js +55 -0
  195. package/src/plugins/alias-resolver-cache.js +114 -97
  196. package/src/plugins/alias-resolver-plugin.js +33 -47
  197. package/src/plugins/define-integration.js +18 -17
  198. package/src/plugins/eco-component-meta-plugin.js +387 -145
  199. package/src/plugins/foreign-jsx-override-plugin.js +49 -35
  200. package/src/plugins/integration-plugin.js +212 -203
  201. package/src/plugins/jsx-import-source.utils.js +16 -21
  202. package/src/plugins/processor.js +159 -149
  203. package/src/plugins/runtime-capability.js +1 -0
  204. package/src/plugins/source-transform.js +109 -79
  205. package/src/plugins/tsconfig-import-resolver.d.ts +17 -0
  206. package/src/plugins/tsconfig-import-resolver.js +218 -142
  207. package/src/route-renderer/README.md +12 -1
  208. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +143 -136
  209. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +33 -27
  210. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +173 -126
  211. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +165 -154
  212. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +329 -341
  213. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +33 -32
  214. package/src/route-renderer/orchestration/integration-renderer.d.ts +1 -0
  215. package/src/route-renderer/orchestration/integration-renderer.js +731 -750
  216. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +168 -172
  217. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +119 -131
  218. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +82 -91
  219. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +82 -76
  220. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +29 -31
  221. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +10 -6
  222. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +31 -28
  223. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +3 -0
  224. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +430 -413
  225. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +191 -212
  226. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +20 -24
  227. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +4 -0
  228. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +24 -24
  229. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +22 -24
  230. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +41 -34
  231. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +5 -0
  232. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +42 -22
  233. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +50 -48
  234. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +29 -32
  235. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +150 -156
  236. package/src/route-renderer/orchestration/string-markup-renderer.js +48 -51
  237. package/src/route-renderer/page-loading/component-dependency-collection.js +120 -124
  238. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  239. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  240. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +68 -54
  241. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  242. package/src/route-renderer/page-loading/lazy-trigger-planning.js +46 -36
  243. package/src/route-renderer/page-loading/module-declaration-aggregation.js +38 -31
  244. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  245. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  246. package/src/route-renderer/page-loading/page-module-loader.js +130 -124
  247. package/src/route-renderer/route-renderer.js +74 -76
  248. package/src/router/README.md +23 -0
  249. package/src/router/client/link-intent.js +55 -39
  250. package/src/router/client/link-intent.test.browser.js +49 -49
  251. package/src/router/client/link-navigation-policy.js +114 -93
  252. package/src/router/client/link-navigation-policy.test.browser.js +70 -80
  253. package/src/router/client/navigation-coordinator.js +235 -211
  254. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  255. package/src/router/client/navigation-lifecycle.js +50 -0
  256. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  257. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  258. package/src/router/server/route-registry.js +237 -242
  259. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
  260. package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
  261. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  262. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  263. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  264. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
  265. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
  266. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
  267. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
  268. package/src/services/assets/asset-processing-service/index.js +8 -8
  269. package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
  270. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
  271. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  272. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  273. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  274. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  275. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
  276. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  277. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
  278. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
  279. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  280. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
  281. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
  282. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
  283. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
  284. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
  285. package/src/services/assets/browser-bundle.service.js +52 -47
  286. package/src/services/cache/cache.types.js +5 -0
  287. package/src/services/cache/index.js +6 -7
  288. package/src/services/cache/memory-cache-store.js +101 -89
  289. package/src/services/cache/page-cache-service.js +156 -145
  290. package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
  291. package/src/services/html/html-rewriter-provider.service.js +61 -61
  292. package/src/services/html/html-transformer.service.js +249 -266
  293. package/src/services/invalidation/development-invalidation.service.js +252 -241
  294. package/src/services/module-loading/app-module-loader.service.js +1 -0
  295. package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
  296. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  297. package/src/services/module-loading/module-loading-types.js +1 -0
  298. package/src/services/module-loading/page-module-import.service.js +235 -243
  299. package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
  300. package/src/services/module-loading/route-module-build-cache.js +3 -38
  301. package/src/services/module-loading/route-module-build-cache.store.js +195 -200
  302. package/src/services/module-loading/route-module-build-manifest.js +61 -74
  303. package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
  304. package/src/services/module-loading/server-module-transpiler.service.js +68 -62
  305. package/src/services/module-loading/source-module-support.js +15 -7
  306. package/src/services/runtime-state/dev-graph.service.js +165 -157
  307. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  308. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  309. package/src/services/validation/schema-validation-service.js +157 -95
  310. package/src/services/validation/standard-schema.types.js +1 -0
  311. package/src/services/validation/validate-standard-schema.js +13 -13
  312. package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
  313. package/src/static-site-generator/sitemap-routes.js +33 -28
  314. package/src/static-site-generator/sitemap.js +38 -29
  315. package/src/static-site-generator/static-build-invalidation.js +34 -56
  316. package/src/static-site-generator/static-export-context.js +1 -0
  317. package/src/static-site-generator/static-site-generator.js +517 -553
  318. package/src/types/internal-types.d.ts +19 -3
  319. package/src/types/internal-types.js +1 -0
  320. package/src/types/public-types.d.ts +16 -46
  321. package/src/types/public-types.js +1 -0
  322. package/src/utils/deep-merge.js +39 -26
  323. package/src/utils/ecopages-route-info.js +27 -23
  324. package/src/utils/hash.js +3 -6
  325. package/src/utils/html-escaping.js +21 -8
  326. package/src/utils/html.js +1 -4
  327. package/src/utils/invariant.js +11 -10
  328. package/src/utils/locals-utils.js +32 -22
  329. package/src/utils/parse-cli-args.js +73 -65
  330. package/src/utils/path-pattern.js +38 -23
  331. package/src/utils/path-utils.module.js +8 -11
  332. package/src/utils/resolve-entry-file.js +70 -38
  333. package/src/utils/resolve-work-dir.js +23 -27
  334. package/src/utils/runtime.js +24 -33
  335. package/src/utils/server-utils.module.js +60 -52
  336. package/src/utils/static-file-extensions.js +52 -46
  337. package/src/watchers/project-watcher-ignore.js +16 -15
  338. package/src/watchers/project-watcher.js +385 -366
  339. package/src/watchers/project-watcher.test-helpers.js +45 -50
  340. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
  341. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
  342. package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
  343. package/src/build/cache/dev-browser-script-cache.js +0 -90
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,51 @@
1
+ # Dev toolbar (core)
2
+
3
+ Server-side wiring for the development-only in-browser inspector. Public docs: [Dev toolbar](/docs/core/dev-toolbar).
4
+
5
+ ## Boundaries
6
+
7
+ | Layer | Owns |
8
+ | ----------------------------------------- | ------------------------------------------------------------------------------------------------- |
9
+ | **Core** (`DevToolbarHost`) | Enablement, `/_dev_toolbar.js` delivery, per-route `#__ECO_DEV_MANIFEST__`, HTML script injection |
10
+ | **Client package** (`devToolbar.package`) | Dock UI, panels, and any extra apps |
11
+ | **Integrations** | Page rendering and browser assets — not toolbar dock apps |
12
+
13
+ Extend the toolbar by setting `devToolbar.package` to your own client package (or `@ecopages/dev-toolbar`). Integrations do not register dock apps.
14
+
15
+ ## Module map
16
+
17
+ | File | Role |
18
+ | ------------------------------ | ------------------------------------------------------------------- |
19
+ | `dev-toolbar-host.ts` | Enablement, manifest contribution, runtime bundling, HTML injection |
20
+ | `dev-toolbar-manifest.ts` | Builds and serializes the per-page dev manifest |
21
+ | `dev-toolbar-package.ts` | Resolves `devToolbar.package` bootstrap entry from the app project |
22
+ | `dev-toolbar-config.ts` | `isDevToolbarEnabled` — watch mode, env var, package required |
23
+ | `dev-toolbar-html-response.ts` | Adapter helpers for injecting `import '/_dev_toolbar.js'` |
24
+ | `dev-toolbar-runtime-paths.ts` | `/_dev_toolbar.js` URL and work-dir paths |
25
+ | `define-dev-tool.ts` | Config helper for bring-your-own client packages |
26
+
27
+ ## Injection order
28
+
29
+ 1. Route HTML is finalized with `#__ECO_DEV_MANIFEST__` appended to `<body>` (`route-html-finalization.service.ts`).
30
+ 2. The server adapter injects `import '/_dev_toolbar.js'` before `</html>` when the toolbar is enabled (`server-adapter.ts` → `DevToolbarHost.injectHtmlResponse`).
31
+ 3. HMR manager copies or bundles the configured client package to `/_dev_toolbar.js` during watch mode (`shared-hmr-manager.ts`).
32
+
33
+ ## Config
34
+
35
+ ```ts
36
+ import { devToolbar } from '@ecopages/dev-toolbar/config';
37
+
38
+ .setDevToolbar(devToolbar())
39
+ ```
40
+
41
+ Bring-your-own client:
42
+
43
+ ```ts
44
+ import { defineDevTool } from '@ecopages/core/dev-toolbar/define-dev-tool';
45
+
46
+ .setDevToolbar(defineDevTool('@acme/my-dev-toolbar'))
47
+ ```
48
+
49
+ Disable per project with `devToolbar: { enabled: false }`, or per process with `ECOPAGES_DEV_TOOLBAR=false`.
50
+
51
+ Parent index: [dev/README.md](../dev/README.md).
@@ -0,0 +1,21 @@
1
+ import type { DevToolbarConfig } from './dev-toolbar-config.js';
2
+ export type DefineDevToolOptions = {
3
+ /**
4
+ * Client package resolved from the application project.
5
+ *
6
+ * @example '@ecopages/dev-toolbar'
7
+ */
8
+ package: string;
9
+ /** @default true */
10
+ enabled?: boolean;
11
+ };
12
+ /**
13
+ * Builds a `devToolbar` config block for bring-your-own client packages.
14
+ *
15
+ * @remarks
16
+ * Prefer importing `devToolbar` from `@ecopages/dev-toolbar/config` for the
17
+ * official toolbar. Keep server config limited to package resolution and
18
+ * enablement; UI preferences stay in the client package.
19
+ */
20
+ export declare function defineDevTool(packageName: string): DevToolbarConfig;
21
+ export declare function defineDevTool(options: DefineDevToolOptions): DevToolbarConfig;
@@ -0,0 +1,9 @@
1
+ export function defineDevTool(packageNameOrOptions) {
2
+ if (typeof packageNameOrOptions === 'string') {
3
+ return { package: packageNameOrOptions };
4
+ }
5
+ return {
6
+ package: packageNameOrOptions.package,
7
+ ...(packageNameOrOptions.enabled === undefined ? {} : { enabled: packageNameOrOptions.enabled }),
8
+ };
9
+ }
@@ -0,0 +1,25 @@
1
+ import type { EcoPagesAppConfig } from '../types/internal-types.js';
2
+ export type DevToolbarConfig = {
3
+ /**
4
+ * Whether the in-browser dev toolbar is enabled during development.
5
+ *
6
+ * @default true when `package` is configured
7
+ */
8
+ enabled?: boolean;
9
+ /**
10
+ * Client package entry resolved from the application project.
11
+ *
12
+ * @remarks
13
+ * Install the package in the app (for example `@ecopages/dev-toolbar`) and
14
+ * point `package` at its browser bootstrap export. Core bundles that module
15
+ * to `/_dev_toolbar.js` during watch mode.
16
+ */
17
+ package?: string;
18
+ };
19
+ /**
20
+ * Returns whether the dev toolbar should be injected for the current process.
21
+ */
22
+ export declare function isDevToolbarEnabled(appConfig: Pick<EcoPagesAppConfig, 'devToolbar'>, options: {
23
+ watch: boolean;
24
+ hostOwnsDevClient?: boolean;
25
+ }): boolean;
@@ -0,0 +1,19 @@
1
+ import { getDevToolbarPackageSpec } from './dev-toolbar-package.js';
2
+ /**
3
+ * Returns whether the dev toolbar should be injected for the current process.
4
+ */
5
+ export function isDevToolbarEnabled(appConfig, options) {
6
+ if (options.hostOwnsDevClient) {
7
+ return false;
8
+ }
9
+ if (!options.watch) {
10
+ return false;
11
+ }
12
+ if (process.env.ECOPAGES_DEV_TOOLBAR === 'false') {
13
+ return false;
14
+ }
15
+ if (!getDevToolbarPackageSpec(appConfig)) {
16
+ return false;
17
+ }
18
+ return appConfig.devToolbar?.enabled !== false;
19
+ }
@@ -0,0 +1,49 @@
1
+ import type { HtmlDocumentContribution } from '../services/html/html-transformer.service.js';
2
+ import type { EcoPagesAppConfig } from '../types/internal-types.js';
3
+ import type { PagePackageResult } from '../types/public-types.js';
4
+ export type DevToolbarHostOptions = {
5
+ watch: boolean;
6
+ hostOwnsDevClient?: boolean;
7
+ };
8
+ type DevToolbarBundleService = {
9
+ bundle: (options: {
10
+ profile: 'hmr-runtime';
11
+ entrypoints: string[];
12
+ outdir: string;
13
+ naming: string;
14
+ minify: boolean;
15
+ }) => Promise<{
16
+ success: boolean;
17
+ logs: unknown;
18
+ outputs: Array<{
19
+ path: string;
20
+ }>;
21
+ }>;
22
+ };
23
+ /**
24
+ * Server-side entry point for dev toolbar config, HTML injection, manifest, and runtime bundling.
25
+ */
26
+ export declare class DevToolbarHost {
27
+ private readonly appConfig;
28
+ private readonly options;
29
+ constructor(appConfig: EcoPagesAppConfig, options: DevToolbarHostOptions);
30
+ static forApp(appConfig: EcoPagesAppConfig, options: DevToolbarHostOptions): DevToolbarHost;
31
+ isEnabled(): boolean;
32
+ getRuntimeScriptUrl(): string;
33
+ getRuntimeScriptImport(): string;
34
+ resolveRuntimeWorkDir(workDir: string): string;
35
+ shouldInjectHtml(): boolean;
36
+ injectHtmlResponse(response: Response): Promise<Response>;
37
+ buildRouteManifestContribution(input: {
38
+ routeFile: string;
39
+ integrationName: string;
40
+ pagePackage?: PagePackageResult;
41
+ }): HtmlDocumentContribution | undefined;
42
+ bundleClientRuntime(options: {
43
+ browserBundleService: DevToolbarBundleService;
44
+ workDir: string;
45
+ onFailure: (error: unknown) => void;
46
+ }): Promise<boolean>;
47
+ readBundledRuntime(workDir: string): Response | null;
48
+ }
49
+ export {};
@@ -0,0 +1,117 @@
1
+ import path from 'node:path';
2
+ import { fileSystem } from '@ecopages/file-system';
3
+ import { removeStaleHmrEntrypointOutput } from '../hmr/hmr-entrypoint-output.js';
4
+ import { isDevToolbarEnabled } from './dev-toolbar-config.js';
5
+ import { resolveConfiguredDevToolbarClient } from './dev-toolbar-package.js';
6
+ import { buildDevToolbarManifestPayload, serializeDevToolbarManifestScript } from './dev-toolbar-manifest.js';
7
+ import { DEV_TOOLBAR_RUNTIME_IMPORT, DEV_TOOLBAR_RUNTIME_SCRIPT_URL, resolveDevToolbarRuntimeWorkDir, } from './dev-toolbar-runtime-paths.js';
8
+ /**
9
+ * Server-side entry point for dev toolbar config, HTML injection, manifest, and runtime bundling.
10
+ */
11
+ export class DevToolbarHost {
12
+ appConfig;
13
+ options;
14
+ constructor(appConfig, options) {
15
+ this.appConfig = appConfig;
16
+ this.options = options;
17
+ }
18
+ static forApp(appConfig, options) {
19
+ return new DevToolbarHost(appConfig, options);
20
+ }
21
+ isEnabled() {
22
+ return isDevToolbarEnabled(this.appConfig, this.options);
23
+ }
24
+ getRuntimeScriptUrl() {
25
+ return DEV_TOOLBAR_RUNTIME_SCRIPT_URL;
26
+ }
27
+ getRuntimeScriptImport() {
28
+ return DEV_TOOLBAR_RUNTIME_IMPORT;
29
+ }
30
+ resolveRuntimeWorkDir(workDir) {
31
+ return resolveDevToolbarRuntimeWorkDir(workDir);
32
+ }
33
+ shouldInjectHtml() {
34
+ return this.isEnabled();
35
+ }
36
+ async injectHtmlResponse(response) {
37
+ const html = await response.text();
38
+ const headers = new Headers(response.headers);
39
+ headers.set('Cache-Control', 'no-store, must-revalidate');
40
+ headers.delete('Content-Length');
41
+ if (html.includes(this.getRuntimeScriptImport())) {
42
+ return new Response(html, {
43
+ status: response.status,
44
+ statusText: response.statusText,
45
+ headers,
46
+ });
47
+ }
48
+ const script = `<script type="module">${this.getRuntimeScriptImport()};</script>`;
49
+ const updatedHtml = html.replace(/<\/html>/i, `${script}</html>`);
50
+ return new Response(updatedHtml, {
51
+ status: response.status,
52
+ statusText: response.statusText,
53
+ headers,
54
+ });
55
+ }
56
+ buildRouteManifestContribution(input) {
57
+ if (!this.isEnabled()) {
58
+ return undefined;
59
+ }
60
+ const payload = buildDevToolbarManifestPayload({
61
+ routeFile: input.routeFile,
62
+ integrationName: input.integrationName,
63
+ pagePackage: input.pagePackage,
64
+ });
65
+ return {
66
+ placement: 'body-append',
67
+ html: serializeDevToolbarManifestScript(payload),
68
+ };
69
+ }
70
+ async bundleClientRuntime(options) {
71
+ if (!this.isEnabled()) {
72
+ return true;
73
+ }
74
+ const client = resolveConfiguredDevToolbarClient(this.appConfig);
75
+ if (!client) {
76
+ options.onFailure(new Error('[DevToolbar] No client package configured. Set devToolbar.package in your app config.'));
77
+ return false;
78
+ }
79
+ const runtimePath = path.join(options.workDir, path.basename(DEV_TOOLBAR_RUNTIME_SCRIPT_URL));
80
+ removeStaleHmrEntrypointOutput(runtimePath, 'DevToolbar');
81
+ try {
82
+ const result = await options.browserBundleService.bundle({
83
+ profile: 'hmr-runtime',
84
+ entrypoints: [client.entryPath],
85
+ outdir: options.workDir,
86
+ naming: path.basename(DEV_TOOLBAR_RUNTIME_SCRIPT_URL),
87
+ minify: false,
88
+ });
89
+ if (!result.success) {
90
+ options.onFailure(result.logs);
91
+ return false;
92
+ }
93
+ const emittedRuntime = result.outputs.find((output) => path.resolve(output.path) === path.resolve(runtimePath));
94
+ if (!emittedRuntime || !fileSystem.exists(runtimePath)) {
95
+ options.onFailure(new Error(`[DevToolbar] Runtime bundle missing expected output at ${runtimePath}`));
96
+ return false;
97
+ }
98
+ return true;
99
+ }
100
+ catch (error) {
101
+ options.onFailure(error);
102
+ return false;
103
+ }
104
+ }
105
+ readBundledRuntime(workDir) {
106
+ const runtimePath = path.join(workDir, path.basename(DEV_TOOLBAR_RUNTIME_SCRIPT_URL));
107
+ if (!fileSystem.exists(runtimePath)) {
108
+ return null;
109
+ }
110
+ return new Response(fileSystem.readFileAsBuffer(runtimePath), {
111
+ headers: {
112
+ 'Content-Type': 'application/javascript',
113
+ 'Cache-Control': 'no-store, must-revalidate',
114
+ },
115
+ });
116
+ }
117
+ }
@@ -0,0 +1,11 @@
1
+ import type { EcoPagesAppConfig } from '../types/internal-types.js';
2
+ import { type DevToolbarHostOptions } from './dev-toolbar-host.js';
3
+ export { DEV_TOOLBAR_RUNTIME_IMPORT } from './dev-toolbar-runtime-paths.js';
4
+ /**
5
+ * Returns whether HTML responses should receive the dev toolbar bootstrap.
6
+ */
7
+ export declare function shouldInjectDevToolbarHtmlResponse(appConfig: EcoPagesAppConfig, options: DevToolbarHostOptions): boolean;
8
+ /**
9
+ * Injects the development dev toolbar runtime script into an HTML response if it is not already present.
10
+ */
11
+ export declare function injectDevToolbarIntoHtmlResponse(appConfig: EcoPagesAppConfig, options: DevToolbarHostOptions, response: Response): Promise<Response>;
@@ -0,0 +1,14 @@
1
+ import { DevToolbarHost } from './dev-toolbar-host.js';
2
+ export { DEV_TOOLBAR_RUNTIME_IMPORT } from './dev-toolbar-runtime-paths.js';
3
+ /**
4
+ * Returns whether HTML responses should receive the dev toolbar bootstrap.
5
+ */
6
+ export function shouldInjectDevToolbarHtmlResponse(appConfig, options) {
7
+ return DevToolbarHost.forApp(appConfig, options).shouldInjectHtml();
8
+ }
9
+ /**
10
+ * Injects the development dev toolbar runtime script into an HTML response if it is not already present.
11
+ */
12
+ export async function injectDevToolbarIntoHtmlResponse(appConfig, options, response) {
13
+ return DevToolbarHost.forApp(appConfig, options).injectHtmlResponse(response);
14
+ }
@@ -0,0 +1,15 @@
1
+ import type { PagePackageResult } from '../types/public-types.js';
2
+ export { DEV_MANIFEST_ELEMENT_ID, type DevManifestAsset as DevToolbarManifestAsset, type EcoDevManifest as DevToolbarManifestPayload, } from '@ecopages/dev-toolbar/manifest';
3
+ import { type EcoDevManifest } from '@ecopages/dev-toolbar/manifest';
4
+ /**
5
+ * Builds the dev toolbar manifest payload for one rendered page.
6
+ */
7
+ export declare function buildDevToolbarManifestPayload(input: {
8
+ routeFile: string;
9
+ integrationName?: string;
10
+ pagePackage?: PagePackageResult;
11
+ }): EcoDevManifest;
12
+ /**
13
+ * Serializes the dev toolbar manifest as an HTML contribution snippet.
14
+ */
15
+ export declare function serializeDevToolbarManifestScript(payload: EcoDevManifest): string;
@@ -0,0 +1,52 @@
1
+ import { DEV_TRANSFORM_URL_PREFIX, VENDOR_URL_PREFIX } from '../hmr/hmr-asset-paths.js';
2
+ export { DEV_MANIFEST_ELEMENT_ID, } from '@ecopages/dev-toolbar/manifest';
3
+ import { DEV_MANIFEST_ELEMENT_ID } from '@ecopages/dev-toolbar/manifest';
4
+ function serializeAsset(asset) {
5
+ if (!asset.srcUrl) {
6
+ return undefined;
7
+ }
8
+ return {
9
+ srcUrl: asset.srcUrl,
10
+ kind: asset.kind,
11
+ packageRole: asset.packageRole,
12
+ inline: asset.inline,
13
+ };
14
+ }
15
+ function collectUrlsFromAssets(assets, prefix) {
16
+ const urls = new Set();
17
+ for (const asset of assets) {
18
+ if (asset.srcUrl?.startsWith(prefix)) {
19
+ urls.add(asset.srcUrl);
20
+ }
21
+ }
22
+ return [...urls];
23
+ }
24
+ /**
25
+ * Builds the dev toolbar manifest payload for one rendered page.
26
+ */
27
+ export function buildDevToolbarManifestPayload(input) {
28
+ const assets = input.pagePackage?.assets ?? [];
29
+ const graph = input.pagePackage?.pageBrowserGraph;
30
+ return {
31
+ route: input.routeFile,
32
+ integration: input.integrationName,
33
+ pageBrowserGraph: graph
34
+ ? {
35
+ entryAssets: graph.entryAssets
36
+ .map((asset) => serializeAsset(asset))
37
+ .filter((asset) => asset !== undefined),
38
+ chunkAssets: graph.chunkAssets
39
+ .map((asset) => serializeAsset(asset))
40
+ .filter((asset) => asset !== undefined),
41
+ }
42
+ : undefined,
43
+ vendorUrls: collectUrlsFromAssets(assets, VENDOR_URL_PREFIX),
44
+ devTransformUrls: collectUrlsFromAssets(assets, DEV_TRANSFORM_URL_PREFIX),
45
+ };
46
+ }
47
+ /**
48
+ * Serializes the dev toolbar manifest as an HTML contribution snippet.
49
+ */
50
+ export function serializeDevToolbarManifestScript(payload) {
51
+ return `<script type="application/json" id="${DEV_MANIFEST_ELEMENT_ID}">${JSON.stringify(payload)}</script>`;
52
+ }
@@ -0,0 +1,31 @@
1
+ import type { EcoPagesAppConfig } from '../types/internal-types.js';
2
+ export type DevToolbarClientResolution = {
3
+ entryPath: string;
4
+ };
5
+ /**
6
+ * Returns the configured dev-toolbar client package specifier, if any.
7
+ */
8
+ export declare function getDevToolbarPackageSpec(appConfig: Pick<EcoPagesAppConfig, 'devToolbar'>): string | undefined;
9
+ /**
10
+ * Resolves the dev-toolbar package root from an application project directory.
11
+ *
12
+ * @remarks Walks up from the package entry rather than resolving `package.json`
13
+ * directly so packages with strict `exports` (no `./package.json` subpath) still work.
14
+ */
15
+ export declare function resolveDevToolbarPackageRoot(rootDir: string, packageSpec: string): string;
16
+ /**
17
+ * Resolves the browser entrypoint core bundles into `/_dev_toolbar.js`.
18
+ */
19
+ export declare function resolveDevToolbarClient(rootDir: string, packageSpec: string): DevToolbarClientResolution | undefined;
20
+ /**
21
+ * Resolves the configured dev-toolbar client for an app config, when present.
22
+ */
23
+ export declare function resolveConfiguredDevToolbarClient(appConfig: EcoPagesAppConfig): DevToolbarClientResolution | undefined;
24
+ /**
25
+ * Resolves a dev-toolbar client entry module from the application project root.
26
+ */
27
+ export declare function resolveDevToolbarPackageEntry(rootDir: string, packageSpec: string): string;
28
+ /**
29
+ * Resolves the configured dev-toolbar entry for an app config, when present.
30
+ */
31
+ export declare function resolveConfiguredDevToolbarEntry(appConfig: EcoPagesAppConfig): string | undefined;
@@ -0,0 +1,72 @@
1
+ import { createRequire } from 'node:module';
2
+ import path from 'node:path';
3
+ import { fileSystem } from '@ecopages/file-system';
4
+ const SOURCE_CLIENT_FILE = 'src/bootstrap.ts';
5
+ /**
6
+ * Returns the configured dev-toolbar client package specifier, if any.
7
+ */
8
+ export function getDevToolbarPackageSpec(appConfig) {
9
+ const spec = appConfig.devToolbar?.package?.trim();
10
+ return spec || undefined;
11
+ }
12
+ /**
13
+ * Resolves the dev-toolbar package root from an application project directory.
14
+ *
15
+ * @remarks Walks up from the package entry rather than resolving `package.json`
16
+ * directly so packages with strict `exports` (no `./package.json` subpath) still work.
17
+ */
18
+ export function resolveDevToolbarPackageRoot(rootDir, packageSpec) {
19
+ const require = createRequire(path.join(rootDir, 'package.json'));
20
+ let dir = path.dirname(require.resolve(packageSpec));
21
+ while (dir !== path.dirname(dir)) {
22
+ if (fileSystem.exists(path.join(dir, 'package.json'))) {
23
+ return dir;
24
+ }
25
+ dir = path.dirname(dir);
26
+ }
27
+ throw new Error(`Could not resolve package root for ${packageSpec}`);
28
+ }
29
+ /**
30
+ * Resolves the browser entrypoint core bundles into `/_dev_toolbar.js`.
31
+ */
32
+ export function resolveDevToolbarClient(rootDir, packageSpec) {
33
+ const packageRoot = resolveDevToolbarPackageRoot(rootDir, packageSpec);
34
+ const sourcePath = path.join(packageRoot, SOURCE_CLIENT_FILE);
35
+ if (fileSystem.exists(sourcePath)) {
36
+ return { entryPath: sourcePath };
37
+ }
38
+ const require = createRequire(path.join(rootDir, 'package.json'));
39
+ try {
40
+ return { entryPath: require.resolve(packageSpec) };
41
+ }
42
+ catch {
43
+ return undefined;
44
+ }
45
+ }
46
+ /**
47
+ * Resolves the configured dev-toolbar client for an app config, when present.
48
+ */
49
+ export function resolveConfiguredDevToolbarClient(appConfig) {
50
+ const packageSpec = getDevToolbarPackageSpec(appConfig);
51
+ if (!packageSpec) {
52
+ return undefined;
53
+ }
54
+ return resolveDevToolbarClient(appConfig.absolutePaths.projectDir, packageSpec);
55
+ }
56
+ /**
57
+ * Resolves a dev-toolbar client entry module from the application project root.
58
+ */
59
+ export function resolveDevToolbarPackageEntry(rootDir, packageSpec) {
60
+ const client = resolveDevToolbarClient(rootDir, packageSpec);
61
+ if (!client) {
62
+ const require = createRequire(path.join(rootDir, 'package.json'));
63
+ return require.resolve(packageSpec);
64
+ }
65
+ return client.entryPath;
66
+ }
67
+ /**
68
+ * Resolves the configured dev-toolbar entry for an app config, when present.
69
+ */
70
+ export function resolveConfiguredDevToolbarEntry(appConfig) {
71
+ return resolveConfiguredDevToolbarClient(appConfig)?.entryPath;
72
+ }
@@ -0,0 +1,10 @@
1
+ /** On-disk work directory segment for the bundled dev toolbar client runtime. */
2
+ export declare const DEV_TOOLBAR_RUNTIME_WORK_DIR_SEGMENT = "dev-toolbar-runtime";
3
+ /** Browser URL for the bundled dev toolbar client runtime script. */
4
+ export declare const DEV_TOOLBAR_RUNTIME_SCRIPT_URL = "/_dev_toolbar.js";
5
+ /** Module import emitted into dev HTML responses. */
6
+ export declare const DEV_TOOLBAR_RUNTIME_IMPORT = "import '/_dev_toolbar.js'";
7
+ /**
8
+ * Absolute work-directory path for dev toolbar runtime artifacts under an app work dir.
9
+ */
10
+ export declare function resolveDevToolbarRuntimeWorkDir(workDir: string): string;
@@ -0,0 +1,13 @@
1
+ import { RESOLVED_ASSETS_DIR } from '../config/constants.js';
2
+ /** On-disk work directory segment for the bundled dev toolbar client runtime. */
3
+ export const DEV_TOOLBAR_RUNTIME_WORK_DIR_SEGMENT = 'dev-toolbar-runtime';
4
+ /** Browser URL for the bundled dev toolbar client runtime script. */
5
+ export const DEV_TOOLBAR_RUNTIME_SCRIPT_URL = '/_dev_toolbar.js';
6
+ /** Module import emitted into dev HTML responses. */
7
+ export const DEV_TOOLBAR_RUNTIME_IMPORT = `import '${DEV_TOOLBAR_RUNTIME_SCRIPT_URL}'`;
8
+ /**
9
+ * Absolute work-directory path for dev toolbar runtime artifacts under an app work dir.
10
+ */
11
+ export function resolveDevToolbarRuntimeWorkDir(workDir) {
12
+ return `${workDir}/${RESOLVED_ASSETS_DIR}/${DEV_TOOLBAR_RUNTIME_WORK_DIR_SEGMENT}`;
13
+ }
@@ -1,33 +1,39 @@
1
- import { AsyncLocalStorage } from "node:async_hooks";
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ /**
3
+ * Per-request browser build dedupe cache.
4
+ *
5
+ * @remarks
6
+ * `DedupingBuildExecutor` only coalesces concurrent identical builds. Asset
7
+ * processing can call the same logical bundle several times in one request
8
+ * (page graph, HMR, content scripts) after the first build settles. This cache
9
+ * reuses the settled result until the request scope ends.
10
+ */
2
11
  class RequestBuildDedupe {
3
- storage = new AsyncLocalStorage();
4
- run(fn) {
5
- if (this.storage.getStore()) {
6
- return fn();
12
+ storage = new AsyncLocalStorage();
13
+ run(fn) {
14
+ if (this.storage.getStore()) {
15
+ return fn();
16
+ }
17
+ return this.storage.run(new Map(), fn);
7
18
  }
8
- return this.storage.run(/* @__PURE__ */ new Map(), fn);
9
- }
10
- dedupeBuild(key, build) {
11
- const store = this.storage.getStore();
12
- if (!store) {
13
- return build();
19
+ dedupeBuild(key, build) {
20
+ const store = this.storage.getStore();
21
+ if (!store) {
22
+ return build();
23
+ }
24
+ const existing = store.get(key);
25
+ if (existing) {
26
+ return existing;
27
+ }
28
+ const buildPromise = build().catch((error) => {
29
+ store.delete(key);
30
+ throw error;
31
+ });
32
+ store.set(key, buildPromise);
33
+ return buildPromise;
14
34
  }
15
- const existing = store.get(key);
16
- if (existing) {
17
- return existing;
35
+ getCachedCountForTests() {
36
+ return this.storage.getStore()?.size ?? 0;
18
37
  }
19
- const buildPromise = build().catch((error) => {
20
- store.delete(key);
21
- throw error;
22
- });
23
- store.set(key, buildPromise);
24
- return buildPromise;
25
- }
26
- getCachedCountForTests() {
27
- return this.storage.getStore()?.size ?? 0;
28
- }
29
38
  }
30
- const requestBuildDedupe = new RequestBuildDedupe();
31
- export {
32
- requestBuildDedupe
33
- };
39
+ export const requestBuildDedupe = new RequestBuildDedupe();
@@ -1,4 +1,4 @@
1
- export type StartupTracePhase = 'config-ready' | 'setupAppRuntimePlugins' | 'route-registry' | 'server-listen' | 'first-byte' | 'first-page-browser-graph' | 'first-request-ssr' | 'client-transfer' | 'client-hydration';
1
+ export type StartupTracePhase = 'config-ready' | 'setupAppRuntimePlugins' | 'route-registry' | 'server-listen' | 'first-byte' | 'first-page-browser-graph' | 'dev-client-transform' | 'first-request-ssr' | 'client-transfer' | 'client-hydration';
2
2
  type PhaseRecord = {
3
3
  durationMs: number;
4
4
  wallMs: number;
@@ -30,8 +30,10 @@ declare class StartupTrace {
30
30
  private firstRequestBundleCount;
31
31
  private firstRequestClientBytes;
32
32
  private firstRequestGraphBuildCount;
33
+ private firstRequestCompletedWallMs;
33
34
  private summaryEmitted;
34
35
  private firstPageBrowserGraphEmitted;
36
+ private devClientTransformEmitted;
35
37
  private clientRequestCount;
36
38
  private clientTransferredBytes;
37
39
  private hmrConnected;
@@ -44,6 +46,13 @@ declare class StartupTrace {
44
46
  beginServerListen(): void;
45
47
  markFirstByte(): void;
46
48
  beginFirstByte(): void;
49
+ beginDevClientTransform(): void;
50
+ endDevClientTransform(): void;
51
+ /**
52
+ * Records the first Page Browser Graph completion for startup tracing.
53
+ *
54
+ * @param graphBuildCount Session graph build counter when the first Page Browser Graph finished.
55
+ */
47
56
  markFirstPageBrowserGraphReady(graphBuildCount?: number): void;
48
57
  recordBrowserBundle(outputs: Array<{
49
58
  path: string;