@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,142 +1,279 @@
1
- import {
2
- } from "./contracts/build-contracts.js";
3
- import {
4
- createAppBuildManifest,
5
- getBrowserBuildPlugins,
6
- getServerBuildPlugins
7
- } from "./contracts/build-manifest.js";
8
- import { getAppSourceTransforms } from "../plugins/source-transform.js";
9
- import { createAliasResolverPlugin } from "../plugins/alias-resolver-plugin.js";
10
- import { getJsxOwnershipPlugins } from "./browser/jsx-ownership-plugins.js";
11
- import { createRolldownBuildAdapter } from "./rolldown/rolldown-build-adapter.js";
1
+ /**
2
+ * Build pipeline contracts and app-owned adapter wiring.
3
+ *
4
+ * @remarks
5
+ * The build layer exposes three concentric shapes:
6
+ *
7
+ * - `BuildAdapter` — the low-level backend contract. Two implementations
8
+ * exist: a bundler-backed adapter (the real backend) and
9
+ * {@link ViteHostBuildAdapter} (a host-owned boundary marker that throws
10
+ * on direct use, for host runtimes that own their own build pipeline).
11
+ * - `BuildExecutor` the runtime-facing facade stored on
12
+ * `appConfig.runtime.buildRuntime` via profile-based accessors.
13
+ * - App-owned helpers (`getAppBuildAdapter` and the `set*` counterparts) —
14
+ * the supported way for runtime code to read and mutate the active adapter
15
+ * per `EcoPagesAppConfig`. Profile executors live on
16
+ * `appConfig.runtime.buildRuntime`.
17
+ */
18
+ import {} from './contracts/build-contracts.js';
19
+ import { createAppBuildManifest, getBrowserBuildPlugins, getServerBuildPlugins, } from './contracts/build-manifest.js';
20
+ import { getAppSourceTransforms } from '../plugins/source-transform.js';
21
+ import { createAliasResolverPlugin } from '../plugins/alias-resolver-plugin.js';
22
+ import { getJsxOwnershipPlugins } from './browser/jsx-ownership-plugins.js';
23
+ import { createRolldownBuildAdapter } from './rolldown/rolldown-build-adapter.js';
24
+ /**
25
+ * @remarks
26
+ * All runtime-bag setters funnel through here so `appConfig.runtime` is patched
27
+ * in one place instead of repeating the spread-merge at every call site.
28
+ */
12
29
  function patchAppRuntime(appConfig, patch) {
13
- appConfig.runtime = {
14
- ...appConfig.runtime ?? {},
15
- ...patch
16
- };
30
+ appConfig.runtime = {
31
+ ...(appConfig.runtime ?? {}),
32
+ ...patch,
33
+ };
17
34
  }
18
35
  function createHostOwnedBuildError(methodName) {
19
- return new Error(
20
- `Vite-hosted builds are owned by the host runtime. Core cannot ${methodName} through the host-owned compatibility adapter.`
21
- );
22
- }
23
- class ViteHostBuildAdapter {
24
- ownership = "vite-host";
25
- async build(_options) {
26
- throw createHostOwnedBuildError("build");
27
- }
28
- resolve(_importPath, _rootDir) {
29
- throw createHostOwnedBuildError("resolve imports");
30
- }
31
- getTranspileOptions(_profile) {
32
- throw createHostOwnedBuildError("derive transpile options");
33
- }
34
- }
35
- function createViteHostBuildAdapter() {
36
- return new ViteHostBuildAdapter();
37
- }
38
- function createBuildAdapter(options) {
39
- switch (options?.ownership ?? "rolldown") {
40
- case "vite-host":
41
- return createViteHostBuildAdapter();
42
- case "rolldown":
43
- default:
44
- return createRolldownBuildAdapter();
45
- }
46
- }
47
- const defaultRolldownBuildAdapter = createBuildAdapter({ ownership: "rolldown" });
48
- const defaultViteHostBuildAdapter = createBuildAdapter({ ownership: "vite-host" });
49
- const defaultBuildAdapter = defaultRolldownBuildAdapter;
50
- function getDefaultBuildAdapter(ownership = "rolldown") {
51
- return ownership === "vite-host" ? defaultViteHostBuildAdapter : defaultRolldownBuildAdapter;
52
- }
53
- function getBuildAdapterOwnership(buildAdapter) {
54
- return buildAdapter?.ownership ?? "rolldown";
55
- }
56
- function getAppBuildOwnership(appConfig) {
57
- return appConfig.runtime?.buildOwnership ?? getBuildAdapterOwnership(appConfig.runtime?.buildAdapter);
58
- }
59
- function setAppBuildOwnership(appConfig, buildOwnership) {
60
- patchAppRuntime(appConfig, { buildOwnership });
61
- }
62
- function getAppBuildAdapter(appConfig) {
63
- return appConfig.runtime?.buildAdapter ?? getDefaultBuildAdapter(getAppBuildOwnership(appConfig));
64
- }
65
- function setAppBuildAdapter(appConfig, buildAdapter) {
66
- patchAppRuntime(appConfig, {
67
- buildOwnership: getBuildAdapterOwnership(buildAdapter),
68
- buildAdapter
69
- });
70
- }
71
- function getAppBuildManifest(appConfig) {
72
- return appConfig.runtime?.buildManifest ?? createAppBuildManifest({
73
- loaderPlugins: Array.from(appConfig.loaders?.values() ?? [])
74
- });
75
- }
76
- function setAppBuildManifest(appConfig, buildManifest) {
77
- patchAppRuntime(appConfig, { buildManifest });
78
- }
79
- function createConfiguredAppBuildManifest(appConfig, input) {
80
- return createAppBuildManifest({
81
- loaderPlugins: input?.loaderPlugins ?? Array.from(appConfig.loaders.values()),
82
- runtimePlugins: input?.runtimePlugins,
83
- browserBundlePlugins: input?.browserBundlePlugins,
84
- browserRuntimeManifest: input?.browserRuntimeManifest
85
- });
86
- }
87
- function updateAppBuildManifest(appConfig, input) {
88
- setAppBuildManifest(appConfig, createConfiguredAppBuildManifest(appConfig, input));
89
- }
90
- import {
91
- collectConfiguredAppBuildManifestContributions,
92
- ensureIntegrationRuntimeReady,
93
- setupAppRuntimePlugins
94
- } from "./app-build-manifest-runtime.js";
95
- function getAppServerBuildPlugins(appConfig) {
96
- const projectDir = appConfig.absolutePaths?.projectDir;
97
- const aliasPlugin = projectDir ? [createAliasResolverPlugin(projectDir)] : [];
98
- return [...aliasPlugin, ...getServerBuildPlugins(getAppBuildManifest(appConfig))];
99
- }
100
- function getAppBrowserBuildPlugins(appConfig) {
101
- const manifest = getAppBuildManifest(appConfig);
102
- const sourceTransformNames = new Set(getAppSourceTransforms(appConfig).map((transform) => transform.name));
103
- const browserPlugins = getBrowserBuildPlugins(manifest).filter((plugin) => !sourceTransformNames.has(plugin.name));
104
- const projectDir = appConfig.absolutePaths?.projectDir;
105
- const aliasPlugin = projectDir ? [createAliasResolverPlugin(projectDir)] : [];
106
- return [...aliasPlugin, ...browserPlugins, ...getJsxOwnershipPlugins(appConfig)];
107
- }
108
- function build(options, executor = defaultRolldownBuildAdapter) {
109
- return executor.build(options);
110
- }
111
- function getTranspileOptions(profile) {
112
- return defaultRolldownBuildAdapter.getTranspileOptions(profile);
113
- }
114
- function getAppTranspileOptions(appConfig, profile) {
115
- return getAppBuildAdapter(appConfig).getTranspileOptions(profile);
116
- }
117
- export {
118
- ViteHostBuildAdapter,
119
- build,
120
- collectConfiguredAppBuildManifestContributions,
121
- createBuildAdapter,
122
- createConfiguredAppBuildManifest,
123
- createViteHostBuildAdapter,
124
- defaultBuildAdapter,
125
- defaultRolldownBuildAdapter,
126
- defaultViteHostBuildAdapter,
127
- ensureIntegrationRuntimeReady,
128
- getAppBrowserBuildPlugins,
129
- getAppBuildAdapter,
130
- getAppBuildManifest,
131
- getAppBuildOwnership,
132
- getAppServerBuildPlugins,
133
- getAppTranspileOptions,
134
- getBuildAdapterOwnership,
135
- getDefaultBuildAdapter,
136
- getTranspileOptions,
137
- setAppBuildAdapter,
138
- setAppBuildManifest,
139
- setAppBuildOwnership,
140
- setupAppRuntimePlugins,
141
- updateAppBuildManifest
142
- };
36
+ return new Error(`Vite-hosted builds are owned by the host runtime. Core cannot ${methodName} through the host-owned compatibility adapter.`);
37
+ }
38
+ /**
39
+ * Boundary-marker adapter for Vite-host ownership.
40
+ *
41
+ * @remarks
42
+ * This is not a real backend. It exists so `appConfig.runtime.buildAdapter`
43
+ * can carry the `'vite-host'` ownership without falling back to a
44
+ * framework-owned bundler path. Every method throws a
45
+ * {@link createHostOwnedBuildError} so misrouted calls fail loudly
46
+ * with a clear message instead of silently executing under a
47
+ * different backend.
48
+ *
49
+ * The class stays in the public surface for host runtimes that own
50
+ * their build pipeline (e.g. Nitro) and for app code that wants to
51
+ * opt into host-owned ownership before its host wires up the build.
52
+ */
53
+ export class ViteHostBuildAdapter {
54
+ ownership = 'vite-host';
55
+ async build(_options) {
56
+ throw createHostOwnedBuildError('build');
57
+ }
58
+ resolve(_importPath, _rootDir) {
59
+ throw createHostOwnedBuildError('resolve imports');
60
+ }
61
+ getTranspileOptions(_profile) {
62
+ throw createHostOwnedBuildError('derive transpile options');
63
+ }
64
+ }
65
+ /**
66
+ * Constructs a {@link ViteHostBuildAdapter}. Use only in code paths
67
+ * that explicitly opt into the host-owned boundary.
68
+ */
69
+ export function createViteHostBuildAdapter() {
70
+ return new ViteHostBuildAdapter();
71
+ }
72
+ /**
73
+ * Constructs a build adapter for the given ownership.
74
+ *
75
+ * @param options - When `options.ownership` is omitted, the default is
76
+ * `'rolldown'`. The Vite-host path is opt-in.
77
+ */
78
+ export function createBuildAdapter(options) {
79
+ switch (options?.ownership ?? 'rolldown') {
80
+ case 'vite-host':
81
+ return createViteHostBuildAdapter();
82
+ case 'rolldown':
83
+ default:
84
+ return createRolldownBuildAdapter();
85
+ }
86
+ }
87
+ /** The shared default-bundler backend instance. Use {@link getAppBuildAdapter} in app-aware code. */
88
+ export const defaultRolldownBuildAdapter = createBuildAdapter({ ownership: 'rolldown' });
89
+ /** The shared Vite-host boundary instance. Use {@link getAppBuildAdapter} in app-aware code. */
90
+ export const defaultViteHostBuildAdapter = createBuildAdapter({ ownership: 'vite-host' });
91
+ /**
92
+ * Global default build adapter.
93
+ *
94
+ * @remarks
95
+ * Resolves to the bundled default-bundler adapter. New app-aware
96
+ * code should prefer {@link getAppBuildAdapter}.
97
+ */
98
+ export const defaultBuildAdapter = defaultRolldownBuildAdapter;
99
+ /**
100
+ * Resolves the default build adapter for an ownership value.
101
+ *
102
+ * @param ownership - Defaults to `'rolldown'`. Returns the
103
+ * {@link ViteHostBuildAdapter} only when the caller explicitly asks
104
+ * for `'vite-host'`.
105
+ */
106
+ export function getDefaultBuildAdapter(ownership = 'rolldown') {
107
+ return ownership === 'vite-host' ? defaultViteHostBuildAdapter : defaultRolldownBuildAdapter;
108
+ }
109
+ /**
110
+ * Reads the {@link BuildOwnership} declared on a {@link BuildAdapter}.
111
+ *
112
+ * @param buildAdapter - When `undefined`, defaults to `'rolldown'`.
113
+ */
114
+ export function getBuildAdapterOwnership(buildAdapter) {
115
+ return buildAdapter?.ownership ?? 'rolldown';
116
+ }
117
+ /**
118
+ * Resolves the build ownership of an app config.
119
+ *
120
+ * @remarks
121
+ * Resolution order: `appConfig.runtime.buildOwnership` (explicit), then
122
+ * the ownership declared on `appConfig.runtime.buildAdapter`, then the
123
+ * default `'rolldown'`.
124
+ */
125
+ export function getAppBuildOwnership(appConfig) {
126
+ return appConfig.runtime?.buildOwnership ?? getBuildAdapterOwnership(appConfig.runtime?.buildAdapter);
127
+ }
128
+ /**
129
+ * Sets the explicit build ownership on an app config.
130
+ *
131
+ * @remarks
132
+ * The `ConfigBuilder` uses this when the caller calls
133
+ * `setBuildOwnership`. App code that needs a different ownership
134
+ * should call this directly with a new value; passing the same
135
+ * value is a no-op.
136
+ */
137
+ export function setAppBuildOwnership(appConfig, buildOwnership) {
138
+ patchAppRuntime(appConfig, { buildOwnership });
139
+ }
140
+ /**
141
+ * Returns the adapter owned by an app/runtime instance.
142
+ *
143
+ * @remarks
144
+ * Falls back through `appConfig.runtime.buildAdapter` →
145
+ * {@link getDefaultBuildAdapter} on the resolved ownership. Throws
146
+ * never; a missing adapter resolves to the global default.
147
+ */
148
+ export function getAppBuildAdapter(appConfig) {
149
+ return appConfig.runtime?.buildAdapter ?? getDefaultBuildAdapter(getAppBuildOwnership(appConfig));
150
+ }
151
+ /**
152
+ * Installs the adapter that should serve future builds for one app
153
+ * instance, and aligns the ownership field to the new adapter's
154
+ * declared ownership.
155
+ */
156
+ export function setAppBuildAdapter(appConfig, buildAdapter) {
157
+ patchAppRuntime(appConfig, {
158
+ buildOwnership: getBuildAdapterOwnership(buildAdapter),
159
+ buildAdapter,
160
+ });
161
+ }
162
+ /**
163
+ * Returns the build manifest owned by an app/runtime instance.
164
+ *
165
+ * @remarks
166
+ * Falls back to a fresh manifest seeded from the config's loaders when
167
+ * the app config has no manifest yet. This is the supported way to
168
+ * read the manifest across the source-loading and asset-processing
169
+ * services.
170
+ */
171
+ export function getAppBuildManifest(appConfig) {
172
+ return (appConfig.runtime?.buildManifest ??
173
+ createAppBuildManifest({
174
+ loaderPlugins: Array.from(appConfig.loaders?.values() ?? []),
175
+ }));
176
+ }
177
+ /** Installs the build manifest that should be visible to one app instance.
178
+ *
179
+ * @remarks
180
+ * Production apps are sealed via {@link updateAppBuildManifest} during
181
+ * {@link ConfigBuilder.build}. Call `setAppBuildManifest` directly only in tests or
182
+ * when replacing the entire manifest object; partial updates should use
183
+ * {@link updateAppBuildManifest}.
184
+ */
185
+ export function setAppBuildManifest(appConfig, buildManifest) {
186
+ patchAppRuntime(appConfig, { buildManifest });
187
+ }
188
+ /**
189
+ * Builds a fresh app manifest from the config's loaders plus optional
190
+ * caller-supplied runtime/browser contributions.
191
+ *
192
+ * @remarks
193
+ * Loader plugins are always taken from the config; runtime and
194
+ * browser-bundle plugins are passed through from the caller when
195
+ * supplied, otherwise left empty for later population by
196
+ * {@link collectConfiguredAppBuildManifestContributions}.
197
+ */
198
+ export function createConfiguredAppBuildManifest(appConfig, input) {
199
+ return createAppBuildManifest({
200
+ loaderPlugins: input?.loaderPlugins ?? Array.from(appConfig.loaders.values()),
201
+ runtimePlugins: input?.runtimePlugins,
202
+ browserBundlePlugins: input?.browserBundlePlugins,
203
+ browserRuntimeManifest: input?.browserRuntimeManifest,
204
+ });
205
+ }
206
+ /**
207
+ * Replaces the app-owned manifest using config-owned loaders and the
208
+ * caller-supplied contribution input.
209
+ *
210
+ * @remarks
211
+ * Primary production entry: `ConfigBuilder.build()` passes the return value of
212
+ * {@link collectConfiguredAppBuildManifestContributions} here to seal
213
+ * `appConfig.runtime.buildManifest` before startup.
214
+ */
215
+ export function updateAppBuildManifest(appConfig, input) {
216
+ setAppBuildManifest(appConfig, createConfiguredAppBuildManifest(appConfig, input));
217
+ }
218
+ export { collectConfiguredAppBuildManifestContributions, ensureIntegrationRuntimeReady, setupAppRuntimePlugins, } from './app-build-manifest-runtime.js';
219
+ /**
220
+ * Returns the server-bundle plugin list for one app/runtime instance.
221
+ *
222
+ * @remarks
223
+ * Reads from the app's sealed build manifest; the manifest itself is
224
+ * the source of truth for which plugins participate in the server
225
+ * bundle.
226
+ */
227
+ export function getAppServerBuildPlugins(appConfig) {
228
+ const projectDir = appConfig.absolutePaths?.projectDir;
229
+ const aliasPlugin = projectDir ? [createAliasResolverPlugin(projectDir)] : [];
230
+ return [...aliasPlugin, ...getServerBuildPlugins(getAppBuildManifest(appConfig))];
231
+ }
232
+ /**
233
+ * Returns the browser-bundle plugin list for one app/runtime instance.
234
+ *
235
+ * @remarks
236
+ * Reads from the app's sealed build manifest. The browser-bundle
237
+ * manifest is the source of truth for which plugins participate in the
238
+ * browser bundle.
239
+ *
240
+ * Plugins whose `name` matches a registered {@link EcoSourceTransform} are
241
+ * excluded here because browser builds run those transforms via the Rolldown
242
+ * bridge post-load pass instead of as competing `onLoad` handlers.
243
+ */
244
+ export function getAppBrowserBuildPlugins(appConfig) {
245
+ const manifest = getAppBuildManifest(appConfig);
246
+ const sourceTransformNames = new Set(getAppSourceTransforms(appConfig).map((transform) => transform.name));
247
+ const browserPlugins = getBrowserBuildPlugins(manifest).filter((plugin) => !sourceTransformNames.has(plugin.name));
248
+ const projectDir = appConfig.absolutePaths?.projectDir;
249
+ const aliasPlugin = projectDir ? [createAliasResolverPlugin(projectDir)] : [];
250
+ return [...aliasPlugin, ...browserPlugins, ...getJsxOwnershipPlugins(appConfig)];
251
+ }
252
+ /**
253
+ * Runs a build through the active pipeline.
254
+ *
255
+ * @remarks
256
+ * `executor` defaults to the default-bundler adapter for non-app-aware
257
+ * callsites. App-aware code should pass a profile executor from
258
+ * {@link requireBuildRuntime} to honor the per-app pipeline.
259
+ */
260
+ export function build(options, executor = defaultRolldownBuildAdapter) {
261
+ return executor.build(options);
262
+ }
263
+ /**
264
+ * Default transpile-options helper for callsites without app runtime
265
+ * context.
266
+ *
267
+ * @remarks
268
+ * New app-aware code should prefer {@link getAppTranspileOptions}.
269
+ */
270
+ export function getTranspileOptions(profile) {
271
+ return defaultRolldownBuildAdapter.getTranspileOptions(profile);
272
+ }
273
+ /**
274
+ * Resolves transpile options for one app/runtime instance by asking
275
+ * the app's adapter.
276
+ */
277
+ export function getAppTranspileOptions(appConfig, profile) {
278
+ return getAppBuildAdapter(appConfig).getTranspileOptions(profile);
279
+ }
@@ -1,31 +1,33 @@
1
- import { fileSystem } from "@ecopages/file-system";
2
- function didBuildInputContributorChange(contributor) {
3
- return contributor.didChange?.() === true;
1
+ import { fileSystem } from '@ecopages/file-system';
2
+ /** Returns whether a processor or integration signals changed build inputs. */
3
+ export function didBuildInputContributorChange(contributor) {
4
+ return contributor.didChange?.() === true;
4
5
  }
5
- function hashAppConfigFile(appConfig) {
6
- const configPath = appConfig.absolutePaths?.config;
7
- if (!configPath || !fileSystem.exists(configPath)) {
8
- return "missing";
9
- }
10
- return fileSystem.hash(configPath);
6
+ /** Hashes the app's eco.config.ts file when present. */
7
+ export function hashAppConfigFile(appConfig) {
8
+ const configPath = appConfig.absolutePaths?.config;
9
+ if (!configPath || !fileSystem.exists(configPath)) {
10
+ return 'missing';
11
+ }
12
+ return fileSystem.hash(configPath);
11
13
  }
12
- function createBuildInputsFingerprint(appConfig) {
13
- const changedContributors = [
14
- ...Array.from(appConfig.processors?.values() ?? []).filter((processor) => didBuildInputContributorChange(processor)).map((processor) => `processor:${processor.getName()}`),
15
- ...(appConfig.integrations ?? []).filter((integration) => didBuildInputContributorChange(integration)).map((integration) => `integration:${integration.name}`)
16
- ];
17
- return changedContributors.length > 0 ? changedContributors.sort().join("|") : "stable";
14
+ /** Fingerprints processor/integration build-input state for cache invalidation. */
15
+ export function createBuildInputsFingerprint(appConfig) {
16
+ const changedContributors = [
17
+ ...Array.from(appConfig.processors?.values() ?? [])
18
+ .filter((processor) => didBuildInputContributorChange(processor))
19
+ .map((processor) => `processor:${processor.getName()}`),
20
+ ...(appConfig.integrations ?? [])
21
+ .filter((integration) => didBuildInputContributorChange(integration))
22
+ .map((integration) => `integration:${integration.name}`),
23
+ ];
24
+ return changedContributors.length > 0 ? changedContributors.sort().join('|') : 'stable';
18
25
  }
19
- function haveBuildInputsChanged(appConfig) {
20
- return createBuildInputsFingerprint(appConfig) !== "stable";
26
+ /** Returns true when any processor or integration reports changed build inputs. */
27
+ export function haveBuildInputsChanged(appConfig) {
28
+ return createBuildInputsFingerprint(appConfig) !== 'stable';
21
29
  }
22
- function collectBuildInputContributors(appConfig) {
23
- return [...Array.from(appConfig.processors?.values() ?? []), ...appConfig.integrations ?? []];
30
+ /** Collects every processor and integration that can invalidate incremental builds. */
31
+ export function collectBuildInputContributors(appConfig) {
32
+ return [...Array.from(appConfig.processors?.values() ?? []), ...(appConfig.integrations ?? [])];
24
33
  }
25
- export {
26
- collectBuildInputContributors,
27
- createBuildInputsFingerprint,
28
- didBuildInputContributorChange,
29
- hashAppConfigFile,
30
- haveBuildInputsChanged
31
- };
@@ -1,6 +1,4 @@
1
- const ROUTE_MODULE_BUILD_CACHE_FILENAME = ".build-cache.json";
2
- const SERVER_ENTRY_BUILD_CACHE_FILENAME = ROUTE_MODULE_BUILD_CACHE_FILENAME;
3
- export {
4
- ROUTE_MODULE_BUILD_CACHE_FILENAME,
5
- SERVER_ENTRY_BUILD_CACHE_FILENAME
6
- };
1
+ /** Filename written beside persisted production build artifacts that store incremental metadata. */
2
+ export const ROUTE_MODULE_BUILD_CACHE_FILENAME = '.build-cache.json';
3
+ /** @deprecated Use {@link ROUTE_MODULE_BUILD_CACHE_FILENAME}; server-entry caches share the same filename. */
4
+ export const SERVER_ENTRY_BUILD_CACHE_FILENAME = ROUTE_MODULE_BUILD_CACHE_FILENAME;
@@ -1,63 +1,71 @@
1
- import { readFileSync } from "node:fs";
1
+ import { readFileSync } from 'node:fs';
2
2
  let cachedCorePackageVersion;
3
- function getCorePackageVersion() {
4
- if (cachedCorePackageVersion) {
3
+ /**
4
+ * Returns the installed `@ecopages/core` package version for cache invalidation.
5
+ */
6
+ export function getCorePackageVersion() {
7
+ if (cachedCorePackageVersion) {
8
+ return cachedCorePackageVersion;
9
+ }
10
+ const packageJsonPath = new URL('../../../package.json', import.meta.url);
11
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
12
+ cachedCorePackageVersion = packageJson.version ?? '0.0.0';
5
13
  return cachedCorePackageVersion;
6
- }
7
- const packageJsonPath = new URL("../../../package.json", import.meta.url);
8
- const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
9
- cachedCorePackageVersion = packageJson.version ?? "0.0.0";
10
- return cachedCorePackageVersion;
11
14
  }
12
- function createJsxCacheKey(jsx) {
13
- if (!jsx) {
14
- return "jsx:default";
15
- }
16
- return JSON.stringify({
17
- development: jsx.development ?? false,
18
- factory: jsx.factory ?? null,
19
- fragment: jsx.fragment ?? null,
20
- importSource: jsx.importSource ?? null,
21
- runtime: jsx.runtime ?? null,
22
- sideEffects: jsx.sideEffects ?? null
23
- });
15
+ /** Stable fingerprint for JSX options used in build and disk cache keys. */
16
+ export function createJsxCacheKey(jsx) {
17
+ if (!jsx) {
18
+ return 'jsx:default';
19
+ }
20
+ return JSON.stringify({
21
+ development: jsx.development ?? false,
22
+ factory: jsx.factory ?? null,
23
+ fragment: jsx.fragment ?? null,
24
+ importSource: jsx.importSource ?? null,
25
+ runtime: jsx.runtime ?? null,
26
+ sideEffects: jsx.sideEffects ?? null,
27
+ });
24
28
  }
25
- function createPluginCacheKey(plugins) {
26
- if (!plugins || plugins.length === 0) {
27
- return "plugins:default";
28
- }
29
- return `plugins:${plugins.map((plugin) => `${plugin.name}:${hashFunctionIdentity(plugin.setup)}`).join(",")}`;
29
+ /** Stable fingerprint for ordered build plugins. */
30
+ export function createPluginCacheKey(plugins) {
31
+ if (!plugins || plugins.length === 0) {
32
+ return 'plugins:default';
33
+ }
34
+ return `plugins:${plugins.map((plugin) => `${plugin.name}:${hashFunctionIdentity(plugin.setup)}`).join(',')}`;
30
35
  }
31
- function createSourceTransformCacheKey(sourceTransforms) {
32
- if (!sourceTransforms || sourceTransforms.length === 0) {
33
- return "sourceTransforms:default";
34
- }
35
- return `sourceTransforms:${sourceTransforms.map((transform) => {
36
- const filterSource = transform.filter.source;
37
- const filterFlags = transform.filter.flags;
38
- return [
39
- transform.name,
40
- transform.enforce ?? "default",
41
- filterSource,
42
- filterFlags,
43
- hashFunctionIdentity(transform.transform)
44
- ].join(":");
45
- }).join(",")}`;
36
+ /** Stable fingerprint for ordered source transforms. */
37
+ export function createSourceTransformCacheKey(sourceTransforms) {
38
+ if (!sourceTransforms || sourceTransforms.length === 0) {
39
+ return 'sourceTransforms:default';
40
+ }
41
+ return `sourceTransforms:${sourceTransforms
42
+ .map((transform) => {
43
+ const filterSource = transform.filter.source;
44
+ const filterFlags = transform.filter.flags;
45
+ return [
46
+ transform.name,
47
+ transform.enforce ?? 'default',
48
+ filterSource,
49
+ filterFlags,
50
+ hashFunctionIdentity(transform.transform),
51
+ ].join(':');
52
+ })
53
+ .join(',')}`;
46
54
  }
47
- function hashFunctionIdentity(fn) {
48
- let hash = 0;
49
- const source = fn.toString();
50
- for (let index = 0; index < source.length; index += 1) {
51
- hash = hash * 31 + source.charCodeAt(index) | 0;
52
- }
53
- return (hash >>> 0).toString(36);
55
+ /**
56
+ * Stable fingerprint of a function body for cache and request identity keys.
57
+ *
58
+ * @remarks
59
+ * Hashes `fn.toString()`. Suitable for in-process and persisted keys that must
60
+ * agree within one install; not stable across minifiers or renames.
61
+ */
62
+ export function hashFunctionIdentity(fn) {
63
+ let hash = 0;
64
+ const source = fn.toString();
65
+ for (let index = 0; index < source.length; index += 1) {
66
+ hash = (hash * 31 + source.charCodeAt(index)) | 0;
67
+ }
68
+ return (hash >>> 0).toString(36);
54
69
  }
55
- const hashPluginSetup = hashFunctionIdentity;
56
- export {
57
- createJsxCacheKey,
58
- createPluginCacheKey,
59
- createSourceTransformCacheKey,
60
- getCorePackageVersion,
61
- hashFunctionIdentity,
62
- hashPluginSetup
63
- };
70
+ /** @deprecated Use {@link hashFunctionIdentity}. */
71
+ export const hashPluginSetup = hashFunctionIdentity;