@ecopages/core 0.2.0-beta.31 → 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,173 +1,219 @@
1
- import path from "node:path";
2
- import { existsSync, readFileSync } from "node:fs";
3
- import { cachedParseSync } from "../../cache/module-parse-cache.js";
4
- import { getBrowserRuntimeSpecifierMap } from "./browser-runtime-manifest.js";
5
- import { buildSpecifierFilter } from "./browser-runtime-plugin-helpers.js";
6
- const BROWSER_RUNTIME_IMPORT_REWRITE_MAP = /* @__PURE__ */ Symbol.for("ecopages.browserRuntimeImportRewriteMap");
7
- const DEFAULT_BROWSER_RUNTIME_PLUGIN_NAME = "browser-runtime-plugin";
1
+ /**
2
+ * Unified browser-runtime plugin factory.
3
+ *
4
+ * @remarks
5
+ * Single factory that exposes the union of behaviors for the browser
6
+ * runtime:
7
+ *
8
+ * - `onResolve` for manifest specifiers → mapped public URL, marked external
9
+ * - `onResolve` for paths starting with `/` whose target is in the manifest's
10
+ * public path set → marked external
11
+ * - `onLoad` for JS/TS files → AST-walking import/export rewrite against the
12
+ * manifest specifier set, with a `code.includes(specifier)` fast path
13
+ *
14
+ * The plugin object carries the manifest's `specifier → publicPath` map
15
+ * under `BROWSER_RUNTIME_IMPORT_REWRITE_MAP` so
16
+ * `collectBrowserRuntimeImportRewriteMap` and the post-build rewriter can
17
+ * read it without re-walking the manifest.
18
+ *
19
+ * This is the single source of truth for browser-runtime plugin behavior.
20
+ * Per-bundler bridges can treat it as a single plugin.
21
+ */
22
+ import path from 'node:path';
23
+ import { existsSync, readFileSync } from 'node:fs';
24
+ import { cachedParseSync } from '../../cache/module-parse-cache.js';
25
+ import { getBrowserRuntimeSpecifierMap } from './browser-runtime-manifest.js';
26
+ import { buildSpecifierFilter } from './browser-runtime-plugin-helpers.js';
27
+ /**
28
+ * Symbol used to attach the manifest's `specifier → publicPath` map to a
29
+ * plugin instance. Consumers read it via `getBrowserRuntimeImportRewriteMap`
30
+ * or `collectBrowserRuntimeImportRewriteMap`.
31
+ */
32
+ export const BROWSER_RUNTIME_IMPORT_REWRITE_MAP = Symbol.for('ecopages.browserRuntimeImportRewriteMap');
33
+ /**
34
+ * Default name used by `createBrowserRuntimePlugin` when the caller
35
+ * does not provide one.
36
+ */
37
+ export const DEFAULT_BROWSER_RUNTIME_PLUGIN_NAME = 'browser-runtime-plugin';
8
38
  function isRecord(value) {
9
- return Boolean(value) && typeof value === "object";
39
+ return Boolean(value) && typeof value === 'object';
10
40
  }
11
41
  function inferLoaderFromPath(filePath) {
12
- const extension = path.extname(filePath).toLowerCase();
13
- switch (extension) {
14
- case ".mts":
15
- case ".cts":
16
- case ".ts":
17
- return "ts";
18
- case ".tsx":
19
- return "tsx";
20
- case ".jsx":
21
- return "jsx";
22
- default:
23
- return "js";
24
- }
42
+ const extension = path.extname(filePath).toLowerCase();
43
+ switch (extension) {
44
+ case '.mts':
45
+ case '.cts':
46
+ case '.ts':
47
+ return 'ts';
48
+ case '.tsx':
49
+ return 'tsx';
50
+ case '.jsx':
51
+ return 'jsx';
52
+ default:
53
+ return 'js';
54
+ }
25
55
  }
26
56
  function queueReplacement(options) {
27
- if (!isRecord(options.source) || typeof options.source.value !== "string") {
28
- return;
29
- }
30
- const mappedPath = options.specifierMap.get(options.source.value);
31
- if (!mappedPath || typeof options.source.start !== "number" || typeof options.source.end !== "number") {
32
- return;
33
- }
34
- const quote = options.code[options.source.start] === "'" ? "'" : '"';
35
- options.edits.push({
36
- start: options.source.start,
37
- end: options.source.end,
38
- replacement: `${quote}${mappedPath}${quote}`
39
- });
40
- }
41
- function rewriteBrowserRuntimeImports(code, specifierMap, filePath = "browser-runtime-imports.js") {
42
- if (specifierMap.size === 0) {
43
- return code;
44
- }
45
- const edits = [];
46
- try {
47
- const result = cachedParseSync(filePath, code, {
48
- sourceType: "module",
49
- lang: path.extname(filePath).endsWith("x") ? "tsx" : "ts"
50
- });
51
- const walk = (node) => {
52
- if (!isRecord(node)) {
57
+ if (!isRecord(options.source) || typeof options.source.value !== 'string') {
53
58
  return;
54
- }
55
- if (node.type === "ImportDeclaration" || node.type === "ExportNamedDeclaration" || node.type === "ExportAllDeclaration") {
56
- queueReplacement({ code, source: node.source, specifierMap, edits });
57
- }
58
- if (node.type === "ImportExpression" && isRecord(node.source)) {
59
- if (node.source.type === "StringLiteral" || node.source.type === "Literal") {
60
- queueReplacement({ code, source: node.source, specifierMap, edits });
61
- }
62
- }
63
- for (const value of Object.values(node)) {
64
- if (Array.isArray(value)) {
65
- for (const child of value) {
66
- walk(child);
67
- }
68
- } else {
69
- walk(value);
70
- }
71
- }
72
- };
73
- walk(result.program);
74
- } catch {
75
- return code;
76
- }
77
- if (edits.length === 0) {
78
- return code;
79
- }
80
- edits.sort((left, right) => right.start - left.start);
81
- let rewritten = code;
82
- for (const edit of edits) {
83
- rewritten = rewritten.slice(0, edit.start) + edit.replacement + rewritten.slice(edit.end);
84
- }
85
- return rewritten;
86
- }
87
- function getBrowserRuntimeImportRewriteMap(plugin) {
88
- return plugin[BROWSER_RUNTIME_IMPORT_REWRITE_MAP];
59
+ }
60
+ const mappedPath = options.specifierMap.get(options.source.value);
61
+ if (!mappedPath || typeof options.source.start !== 'number' || typeof options.source.end !== 'number') {
62
+ return;
63
+ }
64
+ const quote = options.code[options.source.start] === "'" ? "'" : '"';
65
+ options.edits.push({
66
+ start: options.source.start,
67
+ end: options.source.end,
68
+ replacement: `${quote}${mappedPath}${quote}`,
69
+ });
89
70
  }
90
- function collectBrowserRuntimeImportRewriteMap(plugins) {
91
- const merged = /* @__PURE__ */ new Map();
92
- for (const plugin of plugins ?? []) {
93
- const specifierMap = getBrowserRuntimeImportRewriteMap(plugin);
94
- if (!specifierMap) {
95
- continue;
71
+ /**
72
+ * Rewrites static ESM import/export specifiers and string-literal dynamic imports
73
+ * from manifest-owned runtime specifiers to concrete browser public URLs.
74
+ *
75
+ * Exposed for the post-build rewriter and for tests.
76
+ */
77
+ export function rewriteBrowserRuntimeImports(code, specifierMap, filePath = 'browser-runtime-imports.js') {
78
+ if (specifierMap.size === 0) {
79
+ return code;
80
+ }
81
+ const edits = [];
82
+ try {
83
+ const result = cachedParseSync(filePath, code, {
84
+ sourceType: 'module',
85
+ lang: path.extname(filePath).endsWith('x') ? 'tsx' : 'ts',
86
+ });
87
+ const walk = (node) => {
88
+ if (!isRecord(node)) {
89
+ return;
90
+ }
91
+ if (node.type === 'ImportDeclaration' ||
92
+ node.type === 'ExportNamedDeclaration' ||
93
+ node.type === 'ExportAllDeclaration') {
94
+ queueReplacement({ code, source: node.source, specifierMap, edits });
95
+ }
96
+ if (node.type === 'ImportExpression' && isRecord(node.source)) {
97
+ if (node.source.type === 'StringLiteral' || node.source.type === 'Literal') {
98
+ queueReplacement({ code, source: node.source, specifierMap, edits });
99
+ }
100
+ }
101
+ for (const value of Object.values(node)) {
102
+ if (Array.isArray(value)) {
103
+ for (const child of value) {
104
+ walk(child);
105
+ }
106
+ }
107
+ else {
108
+ walk(value);
109
+ }
110
+ }
111
+ };
112
+ walk(result.program);
113
+ }
114
+ catch {
115
+ return code;
96
116
  }
97
- for (const [specifier, publicPath] of specifierMap.entries()) {
98
- if (!merged.has(specifier)) {
99
- merged.set(specifier, publicPath);
100
- }
117
+ if (edits.length === 0) {
118
+ return code;
101
119
  }
102
- }
103
- return merged;
120
+ edits.sort((left, right) => right.start - left.start);
121
+ let rewritten = code;
122
+ for (const edit of edits) {
123
+ rewritten = rewritten.slice(0, edit.start) + edit.replacement + rewritten.slice(edit.end);
124
+ }
125
+ return rewritten;
126
+ }
127
+ export function getBrowserRuntimeImportRewriteMap(plugin) {
128
+ return plugin[BROWSER_RUNTIME_IMPORT_REWRITE_MAP];
104
129
  }
105
- function createBrowserRuntimePlugin(options) {
106
- const { manifest } = options;
107
- const specifierMap = getBrowserRuntimeSpecifierMap(manifest);
108
- const specifierFilter = buildSpecifierFilter(specifierMap);
109
- if (!specifierFilter) {
110
- return null;
111
- }
112
- const external = options.external ?? true;
113
- const rewriteImports = options.rewriteImports ?? true;
114
- const matchPublicPaths = options.matchPublicPaths ?? true;
115
- const publicPathSet = new Set(specifierMap.values());
116
- const specifierKeys = Array.from(specifierMap.keys());
117
- const plugin = {
118
- name: options.name ?? DEFAULT_BROWSER_RUNTIME_PLUGIN_NAME,
119
- setup(build) {
120
- build.onResolve({ filter: specifierFilter }, (args) => {
121
- const mappedPath = specifierMap.get(args.path);
122
- if (!mappedPath) {
123
- return void 0;
130
+ export function collectBrowserRuntimeImportRewriteMap(plugins) {
131
+ const merged = new Map();
132
+ for (const plugin of plugins ?? []) {
133
+ const specifierMap = getBrowserRuntimeImportRewriteMap(plugin);
134
+ if (!specifierMap) {
135
+ continue;
136
+ }
137
+ for (const [specifier, publicPath] of specifierMap.entries()) {
138
+ if (!merged.has(specifier)) {
139
+ merged.set(specifier, publicPath);
140
+ }
124
141
  }
125
- return {
126
- path: mappedPath,
127
- external
128
- };
129
- });
130
- if (matchPublicPaths) {
131
- build.onResolve({ filter: /^\// }, (args) => {
132
- if (!publicPathSet.has(args.path)) {
133
- return void 0;
134
- }
135
- return {
136
- path: args.path,
137
- external: true
138
- };
139
- });
140
- }
141
- if (rewriteImports) {
142
- build.onLoad({ filter: /\.[cm]?[jt]sx?$/ }, (args) => {
143
- if (!path.isAbsolute(args.path) || !existsSync(args.path)) {
144
- return void 0;
145
- }
146
- const code = readFileSync(args.path, "utf-8");
147
- if (!specifierKeys.some((specifier) => code.includes(specifier))) {
148
- return void 0;
149
- }
150
- const rewritten = rewriteBrowserRuntimeImports(code, specifierMap, args.path);
151
- if (rewritten === code) {
152
- return void 0;
153
- }
154
- return {
155
- contents: rewritten,
156
- loader: inferLoaderFromPath(args.path),
157
- resolveDir: path.dirname(args.path)
158
- };
159
- });
160
- }
161
142
  }
162
- };
163
- plugin[BROWSER_RUNTIME_IMPORT_REWRITE_MAP] = specifierMap;
164
- return plugin;
143
+ return merged;
144
+ }
145
+ /**
146
+ * Creates a build plugin that exposes the union of browser-runtime
147
+ * manifest behaviors (alias resolution, public-path matching, and source
148
+ * import/export rewrite). See {@link CreateBrowserRuntimePluginOptions}
149
+ * for per-behavior toggles.
150
+ *
151
+ * Returns `null` for an empty manifest so callers can short-circuit
152
+ * registration without sprinkling `if (plugin)` everywhere.
153
+ */
154
+ export function createBrowserRuntimePlugin(options) {
155
+ const { manifest } = options;
156
+ const specifierMap = getBrowserRuntimeSpecifierMap(manifest);
157
+ const specifierFilter = buildSpecifierFilter(specifierMap);
158
+ if (!specifierFilter) {
159
+ return null;
160
+ }
161
+ const external = options.external ?? true;
162
+ const rewriteImports = options.rewriteImports ?? true;
163
+ const matchPublicPaths = options.matchPublicPaths ?? true;
164
+ const publicPathSet = new Set(specifierMap.values());
165
+ const specifierKeys = Array.from(specifierMap.keys());
166
+ const plugin = {
167
+ name: options.name ?? DEFAULT_BROWSER_RUNTIME_PLUGIN_NAME,
168
+ setup(build) {
169
+ build.onResolve({ filter: specifierFilter }, (args) => {
170
+ const mappedPath = specifierMap.get(args.path);
171
+ if (!mappedPath) {
172
+ return undefined;
173
+ }
174
+ return {
175
+ path: mappedPath,
176
+ external,
177
+ };
178
+ });
179
+ if (matchPublicPaths) {
180
+ build.onResolve({ filter: /^\// }, (args) => {
181
+ if (!publicPathSet.has(args.path)) {
182
+ return undefined;
183
+ }
184
+ return {
185
+ path: args.path,
186
+ external: true,
187
+ };
188
+ });
189
+ }
190
+ if (rewriteImports) {
191
+ build.onLoad({ filter: /\.[cm]?[jt]sx?$/ }, (args) => {
192
+ if (!path.isAbsolute(args.path) || !existsSync(args.path)) {
193
+ return undefined;
194
+ }
195
+ const code = readFileSync(args.path, 'utf-8');
196
+ /**
197
+ * Fast-path optimization: skip AST parsing for files that don't contain
198
+ * any manifest-owned specifiers. This avoids expensive oxc-parser calls
199
+ * on every JS/TS file in the dependency graph.
200
+ */
201
+ if (!specifierKeys.some((specifier) => code.includes(specifier))) {
202
+ return undefined;
203
+ }
204
+ const rewritten = rewriteBrowserRuntimeImports(code, specifierMap, args.path);
205
+ if (rewritten === code) {
206
+ return undefined;
207
+ }
208
+ return {
209
+ contents: rewritten,
210
+ loader: inferLoaderFromPath(args.path),
211
+ resolveDir: path.dirname(args.path),
212
+ };
213
+ });
214
+ }
215
+ },
216
+ };
217
+ plugin[BROWSER_RUNTIME_IMPORT_REWRITE_MAP] = specifierMap;
218
+ return plugin;
165
219
  }
166
- export {
167
- BROWSER_RUNTIME_IMPORT_REWRITE_MAP,
168
- DEFAULT_BROWSER_RUNTIME_PLUGIN_NAME,
169
- collectBrowserRuntimeImportRewriteMap,
170
- createBrowserRuntimePlugin,
171
- getBrowserRuntimeImportRewriteMap,
172
- rewriteBrowserRuntimeImports
173
- };
@@ -1,41 +1,55 @@
1
- import { createForeignJsxOverridePlugin } from "../../plugins/foreign-jsx-override-plugin.js";
2
- import { collectJsxExtensions, filterJsxSourceExtensions } from "../../plugins/jsx-import-source.utils.js";
1
+ import { createForeignJsxOverridePlugin } from '../../plugins/foreign-jsx-override-plugin.js';
2
+ import { collectJsxExtensions, filterJsxSourceExtensions } from '../../plugins/jsx-import-source.utils.js';
3
3
  function collectJsxExtensionEntries(appConfig) {
4
- return (appConfig.integrations ?? []).filter((integration) => integration.jsxImportSource).flatMap(
5
- (integration) => filterJsxSourceExtensions(integration.extensions).map((extension) => ({ integration, extension }))
6
- ).sort((left, right) => right.extension.length - left.extension.length);
4
+ return (appConfig.integrations ?? [])
5
+ .filter((integration) => integration.jsxImportSource)
6
+ .flatMap((integration) => filterJsxSourceExtensions(integration.extensions).map((extension) => ({ integration, extension })))
7
+ .sort((left, right) => right.extension.length - left.extension.length);
7
8
  }
8
- function getJsxOwnershipPlugins(appConfig) {
9
- const jsxExtensions = collectJsxExtensionEntries(appConfig);
10
- return jsxExtensions.map(
11
- ({ integration, extension }) => createForeignJsxOverridePlugin({
12
- hostJsxImportSource: integration.jsxImportSource,
13
- foreignExtensions: [extension],
14
- excludeExtensions: jsxExtensions.filter((candidate) => candidate.extension.length > extension.length).filter((candidate) => candidate.extension.endsWith(extension)).map((candidate) => candidate.extension),
15
- name: `ecopages-jsx-ownership-${integration.name}-${extension.replace(/[^a-zA-Z0-9]+/g, "-")}`
16
- })
17
- );
9
+ /**
10
+ * Foreign JSX override plugins for mixed-integration app builds.
11
+ *
12
+ * Each plugin rewrites files for one `(integration, extension)` pair with that
13
+ * integration's own `@jsxImportSource` so the bundler preserves the owning JSX
14
+ * runtime for native extension ownership.
15
+ *
16
+ * Extensions are sorted longest-first so `.page.react.tsx` wins over `.tsx`.
17
+ */
18
+ export function getJsxOwnershipPlugins(appConfig) {
19
+ const jsxExtensions = collectJsxExtensionEntries(appConfig);
20
+ return jsxExtensions.map(({ integration, extension }) => createForeignJsxOverridePlugin({
21
+ hostJsxImportSource: integration.jsxImportSource,
22
+ foreignExtensions: [extension],
23
+ excludeExtensions: jsxExtensions
24
+ .filter((candidate) => candidate.extension.length > extension.length)
25
+ .filter((candidate) => candidate.extension.endsWith(extension))
26
+ .map((candidate) => candidate.extension),
27
+ name: `ecopages-jsx-ownership-${integration.name}-${extension.replace(/[^a-zA-Z0-9]+/g, '-')}`,
28
+ }));
18
29
  }
19
- function getHostScopedJsxOwnershipPlugins(appConfig, hostIntegrationName, options) {
20
- const hostIntegration = (appConfig.integrations ?? []).find(
21
- (integration) => integration.name === hostIntegrationName
22
- );
23
- const hostJsxImportSource = hostIntegration?.jsxImportSource;
24
- if (!hostJsxImportSource) {
25
- return [];
26
- }
27
- const foreignExtensions = collectJsxExtensions(appConfig.integrations ?? [], {
28
- excludeIntegrationName: hostIntegrationName
29
- });
30
- return [
31
- createForeignJsxOverridePlugin({
32
- name: options?.name ?? `ecopages-jsx-ownership-host-${hostIntegrationName}`,
33
- hostJsxImportSource,
34
- foreignExtensions
35
- })
36
- ];
30
+ /**
31
+ * Host-scoped JSX override plugins for one integration's client bundle graph.
32
+ *
33
+ * When a host integration (for example React) bundles foreign `.tsx` files, those
34
+ * files must compile with the host JSX runtime instead of the project default.
35
+ * Use this helper for host-owned client bundles. For app-wide transpilation that
36
+ * should preserve each integration's native JSX runtime, use
37
+ * {@link getJsxOwnershipPlugins} instead.
38
+ */
39
+ export function getHostScopedJsxOwnershipPlugins(appConfig, hostIntegrationName, options) {
40
+ const hostIntegration = (appConfig.integrations ?? []).find((integration) => integration.name === hostIntegrationName);
41
+ const hostJsxImportSource = hostIntegration?.jsxImportSource;
42
+ if (!hostJsxImportSource) {
43
+ return [];
44
+ }
45
+ const foreignExtensions = collectJsxExtensions(appConfig.integrations ?? [], {
46
+ excludeIntegrationName: hostIntegrationName,
47
+ });
48
+ return [
49
+ createForeignJsxOverridePlugin({
50
+ name: options?.name ?? `ecopages-jsx-ownership-host-${hostIntegrationName}`,
51
+ hostJsxImportSource,
52
+ foreignExtensions,
53
+ }),
54
+ ];
37
55
  }
38
- export {
39
- getHostScopedJsxOwnershipPlugins,
40
- getJsxOwnershipPlugins
41
- };
@@ -1,6 +1,4 @@
1
- function isLitStaticRenderWorkerThread() {
2
- return process.env.ECOPAGES_LIT_STATIC_RENDER_WORKER === "true";
1
+ /** Returns whether the current thread is the Lit static-render worker. */
2
+ export function isLitStaticRenderWorkerThread() {
3
+ return process.env.ECOPAGES_LIT_STATIC_RENDER_WORKER === 'true';
3
4
  }
4
- export {
5
- isLitStaticRenderWorkerThread
6
- };