@ecopages/core 0.2.0-beta.4 → 0.2.0-beta.41

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 (611) hide show
  1. package/README.md +40 -9
  2. package/package.json +371 -33
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +115 -6
  5. package/src/adapters/abstract/application-adapter.js +261 -120
  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 +16 -2
  10. package/src/adapters/abstract/server-adapter.js +22 -14
  11. package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
  12. package/src/adapters/abstract/ws-pattern-matcher.js +28 -0
  13. package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
  14. package/src/adapters/bun/bun-user-websocket-lifecycle.js +93 -0
  15. package/src/adapters/bun/client-bridge.d.ts +1 -0
  16. package/src/adapters/bun/client-bridge.js +51 -47
  17. package/src/adapters/bun/create-app.d.ts +9 -6
  18. package/src/adapters/bun/create-app.js +171 -130
  19. package/src/adapters/bun/hmr-manager.d.ts +1 -1
  20. package/src/adapters/bun/hmr-manager.js +62 -57
  21. package/src/adapters/bun/index.d.ts +1 -1
  22. package/src/adapters/bun/index.js +2 -8
  23. package/src/adapters/bun/runtime-host.d.ts +1 -1
  24. package/src/adapters/bun/runtime-host.js +61 -54
  25. package/src/adapters/bun/server-adapter.d.ts +91 -41
  26. package/src/adapters/bun/server-adapter.js +566 -426
  27. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  28. package/src/adapters/bun/static-preview-host.js +43 -41
  29. package/src/adapters/create-app.d.ts +13 -11
  30. package/src/adapters/create-app.js +11 -63
  31. package/src/adapters/index.d.ts +2 -2
  32. package/src/adapters/index.js +2 -8
  33. package/src/adapters/node/create-app.d.ts +8 -3
  34. package/src/adapters/node/create-app.js +126 -84
  35. package/src/adapters/node/http-request-bridge.js +147 -106
  36. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  37. package/src/adapters/node/node-client-bridge.js +62 -61
  38. package/src/adapters/node/node-hmr-manager.d.ts +1 -1
  39. package/src/adapters/node/node-hmr-manager.js +58 -48
  40. package/src/adapters/node/runtime-host.d.ts +1 -1
  41. package/src/adapters/node/runtime-host.js +96 -89
  42. package/src/adapters/node/server-adapter-dependencies.js +18 -17
  43. package/src/adapters/node/server-adapter.d.ts +63 -23
  44. package/src/adapters/node/server-adapter.js +346 -297
  45. package/src/adapters/node/static-content-server.d.ts +1 -0
  46. package/src/adapters/node/static-content-server.js +172 -183
  47. package/src/adapters/node/static-preview-host.d.ts +1 -1
  48. package/src/adapters/node/static-preview-host.js +88 -64
  49. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  50. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  51. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  52. package/src/adapters/shared/hmr/hmr-html-response.js +50 -0
  53. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +92 -0
  54. package/src/adapters/shared/hmr/shared-hmr-manager.js +446 -0
  55. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  56. package/src/adapters/shared/http/api-request-pipeline.js +132 -0
  57. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  58. package/src/adapters/shared/http/api-response.js +79 -0
  59. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  60. package/src/adapters/shared/http/create-body-response.js +26 -0
  61. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  62. package/src/adapters/shared/http/define-api-handler.js +49 -0
  63. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  64. package/src/adapters/shared/http/explicit-static-render-preparation.js +29 -0
  65. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  66. package/src/adapters/shared/http/explicit-static-route-matcher.js +59 -0
  67. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  68. package/src/adapters/shared/http/file-route-middleware-pipeline.js +84 -0
  69. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  70. package/src/adapters/shared/http/fs-server-response-factory.js +106 -0
  71. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  72. package/src/adapters/shared/http/fs-server-response-matcher.js +258 -0
  73. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  74. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  75. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  76. package/src/adapters/shared/runtime/application-adapter.js +75 -0
  77. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.d.ts +11 -0
  78. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.js +29 -0
  79. package/src/adapters/shared/runtime/copy-runtime-public-dir.d.ts +6 -0
  80. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +27 -0
  81. package/src/adapters/shared/runtime/dev-static-route-prewarm.d.ts +16 -0
  82. package/src/adapters/shared/runtime/dev-static-route-prewarm.js +66 -0
  83. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  84. package/src/adapters/shared/runtime/port-manager.js +226 -0
  85. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  86. package/src/adapters/shared/runtime/render-context.js +99 -0
  87. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -3
  88. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +38 -0
  89. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +45 -0
  90. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +71 -0
  91. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +31 -50
  92. package/src/adapters/shared/runtime/server-adapter.js +301 -0
  93. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  94. package/src/adapters/shared/runtime/server-route-handler.js +77 -0
  95. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +27 -35
  96. package/src/adapters/shared/runtime/server-static-builder.js +172 -0
  97. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  98. package/src/adapters/shared/ws/node-http-websocket-upgrades.d.ts +21 -0
  99. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +109 -0
  100. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  101. package/src/adapters/shared/ws/websocket-lifecycle.js +62 -0
  102. package/src/build/README.md +191 -31
  103. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  104. package/src/build/app-build-manifest-runtime.js +145 -0
  105. package/src/build/browser/browser-runtime-manifest.js +58 -0
  106. package/src/build/browser/browser-runtime-plugin-helpers.js +34 -0
  107. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
  108. package/src/build/browser/browser-runtime-plugin.js +216 -0
  109. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  110. package/src/build/browser/jsx-ownership-plugins.js +55 -0
  111. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  112. package/src/build/browser/lit-static-render-worker-context.js +4 -0
  113. package/src/build/build-adapter.d.ts +29 -334
  114. package/src/build/build-adapter.js +273 -237
  115. package/src/build/cache/build-input-fingerprint.d.ts +28 -0
  116. package/src/build/cache/build-input-fingerprint.js +33 -0
  117. package/src/build/cache/cache-constants.d.ts +4 -0
  118. package/src/build/cache/cache-constants.js +4 -0
  119. package/src/build/cache/cache-keys.d.ts +22 -0
  120. package/src/build/cache/cache-keys.js +71 -0
  121. package/src/build/cache/pages-unified-graph-build.d.ts +31 -0
  122. package/src/build/cache/pages-unified-graph-build.js +199 -0
  123. package/src/build/cache/production-build-cache.d.ts +21 -0
  124. package/src/build/cache/production-build-cache.js +56 -0
  125. package/src/build/cache/server-entry-build-cache.d.ts +43 -0
  126. package/src/build/cache/server-entry-build-cache.js +153 -0
  127. package/src/build/contracts/build-contracts.d.ts +96 -0
  128. package/src/build/contracts/build-contracts.js +1 -0
  129. package/src/build/contracts/build-manifest.d.ts +90 -0
  130. package/src/build/contracts/build-manifest.js +64 -0
  131. package/src/build/contracts/build-types.js +1 -0
  132. package/src/build/contracts/content-virtual-modules.d.ts +12 -0
  133. package/src/build/contracts/content-virtual-modules.js +29 -0
  134. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +32 -9
  135. package/src/build/rolldown/rolldown-adapter-helpers.js +458 -0
  136. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  137. package/src/build/rolldown/rolldown-build-adapter.js +57 -0
  138. package/src/build/rolldown/rolldown-build-invocation-metrics.d.ts +12 -0
  139. package/src/build/rolldown/rolldown-build-invocation-metrics.js +39 -0
  140. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
  141. package/src/build/rolldown/rolldown-plugin-bridge.js +284 -0
  142. package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
  143. package/src/build/rolldown/rolldown-source-transform-pass.js +70 -0
  144. package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -0
  145. package/src/build/rolldown/runtime-build-output-normalizer.js +253 -0
  146. package/src/build/rolldown/server-side-css-shim-plugin.js +58 -0
  147. package/src/build/runtime/build-profile-options.d.ts +7 -0
  148. package/src/build/runtime/build-profile-options.js +37 -0
  149. package/src/build/runtime/build-request-identity.d.ts +17 -0
  150. package/src/build/runtime/build-request-identity.js +79 -0
  151. package/src/build/runtime/build-request-policy.d.ts +58 -0
  152. package/src/build/runtime/build-request-policy.js +84 -0
  153. package/src/build/runtime/build-runtime.d.ts +28 -0
  154. package/src/build/runtime/build-runtime.js +75 -0
  155. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  156. package/src/build/runtime/deduping-build-executor.js +40 -0
  157. package/src/build/runtime/parallel-build-executor.d.ts +21 -0
  158. package/src/build/runtime/parallel-build-executor.js +60 -0
  159. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  160. package/src/build/runtime/serialized-build-executor.js +79 -0
  161. package/src/cache/index.d.ts +2 -1
  162. package/src/cache/index.js +7 -6
  163. package/src/cache/module-parse-cache.d.ts +5 -0
  164. package/src/cache/module-parse-cache.js +122 -67
  165. package/src/cache/module-transform-profiler.d.ts +8 -0
  166. package/src/cache/module-transform-profiler.js +8 -0
  167. package/src/client/navigation-scripts/classification.d.ts +16 -0
  168. package/src/client/navigation-scripts/classification.js +49 -0
  169. package/src/client/navigation-scripts/index.d.ts +3 -0
  170. package/src/client/navigation-scripts/index.js +3 -0
  171. package/src/client/navigation-scripts/navigation-scripts.test.browser.d.ts +1 -0
  172. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +61 -0
  173. package/src/client/navigation-scripts/registry.d.ts +11 -0
  174. package/src/client/navigation-scripts/registry.js +16 -0
  175. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  176. package/src/client/navigation-scripts/rerun-queue.js +90 -0
  177. package/src/client/scroll.d.ts +17 -0
  178. package/src/client/scroll.js +33 -0
  179. package/src/client/scroll.test.browser.d.ts +1 -0
  180. package/src/client/scroll.test.browser.js +31 -0
  181. package/src/client/view-transitions.d.ts +32 -0
  182. package/src/client/view-transitions.js +120 -0
  183. package/src/client/view-transitions.test.browser.d.ts +1 -0
  184. package/src/client/view-transitions.test.browser.js +56 -0
  185. package/src/config/config-builder.d.ts +40 -10
  186. package/src/config/config-builder.js +647 -600
  187. package/src/config/constants.d.ts +1 -0
  188. package/src/config/constants.js +44 -23
  189. package/src/declarations.d.ts +1 -0
  190. package/src/dev/README.md +24 -0
  191. package/src/dev/client-bridge-registry.d.ts +5 -0
  192. package/src/dev/client-bridge-registry.js +10 -0
  193. package/src/dev/dev-client-ownership.d.ts +7 -0
  194. package/src/dev/dev-client-ownership.js +8 -0
  195. package/src/dev/hmr-manager-registry.d.ts +8 -0
  196. package/src/dev/hmr-manager-registry.js +10 -0
  197. package/src/dev/host-runtime.d.ts +3 -0
  198. package/src/dev/host-runtime.js +25 -23
  199. package/src/dev/runtime-server-started-message.d.ts +2 -0
  200. package/src/dev/runtime-server-started-message.js +3 -0
  201. package/src/dev/sc-server.js +106 -103
  202. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  203. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  204. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  205. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  206. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  207. package/src/dev/transform-server/dev-transform-import-rewriter.js +126 -0
  208. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  209. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  210. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  211. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  212. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  213. package/src/dev/transform-server/dev-transform-server.js +191 -0
  214. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  215. package/src/dev/transform-server/dev-transform-url.js +58 -0
  216. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +28 -0
  217. package/src/dev/transform-server/dev-transform-vendor-registry.js +158 -0
  218. package/src/dev/transform-server/index.d.ts +6 -0
  219. package/src/dev/transform-server/index.js +4 -0
  220. package/src/dev/transform-server/types.d.ts +15 -0
  221. package/src/dev/transform-server/types.js +1 -0
  222. package/src/dev-toolbar/README.md +52 -0
  223. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  224. package/src/dev-toolbar/define-dev-tool.js +9 -0
  225. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  226. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  227. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  228. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  229. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  230. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  231. package/src/dev-toolbar/dev-toolbar-manifest-contract.d.ts +22 -0
  232. package/src/dev-toolbar/dev-toolbar-manifest-contract.js +2 -0
  233. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  234. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  235. package/src/dev-toolbar/dev-toolbar-package.d.ts +34 -0
  236. package/src/dev-toolbar/dev-toolbar-package.js +78 -0
  237. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  238. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  239. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  240. package/src/diagnostics/request-build-dedupe.js +39 -0
  241. package/src/diagnostics/request-pipeline-metrics.d.ts +38 -0
  242. package/src/diagnostics/request-pipeline-metrics.js +121 -0
  243. package/src/diagnostics/startup-trace.d.ts +81 -0
  244. package/src/diagnostics/startup-trace.js +281 -0
  245. package/src/eco/README.md +17 -0
  246. package/src/eco/component-identity.d.ts +13 -0
  247. package/src/eco/component-identity.js +18 -0
  248. package/src/eco/eco-declared-component.d.ts +15 -0
  249. package/src/eco/eco-declared-component.js +23 -0
  250. package/src/eco/eco.browser.js +63 -70
  251. package/src/eco/eco.js +163 -97
  252. package/src/eco/eco.types.d.ts +47 -8
  253. package/src/eco/eco.types.js +5 -0
  254. package/src/eco/eco.utils.d.ts +1 -1
  255. package/src/eco/eco.utils.js +1 -10
  256. package/src/eco/global-injector-map.js +55 -41
  257. package/src/eco/lazy-injector-map.js +90 -60
  258. package/src/eco/module-dependencies.js +52 -44
  259. package/src/eco/page-layout-normalization.d.ts +21 -0
  260. package/src/eco/page-layout-normalization.js +69 -0
  261. package/src/env.d.ts +2 -0
  262. package/src/errors/http-error.d.ts +8 -0
  263. package/src/errors/http-error.js +66 -49
  264. package/src/errors/index.d.ts +1 -0
  265. package/src/errors/index.js +3 -6
  266. package/src/errors/locals-access-error.js +5 -8
  267. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  268. package/src/errors/undeclared-component-dependency-error.js +17 -0
  269. package/src/global/app-logger.js +3 -6
  270. package/src/hmr/README.md +21 -0
  271. package/src/hmr/client/hmr-runtime.js +119 -110
  272. package/src/hmr/client/module-update.d.ts +13 -0
  273. package/src/hmr/client/module-update.js +39 -0
  274. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  275. package/src/hmr/hmr-asset-paths.js +22 -0
  276. package/src/hmr/hmr-entrypoint-output.d.ts +21 -0
  277. package/src/hmr/hmr-entrypoint-output.js +34 -0
  278. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  279. package/src/hmr/hmr-file-change-prep.js +14 -0
  280. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  281. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  282. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  283. package/src/hmr/hmr-runtime-paths.js +13 -0
  284. package/src/hmr/hmr-strategy.d.ts +9 -0
  285. package/src/hmr/hmr-strategy.js +113 -42
  286. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  287. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -97
  288. package/src/hmr/strategies/js-hmr-strategy.js +107 -167
  289. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  290. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +35 -0
  291. package/src/index.browser.d.ts +1 -0
  292. package/src/index.browser.js +2 -4
  293. package/src/index.d.ts +4 -1
  294. package/src/index.js +7 -21
  295. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  296. package/src/integrations/ghtml/ghtml-renderer.js +12 -56
  297. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  298. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  299. package/src/integrations/ghtml/ghtml.plugin.js +10 -20
  300. package/src/islands/README.md +25 -0
  301. package/src/islands/island-host.d.ts +37 -0
  302. package/src/islands/island-host.js +55 -0
  303. package/src/plugins/README.md +2 -1
  304. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  305. package/src/plugins/alias-resolver-cache.js +114 -97
  306. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  307. package/src/plugins/alias-resolver-plugin.js +35 -62
  308. package/src/plugins/define-integration.d.ts +26 -0
  309. package/src/plugins/define-integration.js +20 -0
  310. package/src/plugins/eco-component-meta-plugin.d.ts +6 -102
  311. package/src/plugins/eco-component-meta-plugin.js +120 -162
  312. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  313. package/src/plugins/foreign-jsx-override-plugin.js +49 -37
  314. package/src/plugins/integration-plugin.d.ts +43 -14
  315. package/src/plugins/integration-plugin.js +212 -190
  316. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  317. package/src/plugins/jsx-import-source.utils.js +21 -0
  318. package/src/plugins/processor.d.ts +71 -12
  319. package/src/plugins/processor.js +168 -130
  320. package/src/plugins/runtime-capability.js +1 -0
  321. package/src/plugins/source-transform.d.ts +32 -1
  322. package/src/plugins/source-transform.js +112 -60
  323. package/src/plugins/tsconfig-import-resolver.d.ts +35 -0
  324. package/src/plugins/tsconfig-import-resolver.js +235 -0
  325. package/src/route-renderer/GRAPH.md +26 -32
  326. package/src/route-renderer/README.md +54 -33
  327. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  328. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +155 -0
  329. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  330. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +37 -0
  331. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  332. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +196 -0
  333. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +17 -7
  334. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +191 -0
  335. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  336. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +354 -0
  337. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  338. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +36 -0
  339. package/src/route-renderer/orchestration/integration-renderer.d.ts +41 -151
  340. package/src/route-renderer/orchestration/integration-renderer.js +798 -988
  341. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  342. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +173 -0
  343. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  344. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +132 -0
  345. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  346. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +89 -0
  347. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +6 -2
  348. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +77 -0
  349. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  350. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +30 -0
  351. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.d.ts +15 -0
  352. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.js +9 -0
  353. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.d.ts +5 -0
  354. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.js +30 -0
  355. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  356. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +32 -0
  357. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +126 -0
  358. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +542 -0
  359. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +47 -0
  360. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +232 -0
  361. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  362. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +23 -0
  363. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.d.ts +29 -0
  364. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.js +54 -0
  365. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +38 -0
  366. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +26 -0
  367. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  368. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +25 -0
  369. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  370. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +43 -0
  371. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +25 -0
  372. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +44 -0
  373. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +26 -0
  374. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +49 -0
  375. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  376. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +30 -0
  377. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +24 -54
  378. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +215 -0
  379. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  380. package/src/route-renderer/orchestration/string-markup-renderer.js +52 -0
  381. package/src/route-renderer/page-loading/component-dependency-collection.js +121 -121
  382. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  383. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  384. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +1 -0
  385. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +64 -51
  386. package/src/route-renderer/page-loading/file-scoped-dependency-components.d.ts +42 -0
  387. package/src/route-renderer/page-loading/file-scoped-dependency-components.js +94 -0
  388. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  389. package/src/route-renderer/page-loading/lazy-trigger-planning.js +47 -36
  390. package/src/route-renderer/page-loading/module-declaration-aggregation.js +39 -28
  391. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  392. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  393. package/src/route-renderer/page-loading/page-module-loader.d.ts +2 -1
  394. package/src/route-renderer/page-loading/page-module-loader.js +136 -124
  395. package/src/route-renderer/page-loading/resolved-page-dependencies.d.ts +12 -0
  396. package/src/route-renderer/page-loading/resolved-page-dependencies.js +38 -0
  397. package/src/route-renderer/route-renderer.js +74 -76
  398. package/src/router/README.md +31 -0
  399. package/src/router/client/link-intent.d.ts +11 -21
  400. package/src/router/client/link-intent.js +56 -30
  401. package/src/router/client/link-intent.test.browser.js +50 -39
  402. package/src/router/client/link-navigation-policy.d.ts +45 -0
  403. package/src/router/client/link-navigation-policy.js +122 -0
  404. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  405. package/src/router/client/link-navigation-policy.test.browser.js +82 -0
  406. package/src/router/client/navigation-coordinator.d.ts +1 -1
  407. package/src/router/client/navigation-coordinator.js +235 -201
  408. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  409. package/src/router/client/navigation-lifecycle.js +50 -0
  410. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  411. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  412. package/src/router/server/route-registry.js +237 -242
  413. package/src/services/README.md +5 -0
  414. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  415. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -50
  416. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +7 -1
  417. package/src/services/assets/asset-processing-service/asset-processing.service.js +308 -268
  418. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  419. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  420. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  421. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -1
  422. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -45
  423. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  424. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +115 -0
  425. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  426. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -38
  427. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  428. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +5 -0
  429. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  430. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +85 -60
  431. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  432. package/src/services/assets/asset-processing-service/index.js +8 -6
  433. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  434. package/src/services/assets/asset-processing-service/inline-content-script-body.js +23 -0
  435. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  436. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +22 -0
  437. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  438. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  439. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  440. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  441. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  442. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -130
  443. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  444. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  445. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +111 -111
  446. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  447. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -94
  448. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -121
  449. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  450. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +26 -57
  451. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  452. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +33 -67
  453. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  454. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +44 -0
  455. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  456. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +15 -0
  457. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  458. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -44
  459. package/src/services/assets/browser-bundle.service.d.ts +28 -30
  460. package/src/services/assets/browser-bundle.service.js +54 -40
  461. package/src/services/cache/cache.types.d.ts +4 -2
  462. package/src/services/cache/cache.types.js +5 -0
  463. package/src/services/cache/html-page-cache-dependency-index.d.ts +34 -0
  464. package/src/services/cache/html-page-cache-dependency-index.js +88 -0
  465. package/src/services/cache/index.d.ts +2 -0
  466. package/src/services/cache/index.js +8 -7
  467. package/src/services/cache/memory-cache-store.js +101 -89
  468. package/src/services/cache/page-cache-service.d.ts +31 -1
  469. package/src/services/cache/page-cache-service.js +237 -150
  470. package/src/services/cache/page-request-cache-coordinator.service.js +106 -102
  471. package/src/services/html/html-rewriter-provider.service.js +61 -61
  472. package/src/services/html/html-transformer.service.d.ts +1 -1
  473. package/src/services/html/html-transformer.service.js +249 -266
  474. package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
  475. package/src/services/invalidation/development-invalidation.service.js +239 -175
  476. package/src/services/module-loading/README.md +52 -0
  477. package/src/services/module-loading/app-module-loader.service.js +1 -0
  478. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  479. package/src/services/module-loading/app-server-module-transpiler.service.js +103 -118
  480. package/src/services/module-loading/collection-server-module-build.service.d.ts +19 -0
  481. package/src/services/module-loading/collection-server-module-build.service.js +83 -0
  482. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  483. package/src/services/module-loading/module-loading-types.js +1 -0
  484. package/src/services/module-loading/page-module-import.service.d.ts +11 -13
  485. package/src/services/module-loading/page-module-import.service.js +222 -184
  486. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  487. package/src/services/module-loading/route-module-build-cache-registry.js +51 -0
  488. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  489. package/src/services/module-loading/route-module-build-cache.js +3 -0
  490. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  491. package/src/services/module-loading/route-module-build-cache.store.js +202 -0
  492. package/src/services/module-loading/route-module-build-manifest.d.ts +57 -0
  493. package/src/services/module-loading/route-module-build-manifest.js +60 -0
  494. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  495. package/src/services/module-loading/route-module-dependency-hasher.js +148 -0
  496. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -3
  497. package/src/services/module-loading/server-module-transpiler.service.js +65 -62
  498. package/src/services/module-loading/source-module-support.js +15 -7
  499. package/src/services/runtime-state/dev-graph.service.js +165 -157
  500. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  501. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  502. package/src/services/validation/schema-validation-service.d.ts +1 -4
  503. package/src/services/validation/schema-validation-service.js +156 -95
  504. package/src/services/validation/standard-schema.types.d.ts +9 -62
  505. package/src/services/validation/standard-schema.types.js +1 -0
  506. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  507. package/src/services/validation/validate-standard-schema.js +14 -0
  508. package/src/static-site-generator/README.md +41 -0
  509. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +32 -0
  510. package/src/static-site-generator/production-page-browser-graph-prebuild.js +57 -0
  511. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  512. package/src/static-site-generator/sitemap-routes.js +36 -0
  513. package/src/static-site-generator/sitemap.d.ts +15 -0
  514. package/src/static-site-generator/sitemap.js +42 -0
  515. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  516. package/src/static-site-generator/static-build-invalidation.js +37 -0
  517. package/src/static-site-generator/static-export-context.d.ts +30 -0
  518. package/src/static-site-generator/static-export-context.js +1 -0
  519. package/src/static-site-generator/static-site-generator.d.ts +43 -25
  520. package/src/static-site-generator/static-site-generator.js +536 -294
  521. package/src/types/internal-types.d.ts +59 -13
  522. package/src/types/internal-types.js +1 -0
  523. package/src/types/public-types.d.ts +310 -95
  524. package/src/types/public-types.js +1 -0
  525. package/src/utils/deep-merge.js +39 -26
  526. package/src/utils/ecopages-route-info.d.ts +26 -0
  527. package/src/utils/ecopages-route-info.js +30 -0
  528. package/src/utils/hash.js +3 -6
  529. package/src/utils/html-escaping.d.ts +7 -0
  530. package/src/utils/html-escaping.js +22 -5
  531. package/src/utils/html.js +1 -4
  532. package/src/utils/invariant.js +11 -10
  533. package/src/utils/locals-utils.js +32 -22
  534. package/src/utils/parse-cli-args.d.ts +2 -0
  535. package/src/utils/parse-cli-args.js +73 -59
  536. package/src/utils/path-pattern.d.ts +23 -0
  537. package/src/utils/path-pattern.js +42 -0
  538. package/src/utils/path-utils.module.js +8 -11
  539. package/src/utils/resolve-entry-file.js +70 -38
  540. package/src/utils/resolve-work-dir.js +23 -27
  541. package/src/utils/runtime.js +24 -33
  542. package/src/utils/server-utils.module.d.ts +3 -2
  543. package/src/utils/server-utils.module.js +60 -53
  544. package/src/utils/static-file-extensions.d.ts +12 -0
  545. package/src/utils/static-file-extensions.js +54 -0
  546. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  547. package/src/watchers/project-watcher-ignore.js +17 -0
  548. package/src/watchers/project-watcher.d.ts +29 -6
  549. package/src/watchers/project-watcher.js +402 -257
  550. package/src/watchers/project-watcher.test-helpers.js +45 -50
  551. package/src/adapters/shared/api-response.js +0 -96
  552. package/src/adapters/shared/application-adapter.js +0 -90
  553. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  554. package/src/adapters/shared/define-api-handler.js +0 -15
  555. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  556. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  557. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  558. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  559. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  560. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  561. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  562. package/src/adapters/shared/hmr-html-response.js +0 -33
  563. package/src/adapters/shared/render-context.js +0 -93
  564. package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
  565. package/src/adapters/shared/runtime-host.js +0 -0
  566. package/src/adapters/shared/server-adapter.js +0 -436
  567. package/src/adapters/shared/server-route-handler.js +0 -111
  568. package/src/adapters/shared/server-static-builder.js +0 -162
  569. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  570. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  571. package/src/adapters/shared/static-preview-host.js +0 -0
  572. package/src/build/browser-runtime-manifest.js +0 -61
  573. package/src/build/browser-runtime-plugin-helpers.js +0 -14
  574. package/src/build/browser-runtime-plugin.js +0 -173
  575. package/src/build/build-manifest.d.ts +0 -33
  576. package/src/build/build-manifest.js +0 -49
  577. package/src/build/build-types.js +0 -0
  578. package/src/build/rolldown-adapter-helpers.js +0 -265
  579. package/src/build/rolldown-build-adapter.js +0 -65
  580. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  581. package/src/build/rolldown-dev-build-adapter.js +0 -166
  582. package/src/build/rolldown-plugin-bridge.js +0 -199
  583. package/src/build/runtime-build-executor.d.ts +0 -21
  584. package/src/build/runtime-build-executor.js +0 -19
  585. package/src/build/runtime-build-output-normalizer.d.ts +0 -3
  586. package/src/build/runtime-build-output-normalizer.js +0 -111
  587. package/src/build/serialized-build-executor.js +0 -63
  588. package/src/build/server-side-css-shim-plugin.js +0 -35
  589. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  590. package/src/hmr/hmr.test.e2e.js +0 -43
  591. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  592. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  593. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  594. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -233
  595. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  596. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  597. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  598. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  599. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  600. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  601. package/src/route-renderer/orchestration/render-output.utils.js +0 -171
  602. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  603. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  604. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  605. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  606. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → adapters/shared/runtime/runtime-host.js} +0 -0
  607. /package/src/{hmr/hmr.test.e2e.d.ts → adapters/shared/runtime/static-preview-host.js} +0 -0
  608. /package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +0 -0
  609. /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
  610. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  611. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
@@ -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();
package/src/eco/README.md CHANGED
@@ -14,6 +14,12 @@ The `eco` namespace provides a consistent, type-safe interface for:
14
14
  6. **`eco.staticPaths()`** - Type-safe wrapper for dynamic route generation (legacy pattern)
15
15
  7. **`eco.staticProps()`** - Type-safe wrapper for static data fetching (legacy pattern)
16
16
 
17
+ ## Layout assignment
18
+
19
+ Layouts are assigned explicitly on each `eco.page({ layout })` call — either one layout component or an outer→inner array. EcoPages normalizes the stack at factory time to `config.layouts` and `config.layoutEntries`.
20
+
21
+ EcoPages does **not** infer layouts from `src/layouts/` file paths or route segment directories. A file under `src/layouts/` is only used when a page imports it and passes it to `layout`.
22
+
17
23
  ## Component Patterns
18
24
 
19
25
  EcoPages supports two approaches for creating components, each suited for different use cases:
@@ -279,6 +285,17 @@ export default eco.page({
279
285
  });
280
286
  ```
281
287
 
288
+ **Nested layouts (outer → inner):**
289
+
290
+ ```tsx
291
+ export default eco.page({
292
+ layout: [MarketingShell, DocsShell],
293
+ render: () => <h1>Hello</h1>,
294
+ });
295
+ ```
296
+
297
+ A single layout remains equivalent to a one-element array. Normalization stores the stack on `config.layouts` and `config.layoutEntries` at factory time.
298
+
282
299
  ### `eco.component()`
283
300
 
284
301
  Define a reusable component with dependencies.
@@ -0,0 +1,13 @@
1
+ import type { EcoComponent, EcoComponentConfig } from '../types/public-types.js';
2
+ /** Stable attribution for a Component created by an Integration-owned module. */
3
+ export type ComponentIdentity = {
4
+ id: string;
5
+ file: string;
6
+ integration: string;
7
+ };
8
+ /** Gets canonical component attribution. */
9
+ export declare function getComponentIdentity(value: EcoComponent | EcoComponentConfig | undefined): ComponentIdentity | undefined;
10
+ /** Merges attribution into factory options. */
11
+ export declare function bindComponentIdentity<T extends object>(identity: ComponentIdentity, options: T): T & {
12
+ identity: ComponentIdentity;
13
+ };
@@ -0,0 +1,18 @@
1
+ function asConfig(value) {
2
+ if (!value)
3
+ return undefined;
4
+ if (typeof value === 'function')
5
+ return value.config;
6
+ if ('config' in value)
7
+ return value.config;
8
+ return value;
9
+ }
10
+ /** Gets canonical component attribution. */
11
+ export function getComponentIdentity(value) {
12
+ const config = asConfig(value);
13
+ return config?.identity;
14
+ }
15
+ /** Merges attribution into factory options. */
16
+ export function bindComponentIdentity(identity, options) {
17
+ return { ...options, identity };
18
+ }
@@ -0,0 +1,15 @@
1
+ import type { EcoDeclaredComponent } from '../types/public-types.js';
2
+ export { getUndeclaredComponentDependencyMessage } from '../errors/undeclared-component-dependency-error.js';
3
+ /**
4
+ * @remarks
5
+ * Declared components are produced by `eco.component()`, `eco.layout()`, and
6
+ * `eco.html()` after the component identity transform binds identity via
7
+ * `bindComponentIdentity`.
8
+ */
9
+ export declare function isEcoDeclaredComponent(component: unknown): component is EcoDeclaredComponent;
10
+ /**
11
+ * @throws {UndeclaredComponentDependencyError} When the value lacks component identity.
12
+ */
13
+ export declare function assertEcoDeclaredComponent(component: unknown, context?: {
14
+ parentComponentFile?: string;
15
+ }): asserts component is EcoDeclaredComponent;
@@ -0,0 +1,23 @@
1
+ import { UndeclaredComponentDependencyError } from '../errors/undeclared-component-dependency-error.js';
2
+ import { getComponentIdentity } from './component-identity.js';
3
+ export { getUndeclaredComponentDependencyMessage } from '../errors/undeclared-component-dependency-error.js';
4
+ /**
5
+ * @remarks
6
+ * Declared components are produced by `eco.component()`, `eco.layout()`, and
7
+ * `eco.html()` after the component identity transform binds identity via
8
+ * `bindComponentIdentity`.
9
+ */
10
+ export function isEcoDeclaredComponent(component) {
11
+ return (typeof component === 'function' &&
12
+ typeof getComponentIdentity(component)?.file === 'string' &&
13
+ typeof getComponentIdentity(component)?.integration === 'string');
14
+ }
15
+ /**
16
+ * @throws {UndeclaredComponentDependencyError} When the value lacks component identity.
17
+ */
18
+ export function assertEcoDeclaredComponent(component, context = {}) {
19
+ if (isEcoDeclaredComponent(component)) {
20
+ return;
21
+ }
22
+ throw new UndeclaredComponentDependencyError(context.parentComponentFile);
23
+ }