@ecopages/core 0.2.0-beta.30 → 0.2.0-beta.32

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 (338) hide show
  1. package/README.md +1 -0
  2. package/package.json +82 -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/client/link-intent.js +55 -39
  249. package/src/router/client/link-intent.test.browser.js +49 -49
  250. package/src/router/client/link-navigation-policy.js +114 -93
  251. package/src/router/client/link-navigation-policy.test.browser.js +70 -80
  252. package/src/router/client/navigation-coordinator.js +235 -211
  253. package/src/router/server/route-registry.js +237 -242
  254. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
  255. package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
  256. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  257. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  258. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  259. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
  260. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
  261. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
  262. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
  263. package/src/services/assets/asset-processing-service/index.js +8 -8
  264. package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
  265. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
  266. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  267. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  268. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  269. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  270. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
  271. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  272. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
  273. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
  274. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  275. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
  276. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
  277. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
  278. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
  279. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
  280. package/src/services/assets/browser-bundle.service.js +52 -47
  281. package/src/services/cache/cache.types.js +5 -0
  282. package/src/services/cache/index.js +6 -7
  283. package/src/services/cache/memory-cache-store.js +101 -89
  284. package/src/services/cache/page-cache-service.js +156 -145
  285. package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
  286. package/src/services/html/html-rewriter-provider.service.js +61 -61
  287. package/src/services/html/html-transformer.service.js +249 -266
  288. package/src/services/invalidation/development-invalidation.service.js +252 -241
  289. package/src/services/module-loading/app-module-loader.service.js +1 -0
  290. package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
  291. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  292. package/src/services/module-loading/module-loading-types.js +1 -0
  293. package/src/services/module-loading/page-module-import.service.js +235 -243
  294. package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
  295. package/src/services/module-loading/route-module-build-cache.js +3 -38
  296. package/src/services/module-loading/route-module-build-cache.store.js +195 -200
  297. package/src/services/module-loading/route-module-build-manifest.js +61 -74
  298. package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
  299. package/src/services/module-loading/server-module-transpiler.service.js +68 -62
  300. package/src/services/module-loading/source-module-support.js +15 -7
  301. package/src/services/runtime-state/dev-graph.service.js +165 -157
  302. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  303. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  304. package/src/services/validation/schema-validation-service.js +157 -95
  305. package/src/services/validation/standard-schema.types.js +1 -0
  306. package/src/services/validation/validate-standard-schema.js +13 -13
  307. package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
  308. package/src/static-site-generator/sitemap-routes.js +33 -28
  309. package/src/static-site-generator/sitemap.js +38 -29
  310. package/src/static-site-generator/static-build-invalidation.js +34 -56
  311. package/src/static-site-generator/static-export-context.js +1 -0
  312. package/src/static-site-generator/static-site-generator.js +517 -553
  313. package/src/types/internal-types.d.ts +19 -3
  314. package/src/types/internal-types.js +1 -0
  315. package/src/types/public-types.d.ts +16 -46
  316. package/src/types/public-types.js +1 -0
  317. package/src/utils/deep-merge.js +39 -26
  318. package/src/utils/ecopages-route-info.js +27 -23
  319. package/src/utils/hash.js +3 -6
  320. package/src/utils/html-escaping.js +21 -8
  321. package/src/utils/html.js +1 -4
  322. package/src/utils/invariant.js +11 -10
  323. package/src/utils/locals-utils.js +32 -22
  324. package/src/utils/parse-cli-args.js +73 -65
  325. package/src/utils/path-pattern.js +38 -23
  326. package/src/utils/path-utils.module.js +8 -11
  327. package/src/utils/resolve-entry-file.js +70 -38
  328. package/src/utils/resolve-work-dir.js +23 -27
  329. package/src/utils/runtime.js +24 -33
  330. package/src/utils/server-utils.module.js +60 -52
  331. package/src/utils/static-file-extensions.js +52 -46
  332. package/src/watchers/project-watcher-ignore.js +16 -15
  333. package/src/watchers/project-watcher.js +385 -366
  334. package/src/watchers/project-watcher.test-helpers.js +45 -50
  335. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
  336. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
  337. package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
  338. package/src/build/cache/dev-browser-script-cache.js +0 -90
@@ -1,82 +1,79 @@
1
- import { RESOLVED_ASSETS_DIR, RESOLVED_ASSETS_VENDORS_DIR } from "../../../config/constants.js";
2
- import { deepMerge } from "../../../utils/deep-merge.js";
3
- class AssetFactory {
4
- static RESOLVED_ASSETS_DIR = RESOLVED_ASSETS_DIR;
5
- static RESOLVED_ASSETS_VENDORS_DIR = RESOLVED_ASSETS_VENDORS_DIR;
6
- static createContentScript(options) {
7
- return {
8
- kind: "script",
9
- source: "content",
10
- position: options.position || "body",
11
- ...options
12
- };
13
- }
14
- static createInlineContentScript(options) {
15
- return {
16
- ...AssetFactory.createContentScript(options),
17
- inline: true
18
- };
19
- }
20
- static createFileScript(options) {
21
- return {
22
- kind: "script",
23
- source: "file",
24
- position: options.position || "body",
25
- ...options
26
- };
27
- }
28
- static createInlineFileScript(options) {
29
- return {
30
- ...AssetFactory.createFileScript(options),
31
- inline: true
32
- };
33
- }
34
- static createNodeModuleScript(options) {
35
- return {
36
- kind: "script",
37
- source: "node-module",
38
- position: options.position || "body",
39
- ...options
40
- };
41
- }
42
- static createInlineNodeModuleScript(options) {
43
- return {
44
- ...AssetFactory.createNodeModuleScript(options),
45
- inline: true
46
- };
47
- }
48
- static createJsonScript(options) {
49
- return {
50
- kind: "script",
51
- source: "content",
52
- attributes: deepMerge(options.attributes, { type: "application/json" }),
53
- position: options.position || "body",
54
- ...options
55
- };
56
- }
57
- static createContentStylesheet(options) {
58
- return {
59
- kind: "stylesheet",
60
- source: "content",
61
- position: "head",
62
- ...options
63
- };
64
- }
65
- static createInlineContentStylesheet(options) {
66
- return {
67
- ...AssetFactory.createContentStylesheet(options),
68
- inline: true
69
- };
70
- }
71
- static createFileStylesheet(options) {
72
- return {
73
- kind: "stylesheet",
74
- source: "file",
75
- position: options.position || "head",
76
- ...options
77
- };
78
- }
1
+ import { RESOLVED_ASSETS_DIR, RESOLVED_ASSETS_VENDORS_DIR } from '../../../config/constants.js';
2
+ import { deepMerge } from '../../../utils/deep-merge.js';
3
+ export class AssetFactory {
4
+ static RESOLVED_ASSETS_DIR = RESOLVED_ASSETS_DIR;
5
+ static RESOLVED_ASSETS_VENDORS_DIR = RESOLVED_ASSETS_VENDORS_DIR;
6
+ static createContentScript(options) {
7
+ return {
8
+ kind: 'script',
9
+ source: 'content',
10
+ position: options.position || 'body',
11
+ ...options,
12
+ };
13
+ }
14
+ static createInlineContentScript(options) {
15
+ return {
16
+ ...AssetFactory.createContentScript(options),
17
+ inline: true,
18
+ };
19
+ }
20
+ static createFileScript(options) {
21
+ return {
22
+ kind: 'script',
23
+ source: 'file',
24
+ position: options.position || 'body',
25
+ ...options,
26
+ };
27
+ }
28
+ static createInlineFileScript(options) {
29
+ return {
30
+ ...AssetFactory.createFileScript(options),
31
+ inline: true,
32
+ };
33
+ }
34
+ static createNodeModuleScript(options) {
35
+ return {
36
+ kind: 'script',
37
+ source: 'node-module',
38
+ position: options.position || 'body',
39
+ ...options,
40
+ };
41
+ }
42
+ static createInlineNodeModuleScript(options) {
43
+ return {
44
+ ...AssetFactory.createNodeModuleScript(options),
45
+ inline: true,
46
+ };
47
+ }
48
+ static createJsonScript(options) {
49
+ return {
50
+ kind: 'script',
51
+ source: 'content',
52
+ attributes: deepMerge(options.attributes, { type: 'application/json' }),
53
+ position: options.position || 'body',
54
+ ...options,
55
+ };
56
+ }
57
+ static createContentStylesheet(options) {
58
+ return {
59
+ kind: 'stylesheet',
60
+ source: 'content',
61
+ position: 'head',
62
+ ...options,
63
+ };
64
+ }
65
+ static createInlineContentStylesheet(options) {
66
+ return {
67
+ ...AssetFactory.createContentStylesheet(options),
68
+ inline: true,
69
+ };
70
+ }
71
+ static createFileStylesheet(options) {
72
+ return {
73
+ kind: 'stylesheet',
74
+ source: 'file',
75
+ position: options.position || 'head',
76
+ ...options,
77
+ };
78
+ }
79
79
  }
80
- export {
81
- AssetFactory
82
- };
@@ -1,50 +1,61 @@
1
- import { AssetFactory } from "./asset.factory.js";
2
- import {
3
- createBrowserRuntimeEntryModule
4
- } from "./browser-runtime-entry.factory.js";
5
- const BROWSER_RUNTIME_SCRIPT_ATTRIBUTES = {
6
- type: "module",
7
- defer: ""
1
+ import { AssetFactory } from './asset.factory.js';
2
+ import { createBrowserRuntimeEntryModule, } from './browser-runtime-entry.factory.js';
3
+ export const BROWSER_RUNTIME_SCRIPT_ATTRIBUTES = {
4
+ type: 'module',
5
+ defer: '',
8
6
  };
9
- function buildBrowserRuntimeAssetUrl(fileName) {
10
- return `/${AssetFactory.RESOLVED_ASSETS_VENDORS_DIR}/${fileName}`;
7
+ /**
8
+ * Builds the public vendor URL used for generated browser runtime assets.
9
+ */
10
+ export function buildBrowserRuntimeAssetUrl(fileName) {
11
+ return `/${AssetFactory.RESOLVED_ASSETS_VENDORS_DIR}/${fileName}`;
11
12
  }
12
- function createBrowserRuntimeScriptAsset(options) {
13
- return AssetFactory.createNodeModuleScript({
14
- position: "head",
15
- importPath: options.importPath,
16
- name: options.name,
17
- packageRole: "runtime",
18
- excludeFromHtml: true,
19
- bundleOptions: {
20
- naming: options.fileName,
21
- ...options.bundleOptions
22
- },
23
- attributes: {
24
- ...BROWSER_RUNTIME_SCRIPT_ATTRIBUTES,
25
- ...options.attributes ?? {}
26
- }
27
- });
13
+ /**
14
+ * Declares a browser runtime script asset backed by one importable module.
15
+ *
16
+ * @remarks
17
+ * Runtime assets are emitted as excluded head scripts because integrations often
18
+ * need the bundler output and specifier registration without injecting the raw
19
+ * asset directly into HTML during dependency resolution.
20
+ */
21
+ export function createBrowserRuntimeScriptAsset(options) {
22
+ return AssetFactory.createNodeModuleScript({
23
+ position: 'head',
24
+ importPath: options.importPath,
25
+ name: options.name,
26
+ packageRole: 'runtime',
27
+ excludeFromHtml: true,
28
+ bundleOptions: {
29
+ naming: options.fileName,
30
+ ...options.bundleOptions,
31
+ },
32
+ attributes: {
33
+ ...BROWSER_RUNTIME_SCRIPT_ATTRIBUTES,
34
+ ...(options.attributes ?? {}),
35
+ },
36
+ });
28
37
  }
29
- function createBrowserRuntimeModuleAsset(options) {
30
- const importPath = createBrowserRuntimeEntryModule({
31
- modules: options.modules,
32
- fileName: `${options.name}-entry.mjs`,
33
- rootDir: options.rootDir,
34
- workDir: options.workDir,
35
- cacheDirName: options.cacheDirName
36
- });
37
- return createBrowserRuntimeScriptAsset({
38
- importPath,
39
- name: options.name,
40
- fileName: options.fileName,
41
- bundleOptions: options.bundleOptions,
42
- attributes: options.attributes
43
- });
38
+ /**
39
+ * Creates a browser runtime asset from a generated re-export entry module.
40
+ *
41
+ * @remarks
42
+ * This is the shared "module list -> generated entry file -> runtime asset"
43
+ * path used by integrations that need browser-side runtime bundles without
44
+ * owning bespoke entry-file generation logic.
45
+ */
46
+ export function createBrowserRuntimeModuleAsset(options) {
47
+ const importPath = createBrowserRuntimeEntryModule({
48
+ modules: options.modules,
49
+ fileName: `${options.name}-entry.mjs`,
50
+ rootDir: options.rootDir,
51
+ workDir: options.workDir,
52
+ cacheDirName: options.cacheDirName,
53
+ });
54
+ return createBrowserRuntimeScriptAsset({
55
+ importPath,
56
+ name: options.name,
57
+ fileName: options.fileName,
58
+ bundleOptions: options.bundleOptions,
59
+ attributes: options.attributes,
60
+ });
44
61
  }
45
- export {
46
- BROWSER_RUNTIME_SCRIPT_ATTRIBUTES,
47
- buildBrowserRuntimeAssetUrl,
48
- createBrowserRuntimeModuleAsset,
49
- createBrowserRuntimeScriptAsset
50
- };
@@ -1,78 +1,115 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { pathToFileURL, fileURLToPath } from "node:url";
4
- import { isBarePackageImportSpecifier } from "../../../plugins/tsconfig-import-resolver.js";
5
- function resolvePackageEsmEntryPath(specifier, rootDir) {
6
- try {
7
- return fileURLToPath(import.meta.resolve(specifier, pathToFileURL(path.join(rootDir, "package.json")).href));
8
- } catch {
9
- return void 0;
10
- }
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { pathToFileURL, fileURLToPath } from 'node:url';
4
+ import { isBarePackageImportSpecifier } from '../../../plugins/tsconfig-import-resolver.js';
5
+ /**
6
+ * Resolves a package specifier to its ESM entry file path from the app root.
7
+ */
8
+ export function resolvePackageEsmEntryPath(specifier, rootDir) {
9
+ try {
10
+ return fileURLToPath(import.meta.resolve(specifier, pathToFileURL(path.join(rootDir, 'package.json')).href));
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
11
15
  }
12
- function toRelativeEntryImport(entryDir, resolvedPath) {
13
- let relativePath = path.relative(entryDir, resolvedPath).replace(/\\/g, "/");
14
- if (!relativePath.startsWith(".")) {
15
- relativePath = `./${relativePath}`;
16
- }
17
- return relativePath;
16
+ /**
17
+ * Builds a relative import path from a generated runtime entry file to a resolved module path.
18
+ */
19
+ export function toRelativeEntryImport(entryDir, resolvedPath) {
20
+ let relativePath = path.relative(entryDir, resolvedPath).replace(/\\/g, '/');
21
+ if (!relativePath.startsWith('.')) {
22
+ relativePath = `./${relativePath}`;
23
+ }
24
+ return relativePath;
18
25
  }
19
- function resolveBrowserRuntimeEntryImport(options) {
20
- const { specifier, requireFromRoot, entryDir, rootDir } = options;
21
- if (specifier.startsWith("node:") || specifier.startsWith("file:")) {
22
- return specifier;
23
- }
24
- if (specifier.startsWith(".")) {
25
- const resolvedPath2 = requireFromRoot.resolve(specifier);
26
- return toRelativeEntryImport(entryDir, resolvedPath2);
27
- }
28
- if (isBarePackageImportSpecifier(specifier, rootDir)) {
29
- const esmResolvedPath = resolvePackageEsmEntryPath(specifier, rootDir);
30
- if (esmResolvedPath) {
31
- return toRelativeEntryImport(entryDir, esmResolvedPath);
26
+ /**
27
+ * Resolves a browser runtime entry import to an ESM file path when possible.
28
+ *
29
+ * @remarks
30
+ * `createRequire().resolve()` follows the `require` export condition and can
31
+ * land on `.cjs` entrypoints. Browser vendor bundles then emit runtime
32
+ * `require()` calls for React externals. Prefer Node's ESM resolver first, then
33
+ * a `.cjs` → `.js` sibling fallback.
34
+ */
35
+ export function resolveBrowserRuntimeEntryImport(options) {
36
+ const { specifier, requireFromRoot, entryDir, rootDir } = options;
37
+ if (specifier.startsWith('node:') || specifier.startsWith('file:')) {
38
+ return specifier;
39
+ }
40
+ if (specifier.startsWith('.')) {
41
+ const resolvedPath = requireFromRoot.resolve(specifier);
42
+ return toRelativeEntryImport(entryDir, resolvedPath);
32
43
  }
33
- }
34
- const resolvedPath = requireFromRoot.resolve(specifier);
35
- const esmSibling = resolvedPath.endsWith(".cjs") ? `${resolvedPath.slice(0, -4)}.js` : resolvedPath.endsWith(".cts") ? `${resolvedPath.slice(0, -4)}.ts` : void 0;
36
- if (esmSibling && fs.existsSync(esmSibling)) {
37
- return toRelativeEntryImport(entryDir, esmSibling);
38
- }
39
- return toRelativeEntryImport(entryDir, resolvedPath);
44
+ if (isBarePackageImportSpecifier(specifier, rootDir)) {
45
+ const esmResolvedPath = resolvePackageEsmEntryPath(specifier, rootDir);
46
+ if (esmResolvedPath) {
47
+ return toRelativeEntryImport(entryDir, esmResolvedPath);
48
+ }
49
+ }
50
+ const resolvedPath = requireFromRoot.resolve(specifier);
51
+ const esmSibling = resolvedPath.endsWith('.cjs')
52
+ ? `${resolvedPath.slice(0, -4)}.js`
53
+ : resolvedPath.endsWith('.cts')
54
+ ? `${resolvedPath.slice(0, -4)}.ts`
55
+ : undefined;
56
+ if (esmSibling && fs.existsSync(esmSibling)) {
57
+ return toRelativeEntryImport(entryDir, esmSibling);
58
+ }
59
+ return toRelativeEntryImport(entryDir, resolvedPath);
40
60
  }
41
- function inferBrowserRuntimeDefaultExportPolicy(options) {
42
- const { specifier, requireFromRoot, rootDir } = options;
43
- const esmPath = resolvePackageEsmEntryPath(specifier, rootDir);
44
- if (esmPath && fs.existsSync(esmPath)) {
45
- const source = fs.readFileSync(esmPath, "utf8");
46
- if (/\bexport\s+default\b/.test(source)) {
47
- return "emit-default";
61
+ /**
62
+ * Decides whether a generated runtime entry should re-export a default binding.
63
+ *
64
+ * @remarks
65
+ * ESM-only packages such as `@tanstack/react-query` expose named exports only.
66
+ * Legacy CJS packages such as `react` assign `module.exports` directly and have
67
+ * no `.default` under `require()`, but still need a default re-export for
68
+ * `import React from 'react'` in browser bundles.
69
+ *
70
+ * ESM source inspection is a best-effort fast path; when it is inconclusive the
71
+ * policy falls back to the shape returned by `require()`.
72
+ */
73
+ export function inferBrowserRuntimeDefaultExportPolicy(options) {
74
+ const { specifier, requireFromRoot, rootDir } = options;
75
+ const esmPath = resolvePackageEsmEntryPath(specifier, rootDir);
76
+ if (esmPath && fs.existsSync(esmPath)) {
77
+ const source = fs.readFileSync(esmPath, 'utf8');
78
+ if (/\bexport\s+default\b/.test(source)) {
79
+ return 'emit-default';
80
+ }
81
+ if (/\bexport\s+(?:[\w*{]|const|let|var|function|class)/.test(source)) {
82
+ return 'skip-default';
83
+ }
48
84
  }
49
- if (/\bexport\s+(?:[\w*{]|const|let|var|function|class)/.test(source)) {
50
- return "skip-default";
85
+ try {
86
+ const moduleExports = requireFromRoot(specifier);
87
+ if (moduleExports.default !== undefined) {
88
+ return 'emit-default';
89
+ }
90
+ return moduleExports.__esModule === true ? 'skip-default' : 'emit-default';
51
91
  }
52
- }
53
- try {
54
- const moduleExports = requireFromRoot(specifier);
55
- if (moduleExports.default !== void 0) {
56
- return "emit-default";
92
+ catch {
93
+ return 'skip-default';
57
94
  }
58
- return moduleExports.__esModule === true ? "skip-default" : "emit-default";
59
- } catch {
60
- return "skip-default";
61
- }
62
95
  }
63
- function listBrowserRuntimeModuleExportNames(specifier, requireFromRoot) {
64
- let moduleExports;
65
- try {
66
- moduleExports = requireFromRoot(specifier);
67
- } catch {
68
- return [];
69
- }
70
- return Object.keys(moduleExports).filter((name) => name !== "__esModule" && name !== "default").filter((name) => /^[$A-Z_a-z][$\w]*$/.test(name)).sort();
96
+ /**
97
+ * Reads the named runtime exports that should be re-exported from a generated runtime entry module.
98
+ *
99
+ * @remarks
100
+ * Default exports are handled separately because generated runtime entry files need to emit a
101
+ * synthetic default binding only when the caller explicitly asks for it.
102
+ */
103
+ export function listBrowserRuntimeModuleExportNames(specifier, requireFromRoot) {
104
+ let moduleExports;
105
+ try {
106
+ moduleExports = requireFromRoot(specifier);
107
+ }
108
+ catch {
109
+ return [];
110
+ }
111
+ return Object.keys(moduleExports)
112
+ .filter((name) => name !== '__esModule' && name !== 'default')
113
+ .filter((name) => /^[$A-Z_a-z][$\w]*$/.test(name))
114
+ .sort();
71
115
  }
72
- export {
73
- inferBrowserRuntimeDefaultExportPolicy,
74
- listBrowserRuntimeModuleExportNames,
75
- resolveBrowserRuntimeEntryImport,
76
- resolvePackageEsmEntryPath,
77
- toRelativeEntryImport
78
- };
@@ -1,56 +1,56 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { createRequire } from "node:module";
4
- import { DEFAULT_ECOPAGES_WORK_DIR } from "../../../config/constants.js";
5
- import {
6
- inferBrowserRuntimeDefaultExportPolicy,
7
- listBrowserRuntimeModuleExportNames,
8
- resolveBrowserRuntimeEntryImport
9
- } from "./browser-runtime-entry-resolution.js";
10
- function createBrowserRuntimeEntryModule(options) {
11
- if (options.modules.some((module) => !module.specifier.startsWith("node:")) && !options.rootDir) {
12
- throw new Error("createBrowserRuntimeEntryModule requires rootDir to resolve package specifiers");
13
- }
14
- const rootDir = options.rootDir ?? process.cwd();
15
- const workDir = options.workDir ?? path.join(rootDir, DEFAULT_ECOPAGES_WORK_DIR);
16
- const artifactsDir = path.join(
17
- workDir,
18
- ".browser-runtime-entries",
19
- options.cacheDirName ?? "ecopages-browser-runtime"
20
- );
21
- fs.mkdirSync(artifactsDir, { recursive: true });
22
- const requireFromRoot = createRequire(path.join(rootDir, "package.json"));
23
- const seenExports = /* @__PURE__ */ new Set();
24
- const statements = [];
25
- const filePath = path.join(artifactsDir, options.fileName);
26
- const entryDir = path.dirname(filePath);
27
- for (const module of options.modules) {
28
- const importSpecifier = resolveBrowserRuntimeEntryImport({
29
- specifier: module.specifier,
30
- requireFromRoot,
31
- entryDir,
32
- rootDir
33
- });
34
- if (module.defaultExport && inferBrowserRuntimeDefaultExportPolicy({ specifier: module.specifier, requireFromRoot, rootDir }) === "emit-default") {
35
- statements.push(`import __ecopages_default_export__ from '${importSpecifier}';`);
36
- statements.push("export default __ecopages_default_export__;");
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createRequire } from 'node:module';
4
+ import { DEFAULT_ECOPAGES_WORK_DIR } from '../../../config/constants.js';
5
+ import { inferBrowserRuntimeDefaultExportPolicy, listBrowserRuntimeModuleExportNames, resolveBrowserRuntimeEntryImport, } from './browser-runtime-entry-resolution.js';
6
+ /**
7
+ * Creates a generated ESM entry module that re-exports runtime modules through
8
+ * one stable file.
9
+ *
10
+ * @remarks
11
+ * Integrations use this helper when they need a browser runtime asset composed
12
+ * from multiple bare specifiers but do not want to own temporary file assembly
13
+ * logic themselves. The generated file lives under the app work directory so
14
+ * repeated runs can reuse the same location without placing sources inside
15
+ * `node_modules`, which can cause bundlers to externalize bare imports.
16
+ */
17
+ export function createBrowserRuntimeEntryModule(options) {
18
+ if (options.modules.some((module) => !module.specifier.startsWith('node:')) && !options.rootDir) {
19
+ throw new Error('createBrowserRuntimeEntryModule requires rootDir to resolve package specifiers');
37
20
  }
38
- const exportNames = listBrowserRuntimeModuleExportNames(module.specifier, requireFromRoot).filter(
39
- (name) => !seenExports.has(name)
40
- );
41
- if (exportNames.length > 0) {
42
- statements.push(`export { ${exportNames.join(", ")} } from '${importSpecifier}';`);
43
- for (const exportName of exportNames) {
44
- seenExports.add(exportName);
45
- }
21
+ const rootDir = options.rootDir ?? process.cwd();
22
+ const workDir = options.workDir ?? path.join(rootDir, DEFAULT_ECOPAGES_WORK_DIR);
23
+ const artifactsDir = path.join(workDir, '.browser-runtime-entries', options.cacheDirName ?? 'ecopages-browser-runtime');
24
+ fs.mkdirSync(artifactsDir, { recursive: true });
25
+ const requireFromRoot = createRequire(path.join(rootDir, 'package.json'));
26
+ const seenExports = new Set();
27
+ const statements = [];
28
+ const filePath = path.join(artifactsDir, options.fileName);
29
+ const entryDir = path.dirname(filePath);
30
+ for (const module of options.modules) {
31
+ const importSpecifier = resolveBrowserRuntimeEntryImport({
32
+ specifier: module.specifier,
33
+ requireFromRoot,
34
+ entryDir,
35
+ rootDir,
36
+ });
37
+ if (module.defaultExport &&
38
+ inferBrowserRuntimeDefaultExportPolicy({ specifier: module.specifier, requireFromRoot, rootDir }) ===
39
+ 'emit-default') {
40
+ statements.push(`import __ecopages_default_export__ from '${importSpecifier}';`);
41
+ statements.push('export default __ecopages_default_export__;');
42
+ }
43
+ const exportNames = listBrowserRuntimeModuleExportNames(module.specifier, requireFromRoot).filter((name) => !seenExports.has(name));
44
+ if (exportNames.length > 0) {
45
+ statements.push(`export { ${exportNames.join(', ')} } from '${importSpecifier}';`);
46
+ for (const exportName of exportNames) {
47
+ seenExports.add(exportName);
48
+ }
49
+ }
46
50
  }
47
- }
48
- const content = statements.join("\n");
49
- if (!fs.existsSync(filePath) || fs.readFileSync(filePath, "utf-8") !== content) {
50
- fs.writeFileSync(filePath, content, "utf-8");
51
- }
52
- return filePath;
51
+ const content = statements.join('\n');
52
+ if (!fs.existsSync(filePath) || fs.readFileSync(filePath, 'utf-8') !== content) {
53
+ fs.writeFileSync(filePath, content, 'utf-8');
54
+ }
55
+ return filePath;
53
56
  }
54
- export {
55
- createBrowserRuntimeEntryModule
56
- };
@@ -1,7 +1,5 @@
1
- function finalizeProcessedAsset(processed, resolveProcessedAssetSrcUrl) {
2
- const srcUrl = resolveProcessedAssetSrcUrl(processed);
3
- return srcUrl ? { ...processed, srcUrl } : processed;
1
+ /** Applies the public source URL to one processed asset when available. */
2
+ export function finalizeProcessedAsset(processed, resolveProcessedAssetSrcUrl) {
3
+ const srcUrl = resolveProcessedAssetSrcUrl(processed);
4
+ return srcUrl ? { ...processed, srcUrl } : processed;
4
5
  }
5
- export {
6
- finalizeProcessedAsset
7
- };