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

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 (418) hide show
  1. package/README.md +213 -12
  2. package/package.json +100 -188
  3. package/src/adapters/README.md +39 -0
  4. package/src/adapters/bun/hmr-manager.test.ts +267 -0
  5. package/src/adapters/bun/hmr-manager.ts +180 -47
  6. package/src/adapters/bun/index.ts +1 -2
  7. package/src/adapters/bun/server-adapter.ts +41 -34
  8. package/src/adapters/bun/server-lifecycle.ts +40 -70
  9. package/src/adapters/index.ts +1 -1
  10. package/src/adapters/node/bootstrap-dependency-resolver.test.ts +282 -0
  11. package/src/adapters/node/bootstrap-dependency-resolver.ts +301 -0
  12. package/src/adapters/node/index.ts +7 -0
  13. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  14. package/src/adapters/node/node-hmr-manager.test.ts +322 -0
  15. package/src/adapters/node/node-hmr-manager.ts +207 -97
  16. package/src/adapters/node/runtime-adapter.test.ts +868 -0
  17. package/src/adapters/node/runtime-adapter.ts +439 -0
  18. package/src/adapters/node/server-adapter.ts +31 -104
  19. package/src/adapters/node/static-content-server.test.ts +60 -0
  20. package/src/adapters/node/static-content-server.ts +36 -0
  21. package/src/adapters/node/write-runtime-manifest.ts +38 -0
  22. package/src/adapters/shared/api-response.test.ts +97 -0
  23. package/src/{define-api-handler.ts → adapters/shared/define-api-handler.ts} +1 -1
  24. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  25. package/src/adapters/shared/explicit-static-route-matcher.ts +7 -1
  26. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +90 -0
  27. package/src/adapters/shared/file-route-middleware-pipeline.ts +6 -2
  28. package/src/adapters/shared/fs-server-response-factory.test.ts +187 -0
  29. package/src/adapters/shared/fs-server-response-matcher.test.ts +286 -0
  30. package/src/adapters/shared/fs-server-response-matcher.ts +17 -10
  31. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  32. package/src/adapters/shared/hmr-html-response.ts +52 -0
  33. package/src/adapters/shared/hmr-manager.contract.test.ts +196 -0
  34. package/src/adapters/shared/hmr-manager.dispatch.test.ts +220 -0
  35. package/src/adapters/shared/render-context.test.ts +146 -0
  36. package/src/adapters/shared/render-context.ts +21 -6
  37. package/src/adapters/shared/runtime-bootstrap.ts +79 -0
  38. package/src/adapters/shared/server-adapter.test.ts +77 -0
  39. package/src/adapters/shared/server-adapter.ts +51 -4
  40. package/src/adapters/shared/server-route-handler.test.ts +110 -0
  41. package/src/adapters/shared/server-route-handler.ts +5 -18
  42. package/src/adapters/shared/server-static-builder.test.ts +316 -0
  43. package/src/adapters/shared/server-static-builder.ts +92 -8
  44. package/src/build/README.md +101 -0
  45. package/src/build/build-adapter-serialization.test.ts +268 -0
  46. package/src/build/build-adapter.test.ts +815 -0
  47. package/src/build/build-adapter.ts +234 -6
  48. package/src/build/build-manifest.ts +54 -0
  49. package/src/build/dev-build-coordinator.ts +221 -0
  50. package/src/build/esbuild-build-adapter.ts +132 -84
  51. package/src/build/runtime-build-executor.ts +34 -0
  52. package/src/build/runtime-specifier-alias-plugin.test.ts +43 -0
  53. package/src/build/runtime-specifier-alias-plugin.ts +58 -0
  54. package/src/config/README.md +33 -0
  55. package/src/config/config-builder.test.ts +410 -0
  56. package/src/config/config-builder.ts +281 -49
  57. package/src/constants.ts +15 -0
  58. package/src/declarations.d.ts +18 -13
  59. package/src/eco/README.md +70 -16
  60. package/src/eco/component-render-context.ts +39 -17
  61. package/src/eco/eco.test.ts +678 -0
  62. package/src/eco/eco.ts +29 -8
  63. package/src/eco/eco.types.ts +20 -1
  64. package/src/eco/eco.utils.test.ts +124 -0
  65. package/src/eco/global-injector-map.test.ts +42 -0
  66. package/src/eco/lazy-injector-map.test.ts +66 -0
  67. package/src/eco/module-dependencies.test.ts +30 -0
  68. package/src/errors/http-error.test.ts +134 -0
  69. package/src/global/utils.test.ts +12 -0
  70. package/src/hmr/README.md +26 -0
  71. 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
  72. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  73. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  74. package/src/hmr/client/hmr-runtime.ts +38 -7
  75. package/src/hmr/hmr-strategy.test.ts +124 -0
  76. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  77. package/src/hmr/hmr.test.e2e.ts +29 -38
  78. package/src/hmr/strategies/js-hmr-strategy.test.ts +335 -0
  79. package/src/hmr/strategies/js-hmr-strategy.ts +71 -78
  80. package/src/index.ts +1 -1
  81. package/src/integrations/ghtml/ghtml-renderer.test.ts +63 -0
  82. package/src/integrations/ghtml/ghtml-renderer.ts +4 -1
  83. package/src/internal-types.ts +39 -19
  84. package/src/plugins/README.md +34 -0
  85. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  86. package/src/plugins/alias-resolver-plugin.ts +21 -3
  87. package/src/plugins/eco-component-meta-plugin.test.ts +380 -0
  88. package/src/plugins/eco-component-meta-plugin.ts +10 -3
  89. package/src/plugins/integration-plugin.test.ts +111 -0
  90. package/src/plugins/integration-plugin.ts +45 -3
  91. package/src/plugins/processor.test.ts +148 -0
  92. package/src/plugins/processor.ts +22 -2
  93. package/src/plugins/runtime-capability.ts +14 -0
  94. package/src/public-types.ts +73 -11
  95. package/src/route-renderer/GRAPH.md +16 -20
  96. package/src/route-renderer/README.md +8 -21
  97. package/src/route-renderer/component-graph/component-graph-executor.test.ts +41 -0
  98. package/src/route-renderer/component-graph/component-graph.test.ts +63 -0
  99. package/src/route-renderer/component-graph/component-marker.test.ts +73 -0
  100. package/src/route-renderer/component-graph/component-reference.ts +29 -0
  101. package/src/route-renderer/component-graph/marker-graph-resolver.test.ts +135 -0
  102. package/src/route-renderer/{marker-graph-resolver.ts → component-graph/marker-graph-resolver.ts} +11 -9
  103. package/src/route-renderer/orchestration/integration-renderer.test.ts +936 -0
  104. package/src/route-renderer/{integration-renderer.ts → orchestration/integration-renderer.ts} +113 -19
  105. package/src/route-renderer/orchestration/render-execution.service.test.ts +97 -0
  106. package/src/route-renderer/{render-execution.service.ts → orchestration/render-execution.service.ts} +109 -37
  107. package/src/route-renderer/orchestration/render-preparation.service.test.ts +235 -0
  108. package/src/route-renderer/{render-preparation.service.ts → orchestration/render-preparation.service.ts} +127 -9
  109. package/src/route-renderer/page-loading/dependency-resolver.test.ts +345 -0
  110. package/src/route-renderer/{dependency-resolver.ts → page-loading/dependency-resolver.ts} +28 -12
  111. package/src/route-renderer/page-loading/page-module-loader.test.ts +96 -0
  112. package/src/route-renderer/{page-module-loader.ts → page-loading/page-module-loader.ts} +49 -21
  113. package/src/route-renderer/route-renderer.ts +36 -1
  114. package/src/router/README.md +26 -0
  115. package/src/router/client/link-intent.d.ts +53 -0
  116. package/src/router/client/link-intent.test.browser.ts +51 -0
  117. package/src/router/client/link-intent.ts +92 -0
  118. package/src/router/client/navigation-coordinator.test.ts +237 -0
  119. package/src/router/client/navigation-coordinator.ts +433 -0
  120. package/src/router/server/fs-router-scanner.test.ts +83 -0
  121. package/src/router/{fs-router-scanner.ts → server/fs-router-scanner.ts} +12 -10
  122. package/src/router/server/fs-router.test.ts +214 -0
  123. package/src/router/{fs-router.ts → server/fs-router.ts} +2 -2
  124. package/src/services/README.md +29 -0
  125. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +385 -0
  126. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.ts +101 -6
  127. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  128. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.ts +2 -2
  129. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.ts +2 -1
  130. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +72 -0
  131. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +95 -0
  132. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  133. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  134. package/src/services/{asset-processing-service → assets/asset-processing-service}/index.ts +2 -0
  135. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.ts +1 -1
  136. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  137. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.ts +11 -5
  138. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.ts +17 -27
  139. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +286 -0
  140. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.ts +3 -3
  141. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +227 -0
  142. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.ts +5 -4
  143. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +199 -0
  144. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.ts +4 -1
  145. package/src/services/assets/browser-bundle.service.test.ts +36 -0
  146. package/src/services/assets/browser-bundle.service.ts +53 -0
  147. package/src/services/cache/index.ts +3 -3
  148. package/src/services/cache/memory-cache-store.test.ts +225 -0
  149. package/src/services/cache/memory-cache-store.ts +1 -1
  150. package/src/services/cache/page-cache-service.test.ts +175 -0
  151. package/src/services/cache/page-cache-service.ts +3 -3
  152. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  153. package/src/services/{page-request-cache-coordinator.service.ts → cache/page-request-cache-coordinator.service.ts} +9 -6
  154. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  155. package/src/services/html/html-rewriter-provider.service.ts +103 -0
  156. package/src/services/html/html-transformer.service.test.ts +378 -0
  157. package/src/services/html/html-transformer.service.ts +279 -0
  158. package/src/services/invalidation/development-invalidation.service.test.ts +77 -0
  159. package/src/services/invalidation/development-invalidation.service.ts +261 -0
  160. package/src/services/module-loading/app-server-module-transpiler.service.ts +52 -0
  161. package/src/services/module-loading/page-module-import.service.test.ts +253 -0
  162. package/src/services/module-loading/page-module-import.service.ts +200 -0
  163. package/src/services/module-loading/server-loader.service.test.ts +161 -0
  164. package/src/services/module-loading/server-loader.service.ts +130 -0
  165. package/src/services/module-loading/server-module-transpiler.service.test.ts +115 -0
  166. package/src/services/module-loading/server-module-transpiler.service.ts +105 -0
  167. package/src/services/runtime-manifest/node-runtime-manifest.service.test.ts +95 -0
  168. package/src/services/runtime-manifest/node-runtime-manifest.service.ts +101 -0
  169. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  170. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  171. package/src/services/runtime-state/runtime-specifier-registry.service.ts +96 -0
  172. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  173. package/src/services/validation/schema-validation-service.test.ts +223 -0
  174. package/src/services/{schema-validation-service.ts → validation/schema-validation-service.ts} +1 -1
  175. package/src/static-site-generator/README.md +26 -0
  176. package/src/static-site-generator/static-site-generator.test.ts +307 -0
  177. package/src/static-site-generator/static-site-generator.ts +109 -6
  178. package/src/utils/deep-merge.test.ts +114 -0
  179. package/src/utils/invariant.test.ts +22 -0
  180. package/src/utils/path-utils.test.ts +15 -0
  181. package/src/utils/resolve-work-dir.ts +45 -0
  182. package/src/utils/server-utils.test.ts +38 -0
  183. package/src/watchers/project-watcher.integration.test.ts +337 -0
  184. package/src/watchers/project-watcher.test-helpers.ts +1 -0
  185. package/src/watchers/project-watcher.test.ts +678 -0
  186. package/src/watchers/project-watcher.ts +49 -50
  187. package/CHANGELOG.md +0 -94
  188. package/src/adapters/abstract/application-adapter.d.ts +0 -168
  189. package/src/adapters/abstract/application-adapter.js +0 -109
  190. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  191. package/src/adapters/abstract/router-adapter.js +0 -5
  192. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  193. package/src/adapters/abstract/server-adapter.js +0 -15
  194. package/src/adapters/bun/client-bridge.d.ts +0 -34
  195. package/src/adapters/bun/client-bridge.js +0 -48
  196. package/src/adapters/bun/create-app.d.ts +0 -60
  197. package/src/adapters/bun/create-app.js +0 -117
  198. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  199. package/src/adapters/bun/define-api-handler.js +0 -15
  200. package/src/adapters/bun/define-api-handler.ts +0 -114
  201. package/src/adapters/bun/hmr-manager.d.ts +0 -79
  202. package/src/adapters/bun/hmr-manager.js +0 -222
  203. package/src/adapters/bun/index.d.ts +0 -3
  204. package/src/adapters/bun/index.js +0 -8
  205. package/src/adapters/bun/server-adapter.d.ts +0 -155
  206. package/src/adapters/bun/server-adapter.js +0 -368
  207. package/src/adapters/bun/server-lifecycle.d.ts +0 -52
  208. package/src/adapters/bun/server-lifecycle.js +0 -120
  209. package/src/adapters/index.d.ts +0 -6
  210. package/src/adapters/index.js +0 -14
  211. package/src/adapters/node/create-app.d.ts +0 -21
  212. package/src/adapters/node/create-app.js +0 -143
  213. package/src/adapters/node/index.d.ts +0 -4
  214. package/src/adapters/node/index.js +0 -8
  215. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  216. package/src/adapters/node/node-client-bridge.js +0 -66
  217. package/src/adapters/node/node-hmr-manager.d.ts +0 -62
  218. package/src/adapters/node/node-hmr-manager.js +0 -221
  219. package/src/adapters/node/server-adapter.d.ts +0 -190
  220. package/src/adapters/node/server-adapter.js +0 -420
  221. package/src/adapters/node/static-content-server.d.ts +0 -24
  222. package/src/adapters/node/static-content-server.js +0 -166
  223. package/src/adapters/shared/api-response.d.ts +0 -52
  224. package/src/adapters/shared/api-response.js +0 -96
  225. package/src/adapters/shared/application-adapter.d.ts +0 -18
  226. package/src/adapters/shared/application-adapter.js +0 -90
  227. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -38
  228. package/src/adapters/shared/explicit-static-route-matcher.js +0 -100
  229. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -65
  230. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -98
  231. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -19
  232. package/src/adapters/shared/fs-server-response-factory.js +0 -97
  233. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -71
  234. package/src/adapters/shared/fs-server-response-matcher.js +0 -155
  235. package/src/adapters/shared/render-context.d.ts +0 -14
  236. package/src/adapters/shared/render-context.js +0 -69
  237. package/src/adapters/shared/server-adapter.d.ts +0 -87
  238. package/src/adapters/shared/server-adapter.js +0 -353
  239. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  240. package/src/adapters/shared/server-route-handler.js +0 -120
  241. package/src/adapters/shared/server-static-builder.d.ts +0 -38
  242. package/src/adapters/shared/server-static-builder.js +0 -46
  243. package/src/build/build-adapter.d.ts +0 -75
  244. package/src/build/build-adapter.js +0 -54
  245. package/src/build/build-types.d.ts +0 -57
  246. package/src/build/build-types.js +0 -0
  247. package/src/build/esbuild-build-adapter.d.ts +0 -69
  248. package/src/build/esbuild-build-adapter.js +0 -391
  249. package/src/config/config-builder.d.ts +0 -227
  250. package/src/config/config-builder.js +0 -392
  251. package/src/constants.d.ts +0 -32
  252. package/src/constants.js +0 -21
  253. package/src/create-app.d.ts +0 -17
  254. package/src/create-app.js +0 -66
  255. package/src/define-api-handler.d.ts +0 -25
  256. package/src/define-api-handler.js +0 -15
  257. package/src/dev/sc-server.d.ts +0 -30
  258. package/src/dev/sc-server.js +0 -111
  259. package/src/eco/component-render-context.d.ts +0 -105
  260. package/src/eco/component-render-context.js +0 -77
  261. package/src/eco/eco.d.ts +0 -9
  262. package/src/eco/eco.js +0 -110
  263. package/src/eco/eco.types.d.ts +0 -170
  264. package/src/eco/eco.types.js +0 -0
  265. package/src/eco/eco.utils.d.ts +0 -40
  266. package/src/eco/eco.utils.js +0 -40
  267. package/src/eco/global-injector-map.d.ts +0 -16
  268. package/src/eco/global-injector-map.js +0 -80
  269. package/src/eco/lazy-injector-map.d.ts +0 -8
  270. package/src/eco/lazy-injector-map.js +0 -70
  271. package/src/eco/module-dependencies.d.ts +0 -18
  272. package/src/eco/module-dependencies.js +0 -49
  273. package/src/errors/http-error.d.ts +0 -31
  274. package/src/errors/http-error.js +0 -50
  275. package/src/errors/index.d.ts +0 -2
  276. package/src/errors/index.js +0 -4
  277. package/src/errors/locals-access-error.d.ts +0 -4
  278. package/src/errors/locals-access-error.js +0 -9
  279. package/src/global/app-logger.d.ts +0 -2
  280. package/src/global/app-logger.js +0 -6
  281. package/src/hmr/client/hmr-runtime.d.ts +0 -10
  282. package/src/hmr/client/hmr-runtime.js +0 -86
  283. package/src/hmr/hmr-strategy.d.ts +0 -159
  284. package/src/hmr/hmr-strategy.js +0 -29
  285. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  286. package/src/hmr/hmr.test.e2e.js +0 -50
  287. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  288. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  289. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -136
  290. package/src/hmr/strategies/js-hmr-strategy.js +0 -192
  291. package/src/index.browser.d.ts +0 -3
  292. package/src/index.browser.js +0 -4
  293. package/src/index.d.ts +0 -5
  294. package/src/index.js +0 -10
  295. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -15
  296. package/src/integrations/ghtml/ghtml-renderer.js +0 -60
  297. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -20
  298. package/src/integrations/ghtml/ghtml.plugin.js +0 -21
  299. package/src/internal-types.d.ts +0 -200
  300. package/src/internal-types.js +0 -0
  301. package/src/plugins/alias-resolver-plugin.d.ts +0 -2
  302. package/src/plugins/alias-resolver-plugin.js +0 -39
  303. package/src/plugins/eco-component-meta-plugin.d.ts +0 -95
  304. package/src/plugins/eco-component-meta-plugin.js +0 -157
  305. package/src/plugins/integration-plugin.d.ts +0 -102
  306. package/src/plugins/integration-plugin.js +0 -100
  307. package/src/plugins/processor.d.ts +0 -82
  308. package/src/plugins/processor.js +0 -122
  309. package/src/public-types.d.ts +0 -1094
  310. package/src/public-types.js +0 -0
  311. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  312. package/src/route-renderer/component-graph-executor.js +0 -31
  313. package/src/route-renderer/component-graph.d.ts +0 -42
  314. package/src/route-renderer/component-graph.js +0 -72
  315. package/src/route-renderer/component-marker.d.ts +0 -52
  316. package/src/route-renderer/component-marker.js +0 -46
  317. package/src/route-renderer/dependency-resolver.d.ts +0 -24
  318. package/src/route-renderer/dependency-resolver.js +0 -428
  319. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  320. package/src/route-renderer/html-post-processing.service.js +0 -86
  321. package/src/route-renderer/html-post-processing.service.ts +0 -103
  322. package/src/route-renderer/integration-renderer.d.ts +0 -339
  323. package/src/route-renderer/integration-renderer.js +0 -526
  324. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  325. package/src/route-renderer/marker-graph-resolver.js +0 -93
  326. package/src/route-renderer/page-module-loader.d.ts +0 -61
  327. package/src/route-renderer/page-module-loader.js +0 -102
  328. package/src/route-renderer/render-execution.service.d.ts +0 -69
  329. package/src/route-renderer/render-execution.service.js +0 -91
  330. package/src/route-renderer/render-preparation.service.d.ts +0 -112
  331. package/src/route-renderer/render-preparation.service.js +0 -243
  332. package/src/route-renderer/route-renderer.d.ts +0 -26
  333. package/src/route-renderer/route-renderer.js +0 -68
  334. package/src/router/fs-router-scanner.d.ts +0 -41
  335. package/src/router/fs-router-scanner.js +0 -155
  336. package/src/router/fs-router.d.ts +0 -26
  337. package/src/router/fs-router.js +0 -100
  338. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  339. package/src/services/asset-processing-service/asset-processing.service.js +0 -250
  340. package/src/services/asset-processing-service/asset.factory.d.ts +0 -17
  341. package/src/services/asset-processing-service/asset.factory.js +0 -82
  342. package/src/services/asset-processing-service/assets.types.d.ts +0 -88
  343. package/src/services/asset-processing-service/assets.types.js +0 -0
  344. package/src/services/asset-processing-service/index.d.ts +0 -3
  345. package/src/services/asset-processing-service/index.js +0 -3
  346. package/src/services/asset-processing-service/processor.interface.d.ts +0 -22
  347. package/src/services/asset-processing-service/processor.interface.js +0 -6
  348. package/src/services/asset-processing-service/processor.registry.d.ts +0 -8
  349. package/src/services/asset-processing-service/processor.registry.js +0 -15
  350. package/src/services/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  351. package/src/services/asset-processing-service/processors/base/base-processor.js +0 -59
  352. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
  353. package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
  354. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  355. package/src/services/asset-processing-service/processors/index.js +0 -5
  356. package/src/services/asset-processing-service/processors/script/content-script.processor.d.ts +0 -5
  357. package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
  358. package/src/services/asset-processing-service/processors/script/file-script.processor.d.ts +0 -8
  359. package/src/services/asset-processing-service/processors/script/file-script.processor.js +0 -76
  360. package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  361. package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
  362. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -5
  363. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  364. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  365. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -63
  366. package/src/services/cache/cache.types.d.ts +0 -107
  367. package/src/services/cache/cache.types.js +0 -0
  368. package/src/services/cache/index.d.ts +0 -7
  369. package/src/services/cache/index.js +0 -7
  370. package/src/services/cache/memory-cache-store.d.ts +0 -42
  371. package/src/services/cache/memory-cache-store.js +0 -98
  372. package/src/services/cache/page-cache-service.d.ts +0 -70
  373. package/src/services/cache/page-cache-service.js +0 -152
  374. package/src/services/html-transformer.service.d.ts +0 -50
  375. package/src/services/html-transformer.service.js +0 -163
  376. package/src/services/html-transformer.service.ts +0 -217
  377. package/src/services/page-module-import.service.d.ts +0 -37
  378. package/src/services/page-module-import.service.js +0 -88
  379. package/src/services/page-module-import.service.ts +0 -129
  380. package/src/services/page-request-cache-coordinator.service.d.ts +0 -75
  381. package/src/services/page-request-cache-coordinator.service.js +0 -107
  382. package/src/services/schema-validation-service.d.ts +0 -122
  383. package/src/services/schema-validation-service.js +0 -101
  384. package/src/services/validation/standard-schema.types.d.ts +0 -65
  385. package/src/services/validation/standard-schema.types.js +0 -0
  386. package/src/static-site-generator/static-site-generator.d.ts +0 -57
  387. package/src/static-site-generator/static-site-generator.js +0 -272
  388. package/src/utils/css.d.ts +0 -1
  389. package/src/utils/css.js +0 -7
  390. package/src/utils/deep-merge.d.ts +0 -14
  391. package/src/utils/deep-merge.js +0 -32
  392. package/src/utils/hash.d.ts +0 -1
  393. package/src/utils/hash.js +0 -7
  394. package/src/utils/html.d.ts +0 -1
  395. package/src/utils/html.js +0 -4
  396. package/src/utils/invariant.d.ts +0 -5
  397. package/src/utils/invariant.js +0 -11
  398. package/src/utils/locals-utils.d.ts +0 -15
  399. package/src/utils/locals-utils.js +0 -24
  400. package/src/utils/parse-cli-args.d.ts +0 -24
  401. package/src/utils/parse-cli-args.js +0 -47
  402. package/src/utils/path-utils.module.d.ts +0 -5
  403. package/src/utils/path-utils.module.js +0 -14
  404. package/src/utils/runtime.d.ts +0 -11
  405. package/src/utils/runtime.js +0 -40
  406. package/src/utils/server-utils.module.d.ts +0 -19
  407. package/src/utils/server-utils.module.js +0 -56
  408. package/src/watchers/project-watcher.d.ts +0 -132
  409. package/src/watchers/project-watcher.js +0 -281
  410. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  411. package/src/watchers/project-watcher.test-helpers.js +0 -51
  412. /package/src/route-renderer/{component-graph-executor.ts → component-graph/component-graph-executor.ts} +0 -0
  413. /package/src/route-renderer/{component-graph.ts → component-graph/component-graph.ts} +0 -0
  414. /package/src/route-renderer/{component-marker.ts → component-graph/component-marker.ts} +0 -0
  415. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.ts +0 -0
  416. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/index.ts +0 -0
  417. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.ts +0 -0
  418. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.ts +0 -0
@@ -0,0 +1,253 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
2
+ import assert from 'node:assert/strict';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { afterEach, beforeEach, describe, it } from 'vitest';
6
+ import type { BuildResult } from '../../build/build-adapter.js';
7
+ import { PageModuleImportService, type PageModuleImportDependencies } from './page-module-import.service.ts';
8
+
9
+ function createBuildResult(overrides?: Partial<BuildResult>): BuildResult {
10
+ return {
11
+ success: true,
12
+ logs: [],
13
+ outputs: [],
14
+ ...overrides,
15
+ };
16
+ }
17
+
18
+ function createFakeDependencies(): {
19
+ dependencies: PageModuleImportDependencies;
20
+ calls: {
21
+ hashFile: string[];
22
+ buildModule: Array<{
23
+ options: Parameters<PageModuleImportDependencies['buildModule']>[0];
24
+ buildExecutor: Parameters<PageModuleImportDependencies['buildModule']>[1];
25
+ }>;
26
+ };
27
+ setNextBuildResult(result: BuildResult): void;
28
+ } {
29
+ const calls = {
30
+ hashFile: [] as string[],
31
+ buildModule: [] as Array<{
32
+ options: Parameters<PageModuleImportDependencies['buildModule']>[0];
33
+ buildExecutor: Parameters<PageModuleImportDependencies['buildModule']>[1];
34
+ }>,
35
+ };
36
+ let nextBuildResult = createBuildResult();
37
+
38
+ return {
39
+ dependencies: {
40
+ hashFile(filePath: string): string {
41
+ calls.hashFile.push(filePath);
42
+ return 'hash123';
43
+ },
44
+ async buildModule(options, buildExecutor): Promise<BuildResult> {
45
+ calls.buildModule.push({ options, buildExecutor });
46
+ return nextBuildResult;
47
+ },
48
+ },
49
+ calls,
50
+ setNextBuildResult(result: BuildResult): void {
51
+ nextBuildResult = result;
52
+ },
53
+ };
54
+ }
55
+
56
+ describe('PageModuleImportService', () => {
57
+ let service: PageModuleImportService;
58
+ let fakeDependencies: ReturnType<typeof createFakeDependencies>;
59
+
60
+ beforeEach(() => {
61
+ fakeDependencies = createFakeDependencies();
62
+ service = new PageModuleImportService(fakeDependencies.dependencies);
63
+ });
64
+
65
+ afterEach(() => {
66
+ service.clearImportCache();
67
+ delete process.env.NODE_ENV;
68
+ });
69
+
70
+ it('should import the transpiled output in node runtimes', async () => {
71
+ const tempDir = mkdtempSync(join(tmpdir(), 'ecopages-page-module-import-'));
72
+ const compiledOutput = join(tempDir, 'page-hash123.js');
73
+ writeFileSync(compiledOutput, 'export const value = 42; export default { ok: true };', 'utf8');
74
+ fakeDependencies.setNextBuildResult(createBuildResult({ outputs: [{ path: compiledOutput }] }));
75
+
76
+ try {
77
+ const result = await service.importModule<{ default: { ok: boolean }; value: number }>({
78
+ filePath: '/app/pages/page.tsx',
79
+ rootDir: '/app',
80
+ outdir: tempDir,
81
+ });
82
+
83
+ assert.deepEqual(result.default, { ok: true });
84
+ assert.equal(result.value, 42);
85
+ assert.deepEqual(fakeDependencies.calls.hashFile, ['/app/pages/page.tsx']);
86
+ assert.deepEqual(fakeDependencies.calls.buildModule, [
87
+ {
88
+ options: {
89
+ entrypoints: ['/app/pages/page.tsx'],
90
+ root: '/app',
91
+ outdir: tempDir,
92
+ target: 'node',
93
+ format: 'esm',
94
+ sourcemap: 'none',
95
+ splitting: true,
96
+ minify: false,
97
+ naming: 'page-hash123.js',
98
+ externalPackages: true,
99
+ plugins: undefined,
100
+ },
101
+ buildExecutor: undefined,
102
+ },
103
+ ]);
104
+ } finally {
105
+ rmSync(tempDir, { recursive: true, force: true });
106
+ }
107
+ });
108
+
109
+ it('should throw the provided transpile error when the build fails', async () => {
110
+ fakeDependencies.setNextBuildResult(
111
+ createBuildResult({
112
+ success: false,
113
+ logs: [{ message: 'Unexpected token' }],
114
+ outputs: [],
115
+ }),
116
+ );
117
+
118
+ await assert.rejects(
119
+ service.importModule({
120
+ filePath: '/app/pages/page.tsx',
121
+ rootDir: '/app',
122
+ outdir: '/tmp/out',
123
+ transpileErrorMessage: (details) => `transpile failed: ${details}`,
124
+ }),
125
+ /transpile failed: Unexpected token/,
126
+ );
127
+ });
128
+
129
+ it('should keep a stable node module path in development for unchanged files', async () => {
130
+ process.env.NODE_ENV = 'development';
131
+ const tempDir = mkdtempSync(join(tmpdir(), 'ecopages-page-module-import-dev-'));
132
+ const compiledOutput = join(tempDir, 'page-hash123.js');
133
+ writeFileSync(compiledOutput, 'export default { ok: true };', 'utf8');
134
+ fakeDependencies.setNextBuildResult(createBuildResult({ outputs: [{ path: compiledOutput }] }));
135
+
136
+ try {
137
+ await service.importModule({
138
+ filePath: '/app/pages/page.tsx',
139
+ rootDir: '/app',
140
+ outdir: tempDir,
141
+ });
142
+
143
+ assert.equal(fakeDependencies.calls.buildModule.length, 1);
144
+ assert.equal(fakeDependencies.calls.buildModule[0]?.options.naming, 'page-hash123.js');
145
+ assert.equal(fakeDependencies.calls.buildModule[0]?.options.splitting, true);
146
+ assert.equal(fakeDependencies.calls.buildModule[0]?.options.externalPackages, true);
147
+ } finally {
148
+ rmSync(tempDir, { recursive: true, force: true });
149
+ }
150
+ });
151
+
152
+ it('should allow callers to opt back into bundled node imports explicitly', async () => {
153
+ process.env.NODE_ENV = 'development';
154
+ const tempDir = mkdtempSync(join(tmpdir(), 'ecopages-page-module-import-bundled-'));
155
+ const compiledOutput = join(tempDir, 'page-hash123.js');
156
+ writeFileSync(compiledOutput, 'export default { ok: true };', 'utf8');
157
+ fakeDependencies.setNextBuildResult(createBuildResult({ outputs: [{ path: compiledOutput }] }));
158
+
159
+ try {
160
+ await service.importModule({
161
+ filePath: '/app/pages/page.tsx',
162
+ rootDir: '/app',
163
+ outdir: tempDir,
164
+ externalPackages: false,
165
+ });
166
+
167
+ assert.equal(fakeDependencies.calls.buildModule.length, 1);
168
+ assert.equal(fakeDependencies.calls.buildModule[0]?.options.externalPackages, false);
169
+ } finally {
170
+ rmSync(tempDir, { recursive: true, force: true });
171
+ }
172
+ });
173
+
174
+ it('should allow callers to disable code splitting explicitly', async () => {
175
+ const tempDir = mkdtempSync(join(tmpdir(), 'ecopages-page-module-import-unsplit-'));
176
+ const compiledOutput = join(tempDir, 'page-hash123.js');
177
+ writeFileSync(compiledOutput, 'export default { ok: true };', 'utf8');
178
+ fakeDependencies.setNextBuildResult(createBuildResult({ outputs: [{ path: compiledOutput }] }));
179
+
180
+ try {
181
+ await service.importModule({
182
+ filePath: '/app/pages/page.tsx',
183
+ rootDir: '/app',
184
+ outdir: tempDir,
185
+ splitting: false,
186
+ });
187
+
188
+ assert.equal(fakeDependencies.calls.buildModule.length, 1);
189
+ assert.equal(fakeDependencies.calls.buildModule[0]?.options.splitting, false);
190
+ } finally {
191
+ rmSync(tempDir, { recursive: true, force: true });
192
+ }
193
+ });
194
+
195
+ it('should reuse cached node modules across different output directories', async () => {
196
+ const tempDir = mkdtempSync(join(tmpdir(), 'ecopages-page-module-import-cache-'));
197
+ const compiledOutput = join(tempDir, 'page-hash123.js');
198
+ writeFileSync(compiledOutput, 'export default { ok: true };', 'utf8');
199
+ fakeDependencies.setNextBuildResult(createBuildResult({ outputs: [{ path: compiledOutput }] }));
200
+
201
+ try {
202
+ const first = await service.importModule<{ default: { ok: boolean } }>({
203
+ filePath: '/app/pages/page.tsx',
204
+ rootDir: '/app',
205
+ outdir: join(tempDir, 'meta'),
206
+ });
207
+
208
+ const second = await service.importModule<{ default: { ok: boolean } }>({
209
+ filePath: '/app/pages/page.tsx',
210
+ rootDir: '/app',
211
+ outdir: join(tempDir, 'render'),
212
+ });
213
+
214
+ assert.deepEqual(first.default, { ok: true });
215
+ assert.deepEqual(second.default, { ok: true });
216
+ assert.equal(fakeDependencies.calls.buildModule.length, 1);
217
+ } finally {
218
+ rmSync(tempDir, { recursive: true, force: true });
219
+ }
220
+ });
221
+
222
+ it('should reload the same node module path after development graph invalidation', async () => {
223
+ process.env.NODE_ENV = 'development';
224
+ const tempDir = mkdtempSync(join(tmpdir(), 'ecopages-page-module-import-invalidate-'));
225
+ const compiledOutput = join(tempDir, 'page-hash123.js');
226
+ writeFileSync(compiledOutput, 'export const version = 1; export default { ok: true };', 'utf8');
227
+ fakeDependencies.setNextBuildResult(createBuildResult({ outputs: [{ path: compiledOutput }] }));
228
+
229
+ try {
230
+ const first = await service.importModule<{ version: number }>({
231
+ filePath: '/app/pages/page.tsx',
232
+ rootDir: '/app',
233
+ outdir: tempDir,
234
+ });
235
+
236
+ writeFileSync(compiledOutput, 'export const version = 2; export default { ok: true };', 'utf8');
237
+ service.invalidateDevelopmentGraph();
238
+ fakeDependencies.setNextBuildResult(createBuildResult({ outputs: [{ path: compiledOutput }] }));
239
+
240
+ const second = await service.importModule<{ version: number }>({
241
+ filePath: '/app/pages/page.tsx',
242
+ rootDir: '/app',
243
+ outdir: tempDir,
244
+ });
245
+
246
+ assert.equal(first.version, 1);
247
+ assert.equal(second.version, 2);
248
+ assert.equal(fakeDependencies.calls.buildModule.length, 2);
249
+ } finally {
250
+ rmSync(tempDir, { recursive: true, force: true });
251
+ }
252
+ });
253
+ });
@@ -0,0 +1,200 @@
1
+ import path from 'node:path';
2
+ import { pathToFileURL } from 'node:url';
3
+ import { fileSystem } from '@ecopages/file-system';
4
+ import { build, type BuildExecutor, type BuildResult } from '../../build/build-adapter.ts';
5
+ import type { EcoBuildPlugin } from '../../build/build-types.ts';
6
+
7
+ export interface PageModuleImportOptions {
8
+ filePath: string;
9
+ rootDir: string;
10
+ outdir: string;
11
+ buildExecutor?: BuildExecutor;
12
+ invalidationVersion?: number;
13
+ splitting?: boolean;
14
+ externalPackages?: boolean;
15
+ plugins?: EcoBuildPlugin[];
16
+ transpileErrorMessage?: (details: string) => string;
17
+ noOutputMessage?: (filePath: string) => string;
18
+ }
19
+
20
+ /**
21
+ * Minimal runtime dependencies required to load page modules.
22
+ *
23
+ * @remarks
24
+ * This service owns cache and runtime import policy. Hashing and build
25
+ * execution are injected so tests can provide explicit fakes without module
26
+ * interception.
27
+ */
28
+ export interface PageModuleImportDependencies {
29
+ hashFile(filePath: string): string;
30
+ buildModule(options: Parameters<typeof build>[0], buildExecutor?: BuildExecutor): Promise<BuildResult>;
31
+ }
32
+
33
+ /**
34
+ * Loads source page modules in a runtime-agnostic way.
35
+ *
36
+ * This service centralizes the Bun-vs-Node import strategy used by route
37
+ * scanning, page data loading, and request-time page inspection. In Bun it can
38
+ * import source files directly; in Node it transpiles the file into a dedicated
39
+ * output directory first and then imports the generated module.
40
+ *
41
+ * Keeping this logic in one place prevents subtle drift in cache-busting,
42
+ * transpilation settings, and error semantics across the different callers.
43
+ */
44
+ export class PageModuleImportService {
45
+ private readonly dependencies: PageModuleImportDependencies;
46
+ private readonly importCache = new Map<string, Promise<unknown>>();
47
+ private developmentInvalidationVersion = 0;
48
+
49
+ constructor(dependencies?: Partial<PageModuleImportDependencies>) {
50
+ this.dependencies = {
51
+ hashFile: dependencies?.hashFile ?? ((filePath) => fileSystem.hash(filePath)),
52
+ buildModule: dependencies?.buildModule ?? ((options, buildExecutor) => build(options, buildExecutor)),
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Clears the shared import cache used by framework-owned page-module loads.
58
+ */
59
+ clearImportCache(): void {
60
+ this.importCache.clear();
61
+ }
62
+
63
+ /**
64
+ * Invalidates all previously imported modules in development by clearing the
65
+ * import cache and incrementing the invalidation version included in cache keys.
66
+ *
67
+ * This forces all modules to be reloaded on the next import, even if their
68
+ * source content hasn't changed. This is necessary to ensure that changes to
69
+ * non-content aspects of modules (e.g. dependencies, transpilation output)
70
+ * are picked up during development.
71
+ */
72
+ invalidateDevelopmentGraph(): void {
73
+ this.clearImportCache();
74
+ this.developmentInvalidationVersion += 1;
75
+ }
76
+
77
+ /**
78
+ * Imports a page-like module from source.
79
+ *
80
+ * The caller controls the output directory and error wording so different
81
+ * subsystems can reuse the same loading mechanism while preserving their
82
+ * current diagnostics. Module identities stay stable for unchanged files and
83
+ * roll forward automatically when the source hash changes during watch mode.
84
+ *
85
+ * @typeParam T Expected module shape.
86
+ * @param options Runtime-specific import settings.
87
+ * @returns The loaded module.
88
+ */
89
+ async importModule<T = unknown>(options: PageModuleImportOptions): Promise<T> {
90
+ const { filePath, rootDir, externalPackages, splitting } = options;
91
+ const invalidationVersion = options.invalidationVersion ?? this.developmentInvalidationVersion;
92
+
93
+ const fileHash = this.dependencies.hashFile(filePath);
94
+ const runtime = typeof Bun !== 'undefined' ? 'bun' : 'node';
95
+ const cacheKey = [
96
+ runtime,
97
+ filePath,
98
+ rootDir,
99
+ splitting ?? 'default',
100
+ externalPackages ?? 'default',
101
+ fileHash,
102
+ invalidationVersion,
103
+ ].join('::');
104
+ const cachedModule = this.importCache.get(cacheKey);
105
+
106
+ if (cachedModule) {
107
+ return (await cachedModule) as T;
108
+ }
109
+
110
+ const importPromise = this.loadModule<T>({
111
+ ...options,
112
+ fileHash,
113
+ });
114
+
115
+ this.importCache.set(cacheKey, importPromise);
116
+
117
+ try {
118
+ return await importPromise;
119
+ } catch (error) {
120
+ this.importCache.delete(cacheKey);
121
+ throw error;
122
+ }
123
+ }
124
+
125
+ private async loadModule<T = unknown>(
126
+ options: PageModuleImportOptions & {
127
+ fileHash: string;
128
+ },
129
+ ): Promise<T> {
130
+ /**
131
+ * Runtime-specific module loading stays centralized here so callers can share
132
+ * one cache-key and invalidation model while still diverging between Bun's
133
+ * direct source imports and Node's transpile-then-import path.
134
+ */
135
+ const {
136
+ filePath,
137
+ rootDir,
138
+ outdir,
139
+ invalidationVersion = this.developmentInvalidationVersion,
140
+ splitting,
141
+ externalPackages,
142
+ transpileErrorMessage = (details) => `Error transpiling page module: ${details}`,
143
+ noOutputMessage = (targetFilePath) => `No transpiled output generated for page module: ${targetFilePath}`,
144
+ fileHash,
145
+ } = options;
146
+
147
+ if (typeof Bun !== 'undefined') {
148
+ const moduleUrl = pathToFileURL(filePath);
149
+
150
+ if (process.env.NODE_ENV === 'development') {
151
+ moduleUrl.searchParams.set('update', `${fileHash}-${invalidationVersion}`);
152
+ }
153
+
154
+ return (await import(moduleUrl.href)) as T;
155
+ }
156
+
157
+ const fileBaseName = path.basename(filePath, path.extname(filePath));
158
+ const outputFileName = `${fileBaseName}-${fileHash}.js`;
159
+
160
+ const buildResult = await this.dependencies.buildModule(
161
+ {
162
+ entrypoints: [filePath],
163
+ root: rootDir,
164
+ outdir,
165
+ target: 'node',
166
+ format: 'esm',
167
+ sourcemap: 'none',
168
+ splitting: splitting ?? true,
169
+ minify: false,
170
+ naming: outputFileName,
171
+ externalPackages: true,
172
+ plugins: options.plugins,
173
+ ...(externalPackages !== undefined ? { externalPackages } : {}),
174
+ },
175
+ options.buildExecutor,
176
+ );
177
+
178
+ if (!buildResult.success) {
179
+ const details = buildResult.logs.map((log) => log.message).join(' | ');
180
+ throw new Error(transpileErrorMessage(details));
181
+ }
182
+
183
+ const preferredOutputPath = path.join(outdir, outputFileName);
184
+ const compiledOutput =
185
+ buildResult.outputs.find((output) => output.path === preferredOutputPath)?.path ??
186
+ buildResult.outputs.find((output) => output.path.endsWith('.js'))?.path;
187
+
188
+ if (!compiledOutput) {
189
+ throw new Error(noOutputMessage(filePath));
190
+ }
191
+
192
+ const compiledOutputUrl = pathToFileURL(compiledOutput);
193
+
194
+ if (process.env.NODE_ENV === 'development') {
195
+ compiledOutputUrl.searchParams.set('update', `${fileHash}-${invalidationVersion}`);
196
+ }
197
+
198
+ return (await import(compiledOutputUrl.href)) as T;
199
+ }
200
+ }
@@ -0,0 +1,161 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'vitest';
3
+ import type { BuildResult } from '../../build/build-adapter.js';
4
+ import {
5
+ TranspilerServerLoader,
6
+ type ServerLoaderDependencyFactory,
7
+ type ServerLoaderTranspilerDependency,
8
+ } from './server-loader.service.ts';
9
+ import type { ServerModuleTranspilerBootstrapArgs } from './server-module-transpiler.service.ts';
10
+
11
+ function createBuildResult(): BuildResult {
12
+ return {
13
+ success: true,
14
+ logs: [],
15
+ outputs: [],
16
+ };
17
+ }
18
+
19
+ function createFakeTranspilerFactory(): {
20
+ factory: ServerLoaderDependencyFactory;
21
+ constructorArgs: ServerModuleTranspilerBootstrapArgs[];
22
+ importCalls: Array<unknown>;
23
+ invalidateCalls: Array<string[] | undefined>;
24
+ disposeCalls: number;
25
+ setNextImportResult(result: unknown): void;
26
+ } {
27
+ const constructorArgs: ServerModuleTranspilerBootstrapArgs[] = [];
28
+ const importCalls: Array<unknown> = [];
29
+ const invalidateCalls: Array<string[] | undefined> = [];
30
+ let disposeCalls = 0;
31
+ let nextImportResult: unknown = undefined;
32
+
33
+ return {
34
+ factory: {
35
+ createTranspiler(context): ServerLoaderTranspilerDependency {
36
+ constructorArgs.push(context);
37
+
38
+ return {
39
+ async importModule<T = unknown>(
40
+ options: Parameters<ServerLoaderTranspilerDependency['importModule']>[0],
41
+ ): Promise<T> {
42
+ importCalls.push(options);
43
+ return nextImportResult as T;
44
+ },
45
+ invalidate(changedFiles?: string[]): void {
46
+ invalidateCalls.push(changedFiles);
47
+ },
48
+ async dispose(): Promise<void> {
49
+ disposeCalls += 1;
50
+ },
51
+ };
52
+ },
53
+ },
54
+ constructorArgs,
55
+ importCalls,
56
+ invalidateCalls,
57
+ get disposeCalls() {
58
+ return disposeCalls;
59
+ },
60
+ setNextImportResult(result: unknown): void {
61
+ nextImportResult = result;
62
+ },
63
+ };
64
+ }
65
+
66
+ describe('TranspilerServerLoader', () => {
67
+ it('loads config through the bootstrap transpiler context', async () => {
68
+ const fakeFactory = createFakeTranspilerFactory();
69
+ const buildExecutor = { build: async () => createBuildResult() };
70
+ fakeFactory.setNextImportResult({ default: { ok: true } });
71
+
72
+ const loader = new TranspilerServerLoader(
73
+ {
74
+ rootDir: '/bootstrap-app',
75
+ getBuildExecutor: () => buildExecutor,
76
+ },
77
+ fakeFactory.factory,
78
+ );
79
+
80
+ await loader.loadConfig({
81
+ filePath: '/bootstrap-app/eco.config.ts',
82
+ outdir: '/bootstrap-app/.eco/.server-config',
83
+ });
84
+
85
+ assert.deepEqual(fakeFactory.constructorArgs, [
86
+ {
87
+ rootDir: '/bootstrap-app',
88
+ getBuildExecutor: fakeFactory.constructorArgs[0]?.getBuildExecutor,
89
+ },
90
+ ]);
91
+ assert.deepEqual(fakeFactory.constructorArgs[0]?.getBuildExecutor(), buildExecutor);
92
+ assert.deepEqual(fakeFactory.importCalls, [
93
+ {
94
+ filePath: '/bootstrap-app/eco.config.ts',
95
+ outdir: '/bootstrap-app/.eco/.server-config',
96
+ },
97
+ ]);
98
+ });
99
+
100
+ it('rebinding app context routes app loads through a new transpiler instance', async () => {
101
+ const fakeFactory = createFakeTranspilerFactory();
102
+ const bootstrapBuildExecutor = { build: async () => createBuildResult() };
103
+ const appBuildExecutor = { build: async () => createBuildResult() };
104
+ fakeFactory.setNextImportResult({});
105
+
106
+ const loader = new TranspilerServerLoader(
107
+ {
108
+ rootDir: '/bootstrap-app',
109
+ getBuildExecutor: () => bootstrapBuildExecutor,
110
+ },
111
+ fakeFactory.factory,
112
+ );
113
+
114
+ loader.rebindAppContext({
115
+ rootDir: '/app',
116
+ getBuildExecutor: () => appBuildExecutor,
117
+ });
118
+
119
+ await loader.loadApp({
120
+ filePath: '/app/app.ts',
121
+ outdir: '/app/.eco/.server-entry',
122
+ });
123
+
124
+ assert.equal(fakeFactory.constructorArgs.length, 2);
125
+ assert.equal(fakeFactory.constructorArgs[0]?.rootDir, '/bootstrap-app');
126
+ assert.equal(fakeFactory.constructorArgs[1]?.rootDir, '/app');
127
+ assert.deepEqual(fakeFactory.constructorArgs[0]?.getBuildExecutor(), bootstrapBuildExecutor);
128
+ assert.deepEqual(fakeFactory.constructorArgs[1]?.getBuildExecutor(), appBuildExecutor);
129
+ assert.deepEqual(fakeFactory.importCalls, [
130
+ {
131
+ filePath: '/app/app.ts',
132
+ outdir: '/app/.eco/.server-entry',
133
+ },
134
+ ]);
135
+ });
136
+
137
+ it('forwards invalidate and dispose to owned transpiler instances', async () => {
138
+ const fakeFactory = createFakeTranspilerFactory();
139
+ const bootstrapBuildExecutor = { build: async () => createBuildResult() };
140
+ const appBuildExecutor = { build: async () => createBuildResult() };
141
+
142
+ const loader = new TranspilerServerLoader(
143
+ {
144
+ rootDir: '/bootstrap-app',
145
+ getBuildExecutor: () => bootstrapBuildExecutor,
146
+ },
147
+ fakeFactory.factory,
148
+ );
149
+
150
+ loader.rebindAppContext({
151
+ rootDir: '/app',
152
+ getBuildExecutor: () => appBuildExecutor,
153
+ });
154
+
155
+ loader.invalidate();
156
+ await loader.dispose();
157
+
158
+ assert.deepEqual(fakeFactory.invalidateCalls, [undefined, undefined]);
159
+ assert.equal(fakeFactory.disposeCalls, 2);
160
+ });
161
+ });