@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,243 +1,254 @@
1
- import path from "node:path";
2
- import { getAppServerInvalidationState } from "../runtime-state/server-invalidation-state.service.js";
3
- import { appLogger } from "../../global/app-logger.js";
4
- class DevelopmentInvalidationService {
5
- appConfig;
6
- constructor(appConfig) {
7
- this.appConfig = appConfig;
8
- }
9
- /**
10
- * Returns the current app-owned server-module invalidation version.
11
- */
12
- getServerModuleInvalidationVersion() {
13
- return getAppServerInvalidationState(this.appConfig).getServerInvalidationVersion();
14
- }
15
- /**
16
- * Invalidates the app-owned server-module graph.
17
- */
18
- invalidateServerModules(changedFiles) {
19
- getAppServerInvalidationState(this.appConfig).invalidateServerModules(changedFiles);
20
- this.appConfig.runtime?.appModuleLoader?.invalidateDevelopmentGraph();
21
- }
22
- /**
23
- * Registers an integration-owned handler for registered script entrypoint edits.
24
- */
25
- registerRegisteredScriptEntrypointChangeHandler(handler) {
26
- const runtime = this.appConfig.runtime ?? {};
27
- this.appConfig.runtime = runtime;
28
- runtime.registeredScriptEntrypointChangeHandlers ??= [];
29
- runtime.registeredScriptEntrypointChangeHandlers.push(handler);
30
- }
31
- /**
32
- * Notifies integration handlers that a registered script entrypoint changed.
33
- */
34
- async notifyRegisteredScriptEntrypointChange(filePath) {
35
- const handlers = this.appConfig.runtime?.registeredScriptEntrypointChangeHandlers ?? [];
36
- for (const handler of handlers) {
37
- try {
38
- await handler(filePath);
39
- } catch (error) {
40
- appLogger.error(
41
- `Failed to handle registered script entrypoint change for ${filePath}: ${error instanceof Error ? error.message : String(error)}`
42
- );
43
- }
1
+ import path from 'node:path';
2
+ import { getAppServerInvalidationState } from '../runtime-state/server-invalidation-state.service.js';
3
+ import { appLogger } from '../../global/app-logger.js';
4
+ /**
5
+ * Framework-owned development invalidation service.
6
+ *
7
+ * @remarks
8
+ * This service centralizes two responsibilities:
9
+ * - file-change classification for watcher behavior
10
+ * - app-owned server-module invalidation versioning backed by the dev graph
11
+ *
12
+ * Hosts and watchers should ask this service what a file change means instead
13
+ * of deciding invalidation semantics inline.
14
+ */
15
+ export class DevelopmentInvalidationService {
16
+ appConfig;
17
+ constructor(appConfig) {
18
+ this.appConfig = appConfig;
19
+ }
20
+ /**
21
+ * Returns the current app-owned server-module invalidation version.
22
+ */
23
+ getServerModuleInvalidationVersion() {
24
+ return getAppServerInvalidationState(this.appConfig).getServerInvalidationVersion();
25
+ }
26
+ /**
27
+ * Invalidates the app-owned server-module graph.
28
+ */
29
+ invalidateServerModules(changedFiles) {
30
+ getAppServerInvalidationState(this.appConfig).invalidateServerModules(changedFiles);
31
+ this.appConfig.runtime?.appModuleLoader?.invalidateDevelopmentGraph();
32
+ }
33
+ /**
34
+ * Registers an integration-owned handler for registered script entrypoint edits.
35
+ */
36
+ registerRegisteredScriptEntrypointChangeHandler(handler) {
37
+ const runtime = this.appConfig.runtime ?? {};
38
+ this.appConfig.runtime = runtime;
39
+ runtime.registeredScriptEntrypointChangeHandlers ??= [];
40
+ runtime.registeredScriptEntrypointChangeHandlers.push(handler);
41
+ }
42
+ /**
43
+ * Notifies integration handlers that a registered script entrypoint changed.
44
+ */
45
+ async notifyRegisteredScriptEntrypointChange(filePath) {
46
+ const handlers = this.appConfig.runtime?.registeredScriptEntrypointChangeHandlers ?? [];
47
+ for (const handler of handlers) {
48
+ try {
49
+ await handler(filePath);
50
+ }
51
+ catch (error) {
52
+ appLogger.error(`Failed to handle registered script entrypoint change for ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
53
+ }
54
+ }
55
+ }
56
+ /**
57
+ * Resets runtime-owned graph state and invalidates server modules.
58
+ */
59
+ resetRuntimeState(changedFiles) {
60
+ const serverInvalidationState = getAppServerInvalidationState(this.appConfig);
61
+ serverInvalidationState.invalidateServerModules(changedFiles);
62
+ serverInvalidationState.reset();
63
+ }
64
+ /**
65
+ * Classifies one changed file into an explicit framework invalidation plan.
66
+ */
67
+ planFileChange(filePath) {
68
+ if (this.isPublicDirFile(filePath)) {
69
+ return {
70
+ category: 'public-asset',
71
+ invalidateServerModules: false,
72
+ refreshRoutes: false,
73
+ reloadBrowser: true,
74
+ delegateToHmr: false,
75
+ processorHandledAsset: false,
76
+ };
77
+ }
78
+ if (this.matchesAdditionalWatchPaths(filePath)) {
79
+ return {
80
+ category: 'additional-watch',
81
+ invalidateServerModules: false,
82
+ refreshRoutes: false,
83
+ reloadBrowser: true,
84
+ delegateToHmr: false,
85
+ processorHandledAsset: false,
86
+ };
87
+ }
88
+ if (this.isIncludeSourceFile(filePath)) {
89
+ return {
90
+ category: 'include-source',
91
+ invalidateServerModules: true,
92
+ refreshRoutes: false,
93
+ reloadBrowser: false,
94
+ delegateToHmr: true,
95
+ processorHandledAsset: false,
96
+ };
97
+ }
98
+ if (this.isExplicitServerViewFile(filePath)) {
99
+ return {
100
+ category: 'explicit-server-view',
101
+ invalidateServerModules: true,
102
+ refreshRoutes: false,
103
+ reloadBrowser: false,
104
+ delegateToHmr: true,
105
+ processorHandledAsset: false,
106
+ };
107
+ }
108
+ if (this.isRouteSourceFile(filePath)) {
109
+ return {
110
+ category: 'route-source',
111
+ invalidateServerModules: true,
112
+ refreshRoutes: true,
113
+ reloadBrowser: false,
114
+ delegateToHmr: true,
115
+ processorHandledAsset: false,
116
+ };
117
+ }
118
+ if (this.isProcessorOwnedAsset(filePath)) {
119
+ return {
120
+ category: 'processor-owned-asset',
121
+ invalidateServerModules: false,
122
+ refreshRoutes: false,
123
+ reloadBrowser: false,
124
+ delegateToHmr: false,
125
+ processorHandledAsset: true,
126
+ };
127
+ }
128
+ if (this.isServerModuleSourceFile(filePath)) {
129
+ return {
130
+ category: 'server-source',
131
+ invalidateServerModules: true,
132
+ refreshRoutes: false,
133
+ reloadBrowser: false,
134
+ delegateToHmr: true,
135
+ processorHandledAsset: false,
136
+ };
137
+ }
138
+ return {
139
+ category: 'other',
140
+ invalidateServerModules: false,
141
+ refreshRoutes: false,
142
+ reloadBrowser: false,
143
+ delegateToHmr: true,
144
+ processorHandledAsset: false,
145
+ };
146
+ }
147
+ /**
148
+ * Returns whether the file lives under the public directory.
149
+ */
150
+ isPublicDirFile(filePath) {
151
+ return path.resolve(filePath).startsWith(this.appConfig.absolutePaths.publicDir);
152
+ }
153
+ /**
154
+ * Returns whether the file matches `additionalWatchPaths`.
155
+ */
156
+ matchesAdditionalWatchPaths(filePath) {
157
+ const normalizedPath = path.resolve(filePath);
158
+ const patterns = this.appConfig.additionalWatchPaths;
159
+ if (!patterns.length)
160
+ return false;
161
+ for (const pattern of patterns) {
162
+ if (pattern.includes('*')) {
163
+ const ext = pattern.replace(/\*\*?\/\*/, '');
164
+ if (normalizedPath.endsWith(ext))
165
+ return true;
166
+ }
167
+ else if (normalizedPath.endsWith(pattern) || normalizedPath === path.resolve(pattern)) {
168
+ return true;
169
+ }
170
+ }
171
+ return false;
172
+ }
173
+ /**
174
+ * Returns whether the file is a route source file.
175
+ */
176
+ isRouteSourceFile(filePath) {
177
+ const resolvedPath = path.resolve(filePath);
178
+ if (!resolvedPath.startsWith(this.appConfig.absolutePaths.pagesDir)) {
179
+ return false;
180
+ }
181
+ if (this.appConfig.templatesExt.some((extension) => resolvedPath.endsWith(extension))) {
182
+ return true;
183
+ }
184
+ return /\.(?:[cm]?ts|[jt]sx?|mdx)$/u.test(resolvedPath);
185
+ }
186
+ /**
187
+ * Returns whether the file is an include/template source file.
188
+ */
189
+ isIncludeSourceFile(filePath) {
190
+ const resolvedPath = path.resolve(filePath);
191
+ if (!resolvedPath.startsWith(this.appConfig.absolutePaths.includesDir)) {
192
+ return false;
193
+ }
194
+ if (this.appConfig.templatesExt.some((extension) => resolvedPath.endsWith(extension))) {
195
+ return true;
196
+ }
197
+ return /\.(?:[cm]?ts|[jt]sx?|mdx)$/u.test(resolvedPath);
198
+ }
199
+ /**
200
+ * Returns whether the file is an explicit server-rendered view module.
201
+ *
202
+ * @remarks
203
+ * These modules are typically registered through `renderServerModule` in
204
+ * `app.ts` rather than the filesystem router. They need a full browser reload
205
+ * because their HTML is produced on the server, not through client HMR entrypoints.
206
+ */
207
+ isExplicitServerViewFile(filePath) {
208
+ const resolvedPath = path.resolve(filePath);
209
+ const viewsDir = path.join(this.appConfig.absolutePaths.srcDir, 'views');
210
+ if (resolvedPath !== viewsDir && !resolvedPath.startsWith(`${viewsDir}${path.sep}`)) {
211
+ return false;
212
+ }
213
+ if (this.appConfig.templatesExt.some((extension) => resolvedPath.endsWith(extension))) {
214
+ return true;
215
+ }
216
+ return /\.(?:[cm]?ts|[jt]sx?|mdx)$/u.test(resolvedPath);
217
+ }
218
+ /**
219
+ * Returns whether the file is a server-executed source module outside the
220
+ * special route/include buckets.
221
+ */
222
+ isServerModuleSourceFile(filePath) {
223
+ const resolvedPath = path.resolve(filePath);
224
+ if (!resolvedPath.startsWith(this.appConfig.absolutePaths.srcDir)) {
225
+ return false;
226
+ }
227
+ if (this.appConfig.templatesExt.some((extension) => resolvedPath.endsWith(extension))) {
228
+ return true;
229
+ }
230
+ return /\.(?:[cm]?ts|[jt]sx?|mdx)$/u.test(resolvedPath);
231
+ }
232
+ /**
233
+ * Returns whether a processor owns the changed file as an asset input.
234
+ *
235
+ * @remarks
236
+ * Watch config drives processor notifications only. Asset ownership requires
237
+ * declared capabilities so dependency-only watches (for example content
238
+ * collection MDX scans) do not skip server invalidation and HMR.
239
+ */
240
+ isProcessorOwnedAsset(filePath) {
241
+ for (const processor of this.appConfig.processors.values()) {
242
+ const capabilities = processor.getAssetCapabilities?.() ?? [];
243
+ if (capabilities.length === 0) {
244
+ continue;
245
+ }
246
+ const matchesConfiguredAsset = typeof processor.matchesFileFilter !== 'function' || processor.matchesFileFilter(filePath);
247
+ if (matchesConfiguredAsset &&
248
+ capabilities.some((capability) => processor.canProcessAsset?.(capability.kind, filePath))) {
249
+ return true;
250
+ }
251
+ }
252
+ return false;
44
253
  }
45
- }
46
- /**
47
- * Resets runtime-owned graph state and invalidates server modules.
48
- */
49
- resetRuntimeState(changedFiles) {
50
- const serverInvalidationState = getAppServerInvalidationState(this.appConfig);
51
- serverInvalidationState.invalidateServerModules(changedFiles);
52
- serverInvalidationState.reset();
53
- }
54
- /**
55
- * Classifies one changed file into an explicit framework invalidation plan.
56
- */
57
- planFileChange(filePath) {
58
- if (this.isPublicDirFile(filePath)) {
59
- return {
60
- category: "public-asset",
61
- invalidateServerModules: false,
62
- refreshRoutes: false,
63
- reloadBrowser: true,
64
- delegateToHmr: false,
65
- processorHandledAsset: false
66
- };
67
- }
68
- if (this.matchesAdditionalWatchPaths(filePath)) {
69
- return {
70
- category: "additional-watch",
71
- invalidateServerModules: false,
72
- refreshRoutes: false,
73
- reloadBrowser: true,
74
- delegateToHmr: false,
75
- processorHandledAsset: false
76
- };
77
- }
78
- if (this.isIncludeSourceFile(filePath)) {
79
- return {
80
- category: "include-source",
81
- invalidateServerModules: true,
82
- refreshRoutes: false,
83
- reloadBrowser: false,
84
- delegateToHmr: true,
85
- processorHandledAsset: false
86
- };
87
- }
88
- if (this.isExplicitServerViewFile(filePath)) {
89
- return {
90
- category: "explicit-server-view",
91
- invalidateServerModules: true,
92
- refreshRoutes: false,
93
- reloadBrowser: false,
94
- delegateToHmr: true,
95
- processorHandledAsset: false
96
- };
97
- }
98
- if (this.isRouteSourceFile(filePath)) {
99
- return {
100
- category: "route-source",
101
- invalidateServerModules: true,
102
- refreshRoutes: true,
103
- reloadBrowser: false,
104
- delegateToHmr: true,
105
- processorHandledAsset: false
106
- };
107
- }
108
- if (this.isProcessorOwnedAsset(filePath)) {
109
- return {
110
- category: "processor-owned-asset",
111
- invalidateServerModules: false,
112
- refreshRoutes: false,
113
- reloadBrowser: false,
114
- delegateToHmr: false,
115
- processorHandledAsset: true
116
- };
117
- }
118
- if (this.isServerModuleSourceFile(filePath)) {
119
- return {
120
- category: "server-source",
121
- invalidateServerModules: true,
122
- refreshRoutes: false,
123
- reloadBrowser: false,
124
- delegateToHmr: true,
125
- processorHandledAsset: false
126
- };
127
- }
128
- return {
129
- category: "other",
130
- invalidateServerModules: false,
131
- refreshRoutes: false,
132
- reloadBrowser: false,
133
- delegateToHmr: true,
134
- processorHandledAsset: false
135
- };
136
- }
137
- /**
138
- * Returns whether the file lives under the public directory.
139
- */
140
- isPublicDirFile(filePath) {
141
- return path.resolve(filePath).startsWith(this.appConfig.absolutePaths.publicDir);
142
- }
143
- /**
144
- * Returns whether the file matches `additionalWatchPaths`.
145
- */
146
- matchesAdditionalWatchPaths(filePath) {
147
- const normalizedPath = path.resolve(filePath);
148
- const patterns = this.appConfig.additionalWatchPaths;
149
- if (!patterns.length) return false;
150
- for (const pattern of patterns) {
151
- if (pattern.includes("*")) {
152
- const ext = pattern.replace(/\*\*?\/\*/, "");
153
- if (normalizedPath.endsWith(ext)) return true;
154
- } else if (normalizedPath.endsWith(pattern) || normalizedPath === path.resolve(pattern)) {
155
- return true;
156
- }
157
- }
158
- return false;
159
- }
160
- /**
161
- * Returns whether the file is a route source file.
162
- */
163
- isRouteSourceFile(filePath) {
164
- const resolvedPath = path.resolve(filePath);
165
- if (!resolvedPath.startsWith(this.appConfig.absolutePaths.pagesDir)) {
166
- return false;
167
- }
168
- if (this.appConfig.templatesExt.some((extension) => resolvedPath.endsWith(extension))) {
169
- return true;
170
- }
171
- return /\.(?:[cm]?ts|[jt]sx?|mdx)$/u.test(resolvedPath);
172
- }
173
- /**
174
- * Returns whether the file is an include/template source file.
175
- */
176
- isIncludeSourceFile(filePath) {
177
- const resolvedPath = path.resolve(filePath);
178
- if (!resolvedPath.startsWith(this.appConfig.absolutePaths.includesDir)) {
179
- return false;
180
- }
181
- if (this.appConfig.templatesExt.some((extension) => resolvedPath.endsWith(extension))) {
182
- return true;
183
- }
184
- return /\.(?:[cm]?ts|[jt]sx?|mdx)$/u.test(resolvedPath);
185
- }
186
- /**
187
- * Returns whether the file is an explicit server-rendered view module.
188
- *
189
- * @remarks
190
- * These modules are typically registered through `renderServerModule` in
191
- * `app.ts` rather than the filesystem router. They need a full browser reload
192
- * because their HTML is produced on the server, not through client HMR entrypoints.
193
- */
194
- isExplicitServerViewFile(filePath) {
195
- const resolvedPath = path.resolve(filePath);
196
- const viewsDir = path.join(this.appConfig.absolutePaths.srcDir, "views");
197
- if (resolvedPath !== viewsDir && !resolvedPath.startsWith(`${viewsDir}${path.sep}`)) {
198
- return false;
199
- }
200
- if (this.appConfig.templatesExt.some((extension) => resolvedPath.endsWith(extension))) {
201
- return true;
202
- }
203
- return /\.(?:[cm]?ts|[jt]sx?|mdx)$/u.test(resolvedPath);
204
- }
205
- /**
206
- * Returns whether the file is a server-executed source module outside the
207
- * special route/include buckets.
208
- */
209
- isServerModuleSourceFile(filePath) {
210
- const resolvedPath = path.resolve(filePath);
211
- if (!resolvedPath.startsWith(this.appConfig.absolutePaths.srcDir)) {
212
- return false;
213
- }
214
- if (this.appConfig.templatesExt.some((extension) => resolvedPath.endsWith(extension))) {
215
- return true;
216
- }
217
- return /\.(?:[cm]?ts|[jt]sx?|mdx)$/u.test(resolvedPath);
218
- }
219
- /**
220
- * Returns whether a processor owns the changed file as an asset input.
221
- *
222
- * @remarks
223
- * Watch config drives processor notifications only. Asset ownership requires
224
- * declared capabilities so dependency-only watches (for example content
225
- * collection MDX scans) do not skip server invalidation and HMR.
226
- */
227
- isProcessorOwnedAsset(filePath) {
228
- for (const processor of this.appConfig.processors.values()) {
229
- const capabilities = processor.getAssetCapabilities?.() ?? [];
230
- if (capabilities.length === 0) {
231
- continue;
232
- }
233
- const matchesConfiguredAsset = typeof processor.matchesFileFilter !== "function" || processor.matchesFileFilter(filePath);
234
- if (matchesConfiguredAsset && capabilities.some((capability) => processor.canProcessAsset?.(capability.kind, filePath))) {
235
- return true;
236
- }
237
- }
238
- return false;
239
- }
240
254
  }
241
- export {
242
- DevelopmentInvalidationService
243
- };