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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/README.md +1 -0
  2. package/package.json +90 -3
  3. package/src/adapters/abstract/application-adapter.d.ts +0 -8
  4. package/src/adapters/abstract/application-adapter.js +252 -261
  5. package/src/adapters/abstract/router-adapter.js +12 -4
  6. package/src/adapters/abstract/segment-path-matcher.js +132 -134
  7. package/src/adapters/abstract/server-adapter.js +22 -14
  8. package/src/adapters/abstract/ws-pattern-matcher.js +24 -26
  9. package/src/adapters/bun/bun-user-websocket-lifecycle.js +83 -86
  10. package/src/adapters/bun/client-bridge.js +51 -50
  11. package/src/adapters/bun/create-app.js +171 -161
  12. package/src/adapters/bun/hmr-manager.js +62 -57
  13. package/src/adapters/bun/index.js +2 -31
  14. package/src/adapters/bun/runtime-host.js +61 -54
  15. package/src/adapters/bun/server-adapter.d.ts +0 -1
  16. package/src/adapters/bun/server-adapter.js +561 -561
  17. package/src/adapters/bun/static-preview-host.js +43 -46
  18. package/src/adapters/create-app.js +11 -14
  19. package/src/adapters/index.js +2 -30
  20. package/src/adapters/node/create-app.js +123 -129
  21. package/src/adapters/node/http-request-bridge.js +147 -106
  22. package/src/adapters/node/node-client-bridge.js +62 -64
  23. package/src/adapters/node/node-hmr-manager.js +58 -48
  24. package/src/adapters/node/runtime-host.js +96 -89
  25. package/src/adapters/node/server-adapter-dependencies.js +18 -21
  26. package/src/adapters/node/server-adapter.d.ts +0 -1
  27. package/src/adapters/node/server-adapter.js +347 -326
  28. package/src/adapters/node/static-content-server.js +172 -191
  29. package/src/adapters/node/static-preview-host.js +87 -78
  30. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  31. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  32. package/src/adapters/shared/hmr/hmr-html-response.js +46 -32
  33. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +29 -38
  34. package/src/adapters/shared/hmr/shared-hmr-manager.js +439 -425
  35. package/src/adapters/shared/http/api-request-pipeline.js +122 -119
  36. package/src/adapters/shared/http/api-response.js +77 -77
  37. package/src/adapters/shared/http/create-body-response.js +22 -19
  38. package/src/adapters/shared/http/define-api-handler.js +41 -55
  39. package/src/adapters/shared/http/explicit-static-render-preparation.js +26 -23
  40. package/src/adapters/shared/http/explicit-static-route-matcher.js +55 -62
  41. package/src/adapters/shared/http/file-route-middleware-pipeline.js +81 -75
  42. package/src/adapters/shared/http/fs-server-response-factory.js +101 -96
  43. package/src/adapters/shared/http/fs-server-response-matcher.js +239 -257
  44. package/src/adapters/shared/http/run-middleware-chain.js +15 -15
  45. package/src/adapters/shared/runtime/application-adapter.js +72 -87
  46. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +25 -22
  47. package/src/adapters/shared/runtime/port-manager.js +207 -177
  48. package/src/adapters/shared/runtime/render-context.js +94 -79
  49. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +33 -38
  50. package/src/adapters/shared/runtime/runtime-host.js +1 -0
  51. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +2 -3
  52. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +65 -51
  53. package/src/adapters/shared/runtime/server-adapter.d.ts +1 -0
  54. package/src/adapters/shared/runtime/server-adapter.js +233 -217
  55. package/src/adapters/shared/runtime/server-route-handler.js +74 -70
  56. package/src/adapters/shared/runtime/server-static-builder.js +165 -184
  57. package/src/adapters/shared/runtime/static-preview-host.js +1 -0
  58. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +97 -88
  59. package/src/adapters/shared/ws/websocket-lifecycle.js +57 -50
  60. package/src/build/README.md +52 -1
  61. package/src/build/app-build-manifest-runtime.js +129 -108
  62. package/src/build/browser/browser-runtime-manifest.js +47 -50
  63. package/src/build/browser/browser-runtime-plugin-helpers.js +32 -12
  64. package/src/build/browser/browser-runtime-plugin.js +206 -160
  65. package/src/build/browser/jsx-ownership-plugins.js +51 -37
  66. package/src/build/browser/lit-static-render-worker-context.js +3 -5
  67. package/src/build/build-adapter.js +276 -139
  68. package/src/build/cache/build-input-fingerprint.js +28 -26
  69. package/src/build/cache/cache-constants.js +4 -6
  70. package/src/build/cache/cache-keys.js +64 -56
  71. package/src/build/cache/pages-unified-graph-build.js +179 -178
  72. package/src/build/cache/production-build-cache.js +47 -54
  73. package/src/build/cache/server-entry-build-cache.js +134 -146
  74. package/src/build/contracts/build-contracts.d.ts +4 -4
  75. package/src/build/contracts/build-contracts.js +1 -0
  76. package/src/build/contracts/build-manifest.js +58 -43
  77. package/src/build/contracts/build-types.js +1 -0
  78. package/src/build/rolldown/rolldown-adapter-helpers.d.ts +9 -0
  79. package/src/build/rolldown/rolldown-adapter-helpers.js +405 -298
  80. package/src/build/rolldown/rolldown-build-adapter.js +53 -61
  81. package/src/build/rolldown/rolldown-build-invocation-metrics.js +31 -35
  82. package/src/build/rolldown/rolldown-plugin-bridge.js +264 -194
  83. package/src/build/rolldown/rolldown-source-transform-pass.js +59 -50
  84. package/src/build/rolldown/runtime-build-output-normalizer.js +227 -175
  85. package/src/build/rolldown/server-side-css-shim-plugin.js +54 -31
  86. package/src/build/runtime/build-profile-options.js +36 -36
  87. package/src/build/runtime/build-request-identity.js +70 -45
  88. package/src/build/runtime/build-request-policy.js +80 -42
  89. package/src/build/runtime/build-runtime.js +64 -54
  90. package/src/build/runtime/deduping-build-executor.js +38 -32
  91. package/src/build/runtime/parallel-build-executor.js +58 -50
  92. package/src/build/runtime/serialized-build-executor.js +78 -62
  93. package/src/cache/index.js +6 -6
  94. package/src/cache/module-parse-cache.js +99 -68
  95. package/src/client/navigation-scripts/classification.js +45 -37
  96. package/src/client/navigation-scripts/index.js +3 -23
  97. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +58 -62
  98. package/src/client/navigation-scripts/registry.js +15 -11
  99. package/src/client/navigation-scripts/rerun-queue.js +81 -64
  100. package/src/client/scroll.js +32 -24
  101. package/src/client/scroll.test.browser.js +27 -33
  102. package/src/client/view-transitions.js +68 -55
  103. package/src/config/config-builder.d.ts +8 -0
  104. package/src/config/config-builder.js +637 -642
  105. package/src/config/constants.js +44 -24
  106. package/src/declarations.d.ts +1 -0
  107. package/src/dev/README.md +24 -0
  108. package/src/dev/client-bridge-registry.js +7 -12
  109. package/src/dev/dev-client-ownership.js +7 -5
  110. package/src/dev/hmr-manager-registry.js +7 -12
  111. package/src/dev/host-runtime.js +25 -30
  112. package/src/dev/runtime-server-started-message.js +2 -5
  113. package/src/dev/sc-server.js +106 -103
  114. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  115. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  116. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  117. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  118. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  119. package/src/dev/transform-server/dev-transform-import-rewriter.js +110 -0
  120. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  121. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  122. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  123. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  124. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  125. package/src/dev/transform-server/dev-transform-server.js +191 -0
  126. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  127. package/src/dev/transform-server/dev-transform-url.js +58 -0
  128. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +27 -0
  129. package/src/dev/transform-server/dev-transform-vendor-registry.js +145 -0
  130. package/src/dev/transform-server/index.d.ts +6 -0
  131. package/src/dev/transform-server/index.js +4 -0
  132. package/src/dev/transform-server/types.d.ts +15 -0
  133. package/src/dev/transform-server/types.js +1 -0
  134. package/src/dev-toolbar/README.md +51 -0
  135. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  136. package/src/dev-toolbar/define-dev-tool.js +9 -0
  137. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  138. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  139. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  140. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  141. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  142. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  143. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  144. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  145. package/src/dev-toolbar/dev-toolbar-package.d.ts +31 -0
  146. package/src/dev-toolbar/dev-toolbar-package.js +72 -0
  147. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  148. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  149. package/src/diagnostics/request-build-dedupe.js +34 -28
  150. package/src/diagnostics/startup-trace.d.ts +10 -1
  151. package/src/diagnostics/startup-trace.js +269 -241
  152. package/src/eco/README.md +6 -0
  153. package/src/eco/eco-declared-component.js +19 -14
  154. package/src/eco/eco.browser.js +56 -69
  155. package/src/eco/eco.js +156 -96
  156. package/src/eco/eco.types.js +5 -0
  157. package/src/eco/eco.utils.js +1 -10
  158. package/src/eco/global-injector-map.js +55 -41
  159. package/src/eco/lazy-injector-map.js +90 -60
  160. package/src/eco/module-dependencies.js +52 -44
  161. package/src/eco/page-layout-normalization.js +59 -49
  162. package/src/errors/http-error.js +50 -49
  163. package/src/errors/index.js +3 -12
  164. package/src/errors/locals-access-error.js +5 -8
  165. package/src/errors/undeclared-component-dependency-error.js +15 -15
  166. package/src/global/app-logger.js +3 -6
  167. package/src/hmr/README.md +10 -0
  168. package/src/hmr/client/hmr-runtime.js +117 -113
  169. package/src/hmr/client/module-update.d.ts +13 -0
  170. package/src/hmr/client/module-update.js +39 -0
  171. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  172. package/src/hmr/hmr-asset-paths.js +22 -0
  173. package/src/hmr/hmr-entrypoint-output.d.ts +11 -39
  174. package/src/hmr/hmr-entrypoint-output.js +28 -54
  175. package/src/hmr/hmr-file-change-prep.js +13 -16
  176. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  177. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  178. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  179. package/src/hmr/hmr-runtime-paths.js +13 -0
  180. package/src/hmr/hmr-strategy.d.ts +5 -11
  181. package/src/hmr/hmr-strategy.js +113 -61
  182. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  183. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -95
  184. package/src/hmr/strategies/js-hmr-strategy.js +104 -217
  185. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +33 -27
  186. package/src/index.browser.js +1 -4
  187. package/src/index.d.ts +1 -0
  188. package/src/index.js +6 -47
  189. package/src/integrations/ghtml/ghtml-renderer.js +12 -7
  190. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  191. package/src/integrations/ghtml/ghtml.plugin.js +9 -12
  192. package/src/islands/README.md +25 -0
  193. package/src/islands/island-host.d.ts +37 -0
  194. package/src/islands/island-host.js +55 -0
  195. package/src/plugins/alias-resolver-cache.js +114 -97
  196. package/src/plugins/alias-resolver-plugin.js +33 -47
  197. package/src/plugins/define-integration.js +18 -17
  198. package/src/plugins/eco-component-meta-plugin.js +387 -145
  199. package/src/plugins/foreign-jsx-override-plugin.js +49 -35
  200. package/src/plugins/integration-plugin.js +212 -203
  201. package/src/plugins/jsx-import-source.utils.js +16 -21
  202. package/src/plugins/processor.js +159 -149
  203. package/src/plugins/runtime-capability.js +1 -0
  204. package/src/plugins/source-transform.js +109 -79
  205. package/src/plugins/tsconfig-import-resolver.d.ts +17 -0
  206. package/src/plugins/tsconfig-import-resolver.js +218 -142
  207. package/src/route-renderer/README.md +12 -1
  208. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +143 -136
  209. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +33 -27
  210. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +173 -126
  211. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +165 -154
  212. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +329 -341
  213. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +33 -32
  214. package/src/route-renderer/orchestration/integration-renderer.d.ts +1 -0
  215. package/src/route-renderer/orchestration/integration-renderer.js +731 -750
  216. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +168 -172
  217. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +119 -131
  218. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +82 -91
  219. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +82 -76
  220. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +29 -31
  221. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +10 -6
  222. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +31 -28
  223. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +3 -0
  224. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +430 -413
  225. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +191 -212
  226. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +20 -24
  227. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +4 -0
  228. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +24 -24
  229. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +22 -24
  230. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +41 -34
  231. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +5 -0
  232. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +42 -22
  233. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +50 -48
  234. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +29 -32
  235. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +150 -156
  236. package/src/route-renderer/orchestration/string-markup-renderer.js +48 -51
  237. package/src/route-renderer/page-loading/component-dependency-collection.js +120 -124
  238. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  239. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  240. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +68 -54
  241. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  242. package/src/route-renderer/page-loading/lazy-trigger-planning.js +46 -36
  243. package/src/route-renderer/page-loading/module-declaration-aggregation.js +38 -31
  244. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  245. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  246. package/src/route-renderer/page-loading/page-module-loader.js +130 -124
  247. package/src/route-renderer/route-renderer.js +74 -76
  248. package/src/router/README.md +23 -0
  249. package/src/router/client/link-intent.js +55 -39
  250. package/src/router/client/link-intent.test.browser.js +49 -49
  251. package/src/router/client/link-navigation-policy.js +114 -93
  252. package/src/router/client/link-navigation-policy.test.browser.js +70 -80
  253. package/src/router/client/navigation-coordinator.js +235 -211
  254. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  255. package/src/router/client/navigation-lifecycle.js +50 -0
  256. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  257. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  258. package/src/router/server/route-registry.js +237 -242
  259. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
  260. package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
  261. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  262. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  263. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  264. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
  265. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
  266. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
  267. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
  268. package/src/services/assets/asset-processing-service/index.js +8 -8
  269. package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
  270. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
  271. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  272. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  273. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  274. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  275. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
  276. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  277. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
  278. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
  279. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  280. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
  281. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
  282. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
  283. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
  284. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
  285. package/src/services/assets/browser-bundle.service.js +52 -47
  286. package/src/services/cache/cache.types.js +5 -0
  287. package/src/services/cache/index.js +6 -7
  288. package/src/services/cache/memory-cache-store.js +101 -89
  289. package/src/services/cache/page-cache-service.js +156 -145
  290. package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
  291. package/src/services/html/html-rewriter-provider.service.js +61 -61
  292. package/src/services/html/html-transformer.service.js +249 -266
  293. package/src/services/invalidation/development-invalidation.service.js +252 -241
  294. package/src/services/module-loading/app-module-loader.service.js +1 -0
  295. package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
  296. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  297. package/src/services/module-loading/module-loading-types.js +1 -0
  298. package/src/services/module-loading/page-module-import.service.js +235 -243
  299. package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
  300. package/src/services/module-loading/route-module-build-cache.js +3 -38
  301. package/src/services/module-loading/route-module-build-cache.store.js +195 -200
  302. package/src/services/module-loading/route-module-build-manifest.js +61 -74
  303. package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
  304. package/src/services/module-loading/server-module-transpiler.service.js +68 -62
  305. package/src/services/module-loading/source-module-support.js +15 -7
  306. package/src/services/runtime-state/dev-graph.service.js +165 -157
  307. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  308. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  309. package/src/services/validation/schema-validation-service.js +157 -95
  310. package/src/services/validation/standard-schema.types.js +1 -0
  311. package/src/services/validation/validate-standard-schema.js +13 -13
  312. package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
  313. package/src/static-site-generator/sitemap-routes.js +33 -28
  314. package/src/static-site-generator/sitemap.js +38 -29
  315. package/src/static-site-generator/static-build-invalidation.js +34 -56
  316. package/src/static-site-generator/static-export-context.js +1 -0
  317. package/src/static-site-generator/static-site-generator.js +517 -553
  318. package/src/types/internal-types.d.ts +19 -3
  319. package/src/types/internal-types.js +1 -0
  320. package/src/types/public-types.d.ts +16 -46
  321. package/src/types/public-types.js +1 -0
  322. package/src/utils/deep-merge.js +39 -26
  323. package/src/utils/ecopages-route-info.js +27 -23
  324. package/src/utils/hash.js +3 -6
  325. package/src/utils/html-escaping.js +21 -8
  326. package/src/utils/html.js +1 -4
  327. package/src/utils/invariant.js +11 -10
  328. package/src/utils/locals-utils.js +32 -22
  329. package/src/utils/parse-cli-args.js +73 -65
  330. package/src/utils/path-pattern.js +38 -23
  331. package/src/utils/path-utils.module.js +8 -11
  332. package/src/utils/resolve-entry-file.js +70 -38
  333. package/src/utils/resolve-work-dir.js +23 -27
  334. package/src/utils/runtime.js +24 -33
  335. package/src/utils/server-utils.module.js +60 -52
  336. package/src/utils/static-file-extensions.js +52 -46
  337. package/src/watchers/project-watcher-ignore.js +16 -15
  338. package/src/watchers/project-watcher.js +385 -366
  339. package/src/watchers/project-watcher.test-helpers.js +45 -50
  340. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
  341. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
  342. package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
  343. package/src/build/cache/dev-browser-script-cache.js +0 -90
@@ -1,26 +1,46 @@
1
- const STATUS_MESSAGE = {
2
- 404: "404 Not Found",
3
- 500: "Internal Server Error"
1
+ /**
2
+ * This file contains constants used throughout the project.
3
+ * @module constants
4
+ **/
5
+ /**
6
+ * Collection of status messages used in the application.
7
+ */
8
+ export const STATUS_MESSAGE = {
9
+ 404: '404 Not Found',
10
+ 500: 'Internal Server Error',
4
11
  };
5
- const IS_BUN = typeof Bun !== "undefined";
6
- const RESOLVED_ASSETS_DIR = "assets";
7
- const RESOLVED_ASSETS_VENDORS_DIR = `${RESOLVED_ASSETS_DIR}/vendors`;
8
- const GENERATED_BASE_PATHS = {
9
- types: "node_modules/@types",
10
- cache: "cache"
11
- };
12
- const DEFAULT_ECOPAGES_PORT = 3e3;
13
- const DEFAULT_ECOPAGES_HOSTNAME = "localhost";
14
- const DEFAULT_ECOPAGES_DIST_DIR = "dist";
15
- const DEFAULT_ECOPAGES_WORK_DIR = ".eco";
16
- export {
17
- DEFAULT_ECOPAGES_DIST_DIR,
18
- DEFAULT_ECOPAGES_HOSTNAME,
19
- DEFAULT_ECOPAGES_PORT,
20
- DEFAULT_ECOPAGES_WORK_DIR,
21
- GENERATED_BASE_PATHS,
22
- IS_BUN,
23
- RESOLVED_ASSETS_DIR,
24
- RESOLVED_ASSETS_VENDORS_DIR,
25
- STATUS_MESSAGE
12
+ /**
13
+ *Variables used to determine if the app is running on Bun
14
+ */
15
+ export const IS_BUN = typeof Bun !== 'undefined';
16
+ /**
17
+ * Directory used for storing assets.
18
+ */
19
+ export const RESOLVED_ASSETS_DIR = 'assets';
20
+ /**
21
+ * Directory used for storing vendor assets.
22
+ * This is a subdirectory of the assets directory.
23
+ */
24
+ export const RESOLVED_ASSETS_VENDORS_DIR = `${RESOLVED_ASSETS_DIR}/vendors`;
25
+ /**
26
+ * Base paths for generated project files.
27
+ */
28
+ export const GENERATED_BASE_PATHS = {
29
+ types: 'node_modules/@types',
30
+ cache: 'cache',
26
31
  };
32
+ export const DEFAULT_ECOPAGES_PORT = 3000;
33
+ export const DEFAULT_ECOPAGES_HOSTNAME = 'localhost';
34
+ /**
35
+ * Default directory used for deployable output.
36
+ */
37
+ export const DEFAULT_ECOPAGES_DIST_DIR = 'dist';
38
+ /**
39
+ * Default internal working directory used for runtime-only artifacts.
40
+ *
41
+ * @remarks
42
+ * This directory is a local tool workspace and is not intended for deployment.
43
+ * It owns transpiled server modules, runtime manifests, and processor caches
44
+ * so the export directory can remain a clean deployable tree.
45
+ */
46
+ export const DEFAULT_ECOPAGES_WORK_DIR = '.eco';
@@ -15,6 +15,7 @@ type EcoPagesWindowRuntime = {
15
15
  cleanupPageRoot?: CleanupPageRootFunction;
16
16
  pageRoot?: EcoPageRoot | null;
17
17
  };
18
+ islandRoots?: Record<string, EcoPageRoot>;
18
19
  page?: EcoPageData;
19
20
  };
20
21
 
@@ -0,0 +1,24 @@
1
+ Development-only browser tooling is opt-in per application.
2
+
3
+ ## Dev toolbar
4
+
5
+ - `/_dev_toolbar.js` — browser bundle built by core from `devToolbar.package` (for example `@ecopages/dev-toolbar`)
6
+ - `#__ECO_DEV_MANIFEST__` — per-page dependency graph payload for the Deps panel
7
+
8
+ Public docs: [Dev toolbar](/docs/core/dev-toolbar) (built-in apps, manifest fields).
9
+
10
+ Configure in `eco.config.ts`:
11
+
12
+ ```ts
13
+ import { devToolbar } from '@ecopages/dev-toolbar/config';
14
+
15
+ .setDevToolbar(devToolbar())
16
+ ```
17
+
18
+ For a custom client package, use `defineDevTool` from `@ecopages/core/dev-toolbar/define-dev-tool`.
19
+
20
+ Install the client package in the app project. Core resolves it from the application root and bundles it during watch mode.
21
+
22
+ Disable per project with `devToolbar: { enabled: false }`, or per process with `ECOPAGES_DEV_TOOLBAR=false`.
23
+
24
+ Server wiring: [dev-toolbar/README.md](../dev-toolbar/README.md) (`DevToolbarHost`, manifest, runtime bundling, HTML injection). Bring-your-own toolbars export `src/bootstrap.ts` and use the same `devToolbar.package` config key.
@@ -1,15 +1,10 @@
1
- const appDevClientBridges = /* @__PURE__ */ new WeakMap();
2
- function setAppDevClientBridge(appConfig, bridge) {
3
- appDevClientBridges.set(appConfig, bridge);
1
+ const appDevClientBridges = new WeakMap();
2
+ export function setAppDevClientBridge(appConfig, bridge) {
3
+ appDevClientBridges.set(appConfig, bridge);
4
4
  }
5
- function getAppDevClientBridge(appConfig) {
6
- return appDevClientBridges.get(appConfig);
5
+ export function getAppDevClientBridge(appConfig) {
6
+ return appDevClientBridges.get(appConfig);
7
7
  }
8
- function clearAppDevClientBridge(appConfig) {
9
- appDevClientBridges.delete(appConfig);
8
+ export function clearAppDevClientBridge(appConfig) {
9
+ appDevClientBridges.delete(appConfig);
10
10
  }
11
- export {
12
- clearAppDevClientBridge,
13
- getAppDevClientBridge,
14
- setAppDevClientBridge
15
- };
@@ -1,6 +1,8 @@
1
- function hostOwnsDevClient(runtime) {
2
- return runtime?.devClientOwner === "host" || runtime?.delegateBrowserReloadToHost === true;
1
+ /**
2
+ * Returns whether the host dev server owns all browser dev-client bootstrap.
3
+ *
4
+ * When true, core must not inject the HMR runtime or signal full-page reloads.
5
+ */
6
+ export function hostOwnsDevClient(runtime) {
7
+ return runtime?.devClientOwner === 'host';
3
8
  }
4
- export {
5
- hostOwnsDevClient
6
- };
@@ -1,15 +1,10 @@
1
- const appHmrManagers = /* @__PURE__ */ new WeakMap();
2
- function setAppHmrManager(appConfig, hmrManager) {
3
- appHmrManagers.set(appConfig, hmrManager);
1
+ const appHmrManagers = new WeakMap();
2
+ export function setAppHmrManager(appConfig, hmrManager) {
3
+ appHmrManagers.set(appConfig, hmrManager);
4
4
  }
5
- function getAppHmrManager(appConfig) {
6
- return appHmrManagers.get(appConfig);
5
+ export function getAppHmrManager(appConfig) {
6
+ return appHmrManagers.get(appConfig);
7
7
  }
8
- function clearAppHmrManager(appConfig) {
9
- appHmrManagers.delete(appConfig);
8
+ export function clearAppHmrManager(appConfig) {
9
+ appHmrManagers.delete(appConfig);
10
10
  }
11
- export {
12
- clearAppHmrManager,
13
- getAppHmrManager,
14
- setAppHmrManager
15
- };
@@ -1,31 +1,26 @@
1
- import {
2
- DevelopmentInvalidationService
3
- } from "../services/invalidation/development-invalidation.service.js";
4
- import { getAppDevClientBridge } from "./client-bridge-registry.js";
5
- import { setHostModuleLoader } from "../services/module-loading/host-module-loader-registry.js";
6
- function createDevelopmentHostRuntime(appConfig) {
7
- const invalidationService = new DevelopmentInvalidationService(appConfig);
8
- return {
9
- registerHostModuleLoader(loader) {
10
- setHostModuleLoader(loader);
11
- },
12
- planFileChange(filePath) {
13
- return invalidationService.planFileChange(filePath);
14
- },
15
- invalidateServerModules(changedFiles) {
16
- invalidationService.invalidateServerModules(changedFiles);
17
- },
18
- resetRuntimeState(changedFiles) {
19
- invalidationService.resetRuntimeState(changedFiles);
20
- },
21
- broadcastClientEvent(event) {
22
- getAppDevClientBridge(appConfig)?.broadcast(event);
23
- },
24
- isServerRenderedTemplatePlan(plan) {
25
- return plan.category === "include-source" || plan.category === "explicit-server-view";
26
- }
27
- };
1
+ import { DevelopmentInvalidationService, } from '../services/invalidation/development-invalidation.service.js';
2
+ import { getAppDevClientBridge } from './client-bridge-registry.js';
3
+ import { setHostModuleLoader } from '../services/module-loading/host-module-loader-registry.js';
4
+ export function createDevelopmentHostRuntime(appConfig) {
5
+ const invalidationService = new DevelopmentInvalidationService(appConfig);
6
+ return {
7
+ registerHostModuleLoader(loader) {
8
+ setHostModuleLoader(loader);
9
+ },
10
+ planFileChange(filePath) {
11
+ return invalidationService.planFileChange(filePath);
12
+ },
13
+ invalidateServerModules(changedFiles) {
14
+ invalidationService.invalidateServerModules(changedFiles);
15
+ },
16
+ resetRuntimeState(changedFiles) {
17
+ invalidationService.resetRuntimeState(changedFiles);
18
+ },
19
+ broadcastClientEvent(event) {
20
+ getAppDevClientBridge(appConfig)?.broadcast(event);
21
+ },
22
+ isServerRenderedTemplatePlan(plan) {
23
+ return plan.category === 'include-source' || plan.category === 'explicit-server-view';
24
+ },
25
+ };
28
26
  }
29
- export {
30
- createDevelopmentHostRuntime
31
- };
@@ -1,6 +1,3 @@
1
- function formatRuntimeServerStartedMessage(runtime, origin) {
2
- return `${runtime} server running at ${origin.replace(/\/$/, "")}`;
1
+ export function formatRuntimeServerStartedMessage(runtime, origin) {
2
+ return `${runtime} server running at ${origin.replace(/\/$/, '')}`;
3
3
  }
4
- export {
5
- formatRuntimeServerStartedMessage
6
- };
@@ -1,111 +1,114 @@
1
- import { extname, join } from "node:path";
2
- import { STATUS_MESSAGE } from "../config/constants.js";
3
- import { fileSystem } from "@ecopages/file-system";
4
- import { ServerUtils } from "../utils/server-utils.module.js";
5
- import { getRequiredBunRuntime } from "../utils/runtime.js";
6
- class StaticContentServer {
7
- server = null;
8
- appConfig;
9
- options = { port: 3e3 };
10
- constructor({ appConfig, options }) {
11
- this.appConfig = appConfig;
12
- if (options) this.options = options;
13
- this.startServer();
14
- }
15
- shouldServeGzip(contentType) {
16
- return ["text/javascript", "text/css"].includes(contentType);
17
- }
18
- isHtml(contentType) {
19
- return contentType === "text/html";
20
- }
21
- async sendNotFoundPage() {
22
- const error404TemplatePath = `${this.appConfig.absolutePaths.distDir}/404.html`;
23
- try {
24
- fileSystem.exists(error404TemplatePath);
25
- } catch {
26
- return new Response(STATUS_MESSAGE[404], {
27
- status: 404
28
- });
1
+ import { extname, join } from 'node:path';
2
+ import { STATUS_MESSAGE } from '../config/constants.js';
3
+ import { fileSystem } from '@ecopages/file-system';
4
+ import { ServerUtils } from '../utils/server-utils.module.js';
5
+ import { getRequiredBunRuntime } from '../utils/runtime.js';
6
+ /**
7
+ * Static content server for production builds.
8
+ * Serves pre-built static files from the dist directory with gzip compression support.
9
+ */
10
+ export class StaticContentServer {
11
+ server = null;
12
+ appConfig;
13
+ options = { port: 3000 };
14
+ constructor({ appConfig, options }) {
15
+ this.appConfig = appConfig;
16
+ if (options)
17
+ this.options = options;
18
+ this.startServer();
29
19
  }
30
- const response = new Response(fileSystem.readFileAsBuffer(error404TemplatePath), {
31
- headers: { "Content-Type": "text/html" }
32
- });
33
- return response;
34
- }
35
- async serveFromDir({ path, request }) {
36
- const { absolutePaths } = this.appConfig;
37
- const basePath = join(absolutePaths.distDir, path);
38
- const contentType = ServerUtils.getContentType(extname(basePath));
39
- const acceptsGzip = request.headers.get("Accept-Encoding")?.includes("gzip");
40
- try {
41
- if (acceptsGzip && this.shouldServeGzip(contentType)) {
42
- const gzipPath = `${basePath}.gz`;
43
- if (fileSystem.exists(gzipPath)) {
44
- const file = fileSystem.readFileAsBuffer(gzipPath);
45
- return new Response(file, {
46
- headers: {
47
- "Content-Type": contentType,
48
- "Content-Encoding": "gzip",
49
- Vary: "Accept-Encoding"
50
- }
51
- });
20
+ shouldServeGzip(contentType) {
21
+ return ['text/javascript', 'text/css'].includes(contentType);
22
+ }
23
+ isHtml(contentType) {
24
+ return contentType === 'text/html';
25
+ }
26
+ async sendNotFoundPage() {
27
+ const error404TemplatePath = `${this.appConfig.absolutePaths.distDir}/404.html`;
28
+ try {
29
+ fileSystem.exists(error404TemplatePath);
30
+ }
31
+ catch {
32
+ return new Response(STATUS_MESSAGE[404], {
33
+ status: 404,
34
+ });
52
35
  }
53
- }
54
- if (path.includes(".") && fileSystem.exists(basePath)) {
55
- const file = fileSystem.readFileAsBuffer(basePath);
56
- return new Response(file, {
57
- headers: { "Content-Type": contentType }
36
+ const response = new Response(fileSystem.readFileAsBuffer(error404TemplatePath), {
37
+ headers: { 'Content-Type': 'text/html' },
58
38
  });
59
- }
60
- const htmlCandidates = [`${basePath}.html`, `${basePath}/index.html`];
61
- for (const candidate of htmlCandidates) {
62
- if (fileSystem.exists(candidate)) {
63
- const file = fileSystem.readFileAsBuffer(candidate);
64
- return new Response(file, {
65
- headers: {
66
- "Content-Type": ServerUtils.getContentType(extname(candidate))
39
+ return response;
40
+ }
41
+ async serveFromDir({ path, request }) {
42
+ const { absolutePaths } = this.appConfig;
43
+ const basePath = join(absolutePaths.distDir, path);
44
+ const contentType = ServerUtils.getContentType(extname(basePath));
45
+ const acceptsGzip = request.headers.get('Accept-Encoding')?.includes('gzip');
46
+ try {
47
+ if (acceptsGzip && this.shouldServeGzip(contentType)) {
48
+ const gzipPath = `${basePath}.gz`;
49
+ if (fileSystem.exists(gzipPath)) {
50
+ const file = fileSystem.readFileAsBuffer(gzipPath);
51
+ return new Response(file, {
52
+ headers: {
53
+ 'Content-Type': contentType,
54
+ 'Content-Encoding': 'gzip',
55
+ Vary: 'Accept-Encoding',
56
+ },
57
+ });
58
+ }
59
+ }
60
+ if (path.includes('.') && fileSystem.exists(basePath)) {
61
+ const file = fileSystem.readFileAsBuffer(basePath);
62
+ return new Response(file, {
63
+ headers: { 'Content-Type': contentType },
64
+ });
67
65
  }
68
- });
66
+ const htmlCandidates = [`${basePath}.html`, `${basePath}/index.html`];
67
+ for (const candidate of htmlCandidates) {
68
+ if (fileSystem.exists(candidate)) {
69
+ const file = fileSystem.readFileAsBuffer(candidate);
70
+ return new Response(file, {
71
+ headers: {
72
+ 'Content-Type': ServerUtils.getContentType(extname(candidate)),
73
+ },
74
+ });
75
+ }
76
+ }
77
+ return this.sendNotFoundPage();
78
+ }
79
+ catch {
80
+ return this.sendNotFoundPage();
69
81
  }
70
- }
71
- return this.sendNotFoundPage();
72
- } catch {
73
- return this.sendNotFoundPage();
74
82
  }
75
- }
76
- async fetch(request) {
77
- let reqPath = new URL(request.url).pathname;
78
- if (reqPath === "/") reqPath = "/index.html";
79
- const response = this.serveFromDir({
80
- path: reqPath,
81
- request
82
- });
83
- if (response) return response;
84
- return new Response(STATUS_MESSAGE[404], {
85
- status: 404
86
- });
87
- }
88
- startServer() {
89
- this.server = getRequiredBunRuntime().serve({
90
- fetch: this.fetch.bind(this),
91
- port: this.options.port
92
- });
93
- }
94
- stop() {
95
- if (this.server) {
96
- this.server.stop(true);
83
+ async fetch(request) {
84
+ let reqPath = new URL(request.url).pathname;
85
+ if (reqPath === '/')
86
+ reqPath = '/index.html';
87
+ const response = this.serveFromDir({
88
+ path: reqPath,
89
+ request,
90
+ });
91
+ if (response)
92
+ return response;
93
+ return new Response(STATUS_MESSAGE[404], {
94
+ status: 404,
95
+ });
96
+ }
97
+ startServer() {
98
+ this.server = getRequiredBunRuntime().serve({
99
+ fetch: this.fetch.bind(this),
100
+ port: this.options.port,
101
+ });
102
+ }
103
+ stop() {
104
+ if (this.server) {
105
+ this.server.stop(true);
106
+ }
107
+ }
108
+ static createServer({ appConfig, options, }) {
109
+ return new StaticContentServer({
110
+ appConfig: appConfig,
111
+ options,
112
+ });
97
113
  }
98
- }
99
- static createServer({
100
- appConfig,
101
- options
102
- }) {
103
- return new StaticContentServer({
104
- appConfig,
105
- options
106
- });
107
- }
108
114
  }
109
- export {
110
- StaticContentServer
111
- };
@@ -0,0 +1,24 @@
1
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
+ import type { DevTransformVendorRegistry } from './dev-transform-vendor-registry.js';
3
+ import type { DevTransformBundleContributor, DevTransformBundleResult } from './types.js';
4
+ export type DevTransformBundlerOptions = {
5
+ appConfig: EcoPagesAppConfig;
6
+ contributors?: readonly DevTransformBundleContributor[];
7
+ getRuntimeSpecifierMap: () => ReadonlyMap<string, string>;
8
+ vendorRegistry: DevTransformVendorRegistry;
9
+ };
10
+ /**
11
+ * Transpiles one dev client module at a time to browser ESM with rewritten imports.
12
+ */
13
+ export declare class DevTransformBundler {
14
+ private readonly appConfig;
15
+ private readonly browserBundleService;
16
+ private readonly getRuntimeSpecifierMap;
17
+ private readonly vendorRegistry;
18
+ private readonly contributors;
19
+ constructor(options: DevTransformBundlerOptions);
20
+ addContributor(contributor: DevTransformBundleContributor): void;
21
+ private selectContributor;
22
+ private resolveTempOutdir;
23
+ transpileModule(sourcePath: string): Promise<DevTransformBundleResult>;
24
+ }
@@ -0,0 +1,79 @@
1
+ import { createHash } from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { fileSystem } from '@ecopages/file-system';
4
+ import { BrowserBundleService } from '../../services/assets/browser-bundle.service.js';
5
+ import { createDevTransformExternalizeImportsPlugin } from './dev-transform-externalize-plugin.js';
6
+ import { rewriteModuleImports } from './dev-transform-import-rewriter.js';
7
+ /**
8
+ * Transpiles one dev client module at a time to browser ESM with rewritten imports.
9
+ */
10
+ export class DevTransformBundler {
11
+ appConfig;
12
+ browserBundleService;
13
+ getRuntimeSpecifierMap;
14
+ vendorRegistry;
15
+ contributors = [];
16
+ constructor(options) {
17
+ this.appConfig = options.appConfig;
18
+ this.browserBundleService = new BrowserBundleService(options.appConfig);
19
+ this.getRuntimeSpecifierMap = options.getRuntimeSpecifierMap;
20
+ this.vendorRegistry = options.vendorRegistry;
21
+ this.contributors.push(...(options.contributors ?? []));
22
+ }
23
+ addContributor(contributor) {
24
+ this.contributors.push(contributor);
25
+ }
26
+ selectContributor(sourcePath) {
27
+ return this.contributors.find((contributor) => contributor.ownsModule(sourcePath));
28
+ }
29
+ resolveTempOutdir() {
30
+ const distDir = this.appConfig.absolutePaths?.distDir ?? path.join(this.appConfig.rootDir, '.eco', 'assets');
31
+ return path.join(distDir, '.dev-transform');
32
+ }
33
+ async transpileModule(sourcePath) {
34
+ const normalized = path.resolve(sourcePath);
35
+ const contributor = this.selectContributor(normalized);
36
+ const pagePlugins = contributor ? await contributor.getModulePlugins(normalized) : [];
37
+ const tempDir = this.resolveTempOutdir();
38
+ fileSystem.ensureDir(tempDir);
39
+ /**
40
+ * @remarks
41
+ * Entry key is a path hash so concurrent transpiles of different modules that
42
+ * share a basename (e.g. multiple `index.tsx`) never collide on disk output.
43
+ */
44
+ const entryKey = createHash('sha256').update(normalized).digest('hex').slice(0, 16);
45
+ const result = await this.browserBundleService.bundle({
46
+ profile: 'hmr-entrypoint',
47
+ entrypoints: { [entryKey]: normalized },
48
+ outdir: tempDir,
49
+ naming: '[name].js',
50
+ plugins: [createDevTransformExternalizeImportsPlugin(), ...pagePlugins],
51
+ minify: false,
52
+ });
53
+ if (!result.success) {
54
+ const details = result.logs.map((log) => log.message).join('\n');
55
+ throw new Error(details
56
+ ? `[dev-transform] Transpile failed for ${normalized}:\n${details}`
57
+ : `[dev-transform] Transpile failed for ${normalized}`);
58
+ }
59
+ const outputPath = result.entryOutputs?.[normalized] ??
60
+ result.outputs.find((output) => path.basename(output.path) === `${entryKey}.js`)?.path ??
61
+ result.outputs[0]?.path;
62
+ if (!outputPath) {
63
+ throw new Error(`[dev-transform] No transpile output for ${normalized}`);
64
+ }
65
+ const transpiledCode = fileSystem.readFileSync(outputPath);
66
+ const rewritten = await rewriteModuleImports({
67
+ code: transpiledCode,
68
+ sourcePath: normalized,
69
+ srcDir: this.appConfig.absolutePaths.srcDir,
70
+ projectRoot: this.appConfig.rootDir,
71
+ runtimeSpecifierMap: this.getRuntimeSpecifierMap(),
72
+ resolveVendorUrl: (specifier) => this.vendorRegistry.resolveVendorUrl(specifier),
73
+ });
74
+ return {
75
+ code: rewritten.code,
76
+ dependencies: rewritten.dependencies,
77
+ };
78
+ }
79
+ }
@@ -0,0 +1,12 @@
1
+ import type { EcoBuildPlugin } from '../../build/contracts/build-types.js';
2
+ /**
3
+ * Marks dependency imports as external so Rolldown transpiles only the entry module.
4
+ *
5
+ * @remarks
6
+ * The Rolldown plugin bridge splits specifiers such as `ecopages:images` into
7
+ * `namespace` + `path` before `onResolve`. Returning `external: true` for those
8
+ * would emit a bare `from "images"` import and skip virtual-module `onLoad`.
9
+ * Namespaced imports are left for app plugins (image map, etc.) to inline into
10
+ * this single-file transpile.
11
+ */
12
+ export declare function createDevTransformExternalizeImportsPlugin(): EcoBuildPlugin;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Marks dependency imports as external so Rolldown transpiles only the entry module.
3
+ *
4
+ * @remarks
5
+ * The Rolldown plugin bridge splits specifiers such as `ecopages:images` into
6
+ * `namespace` + `path` before `onResolve`. Returning `external: true` for those
7
+ * would emit a bare `from "images"` import and skip virtual-module `onLoad`.
8
+ * Namespaced imports are left for app plugins (image map, etc.) to inline into
9
+ * this single-file transpile.
10
+ */
11
+ export function createDevTransformExternalizeImportsPlugin() {
12
+ return {
13
+ name: 'ecopages-dev-transform-externalize-imports',
14
+ setup(build) {
15
+ build.onResolve({ filter: /.*/u }, (args) => {
16
+ if (!args.importer) {
17
+ return undefined;
18
+ }
19
+ if (args.namespace) {
20
+ return undefined;
21
+ }
22
+ return {
23
+ path: args.path,
24
+ external: true,
25
+ };
26
+ });
27
+ },
28
+ };
29
+ }
@@ -0,0 +1,16 @@
1
+ type RewriteModuleImportsOptions = {
2
+ code: string;
3
+ sourcePath: string;
4
+ srcDir: string;
5
+ projectRoot: string;
6
+ runtimeSpecifierMap: ReadonlyMap<string, string>;
7
+ resolveVendorUrl: (specifier: string) => Promise<string>;
8
+ };
9
+ /**
10
+ * Rewrites static and dynamic import specifiers to dev-transform or vendor URLs.
11
+ */
12
+ export declare function rewriteModuleImports(options: RewriteModuleImportsOptions): Promise<{
13
+ code: string;
14
+ dependencies: string[];
15
+ }>;
16
+ export {};