@ecopages/core 0.2.0-alpha.53 → 0.2.0-alpha.54

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 (590) hide show
  1. package/README.md +2 -3
  2. package/package.json +97 -182
  3. package/src/adapters/abstract/application-adapter.test.ts +218 -0
  4. package/src/adapters/abstract/application-adapter.ts +379 -0
  5. package/src/adapters/abstract/router-adapter.ts +30 -0
  6. package/src/adapters/abstract/server-adapter.ts +79 -0
  7. package/src/adapters/bun/client-bridge.ts +62 -0
  8. package/src/adapters/bun/create-app.ts +214 -0
  9. package/src/adapters/bun/hmr-manager.test.ts +265 -0
  10. package/src/adapters/bun/hmr-manager.ts +88 -0
  11. package/src/adapters/bun/index.ts +2 -0
  12. package/src/adapters/bun/runtime-host.ts +76 -0
  13. package/src/adapters/bun/server-adapter.ts +605 -0
  14. package/src/adapters/bun/static-preview-host.ts +70 -0
  15. package/src/adapters/create-app.test.ts +10 -0
  16. package/src/adapters/create-app.ts +91 -0
  17. package/src/adapters/index.ts +2 -0
  18. package/src/adapters/node/create-app.test.ts +76 -0
  19. package/src/adapters/node/create-app.ts +116 -0
  20. package/src/adapters/node/http-request-bridge.test.ts +146 -0
  21. package/src/adapters/node/http-request-bridge.ts +176 -0
  22. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  23. package/src/adapters/node/node-client-bridge.ts +79 -0
  24. package/src/adapters/node/node-hmr-manager.test.ts +374 -0
  25. package/src/adapters/node/node-hmr-manager.ts +72 -0
  26. package/src/adapters/node/runtime-host.test.ts +49 -0
  27. package/src/adapters/node/runtime-host.ts +113 -0
  28. package/src/adapters/node/server-adapter-dependencies.ts +28 -0
  29. package/src/adapters/node/server-adapter.test.ts +84 -0
  30. package/src/adapters/node/server-adapter.ts +423 -0
  31. package/src/adapters/node/static-content-server.test.ts +60 -0
  32. package/src/adapters/node/static-content-server.ts +239 -0
  33. package/src/adapters/node/static-preview-host.test.ts +89 -0
  34. package/src/adapters/node/static-preview-host.ts +101 -0
  35. package/src/adapters/shared/api-response.test.ts +97 -0
  36. package/src/adapters/shared/api-response.ts +104 -0
  37. package/src/adapters/shared/application-adapter.ts +199 -0
  38. package/src/adapters/shared/define-api-handler.ts +66 -0
  39. package/src/adapters/shared/explicit-static-render-preparation.ts +58 -0
  40. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  41. package/src/adapters/shared/explicit-static-route-matcher.ts +131 -0
  42. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +85 -0
  43. package/src/adapters/shared/file-route-middleware-pipeline.ts +118 -0
  44. package/src/adapters/shared/fs-server-response-factory.test.ts +176 -0
  45. package/src/adapters/shared/fs-server-response-factory.ts +96 -0
  46. package/src/adapters/shared/fs-server-response-matcher.test.ts +311 -0
  47. package/src/adapters/shared/fs-server-response-matcher.ts +240 -0
  48. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  49. package/src/adapters/shared/hmr-html-response.ts +54 -0
  50. package/src/adapters/shared/hmr-manager.contract.test.ts +228 -0
  51. package/src/adapters/shared/hmr-manager.dispatch.test.ts +229 -0
  52. package/src/adapters/shared/render-context.test.ts +244 -0
  53. package/src/adapters/shared/render-context.ts +161 -0
  54. package/src/adapters/shared/runtime-app-bootstrap.test.ts +96 -0
  55. package/src/adapters/shared/runtime-app-bootstrap.ts +72 -0
  56. package/src/adapters/shared/runtime-host.ts +11 -0
  57. package/src/adapters/shared/server-adapter.test.ts +130 -0
  58. package/src/adapters/shared/server-adapter.ts +571 -0
  59. package/src/adapters/shared/server-route-handler.test.ts +112 -0
  60. package/src/adapters/shared/server-route-handler.ts +153 -0
  61. package/src/adapters/shared/server-static-builder.test.ts +338 -0
  62. package/src/adapters/shared/server-static-builder.ts +170 -0
  63. package/src/adapters/shared/shared-hmr-manager.ts +298 -0
  64. package/src/adapters/shared/static-preview-host.ts +12 -0
  65. package/src/build/README.md +57 -73
  66. package/src/build/browser-runtime-manifest.test.ts +121 -0
  67. package/src/build/browser-runtime-manifest.ts +105 -0
  68. package/src/build/browser-runtime-plugin-helpers.test.ts +49 -0
  69. package/src/build/browser-runtime-plugin-helpers.ts +37 -0
  70. package/src/build/browser-runtime-plugin.test.ts +256 -0
  71. package/src/build/browser-runtime-plugin.ts +306 -0
  72. package/src/build/build-adapter.test.ts +463 -0
  73. package/src/build/build-adapter.ts +788 -0
  74. package/src/build/build-manifest.ts +79 -0
  75. package/src/build/build-types.ts +83 -0
  76. package/src/build/rolldown-build-adapter.test.ts +352 -0
  77. package/src/build/rolldown-build-adapter.ts +363 -0
  78. package/src/build/rolldown-plugin-bridge.test.ts +256 -0
  79. package/src/build/rolldown-plugin-bridge.ts +309 -0
  80. package/src/build/runtime-build-executor.test.ts +130 -0
  81. package/src/build/runtime-build-executor.ts +37 -0
  82. package/src/build/runtime-build-output-normalizer.ts +137 -0
  83. package/src/build/serialized-build-executor.test.ts +96 -0
  84. package/src/build/serialized-build-executor.ts +90 -0
  85. package/src/build/server-side-css-shim-plugin.ts +77 -0
  86. package/src/cache/index.ts +6 -0
  87. package/src/cache/module-parse-cache.test.ts +73 -0
  88. package/src/cache/module-parse-cache.ts +137 -0
  89. package/src/config/README.md +1 -1
  90. package/src/config/config-builder.test.ts +456 -0
  91. package/src/config/config-builder.ts +728 -0
  92. package/src/config/config-builder.typecheck.test.ts +96 -0
  93. package/src/config/{constants.d.ts → constants.ts} +22 -13
  94. package/src/dev/host-runtime.ts +34 -0
  95. package/src/dev/sc-server.ts +143 -0
  96. package/src/eco/eco.browser.test.ts +43 -0
  97. package/src/eco/eco.browser.ts +137 -0
  98. package/src/eco/eco.test.ts +781 -0
  99. package/src/eco/eco.ts +262 -0
  100. package/src/eco/eco.types.ts +293 -0
  101. package/src/eco/eco.utils.test.ts +219 -0
  102. package/src/eco/eco.utils.ts +5 -0
  103. package/src/eco/global-injector-map.test.ts +42 -0
  104. package/src/eco/global-injector-map.ts +112 -0
  105. package/src/eco/lazy-injector-map.test.ts +66 -0
  106. package/src/eco/lazy-injector-map.ts +120 -0
  107. package/src/eco/module-dependencies.test.ts +30 -0
  108. package/src/eco/module-dependencies.ts +75 -0
  109. package/src/errors/http-error.test.ts +134 -0
  110. package/src/errors/http-error.ts +72 -0
  111. package/src/errors/index.ts +3 -0
  112. package/src/errors/locals-access-error.ts +7 -0
  113. package/src/global/app-logger.ts +4 -0
  114. package/src/global/utils.test.ts +12 -0
  115. 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
  116. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  117. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  118. package/src/hmr/client/hmr-runtime.ts +162 -0
  119. package/src/hmr/hmr-strategy.test.ts +124 -0
  120. package/src/hmr/hmr-strategy.ts +177 -0
  121. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  122. package/src/hmr/hmr.test.e2e.ts +66 -0
  123. package/src/hmr/strategies/default-hmr-strategy.ts +60 -0
  124. package/src/hmr/strategies/js-hmr-strategy.test.ts +344 -0
  125. package/src/hmr/strategies/js-hmr-strategy.ts +307 -0
  126. package/src/index.browser.ts +3 -0
  127. package/src/index.ts +15 -0
  128. package/src/integrations/ghtml/ghtml-renderer.test.ts +253 -0
  129. package/src/integrations/ghtml/ghtml-renderer.ts +87 -0
  130. package/src/integrations/ghtml/ghtml.constants.ts +1 -0
  131. package/src/integrations/ghtml/ghtml.plugin.ts +28 -0
  132. package/src/plugins/alias-resolver-cache.test.ts +110 -0
  133. package/src/plugins/alias-resolver-cache.ts +145 -0
  134. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  135. package/src/plugins/alias-resolver-plugin.ts +75 -0
  136. package/src/plugins/eco-component-meta-plugin.test.ts +421 -0
  137. package/src/plugins/eco-component-meta-plugin.ts +518 -0
  138. package/src/plugins/foreign-jsx-override-plugin.test.ts +65 -0
  139. package/src/plugins/foreign-jsx-override-plugin.ts +76 -0
  140. package/src/plugins/integration-plugin.test.ts +151 -0
  141. package/src/plugins/integration-plugin.ts +344 -0
  142. package/src/plugins/processor.test.ts +148 -0
  143. package/src/plugins/processor.ts +257 -0
  144. package/src/plugins/{runtime-capability.d.ts → runtime-capability.ts} +8 -3
  145. package/src/plugins/source-transform.test.ts +82 -0
  146. package/src/plugins/source-transform.ts +123 -0
  147. package/src/route-renderer/orchestration/component-render-context.ts +338 -0
  148. package/src/route-renderer/orchestration/declared-ownership-graph.ts +62 -0
  149. package/src/route-renderer/orchestration/foreign-subtree-execution.service.ts +431 -0
  150. package/src/route-renderer/orchestration/integration-renderer.test.ts +2251 -0
  151. package/src/route-renderer/orchestration/integration-renderer.ts +1384 -0
  152. package/src/route-renderer/orchestration/ownership-planning.service.ts +97 -0
  153. package/src/route-renderer/orchestration/ownership-validation.service.ts +76 -0
  154. package/src/route-renderer/orchestration/processed-asset-dedupe.ts +29 -0
  155. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.test.ts +435 -0
  156. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.ts +310 -0
  157. package/src/route-renderer/orchestration/render-output.utils.ts +310 -0
  158. package/src/route-renderer/orchestration/route-render-orchestrator.prepare-render-options.test.ts +1365 -0
  159. package/src/route-renderer/orchestration/route-render-orchestrator.test.ts +267 -0
  160. package/src/route-renderer/orchestration/route-render-orchestrator.ts +879 -0
  161. package/src/route-renderer/orchestration/template-serialization.test.ts +110 -0
  162. package/src/route-renderer/orchestration/template-serialization.ts +117 -0
  163. package/src/route-renderer/page-loading/component-dependency-collection.ts +202 -0
  164. package/src/route-renderer/page-loading/declared-asset-collection.ts +153 -0
  165. package/src/route-renderer/page-loading/dependency-resolver.test.ts +761 -0
  166. package/src/route-renderer/page-loading/dependency-resolver.ts +144 -0
  167. package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +75 -0
  168. package/src/route-renderer/page-loading/lazy-entry-collection.ts +167 -0
  169. package/src/route-renderer/page-loading/lazy-trigger-planning.ts +74 -0
  170. package/src/route-renderer/page-loading/module-declaration-aggregation.ts +60 -0
  171. package/src/route-renderer/page-loading/module-declaration-scripts.ts +16 -0
  172. package/src/route-renderer/page-loading/page-dependency-bundling.ts +244 -0
  173. package/src/route-renderer/page-loading/page-module-loader.test.ts +183 -0
  174. package/src/route-renderer/page-loading/page-module-loader.ts +184 -0
  175. package/src/route-renderer/route-renderer.ts +133 -0
  176. package/src/router/client/link-intent.test.browser.ts +51 -0
  177. package/src/router/client/link-intent.ts +92 -0
  178. package/src/router/client/navigation-coordinator.test.ts +237 -0
  179. package/src/router/client/navigation-coordinator.ts +453 -0
  180. package/src/router/server/route-registry.test.ts +176 -0
  181. package/src/router/server/route-registry.ts +382 -0
  182. package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +66 -0
  183. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +473 -0
  184. package/src/services/assets/asset-processing-service/asset-processing.service.ts +344 -0
  185. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  186. package/src/services/assets/asset-processing-service/asset.factory.ts +105 -0
  187. package/src/services/assets/asset-processing-service/assets.types.ts +128 -0
  188. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +74 -0
  189. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +98 -0
  190. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  191. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  192. package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +104 -0
  193. package/src/services/assets/asset-processing-service/index.ts +6 -0
  194. package/src/services/assets/asset-processing-service/page-package.test.ts +135 -0
  195. package/src/services/assets/asset-processing-service/page-package.ts +103 -0
  196. package/src/services/assets/asset-processing-service/{processor.interface.d.ts → processor.interface.ts} +10 -5
  197. package/src/services/assets/asset-processing-service/processor.registry.ts +18 -0
  198. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  199. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +83 -0
  200. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +173 -0
  201. package/src/services/assets/asset-processing-service/processors/index.ts +5 -0
  202. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +188 -0
  203. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +138 -0
  204. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +326 -0
  205. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +116 -0
  206. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +270 -0
  207. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +145 -0
  208. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +261 -0
  209. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +72 -0
  210. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +83 -0
  211. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +65 -0
  212. package/src/services/assets/browser-bundle.service.test.ts +66 -0
  213. package/src/services/assets/browser-bundle.service.ts +109 -0
  214. package/src/services/cache/cache.types.ts +126 -0
  215. package/src/services/cache/index.ts +18 -0
  216. package/src/services/cache/memory-cache-store.test.ts +225 -0
  217. package/src/services/cache/memory-cache-store.ts +130 -0
  218. package/src/services/cache/page-cache-service.test.ts +175 -0
  219. package/src/services/cache/page-cache-service.ts +202 -0
  220. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  221. package/src/services/cache/page-request-cache-coordinator.service.ts +131 -0
  222. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  223. package/src/services/html/html-rewriter-provider.service.ts +105 -0
  224. package/src/services/html/html-transformer.service.test.ts +544 -0
  225. package/src/services/html/html-transformer.service.ts +369 -0
  226. package/src/services/invalidation/development-invalidation.service.test.ts +87 -0
  227. package/src/services/invalidation/development-invalidation.service.ts +262 -0
  228. package/src/services/module-loading/app-module-loader.service.ts +9 -0
  229. package/src/services/module-loading/app-server-module-transpiler.service.test.ts +297 -0
  230. package/src/services/module-loading/app-server-module-transpiler.service.ts +168 -0
  231. package/src/services/module-loading/host-module-loader-registry.ts +15 -0
  232. package/src/services/module-loading/{module-loading-types.d.ts → module-loading-types.ts} +1 -0
  233. package/src/services/module-loading/page-module-import.service.test.ts +652 -0
  234. package/src/services/module-loading/page-module-import.service.ts +302 -0
  235. package/src/services/module-loading/server-module-transpiler.service.test.ts +242 -0
  236. package/src/services/module-loading/server-module-transpiler.service.ts +104 -0
  237. package/src/services/module-loading/source-module-support.ts +19 -0
  238. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  239. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  240. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  241. package/src/services/validation/schema-validation-service.test.ts +223 -0
  242. package/src/services/validation/schema-validation-service.ts +204 -0
  243. package/src/services/validation/{standard-schema.types.d.ts → standard-schema.types.ts} +20 -17
  244. package/src/static-site-generator/static-site-generator.test.ts +408 -0
  245. package/src/static-site-generator/static-site-generator.ts +445 -0
  246. package/src/types/internal-types.ts +243 -0
  247. package/src/types/public-types.ts +1508 -0
  248. package/src/utils/deep-merge.test.ts +114 -0
  249. package/src/utils/deep-merge.ts +47 -0
  250. package/src/utils/hash.ts +5 -0
  251. package/src/utils/html-escaping.ts +9 -0
  252. package/src/utils/invariant.test.ts +22 -0
  253. package/src/utils/invariant.ts +15 -0
  254. package/src/utils/locals-utils.ts +37 -0
  255. package/src/utils/parse-cli-args.test.ts +69 -0
  256. package/src/utils/parse-cli-args.ts +105 -0
  257. package/src/utils/path-utils.module.ts +14 -0
  258. package/src/utils/path-utils.test.ts +15 -0
  259. package/src/utils/resolve-work-dir.ts +45 -0
  260. package/src/utils/runtime.ts +44 -0
  261. package/src/utils/server-utils.module.ts +67 -0
  262. package/src/utils/server-utils.test.ts +38 -0
  263. package/src/watchers/project-watcher.integration.test.ts +337 -0
  264. package/src/watchers/project-watcher.test-helpers.ts +42 -0
  265. package/src/watchers/project-watcher.test.ts +768 -0
  266. package/src/watchers/project-watcher.ts +357 -0
  267. package/src/adapters/abstract/application-adapter.d.ts +0 -194
  268. package/src/adapters/abstract/application-adapter.js +0 -121
  269. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  270. package/src/adapters/abstract/router-adapter.js +0 -5
  271. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  272. package/src/adapters/abstract/server-adapter.js +0 -15
  273. package/src/adapters/bun/client-bridge.d.ts +0 -34
  274. package/src/adapters/bun/client-bridge.js +0 -48
  275. package/src/adapters/bun/create-app.d.ts +0 -60
  276. package/src/adapters/bun/create-app.js +0 -140
  277. package/src/adapters/bun/hmr-manager.d.ts +0 -47
  278. package/src/adapters/bun/hmr-manager.js +0 -58
  279. package/src/adapters/bun/index.d.ts +0 -2
  280. package/src/adapters/bun/index.js +0 -8
  281. package/src/adapters/bun/runtime-host.d.ts +0 -52
  282. package/src/adapters/bun/runtime-host.js +0 -56
  283. package/src/adapters/bun/server-adapter.d.ts +0 -216
  284. package/src/adapters/bun/server-adapter.js +0 -445
  285. package/src/adapters/bun/static-preview-host.d.ts +0 -28
  286. package/src/adapters/bun/static-preview-host.js +0 -45
  287. package/src/adapters/create-app.d.ts +0 -20
  288. package/src/adapters/create-app.js +0 -66
  289. package/src/adapters/index.d.ts +0 -2
  290. package/src/adapters/index.js +0 -8
  291. package/src/adapters/node/create-app.d.ts +0 -24
  292. package/src/adapters/node/create-app.js +0 -92
  293. package/src/adapters/node/http-request-bridge.d.ts +0 -57
  294. package/src/adapters/node/http-request-bridge.js +0 -118
  295. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  296. package/src/adapters/node/node-client-bridge.js +0 -66
  297. package/src/adapters/node/node-hmr-manager.d.ts +0 -52
  298. package/src/adapters/node/node-hmr-manager.js +0 -49
  299. package/src/adapters/node/runtime-host.d.ts +0 -57
  300. package/src/adapters/node/runtime-host.js +0 -92
  301. package/src/adapters/node/server-adapter-dependencies.d.ts +0 -19
  302. package/src/adapters/node/server-adapter-dependencies.js +0 -18
  303. package/src/adapters/node/server-adapter.d.ts +0 -138
  304. package/src/adapters/node/server-adapter.js +0 -315
  305. package/src/adapters/node/static-content-server.d.ts +0 -60
  306. package/src/adapters/node/static-content-server.js +0 -194
  307. package/src/adapters/node/static-preview-host.d.ts +0 -55
  308. package/src/adapters/node/static-preview-host.js +0 -68
  309. package/src/adapters/shared/api-response.d.ts +0 -52
  310. package/src/adapters/shared/api-response.js +0 -96
  311. package/src/adapters/shared/application-adapter.d.ts +0 -18
  312. package/src/adapters/shared/application-adapter.js +0 -90
  313. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  314. package/src/adapters/shared/define-api-handler.js +0 -15
  315. package/src/adapters/shared/explicit-static-render-preparation.d.ts +0 -25
  316. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  317. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -41
  318. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  319. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -62
  320. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  321. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -23
  322. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  323. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -75
  324. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  325. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  326. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  327. package/src/adapters/shared/hmr-html-response.d.ts +0 -22
  328. package/src/adapters/shared/hmr-html-response.js +0 -33
  329. package/src/adapters/shared/render-context.d.ts +0 -16
  330. package/src/adapters/shared/render-context.js +0 -93
  331. package/src/adapters/shared/runtime-app-bootstrap.d.ts +0 -26
  332. package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
  333. package/src/adapters/shared/runtime-host.d.ts +0 -12
  334. package/src/adapters/shared/runtime-host.js +0 -0
  335. package/src/adapters/shared/server-adapter.d.ts +0 -108
  336. package/src/adapters/shared/server-adapter.js +0 -436
  337. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  338. package/src/adapters/shared/server-route-handler.js +0 -111
  339. package/src/adapters/shared/server-static-builder.d.ts +0 -71
  340. package/src/adapters/shared/server-static-builder.js +0 -100
  341. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  342. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  343. package/src/adapters/shared/static-preview-host.d.ts +0 -10
  344. package/src/adapters/shared/static-preview-host.js +0 -0
  345. package/src/build/browser-runtime-import-rewrite-plugin.d.ts +0 -26
  346. package/src/build/browser-runtime-import-rewrite-plugin.js +0 -165
  347. package/src/build/browser-runtime-manifest.d.ts +0 -31
  348. package/src/build/browser-runtime-manifest.js +0 -61
  349. package/src/build/build-adapter.d.ts +0 -247
  350. package/src/build/build-adapter.js +0 -671
  351. package/src/build/build-manifest.d.ts +0 -33
  352. package/src/build/build-manifest.js +0 -52
  353. package/src/build/build-types.d.ts +0 -57
  354. package/src/build/build-types.js +0 -0
  355. package/src/build/dev-build-coordinator.d.ts +0 -72
  356. package/src/build/dev-build-coordinator.js +0 -154
  357. package/src/build/esbuild-build-adapter.d.ts +0 -79
  358. package/src/build/esbuild-build-adapter.js +0 -521
  359. package/src/build/runtime-build-executor.d.ts +0 -14
  360. package/src/build/runtime-build-executor.js +0 -22
  361. package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
  362. package/src/build/runtime-specifier-alias-plugin.js +0 -31
  363. package/src/config/config-builder.d.ts +0 -252
  364. package/src/config/config-builder.js +0 -598
  365. package/src/config/constants.js +0 -25
  366. package/src/dev/host-runtime.d.ts +0 -10
  367. package/src/dev/host-runtime.js +0 -24
  368. package/src/dev/sc-server.d.ts +0 -30
  369. package/src/dev/sc-server.js +0 -111
  370. package/src/eco/eco.browser.d.ts +0 -2
  371. package/src/eco/eco.browser.js +0 -88
  372. package/src/eco/eco.d.ts +0 -9
  373. package/src/eco/eco.js +0 -119
  374. package/src/eco/eco.types.d.ts +0 -233
  375. package/src/eco/eco.types.js +0 -0
  376. package/src/eco/eco.utils.d.ts +0 -1
  377. package/src/eco/eco.utils.js +0 -10
  378. package/src/eco/global-injector-map.d.ts +0 -16
  379. package/src/eco/global-injector-map.js +0 -80
  380. package/src/eco/lazy-injector-map.d.ts +0 -8
  381. package/src/eco/lazy-injector-map.js +0 -70
  382. package/src/eco/module-dependencies.d.ts +0 -18
  383. package/src/eco/module-dependencies.js +0 -49
  384. package/src/errors/http-error.d.ts +0 -31
  385. package/src/errors/http-error.js +0 -50
  386. package/src/errors/index.d.ts +0 -3
  387. package/src/errors/index.js +0 -6
  388. package/src/errors/locals-access-error.d.ts +0 -4
  389. package/src/errors/locals-access-error.js +0 -9
  390. package/src/global/app-logger.d.ts +0 -2
  391. package/src/global/app-logger.js +0 -6
  392. package/src/hmr/client/hmr-runtime.d.ts +0 -5
  393. package/src/hmr/client/hmr-runtime.js +0 -117
  394. package/src/hmr/hmr-strategy.d.ts +0 -162
  395. package/src/hmr/hmr-strategy.js +0 -44
  396. package/src/hmr/hmr.postcss.test.e2e.d.ts +0 -1
  397. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  398. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  399. package/src/hmr/hmr.test.e2e.js +0 -43
  400. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  401. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  402. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -134
  403. package/src/hmr/strategies/js-hmr-strategy.js +0 -173
  404. package/src/index.browser.d.ts +0 -3
  405. package/src/index.browser.js +0 -4
  406. package/src/index.d.ts +0 -6
  407. package/src/index.js +0 -21
  408. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -16
  409. package/src/integrations/ghtml/ghtml-renderer.js +0 -57
  410. package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
  411. package/src/integrations/ghtml/ghtml.constants.js +0 -4
  412. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
  413. package/src/integrations/ghtml/ghtml.plugin.js +0 -20
  414. package/src/plugins/alias-resolver-plugin.d.ts +0 -3
  415. package/src/plugins/alias-resolver-plugin.js +0 -61
  416. package/src/plugins/eco-component-meta-plugin.d.ts +0 -108
  417. package/src/plugins/eco-component-meta-plugin.js +0 -175
  418. package/src/plugins/foreign-jsx-override-plugin.d.ts +0 -33
  419. package/src/plugins/foreign-jsx-override-plugin.js +0 -41
  420. package/src/plugins/integration-plugin.d.ts +0 -230
  421. package/src/plugins/integration-plugin.js +0 -201
  422. package/src/plugins/processor.d.ts +0 -97
  423. package/src/plugins/processor.js +0 -141
  424. package/src/plugins/runtime-capability.js +0 -0
  425. package/src/plugins/source-transform.d.ts +0 -46
  426. package/src/plugins/source-transform.js +0 -71
  427. package/src/route-renderer/orchestration/component-render-context.d.ts +0 -97
  428. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  429. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  430. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  431. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +0 -110
  432. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -233
  433. package/src/route-renderer/orchestration/integration-renderer.d.ts +0 -534
  434. package/src/route-renderer/orchestration/integration-renderer.js +0 -991
  435. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  436. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  437. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +0 -29
  438. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  439. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +0 -3
  440. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  441. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  442. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  443. package/src/route-renderer/orchestration/render-output.utils.d.ts +0 -66
  444. package/src/route-renderer/orchestration/render-output.utils.js +0 -171
  445. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +0 -156
  446. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  447. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  448. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  449. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +0 -37
  450. package/src/route-renderer/page-loading/component-dependency-collection.js +0 -132
  451. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +0 -24
  452. package/src/route-renderer/page-loading/declared-asset-collection.js +0 -106
  453. package/src/route-renderer/page-loading/dependency-resolver.d.ts +0 -35
  454. package/src/route-renderer/page-loading/dependency-resolver.js +0 -115
  455. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +0 -11
  456. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +0 -57
  457. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +0 -45
  458. package/src/route-renderer/page-loading/lazy-entry-collection.js +0 -105
  459. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +0 -19
  460. package/src/route-renderer/page-loading/lazy-trigger-planning.js +0 -40
  461. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +0 -5
  462. package/src/route-renderer/page-loading/module-declaration-aggregation.js +0 -33
  463. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +0 -3
  464. package/src/route-renderer/page-loading/module-declaration-scripts.js +0 -18
  465. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +0 -13
  466. package/src/route-renderer/page-loading/page-dependency-bundling.js +0 -137
  467. package/src/route-renderer/page-loading/page-module-loader.d.ts +0 -90
  468. package/src/route-renderer/page-loading/page-module-loader.js +0 -127
  469. package/src/route-renderer/route-renderer.d.ts +0 -69
  470. package/src/route-renderer/route-renderer.js +0 -80
  471. package/src/router/client/link-intent.js +0 -34
  472. package/src/router/client/link-intent.test.browser.d.ts +0 -1
  473. package/src/router/client/link-intent.test.browser.js +0 -43
  474. package/src/router/client/navigation-coordinator.d.ts +0 -169
  475. package/src/router/client/navigation-coordinator.js +0 -215
  476. package/src/router/server/route-registry.d.ts +0 -78
  477. package/src/router/server/route-registry.js +0 -262
  478. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +0 -3
  479. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +0 -56
  480. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +0 -103
  481. package/src/services/assets/asset-processing-service/asset-processing.service.js +0 -285
  482. package/src/services/assets/asset-processing-service/asset.factory.d.ts +0 -17
  483. package/src/services/assets/asset-processing-service/asset.factory.js +0 -82
  484. package/src/services/assets/asset-processing-service/assets.types.d.ts +0 -103
  485. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  486. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +0 -57
  487. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +0 -49
  488. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +0 -20
  489. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +0 -41
  490. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +0 -30
  491. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +0 -65
  492. package/src/services/assets/asset-processing-service/index.d.ts +0 -6
  493. package/src/services/assets/asset-processing-service/index.js +0 -6
  494. package/src/services/assets/asset-processing-service/page-package.d.ts +0 -6
  495. package/src/services/assets/asset-processing-service/page-package.js +0 -80
  496. package/src/services/assets/asset-processing-service/processor.interface.js +0 -6
  497. package/src/services/assets/asset-processing-service/processor.registry.d.ts +0 -8
  498. package/src/services/assets/asset-processing-service/processor.registry.js +0 -15
  499. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  500. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +0 -65
  501. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -22
  502. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +0 -136
  503. package/src/services/assets/asset-processing-service/processors/index.d.ts +0 -5
  504. package/src/services/assets/asset-processing-service/processors/index.js +0 -5
  505. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +0 -6
  506. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +0 -120
  507. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -9
  508. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +0 -97
  509. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -42
  510. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +0 -126
  511. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -8
  512. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -59
  513. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  514. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -69
  515. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -18
  516. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +0 -45
  517. package/src/services/assets/browser-bundle.service.d.ts +0 -73
  518. package/src/services/assets/browser-bundle.service.js +0 -41
  519. package/src/services/cache/cache.types.d.ts +0 -107
  520. package/src/services/cache/cache.types.js +0 -0
  521. package/src/services/cache/index.d.ts +0 -7
  522. package/src/services/cache/index.js +0 -7
  523. package/src/services/cache/memory-cache-store.d.ts +0 -42
  524. package/src/services/cache/memory-cache-store.js +0 -98
  525. package/src/services/cache/page-cache-service.d.ts +0 -70
  526. package/src/services/cache/page-cache-service.js +0 -152
  527. package/src/services/cache/page-request-cache-coordinator.service.d.ts +0 -75
  528. package/src/services/cache/page-request-cache-coordinator.service.js +0 -109
  529. package/src/services/html/html-rewriter-provider.service.d.ts +0 -40
  530. package/src/services/html/html-rewriter-provider.service.js +0 -68
  531. package/src/services/html/html-transformer.service.d.ts +0 -96
  532. package/src/services/html/html-transformer.service.js +0 -287
  533. package/src/services/invalidation/development-invalidation.service.d.ts +0 -74
  534. package/src/services/invalidation/development-invalidation.service.js +0 -190
  535. package/src/services/module-loading/app-module-loader.service.d.ts +0 -7
  536. package/src/services/module-loading/app-module-loader.service.js +0 -0
  537. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +0 -24
  538. package/src/services/module-loading/app-server-module-transpiler.service.js +0 -151
  539. package/src/services/module-loading/host-module-loader-registry.d.ts +0 -4
  540. package/src/services/module-loading/host-module-loader-registry.js +0 -15
  541. package/src/services/module-loading/module-loading-types.js +0 -0
  542. package/src/services/module-loading/node-bootstrap-plugin.d.ts +0 -38
  543. package/src/services/module-loading/node-bootstrap-plugin.js +0 -215
  544. package/src/services/module-loading/page-module-import.service.d.ts +0 -95
  545. package/src/services/module-loading/page-module-import.service.js +0 -191
  546. package/src/services/module-loading/server-module-transpiler.service.d.ts +0 -63
  547. package/src/services/module-loading/server-module-transpiler.service.js +0 -64
  548. package/src/services/module-loading/source-module-support.d.ts +0 -5
  549. package/src/services/module-loading/source-module-support.js +0 -8
  550. package/src/services/runtime-state/dev-graph.service.d.ts +0 -118
  551. package/src/services/runtime-state/dev-graph.service.js +0 -162
  552. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +0 -41
  553. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +0 -85
  554. package/src/services/runtime-state/server-invalidation-state.service.d.ts +0 -26
  555. package/src/services/runtime-state/server-invalidation-state.service.js +0 -35
  556. package/src/services/validation/schema-validation-service.d.ts +0 -122
  557. package/src/services/validation/schema-validation-service.js +0 -101
  558. package/src/services/validation/standard-schema.types.js +0 -0
  559. package/src/static-site-generator/static-site-generator.d.ts +0 -104
  560. package/src/static-site-generator/static-site-generator.js +0 -316
  561. package/src/types/internal-types.d.ts +0 -232
  562. package/src/types/internal-types.js +0 -0
  563. package/src/types/public-types.d.ts +0 -1307
  564. package/src/types/public-types.js +0 -0
  565. package/src/utils/deep-merge.d.ts +0 -14
  566. package/src/utils/deep-merge.js +0 -32
  567. package/src/utils/hash.d.ts +0 -1
  568. package/src/utils/hash.js +0 -7
  569. package/src/utils/html-escaping.d.ts +0 -7
  570. package/src/utils/html-escaping.js +0 -6
  571. package/src/utils/html.js +0 -4
  572. package/src/utils/invariant.d.ts +0 -5
  573. package/src/utils/invariant.js +0 -11
  574. package/src/utils/locals-utils.d.ts +0 -15
  575. package/src/utils/locals-utils.js +0 -24
  576. package/src/utils/parse-cli-args.d.ts +0 -27
  577. package/src/utils/parse-cli-args.js +0 -62
  578. package/src/utils/path-utils.module.d.ts +0 -5
  579. package/src/utils/path-utils.module.js +0 -14
  580. package/src/utils/resolve-work-dir.d.ts +0 -11
  581. package/src/utils/resolve-work-dir.js +0 -31
  582. package/src/utils/runtime.d.ts +0 -11
  583. package/src/utils/runtime.js +0 -40
  584. package/src/utils/server-utils.module.d.ts +0 -19
  585. package/src/utils/server-utils.module.js +0 -56
  586. package/src/watchers/project-watcher.d.ts +0 -136
  587. package/src/watchers/project-watcher.js +0 -275
  588. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  589. package/src/watchers/project-watcher.test-helpers.js +0 -52
  590. /package/src/utils/{html.d.ts → html.ts} +0 -0
@@ -0,0 +1,781 @@
1
+ /**
2
+ * Unit tests for the eco namespace API
3
+ */
4
+
5
+ import { describe, expect, test } from 'vitest';
6
+ import { eco } from './eco.ts';
7
+ import type {
8
+ EcoComponent,
9
+ GetMetadataContext,
10
+ HtmlTemplateProps,
11
+ LayoutProps,
12
+ StaticPath,
13
+ } from '../types/public-types.ts';
14
+ import type { EcoPagesAppConfig } from '../types/internal-types.ts';
15
+ import {
16
+ type ForeignChildRuntime,
17
+ getComponentRenderContext,
18
+ runWithComponentRenderContext,
19
+ } from '../route-renderer/orchestration/component-render-context.ts';
20
+
21
+ const mockAppConfig = {} as EcoPagesAppConfig;
22
+
23
+ function createResolvedForeignChildRuntime(targetIntegrations: string[], value: string): ForeignChildRuntime {
24
+ return {
25
+ interceptForeignChild: async ({ targetIntegration }: { targetIntegration?: string }) =>
26
+ targetIntegration !== undefined && targetIntegrations.includes(targetIntegration)
27
+ ? ({ kind: 'resolved', value } as const)
28
+ : ({ kind: 'inline' } as const),
29
+ };
30
+ }
31
+
32
+ describe('eco namespace', () => {
33
+ describe('eco.component()', () => {
34
+ test('should create a component with basic dependencies', () => {
35
+ type Props = { count: number };
36
+ const Counter = eco.component<Props>({
37
+ dependencies: {
38
+ stylesheets: ['./counter.css'],
39
+ scripts: ['./counter.script.ts'],
40
+ },
41
+ render: ({ count }) => `<my-counter count="${count}"></my-counter>`,
42
+ });
43
+
44
+ expect(Counter).toBeDefined();
45
+ expect(typeof Counter).toBe('function');
46
+ expect(Counter.config).toBeDefined();
47
+ expect(Counter.config?.dependencies?.stylesheets).toEqual(['./counter.css']);
48
+ expect(Counter.config?.dependencies?.scripts).toEqual(['./counter.script.ts']);
49
+ });
50
+
51
+ test('should render component without lazy dependencies', () => {
52
+ const Component = eco.component({
53
+ render: () => '<div>Hello</div>',
54
+ });
55
+
56
+ const result = Component({});
57
+ expect(result).toBe('<div>Hello</div>');
58
+ });
59
+
60
+ test('should create component with lazy dependencies', () => {
61
+ const Counter = eco.component({
62
+ dependencies: {
63
+ stylesheets: ['./counter.css'],
64
+ scripts: [{ src: './counter.script.ts', lazy: { 'on:interaction': 'mouseenter,focusin' } }],
65
+ },
66
+ render: () => '<my-counter></my-counter>',
67
+ });
68
+
69
+ expect(Counter.config?.dependencies?.scripts).toEqual([
70
+ { src: './counter.script.ts', lazy: { 'on:interaction': 'mouseenter,focusin' } },
71
+ ]);
72
+ });
73
+
74
+ test('should auto-wrap component with scripts-injector when lazy scripts are resolved', () => {
75
+ const Counter = eco.component({
76
+ dependencies: {
77
+ scripts: [{ src: './counter.script.ts', lazy: { 'on:interaction': 'mouseenter,focusin' } }],
78
+ },
79
+ render: () => '<my-counter></my-counter>',
80
+ });
81
+
82
+ if (Counter.config) {
83
+ Counter.config._resolvedLazyScripts = [
84
+ { lazy: { 'on:interaction': 'mouseenter,focusin' }, scripts: '/_assets/counter.js' },
85
+ ];
86
+ }
87
+
88
+ const result = Counter({});
89
+ expect(result).toContain('<scripts-injector');
90
+ expect(result).toContain('<script type="ecopages/injector-map">');
91
+ expect(result).toContain(
92
+ '"on:interaction":{"value":"mouseenter,focusin","scripts":["/_assets/counter.js"]}',
93
+ );
94
+ expect(result).toContain('<my-counter></my-counter>');
95
+ expect(result).toContain('</scripts-injector>');
96
+ });
97
+
98
+ test('should handle on:idle trigger', () => {
99
+ const Component = eco.component({
100
+ dependencies: {
101
+ scripts: [{ src: './script.ts', lazy: { 'on:idle': true } }],
102
+ },
103
+ render: () => '<div>Content</div>',
104
+ });
105
+
106
+ if (Component.config) {
107
+ Component.config._resolvedLazyScripts = [{ lazy: { 'on:idle': true }, scripts: '/_assets/script.js' }];
108
+ }
109
+
110
+ const result = Component({});
111
+ expect(result).toContain('"on:idle":{"scripts":["/_assets/script.js"]}');
112
+ });
113
+
114
+ test('should handle on:visible trigger with boolean', () => {
115
+ const Component = eco.component({
116
+ dependencies: {
117
+ scripts: [{ src: './script.ts', lazy: { 'on:visible': true } }],
118
+ },
119
+ render: () => '<div>Content</div>',
120
+ });
121
+
122
+ if (Component.config) {
123
+ Component.config._resolvedLazyScripts = [
124
+ { lazy: { 'on:visible': true }, scripts: '/_assets/script.js' },
125
+ ];
126
+ }
127
+
128
+ const result = Component({});
129
+ expect(result).toContain('"on:visible":{"scripts":["/_assets/script.js"]}');
130
+ });
131
+
132
+ test('should handle on:visible trigger with threshold value', () => {
133
+ const Component = eco.component({
134
+ dependencies: {
135
+ scripts: [{ src: './script.ts', lazy: { 'on:visible': '0.5' } }],
136
+ },
137
+ render: () => '<div>Content</div>',
138
+ });
139
+
140
+ if (Component.config) {
141
+ Component.config._resolvedLazyScripts = [
142
+ { lazy: { 'on:visible': '0.5' }, scripts: '/_assets/script.js' },
143
+ ];
144
+ }
145
+
146
+ const result = Component({});
147
+ expect(result).toContain('"on:visible":{"value":"0.5","scripts":["/_assets/script.js"]}');
148
+ });
149
+
150
+ test('should not wrap when lazy script entries exist but _resolvedLazyScripts is not set', () => {
151
+ const Component = eco.component({
152
+ dependencies: {
153
+ scripts: [{ src: './script.ts', lazy: { 'on:interaction': 'mouseenter' } }],
154
+ },
155
+ render: () => '<div>Content</div>',
156
+ });
157
+
158
+ const result = Component({});
159
+ expect(result).toBe('<div>Content</div>');
160
+ expect(result).not.toContain('scripts-injector');
161
+ });
162
+
163
+ test('should pass props to render function', () => {
164
+ type Props = { name: string; count: number };
165
+ const Component = eco.component<Props>({
166
+ render: ({ name, count }) => `<div>${name}: ${count}</div>`,
167
+ });
168
+
169
+ const result = Component({ name: 'Counter', count: 5 });
170
+ expect(result).toBe('<div>Counter: 5</div>');
171
+ });
172
+
173
+ test('should support multiple lazy triggers in dependencies.scripts', () => {
174
+ const Component = eco.component({
175
+ dependencies: {
176
+ scripts: [
177
+ { src: './idle.ts', lazy: { 'on:idle': true } },
178
+ { src: './visible.ts', lazy: { 'on:visible': '0.5' } },
179
+ ],
180
+ },
181
+ render: () => '<section>Content</section>',
182
+ });
183
+
184
+ if (Component.config) {
185
+ Component.config._resolvedLazyScripts = [
186
+ { lazy: { 'on:idle': true }, scripts: '/_assets/idle.js' },
187
+ { lazy: { 'on:visible': '0.5' }, scripts: '/_assets/visible.js' },
188
+ ];
189
+ }
190
+
191
+ const result = Component({});
192
+ expect(result).toContain('"on:idle":{"scripts":["/_assets/idle.js"]}');
193
+ expect(result).toContain('"on:visible":{"value":"0.5","scripts":["/_assets/visible.js"]}');
194
+ expect(result).toContain('<section>Content</section>');
195
+ expect((result.match(/<scripts-injector/g) ?? []).length).toBe(1);
196
+ });
197
+
198
+ test('should set explicit integration on component config', () => {
199
+ const Component = eco.component({
200
+ integration: 'lit',
201
+ render: () => '<div>Content</div>',
202
+ });
203
+
204
+ expect(Component.config?.integration).toBe('lit');
205
+ });
206
+
207
+ test('should render inline when the foreign-child runtime returns inline for a React component', async () => {
208
+ const ReactButton = eco.component({
209
+ integration: 'react',
210
+ __eco: {
211
+ id: 'react-button',
212
+ file: '/app/components/react-button.react.tsx',
213
+ integration: 'react',
214
+ },
215
+ render: () => '<button type="button">Click</button>',
216
+ });
217
+
218
+ const execution = await runWithComponentRenderContext(
219
+ {
220
+ currentIntegration: 'lit',
221
+ },
222
+ async () => ReactButton({}),
223
+ );
224
+
225
+ expect(execution.value).toBe('<button type="button">Click</button>');
226
+ });
227
+
228
+ test('should resolve foreign children immediately when the runtime returns resolved output', async () => {
229
+ const ReactButton = eco.component({
230
+ integration: 'react',
231
+ __eco: {
232
+ id: 'react-button-resolved-runtime',
233
+ file: '/app/components/react-button-resolved-runtime.react.tsx',
234
+ integration: 'react',
235
+ },
236
+ render: () => '<button type="button">Click</button>',
237
+ });
238
+
239
+ const execution = await runWithComponentRenderContext(
240
+ {
241
+ currentIntegration: 'lit',
242
+ foreignChildRuntime: createResolvedForeignChildRuntime(
243
+ ['react'],
244
+ '<aside>Resolved in owning renderer</aside>',
245
+ ),
246
+ },
247
+ async () => ReactButton({}),
248
+ );
249
+
250
+ expect(execution.value).toBe('<aside>Resolved in owning renderer</aside>');
251
+ });
252
+
253
+ test('should render inline with runtime-normalized props', async () => {
254
+ const KitaShell = eco.component<{ children?: string }>({
255
+ integration: 'kitajs',
256
+ __eco: {
257
+ id: 'kitajs-shell-inline-props',
258
+ file: '/app/components/kitajs-shell-inline-props.kita.tsx',
259
+ integration: 'kitajs',
260
+ },
261
+ render: ({ children }) => `<section>${children ?? ''}</section>`,
262
+ });
263
+
264
+ const execution = await runWithComponentRenderContext(
265
+ {
266
+ currentIntegration: 'ecopages-jsx',
267
+ foreignChildRuntime: {
268
+ interceptForeignChild: async ({ targetIntegration, props }) =>
269
+ targetIntegration === 'kitajs'
270
+ ? {
271
+ kind: 'inline',
272
+ props: {
273
+ ...props,
274
+ children: '<span data-serialized="true">Leaf</span>',
275
+ },
276
+ }
277
+ : { kind: 'inline' },
278
+ },
279
+ },
280
+ async () => KitaShell({ children: { nodeType: 1, outerHTML: '<span>Leaf</span>' } as never }),
281
+ );
282
+
283
+ expect(execution.value).toBe('<section><span data-serialized="true">Leaf</span></section>');
284
+ });
285
+
286
+ test('should share render context across duplicated module instances', async () => {
287
+ const duplicateModule = (await import(
288
+ '../route-renderer/orchestration/component-render-context.ts?duplicate-instance' as string
289
+ )) as typeof import('../route-renderer/orchestration/component-render-context.ts');
290
+
291
+ const execution = await runWithComponentRenderContext(
292
+ {
293
+ currentIntegration: 'kitajs',
294
+ },
295
+ async () => {
296
+ expect(getComponentRenderContext()?.currentIntegration).toBe('kitajs');
297
+ expect(duplicateModule.getComponentRenderContext()?.currentIntegration).toBe('kitajs');
298
+ return 'shared-context';
299
+ },
300
+ );
301
+
302
+ expect(execution.value).toBe('shared-context');
303
+ });
304
+
305
+ test('should embed children through a third argument without manual prop merging', () => {
306
+ const Shell = eco.component<{ id: string; children?: string }>({
307
+ render: ({ id, children }) => `<section data-shell="${id}">${children ?? ''}</section>`,
308
+ });
309
+
310
+ const result = eco.embed(Shell, { id: 'kita' }, '<span>Leaf</span>');
311
+
312
+ expect(result).toBe('<section data-shell="kita"><span>Leaf</span></section>');
313
+ });
314
+
315
+ test('should accept foreign child values without constraining the authoring surface to the target children type', () => {
316
+ const Shell = eco.component<{ id: string; children?: string }>({
317
+ render: ({ id, children }) => `<section data-shell="${id}">${children ?? ''}</section>`,
318
+ });
319
+
320
+ const result = eco.embed(Shell, { id: 'kita' }, { foreign: true });
321
+
322
+ expect(result).toBe('<section data-shell="kita">[object Object]</section>');
323
+ });
324
+
325
+ test('should let the foreign-child runtime replace embedded output when the target integration is delegated', async () => {
326
+ const ReactButton = eco.component<{ label: string }>({
327
+ integration: 'react',
328
+ __eco: {
329
+ id: 'react-button-embedded-runtime',
330
+ file: '/app/components/react-button-embedded-runtime.react.tsx',
331
+ integration: 'react',
332
+ },
333
+ render: ({ label }) => `<button type="button">${label}</button>`,
334
+ });
335
+
336
+ const execution = await runWithComponentRenderContext(
337
+ {
338
+ currentIntegration: 'lit',
339
+ foreignChildRuntime: createResolvedForeignChildRuntime(
340
+ ['react'],
341
+ '<aside>Resolved in owning renderer</aside>',
342
+ ),
343
+ },
344
+ async () => eco.embed(ReactButton, { label: 'Click' }),
345
+ );
346
+
347
+ expect(execution.value).toBe('<aside>Resolved in owning renderer</aside>');
348
+ });
349
+
350
+ test('should render embedded component output inline when the foreign-child runtime does not delegate the target integration', async () => {
351
+ const ReactButton = eco.component<{ label: string }>({
352
+ integration: 'react',
353
+ __eco: {
354
+ id: 'react-button-embedded-inline-runtime',
355
+ file: '/app/components/react-button-embedded-inline-runtime.react.tsx',
356
+ integration: 'react',
357
+ },
358
+ render: ({ label }) => `<button type="button">${label}</button>`,
359
+ });
360
+
361
+ const execution = await runWithComponentRenderContext(
362
+ {
363
+ currentIntegration: 'lit',
364
+ foreignChildRuntime: createResolvedForeignChildRuntime(
365
+ ['kitajs'],
366
+ '<aside>Resolved elsewhere</aside>',
367
+ ),
368
+ },
369
+ async () => eco.embed(ReactButton, { label: 'Click' }),
370
+ );
371
+
372
+ expect(execution.value).toBe('<button type="button">Click</button>');
373
+ });
374
+
375
+ test('should surface an eco.embed-specific error when the active integration misses foreign-child handoff', async () => {
376
+ const ReactButton = eco.component<{ label: string }>({
377
+ integration: 'react',
378
+ __eco: {
379
+ id: 'react-button-missing-runtime-handoff',
380
+ file: '/app/components/react-button-missing-runtime-handoff.react.tsx',
381
+ integration: 'react',
382
+ },
383
+ render: ({ label }) => `<button type="button">${label}</button>`,
384
+ });
385
+
386
+ await expect(
387
+ runWithComponentRenderContext(
388
+ {
389
+ currentIntegration: 'lit',
390
+ foreignChildRuntime: {},
391
+ },
392
+ async () => eco.embed(ReactButton, { label: 'Click' }),
393
+ ),
394
+ ).rejects.toThrowError(
395
+ '[ecopages] eco.embed() could not hand off the Foreign Child from lit to react for /app/components/react-button-missing-runtime-handoff.react.tsx.',
396
+ );
397
+ });
398
+ });
399
+
400
+ describe('eco.html()', () => {
401
+ test('should create a document shell component with html props', () => {
402
+ const Html = eco.html({
403
+ render: ({ children, language = 'en' }: HtmlTemplateProps) =>
404
+ `<html lang="${language}"><body>${children}</body></html>`,
405
+ });
406
+
407
+ const result = Html({
408
+ children: '<main>Hello</main>',
409
+ metadata: { title: 'Home', description: 'Welcome' },
410
+ pageProps: {},
411
+ });
412
+
413
+ expect(typeof Html).toBe('function');
414
+ expect(result).toBe('<html lang="en"><body><main>Hello</main></body></html>');
415
+ });
416
+ });
417
+
418
+ describe('eco.layout()', () => {
419
+ test('should create a route layout component with layout props', () => {
420
+ const Layout = eco.layout({
421
+ render: ({ children, locals }: LayoutProps<string>) =>
422
+ `<main data-user="${locals?.user ?? 'guest'}">${children}</main>`,
423
+ });
424
+
425
+ const result = Layout({ children: '<h1>Page</h1>', locals: { user: '123' } });
426
+
427
+ expect(typeof Layout).toBe('function');
428
+ expect(result).toBe('<main data-user="123"><h1>Page</h1></main>');
429
+ });
430
+
431
+ test('should work when used as page layout', () => {
432
+ const Layout = eco.layout<string>({
433
+ render: ({ children }) => `<main>${children}</main>`,
434
+ });
435
+
436
+ const Page = eco.page({
437
+ layout: Layout,
438
+ render: () => '<h1>Page Content</h1>',
439
+ });
440
+
441
+ expect(Page.config?.layout).toBe(Layout);
442
+ expect(Page.config?.dependencies?.components).toContain(Layout);
443
+ });
444
+ });
445
+
446
+ describe('eco.page()', () => {
447
+ test('should create a page without staticProps', () => {
448
+ const Page = eco.page({
449
+ dependencies: {
450
+ components: [],
451
+ },
452
+ render: () => '<h1>Welcome</h1>',
453
+ });
454
+
455
+ expect(Page).toBeDefined();
456
+ expect(typeof Page).toBe('function');
457
+ expect(Page.config).toBeDefined();
458
+ });
459
+
460
+ test('should create a page with typed props', () => {
461
+ type PageProps = { params?: { slug?: string }; query?: Record<string, string> };
462
+ const Page = eco.page<PageProps>({
463
+ render: ({ params }) => `<h1>${params?.slug || 'Home'}</h1>`,
464
+ });
465
+
466
+ const result = Page({ params: { slug: 'test-post' } });
467
+ expect(result).toBe('<h1>test-post</h1>');
468
+ });
469
+
470
+ test('should work with lazy dependencies on pages', () => {
471
+ const Page = eco.page({
472
+ dependencies: {
473
+ scripts: [{ src: './page.script.ts', lazy: { 'on:interaction': 'click' } }],
474
+ },
475
+ render: () => '<div>Page Content</div>',
476
+ });
477
+
478
+ if (Page.config) {
479
+ Page.config._resolvedLazyScripts = [
480
+ { lazy: { 'on:interaction': 'click' }, scripts: '/_assets/page.js' },
481
+ ];
482
+ }
483
+
484
+ const result = Page({});
485
+ expect(result).toContain('<scripts-injector');
486
+ expect(result).toContain('"on:interaction":{"value":"click","scripts":["/_assets/page.js"]}');
487
+ });
488
+
489
+ test('should store layout in config and include in dependencies', async () => {
490
+ const Layout = eco.component<{ children: string }>({
491
+ render: ({ children }) => `<main class="layout">${children}</main>`,
492
+ });
493
+
494
+ const Page = eco.page({
495
+ layout: Layout,
496
+ render: () => '<h1>Page Content</h1>',
497
+ });
498
+
499
+ expect(Page.config?.layout).toBe(Layout);
500
+ expect(Page.config?.dependencies?.components).toContain(Layout);
501
+ const result = await Page({});
502
+ expect(result).toBe('<h1>Page Content</h1>');
503
+ });
504
+
505
+ test('should render raw content (layout wrapping happens at render time)', async () => {
506
+ const Layout = eco.component<{ children: string }>({
507
+ render: ({ children }) => `<main class="layout">${children}</main>`,
508
+ });
509
+
510
+ const Page = eco.page({
511
+ layout: Layout,
512
+ render: async () => {
513
+ await Promise.resolve();
514
+ return '<h1>Async Content</h1>';
515
+ },
516
+ });
517
+
518
+ expect(Page.config?.layout).toBe(Layout);
519
+ const result = await Page({});
520
+ expect(result).toBe('<h1>Async Content</h1>');
521
+ });
522
+
523
+ test('should include layout in dependencies when provided', () => {
524
+ const Layout = eco.component<{ children: string }>({
525
+ dependencies: {
526
+ stylesheets: ['./layout.css'],
527
+ },
528
+ render: ({ children }) => `<main>${children}</main>`,
529
+ });
530
+
531
+ const Page = eco.page({
532
+ layout: Layout,
533
+ dependencies: {
534
+ stylesheets: ['./page.css'],
535
+ },
536
+ render: () => '<h1>Content</h1>',
537
+ });
538
+
539
+ expect(Page.config?.dependencies?.components).toContain(Layout);
540
+ expect(Page.config?.dependencies?.stylesheets).toEqual(['./page.css']);
541
+ });
542
+
543
+ test('should set explicit integration on page config', () => {
544
+ const Page = eco.page({
545
+ integration: 'react',
546
+ render: () => '<h1>Page</h1>',
547
+ });
548
+
549
+ expect(Page.config?.integration).toBe('react');
550
+ });
551
+ });
552
+
553
+ describe('eco.metadata()', () => {
554
+ test('should be an identity function', () => {
555
+ const metadataFn = () => ({
556
+ title: 'Home',
557
+ description: 'Welcome',
558
+ });
559
+
560
+ const wrapped = eco.metadata(metadataFn);
561
+ expect(wrapped).toBe(metadataFn);
562
+ });
563
+
564
+ test('should work with async metadata function', async () => {
565
+ const metadataFn = async () => ({
566
+ title: 'Home',
567
+ description: 'Welcome',
568
+ });
569
+
570
+ const wrapped = eco.metadata(metadataFn);
571
+ const result = await wrapped({ props: {}, params: {}, query: {}, appConfig: mockAppConfig });
572
+ expect(result.title).toBe('Home');
573
+ });
574
+
575
+ test('should work with props-based metadata', () => {
576
+ const metadataFn = async () => ({ title: 'My Post', description: 'Post excerpt' });
577
+ const wrapped = eco.metadata(metadataFn);
578
+ expect(wrapped).toBe(metadataFn);
579
+ });
580
+ });
581
+
582
+ describe('eco.staticPaths()', () => {
583
+ test('should be an identity function', () => {
584
+ const staticPathsFn = async () => ({
585
+ paths: [{ params: { slug: 'post-1' } }, { params: { slug: 'post-2' } }],
586
+ });
587
+
588
+ const wrapped = eco.staticPaths(staticPathsFn);
589
+ expect(wrapped).toBe(staticPathsFn);
590
+ });
591
+
592
+ test('should preserve function behavior', async () => {
593
+ const staticPathsFn = async () => ({
594
+ paths: [{ params: { slug: 'post-1' } }, { params: { slug: 'post-2' } }],
595
+ });
596
+
597
+ const wrapped = eco.staticPaths(staticPathsFn);
598
+ const result = await wrapped({ appConfig: mockAppConfig, runtimeOrigin: '' });
599
+ expect(result.paths).toHaveLength(2);
600
+ expect(result.paths[0].params.slug).toBe('post-1');
601
+ });
602
+ });
603
+
604
+ describe('eco.staticProps()', () => {
605
+ test('should be an identity function', () => {
606
+ const staticPropsFn = async ({ pathname }: any) => ({
607
+ props: { slug: pathname.params.slug },
608
+ });
609
+
610
+ const wrapped = eco.staticProps(staticPropsFn);
611
+ expect(wrapped).toBe(staticPropsFn);
612
+ });
613
+
614
+ test('should preserve function behavior', async () => {
615
+ const staticPropsFn = async ({ pathname }: any) => ({
616
+ props: { post: { title: 'Test Post', slug: pathname.params.slug } },
617
+ });
618
+
619
+ const wrapped = eco.staticProps(staticPropsFn);
620
+ const result = await wrapped({
621
+ pathname: { params: { slug: 'my-post' } },
622
+ appConfig: mockAppConfig,
623
+ runtimeOrigin: '',
624
+ });
625
+ expect(result.props.post.title).toBe('Test Post');
626
+ expect(result.props.post.slug).toBe('my-post');
627
+ });
628
+ });
629
+
630
+ describe('integration', () => {
631
+ test('should work with nested components', () => {
632
+ const Button = eco.component<{ label: string }>({
633
+ dependencies: {
634
+ scripts: [
635
+ {
636
+ src: './button.script.ts',
637
+ lazy: {
638
+ 'on:interaction': 'click',
639
+ },
640
+ },
641
+ ],
642
+ },
643
+ render: ({ label }) => `<button>${label}</button>`,
644
+ });
645
+
646
+ const Card = eco.component<{ title: string; children: string }>({
647
+ dependencies: {
648
+ components: [Button as EcoComponent],
649
+ },
650
+ render: ({ title, children }) => `<div class="card"><h2>${title}</h2>${children}</div>`,
651
+ });
652
+
653
+ expect(Card.config?.dependencies?.components).toContain(Button);
654
+ });
655
+ });
656
+
657
+ test('should attach staticPaths when provided (consolidated API)', () => {
658
+ const staticPathsFn = async () => ({
659
+ paths: [{ params: { slug: 'post-1' } }, { params: { slug: 'post-2' } }],
660
+ });
661
+
662
+ const Page = eco.page({
663
+ staticPaths: staticPathsFn,
664
+ render: () => '<h1>Page</h1>',
665
+ });
666
+
667
+ expect(Page.staticPaths).toBe(staticPathsFn);
668
+ });
669
+
670
+ test('should attach staticProps when provided (consolidated API)', () => {
671
+ type Props = { title: string; slug: string };
672
+
673
+ const staticPropsFn = async ({ pathname }: { pathname: StaticPath }) => ({
674
+ props: { title: 'Test', slug: pathname.params.slug as string },
675
+ });
676
+
677
+ const Page = eco.page<Props>({
678
+ staticProps: staticPropsFn,
679
+ render: ({ title }) => `<h1>${title}</h1>`,
680
+ });
681
+
682
+ expect(Page.staticProps).toBe(staticPropsFn);
683
+ });
684
+
685
+ test('should attach metadata when provided (consolidated API)', () => {
686
+ type Props = { title: string };
687
+
688
+ const metadataFn = ({ props: { title } }: GetMetadataContext<Props>) => ({
689
+ title,
690
+ description: `Page: ${title}`,
691
+ });
692
+
693
+ const Page = eco.page<Props>({
694
+ metadata: metadataFn,
695
+ render: ({ title }) => `<h1>${title}</h1>`,
696
+ });
697
+
698
+ expect(Page.metadata).toBe(metadataFn);
699
+ });
700
+
701
+ test('should attach all static functions together (consolidated API)', async () => {
702
+ type Props = { title: string; slug: string };
703
+
704
+ const Page = eco.page<Props>({
705
+ staticPaths: async () => ({
706
+ paths: [{ params: { slug: 'hello' } }],
707
+ }),
708
+ staticProps: async ({ pathname }) => ({
709
+ props: { title: 'Hello World', slug: pathname.params.slug as string },
710
+ }),
711
+ metadata: ({ props: { title } }) => ({
712
+ title,
713
+ description: `Page: ${title}`,
714
+ }),
715
+ render: ({ title }) => `<h1>${title}</h1>`,
716
+ });
717
+
718
+ expect(Page.staticPaths).toBeDefined();
719
+ expect(Page.staticProps).toBeDefined();
720
+ expect(Page.metadata).toBeDefined();
721
+
722
+ // Verify they work correctly
723
+ const paths = await Page.staticPaths!({ appConfig: mockAppConfig, runtimeOrigin: '' });
724
+ expect(paths.paths).toHaveLength(1);
725
+
726
+ const props = await Page.staticProps!({
727
+ pathname: { params: { slug: 'hello' } },
728
+ appConfig: mockAppConfig,
729
+ runtimeOrigin: '',
730
+ });
731
+ expect(props.props.title).toBe('Hello World');
732
+
733
+ const result = Page({ title: 'Hello World', slug: 'hello' });
734
+ expect(result).toBe('<h1>Hello World</h1>');
735
+ });
736
+
737
+ test('should not have static functions when not provided', () => {
738
+ const Page = eco.page({
739
+ render: () => '<h1>Simple Page</h1>',
740
+ });
741
+
742
+ expect(Page.staticPaths).toBeUndefined();
743
+ expect(Page.staticProps).toBeUndefined();
744
+ expect(Page.metadata).toBeUndefined();
745
+ });
746
+
747
+ test('should attach cache strategy "static" when provided', () => {
748
+ const Page = eco.page({
749
+ cache: 'static',
750
+ render: () => '<h1>Static Page</h1>',
751
+ });
752
+
753
+ expect(Page.cache).toBe('static');
754
+ });
755
+
756
+ test('should attach cache strategy "dynamic" when provided', () => {
757
+ const Page = eco.page({
758
+ cache: 'dynamic',
759
+ render: () => '<h1>Dynamic Page</h1>',
760
+ });
761
+
762
+ expect(Page.cache).toBe('dynamic');
763
+ });
764
+
765
+ test('should attach cache strategy with revalidation when provided', () => {
766
+ const Page = eco.page({
767
+ cache: { revalidate: 3600, tags: ['blog'] },
768
+ render: () => '<h1>Blog Page</h1>',
769
+ });
770
+
771
+ expect(Page.cache).toEqual({ revalidate: 3600, tags: ['blog'] });
772
+ });
773
+
774
+ test('should not have cache when not provided', () => {
775
+ const Page = eco.page({
776
+ render: () => '<h1>Page Without Cache</h1>',
777
+ });
778
+
779
+ expect(Page.cache).toBeUndefined();
780
+ });
781
+ });