@ecopages/core 0.2.0-alpha.4 → 0.2.0-alpha.6

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 +181 -68
  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 +208 -116
  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 +235 -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 -83
  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 +115 -115
  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 -16
  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 -1
  185. package/src/watchers/project-watcher.test.ts +678 -0
  186. package/src/watchers/project-watcher.ts +130 -111
  187. package/CHANGELOG.md +0 -91
  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 -85
  202. package/src/adapters/bun/hmr-manager.js +0 -240
  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 -63
  218. package/src/adapters/node/node-hmr-manager.js +0 -237
  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 -74
  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 -390
  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 -188
  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 -1098
  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 -125
  409. package/src/watchers/project-watcher.js +0 -265
  410. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  411. package/src/watchers/project-watcher.test-helpers.js +0 -52
  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
@@ -9,9 +9,15 @@ import { fileSystem } from '@ecopages/file-system';
9
9
  import { SharedServerAdapter } from '../shared/server-adapter.ts';
10
10
  import type { ServerAdapterResult } from '../abstract/server-adapter.ts';
11
11
  import { ApiResponseBuilder } from '../shared/api-response.ts';
12
+ import { installSharedRuntimeBuildExecutor } from '../shared/runtime-bootstrap.ts';
12
13
 
13
14
  import { ServerRouteHandler, type ServerRouteHandlerParams } from '../shared/server-route-handler.ts';
14
15
  import { ServerStaticBuilder, type ServerStaticBuilderParams } from '../shared/server-static-builder';
16
+ import {
17
+ injectHmrRuntimeIntoHtmlResponse,
18
+ isHtmlResponse,
19
+ shouldInjectHmrHtmlResponse,
20
+ } from '../shared/hmr-html-response';
15
21
  import { ClientBridge } from './client-bridge';
16
22
  import { HmrManager } from './hmr-manager';
17
23
  import { ServerLifecycle } from './server-lifecycle.ts';
@@ -108,15 +114,14 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
108
114
  * Only injects in watch mode when HMR manager is enabled.
109
115
  */
110
116
  private shouldInjectHmrScript(): boolean {
111
- return this.options?.watch === true && this.hmrManager?.isEnabled() === true;
117
+ return shouldInjectHmrHtmlResponse(this.options?.watch === true, this.hmrManager);
112
118
  }
113
119
 
114
120
  /**
115
121
  * Checks if a response contains HTML content.
116
122
  */
117
123
  private isHtmlResponse(response: Response): boolean {
118
- const contentType = response.headers.get('Content-Type');
119
- return contentType !== null && contentType.startsWith('text/html');
124
+ return isHtmlResponse(response);
120
125
  }
121
126
 
122
127
  /**
@@ -125,18 +130,7 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
125
130
  */
126
131
  private async maybeInjectHmrScript(response: Response): Promise<Response> {
127
132
  if (this.shouldInjectHmrScript() && this.isHtmlResponse(response)) {
128
- const html = await response.text();
129
- const hmrScript = `<script type="module">import '/_hmr_runtime.js';</script>`;
130
- const updatedHtml = html.replace(/<\/html>/i, `${hmrScript}</html>`);
131
-
132
- const headers = new Headers(response.headers);
133
- headers.delete('Content-Length');
134
-
135
- return new Response(updatedHtml, {
136
- status: response.status,
137
- statusText: response.statusText,
138
- headers,
139
- });
133
+ return injectHmrRuntimeIntoHtmlResponse(response);
140
134
  }
141
135
  return response;
142
136
  }
@@ -146,6 +140,10 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
146
140
  * Delegates to ServerLifecycle for setup.
147
141
  */
148
142
  public async initialize(): Promise<void> {
143
+ installSharedRuntimeBuildExecutor(this.appConfig, {
144
+ development: this.options?.watch === true,
145
+ });
146
+
149
147
  this.bridge = this.bridgeFactory ?? new ClientBridge();
150
148
  this.hmrManager = this.hmrManagerFactory ?? new HmrManager({ appConfig: this.appConfig, bridge: this.bridge });
151
149
  this.lifecycle =
@@ -163,6 +161,7 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
163
161
  appConfig: this.appConfig,
164
162
  staticSiteGenerator: this.staticSiteGenerator,
165
163
  serveOptions: this.serveOptions,
164
+ apiHandlers: this.apiHandlers,
166
165
  };
167
166
 
168
167
  this.staticBuilder = this.staticBuilderFactory
@@ -176,22 +175,24 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
176
175
  * Refreshes the router routes during watch mode.
177
176
  */
178
177
  private async refreshRouterRoutes(): Promise<void> {
179
- if (this.serverInstance && typeof this.serverInstance.reload === 'function') {
180
- try {
181
- await this.initSharedRouter();
182
- this.configureSharedResponseHandlers(this.staticRoutes, this.hmrManager);
183
- const options = this.getServerOptions({ enableHmr: true });
184
- this.serverInstance.reload(options as BunNativeServeOptions);
185
- appLogger.debug('Server routes updated with dynamic routes');
186
- } catch (error) {
187
- if (error instanceof Error) {
188
- this.hmrManager.broadcast({ type: 'error', message: error.message });
189
- appLogger.error('Failed to refresh router routes:', error);
190
- }
191
- }
192
- } else {
178
+ if (!this.serverInstance || typeof this.serverInstance.reload !== 'function') {
193
179
  appLogger.error('Server instance is not available for reloading');
180
+ return;
194
181
  }
182
+
183
+ await this.createSharedWatchRefreshCallback({
184
+ staticRoutes: this.staticRoutes,
185
+ hmrManager: this.hmrManager,
186
+ onRoutesReady: () => {
187
+ const options = this.getServerOptions({ enableHmr: true });
188
+ this.serverInstance!.reload(options as BunNativeServeOptions);
189
+ appLogger.debug('Server routes updated with dynamic routes');
190
+ },
191
+ onError: (error) => {
192
+ this.hmrManager.broadcast({ type: 'error', message: error.message });
193
+ appLogger.error('Failed to refresh router routes:', error);
194
+ },
195
+ })();
195
196
  }
196
197
 
197
198
  private async watch(): Promise<void> {
@@ -344,8 +345,10 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
344
345
  */
345
346
  public async buildStatic(options?: { preview?: boolean }): Promise<void> {
346
347
  if (!this.fullyInitialized) {
347
- await this.initSharedRouter();
348
- this.configureSharedResponseHandlers(this.staticRoutes, this.hmrManager);
348
+ await this.initializeSharedRouteHandling({
349
+ staticRoutes: this.staticRoutes,
350
+ hmrManager: this.hmrManager,
351
+ });
349
352
  }
350
353
 
351
354
  await this.staticBuilder.build(options, {
@@ -382,8 +385,10 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
382
385
  this.serverInstance = server;
383
386
  appLogger.debug('Completing server initialization with dynamic routes');
384
387
 
385
- await this.initSharedRouter();
386
- this.configureSharedResponseHandlers(this.staticRoutes, this.hmrManager);
388
+ await this.initializeSharedRouteHandling({
389
+ staticRoutes: this.staticRoutes,
390
+ hmrManager: this.hmrManager,
391
+ });
387
392
 
388
393
  this.fullyInitialized = true;
389
394
 
@@ -422,7 +427,9 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
422
427
  hmrManager: this.hmrManager,
423
428
  });
424
429
 
425
- // Check if we need to manually inject HMR script since we're bypassing route level HMR wrapping
430
+ // Filesystem page responses are wrapped by ServerRouteHandler. This adapter-
431
+ // level pass only covers HTML returned by explicit API handlers, which bypass
432
+ // that route-layer wrapper and would otherwise miss the dev HMR runtime.
426
433
  return await this.maybeInjectHmrScript(response);
427
434
  }
428
435
 
@@ -1,15 +1,16 @@
1
- import path from 'node:path';
2
1
  import { getBunRuntime } from '../../utils/runtime.ts';
3
- import { RESOLVED_ASSETS_DIR } from '../../constants';
4
- import { defaultBuildAdapter } from '../../build/build-adapter.ts';
5
2
  import { appLogger } from '../../global/app-logger';
6
3
  import type { EcoPagesAppConfig } from '../../internal-types';
7
4
  import type { EcoBuildPlugin } from '../../build/build-types.ts';
8
- import { fileSystem } from '@ecopages/file-system';
9
5
  import { StaticSiteGenerator } from '../../static-site-generator/static-site-generator';
10
- import { ProjectWatcher } from '../../watchers/project-watcher';
11
6
  import type { ClientBridge } from './client-bridge';
12
7
  import type { HmrManager } from './hmr-manager';
8
+ import {
9
+ bindSharedRuntimeHmrManager,
10
+ initializeSharedRuntimePlugins,
11
+ prepareSharedRuntimePublicDir,
12
+ startSharedProjectWatching,
13
+ } from '../shared/runtime-bootstrap.ts';
13
14
 
14
15
  export interface WatcherCallbacks {
15
16
  refreshRouterRoutesCallback: () => Promise<void>;
@@ -23,7 +24,13 @@ export interface ServerLifecycleParams {
23
24
  }
24
25
 
25
26
  /**
26
- * Handles server lifecycle: initialization, plugins, loaders, and file watching.
27
+ * Coordinates Bun-runtime server startup side effects for one app instance.
28
+ *
29
+ * @remarks
30
+ * This class keeps runtime-only concerns together: build-runtime bootstrapping,
31
+ * Bun loader registration, public asset preparation, plugin setup, and file
32
+ * watching. Core config/build state is expected to already be finalized before
33
+ * this lifecycle runs.
27
34
  */
28
35
  export class ServerLifecycle {
29
36
  private readonly appConfig: EcoPagesAppConfig;
@@ -40,94 +47,55 @@ export class ServerLifecycle {
40
47
  }
41
48
 
42
49
  /**
43
- * Initializes the server's core components.
44
- * @returns The static site generator instance for use by other components
50
+ * Initializes the runtime services that Bun startup depends on.
51
+ *
52
+ * @returns The static-site generator instance reused by the adapter.
45
53
  */
46
54
  async initialize(): Promise<StaticSiteGenerator> {
47
55
  this.staticSiteGenerator = new StaticSiteGenerator({ appConfig: this.appConfig });
48
56
  await this.hmrManager.buildRuntime();
49
57
 
50
58
  this.setupLoaders();
51
- this.copyPublicDir();
59
+ prepareSharedRuntimePublicDir(this.appConfig);
52
60
 
53
61
  return this.staticSiteGenerator;
54
62
  }
55
63
 
56
64
  /**
57
- * Sets up Bun loaders from config.
58
- * Note: This will be abstracted to a LoaderStrategy interface in #4 Runtime Abstraction.
65
+ * Registers config-owned build loaders with Bun's runtime plugin API.
66
+ *
67
+ * @remarks
68
+ * Bun remains responsible only for transport-level plugin registration here.
69
+ * Loader ownership and composition were already finalized during config build.
59
70
  */
60
71
  setupLoaders(): void {
61
72
  const loaders = this.appConfig.loaders;
62
73
  for (const loader of loaders.values()) {
63
- defaultBuildAdapter.registerPlugin(loader);
64
74
  getBunRuntime()?.plugin(loader as any);
65
75
  }
66
76
  }
67
77
 
68
78
  /**
69
- * Copies public directory contents to dist root.
70
- * Static files are served from root (e.g., /favicon.ico, /robots.txt).
71
- */
72
- copyPublicDir(): void {
73
- try {
74
- const srcPublicDir = path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.publicDir);
75
-
76
- if (fileSystem.exists(srcPublicDir)) {
77
- fileSystem.copyDir(srcPublicDir, path.join(this.appConfig.rootDir, this.appConfig.distDir));
78
- }
79
-
80
- fileSystem.ensureDir(path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
81
- } catch (error) {
82
- appLogger.error(
83
- `Failed to copy public directory: ${error instanceof Error ? error.message : String(error)}`,
84
- );
85
- throw error;
86
- }
87
- }
88
-
89
- /**
90
- * Initializes processors and integrations.
91
- * @param options.watch - Whether watch mode is enabled
79
+ * Runs runtime-only processor and integration setup for this Bun app session.
80
+ *
81
+ * @param options.watch Whether watch mode is enabled.
82
+ * @returns The browser build plugins visible to HMR after runtime setup.
92
83
  */
93
84
  async initializePlugins(options?: { watch?: boolean }): Promise<EcoBuildPlugin[]> {
94
85
  try {
95
86
  const hmrEnabled = !!options?.watch;
96
87
  this.hmrManager.setEnabled(hmrEnabled);
97
88
 
98
- const processorBuildPlugins: EcoBuildPlugin[] = [];
99
-
100
- const processorPromises = Array.from(this.appConfig.processors.values()).map(async (processor) => {
101
- await processor.setup();
102
- if (processor.plugins) {
103
- for (const plugin of processor.plugins) {
104
- defaultBuildAdapter.registerPlugin(plugin);
105
- getBunRuntime()?.plugin(plugin as any);
106
- }
107
- }
108
- if (processor.buildPlugins) {
109
- processorBuildPlugins.push(...processor.buildPlugins);
110
- }
111
- });
112
-
113
- const integrationPromises = this.appConfig.integrations.map(async (integration) => {
114
- integration.setConfig(this.appConfig);
115
- integration.setRuntimeOrigin(this.runtimeOrigin);
116
- integration.setHmrManager(this.hmrManager);
117
- await integration.setup();
118
-
119
- for (const plugin of integration.plugins) {
120
- defaultBuildAdapter.registerPlugin(plugin);
89
+ await initializeSharedRuntimePlugins({
90
+ appConfig: this.appConfig,
91
+ runtimeOrigin: this.runtimeOrigin,
92
+ hmrManager: this.hmrManager,
93
+ onRuntimePlugin: (plugin) => {
121
94
  getBunRuntime()?.plugin(plugin as any);
122
- }
95
+ },
123
96
  });
124
97
 
125
- await Promise.all([...processorPromises, ...integrationPromises]);
126
-
127
- const loaderPlugins = Array.from(this.appConfig.loaders.values());
128
- const allBuildPlugins = [...loaderPlugins, ...processorBuildPlugins];
129
- this.hmrManager.setPlugins(allBuildPlugins);
130
- return allBuildPlugins;
98
+ return bindSharedRuntimeHmrManager(this.appConfig, this.hmrManager);
131
99
  } catch (error) {
132
100
  appLogger.error(`Failed to initialize plugins: ${error instanceof Error ? error.message : String(error)}`);
133
101
  throw error;
@@ -135,19 +103,21 @@ export class ServerLifecycle {
135
103
  }
136
104
 
137
105
  /**
138
- * Starts file watching for HMR.
106
+ * Starts file watching and wires change events back into the adapter refresh
107
+ * callback.
139
108
  */
140
109
  async startWatching(callbacks: WatcherCallbacks): Promise<void> {
141
- const watcherInstance = new ProjectWatcher({
142
- config: this.appConfig,
110
+ await startSharedProjectWatching({
111
+ appConfig: this.appConfig,
143
112
  refreshRouterRoutesCallback: callbacks.refreshRouterRoutesCallback,
144
113
  hmrManager: this.hmrManager,
145
114
  bridge: this.bridge,
146
115
  });
147
-
148
- await watcherInstance.createWatcherSubscription();
149
116
  }
150
117
 
118
+ /**
119
+ * Returns the static-site generator created during initialization.
120
+ */
151
121
  getStaticSiteGenerator(): StaticSiteGenerator {
152
122
  return this.staticSiteGenerator;
153
123
  }
@@ -1,5 +1,5 @@
1
1
  export { EcopagesApp, createApp } from './bun/create-app.ts';
2
- export { defineApiHandler, defineGroupHandler } from './bun/define-api-handler.ts';
2
+ export { defineApiHandler, defineGroupHandler, type GroupHandler } from './shared/define-api-handler.ts';
3
3
  export { NodeServerAdapter, createNodeServerAdapter } from './node/server-adapter.ts';
4
4
  export { EcopagesApp as NodeAdapterEcopagesApp, createNodeApp } from './node/create-app.ts';
5
5
  export type { NodeServerAdapterParams, NodeServerAdapterResult } from './node/server-adapter.ts';
@@ -0,0 +1,282 @@
1
+ import assert from 'node:assert/strict';
2
+ import fs from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import path from 'node:path';
5
+ import { test } from 'vitest';
6
+ import {
7
+ createNodeBootstrapPlugin,
8
+ getNodeUnsupportedBuiltinError,
9
+ resolveNodeBootstrapDependency,
10
+ } from './bootstrap-dependency-resolver.ts';
11
+
12
+ function writePackage(packageDir: string, options: { name: string; main?: string }) {
13
+ fs.mkdirSync(packageDir, { recursive: true });
14
+ fs.writeFileSync(
15
+ path.join(packageDir, 'package.json'),
16
+ JSON.stringify({
17
+ name: options.name,
18
+ main: options.main ?? 'index.js',
19
+ }),
20
+ 'utf8',
21
+ );
22
+ const entryFilePath = path.join(packageDir, options.main ?? 'index.js');
23
+ fs.mkdirSync(path.dirname(entryFilePath), { recursive: true });
24
+ fs.writeFileSync(entryFilePath, 'export default null;\n', 'utf8');
25
+ }
26
+
27
+ test('resolveNodeBootstrapDependency keeps relative, node, and workspace specifiers in the bundle graph', () => {
28
+ const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
29
+ fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
30
+
31
+ try {
32
+ const options = {
33
+ projectDir: rootDir,
34
+ runtimeNodeModulesDir: path.join(rootDir, '.eco', 'node_modules'),
35
+ };
36
+
37
+ assert.equal(resolveNodeBootstrapDependency({ path: './local.ts' }, options), undefined);
38
+ assert.equal(resolveNodeBootstrapDependency({ path: 'node:path' }, options), undefined);
39
+ assert.equal(resolveNodeBootstrapDependency({ path: '@/data/demo-data' }, options), undefined);
40
+ assert.deepEqual(resolveNodeBootstrapDependency({ path: '@ecopages/core' }, options), {
41
+ path: require.resolve('@ecopages/core'),
42
+ });
43
+ } finally {
44
+ fs.rmSync(rootDir, { recursive: true, force: true });
45
+ }
46
+ });
47
+
48
+ test('resolveNodeBootstrapDependency externalizes third-party packages and links them into runtime node_modules', () => {
49
+ const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
50
+ fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
51
+ const importerPath = path.join(rootDir, 'packages', 'example', 'src', 'index.ts');
52
+ fs.mkdirSync(path.dirname(importerPath), { recursive: true });
53
+ fs.writeFileSync(importerPath, 'export default null;\n', 'utf8');
54
+ writePackage(path.join(rootDir, 'node_modules', 'fast-glob'), { name: 'fast-glob', main: 'out/index.js' });
55
+
56
+ try {
57
+ const runtimeNodeModulesDir = path.join(rootDir, '.eco', 'node_modules');
58
+ const result = resolveNodeBootstrapDependency(
59
+ { path: 'fast-glob', importer: importerPath },
60
+ { projectDir: rootDir, runtimeNodeModulesDir },
61
+ );
62
+
63
+ assert.deepEqual(result, { path: 'fast-glob', external: true });
64
+ assert.equal(
65
+ fs.realpathSync(path.join(runtimeNodeModulesDir, 'fast-glob')),
66
+ fs.realpathSync(path.join(rootDir, 'node_modules', 'fast-glob')),
67
+ );
68
+ } finally {
69
+ fs.rmSync(rootDir, { recursive: true, force: true });
70
+ }
71
+ });
72
+
73
+ test('resolveNodeBootstrapDependency resolves workspace-source third-party imports from the app project boundary', () => {
74
+ const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
75
+ fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
76
+ const importerPath = path.join(rootDir, 'packages', 'react-plugin', 'src', 'plugin.ts');
77
+ fs.mkdirSync(path.dirname(importerPath), { recursive: true });
78
+ fs.writeFileSync(importerPath, 'export default null;\n', 'utf8');
79
+ writePackage(path.join(rootDir, 'node_modules', 'react'), { name: 'react', main: 'index.js' });
80
+
81
+ try {
82
+ const runtimeNodeModulesDir = path.join(rootDir, '.eco', 'node_modules');
83
+ const result = resolveNodeBootstrapDependency(
84
+ { path: 'react', importer: importerPath },
85
+ { projectDir: rootDir, runtimeNodeModulesDir },
86
+ );
87
+
88
+ assert.deepEqual(result, { path: 'react', external: true });
89
+ assert.equal(
90
+ fs.realpathSync(path.join(runtimeNodeModulesDir, 'react')),
91
+ fs.realpathSync(path.join(rootDir, 'node_modules', 'react')),
92
+ );
93
+ } finally {
94
+ fs.rmSync(rootDir, { recursive: true, force: true });
95
+ }
96
+ });
97
+
98
+ test('resolveNodeBootstrapDependency resolves nested third-party dependencies from the importer package context', () => {
99
+ const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
100
+ fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
101
+ const importerPackageDir = path.join(rootDir, 'node_modules', 'dep-a');
102
+ writePackage(importerPackageDir, { name: 'dep-a' });
103
+ const nestedDependencyDir = path.join(importerPackageDir, 'node_modules', 'dep-b');
104
+ writePackage(nestedDependencyDir, { name: 'dep-b' });
105
+ const importerPath = path.join(importerPackageDir, 'index.js');
106
+
107
+ try {
108
+ const runtimeNodeModulesDir = path.join(rootDir, '.eco', 'node_modules');
109
+ const result = resolveNodeBootstrapDependency(
110
+ { path: 'dep-b', importer: importerPath },
111
+ { projectDir: rootDir, runtimeNodeModulesDir },
112
+ );
113
+
114
+ assert.deepEqual(result, { path: 'dep-b', external: true });
115
+ assert.equal(fs.realpathSync(path.join(runtimeNodeModulesDir, 'dep-b')), fs.realpathSync(nestedDependencyDir));
116
+ } finally {
117
+ fs.rmSync(rootDir, { recursive: true, force: true });
118
+ }
119
+ });
120
+
121
+ test('createNodeBootstrapPlugin wires the shared resolution policy into an Eco build plugin', async () => {
122
+ const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
123
+ fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
124
+ writePackage(path.join(rootDir, 'node_modules', 'fast-glob'), { name: 'fast-glob', main: 'out/index.js' });
125
+
126
+ try {
127
+ const plugin = createNodeBootstrapPlugin({
128
+ projectDir: rootDir,
129
+ runtimeNodeModulesDir: path.join(rootDir, '.eco', 'node_modules'),
130
+ });
131
+
132
+ let onResolveCallback: ((args: { path: string; importer?: string; namespace?: string }) => unknown) | undefined;
133
+
134
+ await plugin.setup({
135
+ onResolve(_options, callback) {
136
+ onResolveCallback = callback;
137
+ },
138
+ onLoad() {},
139
+ module() {},
140
+ });
141
+
142
+ assert.ok(onResolveCallback);
143
+ assert.deepEqual(onResolveCallback?.({ path: 'fast-glob' }), {
144
+ path: 'fast-glob',
145
+ external: true,
146
+ });
147
+ } finally {
148
+ fs.rmSync(rootDir, { recursive: true, force: true });
149
+ }
150
+ });
151
+
152
+ test('createNodeBootstrapPlugin rewrites import.meta only for declared bootstrap files', async () => {
153
+ const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
154
+ fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
155
+ const bootstrapFile = path.join(rootDir, 'eco.config.ts');
156
+ const regularFile = path.join(rootDir, 'src', 'page.kita.tsx');
157
+ fs.mkdirSync(path.dirname(regularFile), { recursive: true });
158
+ fs.writeFileSync(bootstrapFile, 'export default import.meta.dirname;\n', 'utf8');
159
+ fs.writeFileSync(regularFile, 'export default import.meta.dirname;\n', 'utf8');
160
+
161
+ try {
162
+ const plugin = createNodeBootstrapPlugin({
163
+ projectDir: rootDir,
164
+ runtimeNodeModulesDir: path.join(rootDir, '.eco', 'node_modules'),
165
+ preserveImportMetaPaths: [bootstrapFile],
166
+ });
167
+
168
+ let onLoadCallback: ((args: { path: string; namespace?: string }) => Promise<unknown> | unknown) | undefined;
169
+
170
+ await plugin.setup({
171
+ onResolve() {},
172
+ onLoad(_options, callback) {
173
+ onLoadCallback = callback;
174
+ },
175
+ module() {},
176
+ });
177
+
178
+ assert.ok(onLoadCallback);
179
+ const bootstrapResult = await onLoadCallback?.({ path: bootstrapFile });
180
+ const regularResult = await onLoadCallback?.({ path: regularFile });
181
+
182
+ assert.equal(typeof (bootstrapResult as { contents?: string } | undefined)?.contents, 'string');
183
+ assert.equal(
184
+ bootstrapResult && typeof bootstrapResult === 'object' && 'contents' in bootstrapResult
185
+ ? String((bootstrapResult as { contents: string }).contents).includes(
186
+ JSON.stringify(path.dirname(bootstrapFile)),
187
+ )
188
+ : false,
189
+ true,
190
+ );
191
+ assert.equal(regularResult, undefined);
192
+ } finally {
193
+ fs.rmSync(rootDir, { recursive: true, force: true });
194
+ }
195
+ });
196
+
197
+ test('createNodeBootstrapPlugin injects side-effect imports for project re-export barrels', async () => {
198
+ const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
199
+ fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
200
+ const barrelFile = path.join(rootDir, 'src', 'layouts', 'base-layout', 'index.ts');
201
+ fs.mkdirSync(path.dirname(barrelFile), { recursive: true });
202
+ fs.writeFileSync(
203
+ barrelFile,
204
+ [
205
+ "export * from './base-layout.kita';",
206
+ "export { BaseLayout } from './base-layout.kita';",
207
+ "export type { BaseLayoutProps } from './base-layout.kita';",
208
+ ].join('\n'),
209
+ 'utf8',
210
+ );
211
+
212
+ try {
213
+ const plugin = createNodeBootstrapPlugin({
214
+ projectDir: rootDir,
215
+ runtimeNodeModulesDir: path.join(rootDir, '.eco', 'node_modules'),
216
+ });
217
+
218
+ let onLoadCallback: ((args: { path: string; namespace?: string }) => Promise<unknown> | unknown) | undefined;
219
+
220
+ await plugin.setup({
221
+ onResolve() {},
222
+ onLoad(_options, callback) {
223
+ onLoadCallback = callback;
224
+ },
225
+ module() {},
226
+ });
227
+
228
+ assert.ok(onLoadCallback);
229
+ const result = await onLoadCallback?.({ path: barrelFile });
230
+ const contents =
231
+ result && typeof result === 'object' && 'contents' in result
232
+ ? String((result as { contents: string }).contents)
233
+ : '';
234
+
235
+ assert.match(contents, /^import \* as __eco_bootstrap_reexport_0 from '\.\/base-layout\.kita';/m);
236
+ assert.match(contents, /^void __eco_bootstrap_reexport_0;$/m);
237
+ assert.match(contents, /export \* from '\.\/base-layout\.kita';/);
238
+ assert.match(contents, /export \{ BaseLayout \} from '\.\/base-layout\.kita';/);
239
+ assert.match(contents, /export type \{ BaseLayoutProps \} from '\.\/base-layout\.kita';/);
240
+ assert.equal(
241
+ contents.match(/import \* as __eco_bootstrap_reexport_0 from '\.\/base-layout\.kita';/g)?.length,
242
+ 1,
243
+ );
244
+ } finally {
245
+ fs.rmSync(rootDir, { recursive: true, force: true });
246
+ }
247
+ });
248
+
249
+ test('createNodeBootstrapPlugin fails fast on Bun-only builtins', async () => {
250
+ const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
251
+ fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
252
+ const importerPath = path.join(rootDir, 'src', 'db.server.ts');
253
+
254
+ try {
255
+ const plugin = createNodeBootstrapPlugin({
256
+ projectDir: rootDir,
257
+ runtimeNodeModulesDir: path.join(rootDir, '.eco', 'node_modules'),
258
+ });
259
+
260
+ let onResolveCallback: ((args: { path: string; importer?: string; namespace?: string }) => unknown) | undefined;
261
+
262
+ await plugin.setup({
263
+ onResolve(options, callback) {
264
+ if (String(options.filter) === String(/^bun:/)) {
265
+ onResolveCallback = callback;
266
+ }
267
+ },
268
+ onLoad() {},
269
+ module() {},
270
+ });
271
+
272
+ assert.ok(onResolveCallback);
273
+ assert.throws(
274
+ () => onResolveCallback?.({ path: 'bun:sqlite', importer: importerPath }),
275
+ new RegExp(
276
+ getNodeUnsupportedBuiltinError('bun:sqlite', importerPath).replace(/[.*+?^${}()|[\]\\]/g, '\\$&'),
277
+ ),
278
+ );
279
+ } finally {
280
+ fs.rmSync(rootDir, { recursive: true, force: true });
281
+ }
282
+ });