@ecopages/core 0.2.0-beta.9 → 0.2.0-rc.1

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 (624) hide show
  1. package/README.md +44 -14
  2. package/package.json +368 -57
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +57 -5
  5. package/src/adapters/abstract/application-adapter.js +261 -203
  6. package/src/adapters/abstract/router-adapter.js +12 -4
  7. package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
  8. package/src/adapters/abstract/segment-path-matcher.js +147 -0
  9. package/src/adapters/abstract/server-adapter.d.ts +13 -2
  10. package/src/adapters/abstract/server-adapter.js +22 -14
  11. package/src/adapters/abstract/ws-pattern-matcher.d.ts +2 -50
  12. package/src/adapters/abstract/ws-pattern-matcher.js +24 -57
  13. package/src/adapters/bun/bun-user-websocket-lifecycle.js +93 -0
  14. package/src/adapters/bun/client-bridge.js +51 -50
  15. package/src/adapters/bun/create-app.d.ts +5 -7
  16. package/src/adapters/bun/create-app.js +169 -154
  17. package/src/adapters/bun/hmr-manager.d.ts +2 -3
  18. package/src/adapters/bun/hmr-manager.js +62 -57
  19. package/src/adapters/bun/index.d.ts +1 -1
  20. package/src/adapters/bun/index.js +2 -8
  21. package/src/adapters/bun/runtime-host.d.ts +1 -1
  22. package/src/adapters/bun/runtime-host.js +61 -54
  23. package/src/adapters/bun/server-adapter.d.ts +34 -53
  24. package/src/adapters/bun/server-adapter.js +557 -637
  25. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  26. package/src/adapters/bun/static-preview-host.js +43 -41
  27. package/src/adapters/create-app.d.ts +1 -12
  28. package/src/adapters/create-app.js +11 -72
  29. package/src/adapters/index.d.ts +2 -2
  30. package/src/adapters/index.js +2 -8
  31. package/src/adapters/node/create-app.d.ts +4 -3
  32. package/src/adapters/node/create-app.js +123 -98
  33. package/src/adapters/node/http-request-bridge.js +147 -106
  34. package/src/adapters/node/node-client-bridge.js +62 -64
  35. package/src/adapters/node/node-hmr-manager.d.ts +2 -3
  36. package/src/adapters/node/node-hmr-manager.js +58 -48
  37. package/src/adapters/node/runtime-host.d.ts +1 -1
  38. package/src/adapters/node/runtime-host.js +96 -89
  39. package/src/adapters/node/server-adapter-dependencies.js +18 -17
  40. package/src/adapters/node/server-adapter.d.ts +28 -8
  41. package/src/adapters/node/server-adapter.js +349 -302
  42. package/src/adapters/node/static-content-server.js +172 -186
  43. package/src/adapters/node/static-preview-host.d.ts +1 -1
  44. package/src/adapters/node/static-preview-host.js +88 -64
  45. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  46. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  47. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  48. package/src/adapters/shared/hmr/hmr-html-response.js +50 -0
  49. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +92 -0
  50. package/src/adapters/shared/hmr/shared-hmr-manager.js +446 -0
  51. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  52. package/src/adapters/shared/http/api-request-pipeline.js +132 -0
  53. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  54. package/src/adapters/shared/http/api-response.js +79 -0
  55. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  56. package/src/adapters/shared/http/create-body-response.js +26 -0
  57. package/src/adapters/shared/http/define-api-handler.d.ts +48 -0
  58. package/src/adapters/shared/http/define-api-handler.js +49 -0
  59. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  60. package/src/adapters/shared/http/explicit-static-render-preparation.js +29 -0
  61. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  62. package/src/adapters/shared/http/explicit-static-route-matcher.js +59 -0
  63. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  64. package/src/adapters/shared/http/file-route-middleware-pipeline.js +84 -0
  65. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  66. package/src/adapters/shared/http/fs-server-response-factory.js +106 -0
  67. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  68. package/src/adapters/shared/http/fs-server-response-matcher.js +260 -0
  69. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  70. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  71. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  72. package/src/adapters/shared/runtime/application-adapter.js +75 -0
  73. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.d.ts +11 -0
  74. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.js +29 -0
  75. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +27 -0
  76. package/src/adapters/shared/runtime/dev-static-route-prewarm.d.ts +16 -0
  77. package/src/adapters/shared/runtime/dev-static-route-prewarm.js +66 -0
  78. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  79. package/src/adapters/shared/runtime/port-manager.js +226 -0
  80. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  81. package/src/adapters/shared/runtime/render-context.js +99 -0
  82. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -2
  83. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +38 -0
  84. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +45 -0
  85. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +71 -0
  86. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +31 -50
  87. package/src/adapters/shared/runtime/server-adapter.js +301 -0
  88. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  89. package/src/adapters/shared/runtime/server-route-handler.js +77 -0
  90. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +26 -31
  91. package/src/adapters/shared/runtime/server-static-builder.js +172 -0
  92. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  93. package/src/adapters/shared/{node-http-websocket-upgrades.d.ts → ws/node-http-websocket-upgrades.d.ts} +1 -1
  94. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +109 -0
  95. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  96. package/src/adapters/shared/ws/websocket-lifecycle.js +62 -0
  97. package/src/build/README.md +165 -45
  98. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  99. package/src/build/app-build-manifest-runtime.js +145 -0
  100. package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +4 -0
  101. package/src/build/browser/browser-runtime-manifest.js +65 -0
  102. package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +3 -5
  103. package/src/build/browser/browser-runtime-plugin-helpers.js +32 -0
  104. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +12 -13
  105. package/src/build/browser/browser-runtime-plugin.js +218 -0
  106. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  107. package/src/build/browser/jsx-ownership-plugins.js +55 -0
  108. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  109. package/src/build/browser/lit-static-render-worker-context.js +4 -0
  110. package/src/build/build-adapter.d.ts +25 -355
  111. package/src/build/build-adapter.js +258 -265
  112. package/src/build/{build-input-fingerprint.d.ts → cache/build-input-fingerprint.d.ts} +3 -3
  113. package/src/build/cache/build-input-fingerprint.js +33 -0
  114. package/src/build/cache/cache-constants.d.ts +4 -0
  115. package/src/build/cache/cache-constants.js +4 -0
  116. package/src/build/cache/cache-keys.d.ts +22 -0
  117. package/src/build/cache/cache-keys.js +71 -0
  118. package/src/build/{pages-unified-graph-build.d.ts → cache/pages-unified-graph-build.d.ts} +1 -1
  119. package/src/build/cache/pages-unified-graph-build.js +199 -0
  120. package/src/build/cache/production-build-cache.d.ts +21 -0
  121. package/src/build/cache/production-build-cache.js +56 -0
  122. package/src/build/{server-entry-build-cache.d.ts → cache/server-entry-build-cache.d.ts} +3 -4
  123. package/src/build/cache/server-entry-build-cache.js +153 -0
  124. package/src/build/contracts/build-contracts.d.ts +96 -0
  125. package/src/build/contracts/build-contracts.js +1 -0
  126. package/src/build/contracts/build-manifest.d.ts +90 -0
  127. package/src/build/contracts/build-manifest.js +64 -0
  128. package/src/build/contracts/build-types.js +1 -0
  129. package/src/build/contracts/content-virtual-modules.d.ts +12 -0
  130. package/src/build/contracts/content-virtual-modules.js +29 -0
  131. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +32 -9
  132. package/src/build/rolldown/rolldown-adapter-helpers.js +472 -0
  133. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  134. package/src/build/rolldown/rolldown-build-adapter.js +57 -0
  135. package/src/build/{rolldown-build-invocation-metrics.d.ts → rolldown/rolldown-build-invocation-metrics.d.ts} +1 -1
  136. package/src/build/rolldown/rolldown-build-invocation-metrics.js +39 -0
  137. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +7 -2
  138. package/src/build/rolldown/rolldown-plugin-bridge.js +284 -0
  139. package/src/build/{rolldown-source-transform-pass.d.ts → rolldown/rolldown-source-transform-pass.d.ts} +1 -1
  140. package/src/build/rolldown/rolldown-source-transform-pass.js +70 -0
  141. package/src/build/rolldown/runtime-build-output-normalizer.js +227 -0
  142. package/src/build/rolldown/server-side-css-shim-plugin.js +58 -0
  143. package/src/build/runtime/build-profile-options.d.ts +7 -0
  144. package/src/build/runtime/build-profile-options.js +37 -0
  145. package/src/build/runtime/build-request-identity.d.ts +17 -0
  146. package/src/build/runtime/build-request-identity.js +79 -0
  147. package/src/build/runtime/build-request-policy.d.ts +58 -0
  148. package/src/build/runtime/build-request-policy.js +84 -0
  149. package/src/build/runtime/build-runtime.d.ts +28 -0
  150. package/src/build/runtime/build-runtime.js +75 -0
  151. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  152. package/src/build/runtime/deduping-build-executor.js +40 -0
  153. package/src/build/{parallel-build-executor.d.ts → runtime/parallel-build-executor.d.ts} +1 -1
  154. package/src/build/runtime/parallel-build-executor.js +60 -0
  155. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  156. package/src/build/runtime/serialized-build-executor.js +79 -0
  157. package/src/cache/index.d.ts +2 -1
  158. package/src/cache/index.js +7 -6
  159. package/src/cache/module-parse-cache.d.ts +5 -0
  160. package/src/cache/module-parse-cache.js +122 -67
  161. package/src/cache/module-transform-profiler.d.ts +8 -0
  162. package/src/cache/module-transform-profiler.js +8 -0
  163. package/src/client/navigation-scripts/classification.d.ts +16 -0
  164. package/src/client/navigation-scripts/classification.js +49 -0
  165. package/src/client/navigation-scripts/index.d.ts +3 -0
  166. package/src/client/navigation-scripts/index.js +3 -0
  167. package/src/client/navigation-scripts/navigation-scripts.test.browser.d.ts +1 -0
  168. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +61 -0
  169. package/src/client/navigation-scripts/registry.d.ts +11 -0
  170. package/src/client/navigation-scripts/registry.js +16 -0
  171. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  172. package/src/client/navigation-scripts/rerun-queue.js +90 -0
  173. package/src/client/scroll.d.ts +17 -0
  174. package/src/client/scroll.js +33 -0
  175. package/src/client/scroll.test.browser.d.ts +1 -0
  176. package/src/client/scroll.test.browser.js +31 -0
  177. package/src/client/view-transitions.d.ts +32 -0
  178. package/src/client/view-transitions.js +120 -0
  179. package/src/client/view-transitions.test.browser.d.ts +1 -0
  180. package/src/client/view-transitions.test.browser.js +56 -0
  181. package/src/config/README.md +1 -1
  182. package/src/config/config-builder.d.ts +40 -20
  183. package/src/config/config-builder.js +645 -610
  184. package/src/config/constants.d.ts +1 -0
  185. package/src/config/constants.js +44 -23
  186. package/src/declarations.d.ts +1 -0
  187. package/src/dev/README.md +24 -0
  188. package/src/dev/client-bridge-registry.d.ts +5 -0
  189. package/src/dev/client-bridge-registry.js +10 -0
  190. package/src/dev/dev-client-ownership.d.ts +7 -0
  191. package/src/dev/dev-client-ownership.js +8 -0
  192. package/src/dev/hmr-manager-registry.d.ts +8 -0
  193. package/src/dev/hmr-manager-registry.js +10 -0
  194. package/src/dev/host-runtime.d.ts +3 -0
  195. package/src/dev/host-runtime.js +25 -23
  196. package/src/dev/runtime-server-started-message.d.ts +2 -0
  197. package/src/dev/runtime-server-started-message.js +3 -0
  198. package/src/dev/sc-server.js +106 -103
  199. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  200. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  201. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  202. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  203. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  204. package/src/dev/transform-server/dev-transform-import-rewriter.js +127 -0
  205. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  206. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  207. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  208. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  209. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  210. package/src/dev/transform-server/dev-transform-server.js +191 -0
  211. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  212. package/src/dev/transform-server/dev-transform-url.js +58 -0
  213. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +28 -0
  214. package/src/dev/transform-server/dev-transform-vendor-registry.js +166 -0
  215. package/src/dev/transform-server/index.d.ts +6 -0
  216. package/src/dev/transform-server/index.js +4 -0
  217. package/src/dev/transform-server/types.d.ts +15 -0
  218. package/src/dev/transform-server/types.js +1 -0
  219. package/src/dev-toolbar/README.md +52 -0
  220. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  221. package/src/dev-toolbar/define-dev-tool.js +9 -0
  222. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  223. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  224. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  225. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  226. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  227. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  228. package/src/dev-toolbar/dev-toolbar-manifest-contract.d.ts +22 -0
  229. package/src/dev-toolbar/dev-toolbar-manifest-contract.js +2 -0
  230. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  231. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  232. package/src/dev-toolbar/dev-toolbar-package.d.ts +34 -0
  233. package/src/dev-toolbar/dev-toolbar-package.js +78 -0
  234. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  235. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  236. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  237. package/src/diagnostics/request-build-dedupe.js +39 -0
  238. package/src/diagnostics/request-pipeline-metrics.d.ts +38 -0
  239. package/src/diagnostics/request-pipeline-metrics.js +121 -0
  240. package/src/diagnostics/startup-trace.d.ts +81 -0
  241. package/src/diagnostics/startup-trace.js +281 -0
  242. package/src/eco/README.md +17 -0
  243. package/src/eco/component-identity.d.ts +13 -0
  244. package/src/eco/component-identity.js +18 -0
  245. package/src/eco/eco-declared-component.d.ts +15 -0
  246. package/src/eco/eco-declared-component.js +23 -0
  247. package/src/eco/eco.browser.js +63 -70
  248. package/src/eco/eco.js +163 -97
  249. package/src/eco/eco.types.d.ts +47 -8
  250. package/src/eco/eco.types.js +5 -0
  251. package/src/eco/eco.utils.d.ts +1 -1
  252. package/src/eco/eco.utils.js +1 -10
  253. package/src/eco/global-injector-map.js +55 -41
  254. package/src/eco/lazy-injector-map.js +90 -60
  255. package/src/eco/module-dependencies.js +52 -44
  256. package/src/eco/page-layout-normalization.d.ts +21 -0
  257. package/src/eco/page-layout-normalization.js +69 -0
  258. package/src/env.d.ts +2 -0
  259. package/src/errors/http-error.d.ts +8 -0
  260. package/src/errors/http-error.js +66 -49
  261. package/src/errors/index.d.ts +1 -0
  262. package/src/errors/index.js +3 -6
  263. package/src/errors/locals-access-error.js +5 -8
  264. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  265. package/src/errors/undeclared-component-dependency-error.js +17 -0
  266. package/src/global/app-logger.js +3 -6
  267. package/src/hmr/README.md +21 -0
  268. package/src/hmr/client/hmr-runtime.js +119 -110
  269. package/src/hmr/client/module-update.d.ts +13 -0
  270. package/src/hmr/client/module-update.js +39 -0
  271. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  272. package/src/hmr/hmr-asset-paths.js +22 -0
  273. package/src/hmr/hmr-entrypoint-output.d.ts +21 -0
  274. package/src/hmr/hmr-entrypoint-output.js +34 -0
  275. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  276. package/src/hmr/hmr-file-change-prep.js +14 -0
  277. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  278. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  279. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  280. package/src/hmr/hmr-runtime-paths.js +13 -0
  281. package/src/hmr/hmr-strategy.d.ts +9 -0
  282. package/src/hmr/hmr-strategy.js +113 -42
  283. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  284. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -97
  285. package/src/hmr/strategies/js-hmr-strategy.js +107 -167
  286. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  287. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +35 -0
  288. package/src/index.browser.d.ts +1 -0
  289. package/src/index.browser.js +2 -4
  290. package/src/index.d.ts +4 -1
  291. package/src/index.js +7 -21
  292. package/src/islands/README.md +25 -0
  293. package/src/islands/island-host.d.ts +37 -0
  294. package/src/islands/island-host.js +55 -0
  295. package/src/plugins/README.md +4 -2
  296. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  297. package/src/plugins/alias-resolver-cache.js +114 -97
  298. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  299. package/src/plugins/alias-resolver-plugin.js +35 -62
  300. package/src/plugins/define-integration.d.ts +26 -0
  301. package/src/plugins/define-integration.js +20 -0
  302. package/src/plugins/eco-component-meta-plugin.d.ts +6 -102
  303. package/src/plugins/eco-component-meta-plugin.js +123 -162
  304. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  305. package/src/plugins/foreign-jsx-override-plugin.js +49 -37
  306. package/src/plugins/integration-plugin.d.ts +28 -15
  307. package/src/plugins/integration-plugin.js +212 -195
  308. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  309. package/src/plugins/jsx-import-source.utils.js +21 -0
  310. package/src/plugins/package-specifier.d.ts +12 -0
  311. package/src/plugins/package-specifier.js +33 -0
  312. package/src/plugins/processor.d.ts +79 -12
  313. package/src/plugins/processor.js +188 -136
  314. package/src/plugins/runtime-capability.js +1 -0
  315. package/src/plugins/source-transform.d.ts +1 -1
  316. package/src/plugins/source-transform.js +109 -79
  317. package/src/plugins/tsconfig-import-resolver.d.ts +37 -0
  318. package/src/plugins/tsconfig-import-resolver.js +262 -0
  319. package/src/route-renderer/GRAPH.md +24 -30
  320. package/src/route-renderer/README.md +52 -32
  321. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  322. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +155 -0
  323. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +32 -0
  324. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +52 -0
  325. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  326. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +196 -0
  327. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +20 -7
  328. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +195 -0
  329. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  330. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +354 -0
  331. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  332. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +36 -0
  333. package/src/route-renderer/orchestration/integration-renderer.d.ts +39 -153
  334. package/src/route-renderer/orchestration/integration-renderer.js +803 -1008
  335. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  336. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +173 -0
  337. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  338. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +132 -0
  339. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  340. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +89 -0
  341. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +6 -2
  342. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +77 -0
  343. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  344. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +30 -0
  345. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.d.ts +15 -0
  346. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.js +9 -0
  347. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.d.ts +5 -0
  348. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.js +30 -0
  349. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  350. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +32 -0
  351. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +126 -0
  352. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +542 -0
  353. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +47 -0
  354. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +248 -0
  355. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  356. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +23 -0
  357. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.d.ts +29 -0
  358. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.js +54 -0
  359. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +38 -0
  360. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +26 -0
  361. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  362. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +25 -0
  363. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  364. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +43 -0
  365. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +25 -0
  366. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +44 -0
  367. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +26 -0
  368. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +44 -0
  369. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  370. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +30 -0
  371. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +24 -54
  372. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +215 -0
  373. package/src/{integrations/ghtml/ghtml-renderer.d.ts → route-renderer/orchestration/string-markup-renderer.d.ts} +8 -10
  374. package/src/route-renderer/orchestration/string-markup-renderer.js +53 -0
  375. package/src/route-renderer/page-loading/component-dependency-collection.js +121 -121
  376. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  377. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  378. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +1 -0
  379. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +64 -51
  380. package/src/route-renderer/page-loading/file-scoped-dependency-components.d.ts +42 -0
  381. package/src/route-renderer/page-loading/file-scoped-dependency-components.js +94 -0
  382. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  383. package/src/route-renderer/page-loading/lazy-trigger-planning.js +47 -36
  384. package/src/route-renderer/page-loading/module-declaration-aggregation.js +39 -28
  385. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  386. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  387. package/src/route-renderer/page-loading/page-module-loader.d.ts +2 -1
  388. package/src/route-renderer/page-loading/page-module-loader.js +136 -124
  389. package/src/route-renderer/page-loading/resolved-page-dependencies.d.ts +12 -0
  390. package/src/route-renderer/page-loading/resolved-page-dependencies.js +38 -0
  391. package/src/route-renderer/route-renderer.js +74 -76
  392. package/src/router/README.md +31 -0
  393. package/src/router/client/link-intent.d.ts +11 -21
  394. package/src/router/client/link-intent.js +56 -30
  395. package/src/router/client/link-intent.test.browser.js +50 -39
  396. package/src/router/client/link-navigation-policy.d.ts +45 -0
  397. package/src/router/client/link-navigation-policy.js +122 -0
  398. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  399. package/src/router/client/link-navigation-policy.test.browser.js +82 -0
  400. package/src/router/client/navigation-coordinator.d.ts +1 -1
  401. package/src/router/client/navigation-coordinator.js +235 -211
  402. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  403. package/src/router/client/navigation-lifecycle.js +50 -0
  404. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  405. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  406. package/src/router/server/route-registry.js +237 -242
  407. package/src/services/README.md +5 -0
  408. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  409. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -50
  410. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +12 -1
  411. package/src/services/assets/asset-processing-service/asset-processing.service.js +335 -268
  412. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  413. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  414. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  415. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +1 -1
  416. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  417. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  418. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +115 -0
  419. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -58
  420. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  421. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +5 -0
  422. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  423. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +85 -60
  424. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  425. package/src/services/assets/asset-processing-service/index.js +8 -6
  426. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  427. package/src/services/assets/asset-processing-service/inline-content-script-body.js +23 -0
  428. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  429. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +22 -0
  430. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  431. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  432. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  433. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  434. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  435. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -130
  436. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  437. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  438. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +111 -111
  439. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  440. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -94
  441. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  442. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  443. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +26 -57
  444. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  445. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +33 -67
  446. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  447. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +44 -0
  448. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  449. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +15 -0
  450. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  451. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -44
  452. package/src/services/assets/browser-bundle.service.d.ts +27 -31
  453. package/src/services/assets/browser-bundle.service.js +54 -49
  454. package/src/services/assets/browser-runtime-asset-generation.d.ts +17 -0
  455. package/src/services/assets/browser-runtime-asset-generation.js +28 -0
  456. package/src/services/cache/cache.types.d.ts +4 -2
  457. package/src/services/cache/cache.types.js +5 -0
  458. package/src/services/cache/html-page-cache-dependency-index.d.ts +34 -0
  459. package/src/services/cache/html-page-cache-dependency-index.js +88 -0
  460. package/src/services/cache/index.d.ts +2 -0
  461. package/src/services/cache/index.js +8 -7
  462. package/src/services/cache/memory-cache-store.js +101 -89
  463. package/src/services/cache/page-cache-service.d.ts +31 -1
  464. package/src/services/cache/page-cache-service.js +237 -150
  465. package/src/services/cache/page-request-cache-coordinator.service.d.ts +2 -1
  466. package/src/services/cache/page-request-cache-coordinator.service.js +112 -102
  467. package/src/services/html/html-rewriter-provider.service.js +61 -61
  468. package/src/services/html/html-transformer.service.js +249 -266
  469. package/src/services/invalidation/development-invalidation.service.d.ts +15 -1
  470. package/src/services/invalidation/development-invalidation.service.js +241 -204
  471. package/src/services/module-loading/README.md +9 -6
  472. package/src/services/module-loading/app-module-loader.service.js +1 -0
  473. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  474. package/src/services/module-loading/app-server-module-transpiler.service.js +104 -106
  475. package/src/services/module-loading/collection-server-module-build.service.d.ts +19 -0
  476. package/src/services/module-loading/collection-server-module-build.service.js +83 -0
  477. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  478. package/src/services/module-loading/module-loading-types.js +1 -0
  479. package/src/services/module-loading/page-module-import.service.d.ts +7 -12
  480. package/src/services/module-loading/page-module-import.service.js +232 -206
  481. package/src/services/module-loading/route-module-build-cache-registry.d.ts +2 -0
  482. package/src/services/module-loading/route-module-build-cache-registry.js +59 -33
  483. package/src/services/module-loading/route-module-build-cache.js +3 -38
  484. package/src/services/module-loading/route-module-build-cache.store.d.ts +10 -0
  485. package/src/services/module-loading/route-module-build-cache.store.js +213 -196
  486. package/src/services/module-loading/route-module-build-manifest.d.ts +10 -14
  487. package/src/services/module-loading/route-module-build-manifest.js +54 -118
  488. package/src/services/module-loading/route-module-dependency-hasher.d.ts +2 -2
  489. package/src/services/module-loading/route-module-dependency-hasher.js +136 -109
  490. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -3
  491. package/src/services/module-loading/server-module-transpiler.service.js +65 -62
  492. package/src/services/module-loading/source-module-support.js +15 -7
  493. package/src/services/runtime-state/dev-graph.service.js +165 -157
  494. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  495. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  496. package/src/services/validation/schema-validation-service.d.ts +1 -4
  497. package/src/services/validation/schema-validation-service.js +156 -95
  498. package/src/services/validation/standard-schema.types.d.ts +9 -62
  499. package/src/services/validation/standard-schema.types.js +1 -0
  500. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  501. package/src/services/validation/validate-standard-schema.js +14 -0
  502. package/src/static-site-generator/README.md +10 -2
  503. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +32 -0
  504. package/src/static-site-generator/production-page-browser-graph-prebuild.js +57 -0
  505. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  506. package/src/static-site-generator/sitemap-routes.js +36 -0
  507. package/src/static-site-generator/sitemap.d.ts +15 -0
  508. package/src/static-site-generator/sitemap.js +42 -0
  509. package/src/static-site-generator/static-build-invalidation.d.ts +2 -2
  510. package/src/static-site-generator/static-build-invalidation.js +33 -74
  511. package/src/static-site-generator/static-export-context.d.ts +9 -1
  512. package/src/static-site-generator/static-export-context.js +1 -0
  513. package/src/static-site-generator/static-site-generator.d.ts +27 -6
  514. package/src/static-site-generator/static-site-generator.js +528 -389
  515. package/src/types/internal-types.d.ts +55 -17
  516. package/src/types/internal-types.js +1 -0
  517. package/src/types/public-types.d.ts +236 -95
  518. package/src/types/public-types.js +1 -0
  519. package/src/utils/deep-merge.js +39 -26
  520. package/src/utils/ecopages-route-info.d.ts +26 -0
  521. package/src/utils/ecopages-route-info.js +30 -0
  522. package/src/utils/hash.js +3 -6
  523. package/src/utils/html-escaping.d.ts +7 -0
  524. package/src/utils/html-escaping.js +22 -5
  525. package/src/utils/invariant.js +11 -10
  526. package/src/utils/locals-utils.js +32 -22
  527. package/src/utils/parse-cli-args.d.ts +1 -0
  528. package/src/utils/parse-cli-args.js +73 -62
  529. package/src/utils/path-pattern.d.ts +23 -0
  530. package/src/utils/path-pattern.js +42 -0
  531. package/src/utils/path-utils.module.js +8 -11
  532. package/src/utils/resolve-entry-file.js +70 -38
  533. package/src/utils/resolve-work-dir.js +23 -27
  534. package/src/utils/runtime.js +24 -33
  535. package/src/utils/server-utils.module.d.ts +3 -2
  536. package/src/utils/server-utils.module.js +60 -53
  537. package/src/utils/static-file-extensions.d.ts +12 -0
  538. package/src/utils/static-file-extensions.js +54 -0
  539. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  540. package/src/watchers/project-watcher-ignore.js +17 -0
  541. package/src/watchers/project-watcher.d.ts +21 -6
  542. package/src/watchers/project-watcher.js +402 -277
  543. package/src/watchers/project-watcher.test-helpers.js +45 -50
  544. package/src/adapters/shared/api-response.js +0 -96
  545. package/src/adapters/shared/application-adapter.js +0 -90
  546. package/src/adapters/shared/bun-user-websocket-lifecycle.js +0 -102
  547. package/src/adapters/shared/copy-runtime-public-dir.js +0 -24
  548. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  549. package/src/adapters/shared/define-api-handler.js +0 -15
  550. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  551. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  552. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  553. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  554. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  555. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  556. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  557. package/src/adapters/shared/hmr-html-response.js +0 -33
  558. package/src/adapters/shared/node-http-websocket-upgrades.js +0 -125
  559. package/src/adapters/shared/render-context.js +0 -93
  560. package/src/adapters/shared/runtime-app-bootstrap.js +0 -41
  561. package/src/adapters/shared/runtime-host.js +0 -0
  562. package/src/adapters/shared/server-adapter.js +0 -436
  563. package/src/adapters/shared/server-route-handler.js +0 -111
  564. package/src/adapters/shared/server-static-builder.js +0 -202
  565. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -61
  566. package/src/adapters/shared/shared-hmr-manager.js +0 -273
  567. package/src/adapters/shared/static-preview-host.js +0 -0
  568. package/src/adapters/shared/websocket-lifecycle.d.ts +0 -3
  569. package/src/adapters/shared/websocket-lifecycle.js +0 -19
  570. package/src/build/browser-runtime-manifest.js +0 -61
  571. package/src/build/browser-runtime-plugin-helpers.js +0 -14
  572. package/src/build/browser-runtime-plugin.js +0 -173
  573. package/src/build/build-input-fingerprint.js +0 -31
  574. package/src/build/build-manifest.d.ts +0 -33
  575. package/src/build/build-manifest.js +0 -49
  576. package/src/build/build-types.js +0 -0
  577. package/src/build/jsx-ownership-plugins.d.ts +0 -10
  578. package/src/build/jsx-ownership-plugins.js +0 -17
  579. package/src/build/pages-unified-graph-build.js +0 -208
  580. package/src/build/parallel-build-executor.js +0 -52
  581. package/src/build/rolldown-adapter-helpers.js +0 -310
  582. package/src/build/rolldown-build-adapter.js +0 -67
  583. package/src/build/rolldown-build-invocation-metrics.js +0 -43
  584. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  585. package/src/build/rolldown-dev-build-adapter.js +0 -182
  586. package/src/build/rolldown-plugin-bridge.js +0 -211
  587. package/src/build/rolldown-source-transform-pass.js +0 -58
  588. package/src/build/runtime-build-executor.d.ts +0 -15
  589. package/src/build/runtime-build-executor.js +0 -43
  590. package/src/build/runtime-build-output-normalizer.js +0 -203
  591. package/src/build/serialized-build-executor.js +0 -63
  592. package/src/build/server-entry-build-cache.js +0 -169
  593. package/src/build/server-side-css-shim-plugin.js +0 -35
  594. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  595. package/src/hmr/hmr.test.e2e.js +0 -54
  596. package/src/integrations/ghtml/ghtml-renderer.js +0 -57
  597. package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
  598. package/src/integrations/ghtml/ghtml.constants.js +0 -4
  599. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
  600. package/src/integrations/ghtml/ghtml.plugin.js +0 -20
  601. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  602. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  603. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  604. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -231
  605. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  606. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  607. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  608. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  609. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  610. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  611. package/src/route-renderer/orchestration/render-output.utils.js +0 -175
  612. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -578
  613. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  614. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  615. package/src/utils/html.d.ts +0 -1
  616. package/src/utils/html.js +0 -4
  617. /package/src/adapters/{shared → bun}/bun-user-websocket-lifecycle.d.ts +0 -0
  618. /package/src/adapters/shared/{copy-runtime-public-dir.d.ts → runtime/copy-runtime-public-dir.d.ts} +0 -0
  619. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  620. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → adapters/shared/runtime/runtime-host.js} +0 -0
  621. /package/src/{hmr/hmr.test.e2e.d.ts → adapters/shared/runtime/static-preview-host.js} +0 -0
  622. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  623. /package/src/build/{runtime-build-output-normalizer.d.ts → rolldown/runtime-build-output-normalizer.d.ts} +0 -0
  624. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
@@ -0,0 +1,78 @@
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
+ const COMPILED_CLIENT_FILE = 'src/bootstrap.js';
6
+ /**
7
+ * Returns the configured dev-toolbar client package specifier, if any.
8
+ */
9
+ export function getDevToolbarPackageSpec(appConfig) {
10
+ const spec = appConfig.devToolbar?.package?.trim();
11
+ return spec || undefined;
12
+ }
13
+ /**
14
+ * Resolves the dev-toolbar package root from an application project directory.
15
+ *
16
+ * @remarks Walks up from the package entry rather than resolving `package.json`
17
+ * directly so packages with strict `exports` (no `./package.json` subpath) still work.
18
+ */
19
+ export function resolveDevToolbarPackageRoot(rootDir, packageSpec) {
20
+ const require = createRequire(path.join(rootDir, 'package.json'));
21
+ let dir = path.dirname(require.resolve(packageSpec));
22
+ while (dir !== path.dirname(dir)) {
23
+ if (fileSystem.exists(path.join(dir, 'package.json'))) {
24
+ return dir;
25
+ }
26
+ dir = path.dirname(dir);
27
+ }
28
+ throw new Error(`Could not resolve package root for ${packageSpec}`);
29
+ }
30
+ /**
31
+ * Resolves the browser entrypoint core bundles into `/_dev_toolbar.js`.
32
+ *
33
+ * @remarks Prefers `src/bootstrap.js` when present (published npm or `file:` to
34
+ * `dist`), then `bootstrap.ts` for workspace source checkouts.
35
+ */
36
+ export function resolveDevToolbarClient(rootDir, packageSpec) {
37
+ const require = createRequire(path.join(rootDir, 'package.json'));
38
+ const packageRoot = resolveDevToolbarPackageRoot(rootDir, packageSpec);
39
+ const entryCandidates = [path.join(packageRoot, COMPILED_CLIENT_FILE), path.join(packageRoot, SOURCE_CLIENT_FILE)];
40
+ for (const entryPath of entryCandidates) {
41
+ if (fileSystem.exists(entryPath)) {
42
+ return { entryPath };
43
+ }
44
+ }
45
+ try {
46
+ return { entryPath: require.resolve(packageSpec) };
47
+ }
48
+ catch {
49
+ return undefined;
50
+ }
51
+ }
52
+ /**
53
+ * Resolves the configured dev-toolbar client for an app config, when present.
54
+ */
55
+ export function resolveConfiguredDevToolbarClient(appConfig) {
56
+ const packageSpec = getDevToolbarPackageSpec(appConfig);
57
+ if (!packageSpec) {
58
+ return undefined;
59
+ }
60
+ return resolveDevToolbarClient(appConfig.absolutePaths.projectDir, packageSpec);
61
+ }
62
+ /**
63
+ * Resolves a dev-toolbar client entry module from the application project root.
64
+ */
65
+ export function resolveDevToolbarPackageEntry(rootDir, packageSpec) {
66
+ const client = resolveDevToolbarClient(rootDir, packageSpec);
67
+ if (!client) {
68
+ const require = createRequire(path.join(rootDir, 'package.json'));
69
+ return require.resolve(packageSpec);
70
+ }
71
+ return client.entryPath;
72
+ }
73
+ /**
74
+ * Resolves the configured dev-toolbar entry for an app config, when present.
75
+ */
76
+ export function resolveConfiguredDevToolbarEntry(appConfig) {
77
+ return resolveConfiguredDevToolbarClient(appConfig)?.entryPath;
78
+ }
@@ -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
+ }
@@ -0,0 +1,18 @@
1
+ import type { BuildResult } from '../build/build-adapter.js';
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
+ */
11
+ declare class RequestBuildDedupe {
12
+ private readonly storage;
13
+ run<T>(fn: () => Promise<T>): Promise<T>;
14
+ dedupeBuild(key: string, build: () => Promise<BuildResult>): Promise<BuildResult>;
15
+ getCachedCountForTests(): number;
16
+ }
17
+ export declare const requestBuildDedupe: RequestBuildDedupe;
18
+ export {};
@@ -0,0 +1,39 @@
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
+ */
11
+ class RequestBuildDedupe {
12
+ storage = new AsyncLocalStorage();
13
+ run(fn) {
14
+ if (this.storage.getStore()) {
15
+ return fn();
16
+ }
17
+ return this.storage.run(new Map(), fn);
18
+ }
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;
34
+ }
35
+ getCachedCountForTests() {
36
+ return this.storage.getStore()?.size ?? 0;
37
+ }
38
+ }
39
+ export const requestBuildDedupe = new RequestBuildDedupe();
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Per-request and process-wide counters for the development render pipeline.
3
+ *
4
+ * @remarks
5
+ * Gated behind {@link isRequestPipelineMetricsEnabled} so production paths stay quiet.
6
+ * Benchmarks and structural invariant tests read the snapshot via
7
+ * {@link getRequestPipelineMetricsSnapshot}.
8
+ */
9
+ export type PageModuleLoadOutcome = 'import-cache-hit' | 'disk-cache-hit' | 'cold-build' | 'host-loader' | 'unified-graph';
10
+ export type RouteRenderPhase = 'resolve-route-inputs' | 'ownership-validation' | 'resolve-dependencies' | 'page-browser-graph' | 'render-body' | 'transform-response';
11
+ export type RouteRenderPhaseRecord = {
12
+ count: number;
13
+ totalDurationMs: number;
14
+ lastDurationMs: number;
15
+ };
16
+ export type RequestPipelineMetricsSnapshot = {
17
+ runtime: 'node' | 'bun';
18
+ pageModuleLoads: number;
19
+ pageModuleBuilds: number;
20
+ pageModuleCacheHits: number;
21
+ hostLoaderLoads: number;
22
+ diskCacheHits: number;
23
+ routeModuleArtifacts: number;
24
+ mdxTransforms: number;
25
+ collectionBuilds: number;
26
+ routeRenderPhases: Partial<Record<RouteRenderPhase, RouteRenderPhaseRecord>>;
27
+ };
28
+ export declare function isRequestPipelineMetricsEnabled(): boolean;
29
+ export declare function getRequestPipelineMetricsHeaderName(): string;
30
+ export declare function resolveRequestPipelineRuntime(): 'node' | 'bun';
31
+ export declare function recordPageModuleLoad(outcome: PageModuleLoadOutcome, artifactCount?: number): void;
32
+ export declare function recordMdxTransform(): void;
33
+ export declare function recordCollectionBuild(): void;
34
+ export declare function recordRouteRenderPhase(phase: RouteRenderPhase, durationMs: number): void;
35
+ export declare function measureRouteRenderPhase<T>(phase: RouteRenderPhase, fn: () => Promise<T>): Promise<T>;
36
+ export declare function getRequestPipelineMetricsSnapshot(): RequestPipelineMetricsSnapshot;
37
+ export declare function serializeRequestPipelineMetricsHeader(): string;
38
+ export declare function resetRequestPipelineMetrics(): void;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Per-request and process-wide counters for the development render pipeline.
3
+ *
4
+ * @remarks
5
+ * Gated behind {@link isRequestPipelineMetricsEnabled} so production paths stay quiet.
6
+ * Benchmarks and structural invariant tests read the snapshot via
7
+ * {@link getRequestPipelineMetricsSnapshot}.
8
+ */
9
+ const METRICS_HEADER = 'x-ecopages-pipeline-metrics';
10
+ let pageModuleLoads = 0;
11
+ let pageModuleBuilds = 0;
12
+ let pageModuleCacheHits = 0;
13
+ let hostLoaderLoads = 0;
14
+ let diskCacheHits = 0;
15
+ let routeModuleArtifacts = 0;
16
+ let mdxTransforms = 0;
17
+ let collectionBuilds = 0;
18
+ const routeRenderPhases = new Map();
19
+ export function isRequestPipelineMetricsEnabled() {
20
+ return (process.env.ECOPAGES_REQUEST_PIPELINE_METRICS === '1' ||
21
+ process.env.ECOPAGES_ROLLDOWN_BUILD_METRICS === '1' ||
22
+ process.env.ECOPAGES_LOGGER_DEBUG === 'true');
23
+ }
24
+ export function getRequestPipelineMetricsHeaderName() {
25
+ return METRICS_HEADER;
26
+ }
27
+ export function resolveRequestPipelineRuntime() {
28
+ return typeof Bun !== 'undefined' ? 'bun' : 'node';
29
+ }
30
+ export function recordPageModuleLoad(outcome, artifactCount = 0) {
31
+ if (!isRequestPipelineMetricsEnabled()) {
32
+ return;
33
+ }
34
+ pageModuleLoads += 1;
35
+ switch (outcome) {
36
+ case 'import-cache-hit':
37
+ pageModuleCacheHits += 1;
38
+ break;
39
+ case 'disk-cache-hit':
40
+ diskCacheHits += 1;
41
+ break;
42
+ case 'cold-build':
43
+ pageModuleBuilds += 1;
44
+ routeModuleArtifacts += artifactCount;
45
+ break;
46
+ case 'host-loader':
47
+ hostLoaderLoads += 1;
48
+ break;
49
+ case 'unified-graph':
50
+ break;
51
+ }
52
+ }
53
+ export function recordMdxTransform() {
54
+ if (!isRequestPipelineMetricsEnabled()) {
55
+ return;
56
+ }
57
+ mdxTransforms += 1;
58
+ }
59
+ export function recordCollectionBuild() {
60
+ if (!isRequestPipelineMetricsEnabled()) {
61
+ return;
62
+ }
63
+ collectionBuilds += 1;
64
+ }
65
+ export function recordRouteRenderPhase(phase, durationMs) {
66
+ if (!isRequestPipelineMetricsEnabled()) {
67
+ return;
68
+ }
69
+ const existing = routeRenderPhases.get(phase);
70
+ if (existing) {
71
+ existing.count += 1;
72
+ existing.totalDurationMs += durationMs;
73
+ existing.lastDurationMs = durationMs;
74
+ return;
75
+ }
76
+ routeRenderPhases.set(phase, {
77
+ count: 1,
78
+ totalDurationMs: durationMs,
79
+ lastDurationMs: durationMs,
80
+ });
81
+ }
82
+ export async function measureRouteRenderPhase(phase, fn) {
83
+ if (!isRequestPipelineMetricsEnabled()) {
84
+ return fn();
85
+ }
86
+ const startedAt = performance.now();
87
+ try {
88
+ return await fn();
89
+ }
90
+ finally {
91
+ recordRouteRenderPhase(phase, performance.now() - startedAt);
92
+ }
93
+ }
94
+ export function getRequestPipelineMetricsSnapshot() {
95
+ return {
96
+ runtime: resolveRequestPipelineRuntime(),
97
+ pageModuleLoads,
98
+ pageModuleBuilds,
99
+ pageModuleCacheHits,
100
+ hostLoaderLoads,
101
+ diskCacheHits,
102
+ routeModuleArtifacts,
103
+ mdxTransforms,
104
+ collectionBuilds,
105
+ routeRenderPhases: Object.fromEntries(routeRenderPhases),
106
+ };
107
+ }
108
+ export function serializeRequestPipelineMetricsHeader() {
109
+ return JSON.stringify(getRequestPipelineMetricsSnapshot());
110
+ }
111
+ export function resetRequestPipelineMetrics() {
112
+ pageModuleLoads = 0;
113
+ pageModuleBuilds = 0;
114
+ pageModuleCacheHits = 0;
115
+ hostLoaderLoads = 0;
116
+ diskCacheHits = 0;
117
+ routeModuleArtifacts = 0;
118
+ mdxTransforms = 0;
119
+ collectionBuilds = 0;
120
+ routeRenderPhases.clear();
121
+ }
@@ -0,0 +1,81 @@
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
+ type PhaseRecord = {
3
+ durationMs: number;
4
+ wallMs: number;
5
+ };
6
+ export type StartupTraceReport = {
7
+ generatedAt: string;
8
+ runtime: string;
9
+ platform: string;
10
+ phases: Partial<Record<StartupTracePhase, PhaseRecord>>;
11
+ firstRequest?: {
12
+ path: string;
13
+ bundleCount: number;
14
+ clientBundleBytes: number;
15
+ graphBuildCount: number;
16
+ wallMs: number;
17
+ };
18
+ client?: {
19
+ requestCount: number;
20
+ transferredBytes: number;
21
+ hmrConnected: boolean;
22
+ hydrationReadyMs: number | null;
23
+ };
24
+ };
25
+ declare class StartupTrace {
26
+ private readonly phaseNesting;
27
+ private readonly phases;
28
+ private firstRequestPending;
29
+ private firstRequestPath;
30
+ private firstRequestBundleCount;
31
+ private firstRequestClientBytes;
32
+ private firstRequestGraphBuildCount;
33
+ private firstRequestCompletedWallMs;
34
+ private summaryEmitted;
35
+ private firstPageBrowserGraphEmitted;
36
+ private devClientTransformEmitted;
37
+ private clientRequestCount;
38
+ private clientTransferredBytes;
39
+ private hmrConnected;
40
+ private hydrationReadyMs;
41
+ isEnabled(): boolean;
42
+ markPhaseStart(phase: StartupTracePhase): void;
43
+ markPhaseEnd(phase: StartupTracePhase): void;
44
+ markConfigReady(): void;
45
+ markServerListening(): void;
46
+ beginServerListen(): void;
47
+ markFirstByte(): void;
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
+ */
56
+ markFirstPageBrowserGraphReady(graphBuildCount?: number): void;
57
+ recordBrowserBundle(outputs: Array<{
58
+ path: string;
59
+ }>): void;
60
+ recordClientTransfer(requestCount: number, transferredBytes: number): void;
61
+ beginClientTransfer(): void;
62
+ recordClientHydration(durationMs: number): void;
63
+ beginClientHydration(): void;
64
+ recordHmrConnected(): void;
65
+ traceFirstRequest<T>(request: Request, handler: () => Promise<T>): Promise<T>;
66
+ private emitFirstRequestSummary;
67
+ private writeJsonReport;
68
+ createReport(): StartupTraceReport;
69
+ /** Resets mutable trace state for unit tests. */
70
+ resetForTests(): void;
71
+ /**
72
+ * Resets only the first-request bundle counters.
73
+ *
74
+ * @remarks
75
+ * Used by tests that need to re-measure first-request browser bundle work
76
+ * without clearing earlier startup phase records.
77
+ */
78
+ resetFirstRequestCounters(): void;
79
+ }
80
+ export declare const startupTrace: StartupTrace;
81
+ export {};
@@ -0,0 +1,281 @@
1
+ import { mkdirSync, statSync, writeFileSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { availableParallelism } from 'node:os';
4
+ import { fileSystem } from '@ecopages/file-system';
5
+ const LOG_PREFIX = '[ecopages:startup-trace]';
6
+ function isStartupTraceEnabled() {
7
+ return process.env.ECOPAGES_STARTUP_TRACE === 'true' || process.env.ECOPAGES_LOGGER_DEBUG === 'true';
8
+ }
9
+ function wallMsSinceProcessStart() {
10
+ return Math.round(process.uptime() * 1000);
11
+ }
12
+ function resolveTraceBuildParallelism() {
13
+ const fromEnv = process.env.ECOPAGES_DEV_BUILD_PARALLELISM ?? process.env.ECOPAGES_DEV_HMR_PARALLELISM;
14
+ if (fromEnv) {
15
+ return fromEnv;
16
+ }
17
+ return String(Math.max(1, availableParallelism()));
18
+ }
19
+ function writeTraceLine(message) {
20
+ process.stderr.write(`${LOG_PREFIX} ${message}\n`);
21
+ }
22
+ function resolveStartupTraceJsonPath() {
23
+ const configured = process.env.ECOPAGES_STARTUP_TRACE_JSON?.trim();
24
+ return configured && configured.length > 0 ? configured : undefined;
25
+ }
26
+ class StartupTrace {
27
+ phaseNesting = new Map();
28
+ phases = new Map();
29
+ firstRequestPending = true;
30
+ firstRequestPath;
31
+ firstRequestBundleCount = 0;
32
+ firstRequestClientBytes = 0;
33
+ firstRequestGraphBuildCount = 0;
34
+ firstRequestCompletedWallMs;
35
+ summaryEmitted = false;
36
+ firstPageBrowserGraphEmitted = false;
37
+ devClientTransformEmitted = false;
38
+ clientRequestCount = 0;
39
+ clientTransferredBytes = 0;
40
+ hmrConnected = false;
41
+ hydrationReadyMs = null;
42
+ isEnabled() {
43
+ return isStartupTraceEnabled();
44
+ }
45
+ markPhaseStart(phase) {
46
+ if (!isStartupTraceEnabled() || this.phases.has(phase)) {
47
+ return;
48
+ }
49
+ const nesting = this.phaseNesting.get(phase);
50
+ if (!nesting) {
51
+ this.phaseNesting.set(phase, { outerStart: performance.now(), depth: 1 });
52
+ return;
53
+ }
54
+ nesting.depth += 1;
55
+ }
56
+ markPhaseEnd(phase) {
57
+ if (!isStartupTraceEnabled() || this.phases.has(phase)) {
58
+ return;
59
+ }
60
+ const nesting = this.phaseNesting.get(phase);
61
+ if (!nesting) {
62
+ return;
63
+ }
64
+ nesting.depth -= 1;
65
+ if (nesting.depth > 0) {
66
+ return;
67
+ }
68
+ const durationMs = Math.round(performance.now() - nesting.outerStart);
69
+ const record = {
70
+ durationMs,
71
+ wallMs: wallMsSinceProcessStart(),
72
+ };
73
+ this.phases.set(phase, record);
74
+ this.phaseNesting.delete(phase);
75
+ writeTraceLine(`phase=${phase} durationMs=${durationMs} wallMs=${record.wallMs}`);
76
+ this.writeJsonReport();
77
+ }
78
+ markConfigReady() {
79
+ if (!isStartupTraceEnabled() || this.phases.has('config-ready')) {
80
+ return;
81
+ }
82
+ const record = {
83
+ durationMs: 0,
84
+ wallMs: wallMsSinceProcessStart(),
85
+ };
86
+ this.phases.set('config-ready', record);
87
+ writeTraceLine(`phase=config-ready wallMs=${record.wallMs} buildParallelism=${resolveTraceBuildParallelism()}`);
88
+ this.writeJsonReport();
89
+ }
90
+ markServerListening() {
91
+ this.markPhaseEnd('server-listen');
92
+ }
93
+ beginServerListen() {
94
+ this.markPhaseStart('server-listen');
95
+ }
96
+ markFirstByte() {
97
+ if (!isStartupTraceEnabled() || this.phases.has('first-byte')) {
98
+ return;
99
+ }
100
+ this.markPhaseEnd('first-byte');
101
+ }
102
+ beginFirstByte() {
103
+ this.markPhaseStart('first-byte');
104
+ }
105
+ beginDevClientTransform() {
106
+ if (!isStartupTraceEnabled() || this.devClientTransformEmitted) {
107
+ return;
108
+ }
109
+ this.markPhaseStart('dev-client-transform');
110
+ }
111
+ endDevClientTransform() {
112
+ if (!isStartupTraceEnabled() || this.devClientTransformEmitted) {
113
+ return;
114
+ }
115
+ this.devClientTransformEmitted = true;
116
+ this.markPhaseEnd('dev-client-transform');
117
+ }
118
+ /**
119
+ * Records the first Page Browser Graph completion for startup tracing.
120
+ *
121
+ * @param graphBuildCount Session graph build counter when the first Page Browser Graph finished.
122
+ */
123
+ markFirstPageBrowserGraphReady(graphBuildCount) {
124
+ if (!isStartupTraceEnabled() || this.firstPageBrowserGraphEmitted) {
125
+ return;
126
+ }
127
+ if (this.firstRequestPending && typeof graphBuildCount === 'number') {
128
+ this.firstRequestGraphBuildCount = graphBuildCount;
129
+ }
130
+ this.firstPageBrowserGraphEmitted = true;
131
+ this.markPhaseEnd('first-page-browser-graph');
132
+ }
133
+ recordBrowserBundle(outputs) {
134
+ if (!isStartupTraceEnabled() || !this.firstRequestPending) {
135
+ return;
136
+ }
137
+ this.firstRequestBundleCount += 1;
138
+ for (const output of outputs) {
139
+ try {
140
+ if (fileSystem.exists(output.path)) {
141
+ this.firstRequestClientBytes += statSync(output.path).size;
142
+ }
143
+ }
144
+ catch {
145
+ // ignore unreadable outputs
146
+ }
147
+ }
148
+ }
149
+ recordClientTransfer(requestCount, transferredBytes) {
150
+ if (!isStartupTraceEnabled()) {
151
+ return;
152
+ }
153
+ this.clientRequestCount = requestCount;
154
+ this.clientTransferredBytes = transferredBytes;
155
+ this.markPhaseEnd('client-transfer');
156
+ }
157
+ beginClientTransfer() {
158
+ this.markPhaseStart('client-transfer');
159
+ }
160
+ recordClientHydration(durationMs) {
161
+ if (!isStartupTraceEnabled()) {
162
+ return;
163
+ }
164
+ this.hydrationReadyMs = durationMs;
165
+ this.markPhaseEnd('client-hydration');
166
+ }
167
+ beginClientHydration() {
168
+ this.markPhaseStart('client-hydration');
169
+ }
170
+ recordHmrConnected() {
171
+ if (!isStartupTraceEnabled()) {
172
+ return;
173
+ }
174
+ this.hmrConnected = true;
175
+ }
176
+ async traceFirstRequest(request, handler) {
177
+ if (!this.firstRequestPending) {
178
+ return handler();
179
+ }
180
+ this.firstRequestPath = new URL(request.url).pathname;
181
+ if (!isStartupTraceEnabled()) {
182
+ this.firstRequestPending = false;
183
+ return handler();
184
+ }
185
+ this.markPhaseStart('first-page-browser-graph');
186
+ this.markPhaseStart('first-request-ssr');
187
+ try {
188
+ return await handler();
189
+ }
190
+ finally {
191
+ this.markPhaseEnd('first-request-ssr');
192
+ this.firstRequestCompletedWallMs = wallMsSinceProcessStart();
193
+ this.emitFirstRequestSummary();
194
+ this.firstRequestPending = false;
195
+ this.writeJsonReport();
196
+ }
197
+ }
198
+ emitFirstRequestSummary() {
199
+ if (!isStartupTraceEnabled() || this.summaryEmitted) {
200
+ return;
201
+ }
202
+ this.summaryEmitted = true;
203
+ writeTraceLine([
204
+ 'summary',
205
+ `path=${this.firstRequestPath ?? 'unknown'}`,
206
+ `bundleCount=${this.firstRequestBundleCount}`,
207
+ `clientBundleBytes=${this.firstRequestClientBytes}`,
208
+ `graphBuildCount=${this.firstRequestGraphBuildCount}`,
209
+ `wallMs=${wallMsSinceProcessStart()}`,
210
+ ].join(' '));
211
+ }
212
+ writeJsonReport() {
213
+ const outputPath = resolveStartupTraceJsonPath();
214
+ if (!outputPath) {
215
+ return;
216
+ }
217
+ const report = this.createReport();
218
+ mkdirSync(path.dirname(outputPath), { recursive: true });
219
+ writeFileSync(outputPath, JSON.stringify(report, null, 2), 'utf-8');
220
+ }
221
+ createReport() {
222
+ const phases = {};
223
+ for (const [phase, record] of this.phases) {
224
+ phases[phase] = record;
225
+ }
226
+ return {
227
+ generatedAt: new Date().toISOString(),
228
+ runtime: typeof Bun !== 'undefined' ? `bun ${Bun.version}` : `node ${process.version}`,
229
+ platform: process.platform,
230
+ phases,
231
+ firstRequest: this.firstRequestPath
232
+ ? {
233
+ path: this.firstRequestPath,
234
+ bundleCount: this.firstRequestBundleCount,
235
+ clientBundleBytes: this.firstRequestClientBytes,
236
+ graphBuildCount: this.firstRequestGraphBuildCount,
237
+ wallMs: this.firstRequestCompletedWallMs ?? wallMsSinceProcessStart(),
238
+ }
239
+ : undefined,
240
+ client: this.clientRequestCount > 0 || this.hydrationReadyMs !== null
241
+ ? {
242
+ requestCount: this.clientRequestCount,
243
+ transferredBytes: this.clientTransferredBytes,
244
+ hmrConnected: this.hmrConnected,
245
+ hydrationReadyMs: this.hydrationReadyMs,
246
+ }
247
+ : undefined,
248
+ };
249
+ }
250
+ /** Resets mutable trace state for unit tests. */
251
+ resetForTests() {
252
+ this.phaseNesting.clear();
253
+ this.phases.clear();
254
+ this.firstRequestPending = true;
255
+ this.firstRequestPath = undefined;
256
+ this.firstRequestBundleCount = 0;
257
+ this.firstRequestClientBytes = 0;
258
+ this.firstRequestGraphBuildCount = 0;
259
+ this.firstRequestCompletedWallMs = undefined;
260
+ this.summaryEmitted = false;
261
+ this.firstPageBrowserGraphEmitted = false;
262
+ this.devClientTransformEmitted = false;
263
+ this.clientRequestCount = 0;
264
+ this.clientTransferredBytes = 0;
265
+ this.hmrConnected = false;
266
+ this.hydrationReadyMs = null;
267
+ }
268
+ /**
269
+ * Resets only the first-request bundle counters.
270
+ *
271
+ * @remarks
272
+ * Used by tests that need to re-measure first-request browser bundle work
273
+ * without clearing earlier startup phase records.
274
+ */
275
+ resetFirstRequestCounters() {
276
+ this.firstRequestBundleCount = 0;
277
+ this.firstRequestClientBytes = 0;
278
+ this.firstRequestGraphBuildCount = 0;
279
+ }
280
+ }
281
+ export const startupTrace = new StartupTrace();