@ecopages/core 0.2.0-alpha.27 → 0.2.0-alpha.28

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 (546) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/package.json +162 -72
  3. package/src/adapters/abstract/application-adapter.d.ts +194 -0
  4. package/src/adapters/abstract/application-adapter.js +121 -0
  5. package/src/adapters/abstract/router-adapter.d.ts +26 -0
  6. package/src/adapters/abstract/router-adapter.js +5 -0
  7. package/src/adapters/abstract/server-adapter.d.ts +69 -0
  8. package/src/adapters/abstract/server-adapter.js +15 -0
  9. package/src/adapters/bun/client-bridge.d.ts +34 -0
  10. package/src/adapters/bun/client-bridge.js +48 -0
  11. package/src/adapters/bun/create-app.d.ts +53 -0
  12. package/src/adapters/bun/create-app.js +153 -0
  13. package/src/adapters/bun/hmr-manager.d.ts +131 -0
  14. package/src/adapters/bun/hmr-manager.js +312 -0
  15. package/src/adapters/bun/index.d.ts +2 -0
  16. package/src/adapters/bun/index.js +8 -0
  17. package/src/adapters/bun/server-adapter.d.ts +155 -0
  18. package/src/adapters/bun/server-adapter.js +393 -0
  19. package/src/adapters/bun/server-lifecycle.d.ts +63 -0
  20. package/src/adapters/bun/server-lifecycle.js +92 -0
  21. package/src/adapters/create-app.d.ts +20 -0
  22. package/src/adapters/create-app.js +66 -0
  23. package/src/adapters/index.d.ts +2 -0
  24. package/src/adapters/index.js +8 -0
  25. package/src/adapters/node/create-app.d.ts +18 -0
  26. package/src/adapters/node/create-app.js +149 -0
  27. package/src/adapters/node/node-client-bridge.d.ts +26 -0
  28. package/src/adapters/node/node-client-bridge.js +66 -0
  29. package/src/adapters/node/node-hmr-manager.d.ts +121 -0
  30. package/src/adapters/node/node-hmr-manager.js +290 -0
  31. package/src/adapters/node/server-adapter.d.ts +162 -0
  32. package/src/adapters/node/server-adapter.js +368 -0
  33. package/src/adapters/node/static-content-server.d.ts +60 -0
  34. package/src/adapters/node/static-content-server.js +194 -0
  35. package/src/adapters/shared/api-response.d.ts +52 -0
  36. package/src/adapters/shared/api-response.js +96 -0
  37. package/src/adapters/shared/application-adapter.d.ts +18 -0
  38. package/src/adapters/shared/application-adapter.js +90 -0
  39. package/src/adapters/shared/define-api-handler.d.ts +25 -0
  40. package/src/adapters/shared/define-api-handler.js +15 -0
  41. package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
  42. package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
  43. package/src/adapters/shared/explicit-static-route-matcher.d.ts +41 -0
  44. package/src/adapters/shared/explicit-static-route-matcher.js +101 -0
  45. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +62 -0
  46. package/src/adapters/shared/file-route-middleware-pipeline.js +90 -0
  47. package/src/adapters/shared/fs-server-response-factory.d.ts +23 -0
  48. package/src/adapters/shared/fs-server-response-factory.js +81 -0
  49. package/src/adapters/shared/fs-server-response-matcher.d.ts +75 -0
  50. package/src/adapters/shared/fs-server-response-matcher.js +186 -0
  51. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  52. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  53. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  54. package/src/adapters/shared/hmr-html-response.js +32 -0
  55. package/src/adapters/shared/render-context.d.ts +15 -0
  56. package/src/adapters/shared/render-context.js +72 -0
  57. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  58. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  59. package/src/adapters/shared/server-adapter.d.ts +108 -0
  60. package/src/adapters/shared/server-adapter.js +429 -0
  61. package/src/adapters/shared/server-route-handler.d.ts +89 -0
  62. package/src/adapters/shared/server-route-handler.js +111 -0
  63. package/src/adapters/shared/server-static-builder.d.ts +71 -0
  64. package/src/adapters/shared/server-static-builder.js +100 -0
  65. package/src/build/build-adapter.d.ts +239 -0
  66. package/src/build/build-adapter.js +642 -0
  67. package/src/build/build-manifest.d.ts +27 -0
  68. package/src/build/build-manifest.js +30 -0
  69. package/src/build/build-types.d.ts +57 -0
  70. package/src/build/build-types.js +0 -0
  71. package/src/build/dev-build-coordinator.d.ts +72 -0
  72. package/src/build/dev-build-coordinator.js +154 -0
  73. package/src/build/esbuild-build-adapter.d.ts +78 -0
  74. package/src/build/esbuild-build-adapter.js +505 -0
  75. package/src/build/runtime-build-executor.d.ts +14 -0
  76. package/src/build/runtime-build-executor.js +22 -0
  77. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  78. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  79. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  80. package/src/build/runtime-specifier-aliases.js +95 -0
  81. package/src/config/config-builder.d.ts +252 -0
  82. package/src/config/config-builder.js +598 -0
  83. package/src/config/{constants.ts → constants.d.ts} +13 -22
  84. package/src/config/constants.js +25 -0
  85. package/src/dev/host-runtime.d.ts +10 -0
  86. package/src/dev/host-runtime.js +24 -0
  87. package/src/dev/sc-server.d.ts +30 -0
  88. package/src/dev/sc-server.js +111 -0
  89. package/src/eco/eco.browser.d.ts +2 -0
  90. package/src/eco/eco.browser.js +83 -0
  91. package/src/eco/eco.d.ts +9 -0
  92. package/src/eco/eco.js +85 -0
  93. package/src/eco/eco.types.d.ts +178 -0
  94. package/src/eco/eco.types.js +0 -0
  95. package/src/eco/eco.utils.d.ts +1 -0
  96. package/src/eco/eco.utils.js +10 -0
  97. package/src/eco/global-injector-map.d.ts +16 -0
  98. package/src/eco/global-injector-map.js +80 -0
  99. package/src/eco/lazy-injector-map.d.ts +8 -0
  100. package/src/eco/lazy-injector-map.js +70 -0
  101. package/src/eco/module-dependencies.d.ts +18 -0
  102. package/src/eco/module-dependencies.js +49 -0
  103. package/src/errors/http-error.d.ts +31 -0
  104. package/src/errors/http-error.js +50 -0
  105. package/src/errors/index.d.ts +3 -0
  106. package/src/errors/index.js +6 -0
  107. package/src/errors/locals-access-error.d.ts +4 -0
  108. package/src/errors/locals-access-error.js +9 -0
  109. package/src/global/app-logger.d.ts +2 -0
  110. package/src/global/app-logger.js +6 -0
  111. package/src/hmr/client/hmr-runtime.d.ts +5 -0
  112. package/src/hmr/client/hmr-runtime.js +117 -0
  113. package/src/hmr/hmr-strategy.d.ts +162 -0
  114. package/src/hmr/hmr-strategy.js +44 -0
  115. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  116. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  117. package/src/hmr/hmr.test.e2e.d.ts +1 -0
  118. package/src/hmr/hmr.test.e2e.js +43 -0
  119. package/src/hmr/strategies/default-hmr-strategy.d.ts +43 -0
  120. package/src/hmr/strategies/default-hmr-strategy.js +34 -0
  121. package/src/hmr/strategies/js-hmr-strategy.d.ts +134 -0
  122. package/src/hmr/strategies/js-hmr-strategy.js +178 -0
  123. package/src/index.browser.d.ts +3 -0
  124. package/src/index.browser.js +4 -0
  125. package/src/index.d.ts +6 -0
  126. package/src/index.js +21 -0
  127. package/src/integrations/ghtml/ghtml-renderer.d.ts +16 -0
  128. package/src/integrations/ghtml/ghtml-renderer.js +57 -0
  129. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  130. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  131. package/src/integrations/ghtml/ghtml.plugin.d.ts +16 -0
  132. package/src/integrations/ghtml/ghtml.plugin.js +20 -0
  133. package/src/plugins/alias-resolver-plugin.d.ts +2 -0
  134. package/src/plugins/alias-resolver-plugin.js +53 -0
  135. package/src/plugins/eco-component-meta-plugin.d.ts +108 -0
  136. package/src/plugins/eco-component-meta-plugin.js +162 -0
  137. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  138. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  139. package/src/plugins/integration-plugin.d.ts +215 -0
  140. package/src/plugins/integration-plugin.js +189 -0
  141. package/src/plugins/processor.d.ts +97 -0
  142. package/src/plugins/processor.js +141 -0
  143. package/src/plugins/{runtime-capability.ts → runtime-capability.d.ts} +3 -8
  144. package/src/plugins/runtime-capability.js +0 -0
  145. package/src/plugins/source-transform.d.ts +46 -0
  146. package/src/plugins/source-transform.js +71 -0
  147. package/src/route-renderer/orchestration/component-render-context.d.ts +89 -0
  148. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  149. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
  150. package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
  151. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +108 -0
  152. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +206 -0
  153. package/src/route-renderer/orchestration/integration-renderer.d.ts +516 -0
  154. package/src/route-renderer/orchestration/integration-renderer.js +909 -0
  155. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
  156. package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
  157. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
  158. package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
  159. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +2 -0
  160. package/src/route-renderer/orchestration/processed-asset-dedupe.js +23 -0
  161. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +90 -0
  162. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +158 -0
  163. package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
  164. package/src/route-renderer/orchestration/render-output.utils.js +171 -0
  165. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +120 -0
  166. package/src/route-renderer/orchestration/route-render-orchestrator.js +388 -0
  167. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  168. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  169. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
  170. package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
  171. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
  172. package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
  173. package/src/route-renderer/page-loading/dependency-resolver.d.ts +35 -0
  174. package/src/route-renderer/page-loading/dependency-resolver.js +115 -0
  175. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
  176. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
  177. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
  178. package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
  179. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
  180. package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
  181. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
  182. package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
  183. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
  184. package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
  185. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
  186. package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
  187. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  188. package/src/route-renderer/page-loading/page-module-loader.js +127 -0
  189. package/src/route-renderer/route-renderer.d.ts +69 -0
  190. package/src/route-renderer/route-renderer.js +80 -0
  191. package/src/router/client/link-intent.js +34 -0
  192. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  193. package/src/router/client/link-intent.test.browser.js +43 -0
  194. package/src/router/client/navigation-coordinator.d.ts +169 -0
  195. package/src/router/client/navigation-coordinator.js +215 -0
  196. package/src/router/server/route-registry.d.ts +78 -0
  197. package/src/router/server/route-registry.js +262 -0
  198. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  199. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  200. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
  201. package/src/services/assets/asset-processing-service/asset-processing.service.js +285 -0
  202. package/src/services/assets/asset-processing-service/asset.factory.d.ts +17 -0
  203. package/src/services/assets/asset-processing-service/asset.factory.js +82 -0
  204. package/src/services/assets/asset-processing-service/assets.types.d.ts +103 -0
  205. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  206. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  207. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
  208. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  209. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  210. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
  211. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
  212. package/src/services/assets/asset-processing-service/index.d.ts +6 -0
  213. package/src/services/assets/asset-processing-service/index.js +6 -0
  214. package/src/services/assets/asset-processing-service/page-package.d.ts +3 -0
  215. package/src/services/assets/asset-processing-service/page-package.js +74 -0
  216. package/src/services/assets/asset-processing-service/{processor.interface.ts → processor.interface.d.ts} +5 -10
  217. package/src/services/assets/asset-processing-service/processor.interface.js +6 -0
  218. package/src/services/assets/asset-processing-service/processor.registry.d.ts +8 -0
  219. package/src/services/assets/asset-processing-service/processor.registry.js +15 -0
  220. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +24 -0
  221. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +65 -0
  222. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
  223. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
  224. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  225. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  226. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +6 -0
  227. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +119 -0
  228. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +9 -0
  229. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +97 -0
  230. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +7 -0
  231. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +79 -0
  232. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +8 -0
  233. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +59 -0
  234. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +9 -0
  235. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +69 -0
  236. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
  237. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
  238. package/src/services/assets/browser-bundle.service.d.ts +73 -0
  239. package/src/services/assets/browser-bundle.service.js +41 -0
  240. package/src/services/cache/cache.types.d.ts +107 -0
  241. package/src/services/cache/cache.types.js +0 -0
  242. package/src/services/cache/index.d.ts +7 -0
  243. package/src/services/cache/index.js +7 -0
  244. package/src/services/cache/memory-cache-store.d.ts +42 -0
  245. package/src/services/cache/memory-cache-store.js +98 -0
  246. package/src/services/cache/page-cache-service.d.ts +70 -0
  247. package/src/services/cache/page-cache-service.js +152 -0
  248. package/src/services/cache/page-request-cache-coordinator.service.d.ts +75 -0
  249. package/src/services/cache/page-request-cache-coordinator.service.js +109 -0
  250. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  251. package/src/services/html/html-rewriter-provider.service.js +68 -0
  252. package/src/services/html/html-transformer.service.d.ts +87 -0
  253. package/src/services/html/html-transformer.service.js +216 -0
  254. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  255. package/src/services/invalidation/development-invalidation.service.js +190 -0
  256. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  257. package/src/services/module-loading/app-module-loader.service.js +0 -0
  258. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  259. package/src/services/module-loading/app-server-module-transpiler.service.js +115 -0
  260. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  261. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  262. package/src/services/module-loading/{module-loading-types.ts → module-loading-types.d.ts} +0 -1
  263. package/src/services/module-loading/module-loading-types.js +0 -0
  264. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  265. package/src/services/module-loading/node-bootstrap-plugin.js +216 -0
  266. package/src/services/module-loading/page-module-import.service.d.ts +76 -0
  267. package/src/services/module-loading/page-module-import.service.js +170 -0
  268. package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
  269. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  270. package/src/services/module-loading/source-module-support.d.ts +5 -0
  271. package/src/services/module-loading/source-module-support.js +8 -0
  272. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  273. package/src/services/runtime-state/dev-graph.service.js +162 -0
  274. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  275. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  276. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  277. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  278. package/src/services/validation/schema-validation-service.d.ts +122 -0
  279. package/src/services/validation/schema-validation-service.js +101 -0
  280. package/src/services/validation/{standard-schema.types.ts → standard-schema.types.d.ts} +17 -20
  281. package/src/services/validation/standard-schema.types.js +0 -0
  282. package/src/static-site-generator/static-site-generator.d.ts +104 -0
  283. package/src/static-site-generator/static-site-generator.js +316 -0
  284. package/src/types/internal-types.d.ts +232 -0
  285. package/src/types/internal-types.js +0 -0
  286. package/src/types/public-types.d.ts +1267 -0
  287. package/src/types/public-types.js +0 -0
  288. package/src/utils/deep-merge.d.ts +14 -0
  289. package/src/utils/deep-merge.js +32 -0
  290. package/src/utils/hash.d.ts +1 -0
  291. package/src/utils/hash.js +7 -0
  292. package/src/utils/html-escaping.d.ts +7 -0
  293. package/src/utils/html-escaping.js +6 -0
  294. package/src/utils/html.js +4 -0
  295. package/src/utils/invariant.d.ts +5 -0
  296. package/src/utils/invariant.js +11 -0
  297. package/src/utils/locals-utils.d.ts +15 -0
  298. package/src/utils/locals-utils.js +24 -0
  299. package/src/utils/parse-cli-args.d.ts +27 -0
  300. package/src/utils/parse-cli-args.js +62 -0
  301. package/src/utils/path-utils.module.d.ts +5 -0
  302. package/src/utils/path-utils.module.js +14 -0
  303. package/src/utils/resolve-work-dir.d.ts +11 -0
  304. package/src/utils/resolve-work-dir.js +31 -0
  305. package/src/utils/runtime.d.ts +11 -0
  306. package/src/utils/runtime.js +40 -0
  307. package/src/utils/server-utils.module.d.ts +19 -0
  308. package/src/utils/server-utils.module.js +56 -0
  309. package/src/watchers/project-watcher.d.ts +136 -0
  310. package/src/watchers/project-watcher.js +275 -0
  311. package/src/watchers/project-watcher.test-helpers.d.ts +4 -0
  312. package/src/watchers/project-watcher.test-helpers.js +52 -0
  313. package/src/adapters/abstract/application-adapter.test.ts +0 -172
  314. package/src/adapters/abstract/application-adapter.ts +0 -379
  315. package/src/adapters/abstract/router-adapter.ts +0 -30
  316. package/src/adapters/abstract/server-adapter.ts +0 -79
  317. package/src/adapters/bun/client-bridge.ts +0 -62
  318. package/src/adapters/bun/create-app.ts +0 -232
  319. package/src/adapters/bun/hmr-manager.test.ts +0 -265
  320. package/src/adapters/bun/hmr-manager.ts +0 -383
  321. package/src/adapters/bun/index.ts +0 -2
  322. package/src/adapters/bun/server-adapter.ts +0 -526
  323. package/src/adapters/bun/server-lifecycle.ts +0 -124
  324. package/src/adapters/create-app.test.ts +0 -10
  325. package/src/adapters/create-app.ts +0 -91
  326. package/src/adapters/index.ts +0 -2
  327. package/src/adapters/node/create-app.test.ts +0 -53
  328. package/src/adapters/node/create-app.ts +0 -183
  329. package/src/adapters/node/node-client-bridge.test.ts +0 -198
  330. package/src/adapters/node/node-client-bridge.ts +0 -79
  331. package/src/adapters/node/node-hmr-manager.test.ts +0 -320
  332. package/src/adapters/node/node-hmr-manager.ts +0 -355
  333. package/src/adapters/node/server-adapter.ts +0 -502
  334. package/src/adapters/node/static-content-server.test.ts +0 -60
  335. package/src/adapters/node/static-content-server.ts +0 -239
  336. package/src/adapters/shared/api-response.test.ts +0 -97
  337. package/src/adapters/shared/api-response.ts +0 -104
  338. package/src/adapters/shared/application-adapter.ts +0 -199
  339. package/src/adapters/shared/define-api-handler.ts +0 -66
  340. package/src/adapters/shared/explicit-static-render-preparation.ts +0 -58
  341. package/src/adapters/shared/explicit-static-route-matcher.test.ts +0 -381
  342. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -131
  343. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +0 -85
  344. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -118
  345. package/src/adapters/shared/fs-server-response-factory.test.ts +0 -176
  346. package/src/adapters/shared/fs-server-response-factory.ts +0 -96
  347. package/src/adapters/shared/fs-server-response-matcher.test.ts +0 -311
  348. package/src/adapters/shared/fs-server-response-matcher.ts +0 -240
  349. package/src/adapters/shared/hmr-entrypoint-registrar.ts +0 -149
  350. package/src/adapters/shared/hmr-html-response.ts +0 -52
  351. package/src/adapters/shared/hmr-manager.contract.test.ts +0 -228
  352. package/src/adapters/shared/hmr-manager.dispatch.test.ts +0 -220
  353. package/src/adapters/shared/render-context.test.ts +0 -150
  354. package/src/adapters/shared/render-context.ts +0 -123
  355. package/src/adapters/shared/runtime-bootstrap.ts +0 -79
  356. package/src/adapters/shared/server-adapter.test.ts +0 -130
  357. package/src/adapters/shared/server-adapter.ts +0 -562
  358. package/src/adapters/shared/server-route-handler.test.ts +0 -111
  359. package/src/adapters/shared/server-route-handler.ts +0 -153
  360. package/src/adapters/shared/server-static-builder.test.ts +0 -338
  361. package/src/adapters/shared/server-static-builder.ts +0 -170
  362. package/src/build/build-adapter-serialization.test.ts +0 -281
  363. package/src/build/build-adapter.test.ts +0 -1240
  364. package/src/build/build-adapter.ts +0 -1012
  365. package/src/build/build-manifest.ts +0 -54
  366. package/src/build/build-types.ts +0 -83
  367. package/src/build/dev-build-coordinator.ts +0 -220
  368. package/src/build/esbuild-build-adapter.ts +0 -660
  369. package/src/build/runtime-build-executor.test.ts +0 -81
  370. package/src/build/runtime-build-executor.ts +0 -40
  371. package/src/build/runtime-specifier-alias-plugin.test.ts +0 -67
  372. package/src/build/runtime-specifier-alias-plugin.ts +0 -62
  373. package/src/build/runtime-specifier-aliases.ts +0 -135
  374. package/src/config/config-builder.test.ts +0 -442
  375. package/src/config/config-builder.ts +0 -737
  376. package/src/config/config-builder.typecheck.test.ts +0 -96
  377. package/src/dev/host-runtime.ts +0 -34
  378. package/src/dev/sc-server.ts +0 -143
  379. package/src/eco/eco.browser.test.ts +0 -43
  380. package/src/eco/eco.browser.ts +0 -118
  381. package/src/eco/eco.test.ts +0 -654
  382. package/src/eco/eco.ts +0 -205
  383. package/src/eco/eco.types.ts +0 -221
  384. package/src/eco/eco.utils.test.ts +0 -219
  385. package/src/eco/eco.utils.ts +0 -5
  386. package/src/eco/global-injector-map.test.ts +0 -42
  387. package/src/eco/global-injector-map.ts +0 -112
  388. package/src/eco/lazy-injector-map.test.ts +0 -66
  389. package/src/eco/lazy-injector-map.ts +0 -120
  390. package/src/eco/module-dependencies.test.ts +0 -30
  391. package/src/eco/module-dependencies.ts +0 -75
  392. package/src/errors/http-error.test.ts +0 -134
  393. package/src/errors/http-error.ts +0 -72
  394. package/src/errors/index.ts +0 -3
  395. package/src/errors/locals-access-error.ts +0 -7
  396. package/src/global/app-logger.ts +0 -4
  397. package/src/global/utils.test.ts +0 -12
  398. 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
  399. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  400. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  401. package/src/hmr/client/hmr-runtime.ts +0 -162
  402. package/src/hmr/hmr-strategy.test.ts +0 -124
  403. package/src/hmr/hmr-strategy.ts +0 -177
  404. package/src/hmr/hmr.postcss.test.e2e.ts +0 -41
  405. package/src/hmr/hmr.test.e2e.ts +0 -66
  406. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  407. package/src/hmr/strategies/js-hmr-strategy.test.ts +0 -334
  408. package/src/hmr/strategies/js-hmr-strategy.ts +0 -314
  409. package/src/index.browser.ts +0 -3
  410. package/src/index.ts +0 -15
  411. package/src/integrations/ghtml/ghtml-renderer.test.ts +0 -253
  412. package/src/integrations/ghtml/ghtml-renderer.ts +0 -87
  413. package/src/integrations/ghtml/ghtml.constants.ts +0 -1
  414. package/src/integrations/ghtml/ghtml.plugin.ts +0 -28
  415. package/src/plugins/alias-resolver-plugin.test.ts +0 -41
  416. package/src/plugins/alias-resolver-plugin.ts +0 -63
  417. package/src/plugins/eco-component-meta-plugin.test.ts +0 -406
  418. package/src/plugins/eco-component-meta-plugin.ts +0 -494
  419. package/src/plugins/foreign-jsx-override-plugin.test.ts +0 -65
  420. package/src/plugins/foreign-jsx-override-plugin.ts +0 -67
  421. package/src/plugins/integration-plugin.test.ts +0 -151
  422. package/src/plugins/integration-plugin.ts +0 -323
  423. package/src/plugins/processor.test.ts +0 -148
  424. package/src/plugins/processor.ts +0 -257
  425. package/src/plugins/source-transform.test.ts +0 -82
  426. package/src/plugins/source-transform.ts +0 -123
  427. package/src/route-renderer/orchestration/component-render-context.ts +0 -325
  428. package/src/route-renderer/orchestration/declared-ownership-graph.ts +0 -62
  429. package/src/route-renderer/orchestration/foreign-subtree-execution.service.ts +0 -383
  430. package/src/route-renderer/orchestration/integration-renderer.test.ts +0 -2085
  431. package/src/route-renderer/orchestration/integration-renderer.ts +0 -1244
  432. package/src/route-renderer/orchestration/ownership-planning.service.ts +0 -97
  433. package/src/route-renderer/orchestration/ownership-validation.service.ts +0 -76
  434. package/src/route-renderer/orchestration/processed-asset-dedupe.ts +0 -25
  435. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.test.ts +0 -324
  436. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.ts +0 -294
  437. package/src/route-renderer/orchestration/render-output.utils.ts +0 -310
  438. package/src/route-renderer/orchestration/route-render-orchestrator.prepare-render-options.test.ts +0 -644
  439. package/src/route-renderer/orchestration/route-render-orchestrator.test.ts +0 -265
  440. package/src/route-renderer/orchestration/route-render-orchestrator.ts +0 -592
  441. package/src/route-renderer/orchestration/template-serialization.test.ts +0 -110
  442. package/src/route-renderer/orchestration/template-serialization.ts +0 -117
  443. package/src/route-renderer/page-loading/component-dependency-collection.ts +0 -202
  444. package/src/route-renderer/page-loading/declared-asset-collection.ts +0 -153
  445. package/src/route-renderer/page-loading/dependency-resolver.test.ts +0 -761
  446. package/src/route-renderer/page-loading/dependency-resolver.ts +0 -144
  447. package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +0 -75
  448. package/src/route-renderer/page-loading/lazy-entry-collection.ts +0 -167
  449. package/src/route-renderer/page-loading/lazy-trigger-planning.ts +0 -74
  450. package/src/route-renderer/page-loading/module-declaration-aggregation.ts +0 -60
  451. package/src/route-renderer/page-loading/module-declaration-scripts.ts +0 -16
  452. package/src/route-renderer/page-loading/page-dependency-bundling.ts +0 -244
  453. package/src/route-renderer/page-loading/page-module-loader.test.ts +0 -183
  454. package/src/route-renderer/page-loading/page-module-loader.ts +0 -184
  455. package/src/route-renderer/route-renderer.ts +0 -133
  456. package/src/router/client/link-intent.test.browser.ts +0 -51
  457. package/src/router/client/link-intent.ts +0 -92
  458. package/src/router/client/navigation-coordinator.test.ts +0 -237
  459. package/src/router/client/navigation-coordinator.ts +0 -453
  460. package/src/router/server/route-registry.test.ts +0 -176
  461. package/src/router/server/route-registry.ts +0 -382
  462. package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +0 -66
  463. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +0 -473
  464. package/src/services/assets/asset-processing-service/asset-processing.service.ts +0 -344
  465. package/src/services/assets/asset-processing-service/asset.factory.test.ts +0 -63
  466. package/src/services/assets/asset-processing-service/asset.factory.ts +0 -105
  467. package/src/services/assets/asset-processing-service/assets.types.ts +0 -128
  468. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +0 -74
  469. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +0 -96
  470. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +0 -67
  471. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +0 -78
  472. package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +0 -104
  473. package/src/services/assets/asset-processing-service/index.ts +0 -6
  474. package/src/services/assets/asset-processing-service/page-package.test.ts +0 -100
  475. package/src/services/assets/asset-processing-service/page-package.ts +0 -93
  476. package/src/services/assets/asset-processing-service/processor.registry.ts +0 -18
  477. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +0 -59
  478. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +0 -83
  479. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +0 -173
  480. package/src/services/assets/asset-processing-service/processors/index.ts +0 -5
  481. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +0 -195
  482. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +0 -137
  483. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +0 -326
  484. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +0 -116
  485. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +0 -227
  486. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +0 -89
  487. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +0 -261
  488. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -72
  489. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -83
  490. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +0 -65
  491. package/src/services/assets/browser-bundle.service.test.ts +0 -66
  492. package/src/services/assets/browser-bundle.service.ts +0 -109
  493. package/src/services/cache/cache.types.ts +0 -126
  494. package/src/services/cache/index.ts +0 -18
  495. package/src/services/cache/memory-cache-store.test.ts +0 -225
  496. package/src/services/cache/memory-cache-store.ts +0 -130
  497. package/src/services/cache/page-cache-service.test.ts +0 -175
  498. package/src/services/cache/page-cache-service.ts +0 -202
  499. package/src/services/cache/page-request-cache-coordinator.service.test.ts +0 -79
  500. package/src/services/cache/page-request-cache-coordinator.service.ts +0 -131
  501. package/src/services/html/html-rewriter-provider.service.test.ts +0 -183
  502. package/src/services/html/html-rewriter-provider.service.ts +0 -104
  503. package/src/services/html/html-transformer.service.test.ts +0 -476
  504. package/src/services/html/html-transformer.service.ts +0 -275
  505. package/src/services/invalidation/development-invalidation.service.test.ts +0 -87
  506. package/src/services/invalidation/development-invalidation.service.ts +0 -262
  507. package/src/services/module-loading/app-module-loader.service.ts +0 -9
  508. package/src/services/module-loading/app-server-module-transpiler.service.test.ts +0 -130
  509. package/src/services/module-loading/app-server-module-transpiler.service.ts +0 -141
  510. package/src/services/module-loading/host-module-loader-registry.ts +0 -15
  511. package/src/services/module-loading/node-bootstrap-plugin.test.ts +0 -335
  512. package/src/services/module-loading/node-bootstrap-plugin.ts +0 -311
  513. package/src/services/module-loading/page-module-import.service.test.ts +0 -504
  514. package/src/services/module-loading/page-module-import.service.ts +0 -251
  515. package/src/services/module-loading/server-module-transpiler.service.test.ts +0 -243
  516. package/src/services/module-loading/server-module-transpiler.service.ts +0 -104
  517. package/src/services/module-loading/source-module-support.ts +0 -19
  518. package/src/services/runtime-state/dev-graph.service.ts +0 -217
  519. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +0 -136
  520. package/src/services/runtime-state/server-invalidation-state.service.ts +0 -68
  521. package/src/services/validation/schema-validation-service.test.ts +0 -223
  522. package/src/services/validation/schema-validation-service.ts +0 -204
  523. package/src/static-site-generator/static-site-generator.test.ts +0 -408
  524. package/src/static-site-generator/static-site-generator.ts +0 -445
  525. package/src/types/internal-types.ts +0 -243
  526. package/src/types/public-types.ts +0 -1459
  527. package/src/utils/deep-merge.test.ts +0 -114
  528. package/src/utils/deep-merge.ts +0 -47
  529. package/src/utils/hash.ts +0 -5
  530. package/src/utils/html-escaping.ts +0 -9
  531. package/src/utils/invariant.test.ts +0 -22
  532. package/src/utils/invariant.ts +0 -15
  533. package/src/utils/locals-utils.ts +0 -37
  534. package/src/utils/parse-cli-args.test.ts +0 -69
  535. package/src/utils/parse-cli-args.ts +0 -105
  536. package/src/utils/path-utils.module.ts +0 -14
  537. package/src/utils/path-utils.test.ts +0 -15
  538. package/src/utils/resolve-work-dir.ts +0 -45
  539. package/src/utils/runtime.ts +0 -44
  540. package/src/utils/server-utils.module.ts +0 -67
  541. package/src/utils/server-utils.test.ts +0 -38
  542. package/src/watchers/project-watcher.integration.test.ts +0 -337
  543. package/src/watchers/project-watcher.test-helpers.ts +0 -42
  544. package/src/watchers/project-watcher.test.ts +0 -768
  545. package/src/watchers/project-watcher.ts +0 -357
  546. /package/src/utils/{html.ts → html.d.ts} +0 -0
@@ -1,494 +0,0 @@
1
- /**
2
- * Bun plugin that auto-injects `__eco` metadata into EcoComponent config objects.
3
- *
4
- * This plugin uses AST parsing (via oxc-parser) to reliably inject the `__eco` property
5
- * into EcoComponent config objects at import time. The injected metadata contains:
6
- * - `dir`: The directory path of the component file (used for dependency resolution)
7
- * - `integration`: The integration type (e.g., 'react', 'kitajs', 'ghtml', 'lit')
8
- *
9
- * The plugin intercepts file loading for all configured integration extensions and
10
- * transforms component configs before they are executed.
11
- *
12
- * @example
13
- * ```typescript
14
- * // Before transformation:
15
- * export default eco.page({
16
- * render: () => '<div>Hello</div>',
17
- * });
18
- *
19
- * // After transformation:
20
- * export default eco.page({
21
- * __eco: { id: "<hash>", file: "/path/to/pages/index.tsx", integration: "react" },
22
- * render: () => '<div>Hello</div>',
23
- * });
24
- * ```
25
- *
26
- * @module eco-component-meta-plugin
27
- */
28
-
29
- import { parseSync } from 'oxc-parser';
30
- import type { EcoBuildPlugin } from '../build/build-types.ts';
31
- import type { EcoPagesAppConfig } from '../types/internal-types.ts';
32
- import { rapidhash } from '../utils/hash.ts';
33
- import {
34
- createEcoBuildPluginFromSourceTransform,
35
- createVitePluginFromSourceTransform,
36
- type EcoSourceTransform,
37
- type EcoViteCompatiblePlugin,
38
- } from './source-transform.ts';
39
-
40
- /**
41
- * Pattern to match regex special characters that need escaping.
42
- * Used when building the file extension filter pattern.
43
- */
44
- const REGEX_SPECIAL_CHARS = /[.*+?^${}()|[\]\\]/g;
45
-
46
- /**
47
- * Set of valid Bun loader extensions.
48
- * Only files with these base extensions can be processed by Bun's loader system.
49
- */
50
- const VALID_LOADER_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);
51
-
52
- /**
53
- * Checks if an extension can be handled by a valid Bun loader.
54
- *
55
- * Compound extensions like `.kita.tsx` are valid because the final
56
- * extension is `.tsx`, which Bun can process.
57
- *
58
- * @param ext - The file extension to check (e.g., '.tsx', '.kita.tsx')
59
- * @returns `true` if the extension ends with a valid loader extension
60
- */
61
- function hasValidLoaderExtension(ext: string): boolean {
62
- for (const validExt of VALID_LOADER_EXTENSIONS) {
63
- if (ext.endsWith(validExt)) {
64
- return true;
65
- }
66
- }
67
- return false;
68
- }
69
-
70
- /**
71
- * Builds a mapping from file extensions to integration names.
72
- *
73
- * The mapping is sorted by extension length (longest first) to ensure
74
- * more specific extensions like `.kita.tsx` are matched before generic
75
- * ones like `.tsx`.
76
- *
77
- * @param integrations - Array of integration configurations from EcoPagesAppConfig
78
- * @returns Array of [extension, integrationName] tuples, sorted by specificity
79
- *
80
- * @example
81
- * ```typescript
82
- * const map = buildExtensionToIntegrationMap([
83
- * { name: 'kitajs', extensions: ['.kita.tsx'] },
84
- * { name: 'react', extensions: ['.tsx'] },
85
- * ]);
86
- * // Returns: [['.kita.tsx', 'kitajs'], ['.tsx', 'react']]
87
- * ```
88
- */
89
- function buildExtensionToIntegrationMap(integrations: EcoPagesAppConfig['integrations']): [string, string][] {
90
- const mapping: [string, string][] = [];
91
-
92
- for (const integration of integrations) {
93
- for (const ext of integration.extensions) {
94
- mapping.push([ext, integration.name]);
95
- }
96
- }
97
-
98
- mapping.sort((a, b) => b[0].length - a[0].length);
99
-
100
- return mapping;
101
- }
102
-
103
- /**
104
- * Detects the integration type for a file based on its extension.
105
- *
106
- * Uses the pre-sorted extension-to-integration map to find the most
107
- * specific matching extension.
108
- *
109
- * @param filePath - Absolute path to the file
110
- * @param extensionToIntegration - Pre-built extension mapping from buildExtensionToIntegrationMap
111
- * @returns The integration identifier (e.g., 'react', 'kitajs', 'lit', 'ghtml')
112
- */
113
- function detectIntegration(filePath: string, extensionToIntegration: [string, string][]): string {
114
- for (const [ext, integration] of extensionToIntegration) {
115
- if (filePath.endsWith(ext)) {
116
- return integration;
117
- }
118
- }
119
- return 'ghtml';
120
- }
121
-
122
- /**
123
- * Creates a RegExp pattern that matches files with any of the configured extensions.
124
- *
125
- * The pattern also matches optional query strings (e.g., `file.tsx?update=123`)
126
- * which are used for cache-busting in development mode.
127
- *
128
- * @param extensions - Array of file extensions to match
129
- * @returns RegExp pattern for use with Bun's onLoad filter
130
- * @throws Error if no extensions are provided
131
- *
132
- * @example
133
- * ```typescript
134
- * const pattern = createExtensionPattern(['.tsx', '.kita.tsx']);
135
- * pattern.test('component.tsx'); // true
136
- * pattern.test('component.tsx?v=123'); // true
137
- * pattern.test('component.ts'); // false
138
- * ```
139
- */
140
- function createExtensionPattern(extensions: string[]): RegExp {
141
- if (extensions.length === 0) {
142
- throw new Error('[eco-component-meta-plugin] No extensions configured. At least one integration is required.');
143
- }
144
- const uniqueExtensions = [...new Set(extensions)];
145
- const escaped = uniqueExtensions.map((ext) => ext.replace(REGEX_SPECIAL_CHARS, '\\$&'));
146
- return new RegExp(`(${escaped.join('|')})(\\?.*)?$`);
147
- }
148
-
149
- /**
150
- * Options for creating the eco-component-meta-plugin.
151
- */
152
- export interface EcoComponentDirPluginOptions {
153
- /** The EcoPages application configuration containing integration settings */
154
- config: EcoPagesAppConfig;
155
- }
156
-
157
- /**
158
- * Creates the bundler-neutral metadata transform used by Ecopages loaders and
159
- * Vite-compatible adapters.
160
- */
161
- export function createEcoComponentMetaTransform(options: EcoComponentDirPluginOptions): EcoSourceTransform {
162
- const allExtensions = options.config.integrations
163
- .flatMap((integration) => integration.extensions)
164
- .filter(hasValidLoaderExtension);
165
-
166
- if (allExtensions.length === 0) {
167
- throw new Error('[eco-component-meta-plugin] No extensions configured. At least one integration is required.');
168
- }
169
-
170
- const extensionPattern = createExtensionPattern(allExtensions);
171
- const extensionToIntegration = buildExtensionToIntegrationMap(options.config.integrations);
172
-
173
- return {
174
- name: 'eco-component-meta-plugin',
175
- enforce: 'pre',
176
- filter: extensionPattern,
177
- transform(code, id) {
178
- const integration = detectIntegration(id, extensionToIntegration);
179
- return {
180
- code: injectEcoMeta(code, id, integration),
181
- };
182
- },
183
- };
184
- }
185
-
186
- /**
187
- * Creates a build plugin that auto-injects `__eco` metadata into EcoComponent config objects.
188
- *
189
- * This plugin intercepts file loading for all integration-compatible files and:
190
- * 1. Strips any query string from the file path (for dev mode cache-busting)
191
- * 2. Reads the file contents
192
- * 3. Parses the AST using oxc-parser to find injection points
193
- * 4. Injects `__eco: { id: "...", file: "...", integration: "..." }` into config objects
194
- * 5. Returns the transformed content with the appropriate loader
195
- *
196
- * Supported patterns:
197
- * - `eco.page({ ... })` - Page component declarations
198
- * - `eco.component({ ... })` - Reusable component declarations
199
- * - `eco.html({ ... })` - HTML shell declarations
200
- * - `eco.layout({ ... })` - Layout declarations
201
- * - `Component.config = { ... }` - Config assignment pattern
202
- * - `config: { ... }` - Config property in object literals
203
- * - `export const config = { ... }` - Exported config declarations
204
- *
205
- * @param options - Plugin options containing the EcoPages config
206
- * @returns A build plugin instance ready for registration
207
- *
208
- * @example
209
- * ```typescript
210
- * import { createEcoComponentMetaPlugin } from '@ecopages/core';
211
- *
212
- * const plugin = createEcoComponentMetaPlugin({ config: appConfig });
213
- * appConfig.loaders.set(plugin.name, plugin);
214
- * ```
215
- */
216
- export function createEcoComponentMetaPlugin(options: EcoComponentDirPluginOptions): EcoBuildPlugin {
217
- return createEcoBuildPluginFromSourceTransform(createEcoComponentMetaTransform(options));
218
- }
219
-
220
- /**
221
- * Creates a Vite-compatible metadata injection plugin from the shared
222
- * Ecopages source-transform primitive.
223
- */
224
- export function createEcoComponentMetaVitePlugin(options: EcoComponentDirPluginOptions): EcoViteCompatiblePlugin {
225
- return createVitePluginFromSourceTransform(createEcoComponentMetaTransform(options));
226
- }
227
-
228
- /**
229
- * Represents a text insertion to be made in the source code.
230
- */
231
- interface Insertion {
232
- /** Character position in the source where text should be inserted */
233
- position: number;
234
- /** The text to insert at the position */
235
- text: string;
236
- }
237
-
238
- /**
239
- * Recursively walks the AST (Abstract Syntax Tree) to find all injection points for `__eco` metadata.
240
- *
241
- * ## What is an AST?
242
- *
243
- * An AST is a tree representation of source code. Instead of treating code as text,
244
- * a parser breaks it down into a structured tree where each node represents a
245
- * syntactic construct (variable, function call, object, etc.).
246
- *
247
- * For example, this code:
248
- * ```typescript
249
- * eco.page({ render: () => 'hi' })
250
- * ```
251
- *
252
- * Becomes an AST like:
253
- * ```
254
- * CallExpression
255
- * ├── callee: MemberExpression
256
- * │ ├── object: Identifier (name: "eco")
257
- * │ └── property: Identifier (name: "page")
258
- * └── arguments: [
259
- * └── ObjectExpression (start: 9) <-- We inject here at position 10 (after "{")
260
- * └── properties: [...]
261
- * ]
262
- * ```
263
- *
264
- * ## How this function works
265
- *
266
- * 1. **Recursive traversal**: Visits every node in the tree, checking each one
267
- * 2. **Pattern matching**: Checks if the current node matches one of our target patterns
268
- * 3. **Position tracking**: When a match is found, records the `start` position of the
269
- * config object (the character index in the original source where `{` appears)
270
- * 4. **Insertion offset**: Adds +1 to insert right after the opening `{`
271
- *
272
- * ## Supported patterns
273
- *
274
- * | Pattern | AST Node Type | Example | File Types |
275
- * |---------|---------------|---------|------------|
276
- * | `eco.page({...})` | CallExpression | `export default eco.page({ render: () => 'hi' })` | All |
277
- * | `eco.component({...})` | CallExpression | `export const Btn = eco.component({ render: () => '<button/>' })` | All |
278
- * | `eco.html({...})` | CallExpression | `export default eco.html({ render: () => '<html />' })` | All |
279
- * | `eco.layout({...})` | CallExpression | `export const MainLayout = eco.layout({ render: () => '<main />' })` | All |
280
- * | `X.config = {...}` | AssignmentExpression | `MyComponent.config = { dependencies: [] }` | All |
281
- * | `config: {...}` | ObjectProperty | `const X: EcoComponent = { config: {...} }` | EcoComponent-typed only |
282
- *
283
- * ## Why AST over regex?
284
- *
285
- * Regex would fail on edge cases like:
286
- * - `eco.page<ComplexType<(arg: string) => void>>({...})` - generics with arrows
287
- * - `// eco.page({ commented out })` - comments
288
- * - `const str = "eco.page({ in a string })"` - string literals
289
- * - Nested objects that look like config patterns
290
- *
291
- * AST parsing understands the actual code structure, not just text patterns.
292
- *
293
- * @param node - Current AST node being visited (starts with the root Program node)
294
- * @param insertions - Array to collect insertion points (mutated by this function)
295
- * @param injection - The injection text to insert at each point (e.g., ` __eco: {...},`)
296
- * @param isInsideEcoComponent - Whether we're inside an EcoComponent-typed declaration
297
- */
298
- function findInjectionPoints(
299
- node: unknown,
300
- insertions: Insertion[],
301
- injection: string,
302
- isInsideEcoComponent = false,
303
- ): void {
304
- if (!node || typeof node !== 'object') return;
305
-
306
- const n = node as Record<string, unknown>;
307
-
308
- /**
309
- * Pattern 1: eco.page({...}), eco.component({...}), eco.html({...}), or eco.layout({...})
310
- * AST structure: CallExpression with MemberExpression callee where object is "eco"
311
- */
312
- if (n.type === 'CallExpression') {
313
- const callee = n.callee as Record<string, unknown> | undefined;
314
-
315
- /**
316
- * MemberExpression represents "something.property" syntax.
317
- * StaticMemberExpression is oxc's variant for computed vs non-computed access.
318
- */
319
- if (callee?.type === 'MemberExpression' || callee?.type === 'StaticMemberExpression') {
320
- const obj = callee.object as Record<string, unknown> | undefined;
321
- const prop = callee.property as Record<string, unknown> | undefined;
322
-
323
- /** Check: is this `eco.page(...)`, `eco.component(...)`, `eco.html(...)`, or `eco.layout(...)`? */
324
- if (
325
- obj?.type === 'Identifier' &&
326
- obj?.name === 'eco' &&
327
- (prop?.name === 'page' ||
328
- prop?.name === 'component' ||
329
- prop?.name === 'html' ||
330
- prop?.name === 'layout')
331
- ) {
332
- /** Get the first argument - should be an object literal {...} */
333
- const args = n.arguments as Array<Record<string, unknown>> | undefined;
334
- const firstArg = args?.[0];
335
- if (firstArg?.type === 'ObjectExpression') {
336
- /**
337
- * `start` is the character index where this object begins (the "{").
338
- * Insert at position+1 to place content right after "{".
339
- */
340
- const start = firstArg.start as number | undefined;
341
- if (typeof start === 'number') {
342
- insertions.push({ position: start + 1, text: injection });
343
- }
344
- }
345
- }
346
- }
347
- }
348
-
349
- /**
350
- * Pattern 2: Something.config = {...}
351
- * AST structure: AssignmentExpression with MemberExpression left side ending in "config"
352
- * This pattern is safe for all files because it requires a qualifier (e.g., MyComponent.config).
353
- */
354
- if (n.type === 'AssignmentExpression') {
355
- const left = n.left as Record<string, unknown> | undefined;
356
- const right = n.right as Record<string, unknown> | undefined;
357
-
358
- /** Case: MyComponent.config = {...} */
359
- if (left?.type === 'MemberExpression' || left?.type === 'StaticMemberExpression') {
360
- const prop = left.property as Record<string, unknown> | undefined;
361
- if (prop?.name === 'config' && right?.type === 'ObjectExpression') {
362
- const start = right.start as number | undefined;
363
- if (typeof start === 'number') {
364
- insertions.push({ position: start + 1, text: injection });
365
- }
366
- }
367
- }
368
- }
369
-
370
- /**
371
- * Pattern 3: { config: {...} } - config as an object property inside EcoComponent
372
- * AST structure: ObjectProperty/Property with key "config" and value as ObjectExpression
373
- *
374
- * This pattern is matched when the parent VariableDeclarator has a type annotation
375
- * containing "EcoComponent", e.g., `const X: EcoComponent = { config: {...} }`
376
- *
377
- * We track whether we're inside an EcoComponent-typed object via the `isInsideEcoComponent` flag.
378
- */
379
- if (n.type === 'ObjectProperty' || n.type === 'Property') {
380
- const key = n.key as Record<string, unknown> | undefined;
381
- const value = n.value as Record<string, unknown> | undefined;
382
-
383
- if (
384
- (key?.type === 'Identifier' || key?.type === 'IdentifierName') &&
385
- key?.name === 'config' &&
386
- value?.type === 'ObjectExpression' &&
387
- isInsideEcoComponent
388
- ) {
389
- const start = value.start as number | undefined;
390
- if (typeof start === 'number') {
391
- insertions.push({ position: start + 1, text: injection });
392
- }
393
- }
394
- }
395
-
396
- /**
397
- * Check if we're entering an EcoComponent-typed variable declaration.
398
- * This sets a flag for child nodes to know they're inside an EcoComponent.
399
- *
400
- * Type annotation is on the `id` (Identifier), not the VariableDeclarator directly.
401
- * e.g., `const X: EcoComponent = {...}` has the annotation on the "X" Identifier.
402
- */
403
- let childIsInsideEcoComponent = isInsideEcoComponent;
404
- if (n.type === 'VariableDeclarator') {
405
- const id = n.id as Record<string, unknown> | undefined;
406
- const typeAnnotation = id?.typeAnnotation as Record<string, unknown> | undefined;
407
- if (typeAnnotation) {
408
- const typeStr = JSON.stringify(typeAnnotation);
409
- if (typeStr.includes('EcoComponent')) {
410
- childIsInsideEcoComponent = true;
411
- }
412
- }
413
- }
414
-
415
- /**
416
- * Recursive traversal: Visit all child nodes in the AST.
417
- *
418
- * This is how we "walk" the tree - for each property of the current node,
419
- * if it's an array (like `body` containing statements) or an object (like `callee`),
420
- * we recursively call findInjectionPoints on it.
421
- * We skip metadata properties (start, end, type) that don't contain child nodes.
422
- */
423
- for (const key in n) {
424
- if (key === 'start' || key === 'end' || key === 'type') continue;
425
-
426
- const value = n[key];
427
- if (Array.isArray(value)) {
428
- for (const child of value) {
429
- findInjectionPoints(child, insertions, injection, childIsInsideEcoComponent);
430
- }
431
- } else if (typeof value === 'object' && value !== null) {
432
- findInjectionPoints(value, insertions, injection, childIsInsideEcoComponent);
433
- }
434
- }
435
- }
436
-
437
- /**
438
- * Injects `__eco` metadata into EcoComponent config objects in file content.
439
- *
440
- * Uses oxc-parser for robust AST-based code analysis, which handles edge cases
441
- * that regex-based approaches would miss (e.g., complex generics, nested objects,
442
- * comments, string literals containing similar patterns).
443
- *
444
- * The injection is performed by:
445
- * 1. Parsing the source code into an AST
446
- * 2. Walking the AST to find all config object patterns
447
- * 3. Collecting insertion points (sorted in reverse order to preserve positions)
448
- * 4. Inserting the `__eco` property at each point
449
- *
450
- * @param contents - The source code content to transform
451
- * @param filePath - Absolute path to the file (used to derive the directory)
452
- * @param integration - The integration identifier for this file type
453
- * @returns Transformed source code with `__eco` injected, or original if no patterns found
454
- *
455
- * @example
456
- * ```typescript
457
- * const result = injectEcoMeta(
458
- * 'export default eco.page({ render: () => "<div>Hi</div>" });',
459
- * '/app/src/pages/index.tsx',
460
- * 'react'
461
- * );
462
- * // Result: 'export default eco.page({ __eco: { id: "<hash>", file: "/app/src/pages/index.tsx", integration: "react" }, render: () => "<div>Hi</div>" });'
463
- * ```
464
- */
465
- export function injectEcoMeta(contents: string, filePath: string, integration: string): string {
466
- const result = parseSync(filePath, contents);
467
-
468
- if (result.errors.length > 0) {
469
- console.warn(`[eco-component-meta-plugin] Parse errors in ${filePath}:`, result.errors);
470
- return contents;
471
- }
472
-
473
- const ast = result.program;
474
- const id = rapidhash(filePath).toString(36);
475
- const injection = ` __eco: { id: "${id}", file: "${filePath}", integration: "${integration}" },`;
476
-
477
- const insertions: Insertion[] = [];
478
- findInjectionPoints(ast, insertions, injection);
479
-
480
- if (insertions.length === 0) {
481
- return contents;
482
- }
483
-
484
- insertions.sort((a, b) => b.position - a.position);
485
-
486
- let transformed = contents;
487
- for (const { position, text } of insertions) {
488
- transformed = transformed.slice(0, position) + text + transformed.slice(position);
489
- }
490
-
491
- return transformed;
492
- }
493
-
494
- export default createEcoComponentMetaPlugin;
@@ -1,65 +0,0 @@
1
- import { mkdtemp, rm, writeFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { tmpdir } from 'node:os';
4
- import { afterEach, describe, expect, it } from 'vitest';
5
- import { createForeignJsxOverridePlugin } from './foreign-jsx-override-plugin.ts';
6
-
7
- describe('foreign-jsx-override-plugin', () => {
8
- const tempDirs: string[] = [];
9
-
10
- afterEach(async () => {
11
- await Promise.all(tempDirs.splice(0).map((dir) => rm(dir, { recursive: true, force: true })));
12
- });
13
-
14
- it('preserves jsx loader selection and resolveDir for jsx files', async () => {
15
- const tempDir = await mkdtemp(path.join(tmpdir(), 'foreign-jsx-override-'));
16
- tempDirs.push(tempDir);
17
- const filePath = path.join(tempDir, 'component.jsx');
18
- await writeFile(filePath, 'export const Component = () => <div />;');
19
-
20
- const plugin = createForeignJsxOverridePlugin({
21
- hostJsxImportSource: 'react',
22
- foreignExtensions: ['.jsx'],
23
- });
24
-
25
- let onLoad:
26
- | ((args: { path: string }) => { contents: string; loader: string; resolveDir: string } | undefined)
27
- | undefined;
28
-
29
- plugin.setup({
30
- onLoad(_options: unknown, callback: unknown) {
31
- onLoad = callback as typeof onLoad;
32
- },
33
- } as never);
34
-
35
- const result = onLoad?.({ path: filePath });
36
-
37
- expect(result).toEqual({
38
- contents: '/** @jsxImportSource react */\nexport const Component = () => <div />;',
39
- loader: 'jsx',
40
- resolveDir: tempDir,
41
- });
42
- });
43
-
44
- it('returns undefined when a file already declares jsxImportSource', async () => {
45
- const tempDir = await mkdtemp(path.join(tmpdir(), 'foreign-jsx-override-'));
46
- tempDirs.push(tempDir);
47
- const filePath = path.join(tempDir, 'component.tsx');
48
- await writeFile(filePath, '/** @jsxImportSource react */\nexport const Component = () => <div />;');
49
-
50
- const plugin = createForeignJsxOverridePlugin({
51
- hostJsxImportSource: 'react',
52
- foreignExtensions: ['.tsx'],
53
- });
54
-
55
- let onLoad: ((args: { path: string }) => unknown) | undefined;
56
-
57
- plugin.setup({
58
- onLoad(_options: unknown, callback: unknown) {
59
- onLoad = callback as typeof onLoad;
60
- },
61
- } as never);
62
-
63
- expect(onLoad?.({ path: filePath })).toBeUndefined();
64
- });
65
- });
@@ -1,67 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import path from 'node:path';
3
- import type { EcoBuildPlugin } from '../build/build-types.ts';
4
-
5
- /**
6
- * Options for the shared foreign-JSX override build plugin.
7
- */
8
- export interface ForeignJsxOverrideOptions {
9
- /** JSX runtime that should own the transformed foreign files. */
10
- hostJsxImportSource: string;
11
- /** Extensions claimed by other JSX integrations that may appear in the host graph. */
12
- foreignExtensions: string[];
13
- /** Optional plugin name override for debug output. */
14
- name?: string;
15
- }
16
-
17
- /**
18
- * Build plugin that prepends a `@jsxImportSource` pragma to foreign integration
19
- * files bundled into a host integration's client graph.
20
- *
21
- * When a host integration (e.g. React) bundles a component file that belongs to
22
- * another JSX integration (e.g. `.kita.tsx`), that file inherits the project
23
- * `tsconfig` JSX runtime which produces the wrong output (HTML strings instead
24
- * of framework elements). This plugin rewrites the source to explicitly target
25
- * the host's JSX factory so esbuild compiles every JSX expression into the
26
- * correct element creation calls.
27
- *
28
- * The plugin is intentionally framework-agnostic: any integration that does
29
- * client-side bundling can use it by passing its own `jsxImportSource` and the
30
- * set of foreign extensions collected from the app config.
31
- *
32
- * When no JSX-bearing foreign extensions are present, the returned plugin is a
33
- * no-op so integrations can register it unconditionally.
34
- */
35
- export function createForeignJsxOverridePlugin(options: ForeignJsxOverrideOptions): EcoBuildPlugin {
36
- const extensions = options.foreignExtensions.filter((ext) => ext.endsWith('.tsx') || ext.endsWith('.jsx'));
37
-
38
- if (extensions.length === 0) {
39
- return {
40
- name: options.name ?? 'foreign-jsx-override',
41
- setup() {},
42
- };
43
- }
44
-
45
- const pragma = `/** @jsxImportSource ${options.hostJsxImportSource} */\n`;
46
- const filter = new RegExp(`(${extensions.map((e) => e.replace('.', '\\.')).join('|')})$`);
47
-
48
- return {
49
- name: options.name ?? 'foreign-jsx-override',
50
- setup(build) {
51
- build.onLoad({ filter }, (args) => {
52
- const source = readFileSync(args.path, 'utf-8');
53
- const loader = args.path.endsWith('.jsx') ? 'jsx' : 'tsx';
54
-
55
- if (source.includes('@jsxImportSource')) {
56
- return undefined;
57
- }
58
-
59
- return {
60
- contents: pragma + source,
61
- loader,
62
- resolveDir: path.dirname(args.path),
63
- };
64
- });
65
- },
66
- };
67
- }