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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/README.md +1 -0
  2. package/package.json +90 -3
  3. package/src/adapters/abstract/application-adapter.d.ts +0 -8
  4. package/src/adapters/abstract/application-adapter.js +252 -261
  5. package/src/adapters/abstract/router-adapter.js +12 -4
  6. package/src/adapters/abstract/segment-path-matcher.js +132 -134
  7. package/src/adapters/abstract/server-adapter.js +22 -14
  8. package/src/adapters/abstract/ws-pattern-matcher.js +24 -26
  9. package/src/adapters/bun/bun-user-websocket-lifecycle.js +83 -86
  10. package/src/adapters/bun/client-bridge.js +51 -50
  11. package/src/adapters/bun/create-app.js +171 -161
  12. package/src/adapters/bun/hmr-manager.js +62 -57
  13. package/src/adapters/bun/index.js +2 -31
  14. package/src/adapters/bun/runtime-host.js +61 -54
  15. package/src/adapters/bun/server-adapter.d.ts +0 -1
  16. package/src/adapters/bun/server-adapter.js +561 -561
  17. package/src/adapters/bun/static-preview-host.js +43 -46
  18. package/src/adapters/create-app.js +11 -14
  19. package/src/adapters/index.js +2 -30
  20. package/src/adapters/node/create-app.js +123 -129
  21. package/src/adapters/node/http-request-bridge.js +147 -106
  22. package/src/adapters/node/node-client-bridge.js +62 -64
  23. package/src/adapters/node/node-hmr-manager.js +58 -48
  24. package/src/adapters/node/runtime-host.js +96 -89
  25. package/src/adapters/node/server-adapter-dependencies.js +18 -21
  26. package/src/adapters/node/server-adapter.d.ts +0 -1
  27. package/src/adapters/node/server-adapter.js +347 -326
  28. package/src/adapters/node/static-content-server.js +172 -191
  29. package/src/adapters/node/static-preview-host.js +87 -78
  30. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  31. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  32. package/src/adapters/shared/hmr/hmr-html-response.js +46 -32
  33. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +29 -38
  34. package/src/adapters/shared/hmr/shared-hmr-manager.js +439 -425
  35. package/src/adapters/shared/http/api-request-pipeline.js +122 -119
  36. package/src/adapters/shared/http/api-response.js +77 -77
  37. package/src/adapters/shared/http/create-body-response.js +22 -19
  38. package/src/adapters/shared/http/define-api-handler.js +41 -55
  39. package/src/adapters/shared/http/explicit-static-render-preparation.js +26 -23
  40. package/src/adapters/shared/http/explicit-static-route-matcher.js +55 -62
  41. package/src/adapters/shared/http/file-route-middleware-pipeline.js +81 -75
  42. package/src/adapters/shared/http/fs-server-response-factory.js +101 -96
  43. package/src/adapters/shared/http/fs-server-response-matcher.js +239 -257
  44. package/src/adapters/shared/http/run-middleware-chain.js +15 -15
  45. package/src/adapters/shared/runtime/application-adapter.js +72 -87
  46. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +25 -22
  47. package/src/adapters/shared/runtime/port-manager.js +207 -177
  48. package/src/adapters/shared/runtime/render-context.js +94 -79
  49. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +33 -38
  50. package/src/adapters/shared/runtime/runtime-host.js +1 -0
  51. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +2 -3
  52. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +65 -51
  53. package/src/adapters/shared/runtime/server-adapter.d.ts +1 -0
  54. package/src/adapters/shared/runtime/server-adapter.js +233 -217
  55. package/src/adapters/shared/runtime/server-route-handler.js +74 -70
  56. package/src/adapters/shared/runtime/server-static-builder.js +165 -184
  57. package/src/adapters/shared/runtime/static-preview-host.js +1 -0
  58. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +97 -88
  59. package/src/adapters/shared/ws/websocket-lifecycle.js +57 -50
  60. package/src/build/README.md +52 -1
  61. package/src/build/app-build-manifest-runtime.js +129 -108
  62. package/src/build/browser/browser-runtime-manifest.js +47 -50
  63. package/src/build/browser/browser-runtime-plugin-helpers.js +32 -12
  64. package/src/build/browser/browser-runtime-plugin.js +206 -160
  65. package/src/build/browser/jsx-ownership-plugins.js +51 -37
  66. package/src/build/browser/lit-static-render-worker-context.js +3 -5
  67. package/src/build/build-adapter.js +276 -139
  68. package/src/build/cache/build-input-fingerprint.js +28 -26
  69. package/src/build/cache/cache-constants.js +4 -6
  70. package/src/build/cache/cache-keys.js +64 -56
  71. package/src/build/cache/pages-unified-graph-build.js +179 -178
  72. package/src/build/cache/production-build-cache.js +47 -54
  73. package/src/build/cache/server-entry-build-cache.js +134 -146
  74. package/src/build/contracts/build-contracts.d.ts +4 -4
  75. package/src/build/contracts/build-contracts.js +1 -0
  76. package/src/build/contracts/build-manifest.js +58 -43
  77. package/src/build/contracts/build-types.js +1 -0
  78. package/src/build/rolldown/rolldown-adapter-helpers.d.ts +9 -0
  79. package/src/build/rolldown/rolldown-adapter-helpers.js +405 -298
  80. package/src/build/rolldown/rolldown-build-adapter.js +53 -61
  81. package/src/build/rolldown/rolldown-build-invocation-metrics.js +31 -35
  82. package/src/build/rolldown/rolldown-plugin-bridge.js +264 -194
  83. package/src/build/rolldown/rolldown-source-transform-pass.js +59 -50
  84. package/src/build/rolldown/runtime-build-output-normalizer.js +227 -175
  85. package/src/build/rolldown/server-side-css-shim-plugin.js +54 -31
  86. package/src/build/runtime/build-profile-options.js +36 -36
  87. package/src/build/runtime/build-request-identity.js +70 -45
  88. package/src/build/runtime/build-request-policy.js +80 -42
  89. package/src/build/runtime/build-runtime.js +64 -54
  90. package/src/build/runtime/deduping-build-executor.js +38 -32
  91. package/src/build/runtime/parallel-build-executor.js +58 -50
  92. package/src/build/runtime/serialized-build-executor.js +78 -62
  93. package/src/cache/index.js +6 -6
  94. package/src/cache/module-parse-cache.js +99 -68
  95. package/src/client/navigation-scripts/classification.js +45 -37
  96. package/src/client/navigation-scripts/index.js +3 -23
  97. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +58 -62
  98. package/src/client/navigation-scripts/registry.js +15 -11
  99. package/src/client/navigation-scripts/rerun-queue.js +81 -64
  100. package/src/client/scroll.js +32 -24
  101. package/src/client/scroll.test.browser.js +27 -33
  102. package/src/client/view-transitions.js +68 -55
  103. package/src/config/config-builder.d.ts +8 -0
  104. package/src/config/config-builder.js +637 -642
  105. package/src/config/constants.js +44 -24
  106. package/src/declarations.d.ts +1 -0
  107. package/src/dev/README.md +24 -0
  108. package/src/dev/client-bridge-registry.js +7 -12
  109. package/src/dev/dev-client-ownership.js +7 -5
  110. package/src/dev/hmr-manager-registry.js +7 -12
  111. package/src/dev/host-runtime.js +25 -30
  112. package/src/dev/runtime-server-started-message.js +2 -5
  113. package/src/dev/sc-server.js +106 -103
  114. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  115. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  116. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  117. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  118. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  119. package/src/dev/transform-server/dev-transform-import-rewriter.js +110 -0
  120. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  121. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  122. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  123. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  124. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  125. package/src/dev/transform-server/dev-transform-server.js +191 -0
  126. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  127. package/src/dev/transform-server/dev-transform-url.js +58 -0
  128. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +27 -0
  129. package/src/dev/transform-server/dev-transform-vendor-registry.js +145 -0
  130. package/src/dev/transform-server/index.d.ts +6 -0
  131. package/src/dev/transform-server/index.js +4 -0
  132. package/src/dev/transform-server/types.d.ts +15 -0
  133. package/src/dev/transform-server/types.js +1 -0
  134. package/src/dev-toolbar/README.md +51 -0
  135. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  136. package/src/dev-toolbar/define-dev-tool.js +9 -0
  137. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  138. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  139. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  140. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  141. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  142. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  143. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  144. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  145. package/src/dev-toolbar/dev-toolbar-package.d.ts +31 -0
  146. package/src/dev-toolbar/dev-toolbar-package.js +72 -0
  147. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  148. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  149. package/src/diagnostics/request-build-dedupe.js +34 -28
  150. package/src/diagnostics/startup-trace.d.ts +10 -1
  151. package/src/diagnostics/startup-trace.js +269 -241
  152. package/src/eco/README.md +6 -0
  153. package/src/eco/eco-declared-component.js +19 -14
  154. package/src/eco/eco.browser.js +56 -69
  155. package/src/eco/eco.js +156 -96
  156. package/src/eco/eco.types.js +5 -0
  157. package/src/eco/eco.utils.js +1 -10
  158. package/src/eco/global-injector-map.js +55 -41
  159. package/src/eco/lazy-injector-map.js +90 -60
  160. package/src/eco/module-dependencies.js +52 -44
  161. package/src/eco/page-layout-normalization.js +59 -49
  162. package/src/errors/http-error.js +50 -49
  163. package/src/errors/index.js +3 -12
  164. package/src/errors/locals-access-error.js +5 -8
  165. package/src/errors/undeclared-component-dependency-error.js +15 -15
  166. package/src/global/app-logger.js +3 -6
  167. package/src/hmr/README.md +10 -0
  168. package/src/hmr/client/hmr-runtime.js +117 -113
  169. package/src/hmr/client/module-update.d.ts +13 -0
  170. package/src/hmr/client/module-update.js +39 -0
  171. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  172. package/src/hmr/hmr-asset-paths.js +22 -0
  173. package/src/hmr/hmr-entrypoint-output.d.ts +11 -39
  174. package/src/hmr/hmr-entrypoint-output.js +28 -54
  175. package/src/hmr/hmr-file-change-prep.js +13 -16
  176. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  177. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  178. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  179. package/src/hmr/hmr-runtime-paths.js +13 -0
  180. package/src/hmr/hmr-strategy.d.ts +5 -11
  181. package/src/hmr/hmr-strategy.js +113 -61
  182. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  183. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -95
  184. package/src/hmr/strategies/js-hmr-strategy.js +104 -217
  185. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +33 -27
  186. package/src/index.browser.js +1 -4
  187. package/src/index.d.ts +1 -0
  188. package/src/index.js +6 -47
  189. package/src/integrations/ghtml/ghtml-renderer.js +12 -7
  190. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  191. package/src/integrations/ghtml/ghtml.plugin.js +9 -12
  192. package/src/islands/README.md +25 -0
  193. package/src/islands/island-host.d.ts +37 -0
  194. package/src/islands/island-host.js +55 -0
  195. package/src/plugins/alias-resolver-cache.js +114 -97
  196. package/src/plugins/alias-resolver-plugin.js +33 -47
  197. package/src/plugins/define-integration.js +18 -17
  198. package/src/plugins/eco-component-meta-plugin.js +387 -145
  199. package/src/plugins/foreign-jsx-override-plugin.js +49 -35
  200. package/src/plugins/integration-plugin.js +212 -203
  201. package/src/plugins/jsx-import-source.utils.js +16 -21
  202. package/src/plugins/processor.js +159 -149
  203. package/src/plugins/runtime-capability.js +1 -0
  204. package/src/plugins/source-transform.js +109 -79
  205. package/src/plugins/tsconfig-import-resolver.d.ts +17 -0
  206. package/src/plugins/tsconfig-import-resolver.js +218 -142
  207. package/src/route-renderer/README.md +12 -1
  208. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +143 -136
  209. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +33 -27
  210. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +173 -126
  211. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +165 -154
  212. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +329 -341
  213. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +33 -32
  214. package/src/route-renderer/orchestration/integration-renderer.d.ts +1 -0
  215. package/src/route-renderer/orchestration/integration-renderer.js +731 -750
  216. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +168 -172
  217. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +119 -131
  218. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +82 -91
  219. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +82 -76
  220. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +29 -31
  221. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +10 -6
  222. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +31 -28
  223. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +3 -0
  224. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +430 -413
  225. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +191 -212
  226. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +20 -24
  227. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +4 -0
  228. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +24 -24
  229. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +22 -24
  230. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +41 -34
  231. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +5 -0
  232. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +42 -22
  233. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +50 -48
  234. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +29 -32
  235. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +150 -156
  236. package/src/route-renderer/orchestration/string-markup-renderer.js +48 -51
  237. package/src/route-renderer/page-loading/component-dependency-collection.js +120 -124
  238. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  239. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  240. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +68 -54
  241. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  242. package/src/route-renderer/page-loading/lazy-trigger-planning.js +46 -36
  243. package/src/route-renderer/page-loading/module-declaration-aggregation.js +38 -31
  244. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  245. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  246. package/src/route-renderer/page-loading/page-module-loader.js +130 -124
  247. package/src/route-renderer/route-renderer.js +74 -76
  248. package/src/router/README.md +23 -0
  249. package/src/router/client/link-intent.js +55 -39
  250. package/src/router/client/link-intent.test.browser.js +49 -49
  251. package/src/router/client/link-navigation-policy.js +114 -93
  252. package/src/router/client/link-navigation-policy.test.browser.js +70 -80
  253. package/src/router/client/navigation-coordinator.js +235 -211
  254. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  255. package/src/router/client/navigation-lifecycle.js +50 -0
  256. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  257. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  258. package/src/router/server/route-registry.js +237 -242
  259. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
  260. package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
  261. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  262. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  263. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  264. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
  265. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
  266. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
  267. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
  268. package/src/services/assets/asset-processing-service/index.js +8 -8
  269. package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
  270. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
  271. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  272. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  273. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  274. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  275. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
  276. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  277. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
  278. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
  279. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  280. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
  281. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
  282. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
  283. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
  284. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
  285. package/src/services/assets/browser-bundle.service.js +52 -47
  286. package/src/services/cache/cache.types.js +5 -0
  287. package/src/services/cache/index.js +6 -7
  288. package/src/services/cache/memory-cache-store.js +101 -89
  289. package/src/services/cache/page-cache-service.js +156 -145
  290. package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
  291. package/src/services/html/html-rewriter-provider.service.js +61 -61
  292. package/src/services/html/html-transformer.service.js +249 -266
  293. package/src/services/invalidation/development-invalidation.service.js +252 -241
  294. package/src/services/module-loading/app-module-loader.service.js +1 -0
  295. package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
  296. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  297. package/src/services/module-loading/module-loading-types.js +1 -0
  298. package/src/services/module-loading/page-module-import.service.js +235 -243
  299. package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
  300. package/src/services/module-loading/route-module-build-cache.js +3 -38
  301. package/src/services/module-loading/route-module-build-cache.store.js +195 -200
  302. package/src/services/module-loading/route-module-build-manifest.js +61 -74
  303. package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
  304. package/src/services/module-loading/server-module-transpiler.service.js +68 -62
  305. package/src/services/module-loading/source-module-support.js +15 -7
  306. package/src/services/runtime-state/dev-graph.service.js +165 -157
  307. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  308. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  309. package/src/services/validation/schema-validation-service.js +157 -95
  310. package/src/services/validation/standard-schema.types.js +1 -0
  311. package/src/services/validation/validate-standard-schema.js +13 -13
  312. package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
  313. package/src/static-site-generator/sitemap-routes.js +33 -28
  314. package/src/static-site-generator/sitemap.js +38 -29
  315. package/src/static-site-generator/static-build-invalidation.js +34 -56
  316. package/src/static-site-generator/static-export-context.js +1 -0
  317. package/src/static-site-generator/static-site-generator.js +517 -553
  318. package/src/types/internal-types.d.ts +19 -3
  319. package/src/types/internal-types.js +1 -0
  320. package/src/types/public-types.d.ts +16 -46
  321. package/src/types/public-types.js +1 -0
  322. package/src/utils/deep-merge.js +39 -26
  323. package/src/utils/ecopages-route-info.js +27 -23
  324. package/src/utils/hash.js +3 -6
  325. package/src/utils/html-escaping.js +21 -8
  326. package/src/utils/html.js +1 -4
  327. package/src/utils/invariant.js +11 -10
  328. package/src/utils/locals-utils.js +32 -22
  329. package/src/utils/parse-cli-args.js +73 -65
  330. package/src/utils/path-pattern.js +38 -23
  331. package/src/utils/path-utils.module.js +8 -11
  332. package/src/utils/resolve-entry-file.js +70 -38
  333. package/src/utils/resolve-work-dir.js +23 -27
  334. package/src/utils/runtime.js +24 -33
  335. package/src/utils/server-utils.module.js +60 -52
  336. package/src/utils/static-file-extensions.js +52 -46
  337. package/src/watchers/project-watcher-ignore.js +16 -15
  338. package/src/watchers/project-watcher.js +385 -366
  339. package/src/watchers/project-watcher.test-helpers.js +45 -50
  340. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
  341. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
  342. package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
  343. package/src/build/cache/dev-browser-script-cache.js +0 -90
@@ -1,160 +1,170 @@
1
- import path from "node:path";
2
- import { fileSystem } from "@ecopages/file-system";
3
- import { DEFAULT_ECOPAGES_WORK_DIR } from "../config/constants.js";
4
- import { GENERATED_BASE_PATHS } from "../config/constants.js";
5
- import { deepMerge } from "../utils/deep-merge.js";
6
- const PROCESSOR_ERRORS = {
7
- CACHE_DIRECTORY_NOT_SET: "Cache directory not set in context"
1
+ import path from 'node:path';
2
+ import { fileSystem } from '@ecopages/file-system';
3
+ import { DEFAULT_ECOPAGES_WORK_DIR } from '../config/constants.js';
4
+ import { GENERATED_BASE_PATHS } from '../config/constants.js';
5
+ import { deepMerge } from '../utils/deep-merge.js';
6
+ export const PROCESSOR_ERRORS = {
7
+ CACHE_DIRECTORY_NOT_SET: 'Cache directory not set in context',
8
8
  };
9
- function mergeProcessorOptions(defaults, overrides) {
10
- return deepMerge(defaults, overrides);
9
+ export function mergeProcessorOptions(defaults, overrides) {
10
+ return deepMerge(defaults, overrides);
11
11
  }
12
- function resolveGeneratedPath(type, options) {
13
- const { root, module, subPath } = options;
14
- const parts = [root, GENERATED_BASE_PATHS[type], module, subPath].filter(Boolean);
15
- return path.join(...parts);
12
+ export function resolveGeneratedPath(type, options) {
13
+ const { root, module, subPath } = options;
14
+ const parts = [root, GENERATED_BASE_PATHS[type], module, subPath].filter(Boolean);
15
+ return path.join(...parts);
16
16
  }
17
- class Processor {
18
- name;
19
- context;
20
- options;
21
- watchConfig;
22
- capabilities = [];
23
- runtimeCapability;
24
- constructor(config) {
25
- this.name = config.name;
26
- this.options = config.options;
27
- this.watchConfig = config.watch;
28
- this.capabilities = config.capabilities ?? [];
29
- this.runtimeCapability = config.runtimeCapability;
30
- }
31
- setContext(appConfig) {
32
- const workDir = appConfig.absolutePaths.workDir ?? path.join(appConfig.rootDir, appConfig.workDir ?? DEFAULT_ECOPAGES_WORK_DIR);
33
- const cachePath = resolveGeneratedPath("cache", {
34
- root: workDir,
35
- module: this.name
36
- });
37
- fileSystem.ensureDir(cachePath);
38
- this.context = {
39
- config: appConfig,
40
- rootDir: appConfig.rootDir,
41
- srcDir: appConfig.absolutePaths.srcDir,
42
- distDir: appConfig.absolutePaths.distDir,
43
- cache: cachePath
44
- };
45
- }
46
- /**
47
- * Prepares build-facing processor contributions before config finalization.
48
- *
49
- * @remarks
50
- * Override this when a processor must compute runtime/build plugins or other
51
- * manifest-owned state before startup. Runtime-only work such as cache
52
- * warming or watcher registration should stay in `setup()`.
53
- */
54
- async prepareBuildContributions() {
55
- }
56
- /**
57
- * Reports whether this processor's build inputs changed since the last
58
- * incremental static build.
59
- *
60
- * @remarks
61
- * No shipped processor overrides this today. Integrations and processors can
62
- * opt in when they own build inputs that should invalidate incremental static
63
- * exports without a full rebuild.
64
- */
65
- didChange() {
66
- return false;
67
- }
68
- /**
69
- * Releases runtime resources owned by the processor.
70
- *
71
- * @remarks
72
- * Core does not call this hook today. Override only when a processor owns
73
- * watchers, compiler handles, or other resources that outlive individual
74
- * requests.
75
- */
76
- async teardown() {
77
- }
78
- getCachePath(key) {
79
- return `${this.context?.cache}/${key}`;
80
- }
81
- async readCache(key) {
82
- const cachePath = this.getCachePath(key);
83
- try {
84
- const data = await fileSystem.readFile(cachePath);
85
- return JSON.parse(data);
86
- } catch {
87
- return null;
17
+ /**
18
+ * Base class for content and asset processors that contribute build plugins.
19
+ *
20
+ * @remarks
21
+ * Processors declare plugins through two getters that map to
22
+ * {@link AppBuildManifest} buckets (names differ from integrations):
23
+ *
24
+ * - `plugins` → `runtimePlugins` (server **and** browser builds)
25
+ * - `buildPlugins` → `browserBundlePlugins` (browser bundles only)
26
+ *
27
+ * Virtual modules that must resolve during route-module transpile belong in
28
+ * `plugins`. Browser-only bundler hooks belong in `buildPlugins`.
29
+ */
30
+ export class Processor {
31
+ name;
32
+ context;
33
+ options;
34
+ watchConfig;
35
+ capabilities = [];
36
+ runtimeCapability;
37
+ constructor(config) {
38
+ this.name = config.name;
39
+ this.options = config.options;
40
+ this.watchConfig = config.watch;
41
+ this.capabilities = config.capabilities ?? [];
42
+ this.runtimeCapability = config.runtimeCapability;
88
43
  }
89
- }
90
- async writeCache(key, data) {
91
- if (!this.context?.cache) {
92
- throw new Error(PROCESSOR_ERRORS.CACHE_DIRECTORY_NOT_SET);
44
+ setContext(appConfig) {
45
+ const workDir = appConfig.absolutePaths.workDir ??
46
+ path.join(appConfig.rootDir, appConfig.workDir ?? DEFAULT_ECOPAGES_WORK_DIR);
47
+ const cachePath = resolveGeneratedPath('cache', {
48
+ root: workDir,
49
+ module: this.name,
50
+ });
51
+ fileSystem.ensureDir(cachePath);
52
+ this.context = {
53
+ config: appConfig,
54
+ rootDir: appConfig.rootDir,
55
+ srcDir: appConfig.absolutePaths.srcDir,
56
+ distDir: appConfig.absolutePaths.distDir,
57
+ cache: cachePath,
58
+ };
93
59
  }
94
- const cachePath = this.getCachePath(key);
95
- fileSystem.write(cachePath, JSON.stringify(data, null, 2));
96
- }
97
- getWatchConfig() {
98
- return this.watchConfig;
99
- }
100
- getName() {
101
- return this.name;
102
- }
103
- getAssetCapabilities() {
104
- return this.capabilities;
105
- }
106
- matchesFileFilter(_filepath) {
107
- return true;
108
- }
109
- canProcessAsset(kind, filepath) {
110
- const capabilities = this.getAssetCapabilities();
111
- if (capabilities.length === 0) {
112
- return false;
60
+ /**
61
+ * Prepares build-facing processor contributions before config finalization.
62
+ *
63
+ * @remarks
64
+ * Override this when a processor must compute runtime/build plugins or other
65
+ * manifest-owned state before startup. Runtime-only work such as cache
66
+ * warming or watcher registration should stay in `setup()`.
67
+ */
68
+ async prepareBuildContributions() { }
69
+ /**
70
+ * Reports whether this processor's build inputs changed since the last
71
+ * incremental static build.
72
+ *
73
+ * @remarks
74
+ * No shipped processor overrides this today. Integrations and processors can
75
+ * opt in when they own build inputs that should invalidate incremental static
76
+ * exports without a full rebuild.
77
+ */
78
+ didChange() {
79
+ return false;
113
80
  }
114
- const matchingKind = capabilities.filter((capability) => capability.kind === kind);
115
- if (matchingKind.length === 0) {
116
- return false;
81
+ /**
82
+ * Releases runtime resources owned by the processor.
83
+ *
84
+ * @remarks
85
+ * Core does not call this hook today. Override only when a processor owns
86
+ * watchers, compiler handles, or other resources that outlive individual
87
+ * requests.
88
+ */
89
+ async teardown() { }
90
+ getCachePath(key) {
91
+ return `${this.context?.cache}/${key}`;
117
92
  }
118
- if (!filepath) {
119
- return true;
93
+ async readCache(key) {
94
+ const cachePath = this.getCachePath(key);
95
+ try {
96
+ const data = await fileSystem.readFile(cachePath);
97
+ return JSON.parse(data);
98
+ }
99
+ catch {
100
+ return null;
101
+ }
120
102
  }
121
- return matchingKind.some((capability) => this.matchesCapabilityExtensions(filepath, capability.extensions));
122
- }
123
- matchesCapabilityExtensions(filepath, extensions) {
124
- if (!extensions || extensions.length === 0) {
125
- return true;
103
+ async writeCache(key, data) {
104
+ if (!this.context?.cache) {
105
+ throw new Error(PROCESSOR_ERRORS.CACHE_DIRECTORY_NOT_SET);
106
+ }
107
+ const cachePath = this.getCachePath(key);
108
+ fileSystem.write(cachePath, JSON.stringify(data, null, 2));
126
109
  }
127
- const normalizedExt = path.extname(filepath).toLowerCase();
128
- return extensions.some((rawPattern) => {
129
- const pattern = this.normalizeExtensionPattern(rawPattern);
130
- if (!pattern) {
131
- return false;
132
- }
133
- if (pattern === "*") {
110
+ getWatchConfig() {
111
+ return this.watchConfig;
112
+ }
113
+ getName() {
114
+ return this.name;
115
+ }
116
+ getAssetCapabilities() {
117
+ return this.capabilities;
118
+ }
119
+ matchesFileFilter(_filepath) {
134
120
  return true;
135
- }
136
- const groupedMatch = pattern.match(/^\*\.\{(.+)\}$/);
137
- if (groupedMatch) {
138
- const groupItems = groupedMatch[1].split(",").map((item) => this.normalizeExtensionPattern(item)).filter(Boolean);
139
- return groupItems.some((item) => normalizedExt === item || normalizedExt === `.${item}`);
140
- }
141
- if (pattern.startsWith("*")) {
142
- const suffix = pattern.slice(1);
143
- return normalizedExt.endsWith(suffix);
144
- }
145
- if (pattern.startsWith(".")) {
146
- return normalizedExt === pattern;
147
- }
148
- return normalizedExt === `.${pattern}`;
149
- });
150
- }
151
- normalizeExtensionPattern(rawPattern) {
152
- return rawPattern.trim().toLowerCase();
153
- }
121
+ }
122
+ canProcessAsset(kind, filepath) {
123
+ const capabilities = this.getAssetCapabilities();
124
+ if (capabilities.length === 0) {
125
+ return false;
126
+ }
127
+ const matchingKind = capabilities.filter((capability) => capability.kind === kind);
128
+ if (matchingKind.length === 0) {
129
+ return false;
130
+ }
131
+ if (!filepath) {
132
+ return true;
133
+ }
134
+ return matchingKind.some((capability) => this.matchesCapabilityExtensions(filepath, capability.extensions));
135
+ }
136
+ matchesCapabilityExtensions(filepath, extensions) {
137
+ if (!extensions || extensions.length === 0) {
138
+ return true;
139
+ }
140
+ const normalizedExt = path.extname(filepath).toLowerCase();
141
+ return extensions.some((rawPattern) => {
142
+ const pattern = this.normalizeExtensionPattern(rawPattern);
143
+ if (!pattern) {
144
+ return false;
145
+ }
146
+ if (pattern === '*') {
147
+ return true;
148
+ }
149
+ const groupedMatch = pattern.match(/^\*\.\{(.+)\}$/);
150
+ if (groupedMatch) {
151
+ const groupItems = groupedMatch[1]
152
+ .split(',')
153
+ .map((item) => this.normalizeExtensionPattern(item))
154
+ .filter(Boolean);
155
+ return groupItems.some((item) => normalizedExt === item || normalizedExt === `.${item}`);
156
+ }
157
+ if (pattern.startsWith('*')) {
158
+ const suffix = pattern.slice(1);
159
+ return normalizedExt.endsWith(suffix);
160
+ }
161
+ if (pattern.startsWith('.')) {
162
+ return normalizedExt === pattern;
163
+ }
164
+ return normalizedExt === `.${pattern}`;
165
+ });
166
+ }
167
+ normalizeExtensionPattern(rawPattern) {
168
+ return rawPattern.trim().toLowerCase();
169
+ }
154
170
  }
155
- export {
156
- PROCESSOR_ERRORS,
157
- Processor,
158
- mergeProcessorOptions,
159
- resolveGeneratedPath
160
- };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,93 +1,123 @@
1
- import path from "node:path";
2
- import { fileSystem } from "@ecopages/file-system";
3
- function normalizeTransformId(id) {
4
- const queryIndex = id.indexOf("?");
5
- const hashIndex = id.indexOf("#");
6
- const endIndex = [queryIndex, hashIndex].filter((index) => index >= 0).sort((left, right) => left - right)[0];
7
- return endIndex === void 0 ? id : id.slice(0, endIndex);
1
+ import path from 'node:path';
2
+ import { fileSystem } from '@ecopages/file-system';
3
+ /**
4
+ * Normalizes bundler module ids so one transform can serve Ecopages loaders,
5
+ * Vite, and future bundler adapters.
6
+ */
7
+ export function normalizeTransformId(id) {
8
+ const queryIndex = id.indexOf('?');
9
+ const hashIndex = id.indexOf('#');
10
+ const endIndex = [queryIndex, hashIndex].filter((index) => index >= 0).sort((left, right) => left - right)[0];
11
+ return endIndex === undefined ? id : id.slice(0, endIndex);
8
12
  }
9
- function applySourceTransform(transform, code, id) {
10
- const normalizedId = normalizeTransformId(id);
11
- if (!transform.filter.test(normalizedId)) {
12
- return void 0;
13
- }
14
- return transform.transform(code, normalizedId);
13
+ /**
14
+ * Applies one source transform if the normalized id matches its filter.
15
+ */
16
+ export function applySourceTransform(transform, code, id) {
17
+ const normalizedId = normalizeTransformId(id);
18
+ if (!transform.filter.test(normalizedId)) {
19
+ return undefined;
20
+ }
21
+ return transform.transform(code, normalizedId);
15
22
  }
16
23
  const SOURCE_TRANSFORM_ENFORCE_ORDER = {
17
- pre: 0,
18
- default: 1,
19
- post: 2
24
+ pre: 0,
25
+ default: 1,
26
+ post: 2,
20
27
  };
21
28
  function getSourceTransformEnforceOrder(transform) {
22
- return SOURCE_TRANSFORM_ENFORCE_ORDER[transform.enforce ?? "default"];
23
- }
24
- function applySourceTransforms(transforms, code, id) {
25
- let current = code;
26
- for (const transform of [...transforms].sort(
27
- (left, right) => getSourceTransformEnforceOrder(left) - getSourceTransformEnforceOrder(right)
28
- )) {
29
- const result = applySourceTransform(transform, current, id);
30
- if (!result) {
31
- continue;
32
- }
33
- current = typeof result === "string" ? result : result.code;
34
- }
35
- return current;
36
- }
37
- function inferLoaderFromPath(filePath) {
38
- const extension = path.extname(filePath).toLowerCase();
39
- switch (extension) {
40
- case ".ts":
41
- return "ts";
42
- case ".tsx":
43
- return "tsx";
44
- case ".jsx":
45
- return "jsx";
46
- default:
47
- return "js";
48
- }
29
+ return SOURCE_TRANSFORM_ENFORCE_ORDER[transform.enforce ?? 'default'];
49
30
  }
50
- function createEcoBuildPluginFromSourceTransform(transform) {
51
- return {
52
- name: transform.name,
53
- setup(build) {
54
- build.onLoad({ filter: transform.filter }, (args) => {
55
- const filePath = normalizeTransformId(args.path);
56
- const code = fileSystem.readFileSync(filePath);
57
- const result = applySourceTransform(transform, code, filePath);
31
+ /**
32
+ * Applies app-owned source transforms in deterministic `pre` → default → `post` order.
33
+ *
34
+ * @remarks
35
+ * Used by the Rolldown plugin bridge after `onLoad` plugins produce final module
36
+ * contents. Transforms that do not match `filter` are skipped; matching transforms
37
+ * are chained left-to-right on the current source string.
38
+ *
39
+ * @param transforms - App-owned transforms, usually from {@link getAppSourceTransforms}.
40
+ * @param code - Current module source.
41
+ * @param id - Module id forwarded to each transform after query/hash normalization.
42
+ * @returns The transformed source, or the original `code` when no transform matches.
43
+ */
44
+ export function applySourceTransforms(transforms, code, id) {
45
+ let current = code;
46
+ for (const transform of [...transforms].sort((left, right) => getSourceTransformEnforceOrder(left) - getSourceTransformEnforceOrder(right))) {
47
+ const result = applySourceTransform(transform, current, id);
58
48
  if (!result) {
59
- return void 0;
49
+ continue;
60
50
  }
61
- return {
62
- contents: typeof result === "string" ? result : result.code,
63
- loader: inferLoaderFromPath(filePath),
64
- resolveDir: path.dirname(filePath)
65
- };
66
- });
51
+ current = typeof result === 'string' ? result : result.code;
67
52
  }
68
- };
53
+ return current;
69
54
  }
70
- function createVitePluginFromSourceTransform(transform) {
71
- return {
72
- name: transform.name,
73
- enforce: transform.enforce,
74
- transform(code, id) {
75
- return applySourceTransform(transform, code, id);
55
+ function inferLoaderFromPath(filePath) {
56
+ const extension = path.extname(filePath).toLowerCase();
57
+ switch (extension) {
58
+ case '.ts':
59
+ return 'ts';
60
+ case '.tsx':
61
+ return 'tsx';
62
+ case '.jsx':
63
+ return 'jsx';
64
+ default:
65
+ return 'js';
76
66
  }
77
- };
78
67
  }
79
- function getAppSourceTransforms(appConfig) {
80
- return appConfig.sourceTransforms ? Array.from(appConfig.sourceTransforms.values()) : [];
68
+ /**
69
+ * Adapts a source transform into the existing Ecopages build-plugin contract.
70
+ *
71
+ * @remarks
72
+ * Server-oriented builds and loader registration still use this adapter.
73
+ * Browser/HMR builds should register the transform in `appConfig.sourceTransforms`
74
+ * instead so the Rolldown bridge can run it after competing `onLoad` plugins.
75
+ */
76
+ export function createEcoBuildPluginFromSourceTransform(transform) {
77
+ return {
78
+ name: transform.name,
79
+ setup(build) {
80
+ build.onLoad({ filter: transform.filter }, (args) => {
81
+ const filePath = normalizeTransformId(args.path);
82
+ const code = fileSystem.readFileSync(filePath);
83
+ const result = applySourceTransform(transform, code, filePath);
84
+ if (!result) {
85
+ return undefined;
86
+ }
87
+ return {
88
+ contents: typeof result === 'string' ? result : result.code,
89
+ loader: inferLoaderFromPath(filePath),
90
+ resolveDir: path.dirname(filePath),
91
+ };
92
+ });
93
+ },
94
+ };
81
95
  }
82
- function createVitePluginsFromAppSourceTransforms(appConfig) {
83
- return getAppSourceTransforms(appConfig).map((transform) => createVitePluginFromSourceTransform(transform));
96
+ /**
97
+ * Adapts a source transform into a Vite-compatible plugin object.
98
+ *
99
+ * @remarks
100
+ * This intentionally returns a plain object shape so core does not need a hard
101
+ * dependency on `vite` just to author transform primitives.
102
+ */
103
+ export function createVitePluginFromSourceTransform(transform) {
104
+ return {
105
+ name: transform.name,
106
+ enforce: transform.enforce,
107
+ transform(code, id) {
108
+ return applySourceTransform(transform, code, id);
109
+ },
110
+ };
111
+ }
112
+ /**
113
+ * Returns the app-owned source transforms in stable registration order.
114
+ */
115
+ export function getAppSourceTransforms(appConfig) {
116
+ return appConfig.sourceTransforms ? Array.from(appConfig.sourceTransforms.values()) : [];
117
+ }
118
+ /**
119
+ * Adapts the app-owned source transforms into Vite-compatible plugin objects.
120
+ */
121
+ export function createVitePluginsFromAppSourceTransforms(appConfig) {
122
+ return getAppSourceTransforms(appConfig).map((transform) => createVitePluginFromSourceTransform(transform));
84
123
  }
85
- export {
86
- applySourceTransform,
87
- applySourceTransforms,
88
- createEcoBuildPluginFromSourceTransform,
89
- createVitePluginFromSourceTransform,
90
- createVitePluginsFromAppSourceTransforms,
91
- getAppSourceTransforms,
92
- normalizeTransformId
93
- };
@@ -8,6 +8,23 @@ export declare function matchesTsconfigPathPrefix(specifier: string, prefixes: r
8
8
  * a relative path, absolute path, node built-in, tsconfig alias, or `#` import map.
9
9
  */
10
10
  export declare function isBarePackageImportSpecifier(specifier: string, projectRoot?: string): boolean;
11
+ /**
12
+ * Resolves a bare npm package entry for browser vendor prebundles.
13
+ *
14
+ * @remarks
15
+ * Prefer package `"browser"` / `"exports.browser"` over Node `"import"` entries.
16
+ * `createRequire().resolve()` is wrong here — it selects the server facade for
17
+ * dual packages such as `@ecopages/core`.
18
+ */
19
+ export declare function resolveBarePackageBrowserEntry(projectRoot: string, specifier: string): string | undefined;
20
+ /**
21
+ * Resolves a relative import against the filesystem without requiring tsconfig.
22
+ *
23
+ * @remarks
24
+ * Used when oxc-resolver has no tsconfig (minimal fixtures / apps without paths)
25
+ * and as a fallback when the resolver cannot locate a relative specifier.
26
+ */
27
+ export declare function resolveRelativeModulePath(fromFile: string, specifier: string): string | undefined;
11
28
  /**
12
29
  * Resolves a relative or tsconfig path alias import (via oxc-resolver).
13
30
  */