@ecopages/core 0.2.0-alpha.23 → 0.2.0-alpha.24

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 (515) hide show
  1. package/package.json +93 -226
  2. package/src/adapters/abstract/application-adapter.test.ts +172 -0
  3. package/src/adapters/abstract/application-adapter.ts +379 -0
  4. package/src/adapters/abstract/router-adapter.ts +30 -0
  5. package/src/adapters/abstract/server-adapter.ts +79 -0
  6. package/src/adapters/bun/client-bridge.ts +62 -0
  7. package/src/adapters/bun/create-app.ts +180 -0
  8. package/src/adapters/bun/hmr-manager.test.ts +267 -0
  9. package/src/adapters/bun/hmr-manager.ts +406 -0
  10. package/src/adapters/bun/index.ts +2 -0
  11. package/src/adapters/bun/server-adapter.ts +500 -0
  12. package/src/adapters/bun/server-lifecycle.ts +124 -0
  13. package/src/adapters/create-app.test.ts +10 -0
  14. package/src/adapters/create-app.ts +91 -0
  15. package/src/adapters/index.ts +2 -0
  16. package/src/adapters/node/create-app.test.ts +53 -0
  17. package/src/adapters/node/create-app.ts +183 -0
  18. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  19. package/src/adapters/node/node-client-bridge.ts +79 -0
  20. package/src/adapters/node/node-hmr-manager.test.ts +322 -0
  21. package/src/adapters/node/node-hmr-manager.ts +378 -0
  22. package/src/adapters/node/server-adapter.ts +502 -0
  23. package/src/adapters/node/static-content-server.test.ts +60 -0
  24. package/src/adapters/node/static-content-server.ts +239 -0
  25. package/src/adapters/shared/api-response.test.ts +97 -0
  26. package/src/adapters/shared/api-response.ts +104 -0
  27. package/src/adapters/shared/application-adapter.ts +199 -0
  28. package/src/adapters/shared/define-api-handler.ts +66 -0
  29. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  30. package/src/adapters/shared/explicit-static-route-matcher.ts +140 -0
  31. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +90 -0
  32. package/src/adapters/shared/file-route-middleware-pipeline.ts +127 -0
  33. package/src/adapters/shared/fs-server-response-factory.test.ts +187 -0
  34. package/src/adapters/shared/fs-server-response-factory.ts +118 -0
  35. package/src/adapters/shared/fs-server-response-matcher.test.ts +285 -0
  36. package/src/adapters/shared/fs-server-response-matcher.ts +189 -0
  37. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  38. package/src/adapters/shared/hmr-html-response.ts +52 -0
  39. package/src/adapters/shared/hmr-manager.contract.test.ts +232 -0
  40. package/src/adapters/shared/hmr-manager.dispatch.test.ts +220 -0
  41. package/src/adapters/shared/render-context.test.ts +150 -0
  42. package/src/adapters/shared/render-context.ts +123 -0
  43. package/src/adapters/shared/runtime-bootstrap.ts +79 -0
  44. package/src/adapters/shared/server-adapter.test.ts +77 -0
  45. package/src/adapters/shared/server-adapter.ts +493 -0
  46. package/src/adapters/shared/server-route-handler.test.ts +110 -0
  47. package/src/adapters/shared/server-route-handler.ts +153 -0
  48. package/src/adapters/shared/server-static-builder.test.ts +338 -0
  49. package/src/adapters/shared/server-static-builder.ts +170 -0
  50. package/src/build/build-adapter-serialization.test.ts +281 -0
  51. package/src/build/build-adapter.test.ts +1240 -0
  52. package/src/build/build-adapter.ts +1012 -0
  53. package/src/build/build-manifest.ts +54 -0
  54. package/src/build/build-types.ts +83 -0
  55. package/src/build/dev-build-coordinator.ts +220 -0
  56. package/src/build/esbuild-build-adapter.ts +660 -0
  57. package/src/build/runtime-build-executor.test.ts +81 -0
  58. package/src/build/runtime-build-executor.ts +40 -0
  59. package/src/build/runtime-specifier-alias-plugin.test.ts +67 -0
  60. package/src/build/runtime-specifier-alias-plugin.ts +62 -0
  61. package/src/build/runtime-specifier-aliases.ts +135 -0
  62. package/src/config/config-builder.test.ts +443 -0
  63. package/src/config/config-builder.ts +742 -0
  64. package/src/config/config-builder.typecheck.test.ts +96 -0
  65. package/src/config/{constants.d.ts → constants.ts} +22 -13
  66. package/src/dev/sc-server.ts +143 -0
  67. package/src/eco/eco.browser.test.ts +43 -0
  68. package/src/eco/eco.browser.ts +118 -0
  69. package/src/eco/eco.test.ts +654 -0
  70. package/src/eco/eco.ts +205 -0
  71. package/src/eco/eco.types.ts +221 -0
  72. package/src/eco/eco.utils.test.ts +219 -0
  73. package/src/eco/eco.utils.ts +5 -0
  74. package/src/eco/global-injector-map.test.ts +42 -0
  75. package/src/eco/global-injector-map.ts +112 -0
  76. package/src/eco/lazy-injector-map.test.ts +66 -0
  77. package/src/eco/lazy-injector-map.ts +120 -0
  78. package/src/eco/module-dependencies.test.ts +30 -0
  79. package/src/eco/module-dependencies.ts +75 -0
  80. package/src/errors/http-error.test.ts +134 -0
  81. package/src/errors/http-error.ts +72 -0
  82. package/src/errors/{index.d.ts → index.ts} +2 -2
  83. package/src/errors/locals-access-error.ts +7 -0
  84. package/src/global/app-logger.ts +4 -0
  85. package/src/global/utils.test.ts +12 -0
  86. 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
  87. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  88. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  89. package/src/hmr/client/hmr-runtime.ts +160 -0
  90. package/src/hmr/hmr-strategy.test.ts +124 -0
  91. package/src/hmr/hmr-strategy.ts +177 -0
  92. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  93. package/src/hmr/hmr.test.e2e.ts +66 -0
  94. package/src/hmr/strategies/default-hmr-strategy.ts +60 -0
  95. package/src/hmr/strategies/js-hmr-strategy.test.ts +335 -0
  96. package/src/hmr/strategies/js-hmr-strategy.ts +320 -0
  97. package/src/index.browser.ts +3 -0
  98. package/src/index.ts +15 -0
  99. package/src/integrations/ghtml/ghtml-renderer.test.ts +253 -0
  100. package/src/integrations/ghtml/ghtml-renderer.ts +97 -0
  101. package/src/integrations/ghtml/ghtml.constants.ts +1 -0
  102. package/src/integrations/ghtml/ghtml.plugin.ts +28 -0
  103. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  104. package/src/plugins/alias-resolver-plugin.ts +63 -0
  105. package/src/plugins/eco-component-meta-plugin.test.ts +406 -0
  106. package/src/plugins/eco-component-meta-plugin.ts +495 -0
  107. package/src/plugins/foreign-jsx-override-plugin.test.ts +65 -0
  108. package/src/plugins/foreign-jsx-override-plugin.ts +67 -0
  109. package/src/plugins/integration-plugin.test.ts +156 -0
  110. package/src/plugins/integration-plugin.ts +311 -0
  111. package/src/plugins/processor.test.ts +148 -0
  112. package/src/plugins/processor.ts +240 -0
  113. package/src/plugins/{runtime-capability.d.ts → runtime-capability.ts} +8 -3
  114. package/src/plugins/source-transform.test.ts +82 -0
  115. package/src/plugins/source-transform.ts +123 -0
  116. package/src/route-renderer/orchestration/boundary-planning.service.ts +146 -0
  117. package/src/route-renderer/orchestration/component-render-context.ts +318 -0
  118. package/src/route-renderer/orchestration/integration-renderer.test.ts +2088 -0
  119. package/src/route-renderer/orchestration/integration-renderer.ts +1285 -0
  120. package/src/route-renderer/orchestration/page-packaging.service.test.ts +76 -0
  121. package/src/route-renderer/orchestration/page-packaging.service.ts +85 -0
  122. package/src/route-renderer/orchestration/processed-asset-dedupe.ts +25 -0
  123. package/src/route-renderer/orchestration/queued-boundary-runtime.service.test.ts +319 -0
  124. package/src/route-renderer/orchestration/queued-boundary-runtime.service.ts +289 -0
  125. package/src/route-renderer/orchestration/render-execution.service.test.ts +196 -0
  126. package/src/route-renderer/orchestration/render-execution.service.ts +182 -0
  127. package/src/route-renderer/orchestration/render-output.utils.ts +302 -0
  128. package/src/route-renderer/orchestration/render-preparation.service.test.ts +569 -0
  129. package/src/route-renderer/orchestration/render-preparation.service.ts +508 -0
  130. package/src/route-renderer/orchestration/route-shell-composer.service.ts +162 -0
  131. package/src/route-renderer/orchestration/template-serialization.test.ts +110 -0
  132. package/src/route-renderer/orchestration/template-serialization.ts +117 -0
  133. package/src/route-renderer/page-loading/component-dependency-collection.ts +196 -0
  134. package/src/route-renderer/page-loading/declared-asset-collection.ts +156 -0
  135. package/src/route-renderer/page-loading/dependency-resolver.test.ts +665 -0
  136. package/src/route-renderer/page-loading/dependency-resolver.ts +150 -0
  137. package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +75 -0
  138. package/src/route-renderer/page-loading/lazy-entry-collection.ts +167 -0
  139. package/src/route-renderer/page-loading/lazy-trigger-planning.ts +74 -0
  140. package/src/route-renderer/page-loading/module-declaration-aggregation.ts +60 -0
  141. package/src/route-renderer/page-loading/module-declaration-scripts.ts +16 -0
  142. package/src/route-renderer/page-loading/page-dependency-bundling.ts +205 -0
  143. package/src/route-renderer/page-loading/page-module-loader.test.ts +183 -0
  144. package/src/route-renderer/page-loading/page-module-loader.ts +184 -0
  145. package/src/route-renderer/route-renderer.ts +136 -0
  146. package/src/router/client/link-intent.test.browser.ts +51 -0
  147. package/src/router/client/link-intent.ts +92 -0
  148. package/src/router/client/navigation-coordinator.test.ts +237 -0
  149. package/src/router/client/navigation-coordinator.ts +453 -0
  150. package/src/router/server/fs-router-scanner.test.ts +83 -0
  151. package/src/router/server/fs-router-scanner.ts +224 -0
  152. package/src/router/server/fs-router.test.ts +214 -0
  153. package/src/router/server/fs-router.ts +122 -0
  154. package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +66 -0
  155. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +476 -0
  156. package/src/services/assets/asset-processing-service/asset-processing.service.ts +345 -0
  157. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  158. package/src/services/assets/asset-processing-service/asset.factory.ts +105 -0
  159. package/src/services/assets/asset-processing-service/assets.types.ts +125 -0
  160. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +74 -0
  161. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +96 -0
  162. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  163. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  164. package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +104 -0
  165. package/src/services/assets/asset-processing-service/index.ts +5 -0
  166. package/src/services/assets/asset-processing-service/{processor.interface.d.ts → processor.interface.ts} +10 -5
  167. package/src/services/assets/asset-processing-service/processor.registry.ts +18 -0
  168. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  169. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +83 -0
  170. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +174 -0
  171. package/src/services/assets/asset-processing-service/processors/index.ts +5 -0
  172. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +192 -0
  173. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +134 -0
  174. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +326 -0
  175. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +110 -0
  176. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +227 -0
  177. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +87 -0
  178. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +261 -0
  179. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +71 -0
  180. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +81 -0
  181. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +65 -0
  182. package/src/services/assets/browser-bundle.service.test.ts +66 -0
  183. package/src/services/assets/browser-bundle.service.ts +109 -0
  184. package/src/services/cache/cache.types.ts +126 -0
  185. package/src/services/cache/index.ts +18 -0
  186. package/src/services/cache/memory-cache-store.test.ts +225 -0
  187. package/src/services/cache/memory-cache-store.ts +130 -0
  188. package/src/services/cache/page-cache-service.test.ts +175 -0
  189. package/src/services/cache/page-cache-service.ts +202 -0
  190. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  191. package/src/services/cache/page-request-cache-coordinator.service.ts +131 -0
  192. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  193. package/src/services/html/html-rewriter-provider.service.ts +104 -0
  194. package/src/services/html/html-transformer.service.test.ts +479 -0
  195. package/src/services/html/html-transformer.service.ts +275 -0
  196. package/src/services/invalidation/development-invalidation.service.test.ts +87 -0
  197. package/src/services/invalidation/development-invalidation.service.ts +262 -0
  198. package/src/services/module-loading/app-module-loader.service.ts +9 -0
  199. package/src/services/module-loading/app-server-module-transpiler.service.test.ts +130 -0
  200. package/src/services/module-loading/app-server-module-transpiler.service.ts +143 -0
  201. package/src/services/module-loading/host-module-loader-registry.ts +15 -0
  202. package/src/services/module-loading/{module-loading-types.d.ts → module-loading-types.ts} +1 -0
  203. package/src/services/module-loading/node-bootstrap-plugin.test.ts +335 -0
  204. package/src/services/module-loading/node-bootstrap-plugin.ts +297 -0
  205. package/src/services/module-loading/page-module-import.service.test.ts +504 -0
  206. package/src/services/module-loading/page-module-import.service.ts +252 -0
  207. package/src/services/module-loading/server-module-transpiler.service.test.ts +243 -0
  208. package/src/services/module-loading/server-module-transpiler.service.ts +104 -0
  209. package/src/services/module-loading/source-module-support.ts +19 -0
  210. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  211. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  212. package/src/services/runtime-state/runtime-specifier-registry.service.ts +96 -0
  213. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  214. package/src/services/validation/schema-validation-service.test.ts +223 -0
  215. package/src/services/validation/schema-validation-service.ts +204 -0
  216. package/src/services/validation/{standard-schema.types.d.ts → standard-schema.types.ts} +20 -17
  217. package/src/static-site-generator/static-site-generator.test.ts +316 -0
  218. package/src/static-site-generator/static-site-generator.ts +462 -0
  219. package/src/types/internal-types.ts +242 -0
  220. package/src/types/public-types.ts +1443 -0
  221. package/src/utils/deep-merge.test.ts +114 -0
  222. package/src/utils/deep-merge.ts +47 -0
  223. package/src/utils/hash.ts +5 -0
  224. package/src/utils/html-escaping.ts +9 -0
  225. package/src/utils/invariant.test.ts +22 -0
  226. package/src/utils/invariant.ts +15 -0
  227. package/src/utils/locals-utils.ts +37 -0
  228. package/src/utils/parse-cli-args.test.ts +69 -0
  229. package/src/utils/parse-cli-args.ts +105 -0
  230. package/src/utils/path-utils.module.ts +14 -0
  231. package/src/utils/path-utils.test.ts +15 -0
  232. package/src/utils/resolve-work-dir.ts +45 -0
  233. package/src/utils/runtime.ts +44 -0
  234. package/src/utils/server-utils.module.ts +67 -0
  235. package/src/utils/server-utils.test.ts +38 -0
  236. package/src/watchers/project-watcher.integration.test.ts +337 -0
  237. package/src/watchers/project-watcher.test-helpers.ts +41 -0
  238. package/src/watchers/project-watcher.test.ts +768 -0
  239. package/src/watchers/project-watcher.ts +357 -0
  240. package/CHANGELOG.md +0 -51
  241. package/src/adapters/abstract/application-adapter.d.ts +0 -194
  242. package/src/adapters/abstract/application-adapter.js +0 -121
  243. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  244. package/src/adapters/abstract/router-adapter.js +0 -5
  245. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  246. package/src/adapters/abstract/server-adapter.js +0 -15
  247. package/src/adapters/bun/client-bridge.d.ts +0 -34
  248. package/src/adapters/bun/client-bridge.js +0 -48
  249. package/src/adapters/bun/create-app.d.ts +0 -52
  250. package/src/adapters/bun/create-app.js +0 -116
  251. package/src/adapters/bun/hmr-manager.d.ts +0 -143
  252. package/src/adapters/bun/hmr-manager.js +0 -333
  253. package/src/adapters/bun/index.d.ts +0 -2
  254. package/src/adapters/bun/index.js +0 -8
  255. package/src/adapters/bun/server-adapter.d.ts +0 -155
  256. package/src/adapters/bun/server-adapter.js +0 -374
  257. package/src/adapters/bun/server-lifecycle.d.ts +0 -63
  258. package/src/adapters/bun/server-lifecycle.js +0 -92
  259. package/src/adapters/create-app.d.ts +0 -20
  260. package/src/adapters/create-app.js +0 -66
  261. package/src/adapters/index.d.ts +0 -2
  262. package/src/adapters/index.js +0 -8
  263. package/src/adapters/node/create-app.d.ts +0 -18
  264. package/src/adapters/node/create-app.js +0 -149
  265. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  266. package/src/adapters/node/node-client-bridge.js +0 -66
  267. package/src/adapters/node/node-hmr-manager.d.ts +0 -133
  268. package/src/adapters/node/node-hmr-manager.js +0 -311
  269. package/src/adapters/node/server-adapter.d.ts +0 -161
  270. package/src/adapters/node/server-adapter.js +0 -359
  271. package/src/adapters/node/static-content-server.d.ts +0 -60
  272. package/src/adapters/node/static-content-server.js +0 -194
  273. package/src/adapters/shared/api-response.d.ts +0 -52
  274. package/src/adapters/shared/api-response.js +0 -96
  275. package/src/adapters/shared/application-adapter.d.ts +0 -18
  276. package/src/adapters/shared/application-adapter.js +0 -90
  277. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  278. package/src/adapters/shared/define-api-handler.js +0 -15
  279. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -38
  280. package/src/adapters/shared/explicit-static-route-matcher.js +0 -103
  281. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -65
  282. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -99
  283. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -19
  284. package/src/adapters/shared/fs-server-response-factory.js +0 -97
  285. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -67
  286. package/src/adapters/shared/fs-server-response-matcher.js +0 -147
  287. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  288. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  289. package/src/adapters/shared/hmr-html-response.d.ts +0 -22
  290. package/src/adapters/shared/hmr-html-response.js +0 -32
  291. package/src/adapters/shared/render-context.d.ts +0 -15
  292. package/src/adapters/shared/render-context.js +0 -72
  293. package/src/adapters/shared/runtime-bootstrap.d.ts +0 -38
  294. package/src/adapters/shared/runtime-bootstrap.js +0 -43
  295. package/src/adapters/shared/server-adapter.d.ts +0 -97
  296. package/src/adapters/shared/server-adapter.js +0 -390
  297. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  298. package/src/adapters/shared/server-route-handler.js +0 -111
  299. package/src/adapters/shared/server-static-builder.d.ts +0 -70
  300. package/src/adapters/shared/server-static-builder.js +0 -100
  301. package/src/build/build-adapter.d.ts +0 -239
  302. package/src/build/build-adapter.js +0 -642
  303. package/src/build/build-manifest.d.ts +0 -27
  304. package/src/build/build-manifest.js +0 -30
  305. package/src/build/build-types.d.ts +0 -57
  306. package/src/build/build-types.js +0 -0
  307. package/src/build/dev-build-coordinator.d.ts +0 -72
  308. package/src/build/dev-build-coordinator.js +0 -154
  309. package/src/build/esbuild-build-adapter.d.ts +0 -78
  310. package/src/build/esbuild-build-adapter.js +0 -505
  311. package/src/build/runtime-build-executor.d.ts +0 -14
  312. package/src/build/runtime-build-executor.js +0 -22
  313. package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
  314. package/src/build/runtime-specifier-alias-plugin.js +0 -35
  315. package/src/build/runtime-specifier-aliases.d.ts +0 -5
  316. package/src/build/runtime-specifier-aliases.js +0 -95
  317. package/src/config/config-builder.d.ts +0 -252
  318. package/src/config/config-builder.js +0 -603
  319. package/src/config/constants.js +0 -25
  320. package/src/dev/sc-server.d.ts +0 -30
  321. package/src/dev/sc-server.js +0 -111
  322. package/src/eco/eco.browser.d.ts +0 -2
  323. package/src/eco/eco.browser.js +0 -83
  324. package/src/eco/eco.d.ts +0 -9
  325. package/src/eco/eco.js +0 -85
  326. package/src/eco/eco.types.d.ts +0 -178
  327. package/src/eco/eco.types.js +0 -0
  328. package/src/eco/eco.utils.d.ts +0 -1
  329. package/src/eco/eco.utils.js +0 -10
  330. package/src/eco/global-injector-map.d.ts +0 -16
  331. package/src/eco/global-injector-map.js +0 -80
  332. package/src/eco/lazy-injector-map.d.ts +0 -8
  333. package/src/eco/lazy-injector-map.js +0 -70
  334. package/src/eco/module-dependencies.d.ts +0 -18
  335. package/src/eco/module-dependencies.js +0 -49
  336. package/src/errors/http-error.d.ts +0 -31
  337. package/src/errors/http-error.js +0 -50
  338. package/src/errors/index.js +0 -4
  339. package/src/errors/locals-access-error.d.ts +0 -4
  340. package/src/errors/locals-access-error.js +0 -9
  341. package/src/global/app-logger.d.ts +0 -2
  342. package/src/global/app-logger.js +0 -6
  343. package/src/hmr/client/hmr-runtime.d.ts +0 -5
  344. package/src/hmr/client/hmr-runtime.js +0 -109
  345. package/src/hmr/hmr-strategy.d.ts +0 -162
  346. package/src/hmr/hmr-strategy.js +0 -44
  347. package/src/hmr/hmr.postcss.test.e2e.d.ts +0 -1
  348. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  349. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  350. package/src/hmr/hmr.test.e2e.js +0 -43
  351. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  352. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  353. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -139
  354. package/src/hmr/strategies/js-hmr-strategy.js +0 -178
  355. package/src/index.browser.d.ts +0 -3
  356. package/src/index.browser.js +0 -4
  357. package/src/index.d.ts +0 -6
  358. package/src/index.js +0 -21
  359. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -20
  360. package/src/integrations/ghtml/ghtml-renderer.js +0 -63
  361. package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
  362. package/src/integrations/ghtml/ghtml.constants.js +0 -4
  363. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
  364. package/src/integrations/ghtml/ghtml.plugin.js +0 -20
  365. package/src/plugins/alias-resolver-plugin.d.ts +0 -2
  366. package/src/plugins/alias-resolver-plugin.js +0 -53
  367. package/src/plugins/eco-component-meta-plugin.d.ts +0 -108
  368. package/src/plugins/eco-component-meta-plugin.js +0 -163
  369. package/src/plugins/foreign-jsx-override-plugin.d.ts +0 -31
  370. package/src/plugins/foreign-jsx-override-plugin.js +0 -35
  371. package/src/plugins/integration-plugin.d.ts +0 -219
  372. package/src/plugins/integration-plugin.js +0 -196
  373. package/src/plugins/processor.d.ts +0 -95
  374. package/src/plugins/processor.js +0 -136
  375. package/src/plugins/runtime-capability.js +0 -0
  376. package/src/plugins/source-transform.d.ts +0 -46
  377. package/src/plugins/source-transform.js +0 -71
  378. package/src/route-renderer/orchestration/boundary-planning.service.d.ts +0 -25
  379. package/src/route-renderer/orchestration/boundary-planning.service.js +0 -97
  380. package/src/route-renderer/orchestration/component-render-context.d.ts +0 -83
  381. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  382. package/src/route-renderer/orchestration/integration-renderer.d.ts +0 -554
  383. package/src/route-renderer/orchestration/integration-renderer.js +0 -957
  384. package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +0 -89
  385. package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +0 -155
  386. package/src/route-renderer/orchestration/render-execution.service.d.ts +0 -43
  387. package/src/route-renderer/orchestration/render-execution.service.js +0 -106
  388. package/src/route-renderer/orchestration/render-output.utils.d.ts +0 -46
  389. package/src/route-renderer/orchestration/render-output.utils.js +0 -65
  390. package/src/route-renderer/orchestration/render-preparation.service.d.ts +0 -120
  391. package/src/route-renderer/orchestration/render-preparation.service.js +0 -341
  392. package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +0 -50
  393. package/src/route-renderer/orchestration/route-shell-composer.service.js +0 -81
  394. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  395. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  396. package/src/route-renderer/page-loading/dependency-resolver.d.ts +0 -35
  397. package/src/route-renderer/page-loading/dependency-resolver.js +0 -444
  398. package/src/route-renderer/page-loading/page-module-loader.d.ts +0 -90
  399. package/src/route-renderer/page-loading/page-module-loader.js +0 -127
  400. package/src/route-renderer/route-renderer.d.ts +0 -67
  401. package/src/route-renderer/route-renderer.js +0 -103
  402. package/src/router/client/link-intent.js +0 -34
  403. package/src/router/client/link-intent.test.browser.d.ts +0 -1
  404. package/src/router/client/link-intent.test.browser.js +0 -43
  405. package/src/router/client/navigation-coordinator.d.ts +0 -149
  406. package/src/router/client/navigation-coordinator.js +0 -215
  407. package/src/router/server/fs-router-scanner.d.ts +0 -41
  408. package/src/router/server/fs-router-scanner.js +0 -161
  409. package/src/router/server/fs-router.d.ts +0 -26
  410. package/src/router/server/fs-router.js +0 -100
  411. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +0 -120
  412. package/src/services/assets/asset-processing-service/asset-processing.service.js +0 -331
  413. package/src/services/assets/asset-processing-service/asset.factory.d.ts +0 -17
  414. package/src/services/assets/asset-processing-service/asset.factory.js +0 -82
  415. package/src/services/assets/asset-processing-service/assets.types.d.ts +0 -89
  416. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  417. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +0 -55
  418. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +0 -48
  419. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +0 -20
  420. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +0 -41
  421. package/src/services/assets/asset-processing-service/index.d.ts +0 -5
  422. package/src/services/assets/asset-processing-service/index.js +0 -5
  423. package/src/services/assets/asset-processing-service/processor.interface.js +0 -6
  424. package/src/services/assets/asset-processing-service/processor.registry.d.ts +0 -8
  425. package/src/services/assets/asset-processing-service/processor.registry.js +0 -15
  426. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  427. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +0 -64
  428. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -17
  429. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +0 -72
  430. package/src/services/assets/asset-processing-service/processors/index.d.ts +0 -5
  431. package/src/services/assets/asset-processing-service/processors/index.js +0 -5
  432. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +0 -5
  433. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +0 -57
  434. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -9
  435. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +0 -88
  436. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  437. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +0 -75
  438. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -5
  439. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  440. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  441. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -66
  442. package/src/services/assets/browser-bundle.service.d.ts +0 -32
  443. package/src/services/assets/browser-bundle.service.js +0 -33
  444. package/src/services/cache/cache.types.d.ts +0 -107
  445. package/src/services/cache/cache.types.js +0 -0
  446. package/src/services/cache/index.d.ts +0 -7
  447. package/src/services/cache/index.js +0 -7
  448. package/src/services/cache/memory-cache-store.d.ts +0 -42
  449. package/src/services/cache/memory-cache-store.js +0 -98
  450. package/src/services/cache/page-cache-service.d.ts +0 -70
  451. package/src/services/cache/page-cache-service.js +0 -152
  452. package/src/services/cache/page-request-cache-coordinator.service.d.ts +0 -75
  453. package/src/services/cache/page-request-cache-coordinator.service.js +0 -109
  454. package/src/services/html/html-rewriter-provider.service.d.ts +0 -37
  455. package/src/services/html/html-rewriter-provider.service.js +0 -68
  456. package/src/services/html/html-transformer.service.d.ts +0 -77
  457. package/src/services/html/html-transformer.service.js +0 -215
  458. package/src/services/invalidation/development-invalidation.service.d.ts +0 -74
  459. package/src/services/invalidation/development-invalidation.service.js +0 -190
  460. package/src/services/module-loading/app-module-loader.service.d.ts +0 -28
  461. package/src/services/module-loading/app-module-loader.service.js +0 -35
  462. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +0 -24
  463. package/src/services/module-loading/app-server-module-transpiler.service.js +0 -109
  464. package/src/services/module-loading/host-module-loader-registry.d.ts +0 -4
  465. package/src/services/module-loading/host-module-loader-registry.js +0 -15
  466. package/src/services/module-loading/module-loading-types.js +0 -0
  467. package/src/services/module-loading/node-bootstrap-plugin.d.ts +0 -42
  468. package/src/services/module-loading/node-bootstrap-plugin.js +0 -204
  469. package/src/services/module-loading/page-module-import.service.d.ts +0 -76
  470. package/src/services/module-loading/page-module-import.service.js +0 -173
  471. package/src/services/module-loading/server-module-transpiler.service.d.ts +0 -72
  472. package/src/services/module-loading/server-module-transpiler.service.js +0 -64
  473. package/src/services/runtime-state/dev-graph.service.d.ts +0 -118
  474. package/src/services/runtime-state/dev-graph.service.js +0 -162
  475. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +0 -41
  476. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +0 -85
  477. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +0 -69
  478. package/src/services/runtime-state/runtime-specifier-registry.service.js +0 -37
  479. package/src/services/runtime-state/server-invalidation-state.service.d.ts +0 -26
  480. package/src/services/runtime-state/server-invalidation-state.service.js +0 -35
  481. package/src/services/validation/schema-validation-service.d.ts +0 -122
  482. package/src/services/validation/schema-validation-service.js +0 -101
  483. package/src/services/validation/standard-schema.types.js +0 -0
  484. package/src/static-site-generator/static-site-generator.d.ts +0 -104
  485. package/src/static-site-generator/static-site-generator.js +0 -338
  486. package/src/types/internal-types.d.ts +0 -231
  487. package/src/types/internal-types.js +0 -0
  488. package/src/types/public-types.d.ts +0 -1219
  489. package/src/types/public-types.js +0 -0
  490. package/src/utils/deep-merge.d.ts +0 -14
  491. package/src/utils/deep-merge.js +0 -32
  492. package/src/utils/hash.d.ts +0 -1
  493. package/src/utils/hash.js +0 -7
  494. package/src/utils/html-escaping.d.ts +0 -7
  495. package/src/utils/html-escaping.js +0 -6
  496. package/src/utils/html.js +0 -4
  497. package/src/utils/invariant.d.ts +0 -5
  498. package/src/utils/invariant.js +0 -11
  499. package/src/utils/locals-utils.d.ts +0 -15
  500. package/src/utils/locals-utils.js +0 -24
  501. package/src/utils/parse-cli-args.d.ts +0 -27
  502. package/src/utils/parse-cli-args.js +0 -62
  503. package/src/utils/path-utils.module.d.ts +0 -5
  504. package/src/utils/path-utils.module.js +0 -14
  505. package/src/utils/resolve-work-dir.d.ts +0 -11
  506. package/src/utils/resolve-work-dir.js +0 -31
  507. package/src/utils/runtime.d.ts +0 -11
  508. package/src/utils/runtime.js +0 -40
  509. package/src/utils/server-utils.module.d.ts +0 -19
  510. package/src/utils/server-utils.module.js +0 -56
  511. package/src/watchers/project-watcher.d.ts +0 -136
  512. package/src/watchers/project-watcher.js +0 -275
  513. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  514. package/src/watchers/project-watcher.test-helpers.js +0 -52
  515. /package/src/utils/{html.d.ts → html.ts} +0 -0
@@ -0,0 +1,110 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import {
3
+ type DeferredTemplateSerializer,
4
+ serializeTemplateShape,
5
+ type SerializableTemplateShape,
6
+ } from './template-serialization.ts';
7
+
8
+ type TestTemplateShape = SerializableTemplateShape & {
9
+ __testTemplateType: 'deferred-template';
10
+ };
11
+
12
+ function createTestTemplate(strings: readonly string[], values: readonly unknown[]): TestTemplateShape {
13
+ return {
14
+ __testTemplateType: 'deferred-template',
15
+ strings,
16
+ values,
17
+ };
18
+ }
19
+
20
+ const testDeferredTemplateSerializer: DeferredTemplateSerializer<TestTemplateShape> = {
21
+ matches(value: unknown): value is TestTemplateShape {
22
+ return (
23
+ typeof value === 'object' &&
24
+ value !== null &&
25
+ (value as { __testTemplateType?: unknown }).__testTemplateType === 'deferred-template' &&
26
+ Array.isArray((value as { strings?: unknown }).strings) &&
27
+ ((value as { values?: unknown }).values === undefined ||
28
+ Array.isArray((value as { values?: unknown }).values))
29
+ );
30
+ },
31
+ serialize(template: TestTemplateShape, serializeValue: (value: unknown) => string | undefined) {
32
+ return serializeTemplateShape(template, serializeValue);
33
+ },
34
+ };
35
+
36
+ function serializeTestDeferredTemplateValue(
37
+ value: unknown,
38
+ serializeValue: (value: unknown) => string | undefined,
39
+ ): string | undefined {
40
+ if (!testDeferredTemplateSerializer.matches(value)) {
41
+ return undefined;
42
+ }
43
+
44
+ return testDeferredTemplateSerializer.serialize(value, serializeValue);
45
+ }
46
+
47
+ describe('serializeTemplateLike', () => {
48
+ test('preserves quoted attribute values for multi-token class attributes', () => {
49
+ const html = serializeTemplateShape(
50
+ createTestTemplate(['<div class=', '>', '</div>'], ['grid gap-4 lg:grid-cols-2 xl:grid-cols-4', 'Content']),
51
+ (value) => (value == null ? '' : String(value)),
52
+ );
53
+
54
+ expect(html).toBe('<div class="grid gap-4 lg:grid-cols-2 xl:grid-cols-4">Content</div>');
55
+ });
56
+
57
+ test('omits falsey boolean attributes and preserves truthy boolean attributes', () => {
58
+ const truthyHtml = serializeTemplateShape(
59
+ createTestTemplate(['<button ?disabled=', '>x</button>'], ['yes']),
60
+ (value) => (value == null ? '' : String(value)),
61
+ );
62
+ const falseyHtml = serializeTemplateShape(
63
+ createTestTemplate(['<button ?disabled=', '>x</button>'], ['']),
64
+ (value) => (value == null ? '' : String(value)),
65
+ );
66
+
67
+ expect(truthyHtml).toBe('<button disabled>x</button>');
68
+ expect(falseyHtml).toBe('<button>x</button>');
69
+ });
70
+
71
+ test('skips event and prop bindings in SSR output', () => {
72
+ const html = serializeTemplateShape(
73
+ createTestTemplate(['<button @click=', ' .value=', '>x</button>'], ['handler', '1']),
74
+ (value) => (value == null ? '' : String(value)),
75
+ );
76
+
77
+ expect(html).toBe('<button>x</button>');
78
+ });
79
+
80
+ test('escapes attribute values while preserving child interpolation', () => {
81
+ const html = serializeTemplateShape(
82
+ createTestTemplate(['<div title=', '>', '</div>'], ['a "quote" & <tag>', '<span>child</span>']),
83
+ (value) => (value == null ? '' : String(value)),
84
+ );
85
+
86
+ expect(html).toBe('<div title="a &quot;quote&quot; &amp; &lt;tag&gt;"><span>child</span></div>');
87
+ });
88
+
89
+ test('does not serialize unmatched template-like values', () => {
90
+ expect(
91
+ serializeTestDeferredTemplateValue(
92
+ {
93
+ strings: ['<div>', '</div>'],
94
+ values: ['content'],
95
+ _$litType$: 1,
96
+ },
97
+ (value) => (value == null ? '' : String(value)),
98
+ ),
99
+ ).toBeUndefined();
100
+ });
101
+
102
+ test('serializes locally provided template serializers without ambient registration', () => {
103
+ expect(
104
+ serializeTestDeferredTemplateValue(
105
+ createTestTemplate(['<div class=', '>', '</div>'], ['shared gap-4', 'content']),
106
+ (value) => (value == null ? '' : String(value)),
107
+ ),
108
+ ).toBe('<div class="shared gap-4">content</div>');
109
+ });
110
+ });
@@ -0,0 +1,117 @@
1
+ import { escapeHtmlAttribute } from '../../utils/html-escaping.ts';
2
+
3
+ /**
4
+ * Minimal template-result shape that core can serialize generically.
5
+ *
6
+ * @remarks
7
+ * Core intentionally models only the transport shape used during deferred
8
+ * cross-integration child passing: alternating static string segments plus
9
+ * interpolated runtime values. Concrete runtime markers that identify a given
10
+ * framework's template payload must stay outside core and be registered by the
11
+ * owning integration package.
12
+ */
13
+ export type SerializableTemplateShape = {
14
+ strings: readonly string[];
15
+ values?: readonly unknown[];
16
+ };
17
+
18
+ /**
19
+ * Parsed attribute metadata for one template string segment.
20
+ *
21
+ * `serializeTemplateShape()` uses this to decide whether the next interpolated
22
+ * value should be emitted as raw HTML content, a quoted attribute value, a
23
+ * boolean attribute, or omitted entirely for client-only bindings.
24
+ */
25
+ type SerializableTemplateAttribute = {
26
+ leading: string;
27
+ name: string;
28
+ prefix: string;
29
+ whitespace: string;
30
+ };
31
+
32
+ /**
33
+ * Integration-owned adapter that teaches core how to serialize one deferred
34
+ * template payload shape.
35
+ *
36
+ * @remarks
37
+ * The separation here is intentional: core owns the HTML serialization logic,
38
+ * but integrations own runtime-shape detection. That keeps package-specific
39
+ * markers such as framework template sentinels out of core while still letting
40
+ * deferred children round-trip through mixed renderer boundaries.
41
+ */
42
+ export type DeferredTemplateSerializer<TTemplate extends SerializableTemplateShape = SerializableTemplateShape> = {
43
+ matches(value: unknown): value is TTemplate;
44
+ serialize(template: TTemplate, serializeValue: (value: unknown) => string | undefined): string;
45
+ };
46
+
47
+ const ATTRIBUTE_TAIL_PATTERN = /(\s+)([@.?!]?)([^\s"'<>/=`@.?!]+)=$/;
48
+
49
+ /**
50
+ * Detects whether the current string segment ends in an HTML attribute binding.
51
+ *
52
+ * The parser is intentionally small: it only recognizes the transport shape
53
+ * Ecopages needs during deferred mixed-integration rendering, not a full HTML
54
+ * grammar.
55
+ */
56
+ function getSerializableTemplateAttribute(stringPart: string): SerializableTemplateAttribute | undefined {
57
+ const match = ATTRIBUTE_TAIL_PATTERN.exec(stringPart);
58
+ if (!match) return undefined;
59
+
60
+ return {
61
+ leading: stringPart.slice(0, match.index),
62
+ whitespace: match[1],
63
+ prefix: match[2],
64
+ name: match[3],
65
+ };
66
+ }
67
+
68
+ /**
69
+ * Serializes a generic template shape into HTML.
70
+ *
71
+ * @remarks
72
+ * This handles only HTML reconstruction semantics: quoted attribute values,
73
+ * boolean attributes, and omission of client-only event or property bindings.
74
+ * It does not decide whether an arbitrary value belongs to a framework-specific
75
+ * template runtime; integrations must make that decision before delegating here.
76
+ */
77
+ export function serializeTemplateShape(
78
+ template: SerializableTemplateShape,
79
+ serializeValue: (value: unknown) => string | undefined,
80
+ ): string {
81
+ const values = template.values ?? [];
82
+ let html = '';
83
+
84
+ for (let index = 0; index < values.length; index += 1) {
85
+ const stringPart = template.strings[index] ?? '';
86
+ const serializedValue = serializeValue(values[index]);
87
+ const attribute = getSerializableTemplateAttribute(stringPart);
88
+
89
+ if (!attribute) {
90
+ html += stringPart;
91
+ html += serializedValue ?? '';
92
+ continue;
93
+ }
94
+
95
+ html += attribute.leading;
96
+
97
+ if (attribute.prefix === '@' || attribute.prefix === '!' || attribute.prefix === '.') {
98
+ continue;
99
+ }
100
+
101
+ if (attribute.prefix === '?') {
102
+ if (serializedValue) {
103
+ html += `${attribute.whitespace}${attribute.name}`;
104
+ }
105
+ continue;
106
+ }
107
+
108
+ if (serializedValue === undefined) {
109
+ continue;
110
+ }
111
+
112
+ html += `${attribute.whitespace}${attribute.name}="${escapeHtmlAttribute(serializedValue)}"`;
113
+ }
114
+
115
+ html += template.strings[values.length] ?? '';
116
+ return html;
117
+ }
@@ -0,0 +1,196 @@
1
+ import path from 'node:path';
2
+ import type { DependencyLazyTrigger, EcoComponent } from '../../types/public-types.ts';
3
+ import type { AssetDefinition } from '../../services/assets/asset-processing-service/index.ts';
4
+ import { AssetFactory } from '../../services/assets/asset-processing-service/index.ts';
5
+ import { extractEcopagesVirtualImports } from './ecopages-virtual-imports.ts';
6
+ import { collectDeclaredAssetEntries } from './declared-asset-collection.ts';
7
+ import { getLazyTriggerKey } from './lazy-trigger-planning.ts';
8
+ import { collectLazyScriptEntries, type LazyGroup } from './lazy-entry-collection.ts';
9
+ import {
10
+ createModuleScriptName,
11
+ createNamedImportModuleSource,
12
+ createNamespaceImportModuleSource,
13
+ } from './module-declaration-scripts.ts';
14
+ import { collectModuleDeclarations } from './module-declaration-aggregation.ts';
15
+
16
+ const MODULE_SCRIPT_ATTRIBUTES = {
17
+ type: 'module',
18
+ defer: '',
19
+ } as const;
20
+
21
+ function createModuleScriptAttributes(attributes?: Record<string, string>): Record<string, string> {
22
+ return {
23
+ ...MODULE_SCRIPT_ATTRIBUTES,
24
+ ...attributes,
25
+ };
26
+ }
27
+
28
+ function pushUniqueDependency(
29
+ keys: Set<string>,
30
+ key: string,
31
+ dependencies: AssetDefinition[],
32
+ dependency: AssetDefinition,
33
+ ): boolean {
34
+ if (keys.has(key)) {
35
+ return false;
36
+ }
37
+
38
+ keys.add(key);
39
+ dependencies.push(dependency);
40
+ return true;
41
+ }
42
+
43
+ function resolveDependencyPath(componentDir: string, pathUrl: string): string {
44
+ return path.join(componentDir, pathUrl);
45
+ }
46
+
47
+ /**
48
+ * Aggregated dependency output for one dependency-collection pass.
49
+ */
50
+ export type CollectedComponentDependencies = {
51
+ /**
52
+ * Flat asset declarations ready for downstream processing.
53
+ */
54
+ dependencies: AssetDefinition[];
55
+ /**
56
+ * Lazy script groups keyed by component config and trigger key.
57
+ */
58
+ lazyScriptsByConfig: Map<NonNullable<EcoComponent['config']>, Map<string, LazyGroup>>;
59
+ };
60
+
61
+ type CollectComponentDependenciesOptions = {
62
+ components: Array<EcoComponent | Partial<EcoComponent> | undefined | null>;
63
+ integrationName: string;
64
+ resolveLazyScripts: (componentDir: string, scripts: string[]) => string;
65
+ createEcopagesJsxLazyEntryName: (integrationName: string, key: string) => string;
66
+ isEcopagesJsxIntegration: (integrationName: string) => boolean;
67
+ errors: {
68
+ invalidStylesheetEntry: string;
69
+ invalidScriptEntry: string;
70
+ lazyScriptMissingSrc: string;
71
+ };
72
+ };
73
+
74
+ /**
75
+ * Walks component dependency trees and collects declared assets, module declarations,
76
+ * and lazy-script group metadata in one pass.
77
+ *
78
+ * The returned structures intentionally preserve both the flat asset list used by
79
+ * asset processing and the grouped lazy-trigger data used later during render output.
80
+ */
81
+ export function collectComponentDependencies(
82
+ options: CollectComponentDependenciesOptions,
83
+ ): CollectedComponentDependencies {
84
+ const { components, integrationName, resolveLazyScripts, createEcopagesJsxLazyEntryName, isEcopagesJsxIntegration, errors } =
85
+ options;
86
+ const dependencies: AssetDefinition[] = [];
87
+ const lazyScriptsByConfig = new Map<NonNullable<EcoComponent['config']>, Map<string, LazyGroup>>();
88
+ const lazyDependencyKeys = new Set<string>();
89
+
90
+ for (const component of components) {
91
+ if (!component) continue;
92
+
93
+ const componentFile = component.config?.__eco?.file;
94
+ if (!componentFile) continue;
95
+
96
+ const stylesheetDependencyKeys = new Set<string>();
97
+ const scriptDependencyKeys = new Set<string>();
98
+ const modulesMap = new Map<string, Set<string> | null>();
99
+
100
+ /**
101
+ * Recursively visits one component config and its declared child dependencies.
102
+ */
103
+ const collect = (config: EcoComponent['config']) => {
104
+ if (!config) return;
105
+
106
+ const file = config.__eco?.file;
107
+ if (!file) return;
108
+ const dir = path.dirname(file);
109
+ const dependenciesConfig = config.dependencies;
110
+
111
+ const registerLazyScript = ({
112
+ lazy,
113
+ lazyKey,
114
+ fallbackUrl,
115
+ }: {
116
+ lazy: DependencyLazyTrigger;
117
+ lazyKey: string;
118
+ fallbackUrl?: string;
119
+ }) => {
120
+ let grouped = lazyScriptsByConfig.get(config);
121
+ if (!grouped) {
122
+ grouped = new Map<string, LazyGroup>();
123
+ lazyScriptsByConfig.set(config, grouped);
124
+ }
125
+
126
+ const triggerKey = getLazyTriggerKey(lazy);
127
+ const existing = grouped.get(triggerKey) ?? { lazy, scripts: [] };
128
+ existing.scripts.push({ lazyKey, fallbackUrl });
129
+ grouped.set(triggerKey, existing);
130
+ };
131
+
132
+ collectDeclaredAssetEntries({
133
+ stylesheetEntries: dependenciesConfig?.stylesheets ?? [],
134
+ scriptEntries: dependenciesConfig?.scripts ?? [],
135
+ componentDir: dir,
136
+ dependencies,
137
+ stylesheetDependencyKeys,
138
+ scriptDependencyKeys,
139
+ resolveDependencyPath,
140
+ createModuleScriptAttributes,
141
+ pushUniqueDependency,
142
+ getInvalidStylesheetEntryMessage: () => errors.invalidStylesheetEntry,
143
+ getInvalidScriptEntryMessage: () => errors.invalidScriptEntry,
144
+ });
145
+
146
+ collectModuleDeclarations(modulesMap, dependenciesConfig?.modules, extractEcopagesVirtualImports(file));
147
+
148
+ collectLazyScriptEntries({
149
+ scriptEntries: dependenciesConfig?.scripts ?? [],
150
+ componentFile: file,
151
+ componentDir: dir,
152
+ integrationName,
153
+ dependencies,
154
+ lazyDependencyKeys,
155
+ registerLazyScript,
156
+ resolveDependencyPath,
157
+ resolveLazyScripts,
158
+ createModuleScriptAttributes,
159
+ createEcopagesJsxLazyEntryName,
160
+ pushUniqueDependency,
161
+ getLazyScriptMissingSrcMessage: () => errors.lazyScriptMissingSrc,
162
+ isEcopagesJsxIntegration,
163
+ });
164
+
165
+ if (dependenciesConfig?.components) {
166
+ for (const nestedComponent of dependenciesConfig.components) {
167
+ if (nestedComponent?.config) {
168
+ collect(nestedComponent.config);
169
+ }
170
+ }
171
+ }
172
+ };
173
+
174
+ collect(component.config);
175
+
176
+ dependencies.push(
177
+ ...Array.from(modulesMap.entries()).map(([from, importsSet]) => {
178
+ const imports = importsSet ? Array.from(importsSet) : undefined;
179
+ return AssetFactory.createContentScript({
180
+ position: 'head',
181
+ name: createModuleScriptName(from, imports),
182
+ content:
183
+ imports && imports.length > 0
184
+ ? createNamedImportModuleSource(from, imports)
185
+ : createNamespaceImportModuleSource(from),
186
+ attributes: createModuleScriptAttributes(),
187
+ });
188
+ }),
189
+ );
190
+ }
191
+
192
+ return {
193
+ dependencies,
194
+ lazyScriptsByConfig,
195
+ };
196
+ }
@@ -0,0 +1,156 @@
1
+ import type {
2
+ EcoComponentScriptEntry,
3
+ EcoComponentStylesheetEntry,
4
+ } from '../../types/public-types.ts';
5
+ import type { AssetDefinition } from '../../services/assets/asset-processing-service/index.ts';
6
+ import { AssetFactory } from '../../services/assets/asset-processing-service/index.ts';
7
+
8
+ type CollectDeclaredAssetEntriesOptions = {
9
+ stylesheetEntries: Array<string | EcoComponentStylesheetEntry>;
10
+ scriptEntries: Array<string | EcoComponentScriptEntry>;
11
+ componentDir: string;
12
+ dependencies: AssetDefinition[];
13
+ stylesheetDependencyKeys: Set<string>;
14
+ scriptDependencyKeys: Set<string>;
15
+ resolveDependencyPath: (componentDir: string, pathUrl: string) => string;
16
+ createModuleScriptAttributes: (attributes?: Record<string, string>) => Record<string, string>;
17
+ pushUniqueDependency: (
18
+ keys: Set<string>,
19
+ key: string,
20
+ dependencies: AssetDefinition[],
21
+ dependency: AssetDefinition,
22
+ ) => boolean;
23
+ getInvalidStylesheetEntryMessage: () => string;
24
+ getInvalidScriptEntryMessage: () => string;
25
+ };
26
+
27
+ function isDependencyEntryObject(
28
+ entry: string | EcoComponentScriptEntry | EcoComponentStylesheetEntry,
29
+ ): entry is EcoComponentScriptEntry | EcoComponentStylesheetEntry {
30
+ return typeof entry === 'object' && entry !== null;
31
+ }
32
+
33
+ function getDependencyEntrySrc(
34
+ entry: string | EcoComponentScriptEntry | EcoComponentStylesheetEntry,
35
+ ): string | undefined {
36
+ return isDependencyEntryObject(entry) ? entry.src : entry;
37
+ }
38
+
39
+ function getDependencyEntryContent(
40
+ entry: string | EcoComponentScriptEntry | EcoComponentStylesheetEntry,
41
+ ): string | undefined {
42
+ return isDependencyEntryObject(entry) ? entry.content : undefined;
43
+ }
44
+
45
+ function getDependencyEntryAttributes(
46
+ entry: string | EcoComponentScriptEntry | EcoComponentStylesheetEntry,
47
+ ): Record<string, string> | undefined {
48
+ return isDependencyEntryObject(entry) ? entry.attributes : undefined;
49
+ }
50
+
51
+ /**
52
+ * Normalizes non-lazy stylesheet and script declarations into asset definitions.
53
+ *
54
+ * Duplicate declarations are filtered through the provided key sets so callers can
55
+ * compose this helper into larger recursive collection passes without re-emitting
56
+ * the same asset multiple times.
57
+ */
58
+ export function collectDeclaredAssetEntries(options: CollectDeclaredAssetEntriesOptions): void {
59
+ const {
60
+ stylesheetEntries,
61
+ scriptEntries,
62
+ componentDir,
63
+ dependencies,
64
+ stylesheetDependencyKeys,
65
+ scriptDependencyKeys,
66
+ resolveDependencyPath,
67
+ createModuleScriptAttributes,
68
+ pushUniqueDependency,
69
+ getInvalidStylesheetEntryMessage,
70
+ getInvalidScriptEntryMessage,
71
+ } = options;
72
+
73
+ for (const style of stylesheetEntries) {
74
+ const content = getDependencyEntryContent(style);
75
+ const src = getDependencyEntrySrc(style);
76
+ const attributes = getDependencyEntryAttributes(style);
77
+
78
+ if (content) {
79
+ const depKey = `style:content:${content}:${JSON.stringify(attributes ?? {})}`;
80
+ pushUniqueDependency(
81
+ stylesheetDependencyKeys,
82
+ depKey,
83
+ dependencies,
84
+ AssetFactory.createContentStylesheet({
85
+ content,
86
+ position: 'head',
87
+ attributes,
88
+ }),
89
+ );
90
+ continue;
91
+ }
92
+
93
+ if (!src) {
94
+ throw new Error(getInvalidStylesheetEntryMessage());
95
+ }
96
+
97
+ const resolvedPath = resolveDependencyPath(componentDir, src);
98
+ const depKey = `style:file:${resolvedPath}:${JSON.stringify(attributes ?? {})}`;
99
+ pushUniqueDependency(
100
+ stylesheetDependencyKeys,
101
+ depKey,
102
+ dependencies,
103
+ AssetFactory.createFileStylesheet({
104
+ filepath: resolvedPath,
105
+ position: 'head',
106
+ attributes: {
107
+ rel: 'stylesheet',
108
+ ...attributes,
109
+ },
110
+ }),
111
+ );
112
+ }
113
+
114
+ for (const script of scriptEntries) {
115
+ if (isDependencyEntryObject(script) && 'lazy' in script && script.lazy) {
116
+ continue;
117
+ }
118
+
119
+ const content = getDependencyEntryContent(script);
120
+ const src = getDependencyEntrySrc(script);
121
+ const attributes = getDependencyEntryAttributes(script);
122
+
123
+ if (content) {
124
+ const depKey = `script:content:${content}:${JSON.stringify(attributes ?? {})}`;
125
+ pushUniqueDependency(
126
+ scriptDependencyKeys,
127
+ depKey,
128
+ dependencies,
129
+ AssetFactory.createInlineContentScript({
130
+ position: 'head',
131
+ content,
132
+ bundle: false,
133
+ attributes,
134
+ }),
135
+ );
136
+ continue;
137
+ }
138
+
139
+ if (!src) {
140
+ throw new Error(getInvalidScriptEntryMessage());
141
+ }
142
+
143
+ const resolvedPath = resolveDependencyPath(componentDir, src);
144
+ const depKey = `script:file:${resolvedPath}:${JSON.stringify(attributes ?? {})}`;
145
+ pushUniqueDependency(
146
+ scriptDependencyKeys,
147
+ depKey,
148
+ dependencies,
149
+ AssetFactory.createFileScript({
150
+ filepath: resolvedPath,
151
+ position: 'head',
152
+ attributes: createModuleScriptAttributes(attributes),
153
+ }),
154
+ );
155
+ }
156
+ }