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

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,126 @@
1
+ import path from 'node:path';
2
+ import { fileSystem } from '@ecopages/file-system';
3
+ import { cachedParseSync } from '../../cache/module-parse-cache.js';
4
+ import { isBarePackageImportSpecifier, resolveProjectModulePath } from '../../plugins/tsconfig-import-resolver.js';
5
+ import { resolveDevTransformModuleUrl } from './dev-transform-url.js';
6
+ /**
7
+ * Builds a browser-importable dev-transform URL that changes when the source changes.
8
+ *
9
+ * @remarks
10
+ * Soft HMR reloads cache-bust the active page module, but transitive layout/component
11
+ * imports keep stable pathnames. A content hash query makes the browser ESM module map
12
+ * treat the updated dependency as a new module without a full page reload.
13
+ */
14
+ function resolveVersionedDevTransformModuleUrl(srcDir, resolvedPath) {
15
+ const baseUrl = resolveDevTransformModuleUrl(srcDir, resolvedPath);
16
+ if (!fileSystem.exists(resolvedPath)) {
17
+ return baseUrl;
18
+ }
19
+ return `${baseUrl}?v=${fileSystem.hash(resolvedPath)}`;
20
+ }
21
+ function isRecord(value) {
22
+ return Boolean(value) && typeof value === 'object';
23
+ }
24
+ function readStringLiteral(node) {
25
+ if (!isRecord(node)) {
26
+ return undefined;
27
+ }
28
+ if (node.type !== 'StringLiteral' && node.type !== 'Literal') {
29
+ return undefined;
30
+ }
31
+ if (typeof node.value !== 'string' || typeof node.start !== 'number' || typeof node.end !== 'number') {
32
+ return undefined;
33
+ }
34
+ return { start: node.start, end: node.end, value: node.value };
35
+ }
36
+ /**
37
+ * Rewrites static and dynamic import specifiers to dev-transform or vendor URLs.
38
+ */
39
+ export async function rewriteModuleImports(options) {
40
+ const normalizedSource = path.resolve(options.sourcePath);
41
+ const dependencies = new Set();
42
+ const specifierNodes = [];
43
+ const parseResult = cachedParseSync(normalizedSource, options.code, {
44
+ sourceType: 'module',
45
+ lang: path.extname(normalizedSource).endsWith('x') ? 'tsx' : 'ts',
46
+ });
47
+ const walk = (node) => {
48
+ if (!isRecord(node)) {
49
+ return;
50
+ }
51
+ if (node.type === 'ImportDeclaration' ||
52
+ node.type === 'ExportNamedDeclaration' ||
53
+ node.type === 'ExportAllDeclaration') {
54
+ const literal = readStringLiteral(node.source);
55
+ if (literal) {
56
+ specifierNodes.push(literal);
57
+ }
58
+ }
59
+ if (node.type === 'ImportExpression') {
60
+ const literal = readStringLiteral(node.source);
61
+ if (literal) {
62
+ specifierNodes.push(literal);
63
+ }
64
+ }
65
+ for (const value of Object.values(node)) {
66
+ if (Array.isArray(value)) {
67
+ for (const child of value) {
68
+ walk(child);
69
+ }
70
+ }
71
+ else {
72
+ walk(value);
73
+ }
74
+ }
75
+ };
76
+ walk(parseResult.program);
77
+ const edits = [];
78
+ for (const specifierNode of specifierNodes) {
79
+ const rewritten = await resolveImportSpecifier({
80
+ specifier: specifierNode.value,
81
+ sourcePath: normalizedSource,
82
+ srcDir: options.srcDir,
83
+ projectRoot: options.projectRoot,
84
+ runtimeSpecifierMap: options.runtimeSpecifierMap,
85
+ resolveVendorUrl: options.resolveVendorUrl,
86
+ dependencies,
87
+ });
88
+ if (!rewritten || rewritten === specifierNode.value) {
89
+ continue;
90
+ }
91
+ const quote = options.code[specifierNode.start] === "'" ? "'" : '"';
92
+ edits.push({
93
+ start: specifierNode.start,
94
+ end: specifierNode.end,
95
+ replacement: `${quote}${rewritten}${quote}`,
96
+ });
97
+ }
98
+ edits.sort((left, right) => right.start - left.start);
99
+ let code = options.code;
100
+ for (const edit of edits) {
101
+ code = `${code.slice(0, edit.start)}${edit.replacement}${code.slice(edit.end)}`;
102
+ }
103
+ return {
104
+ code,
105
+ dependencies: [...dependencies],
106
+ };
107
+ }
108
+ async function resolveImportSpecifier(options) {
109
+ const runtimeUrl = options.runtimeSpecifierMap.get(options.specifier);
110
+ if (runtimeUrl) {
111
+ return runtimeUrl;
112
+ }
113
+ if (options.specifier.startsWith('node:')) {
114
+ throw new Error(`[dev-transform] Node builtin "${options.specifier}" imported from client module ${options.sourcePath}. ` +
115
+ `Check package "browser" exports / client-graph boundary for the importer.`);
116
+ }
117
+ if (options.specifier.startsWith('.') || !isBarePackageImportSpecifier(options.specifier, options.projectRoot)) {
118
+ const resolvedPath = resolveProjectModulePath(options.projectRoot, options.sourcePath, options.specifier);
119
+ if (!resolvedPath) {
120
+ return undefined;
121
+ }
122
+ options.dependencies.add(resolvedPath);
123
+ return resolveVersionedDevTransformModuleUrl(options.srcDir, resolvedPath);
124
+ }
125
+ return options.resolveVendorUrl(options.specifier);
126
+ }
@@ -0,0 +1,13 @@
1
+ export type DevTransformModuleKind = 'script' | 'stylesheet';
2
+ /**
3
+ * Classifies a dev-transform source path for materialization.
4
+ */
5
+ export declare function resolveDevTransformModuleKind(sourcePath: string): DevTransformModuleKind;
6
+ /**
7
+ * Emits browser ESM for a stylesheet import (`import styles from './x.css'`).
8
+ *
9
+ * @remarks
10
+ * Parallels the server-side CSS shim: CSS stays in the module graph as a string
11
+ * export while real stylesheet delivery uses `dependencies.stylesheets`.
12
+ */
13
+ export declare function materializeDevTransformStylesheet(cssContent: string): string;
@@ -0,0 +1,17 @@
1
+ import path from 'node:path';
2
+ /**
3
+ * Classifies a dev-transform source path for materialization.
4
+ */
5
+ export function resolveDevTransformModuleKind(sourcePath) {
6
+ return path.extname(sourcePath) === '.css' ? 'stylesheet' : 'script';
7
+ }
8
+ /**
9
+ * Emits browser ESM for a stylesheet import (`import styles from './x.css'`).
10
+ *
11
+ * @remarks
12
+ * Parallels the server-side CSS shim: CSS stays in the module graph as a string
13
+ * export while real stylesheet delivery uses `dependencies.stylesheets`.
14
+ */
15
+ export function materializeDevTransformStylesheet(cssContent) {
16
+ return `export default ${JSON.stringify(cssContent)};\n`;
17
+ }
@@ -0,0 +1,5 @@
1
+ import type { DevTransformBundleContributor } from './types.js';
2
+ /**
3
+ * Merges runtime manifest specifiers from all dev-transform contributors.
4
+ */
5
+ export declare function mergeContributorRuntimeSpecifierMaps(contributors: readonly DevTransformBundleContributor[]): Map<string, string>;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Merges runtime manifest specifiers from all dev-transform contributors.
3
+ */
4
+ export function mergeContributorRuntimeSpecifierMaps(contributors) {
5
+ const merged = new Map();
6
+ for (const contributor of contributors) {
7
+ const runtimeSpecifierMap = contributor.getRuntimeSpecifierMap?.();
8
+ if (!runtimeSpecifierMap) {
9
+ continue;
10
+ }
11
+ for (const [specifier, url] of runtimeSpecifierMap) {
12
+ merged.set(specifier, url);
13
+ }
14
+ }
15
+ return merged;
16
+ }
@@ -0,0 +1,41 @@
1
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
+ import type { DevTransformBundleContributor } from './types.js';
3
+ export type DevTransformServerOptions = {
4
+ appConfig: EcoPagesAppConfig;
5
+ contributors?: readonly DevTransformBundleContributor[];
6
+ onModuleDependencies?: (modulePath: string, dependencies: string[]) => void;
7
+ };
8
+ /**
9
+ * Serves per-module browser ESM on demand during native CLI dev.
10
+ *
11
+ * @remarks
12
+ * Registration returns a stable URL immediately; the first request (or a cache miss)
13
+ * transpiles one source file and rewrites imports to dev-transform or vendor URLs.
14
+ */
15
+ export declare class DevTransformServer {
16
+ private readonly appConfig;
17
+ private readonly bundler;
18
+ private readonly vendorRegistry;
19
+ private readonly contributors;
20
+ private readonly runtimeSpecifierMap;
21
+ private readonly onModuleDependencies?;
22
+ private readonly urlToSource;
23
+ private readonly sourceToUrl;
24
+ private readonly cache;
25
+ private readonly inFlight;
26
+ private cacheGeneration;
27
+ constructor(options: DevTransformServerOptions);
28
+ registerModule(sourcePath: string): string;
29
+ getRegisteredSourcePath(moduleUrl: string): string | undefined;
30
+ addContributor(contributor: DevTransformBundleContributor): void;
31
+ private rebuildRuntimeSpecifierMap;
32
+ private resolveVendorBundlePlugins;
33
+ getWatchedModules(): ReadonlyMap<string, string>;
34
+ invalidateSource(sourcePath: string): void;
35
+ invalidateAll(): void;
36
+ reset(): void;
37
+ tryHandleRequest(request: Request): Promise<Response | null>;
38
+ private resolveSourcePathFromModuleUrl;
39
+ private createJavaScriptResponse;
40
+ private materialize;
41
+ }
@@ -0,0 +1,191 @@
1
+ import path from 'node:path';
2
+ import { fileSystem } from '@ecopages/file-system';
3
+ import { appLogger } from '../../global/app-logger.js';
4
+ import { startupTrace } from '../../diagnostics/startup-trace.js';
5
+ import { DevTransformBundler } from './dev-transform-bundler.js';
6
+ import { DevTransformVendorRegistry } from './dev-transform-vendor-registry.js';
7
+ import { materializeDevTransformStylesheet, resolveDevTransformModuleKind } from './dev-transform-module-kind.js';
8
+ import { mergeContributorRuntimeSpecifierMaps } from './dev-transform-runtime-specifiers.js';
9
+ import { resolveDevTransformModuleSourcePath, resolveDevTransformModuleUrl } from './dev-transform-url.js';
10
+ /**
11
+ * Serves per-module browser ESM on demand during native CLI dev.
12
+ *
13
+ * @remarks
14
+ * Registration returns a stable URL immediately; the first request (or a cache miss)
15
+ * transpiles one source file and rewrites imports to dev-transform or vendor URLs.
16
+ */
17
+ export class DevTransformServer {
18
+ appConfig;
19
+ bundler;
20
+ vendorRegistry;
21
+ contributors = [];
22
+ runtimeSpecifierMap = new Map();
23
+ onModuleDependencies;
24
+ urlToSource = new Map();
25
+ sourceToUrl = new Map();
26
+ cache = new Map();
27
+ inFlight = new Map();
28
+ cacheGeneration = 0;
29
+ constructor(options) {
30
+ this.appConfig = options.appConfig;
31
+ this.onModuleDependencies = options.onModuleDependencies;
32
+ this.contributors.push(...(options.contributors ?? []));
33
+ this.rebuildRuntimeSpecifierMap();
34
+ this.vendorRegistry = new DevTransformVendorRegistry({
35
+ appConfig: options.appConfig,
36
+ getRuntimeSpecifierMap: () => this.runtimeSpecifierMap,
37
+ resolveVendorBundlePlugins: () => this.resolveVendorBundlePlugins(),
38
+ });
39
+ this.bundler = new DevTransformBundler({
40
+ appConfig: options.appConfig,
41
+ contributors: this.contributors,
42
+ getRuntimeSpecifierMap: () => this.runtimeSpecifierMap,
43
+ vendorRegistry: this.vendorRegistry,
44
+ });
45
+ }
46
+ registerModule(sourcePath) {
47
+ const normalized = path.resolve(sourcePath);
48
+ const existing = this.sourceToUrl.get(normalized);
49
+ if (existing) {
50
+ return existing;
51
+ }
52
+ const url = resolveDevTransformModuleUrl(this.appConfig.absolutePaths.srcDir, normalized);
53
+ this.sourceToUrl.set(normalized, url);
54
+ this.urlToSource.set(url, normalized);
55
+ return url;
56
+ }
57
+ getRegisteredSourcePath(moduleUrl) {
58
+ return this.urlToSource.get(moduleUrl);
59
+ }
60
+ addContributor(contributor) {
61
+ this.contributors.push(contributor);
62
+ this.rebuildRuntimeSpecifierMap();
63
+ this.bundler.addContributor(contributor);
64
+ }
65
+ rebuildRuntimeSpecifierMap() {
66
+ this.runtimeSpecifierMap.clear();
67
+ for (const [specifier, url] of mergeContributorRuntimeSpecifierMaps(this.contributors)) {
68
+ this.runtimeSpecifierMap.set(specifier, url);
69
+ }
70
+ }
71
+ async resolveVendorBundlePlugins() {
72
+ const plugins = [];
73
+ for (const contributor of this.contributors) {
74
+ if (!contributor.getVendorBundlePlugins) {
75
+ continue;
76
+ }
77
+ plugins.push(...(await contributor.getVendorBundlePlugins()));
78
+ }
79
+ return plugins;
80
+ }
81
+ getWatchedModules() {
82
+ return this.urlToSource;
83
+ }
84
+ invalidateSource(sourcePath) {
85
+ const normalized = path.resolve(sourcePath);
86
+ this.cache.delete(normalized);
87
+ }
88
+ invalidateAll() {
89
+ this.cacheGeneration += 1;
90
+ this.cache.clear();
91
+ this.inFlight.clear();
92
+ this.vendorRegistry.invalidateAll();
93
+ }
94
+ reset() {
95
+ this.urlToSource.clear();
96
+ this.sourceToUrl.clear();
97
+ this.invalidateAll();
98
+ }
99
+ async tryHandleRequest(request) {
100
+ const url = new URL(request.url);
101
+ const vendorResponse = this.vendorRegistry.tryHandleVendorRequest(url.pathname);
102
+ if (vendorResponse) {
103
+ return vendorResponse;
104
+ }
105
+ const sourcePath = this.urlToSource.get(url.pathname) ?? this.resolveSourcePathFromModuleUrl(url.pathname);
106
+ if (!sourcePath) {
107
+ return null;
108
+ }
109
+ startupTrace.beginDevClientTransform();
110
+ const startedAt = performance.now();
111
+ try {
112
+ const entry = await this.materialize(sourcePath);
113
+ if (process.env.ECOPAGES_STARTUP_TRACE === 'true') {
114
+ appLogger.debug(`[dev-transform] materialize path=${url.pathname} bytes=${entry.code.length} durationMs=${Math.round(performance.now() - startedAt)}`);
115
+ }
116
+ return this.createJavaScriptResponse(entry.code);
117
+ }
118
+ catch (error) {
119
+ const message = error instanceof Error ? error.message : String(error);
120
+ return new Response(message, {
121
+ status: 500,
122
+ headers: {
123
+ 'Content-Type': 'text/plain',
124
+ 'Cache-Control': 'no-store, must-revalidate',
125
+ },
126
+ });
127
+ }
128
+ finally {
129
+ startupTrace.endDevClientTransform();
130
+ }
131
+ }
132
+ resolveSourcePathFromModuleUrl(moduleUrl) {
133
+ const discoveredSourcePath = resolveDevTransformModuleSourcePath(this.appConfig.absolutePaths.srcDir, moduleUrl);
134
+ if (!discoveredSourcePath) {
135
+ return undefined;
136
+ }
137
+ this.registerModule(discoveredSourcePath);
138
+ return path.resolve(discoveredSourcePath);
139
+ }
140
+ createJavaScriptResponse(code) {
141
+ return new Response(code, {
142
+ headers: {
143
+ 'Content-Type': 'application/javascript',
144
+ 'Cache-Control': 'no-store, must-revalidate',
145
+ },
146
+ });
147
+ }
148
+ async materialize(sourcePath) {
149
+ const normalized = path.resolve(sourcePath);
150
+ if (!fileSystem.exists(normalized)) {
151
+ throw new Error(`[dev-transform] Missing source module: ${normalized}`);
152
+ }
153
+ const sourceHash = fileSystem.hash(normalized);
154
+ const cached = this.cache.get(normalized);
155
+ if (cached && cached.sourceHash === sourceHash) {
156
+ return cached;
157
+ }
158
+ const pending = this.inFlight.get(normalized);
159
+ if (pending) {
160
+ return pending;
161
+ }
162
+ const moduleKind = resolveDevTransformModuleKind(normalized);
163
+ if (moduleKind === 'stylesheet') {
164
+ const entry = {
165
+ code: materializeDevTransformStylesheet(fileSystem.readFileSync(normalized)),
166
+ sourceHash,
167
+ };
168
+ this.cache.set(normalized, entry);
169
+ return entry;
170
+ }
171
+ const generation = this.cacheGeneration;
172
+ const promise = this.bundler
173
+ .transpileModule(normalized)
174
+ .then((result) => {
175
+ if (generation !== this.cacheGeneration) {
176
+ throw new Error(`[dev-transform] Stale transpile result for ${normalized}`);
177
+ }
178
+ if (result.dependencies) {
179
+ this.onModuleDependencies?.(normalized, result.dependencies);
180
+ }
181
+ const entry = { code: result.code, sourceHash: fileSystem.hash(normalized) };
182
+ this.cache.set(normalized, entry);
183
+ return entry;
184
+ })
185
+ .finally(() => {
186
+ this.inFlight.delete(normalized);
187
+ });
188
+ this.inFlight.set(normalized, promise);
189
+ return promise;
190
+ }
191
+ }
@@ -0,0 +1,13 @@
1
+ export { DEV_TRANSFORM_URL_PREFIX } from '../../hmr/hmr-asset-paths.js';
2
+ /**
3
+ * Maps a source entrypoint to the browser URL served by the dev transform server.
4
+ */
5
+ export declare function resolveDevTransformModuleUrl(srcDir: string, entrypointPath: string): string;
6
+ /**
7
+ * Resolves a dev-transform browser URL back to an on-disk page entrypoint.
8
+ *
9
+ * @remarks
10
+ * Client-side navigation can request page modules that were not registered during
11
+ * the current SSR response. Lazy resolution keeps those URLs materializable on demand.
12
+ */
13
+ export declare function resolveDevTransformModuleSourcePath(srcDir: string, moduleUrl: string): string | undefined;
@@ -0,0 +1,58 @@
1
+ import path from 'node:path';
2
+ import { fileSystem } from '@ecopages/file-system';
3
+ import { DEV_TRANSFORM_URL_PREFIX, stripModuleUrlQuery } from '../../hmr/hmr-asset-paths.js';
4
+ import { decodeHmrDynamicSegments, encodeHmrDynamicSegments } from '../../hmr/hmr-entrypoint-output.js';
5
+ import { resolveDevTransformModuleKind } from './dev-transform-module-kind.js';
6
+ export { DEV_TRANSFORM_URL_PREFIX } from '../../hmr/hmr-asset-paths.js';
7
+ const PAGE_SOURCE_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js', '.mdx', '.md'];
8
+ /**
9
+ * Maps a source entrypoint to the browser URL served by the dev transform server.
10
+ */
11
+ export function resolveDevTransformModuleUrl(srcDir, entrypointPath) {
12
+ const resolvedSrcDir = path.resolve(srcDir);
13
+ const normalizedEntrypoint = path.resolve(entrypointPath);
14
+ const relativePath = path.relative(resolvedSrcDir, normalizedEntrypoint);
15
+ if (relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
16
+ throw new Error(`[dev-transform] Entrypoint must be under srcDir: ${entrypointPath}`);
17
+ }
18
+ const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
19
+ const encodedPathJs = encodeHmrDynamicSegments(relativePathJs);
20
+ const urlPath = encodedPathJs.split(path.sep).join('/');
21
+ return `${DEV_TRANSFORM_URL_PREFIX}/${urlPath}`;
22
+ }
23
+ /**
24
+ * Resolves a dev-transform browser URL back to an on-disk page entrypoint.
25
+ *
26
+ * @remarks
27
+ * Client-side navigation can request page modules that were not registered during
28
+ * the current SSR response. Lazy resolution keeps those URLs materializable on demand.
29
+ */
30
+ export function resolveDevTransformModuleSourcePath(srcDir, moduleUrl) {
31
+ const pathname = stripModuleUrlQuery(moduleUrl);
32
+ const prefix = `${DEV_TRANSFORM_URL_PREFIX}/`;
33
+ if (!pathname.startsWith(prefix)) {
34
+ return undefined;
35
+ }
36
+ const resolvedSrcDir = path.resolve(srcDir);
37
+ const relativeUrlPath = pathname.slice(prefix.length);
38
+ const relativePathJs = relativeUrlPath.split('/').join(path.sep);
39
+ const decodedRelativePathJs = decodeHmrDynamicSegments(relativePathJs);
40
+ if (resolveDevTransformModuleKind(decodedRelativePathJs) === 'stylesheet') {
41
+ const cssPath = path.resolve(resolvedSrcDir, decodedRelativePathJs);
42
+ if (cssPath.startsWith(`${resolvedSrcDir}${path.sep}`) && fileSystem.exists(cssPath)) {
43
+ return cssPath;
44
+ }
45
+ return undefined;
46
+ }
47
+ const basePath = decodedRelativePathJs.replace(/\.js$/u, '');
48
+ for (const extension of PAGE_SOURCE_EXTENSIONS) {
49
+ const candidate = path.resolve(resolvedSrcDir, `${basePath}${extension}`);
50
+ if (!candidate.startsWith(`${resolvedSrcDir}${path.sep}`)) {
51
+ continue;
52
+ }
53
+ if (fileSystem.exists(candidate)) {
54
+ return candidate;
55
+ }
56
+ }
57
+ return undefined;
58
+ }
@@ -0,0 +1,28 @@
1
+ import type { EcoBuildPlugin } from '../../build/contracts/build-types.js';
2
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
3
+ export type DevTransformVendorRegistryOptions = {
4
+ appConfig: EcoPagesAppConfig;
5
+ getRuntimeSpecifierMap: () => ReadonlyMap<string, string>;
6
+ resolveVendorBundlePlugins?: () => Promise<readonly EcoBuildPlugin[]>;
7
+ };
8
+ /**
9
+ * Lazily prebundles bare npm imports into cacheable `/assets/vendors/*` chunks.
10
+ */
11
+ export declare class DevTransformVendorRegistry {
12
+ private readonly appConfig;
13
+ private readonly browserBundleService;
14
+ private readonly getRuntimeSpecifierMap;
15
+ private readonly resolveVendorBundlePlugins?;
16
+ private readonly vendorsDir;
17
+ private readonly cache;
18
+ private readonly inFlight;
19
+ constructor(options: DevTransformVendorRegistryOptions);
20
+ resolveKnownVendorUrl(specifier: string): string | undefined;
21
+ resolveVendorUrl(specifier: string): Promise<string>;
22
+ tryHandleVendorRequest(pathname: string): Response | null;
23
+ invalidateAll(): void;
24
+ private createVendorResponse;
25
+ private resolveExistingVendorPath;
26
+ private prebundleSpecifier;
27
+ private resolvePackageEntry;
28
+ }
@@ -0,0 +1,158 @@
1
+ import { createHash } from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { fileSystem } from '@ecopages/file-system';
4
+ import { RESOLVED_ASSETS_VENDORS_DIR } from '../../config/constants.js';
5
+ import { getAppBrowserBuildPlugins } from '../../build/build-adapter.js';
6
+ import { resolveBarePackageBrowserEntry } from '../../plugins/tsconfig-import-resolver.js';
7
+ import { BrowserBundleService } from '../../services/assets/browser-bundle.service.js';
8
+ const BROWSER_VENDOR_CONDITIONS = ['browser', 'module', 'import', 'default'];
9
+ const BROWSER_NODE_BUILTIN_GUARD_MARKER = '[browser-build] Node builtin';
10
+ /**
11
+ * Lazily prebundles bare npm imports into cacheable `/assets/vendors/*` chunks.
12
+ */
13
+ export class DevTransformVendorRegistry {
14
+ appConfig;
15
+ browserBundleService;
16
+ getRuntimeSpecifierMap;
17
+ resolveVendorBundlePlugins;
18
+ vendorsDir;
19
+ cache = new Map();
20
+ inFlight = new Map();
21
+ constructor(options) {
22
+ this.appConfig = options.appConfig;
23
+ this.browserBundleService = new BrowserBundleService(options.appConfig);
24
+ this.getRuntimeSpecifierMap = options.getRuntimeSpecifierMap;
25
+ this.resolveVendorBundlePlugins = options.resolveVendorBundlePlugins;
26
+ const distDir = options.appConfig.absolutePaths?.distDir ?? path.join(options.appConfig.rootDir, '.eco');
27
+ this.vendorsDir = path.join(distDir, RESOLVED_ASSETS_VENDORS_DIR);
28
+ }
29
+ resolveKnownVendorUrl(specifier) {
30
+ return this.getRuntimeSpecifierMap().get(specifier);
31
+ }
32
+ async resolveVendorUrl(specifier) {
33
+ const known = this.resolveKnownVendorUrl(specifier);
34
+ if (known && this.resolveExistingVendorPath(known)) {
35
+ return known;
36
+ }
37
+ const cached = this.cache.get(specifier);
38
+ if (cached) {
39
+ return cached.url;
40
+ }
41
+ const pending = this.inFlight.get(specifier);
42
+ if (pending) {
43
+ return (await pending).url;
44
+ }
45
+ const promise = this.prebundleSpecifier(specifier).finally(() => {
46
+ this.inFlight.delete(specifier);
47
+ });
48
+ this.inFlight.set(specifier, promise);
49
+ return (await promise).url;
50
+ }
51
+ tryHandleVendorRequest(pathname) {
52
+ const prefix = `/${RESOLVED_ASSETS_VENDORS_DIR}/`;
53
+ if (!pathname.startsWith(prefix)) {
54
+ return null;
55
+ }
56
+ const fileName = pathname.slice(prefix.length);
57
+ if (!fileName || fileName.includes('..')) {
58
+ return null;
59
+ }
60
+ const filePath = path.join(this.vendorsDir, fileName);
61
+ if (!fileSystem.exists(filePath)) {
62
+ for (const entry of this.cache.values()) {
63
+ if (entry.url === pathname && fileSystem.exists(entry.filePath)) {
64
+ return this.createVendorResponse(entry.filePath);
65
+ }
66
+ }
67
+ return null;
68
+ }
69
+ return this.createVendorResponse(filePath);
70
+ }
71
+ invalidateAll() {
72
+ this.cache.clear();
73
+ this.inFlight.clear();
74
+ }
75
+ createVendorResponse(filePath) {
76
+ return new Response(fileSystem.readFileSync(filePath), {
77
+ headers: {
78
+ 'Content-Type': 'application/javascript',
79
+ 'Cache-Control': 'public, max-age=31536000, immutable',
80
+ },
81
+ });
82
+ }
83
+ resolveExistingVendorPath(url) {
84
+ const prefix = `/${RESOLVED_ASSETS_VENDORS_DIR}/`;
85
+ const pathname = new URL(url, 'http://ecopages.local').pathname;
86
+ if (!pathname.startsWith(prefix)) {
87
+ return undefined;
88
+ }
89
+ const fileName = pathname.slice(prefix.length);
90
+ if (!fileName || fileName.includes('..')) {
91
+ return undefined;
92
+ }
93
+ const filePath = path.join(this.vendorsDir, fileName);
94
+ return fileSystem.exists(filePath) ? filePath : undefined;
95
+ }
96
+ async prebundleSpecifier(specifier) {
97
+ const resolvedEntry = this.resolvePackageEntry(specifier);
98
+ fileSystem.ensureDir(this.vendorsDir);
99
+ const fileName = `${sanitizeSpecifierForFileName(specifier)}.${hashVendorEntry(specifier, resolvedEntry)}.js`;
100
+ const outPath = path.join(this.vendorsDir, fileName);
101
+ const url = `/${RESOLVED_ASSETS_VENDORS_DIR}/${fileName}`;
102
+ if (fileSystem.exists(outPath)) {
103
+ const entry = { url, filePath: outPath };
104
+ this.cache.set(specifier, entry);
105
+ return entry;
106
+ }
107
+ const vendorPlugins = this.resolveVendorBundlePlugins ? await this.resolveVendorBundlePlugins() : [];
108
+ const result = await this.browserBundleService.bundle({
109
+ profile: 'browser-script',
110
+ entrypoints: [resolvedEntry],
111
+ outdir: this.vendorsDir,
112
+ naming: fileName,
113
+ minify: false,
114
+ externalPackages: false,
115
+ treeshaking: true,
116
+ splitting: false,
117
+ conditions: [...BROWSER_VENDOR_CONDITIONS],
118
+ excludeAppBuildPlugins: getAppBrowserBuildPlugins(this.appConfig).map((plugin) => plugin.name),
119
+ plugins: [...vendorPlugins],
120
+ });
121
+ if (!result.success) {
122
+ const details = result.logs.map((log) => log.message).join('\n');
123
+ throw new Error(formatVendorPrebundleError(specifier, details));
124
+ }
125
+ const outputPath = result.outputs[0]?.path ?? outPath;
126
+ const entry = { url, filePath: outputPath };
127
+ this.cache.set(specifier, entry);
128
+ return entry;
129
+ }
130
+ resolvePackageEntry(specifier) {
131
+ const resolved = resolveBarePackageBrowserEntry(this.appConfig.rootDir, specifier);
132
+ if (!resolved) {
133
+ throw new Error(`[dev-transform] Unable to resolve bare import "${specifier}" for vendor prebundle`);
134
+ }
135
+ return resolved;
136
+ }
137
+ }
138
+ function formatVendorPrebundleError(specifier, details) {
139
+ if (details.includes(BROWSER_NODE_BUILTIN_GUARD_MARKER)) {
140
+ return (`[dev-transform] Bare import "${specifier}" resolved to a server-only entry. ` +
141
+ `Import a browser subpath or register the package in the browser runtime manifest.` +
142
+ (details ? `\n${details}` : ''));
143
+ }
144
+ return details
145
+ ? `[dev-transform] Vendor prebundle failed for ${specifier}:\n${details}`
146
+ : `[dev-transform] Vendor prebundle failed for ${specifier}`;
147
+ }
148
+ function sanitizeSpecifierForFileName(specifier) {
149
+ return specifier.replaceAll(/^@/gu, '').replaceAll(/[/:@]/gu, '-');
150
+ }
151
+ function hashVendorEntry(specifier, entryPath) {
152
+ return createHash('sha256')
153
+ .update(specifier)
154
+ .update('\0')
155
+ .update(fileSystem.readFileSync(entryPath))
156
+ .digest('hex')
157
+ .slice(0, 8);
158
+ }