@ecopages/core 0.2.0-alpha.3 → 0.2.0-alpha.31

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 (436) hide show
  1. package/CHANGELOG.md +66 -66
  2. package/README.md +268 -14
  3. package/package.json +72 -108
  4. package/src/adapters/README.md +39 -0
  5. package/src/adapters/abstract/application-adapter.d.ts +28 -2
  6. package/src/adapters/abstract/application-adapter.js +14 -2
  7. package/src/adapters/abstract/router-adapter.d.ts +1 -1
  8. package/src/adapters/abstract/server-adapter.d.ts +2 -2
  9. package/src/adapters/bun/client-bridge.d.ts +1 -1
  10. package/src/adapters/bun/create-app.d.ts +5 -12
  11. package/src/adapters/bun/create-app.js +43 -7
  12. package/src/adapters/bun/hmr-manager.d.ts +72 -26
  13. package/src/adapters/bun/hmr-manager.js +153 -81
  14. package/src/adapters/bun/index.d.ts +2 -3
  15. package/src/adapters/bun/index.js +3 -3
  16. package/src/adapters/bun/server-adapter.d.ts +5 -5
  17. package/src/adapters/bun/server-adapter.js +63 -38
  18. package/src/adapters/bun/server-lifecycle.d.ts +28 -17
  19. package/src/adapters/bun/server-lifecycle.js +34 -62
  20. package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
  21. package/src/{create-app.js → adapters/create-app.js} +4 -4
  22. package/src/adapters/index.d.ts +2 -6
  23. package/src/adapters/index.js +2 -8
  24. package/src/adapters/node/create-app.d.ts +6 -9
  25. package/src/adapters/node/create-app.js +12 -6
  26. package/src/adapters/node/node-client-bridge.d.ts +1 -1
  27. package/src/adapters/node/node-hmr-manager.d.ts +79 -21
  28. package/src/adapters/node/node-hmr-manager.js +167 -114
  29. package/src/adapters/node/server-adapter.d.ts +7 -35
  30. package/src/adapters/node/server-adapter.js +55 -107
  31. package/src/adapters/node/static-content-server.d.ts +37 -1
  32. package/src/adapters/node/static-content-server.js +29 -1
  33. package/src/adapters/shared/application-adapter.d.ts +1 -1
  34. package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
  35. package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
  36. package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
  37. package/src/adapters/shared/explicit-static-route-matcher.d.ts +7 -4
  38. package/src/adapters/shared/explicit-static-route-matcher.js +14 -13
  39. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
  40. package/src/adapters/shared/file-route-middleware-pipeline.js +3 -11
  41. package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
  42. package/src/adapters/shared/fs-server-response-factory.js +11 -27
  43. package/src/adapters/shared/fs-server-response-matcher.d.ts +20 -16
  44. package/src/adapters/shared/fs-server-response-matcher.js +76 -45
  45. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  46. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  47. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  48. package/src/adapters/shared/hmr-html-response.js +32 -0
  49. package/src/adapters/shared/render-context.d.ts +4 -3
  50. package/src/adapters/shared/render-context.js +6 -3
  51. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  52. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  53. package/src/adapters/shared/server-adapter.d.ts +33 -12
  54. package/src/adapters/shared/server-adapter.js +208 -132
  55. package/src/adapters/shared/server-route-handler.d.ts +5 -5
  56. package/src/adapters/shared/server-route-handler.js +7 -16
  57. package/src/adapters/shared/server-static-builder.d.ts +41 -8
  58. package/src/adapters/shared/server-static-builder.js +65 -11
  59. package/src/build/README.md +107 -0
  60. package/src/build/build-adapter.d.ts +168 -3
  61. package/src/build/build-adapter.js +604 -16
  62. package/src/build/build-manifest.d.ts +27 -0
  63. package/src/build/build-manifest.js +30 -0
  64. package/src/build/dev-build-coordinator.d.ts +72 -0
  65. package/src/build/dev-build-coordinator.js +154 -0
  66. package/src/build/esbuild-build-adapter.d.ts +15 -6
  67. package/src/build/esbuild-build-adapter.js +189 -74
  68. package/src/build/runtime-build-executor.d.ts +14 -0
  69. package/src/build/runtime-build-executor.js +22 -0
  70. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  71. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  72. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  73. package/src/build/runtime-specifier-aliases.js +95 -0
  74. package/src/config/README.md +36 -0
  75. package/src/config/config-builder.d.ts +54 -29
  76. package/src/config/config-builder.js +255 -49
  77. package/src/{constants.d.ts → config/constants.d.ts} +13 -0
  78. package/src/{constants.js → config/constants.js} +4 -0
  79. package/src/declarations.d.ts +19 -14
  80. package/src/dev/host-runtime.d.ts +10 -0
  81. package/src/dev/host-runtime.js +24 -0
  82. package/src/dev/sc-server.d.ts +1 -1
  83. package/src/dev/sc-server.js +1 -1
  84. package/src/eco/README.md +70 -16
  85. package/src/eco/eco.browser.d.ts +2 -0
  86. package/src/eco/eco.browser.js +83 -0
  87. package/src/eco/eco.js +32 -57
  88. package/src/eco/eco.types.d.ts +14 -6
  89. package/src/eco/eco.utils.d.ts +1 -40
  90. package/src/eco/eco.utils.js +5 -35
  91. package/src/eco/global-injector-map.d.ts +3 -3
  92. package/src/eco/global-injector-map.js +2 -2
  93. package/src/eco/lazy-injector-map.d.ts +2 -2
  94. package/src/errors/index.d.ts +1 -0
  95. package/src/errors/index.js +3 -1
  96. package/src/hmr/README.md +26 -0
  97. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  98. package/src/hmr/client/hmr-runtime.js +38 -7
  99. package/src/hmr/hmr-strategy.d.ts +16 -13
  100. package/src/hmr/hmr-strategy.js +22 -7
  101. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  102. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  103. package/src/hmr/hmr.test.e2e.js +26 -33
  104. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  105. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  106. package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -48
  107. package/src/hmr/strategies/js-hmr-strategy.js +64 -74
  108. package/src/index.browser.d.ts +2 -2
  109. package/src/index.browser.js +1 -1
  110. package/src/index.d.ts +4 -3
  111. package/src/index.js +16 -5
  112. package/src/integrations/ghtml/ghtml-renderer.d.ts +3 -2
  113. package/src/integrations/ghtml/ghtml-renderer.js +27 -30
  114. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  115. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  116. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  117. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  118. package/src/plugins/README.md +35 -0
  119. package/src/plugins/alias-resolver-plugin.js +17 -3
  120. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  121. package/src/plugins/eco-component-meta-plugin.js +27 -22
  122. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  123. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  124. package/src/plugins/integration-plugin.d.ts +142 -29
  125. package/src/plugins/integration-plugin.js +103 -14
  126. package/src/plugins/processor.d.ts +17 -2
  127. package/src/plugins/processor.js +22 -3
  128. package/src/plugins/runtime-capability.d.ts +9 -0
  129. package/src/plugins/source-transform.d.ts +46 -0
  130. package/src/plugins/source-transform.js +71 -0
  131. package/src/route-renderer/GRAPH.md +83 -325
  132. package/src/route-renderer/README.md +73 -90
  133. package/src/route-renderer/orchestration/component-render-context.d.ts +89 -0
  134. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  135. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
  136. package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
  137. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +108 -0
  138. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +206 -0
  139. package/src/route-renderer/orchestration/integration-renderer.d.ts +516 -0
  140. package/src/route-renderer/orchestration/integration-renderer.js +909 -0
  141. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
  142. package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
  143. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
  144. package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
  145. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +2 -0
  146. package/src/route-renderer/orchestration/processed-asset-dedupe.js +23 -0
  147. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +90 -0
  148. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +158 -0
  149. package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
  150. package/src/route-renderer/orchestration/render-output.utils.js +171 -0
  151. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +120 -0
  152. package/src/route-renderer/orchestration/route-render-orchestrator.js +388 -0
  153. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  154. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  155. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
  156. package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
  157. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
  158. package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
  159. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  160. package/src/route-renderer/page-loading/dependency-resolver.js +115 -0
  161. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
  162. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
  163. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
  164. package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
  165. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
  166. package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
  167. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
  168. package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
  169. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
  170. package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
  171. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
  172. package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
  173. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  174. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
  175. package/src/route-renderer/route-renderer.d.ts +57 -14
  176. package/src/route-renderer/route-renderer.js +30 -18
  177. package/src/router/README.md +94 -0
  178. package/src/router/client/link-intent.d.ts +53 -0
  179. package/src/router/client/link-intent.js +34 -0
  180. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  181. package/src/router/client/link-intent.test.browser.js +43 -0
  182. package/src/router/client/navigation-coordinator.d.ts +169 -0
  183. package/src/router/client/navigation-coordinator.js +215 -0
  184. package/src/router/server/route-registry.d.ts +78 -0
  185. package/src/router/server/route-registry.js +262 -0
  186. package/src/services/README.md +28 -0
  187. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  188. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  189. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
  190. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +124 -89
  191. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  192. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  193. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +16 -1
  194. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  195. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
  196. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  197. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  198. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
  199. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
  200. package/src/services/assets/asset-processing-service/index.d.ts +6 -0
  201. package/src/services/assets/asset-processing-service/index.js +6 -0
  202. package/src/services/assets/asset-processing-service/page-package.d.ts +3 -0
  203. package/src/services/assets/asset-processing-service/page-package.js +74 -0
  204. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  205. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  206. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  207. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +11 -5
  208. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
  209. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
  210. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  211. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  212. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +3 -2
  213. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +119 -0
  214. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  215. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +28 -7
  216. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
  217. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +12 -7
  218. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
  219. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +59 -0
  220. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  221. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +9 -3
  222. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
  223. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
  224. package/src/services/assets/browser-bundle.service.d.ts +73 -0
  225. package/src/services/assets/browser-bundle.service.js +41 -0
  226. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  227. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  228. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  229. package/src/services/html/html-rewriter-provider.service.js +68 -0
  230. package/src/services/html/html-transformer.service.d.ts +87 -0
  231. package/src/services/html/html-transformer.service.js +216 -0
  232. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  233. package/src/services/invalidation/development-invalidation.service.js +190 -0
  234. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  235. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  236. package/src/services/module-loading/app-server-module-transpiler.service.js +115 -0
  237. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  238. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  239. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  240. package/src/services/module-loading/module-loading-types.js +0 -0
  241. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  242. package/src/services/module-loading/node-bootstrap-plugin.js +216 -0
  243. package/src/services/module-loading/page-module-import.service.d.ts +76 -0
  244. package/src/services/module-loading/page-module-import.service.js +170 -0
  245. package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
  246. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  247. package/src/services/module-loading/source-module-support.d.ts +5 -0
  248. package/src/services/module-loading/source-module-support.js +8 -0
  249. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  250. package/src/services/runtime-state/dev-graph.service.js +162 -0
  251. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  252. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  253. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  254. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  255. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  256. package/src/static-site-generator/README.md +26 -0
  257. package/src/static-site-generator/static-site-generator.d.ts +67 -20
  258. package/src/static-site-generator/static-site-generator.js +182 -138
  259. package/src/{internal-types.d.ts → types/internal-types.d.ts} +62 -30
  260. package/src/types/internal-types.js +0 -0
  261. package/src/{public-types.d.ts → types/public-types.d.ts} +201 -32
  262. package/src/types/public-types.js +0 -0
  263. package/src/utils/html-escaping.d.ts +7 -0
  264. package/src/utils/html-escaping.js +6 -0
  265. package/src/utils/locals-utils.d.ts +1 -1
  266. package/src/utils/parse-cli-args.d.ts +4 -1
  267. package/src/utils/parse-cli-args.js +16 -1
  268. package/src/utils/resolve-work-dir.d.ts +11 -0
  269. package/src/utils/resolve-work-dir.js +31 -0
  270. package/src/watchers/project-watcher.d.ts +40 -29
  271. package/src/watchers/project-watcher.js +126 -116
  272. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  273. package/src/watchers/project-watcher.test-helpers.js +6 -6
  274. package/src/adapters/abstract/application-adapter.ts +0 -337
  275. package/src/adapters/abstract/router-adapter.ts +0 -30
  276. package/src/adapters/abstract/server-adapter.ts +0 -79
  277. package/src/adapters/bun/client-bridge.ts +0 -62
  278. package/src/adapters/bun/create-app.ts +0 -189
  279. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  280. package/src/adapters/bun/define-api-handler.ts +0 -114
  281. package/src/adapters/bun/hmr-manager.ts +0 -296
  282. package/src/adapters/bun/index.ts +0 -3
  283. package/src/adapters/bun/server-adapter.ts +0 -492
  284. package/src/adapters/bun/server-lifecycle.ts +0 -154
  285. package/src/adapters/index.ts +0 -6
  286. package/src/adapters/node/create-app.ts +0 -179
  287. package/src/adapters/node/index.d.ts +0 -4
  288. package/src/adapters/node/index.js +0 -8
  289. package/src/adapters/node/index.ts +0 -9
  290. package/src/adapters/node/node-client-bridge.ts +0 -79
  291. package/src/adapters/node/node-hmr-manager.ts +0 -289
  292. package/src/adapters/node/server-adapter.ts +0 -561
  293. package/src/adapters/node/static-content-server.ts +0 -203
  294. package/src/adapters/shared/api-response.ts +0 -104
  295. package/src/adapters/shared/application-adapter.ts +0 -199
  296. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  297. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  298. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  299. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  300. package/src/adapters/shared/render-context.ts +0 -105
  301. package/src/adapters/shared/server-adapter.ts +0 -442
  302. package/src/adapters/shared/server-route-handler.ts +0 -166
  303. package/src/adapters/shared/server-static-builder.ts +0 -82
  304. package/src/build/build-adapter.ts +0 -132
  305. package/src/build/build-types.ts +0 -83
  306. package/src/build/esbuild-build-adapter.ts +0 -510
  307. package/src/config/config-builder.ts +0 -474
  308. package/src/constants.ts +0 -39
  309. package/src/create-app.ts +0 -87
  310. package/src/define-api-handler.js +0 -15
  311. package/src/define-api-handler.ts +0 -66
  312. package/src/dev/sc-server.ts +0 -143
  313. package/src/eco/component-render-context.d.ts +0 -105
  314. package/src/eco/component-render-context.js +0 -77
  315. package/src/eco/component-render-context.ts +0 -202
  316. package/src/eco/eco.ts +0 -221
  317. package/src/eco/eco.types.ts +0 -202
  318. package/src/eco/eco.utils.ts +0 -89
  319. package/src/eco/global-injector-map.ts +0 -112
  320. package/src/eco/lazy-injector-map.ts +0 -120
  321. package/src/eco/module-dependencies.ts +0 -75
  322. package/src/errors/http-error.ts +0 -72
  323. package/src/errors/index.ts +0 -2
  324. package/src/errors/locals-access-error.ts +0 -7
  325. package/src/global/app-logger.ts +0 -4
  326. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
  327. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  328. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  329. package/src/hmr/client/hmr-runtime.ts +0 -121
  330. package/src/hmr/hmr-strategy.ts +0 -172
  331. package/src/hmr/hmr.test.e2e.ts +0 -75
  332. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  333. package/src/hmr/strategies/js-hmr-strategy.ts +0 -320
  334. package/src/index.browser.ts +0 -3
  335. package/src/index.ts +0 -5
  336. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  337. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  338. package/src/internal-types.ts +0 -212
  339. package/src/plugins/alias-resolver-plugin.ts +0 -45
  340. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  341. package/src/plugins/integration-plugin.ts +0 -184
  342. package/src/plugins/processor.ts +0 -220
  343. package/src/public-types.ts +0 -1260
  344. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  345. package/src/route-renderer/component-graph-executor.js +0 -31
  346. package/src/route-renderer/component-graph-executor.ts +0 -84
  347. package/src/route-renderer/component-graph.d.ts +0 -42
  348. package/src/route-renderer/component-graph.js +0 -72
  349. package/src/route-renderer/component-graph.ts +0 -159
  350. package/src/route-renderer/component-marker.d.ts +0 -52
  351. package/src/route-renderer/component-marker.js +0 -46
  352. package/src/route-renderer/component-marker.ts +0 -117
  353. package/src/route-renderer/dependency-resolver.js +0 -428
  354. package/src/route-renderer/dependency-resolver.ts +0 -596
  355. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  356. package/src/route-renderer/html-post-processing.service.js +0 -86
  357. package/src/route-renderer/html-post-processing.service.ts +0 -103
  358. package/src/route-renderer/integration-renderer.d.ts +0 -339
  359. package/src/route-renderer/integration-renderer.js +0 -526
  360. package/src/route-renderer/integration-renderer.ts +0 -696
  361. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  362. package/src/route-renderer/marker-graph-resolver.js +0 -93
  363. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  364. package/src/route-renderer/page-module-loader.d.ts +0 -61
  365. package/src/route-renderer/page-module-loader.ts +0 -153
  366. package/src/route-renderer/render-execution.service.d.ts +0 -69
  367. package/src/route-renderer/render-execution.service.js +0 -91
  368. package/src/route-renderer/render-execution.service.ts +0 -158
  369. package/src/route-renderer/render-preparation.service.d.ts +0 -112
  370. package/src/route-renderer/render-preparation.service.js +0 -243
  371. package/src/route-renderer/render-preparation.service.ts +0 -358
  372. package/src/route-renderer/route-renderer.ts +0 -80
  373. package/src/router/fs-router-scanner.d.ts +0 -41
  374. package/src/router/fs-router-scanner.js +0 -155
  375. package/src/router/fs-router-scanner.ts +0 -217
  376. package/src/router/fs-router.d.ts +0 -26
  377. package/src/router/fs-router.js +0 -100
  378. package/src/router/fs-router.ts +0 -122
  379. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  380. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  381. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  382. package/src/services/asset-processing-service/assets.types.ts +0 -112
  383. package/src/services/asset-processing-service/index.d.ts +0 -3
  384. package/src/services/asset-processing-service/index.js +0 -3
  385. package/src/services/asset-processing-service/index.ts +0 -3
  386. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  387. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  388. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  389. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
  390. package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
  391. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  392. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  393. package/src/services/asset-processing-service/processors/index.js +0 -5
  394. package/src/services/asset-processing-service/processors/index.ts +0 -5
  395. package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
  396. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  397. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  398. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  399. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  400. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  401. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  402. package/src/services/cache/cache.types.ts +0 -126
  403. package/src/services/cache/index.ts +0 -18
  404. package/src/services/cache/memory-cache-store.ts +0 -130
  405. package/src/services/cache/page-cache-service.ts +0 -202
  406. package/src/services/html-transformer.service.d.ts +0 -50
  407. package/src/services/html-transformer.service.js +0 -163
  408. package/src/services/html-transformer.service.ts +0 -217
  409. package/src/services/page-module-import.service.d.ts +0 -37
  410. package/src/services/page-module-import.service.js +0 -88
  411. package/src/services/page-module-import.service.ts +0 -129
  412. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  413. package/src/services/schema-validation-service.ts +0 -204
  414. package/src/services/validation/standard-schema.types.ts +0 -68
  415. package/src/static-site-generator/static-site-generator.ts +0 -359
  416. package/src/utils/css.d.ts +0 -1
  417. package/src/utils/css.js +0 -7
  418. package/src/utils/css.ts +0 -5
  419. package/src/utils/deep-merge.ts +0 -47
  420. package/src/utils/hash.ts +0 -5
  421. package/src/utils/html.ts +0 -1
  422. package/src/utils/invariant.ts +0 -15
  423. package/src/utils/locals-utils.ts +0 -37
  424. package/src/utils/parse-cli-args.ts +0 -83
  425. package/src/utils/path-utils.module.ts +0 -14
  426. package/src/utils/runtime.ts +0 -44
  427. package/src/utils/server-utils.module.ts +0 -67
  428. package/src/watchers/project-watcher.test-helpers.ts +0 -41
  429. package/src/watchers/project-watcher.ts +0 -344
  430. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  431. /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
  432. /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
  433. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  434. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  435. /package/src/{public-types.js → services/module-loading/app-module-loader.service.js} +0 -0
  436. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -1,15 +0,0 @@
1
- /**
2
- * This module contains a simple utility invariant function that throws an error if the condition is not met
3
- * @module
4
- */
5
-
6
- const prefix = '[ecopages]';
7
-
8
- export function invariant(condition: boolean, message?: string): asserts condition {
9
- if (condition) {
10
- return;
11
- }
12
-
13
- const value = message ? `${prefix} ${message}` : `${prefix} An error occurred`;
14
- throw new Error(value);
15
- }
@@ -1,37 +0,0 @@
1
- import type { ApiHandlerContext } from '../public-types.ts';
2
-
3
- /**
4
- * Creates a require function for validating and retrieving request locals.
5
- * Supports both single key access and multiple keys with type safety.
6
- *
7
- * @param getLocals - Function that returns the current locals object
8
- * @returns A require function that throws the onMissing response if keys are not found
9
- *
10
- * @example
11
- * ```ts
12
- * const require = createRequire(() => context.locals);
13
- * const userId = require('userId', () => new Response('Unauthorized', { status: 401 }));
14
- * ```
15
- */
16
- export function createRequire(getLocals: () => Record<string, unknown>): ApiHandlerContext['require'] {
17
- return (keyOrKeys: string | readonly string[], onMissing: () => Response) => {
18
- const locals = getLocals();
19
- if (Array.isArray(keyOrKeys)) {
20
- const result: Record<string, unknown> = {};
21
- for (const key of keyOrKeys) {
22
- const value = locals[key];
23
- if (value === undefined || value === null) {
24
- throw onMissing();
25
- }
26
- result[key] = value;
27
- }
28
- return result;
29
- }
30
-
31
- const value = locals[keyOrKeys as string];
32
- if (value === undefined || value === null) {
33
- throw onMissing();
34
- }
35
- return value;
36
- };
37
- }
@@ -1,83 +0,0 @@
1
- import { parseArgs } from 'node:util';
2
- import { getRuntimeArgv } from './runtime.ts';
3
-
4
- /**
5
- * Parsed command line arguments for the Ecopages server.
6
- * @property preview - Whether to run in preview mode
7
- * @property build - Whether to run a static build
8
- * @property start - Whether to start the server
9
- * @property dev - Whether to run in development mode
10
- * @property port - Optional port number
11
- * @property hostname - Optional hostname
12
- * @property reactFastRefresh - Whether React Fast Refresh is enabled
13
- */
14
- export type ReturnParseCliArgs = {
15
- preview: boolean;
16
- build: boolean;
17
- start: boolean;
18
- dev: boolean;
19
- port?: number;
20
- hostname?: string;
21
- reactFastRefresh?: boolean;
22
- };
23
-
24
- const ECOPAGES_BIN_FILES = ['ecopages.ts', 'ecopages.js', 'cli.js'];
25
-
26
- const ECOPAGES_AVAILABLE_COMMANDS = ['dev', 'build', 'start', 'preview'];
27
-
28
- /**
29
- * Parses command line arguments for the server.
30
- * It returns {@link ReturnParseCliArgs}
31
- */
32
- export function parseCliArgs(): ReturnParseCliArgs {
33
- const runtimeArgv = getRuntimeArgv();
34
-
35
- const { values } = parseArgs({
36
- args: runtimeArgv,
37
- options: {
38
- dev: { type: 'boolean' },
39
- preview: { type: 'boolean' },
40
- build: { type: 'boolean' },
41
- port: { type: 'string' },
42
- hostname: { type: 'string' },
43
- 'react-fast-refresh': { type: 'boolean' },
44
- },
45
- allowPositionals: true,
46
- });
47
-
48
- let command = '';
49
- const ecopagesIndex = runtimeArgv.findIndex((arg) => ECOPAGES_BIN_FILES.some((filename) => arg.endsWith(filename)));
50
-
51
- const isAvailableCommand = ecopagesIndex !== -1;
52
-
53
- if (isAvailableCommand) {
54
- command =
55
- ecopagesIndex < runtimeArgv.length - 1 &&
56
- ECOPAGES_AVAILABLE_COMMANDS.some((cmd) => {
57
- return runtimeArgv[ecopagesIndex + 1] === cmd;
58
- })
59
- ? runtimeArgv[ecopagesIndex + 1]
60
- : 'start';
61
- }
62
-
63
- const isStartCommand = command === 'start' || (!values.dev && !values.build && !values.preview);
64
- const isDevCommand = command === 'dev' || !!values.dev;
65
- const isBuildCommand = command === 'build' || !!values.build;
66
- const isPreviewCommand = command === 'preview' || !!values.preview;
67
-
68
- const parsedCommandOptions = {
69
- preview: isPreviewCommand,
70
- build: isBuildCommand,
71
- start: isStartCommand,
72
- dev: isDevCommand,
73
- port: values.port ? Number(values.port) : undefined,
74
- hostname: values.hostname,
75
- reactFastRefresh: values['react-fast-refresh'],
76
- };
77
-
78
- if (!process.env.NODE_ENV) {
79
- process.env.NODE_ENV = isDevCommand ? 'development' : 'production';
80
- }
81
-
82
- return parsedCommandOptions;
83
- }
@@ -1,14 +0,0 @@
1
- import path from 'node:path';
2
-
3
- function getEcoTemplateExtension(filePath: string) {
4
- const { name, ext } = path.parse(filePath);
5
- const nameParts = name.split('.');
6
- const descriptor = nameParts.length > 1 ? nameParts.pop() : undefined;
7
- const templateExtension = descriptor ? `.${descriptor}${ext}` : ext;
8
-
9
- return templateExtension;
10
- }
11
-
12
- export const PathUtils = {
13
- getEcoTemplateExtension,
14
- };
@@ -1,44 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
-
3
- export const RUNTIME_ERRORS = {
4
- BUN_RUNTIME_REQUIRED: 'Bun runtime is required',
5
- } as const;
6
-
7
- type RuntimeBun = typeof Bun;
8
-
9
- export function getBunRuntime(): RuntimeBun | undefined {
10
- return (globalThis as { Bun?: RuntimeBun }).Bun;
11
- }
12
-
13
- export function getRequiredBunRuntime(): RuntimeBun {
14
- const bun = getBunRuntime();
15
-
16
- if (!bun) {
17
- throw new Error(RUNTIME_ERRORS.BUN_RUNTIME_REQUIRED);
18
- }
19
-
20
- return bun;
21
- }
22
-
23
- export function getRuntimeArgv(): string[] {
24
- return process.argv;
25
- }
26
-
27
- export function isDevelopmentRuntime(): boolean {
28
- return process.env.NODE_ENV === 'development';
29
- }
30
-
31
- export function isProductionRuntime(): boolean {
32
- return process.env.NODE_ENV === 'production';
33
- }
34
-
35
- export function runtimeHash(content: string | Buffer<ArrayBufferLike>): number | bigint {
36
- const bun = getBunRuntime();
37
-
38
- if (bun) {
39
- return bun.hash(content);
40
- }
41
-
42
- const hex = createHash('sha256').update(content).digest('hex').slice(0, 16);
43
- return BigInt(`0x${hex}`);
44
- }
@@ -1,67 +0,0 @@
1
- const ContentTypeMap = new Map<string, string>([
2
- ['jpg', 'image/jpeg'],
3
- ['jpeg', 'image/jpeg'],
4
- ['png', 'image/png'],
5
- ['gif', 'image/gif'],
6
- ['bmp', 'image/bmp'],
7
- ['svg', 'image/svg+xml'],
8
- ['tiff', 'image/tiff'],
9
- ['webp', 'image/webp'],
10
- ['avif', 'image/avif'],
11
- ['ico', 'image/x-icon'],
12
- ['mp3', 'audio/mpeg'],
13
- ['ogg', 'audio/ogg'],
14
- ['wav', 'audio/wav'],
15
- ['mp4', 'video/mp4'],
16
- ['webm', 'video/webm'],
17
- ['ogv', 'video/ogg'],
18
- ['mov', 'video/quicktime'],
19
- ['txt', 'text/plain'],
20
- ['html', 'text/html'],
21
- ['css', 'text/css'],
22
- ['js', 'text/javascript'],
23
- ['mjs', 'text/javascript'],
24
- ['json', 'application/json'],
25
- ['map', 'application/json'],
26
- ['xml', 'application/xml'],
27
- ['webmanifest', 'application/manifest+json'],
28
- ['wasm', 'application/wasm'],
29
- ['csv', 'text/csv'],
30
- ['ttf', 'font/ttf'],
31
- ['woff', 'font/woff'],
32
- ['woff2', 'font/woff2'],
33
- ['otf', 'font/otf'],
34
- ['eot', 'application/vnd.ms-fontobject'],
35
- ['gz', 'application/x-gzip'],
36
- ['zip', 'application/zip'],
37
- ['pdf', 'application/pdf'],
38
- ['doc', 'application/msword'],
39
- ]);
40
-
41
- /**
42
- * Get the content type of a file based on its extension.
43
- * @param file - The file name.
44
- * @returns The content type.
45
- */
46
- export const getContentType = (file: string): string => {
47
- const extension = file.split('.').pop() || 'txt';
48
- return ContentTypeMap.get(extension) || 'text/plain';
49
- };
50
-
51
- /**
52
- * Check if a file path has a known static file extension.
53
- * @param file - The file name or path.
54
- * @returns true if the extension is recognized.
55
- */
56
- export const hasKnownExtension = (file: string): boolean => {
57
- const extension = file.split('.').pop();
58
- return extension !== undefined && ContentTypeMap.has(extension);
59
- };
60
-
61
- /**
62
- * A module for server utilities.
63
- */
64
- export const ServerUtils = {
65
- getContentType,
66
- hasKnownExtension,
67
- };
@@ -1,41 +0,0 @@
1
- import { vi } from 'vitest';
2
- import type { IHmrManager } from '../internal-types';
3
- import type { ClientBridge } from '../adapters/bun/client-bridge';
4
-
5
- export const createMockHmrManager = (): IHmrManager =>
6
- ({
7
- handleFileChange: vi.fn(async () => {}),
8
- broadcast: vi.fn(() => {}),
9
- setEnabled: vi.fn(() => {}),
10
- setPlugins: vi.fn(() => {}),
11
- registerEntrypoint: vi.fn(async () => ''),
12
- registerSpecifierMap: vi.fn(() => {}),
13
- registerStrategy: vi.fn(() => {}),
14
- isEnabled: vi.fn(() => true),
15
- canHandleFileChange: vi.fn(() => true),
16
- getOutputUrl: vi.fn(() => undefined),
17
- getWatchedFiles: vi.fn(() => new Map()),
18
- getSpecifierMap: vi.fn(() => new Map()),
19
- getDistDir: vi.fn(() => ''),
20
- getPlugins: vi.fn(() => []),
21
- getDefaultContext: vi.fn(() => ({
22
- getWatchedFiles: () => new Map(),
23
- getSpecifierMap: () => new Map(),
24
- getDistDir: () => '',
25
- getPlugins: () => [],
26
- getSrcDir: () => '',
27
- getLayoutsDir: () => '',
28
- })),
29
- }) as unknown as IHmrManager;
30
-
31
- export const createMockBridge = (): ClientBridge =>
32
- ({
33
- reload: vi.fn(() => {}),
34
- error: vi.fn(() => {}),
35
- cssUpdate: vi.fn(() => {}),
36
- update: vi.fn(() => {}),
37
- subscribe: vi.fn(() => {}),
38
- unsubscribe: vi.fn(() => {}),
39
- broadcast: vi.fn(() => {}),
40
- subscriberCount: 0,
41
- }) as unknown as ClientBridge;
@@ -1,344 +0,0 @@
1
- import path from 'node:path';
2
- import chokidar, { type FSWatcher } from 'chokidar';
3
- import { fileSystem } from '@ecopages/file-system';
4
- import { appLogger } from '../global/app-logger.ts';
5
- import type { EcoPagesAppConfig, IHmrManager, IClientBridge } from '../internal-types.ts';
6
- import type { ProcessorWatchContext } from '../plugins/processor.ts';
7
-
8
- /**
9
- * Configuration options for the ProjectWatcher
10
- * @interface ProjectWatcherConfig
11
- * @property {EcoPagesAppConfig} config - The application configuration
12
- * @property {() => void} refreshRouterRoutesCallback - Callback to refresh router routes
13
- * @property {IHmrManager} hmrManager - The HMR manager instance
14
- * @property {ClientBridge} bridge - The client bridge instance
15
- */
16
- export interface ProjectWatcherConfig {
17
- config: EcoPagesAppConfig;
18
- refreshRouterRoutesCallback: () => void;
19
- hmrManager: IHmrManager;
20
- bridge: IClientBridge;
21
- }
22
-
23
- /**
24
- * ProjectWatcher handles file system changes for hot module replacement (HMR).
25
- * It uses chokidar to watch for file changes and triggers appropriate actions:
26
- * - Uncaches modules when files change
27
- * - Refreshes router routes for page files
28
- * - Triggers HMR server reload
29
- * - Handles processor-specific file changes
30
- *
31
- * The watcher uses chokidar's built-in debouncing through `awaitWriteFinish`
32
- * to handle rapid file changes efficiently:
33
- * - stabilityThreshold: 50ms - Time to wait for writes to stabilize
34
- * - pollInterval: 50ms - Interval to poll for file changes
35
- *
36
- * @class ProjectWatcher
37
- */
38
- export class ProjectWatcher {
39
- /**
40
- * Duplicate identical watcher events within this window are ignored.
41
- *
42
- * Some editors or save pipelines emit two near-identical filesystem change
43
- * notifications for the same file. Ecopages should treat those as one logical
44
- * update so HMR and route refresh work are not repeated unnecessarily.
45
- */
46
- private static readonly duplicateChangeWindowMs = 150;
47
- private appConfig: EcoPagesAppConfig;
48
- private refreshRouterRoutesCallback: () => void;
49
- private hmrManager: IHmrManager;
50
- private bridge: IClientBridge;
51
- private watcher: FSWatcher | null = null;
52
- private lastHandledChange = new Map<string, number>();
53
-
54
- constructor({ config, refreshRouterRoutesCallback, hmrManager, bridge }: ProjectWatcherConfig) {
55
- this.appConfig = config;
56
- this.refreshRouterRoutesCallback = refreshRouterRoutesCallback;
57
- this.hmrManager = hmrManager;
58
- this.bridge = bridge;
59
- this.triggerRouterRefresh = this.triggerRouterRefresh.bind(this);
60
- this.handleError = this.handleError.bind(this);
61
- this.handleFileChange = this.handleFileChange.bind(this);
62
- }
63
-
64
- /**
65
- * Uncaches modules in the source directory to ensure fresh imports.
66
- * This is necessary for hot module replacement to work correctly.
67
- * @private
68
- */
69
- private uncacheModules(): void {
70
- if (typeof require === 'undefined') return;
71
-
72
- const { srcDir, rootDir } = this.appConfig;
73
- const regex = new RegExp(`${rootDir}/${srcDir}/.*`);
74
-
75
- for (const key in require.cache) {
76
- if (regex.test(key)) {
77
- delete require.cache[key];
78
- }
79
- }
80
- }
81
-
82
- /**
83
- * Handles public directory file changes by copying only the changed file.
84
- * @param filePath - Absolute path of the changed file
85
- */
86
- private async handlePublicDirFileChange(filePath: string): Promise<void> {
87
- try {
88
- const relativePath = path.relative(this.appConfig.absolutePaths.publicDir, filePath);
89
- const destPath = path.join(this.appConfig.absolutePaths.distDir, relativePath);
90
-
91
- if (fileSystem.exists(filePath)) {
92
- const destDir = path.dirname(destPath);
93
- fileSystem.ensureDir(destDir);
94
- await fileSystem.copyFileAsync(filePath, destPath);
95
- }
96
-
97
- this.bridge.reload();
98
- } catch (error) {
99
- appLogger.error(`Failed to copy public file: ${error instanceof Error ? error.message : String(error)}`);
100
- this.bridge.reload();
101
- }
102
- }
103
-
104
- /**
105
- * Handles file changes by uncaching modules, refreshing routes, and delegating appropriately.
106
- * Follows 4-rule priority:
107
- * 0. Public directory match? → copy file and reload
108
- * 1. additionalWatchPaths match? → reload
109
- * 2. Processor extension match? → processor handles (skip HMR)
110
- * 3. Otherwise → HMR strategies
111
- *
112
- * Duplicate identical watcher events for the same file are coalesced within a
113
- * short window before any of the priority rules run.
114
- * @param rawPath - Path of the changed file
115
- */
116
- private async handleFileChange(rawPath: string): Promise<void> {
117
- const filePath = path.resolve(rawPath);
118
- const now = Date.now();
119
- const lastHandledAt = this.lastHandledChange.get(filePath);
120
- if (lastHandledAt !== undefined && now - lastHandledAt < ProjectWatcher.duplicateChangeWindowMs) {
121
- return;
122
- }
123
- this.lastHandledChange.set(filePath, now);
124
-
125
- try {
126
- if (this.isPublicDirFile(filePath)) {
127
- await this.handlePublicDirFileChange(filePath);
128
- return;
129
- }
130
-
131
- this.uncacheModules();
132
- const isPageFile = filePath.startsWith(this.appConfig.absolutePaths.pagesDir);
133
-
134
- if (isPageFile) {
135
- this.refreshRouterRoutesCallback();
136
- }
137
-
138
- if (this.matchesAdditionalWatchPaths(filePath)) {
139
- this.bridge.reload();
140
- return;
141
- }
142
-
143
- if (this.isHandledByProcessor(filePath)) {
144
- return;
145
- }
146
-
147
- if (this.isWatchedByProcessor(filePath) && !this.hmrManager.canHandleFileChange(filePath)) {
148
- this.hmrManager.broadcast({ type: 'layout-update' });
149
- return;
150
- }
151
-
152
- await this.hmrManager.handleFileChange(filePath);
153
- } catch (error) {
154
- if (error instanceof Error) {
155
- this.bridge.error(error.message);
156
- this.handleError(error);
157
- }
158
- }
159
- }
160
-
161
- /**
162
- * Checks if a file is in the public directory.
163
- */
164
- private isPublicDirFile(filePath: string): boolean {
165
- return filePath.startsWith(this.appConfig.absolutePaths.publicDir);
166
- }
167
-
168
- /**
169
- * Checks if file path matches any additionalWatchPaths patterns.
170
- */
171
- private matchesAdditionalWatchPaths(filePath: string): boolean {
172
- const patterns = this.appConfig.additionalWatchPaths;
173
- if (!patterns.length) return false;
174
-
175
- for (const pattern of patterns) {
176
- if (pattern.includes('*')) {
177
- const ext = pattern.replace(/\*\*?\/\*/, '');
178
- if (filePath.endsWith(ext)) return true;
179
- } else {
180
- if (filePath.endsWith(pattern) || filePath === path.resolve(pattern)) return true;
181
- }
182
- }
183
- return false;
184
- }
185
-
186
- /**
187
- * Checks whether a file is watched by any processor, even if that processor
188
- * does not own the file as a primary asset.
189
- */
190
- private isWatchedByProcessor(filePath: string): boolean {
191
- for (const processor of this.appConfig.processors.values()) {
192
- const watchConfig = processor.getWatchConfig();
193
- if (!watchConfig) continue;
194
-
195
- const { extensions = [] } = watchConfig;
196
- if (extensions.length && extensions.some((ext) => filePath.endsWith(ext))) {
197
- return true;
198
- }
199
- }
200
-
201
- return false;
202
- }
203
-
204
- /**
205
- * Checks if a file is handled by a processor.
206
- * Processors that declare extensions own those file types.
207
- */
208
- private isHandledByProcessor(filePath: string): boolean {
209
- for (const processor of this.appConfig.processors.values()) {
210
- const capabilities = processor.getAssetCapabilities?.() ?? [];
211
- if (capabilities.length > 0) {
212
- const matchesConfiguredAsset =
213
- typeof processor.matchesFileFilter !== 'function' || processor.matchesFileFilter(filePath);
214
-
215
- if (
216
- matchesConfiguredAsset &&
217
- capabilities.some((capability) => processor.canProcessAsset?.(capability.kind, filePath))
218
- ) {
219
- return true;
220
- }
221
-
222
- continue;
223
- }
224
-
225
- const watchConfig = processor.getWatchConfig();
226
- if (!watchConfig) continue;
227
-
228
- const { extensions = [] } = watchConfig;
229
- if (extensions.length && extensions.some((ext) => filePath.endsWith(ext))) {
230
- return true;
231
- }
232
- }
233
- return false;
234
- }
235
-
236
- /**
237
- * Triggers router refresh for page directory changes.
238
- * This ensures the router is updated when pages are added or removed.
239
- *
240
- * @param {string} path - Path of the changed directory
241
- */
242
- triggerRouterRefresh(path: string) {
243
- const isPageDir = path.startsWith(this.appConfig.absolutePaths.pagesDir);
244
- if (isPageDir) {
245
- this.refreshRouterRoutesCallback();
246
- }
247
- }
248
-
249
- /**
250
- * Handles and logs errors that occur during file watching.
251
- *
252
- * @param {unknown} error - The error to handle
253
- */
254
- handleError(error: unknown) {
255
- if (error instanceof Error) {
256
- this.hmrManager.broadcast({ type: 'error', message: error.message });
257
- }
258
- appLogger.error(`Watcher error: ${error}`);
259
- }
260
-
261
- /**
262
- * Processes file changes for specific file extensions.
263
- * Used by processors to handle their specific file types.
264
- *
265
- * @private
266
- * @param {string} path - Path of the changed file
267
- * @param {string[]} extensions - File extensions to process
268
- * @param {(ctx: ProcessorWatchContext) => void} handler - Handler function for the file change
269
- */
270
- private shouldProcess(path: string, extensions: string[], handler: (ctx: ProcessorWatchContext) => void) {
271
- if (!extensions.length || extensions.some((ext) => path.endsWith(ext))) {
272
- handler({ path, bridge: this.bridge });
273
- }
274
- }
275
-
276
- /**
277
- * Creates and configures the file system watcher.
278
- * This sets up:
279
- * 1. Processor-specific file watching
280
- * 2. Page file watching
281
- * 3. Directory watching
282
- * 4. Error handling
283
- *
284
- * Uses chokidar's built-in debouncing through `awaitWriteFinish` to handle
285
- * rapid file changes efficiently.
286
- */
287
- public async createWatcherSubscription() {
288
- if (!this.watcher) {
289
- const processorPaths: string[] = [];
290
- for (const processor of this.appConfig.processors.values()) {
291
- const watchConfig = processor.getWatchConfig();
292
- if (!watchConfig) continue;
293
- processorPaths.push(...watchConfig.paths);
294
- }
295
-
296
- if (fileSystem.exists(this.appConfig.absolutePaths.pagesDir)) {
297
- processorPaths.push(this.appConfig.absolutePaths.pagesDir);
298
- }
299
-
300
- if (fileSystem.exists(this.appConfig.absolutePaths.publicDir)) {
301
- processorPaths.push(this.appConfig.absolutePaths.publicDir);
302
- }
303
-
304
- if (this.appConfig.additionalWatchPaths.length) {
305
- processorPaths.push(...this.appConfig.additionalWatchPaths);
306
- }
307
-
308
- this.watcher = chokidar.watch(processorPaths, {
309
- ignoreInitial: true,
310
- ignorePermissionErrors: true,
311
- awaitWriteFinish: {
312
- stabilityThreshold: 50,
313
- pollInterval: 50,
314
- },
315
- });
316
- }
317
-
318
- for (const processor of this.appConfig.processors.values()) {
319
- const watchConfig = processor.getWatchConfig();
320
- if (!watchConfig) continue;
321
- const { extensions = [], onCreate, onChange, onDelete, onError } = watchConfig;
322
-
323
- if (onCreate) this.watcher.on('add', (path) => this.shouldProcess(path, extensions, onCreate));
324
- if (onChange) this.watcher.on('change', (path) => this.shouldProcess(path, extensions, onChange));
325
- if (onDelete) this.watcher.on('unlink', (path) => this.shouldProcess(path, extensions, onDelete));
326
- if (onError) this.watcher.on('error', onError as (error: unknown) => void);
327
- }
328
-
329
- this.watcher.add(this.appConfig.absolutePaths.srcDir);
330
-
331
- this.watcher
332
- .on('change', (path) => this.handleFileChange(path))
333
- .on('add', (path) => {
334
- this.handleFileChange(path);
335
- this.triggerRouterRefresh(path);
336
- })
337
- .on('addDir', (path) => this.triggerRouterRefresh(path))
338
- .on('unlink', (path) => this.triggerRouterRefresh(path))
339
- .on('unlinkDir', (path) => this.triggerRouterRefresh(path))
340
- .on('error', (error) => this.handleError(error));
341
-
342
- return this.watcher;
343
- }
344
- }