@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,96 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { PageModuleLoaderService } from './page-module-loader.ts';
3
- import type { EcoPagesAppConfig } from '../../internal-types.ts';
4
- import type { EcoPageFile } from '../../public-types.ts';
5
- import type { EcoPageComponent } from '../../eco/eco.types.ts';
6
-
7
- describe('PageModuleLoaderService', () => {
8
- const appConfig = {
9
- defaultMetadata: {
10
- title: 'Default title',
11
- description: 'Default description',
12
- },
13
- } as EcoPagesAppConfig;
14
-
15
- it('should resolve static props via getStaticPropsForPage', async () => {
16
- const service = new PageModuleLoaderService(appConfig, 'http://localhost:3000');
17
- const result = await service.getStaticPropsForPage({
18
- getStaticProps: async () => ({
19
- props: { title: 'Page title' },
20
- }),
21
- params: { slug: 'a' },
22
- });
23
-
24
- expect(result.props).toEqual({ title: 'Page title' });
25
- });
26
-
27
- it('should merge default and dynamic metadata', async () => {
28
- const service = new PageModuleLoaderService(appConfig, 'http://localhost:3000');
29
- const metadata = await service.getMetadataPropsForPage({
30
- getMetadata: async ({ props }) => ({
31
- title: String(props.title),
32
- description: 'Dynamic description',
33
- }),
34
- context: {
35
- props: { title: 'Dynamic title' },
36
- appConfig,
37
- params: {},
38
- query: {},
39
- },
40
- });
41
-
42
- expect(metadata).toEqual({
43
- title: 'Dynamic title',
44
- description: 'Dynamic description',
45
- });
46
- });
47
-
48
- it('should resolve page module using provided importer and prefer component static exports', async () => {
49
- const service = new PageModuleLoaderService(appConfig, 'http://localhost:3000');
50
- const Page = (() => 'ok') as EcoPageComponent<any>;
51
- Page.staticProps = async () => ({ props: { from: 'component-static' } });
52
- Page.metadata = async () => ({
53
- title: 'component-metadata',
54
- description: 'component-description',
55
- });
56
-
57
- const module = {
58
- default: Page,
59
- getStaticProps: async () => ({ props: { from: 'module-static' } }),
60
- getMetadata: async () => ({ title: 'module-metadata' }),
61
- extra: 'integration-value',
62
- } as unknown as EcoPageFile;
63
-
64
- const result = await service.resolvePageModule({
65
- file: '/app/pages/index.tsx',
66
- importPageFileFn: async () => module,
67
- });
68
-
69
- expect(result.getStaticProps).toBe(Page.staticProps);
70
- expect(result.getMetadata).toBe(Page.metadata);
71
- expect(result.integrationSpecificProps).toEqual({ extra: 'integration-value' });
72
- });
73
-
74
- it('should resolve page data end-to-end', async () => {
75
- const service = new PageModuleLoaderService(appConfig, 'http://localhost:3000');
76
- const result = await service.resolvePageData({
77
- pageModule: {
78
- getStaticProps: async () => ({ props: { title: 'From props' } }),
79
- getMetadata: async ({ props }) => ({
80
- title: String(props.title),
81
- description: 'From metadata',
82
- }),
83
- },
84
- routeOptions: {
85
- file: '/app/pages/index.tsx',
86
- params: {},
87
- query: {},
88
- },
89
- });
90
-
91
- expect(result).toEqual({
92
- props: { title: 'From props' },
93
- metadata: { title: 'From props', description: 'From metadata' },
94
- });
95
- });
96
- });
@@ -1,237 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { getEcoNavigationRuntime } from './navigation-coordinator.ts';
3
-
4
- function createWindowLike() {
5
- return {} as Window &
6
- typeof globalThis & {
7
- __ECO_PAGES__?: { navigation?: ReturnType<typeof getEcoNavigationRuntime> };
8
- };
9
- }
10
-
11
- describe('getEcoNavigationRuntime', () => {
12
- it('returns the same coordinator instance for the same window', () => {
13
- const windowLike = createWindowLike();
14
- const first = getEcoNavigationRuntime(windowLike);
15
- const second = getEcoNavigationRuntime(windowLike);
16
-
17
- expect(first).toBe(second);
18
- });
19
-
20
- it('tracks explicit ownership claims', () => {
21
- const windowLike = createWindowLike();
22
- const runtime = getEcoNavigationRuntime(windowLike);
23
-
24
- runtime.claimOwnership('react-router');
25
-
26
- expect(runtime.getOwnerState()).toEqual({
27
- owner: 'react-router',
28
- canHandleSpaNavigation: false,
29
- });
30
- });
31
-
32
- it('shares one navigation transaction sequence across runtimes', () => {
33
- const windowLike = createWindowLike();
34
- const runtime = getEcoNavigationRuntime(windowLike);
35
-
36
- const first = runtime.beginNavigationTransaction();
37
- expect(runtime.hasPendingNavigationTransaction()).toBe(true);
38
- expect(first.isCurrent()).toBe(true);
39
- expect(first.signal.aborted).toBe(false);
40
-
41
- const second = runtime.beginNavigationTransaction();
42
-
43
- expect(first.isCurrent()).toBe(false);
44
- expect(first.signal.aborted).toBe(true);
45
- expect(second.isCurrent()).toBe(true);
46
- expect(second.signal.aborted).toBe(false);
47
- second.complete();
48
- expect(runtime.hasPendingNavigationTransaction()).toBe(false);
49
- });
50
-
51
- it('cancels only the current navigation transaction', () => {
52
- const windowLike = createWindowLike();
53
- const runtime = getEcoNavigationRuntime(windowLike);
54
-
55
- const first = runtime.beginNavigationTransaction();
56
- const second = runtime.beginNavigationTransaction();
57
-
58
- first.cancel();
59
- expect(second.isCurrent()).toBe(true);
60
- expect(second.signal.aborted).toBe(false);
61
-
62
- second.cancel();
63
- expect(second.isCurrent()).toBe(false);
64
- expect(second.signal.aborted).toBe(true);
65
- expect(runtime.hasPendingNavigationTransaction()).toBe(false);
66
- });
67
-
68
- it('adopts ownership from the rendered document marker', () => {
69
- const windowLike = createWindowLike();
70
- const runtime = getEcoNavigationRuntime(windowLike);
71
- const documentLike = {
72
- documentElement: {
73
- getAttribute: vi.fn(() => 'custom-router'),
74
- },
75
- } as unknown as Document;
76
-
77
- expect(runtime.adoptDocumentOwner(documentLike, 'browser-router')).toBe('custom-router');
78
- expect(runtime.getOwnerState().owner).toBe('custom-router');
79
- });
80
-
81
- it('delegates navigation to another registered runtime when the source cannot handle it', async () => {
82
- const windowLike = createWindowLike();
83
- const runtime = getEcoNavigationRuntime(windowLike);
84
- const navigateSpy = vi.fn(async () => true);
85
-
86
- runtime.register({ owner: 'browser-router', navigate: navigateSpy });
87
- runtime.register({ owner: 'react-router', navigate: vi.fn(async () => true) });
88
- runtime.claimOwnership('react-router');
89
-
90
- const handled = await runtime.requestNavigation({
91
- href: '/docs',
92
- direction: 'forward',
93
- source: 'react-router',
94
- });
95
-
96
- expect(handled).toBe(true);
97
- expect(navigateSpy).toHaveBeenCalledWith({
98
- href: '/docs',
99
- direction: 'forward',
100
- source: 'react-router',
101
- });
102
- });
103
-
104
- it('delegates a fetched document handoff to the targeted runtime without forcing source cleanup first', async () => {
105
- const windowLike = createWindowLike();
106
- const runtime = getEcoNavigationRuntime(windowLike);
107
- const cleanupSpy = vi.fn(async () => undefined);
108
- const handoffSpy = vi.fn(async () => true);
109
- const documentLike = {
110
- documentElement: {
111
- getAttribute: vi.fn(() => null),
112
- },
113
- } as unknown as Document;
114
-
115
- runtime.register({ owner: 'react-router', cleanupBeforeHandoff: cleanupSpy });
116
- runtime.register({ owner: 'browser-router', handoffNavigation: handoffSpy });
117
- runtime.claimOwnership('react-router');
118
-
119
- const handled = await runtime.requestHandoff({
120
- href: '/docs',
121
- finalHref: '/docs',
122
- direction: 'forward',
123
- source: 'react-router',
124
- targetOwner: 'browser-router',
125
- document: documentLike,
126
- });
127
-
128
- expect(handled).toBe(true);
129
- expect(cleanupSpy).not.toHaveBeenCalled();
130
- expect(handoffSpy).toHaveBeenCalledWith({
131
- href: '/docs',
132
- finalHref: '/docs',
133
- direction: 'forward',
134
- source: 'react-router',
135
- targetOwner: 'browser-router',
136
- document: documentLike,
137
- });
138
- });
139
-
140
- it('ignores stale handoff requests before cleaning up the active owner', async () => {
141
- const windowLike = createWindowLike();
142
- const runtime = getEcoNavigationRuntime(windowLike);
143
- const cleanupSpy = vi.fn(async () => undefined);
144
- const handoffSpy = vi.fn(async () => true);
145
- const documentLike = {
146
- documentElement: {
147
- getAttribute: vi.fn(() => null),
148
- },
149
- } as unknown as Document;
150
-
151
- runtime.register({ owner: 'react-router', cleanupBeforeHandoff: cleanupSpy });
152
- runtime.register({ owner: 'browser-router', handoffNavigation: handoffSpy });
153
- runtime.claimOwnership('react-router');
154
-
155
- const handled = await runtime.requestHandoff({
156
- href: '/docs',
157
- finalHref: '/docs',
158
- direction: 'forward',
159
- source: 'react-router',
160
- targetOwner: 'browser-router',
161
- document: documentLike,
162
- isStaleSourceNavigation: () => true,
163
- });
164
-
165
- expect(handled).toBe(true);
166
- expect(cleanupSpy).not.toHaveBeenCalled();
167
- expect(handoffSpy).not.toHaveBeenCalled();
168
- expect(runtime.getOwnerState().owner).toBe('react-router');
169
- });
170
-
171
- it('reloads the current owner through its registration', async () => {
172
- const windowLike = createWindowLike();
173
- const runtime = getEcoNavigationRuntime(windowLike);
174
- const reloadSpy = vi.fn(async () => undefined);
175
-
176
- runtime.register({ owner: 'react-router', reloadCurrentPage: reloadSpy });
177
- runtime.claimOwnership('react-router');
178
-
179
- const handled = await runtime.reloadCurrentPage({ clearCache: true, source: 'browser-router' });
180
-
181
- expect(handled).toBe(true);
182
- expect(reloadSpy).toHaveBeenCalledWith({ clearCache: true, source: 'browser-router' });
183
- });
184
-
185
- it('reloads the current owner even when the request source matches that owner', async () => {
186
- const windowLike = createWindowLike();
187
- const runtime = getEcoNavigationRuntime(windowLike);
188
- const reloadSpy = vi.fn(async () => undefined);
189
-
190
- runtime.register({ owner: 'react-router', reloadCurrentPage: reloadSpy });
191
- runtime.claimOwnership('react-router');
192
-
193
- const handled = await runtime.reloadCurrentPage({ clearCache: false, source: 'react-router' });
194
-
195
- expect(handled).toBe(true);
196
- expect(reloadSpy).toHaveBeenCalledWith({ clearCache: false, source: 'react-router' });
197
- });
198
-
199
- it('cleans up an explicit owner via its registration', async () => {
200
- const windowLike = createWindowLike();
201
- const runtime = getEcoNavigationRuntime(windowLike);
202
- const cleanupSpy = vi.fn();
203
-
204
- runtime.register({ owner: 'react-router', cleanupBeforeHandoff: cleanupSpy });
205
- runtime.claimOwnership('react-router');
206
-
207
- await runtime.cleanupOwner('react-router');
208
-
209
- expect(cleanupSpy).toHaveBeenCalledTimes(1);
210
- expect(runtime.getOwnerState().owner).toBe('none');
211
- });
212
-
213
- it('emits events for registrations and ownership changes', () => {
214
- const windowLike = createWindowLike();
215
- const runtime = getEcoNavigationRuntime(windowLike);
216
- const listener = vi.fn();
217
- const unsubscribe = runtime.subscribe(listener);
218
-
219
- const unregister = runtime.register({ owner: 'custom-router' });
220
- runtime.claimOwnership('custom-router');
221
- runtime.releaseOwnership('custom-router');
222
- unregister();
223
- unsubscribe();
224
-
225
- expect(listener).toHaveBeenCalledWith({
226
- type: 'registration-change',
227
- owner: 'custom-router',
228
- status: 'registered',
229
- });
230
- expect(listener).toHaveBeenCalledWith({
231
- type: 'owner-change',
232
- owner: 'custom-router',
233
- previousOwner: 'none',
234
- reason: 'claim',
235
- });
236
- });
237
- });
@@ -1,83 +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 { test } from 'vitest';
6
- import type { EcoPagesAppConfig } from '../../internal-types.ts';
7
- import { FSRouterScanner } from './fs-router-scanner.ts';
8
-
9
- test('FSRouterScanner scans dynamic routes in Node when module graph needs transpilation', async () => {
10
- if (typeof Bun !== 'undefined') {
11
- // This test expects Node's missing Bun global to trigger Esbuild transpilation. Skip in Bun runner.
12
- return;
13
- }
14
-
15
- const rootDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ecopages-fs-router-scanner-node-'));
16
- const pagesDir = path.join(rootDir, 'src', 'pages');
17
- const dynamicDir = path.join(pagesDir, 'dynamic');
18
- const distDir = path.join(rootDir, 'dist');
19
- const workDir = path.join(rootDir, '.eco');
20
-
21
- try {
22
- fs.mkdirSync(dynamicDir, { recursive: true });
23
- fs.mkdirSync(path.join(rootDir, 'src'), { recursive: true });
24
-
25
- fs.writeFileSync(
26
- path.join(rootDir, 'src', 'decorated.ts'),
27
- [
28
- 'function sealed<T extends new (...args: never[]) => object>(target: T) {',
29
- '\treturn target;',
30
- '}',
31
- '@sealed',
32
- 'export class DecoratedModule {}',
33
- ].join('\n'),
34
- );
35
-
36
- fs.writeFileSync(
37
- path.join(dynamicDir, '[slug].kita.tsx'),
38
- [
39
- "import '../../decorated.ts';",
40
- '',
41
- 'export const getStaticPaths = async () => ({',
42
- "\tpaths: [{ params: { slug: 'hello-world' } }],",
43
- '});',
44
- '',
45
- 'export const getStaticProps = async () => ({ props: {} });',
46
- '',
47
- 'export default async function Page() {',
48
- "\treturn '<div>Hello</div>';",
49
- '}',
50
- ].join('\n'),
51
- );
52
-
53
- const scanner = new FSRouterScanner({
54
- dir: pagesDir,
55
- origin: 'http://localhost:3000',
56
- templatesExt: ['.kita.tsx'],
57
- options: {
58
- buildMode: false,
59
- },
60
- appConfig: {
61
- rootDir,
62
- workDir: '.eco',
63
- absolutePaths: {
64
- distDir,
65
- workDir,
66
- },
67
- } as unknown as EcoPagesAppConfig,
68
- });
69
-
70
- const routes = await scanner.scan();
71
-
72
- assert.equal(routes['http://localhost:3000/dynamic/hello-world']?.kind, 'dynamic');
73
- assert.equal(routes['http://localhost:3000/dynamic/hello-world']?.pathname, '/dynamic/[slug]');
74
-
75
- const transpiledModulesDir = path.join(workDir, '.server-route-modules');
76
- assert.equal(fs.existsSync(transpiledModulesDir), true);
77
-
78
- const transpiledFiles = fs.readdirSync(transpiledModulesDir).filter((file) => file.endsWith('.js'));
79
- assert.ok(transpiledFiles.length > 0);
80
- } finally {
81
- fs.rmSync(rootDir, { recursive: true, force: true });
82
- }
83
- });
@@ -1,214 +0,0 @@
1
- import { describe, expect, test, vi } from 'vitest';
2
- import { FIXTURE_APP_PROJECT_DIR } from '../../../__fixtures__/constants.js';
3
- import { ConfigBuilder } from '../../config/config-builder.js';
4
- import type { Route, Routes } from '../../internal-types.js';
5
- import { FSRouter } from './fs-router.ts';
6
- import { FSRouterScanner } from './fs-router-scanner.ts';
7
-
8
- const {
9
- templatesExt,
10
- absolutePaths: { pagesDir, distDir },
11
- } = await new ConfigBuilder().setRootDir(FIXTURE_APP_PROJECT_DIR).build();
12
-
13
- const scanner = new FSRouterScanner({
14
- dir: pagesDir,
15
- appConfig: {
16
- absolutePaths: {
17
- distDir,
18
- },
19
- } as any,
20
- origin: 'http://localhost:3000',
21
- templatesExt,
22
- options: {
23
- buildMode: false,
24
- },
25
- });
26
-
27
- const router = new FSRouter({
28
- origin: 'http://localhost:3000',
29
- assetPrefix: distDir,
30
- scanner,
31
- });
32
-
33
- await router.init();
34
-
35
- describe('FSRouter', async () => {
36
- describe('init', async () => {
37
- test('should scan and return routes', async () => {
38
- expect(Object.keys(router.routes).sort()).toEqual([
39
- 'http://localhost:3000/',
40
- 'http://localhost:3000/404',
41
- 'http://localhost:3000/catch-all/[...path]',
42
- 'http://localhost:3000/dynamic/another-blog-post',
43
- 'http://localhost:3000/dynamic/blog-post',
44
- 'http://localhost:3000/postcss-hmr',
45
- ]);
46
- });
47
- });
48
-
49
- describe('getDynamicParams', async () => {
50
- test.each([
51
- ['/products/[id]', '/products/123', { id: '123' }],
52
- ['/products/[id]', '/products/123/456', { id: '123' }],
53
- ['/products/[id]', '/products/123/456/789', { id: '123' }],
54
- ])(
55
- 'dynamic route %p with URL %p should have dynamic params %p',
56
- async (dynamicPathname, pathname, expected) => {
57
- const route: Route = {
58
- filePath: '',
59
- kind: 'dynamic',
60
- pathname: dynamicPathname,
61
- };
62
- const params = router.getDynamicParams(route, pathname);
63
-
64
- expect(params).toEqual(expected);
65
- },
66
- );
67
-
68
- test.each([
69
- ['/products/[...id]', '/products/123/456/789', { id: ['123', '456', '789'] }],
70
- ['/products/[...id]', '/products/123', { id: ['123'] }],
71
- ['/products/[...id]', '/products', { id: [] }],
72
- ])(
73
- 'catch-all route %p with URL %p should have dynamic params %p',
74
- async (catchAllRoute, pathname, expected) => {
75
- const route: Route = {
76
- filePath: '',
77
- kind: 'dynamic',
78
- pathname: catchAllRoute,
79
- };
80
- const params = router.getDynamicParams(route, pathname);
81
-
82
- expect(params).toEqual(expected);
83
- },
84
- );
85
- });
86
-
87
- describe('getSearchParams', () => {
88
- test('should extract query parameters from URL', () => {
89
- const url = new URL('http://localhost:3000/page?foo=bar&baz=qux');
90
- const params = router.getSearchParams(url);
91
-
92
- expect(params).toEqual({ foo: 'bar', baz: 'qux' });
93
- });
94
-
95
- test('should return empty object for URL without query params', () => {
96
- const url = new URL('http://localhost:3000/page');
97
- const params = router.getSearchParams(url);
98
-
99
- expect(params).toEqual({});
100
- });
101
- });
102
-
103
- describe('match', () => {
104
- const createRouterWithRoutes = (routes: Routes) => {
105
- const Scanner = { scan: async () => routes } as unknown as FSRouterScanner;
106
- const testRouter = new FSRouter({
107
- origin: 'http://localhost:3000',
108
- assetPrefix: '/dist',
109
- scanner: Scanner,
110
- });
111
- testRouter.routes = routes;
112
- return testRouter;
113
- };
114
-
115
- test('should match exact route', () => {
116
- const testRouter = createRouterWithRoutes({
117
- '/about': { filePath: '/pages/about.ts', kind: 'exact', pathname: '/about' },
118
- });
119
-
120
- const result = testRouter.match('http://localhost:3000/about');
121
-
122
- expect(result).not.toBeNull();
123
- expect(result?.kind).toBe('exact');
124
- expect(result?.pathname).toBe('/about');
125
- });
126
-
127
- test('should match exact route with trailing slash', () => {
128
- const testRouter = createRouterWithRoutes({
129
- '/about': { filePath: '/pages/about.ts', kind: 'exact', pathname: '/about' },
130
- });
131
-
132
- const result = testRouter.match('http://localhost:3000/about/');
133
-
134
- expect(result).not.toBeNull();
135
- expect(result?.kind).toBe('exact');
136
- });
137
-
138
- test('should match dynamic route', () => {
139
- const testRouter = createRouterWithRoutes({
140
- '/dynamic/[id]': { filePath: '/pages/dynamic/[id].ts', kind: 'dynamic', pathname: '/dynamic/[id]' },
141
- });
142
-
143
- const result = testRouter.match('http://localhost:3000/dynamic/123');
144
-
145
- expect(result).not.toBeNull();
146
- expect(result?.kind).toBe('dynamic');
147
- expect(result?.params).toEqual({ id: '123' });
148
- });
149
-
150
- test('should match catch-all route', () => {
151
- const testRouter = createRouterWithRoutes({
152
- '/catch-all/[...slug]': {
153
- filePath: '/pages/catch-all/[...slug].ts',
154
- kind: 'catch-all',
155
- pathname: '/catch-all/[...slug]',
156
- },
157
- });
158
-
159
- const result = testRouter.match('http://localhost:3000/catch-all/a/b/c');
160
-
161
- expect(result).not.toBeNull();
162
- expect(result?.kind).toBe('catch-all');
163
- expect(result?.params).toEqual({ slug: ['a', 'b', 'c'] });
164
- });
165
-
166
- test('should include query params in match result', () => {
167
- const testRouter = createRouterWithRoutes({
168
- '/page': { filePath: '/pages/page.ts', kind: 'exact', pathname: '/page' },
169
- });
170
-
171
- const result = testRouter.match('http://localhost:3000/page?sort=asc&page=2');
172
-
173
- expect(result?.query).toEqual({ sort: 'asc', page: '2' });
174
- });
175
-
176
- test('should return null for non-matching route', () => {
177
- const testRouter = createRouterWithRoutes({
178
- '/about': { filePath: '/pages/about.ts', kind: 'exact', pathname: '/about' },
179
- });
180
-
181
- const result = testRouter.match('http://localhost:3000/contact');
182
-
183
- expect(result).toBeNull();
184
- });
185
-
186
- test('should prefer exact match over dynamic', () => {
187
- const testRouter = createRouterWithRoutes({
188
- '/blog/latest': { filePath: '/pages/blog/latest.ts', kind: 'exact', pathname: '/blog/latest' },
189
- '/blog/[slug]': { filePath: '/pages/blog/[slug].ts', kind: 'dynamic', pathname: '/blog/[slug]' },
190
- });
191
-
192
- const result = testRouter.match('http://localhost:3000/blog/latest');
193
-
194
- expect(result?.kind).toBe('exact');
195
- });
196
- });
197
-
198
- describe('setOnReload and reload', () => {
199
- test('should set and call onReload callback', async () => {
200
- const Scanner = { scan: async () => ({}) } as unknown as FSRouterScanner;
201
- const testRouter = new FSRouter({
202
- origin: 'http://localhost:3000',
203
- assetPrefix: '/dist',
204
- scanner: Scanner,
205
- });
206
-
207
- const callback = vi.fn(() => {});
208
- testRouter.setOnReload(callback);
209
- testRouter.reload();
210
-
211
- expect(callback).toHaveBeenCalledTimes(1);
212
- });
213
- });
214
- });