@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,227 @@
1
+ import { describe, expect, test, beforeEach, afterEach, vi } from 'vitest';
2
+ import { fileSystem } from '@ecopages/file-system';
3
+ import { NodeModuleScriptProcessor } from './node-module-script.processor';
4
+ import type { EcoPagesAppConfig } from '../../../../../internal-types';
5
+ import type { NodeModuleScriptAsset } from '../../assets.types';
6
+
7
+ const originalExists = fileSystem.exists;
8
+ const originalReadFileAsBuffer = fileSystem.readFileAsBuffer;
9
+
10
+ const createMockConfig = (): EcoPagesAppConfig =>
11
+ ({
12
+ rootDir: '/test/project',
13
+ srcDir: 'src',
14
+ distDir: '.eco/public',
15
+ absolutePaths: {
16
+ distDir: '/test/project/.eco/public',
17
+ srcDir: '/test/project/src',
18
+ },
19
+ processors: new Map(),
20
+ loaders: new Map(),
21
+ }) as unknown as EcoPagesAppConfig;
22
+
23
+ describe('NodeModuleScriptProcessor', () => {
24
+ let existsMock: any;
25
+ let readFileAsBufferMock: any;
26
+
27
+ beforeEach(() => {
28
+ existsMock = vi.fn(() => true);
29
+ readFileAsBufferMock = vi.fn(() => Buffer.from('// module content'));
30
+ fileSystem.exists = existsMock;
31
+ fileSystem.readFileAsBuffer = readFileAsBufferMock;
32
+ });
33
+
34
+ afterEach(() => {
35
+ fileSystem.exists = originalExists;
36
+ fileSystem.readFileAsBuffer = originalReadFileAsBuffer;
37
+ vi.restoreAllMocks();
38
+ });
39
+
40
+ describe('process - inline module', () => {
41
+ test('should return inline content for inline modules', async () => {
42
+ const processor = new NodeModuleScriptProcessor({ appConfig: createMockConfig() });
43
+
44
+ const dep: NodeModuleScriptAsset = {
45
+ kind: 'script',
46
+ source: 'node-module',
47
+ importPath: 'some-package/dist/index.js',
48
+ inline: true,
49
+ };
50
+
51
+ const result = await processor.process(dep);
52
+
53
+ expect(result.inline).toBe(true);
54
+ expect(result.content).toBe('// module content');
55
+ expect(result.kind).toBe('script');
56
+ });
57
+
58
+ test('should preserve attributes for inline modules', async () => {
59
+ const processor = new NodeModuleScriptProcessor({ appConfig: createMockConfig() });
60
+
61
+ const dep: NodeModuleScriptAsset = {
62
+ kind: 'script',
63
+ source: 'node-module',
64
+ importPath: 'some-package/dist/index.js',
65
+ inline: true,
66
+ attributes: { type: 'module' },
67
+ };
68
+
69
+ const result = await processor.process(dep);
70
+
71
+ expect(result.attributes).toEqual({ type: 'module' });
72
+ });
73
+
74
+ test('should preserve position for inline modules', async () => {
75
+ const processor = new NodeModuleScriptProcessor({ appConfig: createMockConfig() });
76
+
77
+ const dep: NodeModuleScriptAsset = {
78
+ kind: 'script',
79
+ source: 'node-module',
80
+ importPath: 'some-package/dist/index.js',
81
+ inline: true,
82
+ position: 'head',
83
+ };
84
+
85
+ const result = await processor.process(dep);
86
+
87
+ expect(result.position).toBe('head');
88
+ });
89
+ });
90
+
91
+ describe('process - caching', () => {
92
+ test('should return cached result on subsequent calls', async () => {
93
+ const processor = new NodeModuleScriptProcessor({ appConfig: createMockConfig() });
94
+
95
+ const dep: NodeModuleScriptAsset = {
96
+ kind: 'script',
97
+ source: 'node-module',
98
+ importPath: 'cached-package/dist/index.js',
99
+ inline: true,
100
+ };
101
+
102
+ const result1 = await processor.process(dep);
103
+ const result2 = await processor.process(dep);
104
+
105
+ expect(readFileAsBufferMock.mock.calls.length).toBe(1);
106
+ expect(result1).toEqual(result2);
107
+ });
108
+ });
109
+
110
+ describe('resolveModulePath', () => {
111
+ test('should throw error when module not found', async () => {
112
+ existsMock = vi.fn(() => false);
113
+ fileSystem.exists = existsMock;
114
+
115
+ const processor = new NodeModuleScriptProcessor({ appConfig: createMockConfig() });
116
+
117
+ const dep: NodeModuleScriptAsset = {
118
+ kind: 'script',
119
+ source: 'node-module',
120
+ importPath: 'non-existent-package/index.js',
121
+ inline: true,
122
+ };
123
+
124
+ await expect(processor.process(dep)).rejects.toThrow(/Could not resolve module/);
125
+ });
126
+
127
+ test('should find module in parent directories', async () => {
128
+ let callCount = 0;
129
+ existsMock = vi.fn((_path: string) => {
130
+ callCount++;
131
+ return callCount >= 3;
132
+ });
133
+ fileSystem.exists = existsMock;
134
+
135
+ const processor = new NodeModuleScriptProcessor({ appConfig: createMockConfig() });
136
+
137
+ const dep: NodeModuleScriptAsset = {
138
+ kind: 'script',
139
+ source: 'node-module',
140
+ importPath: 'parent-package/index.js',
141
+ inline: true,
142
+ };
143
+
144
+ const result = await processor.process(dep);
145
+
146
+ expect(result).toBeDefined();
147
+ expect(callCount).toBeGreaterThanOrEqual(3);
148
+ });
149
+ });
150
+
151
+ describe('process - custom name', () => {
152
+ test('should use custom name when provided', async () => {
153
+ const processor = new NodeModuleScriptProcessor({ appConfig: createMockConfig() });
154
+
155
+ const dep: NodeModuleScriptAsset = {
156
+ kind: 'script',
157
+ source: 'node-module',
158
+ importPath: 'some-package/dist/index.js',
159
+ name: 'custom-vendor',
160
+ inline: true,
161
+ };
162
+
163
+ const result = await processor.process(dep);
164
+
165
+ expect(result).toBeDefined();
166
+ expect(result.inline).toBe(true);
167
+ });
168
+
169
+ test('should preserve explicit bundle naming when provided', async () => {
170
+ const processor = new NodeModuleScriptProcessor({ appConfig: createMockConfig() });
171
+ const bundleScriptSpy = vi
172
+ .spyOn(
173
+ processor as unknown as { bundleScript: (options: Record<string, unknown>) => Promise<string> },
174
+ 'bundleScript',
175
+ )
176
+ .mockResolvedValue('/test/project/.eco/public/assets/vendors/react.development.js');
177
+
178
+ const dep: NodeModuleScriptAsset = {
179
+ kind: 'script',
180
+ source: 'node-module',
181
+ importPath: 'react',
182
+ name: 'react',
183
+ inline: false,
184
+ bundleOptions: {
185
+ naming: 'react.development.js',
186
+ },
187
+ };
188
+
189
+ const result = await processor.process(dep);
190
+
191
+ expect(bundleScriptSpy).toHaveBeenCalledWith(
192
+ expect.objectContaining({
193
+ naming: 'react.development.js',
194
+ }),
195
+ );
196
+ expect(result.filepath).toBe('/test/project/.eco/public/assets/vendors/react.development.js');
197
+ });
198
+ });
199
+
200
+ describe('resolveModulePath with real dependencies', () => {
201
+ beforeEach(() => {
202
+ fileSystem.exists = originalExists;
203
+ fileSystem.readFileAsBuffer = originalReadFileAsBuffer;
204
+ });
205
+
206
+ test('should resolve @ecopages/logger using Bun.resolveSync', async () => {
207
+ const config = createMockConfig();
208
+ config.rootDir = process.cwd();
209
+ const processor = new NodeModuleScriptProcessor({ appConfig: config });
210
+ fileSystem.readFileAsBuffer = vi.fn().mockResolvedValue(Buffer.from('dummy content'));
211
+
212
+ const dep: NodeModuleScriptAsset = {
213
+ kind: 'script',
214
+ source: 'node-module',
215
+ importPath: '@ecopages/logger',
216
+ inline: true,
217
+ };
218
+
219
+ const result = await processor.process(dep);
220
+
221
+ expect(result).toBeDefined();
222
+ expect(result.inline).toBe(true);
223
+ expect(result.content).toBeDefined();
224
+ expect(result.content!.length).toBeGreaterThan(0);
225
+ });
226
+ });
227
+ });
@@ -1,6 +1,6 @@
1
1
  import path from 'node:path';
2
2
  import { fileSystem } from '@ecopages/file-system';
3
- import { defaultBuildAdapter } from '../../../../build/build-adapter.ts';
3
+ import { getAppBuildAdapter } from '../../../../../build/build-adapter.ts';
4
4
  import type { NodeModuleScriptAsset } from '../../assets.types';
5
5
  import { BaseScriptProcessor } from '../base/base-script-processor';
6
6
 
@@ -28,13 +28,14 @@ export class NodeModuleScriptProcessor extends BaseScriptProcessor<NodeModuleScr
28
28
  }
29
29
 
30
30
  const outdir = path.join(this.getAssetsDir(), 'vendors');
31
+ const bundlerOptions = this.getBundlerOptions(dep);
31
32
 
32
33
  const filePath = await this.bundleScript({
33
34
  entrypoint: modulePath,
34
35
  outdir: outdir,
35
36
  minify: this.isProduction,
36
- naming: dep.name ? `${dep.name}-[hash].[ext]` : '[name]-[hash].[ext]',
37
- ...this.getBundlerOptions(dep),
37
+ naming: bundlerOptions.naming ?? (dep.name ? `${dep.name}-[hash].[ext]` : '[name]-[hash].[ext]'),
38
+ ...bundlerOptions,
38
39
  });
39
40
 
40
41
  return {
@@ -54,7 +55,7 @@ export class NodeModuleScriptProcessor extends BaseScriptProcessor<NodeModuleScr
54
55
  }
55
56
 
56
57
  try {
57
- return defaultBuildAdapter.resolve(importPath, rootDir);
58
+ return getAppBuildAdapter(this.appConfig).resolve(importPath, rootDir);
58
59
  } catch {
59
60
  return this.resolveModulePathFallback(importPath, rootDir);
60
61
  }
@@ -0,0 +1,199 @@
1
+ import { describe, expect, test, beforeEach, afterEach, vi } from 'vitest';
2
+ import { fileSystem } from '@ecopages/file-system';
3
+ import { ContentStylesheetProcessor } from './content-stylesheet.processor';
4
+ import type { EcoPagesAppConfig } from '../../../../../internal-types';
5
+ import type { ContentStylesheetAsset } from '../../assets.types';
6
+
7
+ const originalWrite = fileSystem.write;
8
+ const originalExists = fileSystem.exists;
9
+
10
+ const createMockConfig = (): EcoPagesAppConfig =>
11
+ ({
12
+ rootDir: '/test/project',
13
+ srcDir: 'src',
14
+ distDir: '.eco/public',
15
+ absolutePaths: {
16
+ distDir: '/test/project/.eco/public',
17
+ srcDir: '/test/project/src',
18
+ },
19
+ }) as unknown as EcoPagesAppConfig;
20
+
21
+ describe('ContentStylesheetProcessor', () => {
22
+ let writeMock: any;
23
+
24
+ beforeEach(() => {
25
+ writeMock = vi.fn(() => {});
26
+ fileSystem.write = writeMock;
27
+ fileSystem.exists = vi.fn(() => true);
28
+ });
29
+
30
+ afterEach(() => {
31
+ fileSystem.write = originalWrite;
32
+ fileSystem.exists = originalExists;
33
+ vi.restoreAllMocks();
34
+ });
35
+
36
+ describe('process - file-based stylesheet', () => {
37
+ test('should write stylesheet file when not inline', async () => {
38
+ const processor = new ContentStylesheetProcessor({ appConfig: createMockConfig() });
39
+
40
+ const dep: ContentStylesheetAsset = {
41
+ kind: 'stylesheet',
42
+ source: 'content',
43
+ content: 'body { color: red; }',
44
+ inline: false,
45
+ };
46
+
47
+ const result = await processor.process(dep);
48
+
49
+ expect(writeMock).toHaveBeenCalled();
50
+ expect(result.filepath).toBeDefined();
51
+ expect(result.filepath).toContain('style-');
52
+ expect(result.filepath).toContain('.css');
53
+ expect(result.kind).toBe('stylesheet');
54
+ expect(result.inline).toBe(false);
55
+ expect(result.content).toBeUndefined();
56
+ });
57
+
58
+ test('should include hash in filename', async () => {
59
+ const processor = new ContentStylesheetProcessor({ appConfig: createMockConfig() });
60
+
61
+ const dep: ContentStylesheetAsset = {
62
+ kind: 'stylesheet',
63
+ source: 'content',
64
+ content: 'body { color: blue; }',
65
+ inline: false,
66
+ };
67
+
68
+ const result = await processor.process(dep);
69
+
70
+ expect(result.filepath).toMatch(/style-\d+\.css$/);
71
+ });
72
+ });
73
+
74
+ describe('process - inline stylesheet', () => {
75
+ test('should return content without writing file when inline', async () => {
76
+ const processor = new ContentStylesheetProcessor({ appConfig: createMockConfig() });
77
+
78
+ const dep: ContentStylesheetAsset = {
79
+ kind: 'stylesheet',
80
+ source: 'content',
81
+ content: '.inline { display: flex; }',
82
+ inline: true,
83
+ };
84
+
85
+ const result = await processor.process(dep);
86
+
87
+ expect(writeMock).not.toHaveBeenCalled();
88
+ expect(result.inline).toBe(true);
89
+ expect(result.content).toBe('.inline { display: flex; }');
90
+ expect(result.filepath).toBeUndefined();
91
+ });
92
+ });
93
+
94
+ describe('process - caching', () => {
95
+ test('should return cached result on subsequent calls', async () => {
96
+ const processor = new ContentStylesheetProcessor({ appConfig: createMockConfig() });
97
+
98
+ const dep: ContentStylesheetAsset = {
99
+ kind: 'stylesheet',
100
+ source: 'content',
101
+ content: '.cached { margin: 0; }',
102
+ inline: false,
103
+ };
104
+
105
+ const result1 = await processor.process(dep);
106
+ const result2 = await processor.process(dep);
107
+
108
+ expect(writeMock.mock.calls.length).toBe(1);
109
+ expect(result1).toEqual(result2);
110
+ });
111
+
112
+ test('should use different cache keys for different content', async () => {
113
+ const processor = new ContentStylesheetProcessor({ appConfig: createMockConfig() });
114
+
115
+ const dep1: ContentStylesheetAsset = {
116
+ kind: 'stylesheet',
117
+ source: 'content',
118
+ content: '.first { padding: 10px; }',
119
+ inline: false,
120
+ };
121
+
122
+ const dep2: ContentStylesheetAsset = {
123
+ kind: 'stylesheet',
124
+ source: 'content',
125
+ content: '.second { padding: 20px; }',
126
+ inline: false,
127
+ };
128
+
129
+ await processor.process(dep1);
130
+ await processor.process(dep2);
131
+
132
+ expect(writeMock.mock.calls.length).toBe(2);
133
+ });
134
+ });
135
+
136
+ describe('process - attributes and position', () => {
137
+ test('should preserve attributes from dependency', async () => {
138
+ const processor = new ContentStylesheetProcessor({ appConfig: createMockConfig() });
139
+
140
+ const dep: ContentStylesheetAsset = {
141
+ kind: 'stylesheet',
142
+ source: 'content',
143
+ content: '.styled { color: green; }',
144
+ inline: true,
145
+ attributes: { 'data-theme': 'dark' },
146
+ };
147
+
148
+ const result = await processor.process(dep);
149
+
150
+ expect(result.attributes).toEqual({ 'data-theme': 'dark' });
151
+ });
152
+
153
+ test('should preserve position from dependency', async () => {
154
+ const processor = new ContentStylesheetProcessor({ appConfig: createMockConfig() });
155
+
156
+ const dep: ContentStylesheetAsset = {
157
+ kind: 'stylesheet',
158
+ source: 'content',
159
+ content: '.head-style { font-size: 16px; }',
160
+ inline: true,
161
+ position: 'head',
162
+ };
163
+
164
+ const result = await processor.process(dep);
165
+
166
+ expect(result.position).toBe('head');
167
+ });
168
+
169
+ test('should return updated attributes when cached asset is retrieved with different attributes', async () => {
170
+ const processor = new ContentStylesheetProcessor({ appConfig: createMockConfig() });
171
+
172
+ const depWithMedia: ContentStylesheetAsset = {
173
+ kind: 'stylesheet',
174
+ source: 'content',
175
+ content: '.cached-style { color: red; }',
176
+ inline: false,
177
+ attributes: { media: 'screen' },
178
+ position: 'head',
179
+ };
180
+
181
+ const depWithPrint: ContentStylesheetAsset = {
182
+ kind: 'stylesheet',
183
+ source: 'content',
184
+ content: '.cached-style { color: red; }',
185
+ inline: false,
186
+ attributes: { media: 'print' },
187
+ position: 'body',
188
+ };
189
+
190
+ const result1 = await processor.process(depWithMedia);
191
+ const result2 = await processor.process(depWithPrint);
192
+
193
+ expect(result1.attributes).toEqual({ media: 'screen' });
194
+ expect(result1.position).toBe('head');
195
+ expect(result2.attributes).toEqual({ media: 'print' });
196
+ expect(result2.position).toBe('body');
197
+ });
198
+ });
199
+ });
@@ -56,7 +56,10 @@ export class FileStylesheetProcessor extends BaseProcessor<FileStylesheetAsset>
56
56
  const cachekey = this.buildCacheKey(dep.filepath, hash, dep);
57
57
 
58
58
  return this.getOrProcess(cachekey, () => {
59
- const filepath = path.join(this.getAssetsDir(), path.relative(this.appConfig.srcDir, dep.filepath));
59
+ const filepath = path.join(
60
+ this.getAssetsDir(),
61
+ path.relative(this.appConfig.absolutePaths.srcDir, dep.filepath),
62
+ );
60
63
  const outputBuffer = Buffer.from(processedContent);
61
64
 
62
65
  if (!dep.inline) {
@@ -0,0 +1,36 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { BrowserBundleService } from './browser-bundle.service.ts';
3
+
4
+ describe('BrowserBundleService', () => {
5
+ it('routes browser bundle requests through the app executor with profile defaults', async () => {
6
+ const build = vi.fn(async () => ({
7
+ success: true,
8
+ logs: [],
9
+ outputs: [{ path: '/tmp/out/entry.js' }],
10
+ }));
11
+ const service = new BrowserBundleService({
12
+ runtime: {
13
+ buildExecutor: { build },
14
+ },
15
+ loaders: new Map(),
16
+ } as any);
17
+
18
+ await service.bundle({
19
+ profile: 'browser-script',
20
+ entrypoints: ['/tmp/entry.ts'],
21
+ outdir: '/tmp/out',
22
+ minify: false,
23
+ naming: '[name].js',
24
+ });
25
+
26
+ expect(build).toHaveBeenCalledWith(
27
+ expect.objectContaining({
28
+ entrypoints: ['/tmp/entry.ts'],
29
+ outdir: '/tmp/out',
30
+ target: 'browser',
31
+ format: 'esm',
32
+ sourcemap: 'none',
33
+ }),
34
+ );
35
+ });
36
+ });
@@ -0,0 +1,53 @@
1
+ import type { BuildOptions, BuildResult, BuildTranspileProfile } from '../../build/build-adapter.ts';
2
+ import type { EcoBuildPlugin } from '../../build/build-types.ts';
3
+ import { getAppBrowserBuildPlugins, getAppBuildExecutor, getTranspileOptions } from '../../build/build-adapter.ts';
4
+ import { mergeEcoBuildPlugins } from '../../build/build-manifest.ts';
5
+ import type { EcoPagesAppConfig } from '../../internal-types.ts';
6
+
7
+ export type BrowserBundleOptions = Omit<BuildOptions, 'target' | 'format' | 'sourcemap'> & {
8
+ profile: BuildTranspileProfile;
9
+ };
10
+
11
+ export interface BrowserBundleExecutor {
12
+ bundle(options: BrowserBundleOptions): Promise<BuildResult>;
13
+ }
14
+
15
+ /**
16
+ * App-owned boundary for browser-oriented bundle work.
17
+ *
18
+ * @remarks
19
+ * This service owns the shared browser transpile defaults and ensures browser
20
+ * builds always run through the app-owned executor rather than direct backend
21
+ * calls scattered across HMR and asset processing paths.
22
+ */
23
+ export class BrowserBundleService implements BrowserBundleExecutor {
24
+ private readonly appConfig: EcoPagesAppConfig;
25
+
26
+ /**
27
+ * Creates the browser bundle boundary for one finalized app instance.
28
+ */
29
+ constructor(appConfig: EcoPagesAppConfig) {
30
+ this.appConfig = appConfig;
31
+ }
32
+
33
+ /**
34
+ * Runs one browser-targeted build through the app-owned executor.
35
+ *
36
+ * @remarks
37
+ * Browser defaults and app-owned browser build plugins are applied here so HMR
38
+ * and runtime asset generation do not have to recreate that policy at each call
39
+ * site.
40
+ */
41
+ async bundle(options: BrowserBundleOptions): Promise<BuildResult> {
42
+ const { profile, ...rawBuildOptions } = options;
43
+ const buildOptions = rawBuildOptions as Omit<BuildOptions, 'target' | 'format' | 'sourcemap'>;
44
+ const plugins = buildOptions.plugins as EcoBuildPlugin[] | undefined;
45
+ const request = {
46
+ ...buildOptions,
47
+ ...getTranspileOptions(profile),
48
+ plugins: mergeEcoBuildPlugins(plugins, getAppBrowserBuildPlugins(this.appConfig)),
49
+ } as BuildOptions;
50
+
51
+ return await getAppBuildExecutor(this.appConfig).build(request);
52
+ }
53
+ }
@@ -11,8 +11,8 @@ export type {
11
11
  CacheStore,
12
12
  CacheStrategy,
13
13
  RenderResult,
14
- } from './cache.types.ts';
14
+ } from './cache.types.js';
15
15
 
16
- export { MemoryCacheStore, type MemoryCacheStoreOptions } from './memory-cache-store.ts';
16
+ export { MemoryCacheStore, type MemoryCacheStoreOptions } from './memory-cache-store.js';
17
17
 
18
- export { getCacheControlHeader, PageCacheService, type PageCacheServiceOptions } from './page-cache-service.ts';
18
+ export { getCacheControlHeader, PageCacheService, type PageCacheServiceOptions } from './page-cache-service.js';