@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,36 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { BrowserBundleService } from './browser-bundle.service.ts';
3
-
4
- describe('BrowserBundleService', () => {
5
- it('routes browser bundle requests through the app executor with profile defaults', async () => {
6
- const build = vi.fn(async () => ({
7
- success: true,
8
- logs: [],
9
- outputs: [{ path: '/tmp/out/entry.js' }],
10
- }));
11
- const service = new BrowserBundleService({
12
- runtime: {
13
- buildExecutor: { build },
14
- },
15
- loaders: new Map(),
16
- } as any);
17
-
18
- await service.bundle({
19
- profile: 'browser-script',
20
- entrypoints: ['/tmp/entry.ts'],
21
- outdir: '/tmp/out',
22
- minify: false,
23
- naming: '[name].js',
24
- });
25
-
26
- expect(build).toHaveBeenCalledWith(
27
- expect.objectContaining({
28
- entrypoints: ['/tmp/entry.ts'],
29
- outdir: '/tmp/out',
30
- target: 'browser',
31
- format: 'esm',
32
- sourcemap: 'none',
33
- }),
34
- );
35
- });
36
- });
@@ -1,225 +0,0 @@
1
- /**
2
- * Unit tests for MemoryCacheStore
3
- */
4
-
5
- import { describe, expect, test, beforeEach } from 'vitest';
6
- import { MemoryCacheStore } from './memory-cache-store.js';
7
- import type { CacheEntry } from './cache.types.js';
8
-
9
- function createEntry(overrides: Partial<CacheEntry> = {}): CacheEntry {
10
- return {
11
- html: '<html>test</html>',
12
- createdAt: Date.now(),
13
- revalidateAfter: null,
14
- tags: [],
15
- strategy: 'static',
16
- ...overrides,
17
- };
18
- }
19
-
20
- describe('MemoryCacheStore', () => {
21
- let store: MemoryCacheStore;
22
-
23
- beforeEach(() => {
24
- store = new MemoryCacheStore();
25
- });
26
-
27
- describe('get/set', () => {
28
- test('should return null for cache miss', async () => {
29
- const result = await store.get('/nonexistent');
30
- expect(result).toBeNull();
31
- });
32
-
33
- test('should store and retrieve an entry', async () => {
34
- const entry = createEntry({ html: '<html>hello</html>' });
35
- await store.set('/page', entry);
36
- const result = await store.get('/page');
37
- expect(result?.html).toBe('<html>hello</html>');
38
- });
39
-
40
- test('should update existing entry', async () => {
41
- await store.set('/page', createEntry({ html: '<html>v1</html>' }));
42
- await store.set('/page', createEntry({ html: '<html>v2</html>' }));
43
- const result = await store.get('/page');
44
- expect(result?.html).toBe('<html>v2</html>');
45
- });
46
- });
47
-
48
- describe('LRU eviction', () => {
49
- test('should evict oldest entry when maxEntries reached', async () => {
50
- const smallStore = new MemoryCacheStore({ maxEntries: 3 });
51
-
52
- await smallStore.set('/page1', createEntry());
53
- await smallStore.set('/page2', createEntry());
54
- await smallStore.set('/page3', createEntry());
55
-
56
- await smallStore.set('/page4', createEntry());
57
-
58
- expect(await smallStore.get('/page1')).toBeNull();
59
- expect(await smallStore.get('/page2')).not.toBeNull();
60
- expect(await smallStore.get('/page3')).not.toBeNull();
61
- expect(await smallStore.get('/page4')).not.toBeNull();
62
- });
63
-
64
- test('should refresh entry position on access', async () => {
65
- const smallStore = new MemoryCacheStore({ maxEntries: 3 });
66
-
67
- await smallStore.set('/page1', createEntry());
68
- await smallStore.set('/page2', createEntry());
69
- await smallStore.set('/page3', createEntry());
70
-
71
- await smallStore.get('/page1');
72
-
73
- await smallStore.set('/page4', createEntry());
74
-
75
- expect(await smallStore.get('/page1')).not.toBeNull();
76
- expect(await smallStore.get('/page2')).toBeNull();
77
- expect(await smallStore.get('/page3')).not.toBeNull();
78
- expect(await smallStore.get('/page4')).not.toBeNull();
79
- });
80
-
81
- test('should not evict when updating existing key', async () => {
82
- const smallStore = new MemoryCacheStore({ maxEntries: 3 });
83
-
84
- await smallStore.set('/page1', createEntry());
85
- await smallStore.set('/page2', createEntry());
86
- await smallStore.set('/page3', createEntry());
87
-
88
- await smallStore.set('/page1', createEntry({ html: '<html>updated</html>' }));
89
-
90
- const stats = await smallStore.stats();
91
- expect(stats.entries).toBe(3);
92
- expect((await smallStore.get('/page1'))?.html).toBe('<html>updated</html>');
93
- });
94
-
95
- test('should refresh entry position on update (move to most recent)', async () => {
96
- const smallStore = new MemoryCacheStore({ maxEntries: 3 });
97
-
98
- await smallStore.set('/page1', createEntry({ html: '<html>v1</html>' }));
99
- await smallStore.set('/page2', createEntry());
100
- await smallStore.set('/page3', createEntry());
101
-
102
- await smallStore.set('/page1', createEntry({ html: '<html>v2</html>' }));
103
-
104
- await smallStore.set('/page4', createEntry());
105
-
106
- expect(await smallStore.get('/page1')).not.toBeNull();
107
- expect(await smallStore.get('/page2')).toBeNull();
108
- expect(await smallStore.get('/page3')).not.toBeNull();
109
- expect(await smallStore.get('/page4')).not.toBeNull();
110
- });
111
- });
112
-
113
- describe('delete', () => {
114
- test('should delete an entry', async () => {
115
- await store.set('/page', createEntry());
116
- const deleted = await store.delete('/page');
117
- expect(deleted).toBe(true);
118
- expect(await store.get('/page')).toBeNull();
119
- });
120
-
121
- test('should return false for non-existent entry', async () => {
122
- const deleted = await store.delete('/nonexistent');
123
- expect(deleted).toBe(false);
124
- });
125
- });
126
-
127
- describe('invalidateByTags', () => {
128
- test('should invalidate all entries with matching tag', async () => {
129
- await store.set('/blog/1', createEntry({ tags: ['blog'] }));
130
- await store.set('/blog/2', createEntry({ tags: ['blog'] }));
131
- await store.set('/about', createEntry({ tags: ['static'] }));
132
-
133
- const count = await store.invalidateByTags(['blog']);
134
- expect(count).toBe(2);
135
- expect(await store.get('/blog/1')).toBeNull();
136
- expect(await store.get('/blog/2')).toBeNull();
137
- expect(await store.get('/about')).not.toBeNull();
138
- });
139
-
140
- test('should handle multiple tags', async () => {
141
- await store.set('/blog/1', createEntry({ tags: ['blog', 'featured'] }));
142
- await store.set('/product/1', createEntry({ tags: ['product'] }));
143
-
144
- const count = await store.invalidateByTags(['blog', 'product']);
145
- expect(count).toBe(2);
146
- });
147
-
148
- test('should return 0 for non-matching tags', async () => {
149
- await store.set('/page', createEntry({ tags: ['blog'] }));
150
- const count = await store.invalidateByTags(['nonexistent']);
151
- expect(count).toBe(0);
152
- });
153
-
154
- test('should clean up all tag references when entry has multiple tags', async () => {
155
- await store.set('/blog/featured', createEntry({ tags: ['blog', 'featured', 'homepage'] }));
156
- await store.set('/blog/regular', createEntry({ tags: ['blog'] }));
157
- await store.set('/featured-product', createEntry({ tags: ['featured', 'product'] }));
158
-
159
- const count = await store.invalidateByTags(['blog']);
160
- expect(count).toBe(2);
161
-
162
- expect(await store.get('/blog/featured')).toBeNull();
163
- expect(await store.get('/blog/regular')).toBeNull();
164
- expect(await store.get('/featured-product')).not.toBeNull();
165
-
166
- const countFeatured = await store.invalidateByTags(['featured']);
167
- expect(countFeatured).toBe(1);
168
- expect(await store.get('/featured-product')).toBeNull();
169
- });
170
-
171
- test('should not leave orphaned tag references after invalidation', async () => {
172
- await store.set('/page1', createEntry({ tags: ['tagA', 'tagB'] }));
173
-
174
- await store.invalidateByTags(['tagA']);
175
-
176
- expect(await store.get('/page1')).toBeNull();
177
-
178
- await store.set('/page2', createEntry({ tags: ['tagB'] }));
179
- const count = await store.invalidateByTags(['tagB']);
180
- expect(count).toBe(1);
181
- });
182
- });
183
-
184
- describe('invalidateByPaths', () => {
185
- test('should invalidate specific paths', async () => {
186
- await store.set('/blog/1', createEntry());
187
- await store.set('/blog/2', createEntry());
188
-
189
- const count = await store.invalidateByPaths(['/blog/1']);
190
- expect(count).toBe(1);
191
- expect(await store.get('/blog/1')).toBeNull();
192
- expect(await store.get('/blog/2')).not.toBeNull();
193
- });
194
-
195
- test('should handle multiple paths', async () => {
196
- await store.set('/blog/1', createEntry());
197
- await store.set('/blog/2', createEntry());
198
- await store.set('/about', createEntry());
199
-
200
- const count = await store.invalidateByPaths(['/blog/1', '/about']);
201
- expect(count).toBe(2);
202
- });
203
- });
204
-
205
- describe('clear', () => {
206
- test('should remove all entries', async () => {
207
- await store.set('/page1', createEntry());
208
- await store.set('/page2', createEntry());
209
- await store.clear();
210
-
211
- const stats = await store.stats();
212
- expect(stats.entries).toBe(0);
213
- });
214
- });
215
-
216
- describe('stats', () => {
217
- test('should return entry count', async () => {
218
- await store.set('/page1', createEntry());
219
- await store.set('/page2', createEntry());
220
-
221
- const stats = await store.stats();
222
- expect(stats.entries).toBe(2);
223
- });
224
- });
225
- });
@@ -1,175 +0,0 @@
1
- /**
2
- * Unit tests for PageCacheService
3
- */
4
-
5
- import { describe, expect, test, beforeEach, vi } from 'vitest';
6
- import { PageCacheService, getCacheControlHeader } from './page-cache-service.js';
7
- import { MemoryCacheStore } from './memory-cache-store.js';
8
-
9
- describe('PageCacheService', () => {
10
- let service: PageCacheService;
11
- let store: MemoryCacheStore;
12
-
13
- beforeEach(() => {
14
- store = new MemoryCacheStore();
15
- service = new PageCacheService({ store });
16
- });
17
-
18
- describe('generateCacheKey', () => {
19
- test('should use full URL as key', () => {
20
- expect(service.generateCacheKey('/blog/post-1')).toBe('/blog/post-1');
21
- expect(service.generateCacheKey('/search?q=test')).toBe('/search?q=test');
22
- });
23
- });
24
-
25
- describe('getOrCreate', () => {
26
- test('should return miss and render on cache miss', async () => {
27
- const renderFn = vi.fn().mockResolvedValue({ html: '<html>hello</html>', strategy: 'static' as const });
28
-
29
- const result = await service.getOrCreate('/page', 'static', renderFn);
30
-
31
- expect(result.status).toBe('miss');
32
- expect(result.html).toBe('<html>hello</html>');
33
- expect(result.strategy).toBe('static');
34
- expect(renderFn).toHaveBeenCalledTimes(1);
35
- });
36
-
37
- test('should return hit on cache hit', async () => {
38
- const renderFn = vi.fn().mockResolvedValue({ html: '<html>hello</html>', strategy: 'static' as const });
39
-
40
- await service.getOrCreate('/page', 'static', renderFn);
41
-
42
- renderFn.mockClear();
43
- const result = await service.getOrCreate('/page', 'static', renderFn);
44
-
45
- expect(result.status).toBe('hit');
46
- expect(result.html).toBe('<html>hello</html>');
47
- expect(result.strategy).toBe('static');
48
- expect(renderFn).not.toHaveBeenCalled();
49
- });
50
-
51
- test('should bypass cache for dynamic strategy', async () => {
52
- const renderFn = vi.fn().mockResolvedValue({ html: '<html>hello</html>', strategy: 'dynamic' as const });
53
-
54
- const result1 = await service.getOrCreate('/page', 'dynamic', renderFn);
55
- const result2 = await service.getOrCreate('/page', 'dynamic', renderFn);
56
-
57
- expect(result1.status).toBe('miss');
58
- expect(result2.status).toBe('miss');
59
- expect(renderFn).toHaveBeenCalledTimes(2);
60
- });
61
-
62
- test('should return stale when entry is past revalidation time', async () => {
63
- const revalidateStrategy = { revalidate: 60 };
64
- const renderFn = vi.fn().mockResolvedValue({ html: '<html>v1</html>', strategy: revalidateStrategy });
65
-
66
- const staleEntry = {
67
- html: '<html>stale</html>',
68
- createdAt: Date.now() - 120000,
69
- revalidateAfter: Date.now() - 60000,
70
- tags: [],
71
- strategy: revalidateStrategy,
72
- };
73
- await store.set('/stale-page', staleEntry);
74
-
75
- const result = await service.getOrCreate('/stale-page', { revalidate: 60 }, renderFn);
76
- expect(result.status).toBe('stale');
77
- expect(result.html).toBe('<html>stale</html>');
78
- });
79
-
80
- test('should deduplicate concurrent regeneration requests', async () => {
81
- let callCount = 0;
82
- const renderFn = vi.fn().mockImplementation(async () => {
83
- callCount++;
84
- await new Promise((resolve) => setTimeout(resolve, 10));
85
- return { html: `<html>v${callCount}</html>`, strategy: { revalidate: 60 } };
86
- });
87
-
88
- const staleEntry = {
89
- html: '<html>stale</html>',
90
- createdAt: Date.now() - 120000,
91
- revalidateAfter: Date.now() - 60000,
92
- tags: [],
93
- strategy: { revalidate: 60 },
94
- };
95
- await store.set('/dedup-page', staleEntry);
96
-
97
- const results = await Promise.all([
98
- service.getOrCreate('/dedup-page', { revalidate: 60 }, renderFn),
99
- service.getOrCreate('/dedup-page', { revalidate: 60 }, renderFn),
100
- service.getOrCreate('/dedup-page', { revalidate: 60 }, renderFn),
101
- ]);
102
-
103
- for (const result of results) {
104
- expect(result.status).toBe('stale');
105
- expect(result.html).toBe('<html>stale</html>');
106
- }
107
-
108
- await new Promise((resolve) => setTimeout(resolve, 50));
109
-
110
- expect(renderFn).toHaveBeenCalledTimes(1);
111
- });
112
- });
113
-
114
- describe('invalidation', () => {
115
- test('should invalidate by tags', async () => {
116
- const strategy = { revalidate: 3600, tags: ['blog'] };
117
- const renderFn = vi.fn().mockResolvedValue({ html: '<html>hello</html>', strategy });
118
-
119
- await service.getOrCreate('/blog/1', strategy, renderFn);
120
- await service.getOrCreate('/blog/2', strategy, renderFn);
121
-
122
- const count = await service.invalidateByTags(['blog']);
123
- expect(count).toBe(2);
124
-
125
- renderFn.mockClear();
126
- const result = await service.getOrCreate('/blog/1', 'static', renderFn);
127
- expect(result.status).toBe('miss');
128
- });
129
-
130
- test('should invalidate by paths', async () => {
131
- const renderFn = vi.fn().mockResolvedValue({ html: '<html>hello</html>', strategy: 'static' as const });
132
-
133
- await service.getOrCreate('/blog/1', 'static', renderFn);
134
-
135
- const count = await service.invalidateByPaths(['/blog/1']);
136
- expect(count).toBe(1);
137
-
138
- renderFn.mockClear();
139
- const result = await service.getOrCreate('/blog/1', 'static', renderFn);
140
- expect(result.status).toBe('miss');
141
- });
142
- });
143
-
144
- describe('disabled cache', () => {
145
- test('should bypass cache when disabled', async () => {
146
- const disabledService = new PageCacheService({ store, enabled: false });
147
- const renderFn = vi.fn().mockResolvedValue({ html: '<html>hello</html>', strategy: 'static' as const });
148
-
149
- const result1 = await disabledService.getOrCreate('/page', 'static', renderFn);
150
- const result2 = await disabledService.getOrCreate('/page', 'static', renderFn);
151
-
152
- expect(result1.status).toBe('miss');
153
- expect(result2.status).toBe('miss');
154
- expect(renderFn).toHaveBeenCalledTimes(2);
155
- });
156
- });
157
- });
158
-
159
- describe('getCacheControlHeader', () => {
160
- test('should return immutable for static strategy', () => {
161
- expect(getCacheControlHeader('static')).toBe('public, max-age=31536000, immutable');
162
- });
163
-
164
- test('should return no-store for dynamic strategy', () => {
165
- expect(getCacheControlHeader('dynamic')).toBe('no-store, must-revalidate');
166
- });
167
-
168
- test('should return max-age and stale-while-revalidate for object strategy', () => {
169
- expect(getCacheControlHeader({ revalidate: 3600 })).toBe('public, max-age=3600, stale-while-revalidate=7200');
170
- });
171
-
172
- test('should return no-store when disabled', () => {
173
- expect(getCacheControlHeader('disabled')).toBe('no-store, must-revalidate');
174
- });
175
- });
@@ -1,79 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { PageRequestCacheCoordinator } from './page-request-cache-coordinator.service.ts';
3
- import type { PageCacheService } from './page-cache-service.js';
4
-
5
- describe('PageRequestCacheCoordinator', () => {
6
- it('should build cache keys with query parameters', () => {
7
- const service = new PageRequestCacheCoordinator(null, 'static');
8
-
9
- expect(service.buildCacheKey({ pathname: '/blog' })).toBe('/blog');
10
- expect(service.buildCacheKey({ pathname: '/blog', query: { page: '2', tag: 'eco' } })).toBe(
11
- '/blog?page=2&tag=eco',
12
- );
13
- });
14
-
15
- it('should bypass the cache service for dynamic pages', async () => {
16
- const cacheService = {
17
- getOrCreate: vi.fn(),
18
- } as unknown as PageCacheService;
19
- const renderFn = vi.fn(async () => ({
20
- html: '<html><body>dynamic</body></html>',
21
- strategy: 'dynamic' as const,
22
- }));
23
- const service = new PageRequestCacheCoordinator(cacheService, 'static');
24
-
25
- const response = await service.render({
26
- cacheKey: '/dynamic',
27
- pageCacheStrategy: 'dynamic',
28
- renderFn,
29
- });
30
-
31
- expect(await response.text()).toBe('<html><body>dynamic</body></html>');
32
- expect(response.headers.get('X-Cache')).toBe('DISABLED');
33
- expect(cacheService.getOrCreate).not.toHaveBeenCalled();
34
- expect(renderFn).toHaveBeenCalledTimes(1);
35
- });
36
-
37
- it('should delegate cached rendering to the cache service', async () => {
38
- const cacheService = {
39
- getOrCreate: vi.fn(async () => ({
40
- html: '<html><body>cached</body></html>',
41
- strategy: { revalidate: 60 },
42
- status: 'hit',
43
- })),
44
- } as unknown as PageCacheService;
45
- const service = new PageRequestCacheCoordinator(cacheService, 'static');
46
-
47
- const response = await service.render({
48
- cacheKey: '/cached',
49
- pageCacheStrategy: { revalidate: 60 },
50
- renderFn: async () => ({
51
- html: '<html><body>fresh</body></html>',
52
- strategy: { revalidate: 60 },
53
- }),
54
- });
55
-
56
- expect(await response.text()).toBe('<html><body>cached</body></html>');
57
- expect(response.headers.get('X-Cache')).toBe('HIT');
58
- expect(response.headers.get('Cache-Control')).toContain('max-age=60');
59
- expect(cacheService.getOrCreate).toHaveBeenCalledWith('/cached', { revalidate: 60 }, expect.any(Function));
60
- });
61
-
62
- it('should normalize supported body types to strings', async () => {
63
- const service = new PageRequestCacheCoordinator(null, 'static');
64
-
65
- expect(await service.bodyToString('plain')).toBe('plain');
66
- expect(await service.bodyToString(Buffer.from('buffered'))).toBe('buffered');
67
- expect(await service.bodyToString(new Uint8Array([104, 101, 108, 108, 111]))).toBe('hello');
68
- expect(
69
- await service.bodyToString(
70
- new ReadableStream({
71
- start: (controller) => {
72
- controller.enqueue(new TextEncoder().encode('streamed'));
73
- controller.close();
74
- },
75
- }),
76
- ),
77
- ).toBe('streamed');
78
- });
79
- });
@@ -1,183 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import {
3
- DefaultHtmlRewriterProvider,
4
- type HtmlRewriterElement,
5
- type HtmlRewriterLogger,
6
- type HtmlRewriterRuntime,
7
- } from './html-rewriter-provider.service';
8
-
9
- type HtmlRewriterHandler = {
10
- element: (element: HtmlRewriterElement) => void;
11
- };
12
-
13
- class TestHtmlRewriter implements HtmlRewriterRuntime {
14
- private handlers = new Map<'head' | 'body', HtmlRewriterHandler>();
15
-
16
- on(selector: 'head' | 'body', handler: HtmlRewriterHandler): TestHtmlRewriter {
17
- this.handlers.set(selector, handler);
18
- return this;
19
- }
20
-
21
- transform(response: Response): Response {
22
- return response;
23
- }
24
- }
25
-
26
- class TestLogger implements HtmlRewriterLogger {
27
- public warnings: string[] = [];
28
-
29
- warn(message: string) {
30
- this.warnings.push(message);
31
- }
32
- }
33
-
34
- describe('DefaultHtmlRewriterProvider', () => {
35
- it('should prefer the native html rewriter in auto mode', async () => {
36
- let workerToolsLoads = 0;
37
-
38
- const provider = new DefaultHtmlRewriterProvider({
39
- getNativeHtmlRewriter: () => TestHtmlRewriter,
40
- loadWorkerToolsHtmlRewriter: async () => {
41
- workerToolsLoads += 1;
42
- return TestHtmlRewriter;
43
- },
44
- });
45
-
46
- const htmlRewriter = await provider.createHtmlRewriter();
47
-
48
- expect(htmlRewriter).toBeInstanceOf(TestHtmlRewriter);
49
- expect(workerToolsLoads).toBe(0);
50
- });
51
-
52
- it('should load worker-tools when auto mode has no native runtime', async () => {
53
- let workerToolsLoads = 0;
54
-
55
- const provider = new DefaultHtmlRewriterProvider({
56
- getNativeHtmlRewriter: () => undefined,
57
- loadWorkerToolsHtmlRewriter: async () => {
58
- workerToolsLoads += 1;
59
- return TestHtmlRewriter;
60
- },
61
- });
62
-
63
- const htmlRewriter = await provider.createHtmlRewriter();
64
-
65
- expect(htmlRewriter).toBeInstanceOf(TestHtmlRewriter);
66
- expect(workerToolsLoads).toBe(1);
67
- });
68
-
69
- it('should allow forcing worker-tools mode even when native is available', async () => {
70
- let workerToolsLoads = 0;
71
-
72
- const provider = new DefaultHtmlRewriterProvider({
73
- mode: 'worker-tools',
74
- getNativeHtmlRewriter: () => TestHtmlRewriter,
75
- loadWorkerToolsHtmlRewriter: async () => {
76
- workerToolsLoads += 1;
77
- return TestHtmlRewriter;
78
- },
79
- });
80
-
81
- const htmlRewriter = await provider.createHtmlRewriter();
82
-
83
- expect(htmlRewriter).toBeInstanceOf(TestHtmlRewriter);
84
- expect(workerToolsLoads).toBe(1);
85
- });
86
-
87
- it('should allow forcing fallback mode', async () => {
88
- let workerToolsLoads = 0;
89
-
90
- const provider = new DefaultHtmlRewriterProvider({
91
- mode: 'fallback',
92
- getNativeHtmlRewriter: () => TestHtmlRewriter,
93
- loadWorkerToolsHtmlRewriter: async () => {
94
- workerToolsLoads += 1;
95
- return TestHtmlRewriter;
96
- },
97
- });
98
-
99
- const htmlRewriter = await provider.createHtmlRewriter();
100
-
101
- expect(htmlRewriter).toBeNull();
102
- expect(workerToolsLoads).toBe(0);
103
- });
104
-
105
- it('should warn and fall back when native mode is forced without a runtime implementation', async () => {
106
- const logger = new TestLogger();
107
-
108
- const provider = new DefaultHtmlRewriterProvider({
109
- mode: 'native',
110
- logger,
111
- getNativeHtmlRewriter: () => undefined,
112
- });
113
-
114
- const htmlRewriter = await provider.createHtmlRewriter();
115
-
116
- expect(htmlRewriter).toBeNull();
117
- expect(logger.warnings).toEqual([
118
- '[HtmlTransformerService] Native HTMLRewriter was forced but is unavailable, falling back to string injection.',
119
- ]);
120
- });
121
-
122
- it('should reset the cached constructor when the mode changes', async () => {
123
- let workerToolsLoads = 0;
124
-
125
- const provider = new DefaultHtmlRewriterProvider({
126
- getNativeHtmlRewriter: () => undefined,
127
- loadWorkerToolsHtmlRewriter: async () => {
128
- workerToolsLoads += 1;
129
- return TestHtmlRewriter;
130
- },
131
- });
132
-
133
- await provider.createHtmlRewriter();
134
- await provider.createHtmlRewriter();
135
- provider.setMode('fallback');
136
- const fallbackHtmlRewriter = await provider.createHtmlRewriter();
137
-
138
- expect(workerToolsLoads).toBe(1);
139
- expect(fallbackHtmlRewriter).toBeNull();
140
- });
141
-
142
- it('should allow switching back to worker-tools after fallback mode', async () => {
143
- let workerToolsLoads = 0;
144
-
145
- const provider = new DefaultHtmlRewriterProvider({
146
- mode: 'fallback',
147
- getNativeHtmlRewriter: () => undefined,
148
- loadWorkerToolsHtmlRewriter: async () => {
149
- workerToolsLoads += 1;
150
- return TestHtmlRewriter;
151
- },
152
- });
153
-
154
- await provider.createHtmlRewriter();
155
- provider.setMode('worker-tools');
156
- const htmlRewriter = await provider.createHtmlRewriter();
157
-
158
- expect(htmlRewriter).toBeInstanceOf(TestHtmlRewriter);
159
- expect(workerToolsLoads).toBe(1);
160
- });
161
-
162
- it('should return null when worker-tools loading fails', async () => {
163
- const logger = new TestLogger();
164
-
165
- const provider = new DefaultHtmlRewriterProvider({
166
- logger,
167
- getNativeHtmlRewriter: () => undefined,
168
- loadWorkerToolsHtmlRewriter: async () => {
169
- logger.warn(
170
- '[HtmlTransformerService] Failed to load @worker-tools/html-rewriter/base64, falling back to string injection: test failure',
171
- );
172
- return null;
173
- },
174
- });
175
-
176
- const htmlRewriter = await provider.createHtmlRewriter();
177
-
178
- expect(htmlRewriter).toBeNull();
179
- expect(logger.warnings).toEqual([
180
- '[HtmlTransformerService] Failed to load @worker-tools/html-rewriter/base64, falling back to string injection: test failure',
181
- ]);
182
- });
183
- });