@ecopages/core 0.2.0-alpha.7 → 0.2.0-alpha.8

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 (354) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/package.json +212 -92
  3. package/src/adapters/abstract/application-adapter.d.ts +168 -0
  4. package/src/adapters/abstract/application-adapter.js +109 -0
  5. package/src/adapters/abstract/router-adapter.d.ts +26 -0
  6. package/src/adapters/abstract/router-adapter.js +5 -0
  7. package/src/adapters/abstract/server-adapter.d.ts +69 -0
  8. package/src/adapters/abstract/server-adapter.js +15 -0
  9. package/src/adapters/bun/client-bridge.d.ts +34 -0
  10. package/src/adapters/bun/client-bridge.js +48 -0
  11. package/src/adapters/bun/create-app.d.ts +60 -0
  12. package/src/adapters/bun/create-app.js +117 -0
  13. package/src/adapters/bun/hmr-manager.d.ts +143 -0
  14. package/src/adapters/bun/hmr-manager.js +334 -0
  15. package/src/adapters/bun/index.d.ts +2 -0
  16. package/src/adapters/bun/index.js +8 -0
  17. package/src/adapters/bun/server-adapter.d.ts +155 -0
  18. package/src/adapters/bun/server-adapter.js +373 -0
  19. package/src/adapters/bun/server-lifecycle.d.ts +63 -0
  20. package/src/adapters/bun/server-lifecycle.js +92 -0
  21. package/src/adapters/index.d.ts +6 -0
  22. package/src/adapters/index.js +14 -0
  23. package/src/adapters/node/bootstrap-dependency-resolver.d.ts +44 -0
  24. package/src/adapters/node/bootstrap-dependency-resolver.js +172 -0
  25. package/src/adapters/node/create-app.d.ts +21 -0
  26. package/src/adapters/node/create-app.js +143 -0
  27. package/src/adapters/node/index.d.ts +6 -0
  28. package/src/adapters/node/index.js +11 -0
  29. package/src/adapters/node/node-client-bridge.d.ts +26 -0
  30. package/src/adapters/node/node-client-bridge.js +66 -0
  31. package/src/adapters/node/node-hmr-manager.d.ts +133 -0
  32. package/src/adapters/node/node-hmr-manager.js +312 -0
  33. package/src/adapters/node/runtime-adapter.d.ts +46 -0
  34. package/src/adapters/node/runtime-adapter.js +306 -0
  35. package/src/adapters/node/server-adapter.d.ts +161 -0
  36. package/src/adapters/node/server-adapter.js +358 -0
  37. package/src/adapters/node/static-content-server.d.ts +60 -0
  38. package/src/adapters/node/static-content-server.js +194 -0
  39. package/src/adapters/node/write-runtime-manifest.d.ts +26 -0
  40. package/src/adapters/node/write-runtime-manifest.js +12 -0
  41. package/src/adapters/shared/api-response.d.ts +52 -0
  42. package/src/adapters/shared/api-response.js +96 -0
  43. package/src/adapters/shared/application-adapter.d.ts +18 -0
  44. package/src/adapters/shared/application-adapter.js +90 -0
  45. package/src/adapters/shared/define-api-handler.d.ts +25 -0
  46. package/src/adapters/shared/define-api-handler.js +15 -0
  47. package/src/adapters/shared/explicit-static-route-matcher.d.ts +38 -0
  48. package/src/adapters/shared/explicit-static-route-matcher.js +103 -0
  49. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +65 -0
  50. package/src/adapters/shared/file-route-middleware-pipeline.js +99 -0
  51. package/src/adapters/shared/fs-server-response-factory.d.ts +19 -0
  52. package/src/adapters/shared/fs-server-response-factory.js +97 -0
  53. package/src/adapters/shared/fs-server-response-matcher.d.ts +75 -0
  54. package/src/adapters/shared/fs-server-response-matcher.js +160 -0
  55. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  56. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  57. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  58. package/src/adapters/shared/hmr-html-response.js +32 -0
  59. package/src/adapters/shared/render-context.d.ts +14 -0
  60. package/src/adapters/shared/render-context.js +70 -0
  61. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  62. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  63. package/src/adapters/shared/server-adapter.d.ts +97 -0
  64. package/src/adapters/shared/server-adapter.js +386 -0
  65. package/src/adapters/shared/server-route-handler.d.ts +89 -0
  66. package/src/adapters/shared/server-route-handler.js +111 -0
  67. package/src/adapters/shared/server-static-builder.d.ts +70 -0
  68. package/src/adapters/shared/server-static-builder.js +99 -0
  69. package/src/build/build-adapter.d.ts +186 -0
  70. package/src/build/build-adapter.js +168 -0
  71. package/src/build/build-manifest.d.ts +27 -0
  72. package/src/build/build-manifest.js +30 -0
  73. package/src/build/build-types.d.ts +57 -0
  74. package/src/build/build-types.js +0 -0
  75. package/src/build/dev-build-coordinator.d.ts +74 -0
  76. package/src/build/dev-build-coordinator.js +161 -0
  77. package/src/build/esbuild-build-adapter.d.ts +72 -0
  78. package/src/build/esbuild-build-adapter.js +422 -0
  79. package/src/build/runtime-build-executor.d.ts +13 -0
  80. package/src/build/runtime-build-executor.js +20 -0
  81. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  82. package/src/build/runtime-specifier-alias-plugin.js +31 -0
  83. package/src/config/config-builder.d.ts +238 -0
  84. package/src/config/config-builder.js +565 -0
  85. package/src/constants.d.ts +45 -0
  86. package/src/constants.js +25 -0
  87. package/src/create-app.d.ts +17 -0
  88. package/src/create-app.js +66 -0
  89. package/src/dev/sc-server.d.ts +30 -0
  90. package/src/dev/sc-server.js +111 -0
  91. package/src/eco/component-render-context.d.ts +105 -0
  92. package/src/eco/component-render-context.js +87 -0
  93. package/src/eco/eco.d.ts +9 -0
  94. package/src/eco/eco.js +114 -0
  95. package/src/eco/eco.types.d.ts +178 -0
  96. package/src/eco/eco.types.js +0 -0
  97. package/src/eco/eco.utils.d.ts +40 -0
  98. package/src/eco/eco.utils.js +40 -0
  99. package/src/eco/global-injector-map.d.ts +16 -0
  100. package/src/eco/global-injector-map.js +80 -0
  101. package/src/eco/lazy-injector-map.d.ts +8 -0
  102. package/src/eco/lazy-injector-map.js +70 -0
  103. package/src/eco/module-dependencies.d.ts +18 -0
  104. package/src/eco/module-dependencies.js +49 -0
  105. package/src/errors/http-error.d.ts +31 -0
  106. package/src/errors/http-error.js +50 -0
  107. package/src/errors/index.d.ts +2 -0
  108. package/src/errors/index.js +4 -0
  109. package/src/errors/locals-access-error.d.ts +4 -0
  110. package/src/errors/locals-access-error.js +9 -0
  111. package/src/global/app-logger.d.ts +2 -0
  112. package/src/global/app-logger.js +6 -0
  113. package/src/hmr/client/hmr-runtime.d.ts +5 -0
  114. package/src/hmr/client/hmr-runtime.js +109 -0
  115. package/src/hmr/hmr-strategy.d.ts +159 -0
  116. package/src/hmr/hmr-strategy.js +29 -0
  117. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  118. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  119. package/src/hmr/hmr.test.e2e.d.ts +1 -0
  120. package/src/hmr/hmr.test.e2e.js +43 -0
  121. package/src/hmr/strategies/default-hmr-strategy.d.ts +43 -0
  122. package/src/hmr/strategies/default-hmr-strategy.js +34 -0
  123. package/src/hmr/strategies/js-hmr-strategy.d.ts +139 -0
  124. package/src/hmr/strategies/js-hmr-strategy.js +178 -0
  125. package/src/index.browser.d.ts +3 -0
  126. package/src/index.browser.js +4 -0
  127. package/src/index.d.ts +5 -0
  128. package/src/index.js +10 -0
  129. package/src/integrations/ghtml/ghtml-renderer.d.ts +15 -0
  130. package/src/integrations/ghtml/ghtml-renderer.js +62 -0
  131. package/src/integrations/ghtml/ghtml.plugin.d.ts +20 -0
  132. package/src/integrations/ghtml/ghtml.plugin.js +21 -0
  133. package/src/internal-types.d.ts +221 -0
  134. package/src/internal-types.js +0 -0
  135. package/src/plugins/alias-resolver-plugin.d.ts +2 -0
  136. package/src/plugins/alias-resolver-plugin.js +53 -0
  137. package/src/plugins/eco-component-meta-plugin.d.ts +97 -0
  138. package/src/plugins/eco-component-meta-plugin.js +157 -0
  139. package/src/plugins/integration-plugin.d.ts +136 -0
  140. package/src/plugins/integration-plugin.js +133 -0
  141. package/src/plugins/processor.d.ts +95 -0
  142. package/src/plugins/processor.js +136 -0
  143. package/src/plugins/runtime-capability.d.ts +9 -0
  144. package/src/plugins/runtime-capability.js +0 -0
  145. package/src/public-types.d.ts +1149 -0
  146. package/src/public-types.js +0 -0
  147. package/src/route-renderer/component-graph/component-graph-executor.d.ts +32 -0
  148. package/src/route-renderer/component-graph/component-graph-executor.js +31 -0
  149. package/src/route-renderer/component-graph/component-graph.d.ts +42 -0
  150. package/src/route-renderer/component-graph/component-graph.js +72 -0
  151. package/src/route-renderer/component-graph/component-marker.d.ts +52 -0
  152. package/src/route-renderer/component-graph/component-marker.js +46 -0
  153. package/src/route-renderer/component-graph/component-reference.d.ts +10 -0
  154. package/src/route-renderer/component-graph/component-reference.js +19 -0
  155. package/src/route-renderer/component-graph/marker-graph-resolver.d.ts +77 -0
  156. package/src/route-renderer/component-graph/marker-graph-resolver.js +95 -0
  157. package/src/route-renderer/orchestration/integration-renderer.d.ts +372 -0
  158. package/src/route-renderer/orchestration/integration-renderer.js +589 -0
  159. package/src/route-renderer/orchestration/render-execution.service.d.ts +103 -0
  160. package/src/route-renderer/orchestration/render-execution.service.js +121 -0
  161. package/src/route-renderer/orchestration/render-preparation.service.d.ts +121 -0
  162. package/src/route-renderer/orchestration/render-preparation.service.js +332 -0
  163. package/src/route-renderer/page-loading/dependency-resolver.d.ts +35 -0
  164. package/src/route-renderer/page-loading/dependency-resolver.js +442 -0
  165. package/src/route-renderer/page-loading/page-module-loader.d.ts +87 -0
  166. package/src/route-renderer/page-loading/page-module-loader.js +124 -0
  167. package/src/route-renderer/route-renderer.d.ts +61 -0
  168. package/src/route-renderer/route-renderer.js +87 -0
  169. package/src/router/client/link-intent.js +34 -0
  170. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  171. package/src/router/client/link-intent.test.browser.js +43 -0
  172. package/src/router/client/navigation-coordinator.d.ts +149 -0
  173. package/src/router/client/navigation-coordinator.js +215 -0
  174. package/src/router/server/fs-router-scanner.d.ts +41 -0
  175. package/src/router/server/fs-router-scanner.js +156 -0
  176. package/src/router/server/fs-router.d.ts +26 -0
  177. package/src/router/server/fs-router.js +100 -0
  178. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
  179. package/src/services/assets/asset-processing-service/asset-processing.service.js +331 -0
  180. package/src/services/assets/asset-processing-service/asset.factory.d.ts +17 -0
  181. package/src/services/assets/asset-processing-service/asset.factory.js +82 -0
  182. package/src/services/assets/asset-processing-service/assets.types.d.ts +89 -0
  183. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  184. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  185. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +48 -0
  186. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  187. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  188. package/src/services/assets/asset-processing-service/index.d.ts +5 -0
  189. package/src/services/assets/asset-processing-service/index.js +5 -0
  190. package/src/services/assets/asset-processing-service/processor.interface.d.ts +22 -0
  191. package/src/services/assets/asset-processing-service/processor.interface.js +6 -0
  192. package/src/services/assets/asset-processing-service/processor.registry.d.ts +8 -0
  193. package/src/services/assets/asset-processing-service/processor.registry.js +15 -0
  194. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +24 -0
  195. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +64 -0
  196. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +17 -0
  197. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +72 -0
  198. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  199. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  200. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +5 -0
  201. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +57 -0
  202. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +8 -0
  203. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +76 -0
  204. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +7 -0
  205. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +75 -0
  206. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +5 -0
  207. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +25 -0
  208. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +9 -0
  209. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +66 -0
  210. package/src/services/assets/browser-bundle.service.d.ts +32 -0
  211. package/src/services/assets/browser-bundle.service.js +33 -0
  212. package/src/services/cache/cache.types.d.ts +107 -0
  213. package/src/services/cache/cache.types.js +0 -0
  214. package/src/services/cache/index.d.ts +7 -0
  215. package/src/services/cache/index.js +7 -0
  216. package/src/services/cache/memory-cache-store.d.ts +42 -0
  217. package/src/services/cache/memory-cache-store.js +98 -0
  218. package/src/services/cache/page-cache-service.d.ts +70 -0
  219. package/src/services/cache/page-cache-service.js +152 -0
  220. package/src/services/cache/page-request-cache-coordinator.service.d.ts +75 -0
  221. package/src/services/cache/page-request-cache-coordinator.service.js +109 -0
  222. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  223. package/src/services/html/html-rewriter-provider.service.js +65 -0
  224. package/src/services/html/html-transformer.service.d.ts +77 -0
  225. package/src/services/html/html-transformer.service.js +221 -0
  226. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  227. package/src/services/invalidation/development-invalidation.service.js +189 -0
  228. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +16 -0
  229. package/src/services/module-loading/app-server-module-transpiler.service.js +34 -0
  230. package/src/services/module-loading/page-module-import.service.d.ts +71 -0
  231. package/src/services/module-loading/page-module-import.service.js +132 -0
  232. package/src/services/module-loading/server-loader.service.d.ts +96 -0
  233. package/src/services/module-loading/server-loader.service.js +32 -0
  234. package/src/services/module-loading/server-module-transpiler.service.d.ts +69 -0
  235. package/src/services/module-loading/server-module-transpiler.service.js +61 -0
  236. package/src/services/runtime-manifest/node-runtime-manifest.service.d.ts +35 -0
  237. package/src/services/runtime-manifest/node-runtime-manifest.service.js +60 -0
  238. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  239. package/src/services/runtime-state/dev-graph.service.js +162 -0
  240. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  241. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  242. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
  243. package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
  244. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  245. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  246. package/src/services/validation/schema-validation-service.d.ts +122 -0
  247. package/src/services/validation/schema-validation-service.js +101 -0
  248. package/src/services/validation/standard-schema.types.d.ts +65 -0
  249. package/src/services/validation/standard-schema.types.js +0 -0
  250. package/src/static-site-generator/static-site-generator.d.ts +109 -0
  251. package/src/static-site-generator/static-site-generator.js +353 -0
  252. package/src/utils/css.d.ts +1 -0
  253. package/src/utils/css.js +7 -0
  254. package/src/utils/deep-merge.d.ts +14 -0
  255. package/src/utils/deep-merge.js +32 -0
  256. package/src/utils/hash.d.ts +1 -0
  257. package/src/utils/hash.js +7 -0
  258. package/src/utils/html.d.ts +1 -0
  259. package/src/utils/html.js +4 -0
  260. package/src/utils/invariant.d.ts +5 -0
  261. package/src/utils/invariant.js +11 -0
  262. package/src/utils/locals-utils.d.ts +15 -0
  263. package/src/utils/locals-utils.js +24 -0
  264. package/src/utils/parse-cli-args.d.ts +24 -0
  265. package/src/utils/parse-cli-args.js +47 -0
  266. package/src/utils/path-utils.module.d.ts +5 -0
  267. package/src/utils/path-utils.module.js +14 -0
  268. package/src/utils/resolve-work-dir.d.ts +11 -0
  269. package/src/utils/resolve-work-dir.js +31 -0
  270. package/src/utils/runtime.d.ts +11 -0
  271. package/src/utils/runtime.js +40 -0
  272. package/src/utils/server-utils.module.d.ts +19 -0
  273. package/src/utils/server-utils.module.js +56 -0
  274. package/src/watchers/project-watcher.d.ts +136 -0
  275. package/src/watchers/project-watcher.js +281 -0
  276. package/src/watchers/project-watcher.test-helpers.d.ts +4 -0
  277. package/src/watchers/project-watcher.test-helpers.js +52 -0
  278. package/src/adapters/bun/hmr-manager.test.ts +0 -267
  279. package/src/adapters/node/bootstrap-dependency-resolver.test.ts +0 -282
  280. package/src/adapters/node/node-client-bridge.test.ts +0 -198
  281. package/src/adapters/node/node-hmr-manager.test.ts +0 -322
  282. package/src/adapters/node/runtime-adapter.test.ts +0 -868
  283. package/src/adapters/node/static-content-server.test.ts +0 -60
  284. package/src/adapters/shared/api-response.test.ts +0 -97
  285. package/src/adapters/shared/explicit-static-route-matcher.test.ts +0 -381
  286. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +0 -90
  287. package/src/adapters/shared/fs-server-response-factory.test.ts +0 -187
  288. package/src/adapters/shared/fs-server-response-matcher.test.ts +0 -286
  289. package/src/adapters/shared/hmr-manager.contract.test.ts +0 -196
  290. package/src/adapters/shared/hmr-manager.dispatch.test.ts +0 -220
  291. package/src/adapters/shared/render-context.test.ts +0 -146
  292. package/src/adapters/shared/server-adapter.test.ts +0 -77
  293. package/src/adapters/shared/server-route-handler.test.ts +0 -110
  294. package/src/adapters/shared/server-static-builder.test.ts +0 -316
  295. package/src/build/build-adapter-serialization.test.ts +0 -268
  296. package/src/build/build-adapter.test.ts +0 -815
  297. package/src/build/runtime-specifier-alias-plugin.test.ts +0 -43
  298. package/src/config/config-builder.test.ts +0 -410
  299. package/src/eco/eco.test.ts +0 -678
  300. package/src/eco/eco.utils.test.ts +0 -124
  301. package/src/eco/global-injector-map.test.ts +0 -42
  302. package/src/eco/lazy-injector-map.test.ts +0 -66
  303. package/src/eco/module-dependencies.test.ts +0 -30
  304. package/src/errors/http-error.test.ts +0 -134
  305. package/src/global/utils.test.ts +0 -12
  306. 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
  307. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  308. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  309. package/src/hmr/hmr-strategy.test.ts +0 -124
  310. package/src/hmr/strategies/js-hmr-strategy.test.ts +0 -335
  311. package/src/integrations/ghtml/ghtml-renderer.test.ts +0 -63
  312. package/src/plugins/alias-resolver-plugin.test.ts +0 -41
  313. package/src/plugins/eco-component-meta-plugin.test.ts +0 -380
  314. package/src/plugins/integration-plugin.test.ts +0 -111
  315. package/src/plugins/processor.test.ts +0 -148
  316. package/src/route-renderer/component-graph/component-graph-executor.test.ts +0 -41
  317. package/src/route-renderer/component-graph/component-graph.test.ts +0 -63
  318. package/src/route-renderer/component-graph/component-marker.test.ts +0 -73
  319. package/src/route-renderer/component-graph/marker-graph-resolver.test.ts +0 -135
  320. package/src/route-renderer/orchestration/integration-renderer.test.ts +0 -936
  321. package/src/route-renderer/orchestration/render-execution.service.test.ts +0 -97
  322. package/src/route-renderer/orchestration/render-preparation.service.test.ts +0 -235
  323. package/src/route-renderer/page-loading/dependency-resolver.test.ts +0 -345
  324. package/src/route-renderer/page-loading/page-module-loader.test.ts +0 -96
  325. package/src/router/client/navigation-coordinator.test.ts +0 -237
  326. package/src/router/server/fs-router-scanner.test.ts +0 -83
  327. package/src/router/server/fs-router.test.ts +0 -214
  328. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +0 -385
  329. package/src/services/assets/asset-processing-service/asset.factory.test.ts +0 -63
  330. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +0 -72
  331. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +0 -67
  332. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +0 -59
  333. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +0 -286
  334. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +0 -227
  335. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +0 -199
  336. package/src/services/assets/browser-bundle.service.test.ts +0 -36
  337. package/src/services/cache/memory-cache-store.test.ts +0 -225
  338. package/src/services/cache/page-cache-service.test.ts +0 -175
  339. package/src/services/cache/page-request-cache-coordinator.service.test.ts +0 -79
  340. package/src/services/html/html-rewriter-provider.service.test.ts +0 -183
  341. package/src/services/html/html-transformer.service.test.ts +0 -378
  342. package/src/services/invalidation/development-invalidation.service.test.ts +0 -77
  343. package/src/services/module-loading/page-module-import.service.test.ts +0 -253
  344. package/src/services/module-loading/server-loader.service.test.ts +0 -161
  345. package/src/services/module-loading/server-module-transpiler.service.test.ts +0 -115
  346. package/src/services/runtime-manifest/node-runtime-manifest.service.test.ts +0 -95
  347. package/src/services/validation/schema-validation-service.test.ts +0 -223
  348. package/src/static-site-generator/static-site-generator.test.ts +0 -307
  349. package/src/utils/deep-merge.test.ts +0 -114
  350. package/src/utils/invariant.test.ts +0 -22
  351. package/src/utils/path-utils.test.ts +0 -15
  352. package/src/utils/server-utils.test.ts +0 -38
  353. package/src/watchers/project-watcher.integration.test.ts +0 -337
  354. package/src/watchers/project-watcher.test.ts +0 -678
@@ -1,198 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { NodeClientBridge } from './node-client-bridge.ts';
3
-
4
- // ---------------------------------------------------------------------------
5
- // Minimal WebSocket mock — only the surface that NodeClientBridge touches
6
- // ---------------------------------------------------------------------------
7
- function createMockWs(readyState = 1 /* OPEN */) {
8
- return {
9
- readyState,
10
- send: vi.fn(),
11
- ping: vi.fn(),
12
- };
13
- }
14
-
15
- // ---------------------------------------------------------------------------
16
- // Tests
17
- // ---------------------------------------------------------------------------
18
- describe('NodeClientBridge', () => {
19
- let bridge: NodeClientBridge;
20
-
21
- beforeEach(() => {
22
- vi.useFakeTimers();
23
- bridge = new NodeClientBridge();
24
- });
25
-
26
- afterEach(() => {
27
- bridge.destroy();
28
- vi.useRealTimers();
29
- });
30
-
31
- // ── subscribe / unsubscribe ─────────────────────────────────────────────
32
-
33
- describe('subscribe / unsubscribe', () => {
34
- it('increments subscriberCount when a socket is added', () => {
35
- const ws = createMockWs();
36
- bridge.subscribe(ws as never);
37
- expect(bridge.subscriberCount).toBe(1);
38
- });
39
-
40
- it('decrements subscriberCount when a socket is removed', () => {
41
- const ws = createMockWs();
42
- bridge.subscribe(ws as never);
43
- bridge.unsubscribe(ws as never);
44
- expect(bridge.subscriberCount).toBe(0);
45
- });
46
-
47
- it('handles unsubscribing a socket that was never added', () => {
48
- const ws = createMockWs();
49
- expect(() => bridge.unsubscribe(ws as never)).not.toThrow();
50
- });
51
- });
52
-
53
- // ── broadcast ──────────────────────────────────────────────────────────
54
-
55
- describe('broadcast', () => {
56
- it('sends the serialised event to all OPEN subscribers', () => {
57
- const ws1 = createMockWs(1);
58
- const ws2 = createMockWs(1);
59
- bridge.subscribe(ws1 as never);
60
- bridge.subscribe(ws2 as never);
61
-
62
- bridge.broadcast({ type: 'reload' });
63
-
64
- expect(ws1.send).toHaveBeenCalledWith(JSON.stringify({ type: 'reload' }));
65
- expect(ws2.send).toHaveBeenCalledWith(JSON.stringify({ type: 'reload' }));
66
- });
67
-
68
- it('does NOT send to a socket that is not OPEN (readyState !== 1)', () => {
69
- const closedWs = createMockWs(3 /* CLOSED */);
70
- bridge.subscribe(closedWs as never);
71
-
72
- bridge.broadcast({ type: 'reload' });
73
-
74
- expect(closedWs.send).not.toHaveBeenCalled();
75
- });
76
- });
77
-
78
- // ── convenience helpers ────────────────────────────────────────────────
79
-
80
- describe('convenience broadcast helpers', () => {
81
- it('reload() broadcasts a reload event', () => {
82
- const ws = createMockWs();
83
- bridge.subscribe(ws as never);
84
-
85
- bridge.reload();
86
-
87
- expect(ws.send).toHaveBeenCalledWith(JSON.stringify({ type: 'reload' }));
88
- });
89
-
90
- it('cssUpdate() broadcasts a css-update event with path and timestamp', () => {
91
- const ws = createMockWs();
92
- bridge.subscribe(ws as never);
93
-
94
- bridge.cssUpdate('/styles/main.css');
95
-
96
- const payload = JSON.parse((ws.send as ReturnType<typeof vi.fn>).mock.calls[0][0]);
97
- expect(payload.type).toBe('css-update');
98
- expect(payload.path).toBe('/styles/main.css');
99
- expect(typeof payload.timestamp).toBe('number');
100
- });
101
-
102
- it('update() broadcasts an update event with path and timestamp', () => {
103
- const ws = createMockWs();
104
- bridge.subscribe(ws as never);
105
-
106
- bridge.update('/pages/index.ts');
107
-
108
- const payload = JSON.parse((ws.send as ReturnType<typeof vi.fn>).mock.calls[0][0]);
109
- expect(payload.type).toBe('update');
110
- expect(payload.path).toBe('/pages/index.ts');
111
- });
112
-
113
- it('error() broadcasts an error event with the message', () => {
114
- const ws = createMockWs();
115
- bridge.subscribe(ws as never);
116
-
117
- bridge.error('build failed');
118
-
119
- expect(ws.send).toHaveBeenCalledWith(JSON.stringify({ type: 'error', message: 'build failed' }));
120
- });
121
- });
122
-
123
- // ── heartbeat sweep ────────────────────────────────────────────────────
124
-
125
- describe('heartbeat sweep (every 30 s)', () => {
126
- it('pings OPEN subscribers on each sweep', () => {
127
- const ws = createMockWs(1);
128
- bridge.subscribe(ws as never);
129
-
130
- vi.advanceTimersByTime(30_000);
131
-
132
- expect(ws.ping).toHaveBeenCalledTimes(1);
133
- });
134
-
135
- it('removes zombie sockets (non-OPEN) from the subscriber set', () => {
136
- const liveWs = createMockWs(1 /* OPEN */);
137
- const deadWs = createMockWs(3 /* CLOSED */);
138
- bridge.subscribe(liveWs as never);
139
- bridge.subscribe(deadWs as never);
140
-
141
- expect(bridge.subscriberCount).toBe(2);
142
-
143
- vi.advanceTimersByTime(30_000);
144
-
145
- expect(bridge.subscriberCount).toBe(1);
146
- expect(liveWs.ping).toHaveBeenCalledTimes(1);
147
- expect(deadWs.ping).not.toHaveBeenCalled();
148
- });
149
-
150
- it('accumulates cleanup across multiple sweeps', () => {
151
- const ws1 = createMockWs(1);
152
- bridge.subscribe(ws1 as never);
153
-
154
- // First sweep – still alive
155
- vi.advanceTimersByTime(30_000);
156
- expect(bridge.subscriberCount).toBe(1);
157
-
158
- // Socket goes away
159
- ws1.readyState = 3;
160
-
161
- // Second sweep – removed
162
- vi.advanceTimersByTime(30_000);
163
- expect(bridge.subscriberCount).toBe(0);
164
- });
165
- });
166
-
167
- // ── destroy ────────────────────────────────────────────────────────────
168
-
169
- describe('destroy()', () => {
170
- it('stops the heartbeat timer so no further pings are sent', () => {
171
- const ws = createMockWs(1);
172
- bridge.subscribe(ws as never);
173
-
174
- bridge.destroy();
175
-
176
- // Advancing time should NOT trigger any sweep
177
- vi.advanceTimersByTime(30_000 * 5);
178
-
179
- expect(ws.ping).not.toHaveBeenCalled();
180
- });
181
-
182
- it('clears all subscribers', () => {
183
- bridge.subscribe(createMockWs() as never);
184
- bridge.subscribe(createMockWs() as never);
185
-
186
- bridge.destroy();
187
-
188
- expect(bridge.subscriberCount).toBe(0);
189
- });
190
-
191
- it('is safe to call destroy() multiple times', () => {
192
- expect(() => {
193
- bridge.destroy();
194
- bridge.destroy();
195
- }).not.toThrow();
196
- });
197
- });
198
- });
@@ -1,322 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import fs from 'node:fs';
3
- import os from 'node:os';
4
- import path from 'node:path';
5
- import { afterEach, test, vi } from 'vitest';
6
- import { ConfigBuilder } from '../../config/config-builder.ts';
7
- import { resolveInternalExecutionDir, resolveInternalWorkDir } from '../../utils/resolve-work-dir.ts';
8
- import { NodeHmrManager } from './node-hmr-manager.ts';
9
-
10
- const tempRoots: string[] = [];
11
-
12
- function createTempRoot(prefix: string): string {
13
- const root = fs.mkdtempSync(path.join(os.tmpdir(), `${prefix}-`));
14
- tempRoots.push(root);
15
- return root;
16
- }
17
-
18
- afterEach(() => {
19
- for (const root of tempRoots.splice(0)) {
20
- fs.rmSync(root, { recursive: true, force: true });
21
- }
22
- vi.restoreAllMocks();
23
- });
24
-
25
- test('NodeHmrManager shares one in-flight entrypoint registration across concurrent callers', async () => {
26
- const rootDir = createTempRoot('ecopages-node-hmr-register');
27
- const srcDir = path.join(rootDir, 'src');
28
- const pagesDir = path.join(srcDir, 'pages');
29
- fs.mkdirSync(pagesDir, { recursive: true });
30
-
31
- const entrypointPath = path.join(pagesDir, 'react-lab.tsx');
32
- fs.writeFileSync(entrypointPath, 'export default function Page() { return null; }', 'utf8');
33
-
34
- const config = await new ConfigBuilder().setRootDir(rootDir).build();
35
- const manager = new NodeHmrManager({
36
- appConfig: config,
37
- bridge: {
38
- subscriberCount: 0,
39
- broadcast: () => {},
40
- } as any,
41
- });
42
-
43
- const relativePathJs = path
44
- .relative(config.absolutePaths.srcDir, entrypointPath)
45
- .replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
46
- const encodedPathJs = relativePathJs.replace(/\[([^\]]+)\]/g, '_$1_');
47
- const outputPath = path.join(resolveInternalWorkDir(config), 'assets', '_hmr', encodedPathJs);
48
-
49
- const handleFileChange = vi.spyOn(manager, 'handleFileChange').mockImplementation(async () => {
50
- await new Promise((resolve) => setTimeout(resolve, 25));
51
- fs.mkdirSync(path.dirname(outputPath), { recursive: true });
52
- fs.writeFileSync(outputPath, 'export default 1;', 'utf8');
53
- });
54
-
55
- const [firstUrl, secondUrl] = await Promise.all([
56
- manager.registerEntrypoint(entrypointPath),
57
- manager.registerEntrypoint(entrypointPath),
58
- ]);
59
-
60
- assert.equal(firstUrl, '/assets/_hmr/pages/react-lab.js');
61
- assert.equal(secondUrl, '/assets/_hmr/pages/react-lab.js');
62
- assert.equal(handleFileChange.mock.calls.length, 1);
63
- assert.equal(fs.existsSync(outputPath), true);
64
-
65
- manager.stop();
66
- });
67
-
68
- test('NodeHmrManager does not broadcast HMR events for initial entrypoint registration builds', async () => {
69
- const rootDir = createTempRoot('ecopages-node-hmr-silent-register');
70
- const srcDir = path.join(rootDir, 'src');
71
- const pagesDir = path.join(srcDir, 'pages');
72
- fs.mkdirSync(pagesDir, { recursive: true });
73
-
74
- const entrypointPath = path.join(pagesDir, 'react-content.tsx');
75
- fs.writeFileSync(entrypointPath, 'export default function Page() { return null; }', 'utf8');
76
-
77
- const broadcast = vi.fn();
78
- const config = await new ConfigBuilder().setRootDir(rootDir).build();
79
- const manager = new NodeHmrManager({
80
- appConfig: config,
81
- bridge: {
82
- subscriberCount: 1,
83
- broadcast,
84
- } as any,
85
- });
86
-
87
- const relativePathJs = path
88
- .relative(config.absolutePaths.srcDir, entrypointPath)
89
- .replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
90
- const encodedPathJs = relativePathJs.replace(/\[([^\]]+)\]/g, '_$1_');
91
- const outputPath = path.join(resolveInternalWorkDir(config), 'assets', '_hmr', encodedPathJs);
92
-
93
- vi.spyOn(manager, 'handleFileChange').mockImplementation(async (_filePath, _options) => {
94
- fs.mkdirSync(path.dirname(outputPath), { recursive: true });
95
- fs.writeFileSync(outputPath, 'export default 1;', 'utf8');
96
- });
97
-
98
- const outputUrl = await manager.registerEntrypoint(entrypointPath);
99
-
100
- assert.equal(outputUrl, '/assets/_hmr/pages/react-content.js');
101
- assert.equal(broadcast.mock.calls.length, 0);
102
-
103
- manager.stop();
104
- });
105
-
106
- test('NodeHmrManager clears timed-out entrypoint registrations so later requests can retry', async () => {
107
- const rootDir = createTempRoot('ecopages-node-hmr-timeout-register');
108
- const srcDir = path.join(rootDir, 'src');
109
- const pagesDir = path.join(srcDir, 'pages');
110
- fs.mkdirSync(pagesDir, { recursive: true });
111
-
112
- const entrypointPath = path.join(pagesDir, 'stuck-page.tsx');
113
- fs.writeFileSync(entrypointPath, 'export default function Page() { return null; }', 'utf8');
114
-
115
- const config = await new ConfigBuilder().setRootDir(rootDir).build();
116
- const manager = new NodeHmrManager({
117
- appConfig: config,
118
- bridge: {
119
- subscriberCount: 0,
120
- broadcast: () => {},
121
- } as any,
122
- });
123
-
124
- const previousNodeEnv = process.env.NODE_ENV;
125
- process.env.NODE_ENV = 'development';
126
-
127
- const handleFileChange = vi.spyOn(manager, 'handleFileChange').mockImplementation(async () => {
128
- await new Promise(() => undefined);
129
- });
130
-
131
- try {
132
- await assert.rejects(() => manager.registerEntrypoint(entrypointPath), /Timed out registering entrypoint/);
133
-
134
- const registrations = (manager as unknown as { entrypointRegistrations: Map<string, Promise<string>> })
135
- .entrypointRegistrations;
136
- const watchedFiles = manager.getWatchedFiles();
137
- assert.equal(registrations.size, 0);
138
- assert.equal(watchedFiles.has(entrypointPath), false);
139
-
140
- handleFileChange.mockImplementationOnce(async () => {
141
- const relativePathJs = path
142
- .relative(config.absolutePaths.srcDir, entrypointPath)
143
- .replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
144
- const encodedPathJs = relativePathJs.replace(/\[([^\]]+)\]/g, '_$1_');
145
- const outputPath = path.join(resolveInternalWorkDir(config), 'assets', '_hmr', encodedPathJs);
146
- fs.mkdirSync(path.dirname(outputPath), { recursive: true });
147
- fs.writeFileSync(outputPath, 'export default 2;', 'utf8');
148
- });
149
-
150
- const retriedUrl = await manager.registerEntrypoint(entrypointPath);
151
- assert.equal(retriedUrl, '/assets/_hmr/pages/stuck-page.js');
152
- assert.equal(watchedFiles.get(entrypointPath), retriedUrl);
153
- } finally {
154
- process.env.NODE_ENV = previousNodeEnv;
155
- manager.stop();
156
- }
157
- });
158
-
159
- test('NodeHmrManager fails strict entrypoint registration when the owning integration emits no output', async () => {
160
- const rootDir = createTempRoot('ecopages-node-hmr-strict-fail');
161
- const srcDir = path.join(rootDir, 'src');
162
- const pagesDir = path.join(srcDir, 'pages');
163
- fs.mkdirSync(pagesDir, { recursive: true });
164
-
165
- const entrypointPath = path.join(pagesDir, 'react-content.mdx');
166
- fs.writeFileSync(entrypointPath, '# Hello', 'utf8');
167
-
168
- const config = await new ConfigBuilder().setRootDir(rootDir).build();
169
- const manager = new NodeHmrManager({
170
- appConfig: config,
171
- bridge: {
172
- subscriberCount: 0,
173
- broadcast: () => {},
174
- } as any,
175
- });
176
-
177
- vi.spyOn(manager, 'handleFileChange').mockImplementation(async () => {});
178
-
179
- await assert.rejects(() => manager.registerEntrypoint(entrypointPath), /Integration failed to emit entrypoint/);
180
- assert.equal(manager.getWatchedFiles().has(path.resolve(entrypointPath)), false);
181
-
182
- manager.stop();
183
- });
184
-
185
- test('NodeHmrManager uses the generic build path for script entrypoints when no strategy emits output', async () => {
186
- const rootDir = createTempRoot('ecopages-node-hmr-script-fallback');
187
- const srcDir = path.join(rootDir, 'src');
188
- fs.mkdirSync(srcDir, { recursive: true });
189
-
190
- const entrypointPath = path.join(srcDir, 'script.ts');
191
- fs.writeFileSync(entrypointPath, 'console.log("hello");', 'utf8');
192
-
193
- const config = await new ConfigBuilder().setRootDir(rootDir).build();
194
- const manager = new NodeHmrManager({
195
- appConfig: config,
196
- bridge: {
197
- subscriberCount: 0,
198
- broadcast: () => {},
199
- } as any,
200
- });
201
-
202
- const relativePathJs = path
203
- .relative(config.absolutePaths.srcDir, entrypointPath)
204
- .replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
205
- const outputPath = path.join(resolveInternalWorkDir(config), 'assets', '_hmr', relativePathJs);
206
-
207
- const buildCalls: string[] = [];
208
- config.runtime!.buildExecutor = {
209
- build: vi.fn(async (options) => {
210
- buildCalls.push(options.entrypoints[0] as string);
211
- fs.mkdirSync(path.dirname(outputPath), { recursive: true });
212
- fs.writeFileSync(outputPath, 'fresh-output', 'utf8');
213
-
214
- return {
215
- success: true,
216
- logs: [],
217
- outputs: [{ path: outputPath }],
218
- };
219
- }),
220
- };
221
-
222
- vi.spyOn(manager, 'handleFileChange').mockImplementation(async () => {});
223
-
224
- const outputUrl = await manager.registerScriptEntrypoint(entrypointPath);
225
-
226
- assert.equal(outputUrl, '/assets/_hmr/script.js');
227
- assert.deepEqual(buildCalls, [entrypointPath]);
228
- assert.equal(fs.readFileSync(outputPath, 'utf8'), 'fresh-output');
229
-
230
- manager.stop();
231
- });
232
-
233
- test('NodeHmrManager disables HMR instead of throwing when runtime bundle generation crashes', async () => {
234
- const rootDir = createTempRoot('ecopages-node-hmr-runtime-failure');
235
- const config = await new ConfigBuilder().setRootDir(rootDir).build();
236
- const manager = new NodeHmrManager({
237
- appConfig: config,
238
- bridge: {
239
- subscriberCount: 0,
240
- broadcast: () => {},
241
- } as any,
242
- });
243
- const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
244
-
245
- vi.spyOn(
246
- (manager as unknown as { browserBundleService: { bundle: () => Promise<unknown> } }).browserBundleService,
247
- 'bundle',
248
- ).mockRejectedValueOnce(new Error('Unexpected end of JSON input'));
249
-
250
- await assert.doesNotReject(() => manager.buildRuntime());
251
- assert.equal(manager.isEnabled(), false);
252
-
253
- manager.stop();
254
- errorSpy.mockRestore();
255
- });
256
-
257
- test('NodeHmrManager stop clears retained registration state', async () => {
258
- const rootDir = createTempRoot('ecopages-node-hmr-stop-cleanup');
259
- const srcDir = path.join(rootDir, 'src');
260
- const pagesDir = path.join(srcDir, 'pages');
261
- fs.mkdirSync(pagesDir, { recursive: true });
262
-
263
- const entrypointPath = path.join(pagesDir, 'react-content.tsx');
264
- fs.writeFileSync(entrypointPath, 'export default function Page() { return null; }', 'utf8');
265
-
266
- const config = await new ConfigBuilder().setRootDir(rootDir).build();
267
- const manager = new NodeHmrManager({
268
- appConfig: config,
269
- bridge: {
270
- subscriberCount: 0,
271
- broadcast: () => {},
272
- } as any,
273
- });
274
-
275
- const relativePathJs = path
276
- .relative(config.absolutePaths.srcDir, entrypointPath)
277
- .replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
278
- const encodedPathJs = relativePathJs.replace(/\[([^\]]+)\]/g, '_$1_');
279
- const outputPath = path.join(resolveInternalWorkDir(config), 'assets', '_hmr', encodedPathJs);
280
-
281
- vi.spyOn(manager, 'handleFileChange').mockImplementation(async () => {
282
- fs.mkdirSync(path.dirname(outputPath), { recursive: true });
283
- fs.writeFileSync(outputPath, 'export default 1;', 'utf8');
284
- });
285
-
286
- manager.registerSpecifierMap({ react: '/assets/vendors/react.js' });
287
- await manager.registerEntrypoint(entrypointPath);
288
-
289
- manager.stop();
290
-
291
- assert.equal(manager.getWatchedFiles().size, 0);
292
- assert.equal(manager.getSpecifierMap().size, 0);
293
- assert.equal(config.runtime?.entrypointDependencyGraph?.getDependencyEntrypoints(entrypointPath).size, 0);
294
- });
295
-
296
- test('NodeHmrManager keeps internal browser and server-module outputs out of distDir', async () => {
297
- const rootDir = createTempRoot('ecopages-node-hmr-internal-paths');
298
- const config = await new ConfigBuilder().setRootDir(rootDir).build();
299
- const manager = new NodeHmrManager({
300
- appConfig: config,
301
- bridge: {
302
- subscriberCount: 0,
303
- broadcast: () => {},
304
- } as any,
305
- });
306
-
307
- assert.equal(manager.getDistDir(), path.join(resolveInternalWorkDir(config), 'assets', '_hmr'));
308
-
309
- const importModule = vi.fn(async (_options: { outdir: string }) => ({}));
310
- (manager as unknown as { serverModuleTranspiler: { importModule: typeof importModule } }).serverModuleTranspiler = {
311
- importModule,
312
- };
313
-
314
- await manager.getDefaultContext().importServerModule(path.join(config.absolutePaths.srcDir, 'pages', 'index.tsx'));
315
-
316
- assert.equal(
317
- importModule.mock.calls[0]?.[0]?.outdir,
318
- path.join(resolveInternalExecutionDir(config), '.server-modules'),
319
- );
320
-
321
- manager.stop();
322
- });