@ecopages/core 0.2.0-alpha.9 → 0.2.1-beta.0

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 (471) hide show
  1. package/README.md +79 -28
  2. package/package.json +94 -116
  3. package/src/adapters/README.md +2 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +28 -2
  5. package/src/adapters/abstract/application-adapter.js +14 -2
  6. package/src/adapters/abstract/router-adapter.d.ts +1 -1
  7. package/src/adapters/abstract/server-adapter.d.ts +2 -2
  8. package/src/adapters/bun/client-bridge.d.ts +1 -1
  9. package/src/adapters/bun/create-app.d.ts +12 -12
  10. package/src/adapters/bun/create-app.js +64 -41
  11. package/src/adapters/bun/hmr-manager.d.ts +19 -115
  12. package/src/adapters/bun/hmr-manager.js +25 -301
  13. package/src/adapters/bun/index.d.ts +1 -1
  14. package/src/adapters/bun/index.js +2 -2
  15. package/src/adapters/bun/runtime-host.d.ts +52 -0
  16. package/src/adapters/bun/runtime-host.js +56 -0
  17. package/src/adapters/bun/server-adapter.d.ts +100 -32
  18. package/src/adapters/bun/server-adapter.js +142 -65
  19. package/src/adapters/bun/static-preview-host.d.ts +28 -0
  20. package/src/adapters/bun/static-preview-host.js +45 -0
  21. package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
  22. package/src/{create-app.js → adapters/create-app.js} +4 -4
  23. package/src/adapters/index.d.ts +1 -5
  24. package/src/adapters/index.js +1 -7
  25. package/src/adapters/node/create-app.d.ts +15 -12
  26. package/src/adapters/node/create-app.js +34 -85
  27. package/src/adapters/node/http-request-bridge.d.ts +57 -0
  28. package/src/adapters/node/http-request-bridge.js +118 -0
  29. package/src/adapters/node/node-client-bridge.d.ts +1 -1
  30. package/src/adapters/node/node-hmr-manager.d.ts +22 -103
  31. package/src/adapters/node/node-hmr-manager.js +26 -289
  32. package/src/adapters/node/runtime-host.d.ts +57 -0
  33. package/src/adapters/node/runtime-host.js +92 -0
  34. package/src/adapters/node/server-adapter-dependencies.d.ts +19 -0
  35. package/src/adapters/node/server-adapter-dependencies.js +18 -0
  36. package/src/adapters/node/server-adapter.d.ts +19 -42
  37. package/src/adapters/node/server-adapter.js +94 -139
  38. package/src/adapters/node/static-content-server.d.ts +1 -1
  39. package/src/adapters/node/static-content-server.js +1 -1
  40. package/src/adapters/node/static-preview-host.d.ts +55 -0
  41. package/src/adapters/node/static-preview-host.js +68 -0
  42. package/src/adapters/shared/application-adapter.d.ts +1 -1
  43. package/src/adapters/shared/define-api-handler.d.ts +1 -1
  44. package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
  45. package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
  46. package/src/adapters/shared/explicit-static-route-matcher.d.ts +7 -4
  47. package/src/adapters/shared/explicit-static-route-matcher.js +14 -16
  48. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
  49. package/src/adapters/shared/file-route-middleware-pipeline.js +2 -11
  50. package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
  51. package/src/adapters/shared/fs-server-response-factory.js +11 -27
  52. package/src/adapters/shared/fs-server-response-matcher.d.ts +18 -18
  53. package/src/adapters/shared/fs-server-response-matcher.js +72 -46
  54. package/src/adapters/shared/hmr-entrypoint-registrar.js +1 -1
  55. package/src/adapters/shared/hmr-html-response.d.ts +1 -1
  56. package/src/adapters/shared/hmr-html-response.js +4 -3
  57. package/src/adapters/shared/render-context.d.ts +5 -3
  58. package/src/adapters/shared/render-context.js +24 -1
  59. package/src/adapters/shared/runtime-app-bootstrap.d.ts +26 -0
  60. package/src/adapters/shared/runtime-app-bootstrap.js +46 -0
  61. package/src/adapters/shared/runtime-host.d.ts +12 -0
  62. package/src/adapters/shared/server-adapter.d.ts +22 -11
  63. package/src/adapters/shared/server-adapter.js +183 -133
  64. package/src/adapters/shared/server-route-handler.d.ts +5 -5
  65. package/src/adapters/shared/server-route-handler.js +4 -4
  66. package/src/adapters/shared/server-static-builder.d.ts +8 -7
  67. package/src/adapters/shared/server-static-builder.js +6 -5
  68. package/src/adapters/shared/shared-hmr-manager.d.ts +59 -0
  69. package/src/adapters/shared/shared-hmr-manager.js +241 -0
  70. package/src/adapters/shared/static-preview-host.d.ts +10 -0
  71. package/src/build/README.md +57 -67
  72. package/src/build/browser-runtime-manifest.d.ts +31 -0
  73. package/src/build/browser-runtime-manifest.js +61 -0
  74. package/src/build/browser-runtime-plugin-helpers.d.ts +26 -0
  75. package/src/build/browser-runtime-plugin-helpers.js +14 -0
  76. package/src/build/browser-runtime-plugin.d.ts +78 -0
  77. package/src/build/browser-runtime-plugin.js +173 -0
  78. package/src/build/build-adapter.d.ts +384 -63
  79. package/src/build/build-adapter.js +129 -54
  80. package/src/build/build-manifest.d.ts +6 -0
  81. package/src/build/build-manifest.js +21 -2
  82. package/src/build/build-types.d.ts +2 -2
  83. package/src/build/rolldown-adapter-helpers.d.ts +58 -0
  84. package/src/build/rolldown-adapter-helpers.js +265 -0
  85. package/src/build/rolldown-build-adapter.d.ts +28 -0
  86. package/src/build/rolldown-build-adapter.js +65 -0
  87. package/src/build/rolldown-dev-build-adapter.d.ts +82 -0
  88. package/src/build/rolldown-dev-build-adapter.js +166 -0
  89. package/src/build/rolldown-plugin-bridge.d.ts +59 -0
  90. package/src/build/rolldown-plugin-bridge.js +199 -0
  91. package/src/build/runtime-build-executor.d.ts +15 -7
  92. package/src/build/runtime-build-executor.js +8 -9
  93. package/src/build/runtime-build-output-normalizer.d.ts +3 -0
  94. package/src/build/runtime-build-output-normalizer.js +111 -0
  95. package/src/build/serialized-build-executor.d.ts +64 -0
  96. package/src/build/serialized-build-executor.js +63 -0
  97. package/src/build/server-side-css-shim-plugin.d.ts +41 -0
  98. package/src/build/server-side-css-shim-plugin.js +35 -0
  99. package/src/cache/index.d.ts +6 -0
  100. package/src/cache/index.js +6 -0
  101. package/src/cache/module-parse-cache.d.ts +65 -0
  102. package/src/cache/module-parse-cache.js +75 -0
  103. package/src/config/README.md +5 -2
  104. package/src/config/config-builder.d.ts +41 -13
  105. package/src/config/config-builder.js +62 -24
  106. package/src/declarations.d.ts +1 -1
  107. package/src/dev/host-runtime.d.ts +10 -0
  108. package/src/dev/host-runtime.js +24 -0
  109. package/src/dev/sc-server.d.ts +1 -1
  110. package/src/dev/sc-server.js +1 -1
  111. package/src/eco/eco.browser.d.ts +2 -0
  112. package/src/eco/eco.browser.js +88 -0
  113. package/src/eco/eco.js +50 -45
  114. package/src/eco/eco.types.d.ts +60 -8
  115. package/src/eco/eco.utils.d.ts +1 -40
  116. package/src/eco/eco.utils.js +5 -35
  117. package/src/eco/global-injector-map.d.ts +3 -3
  118. package/src/eco/global-injector-map.js +2 -2
  119. package/src/eco/lazy-injector-map.d.ts +2 -2
  120. package/src/errors/index.d.ts +1 -0
  121. package/src/errors/index.js +3 -1
  122. package/src/hmr/client/hmr-runtime.js +9 -1
  123. package/src/hmr/hmr-strategy.d.ts +16 -13
  124. package/src/hmr/hmr-strategy.js +22 -7
  125. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  126. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  127. package/src/hmr/strategies/js-hmr-strategy.d.ts +4 -9
  128. package/src/hmr/strategies/js-hmr-strategy.js +5 -10
  129. package/src/index.browser.d.ts +2 -2
  130. package/src/index.browser.js +1 -1
  131. package/src/index.d.ts +3 -2
  132. package/src/index.js +15 -4
  133. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -1
  134. package/src/integrations/ghtml/ghtml-renderer.js +24 -29
  135. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  136. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  137. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  138. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  139. package/src/plugins/README.md +1 -0
  140. package/src/plugins/alias-resolver-cache.d.ts +68 -0
  141. package/src/plugins/alias-resolver-cache.js +106 -0
  142. package/src/plugins/alias-resolver-plugin.d.ts +5 -1
  143. package/src/plugins/alias-resolver-plugin.js +19 -7
  144. package/src/plugins/eco-component-meta-plugin.d.ts +12 -1
  145. package/src/plugins/eco-component-meta-plugin.js +43 -25
  146. package/src/plugins/foreign-jsx-override-plugin.d.ts +33 -0
  147. package/src/plugins/foreign-jsx-override-plugin.js +41 -0
  148. package/src/plugins/integration-plugin.d.ts +136 -42
  149. package/src/plugins/integration-plugin.js +99 -31
  150. package/src/plugins/processor.d.ts +4 -2
  151. package/src/plugins/processor.js +8 -3
  152. package/src/plugins/source-transform.d.ts +46 -0
  153. package/src/plugins/source-transform.js +71 -0
  154. package/src/route-renderer/GRAPH.md +80 -318
  155. package/src/route-renderer/README.md +74 -78
  156. package/src/route-renderer/orchestration/component-render-context.d.ts +97 -0
  157. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  158. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
  159. package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
  160. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +110 -0
  161. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +233 -0
  162. package/src/route-renderer/orchestration/integration-renderer.d.ts +290 -128
  163. package/src/route-renderer/orchestration/integration-renderer.js +660 -258
  164. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
  165. package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
  166. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
  167. package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
  168. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +3 -0
  169. package/src/route-renderer/orchestration/processed-asset-dedupe.js +27 -0
  170. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +91 -0
  171. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +170 -0
  172. package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
  173. package/src/route-renderer/orchestration/render-output.utils.js +171 -0
  174. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +156 -0
  175. package/src/route-renderer/orchestration/route-render-orchestrator.js +577 -0
  176. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  177. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  178. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
  179. package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
  180. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
  181. package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
  182. package/src/route-renderer/page-loading/dependency-resolver.d.ts +2 -2
  183. package/src/route-renderer/page-loading/dependency-resolver.js +27 -354
  184. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
  185. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
  186. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
  187. package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
  188. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
  189. package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
  190. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
  191. package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
  192. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
  193. package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
  194. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
  195. package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
  196. package/src/route-renderer/page-loading/page-module-loader.d.ts +7 -4
  197. package/src/route-renderer/page-loading/page-module-loader.js +8 -5
  198. package/src/route-renderer/route-renderer.d.ts +31 -23
  199. package/src/route-renderer/route-renderer.js +17 -24
  200. package/src/router/README.md +76 -8
  201. package/src/router/client/navigation-coordinator.d.ts +20 -0
  202. package/src/router/client/navigation-coordinator.js +2 -2
  203. package/src/router/server/route-registry.d.ts +78 -0
  204. package/src/router/server/route-registry.js +262 -0
  205. package/src/services/README.md +1 -2
  206. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  207. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  208. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +3 -20
  209. package/src/services/assets/asset-processing-service/asset-processing.service.js +52 -98
  210. package/src/services/assets/asset-processing-service/asset.factory.d.ts +1 -1
  211. package/src/services/assets/asset-processing-service/asset.factory.js +2 -2
  212. package/src/services/assets/asset-processing-service/assets.types.d.ts +14 -0
  213. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -0
  214. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
  215. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
  216. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
  217. package/src/services/assets/asset-processing-service/index.d.ts +6 -5
  218. package/src/services/assets/asset-processing-service/index.js +6 -5
  219. package/src/services/assets/asset-processing-service/page-package.d.ts +6 -0
  220. package/src/services/assets/asset-processing-service/page-package.js +80 -0
  221. package/src/services/assets/asset-processing-service/processor.interface.d.ts +2 -2
  222. package/src/services/assets/asset-processing-service/processor.registry.d.ts +2 -2
  223. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +1 -1
  224. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +3 -2
  225. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +10 -5
  226. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +69 -5
  227. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -5
  228. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  229. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +3 -2
  230. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +66 -3
  231. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +4 -3
  232. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +27 -6
  233. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +38 -3
  234. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +57 -6
  235. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
  236. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +39 -5
  237. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  238. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +5 -2
  239. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
  240. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
  241. package/src/services/assets/browser-bundle.service.d.ts +44 -3
  242. package/src/services/assets/browser-bundle.service.js +15 -7
  243. package/src/services/html/html-rewriter-provider.service.d.ts +3 -0
  244. package/src/services/html/html-rewriter-provider.service.js +4 -1
  245. package/src/services/html/html-transformer.service.d.ts +22 -3
  246. package/src/services/html/html-transformer.service.js +101 -35
  247. package/src/services/invalidation/development-invalidation.service.d.ts +1 -1
  248. package/src/services/invalidation/development-invalidation.service.js +1 -0
  249. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  250. package/src/services/module-loading/app-module-loader.service.js +0 -0
  251. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +9 -1
  252. package/src/services/module-loading/app-server-module-transpiler.service.js +102 -6
  253. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  254. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  255. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  256. package/src/services/module-loading/module-loading-types.js +0 -0
  257. package/src/services/module-loading/page-module-import.service.d.ts +32 -8
  258. package/src/services/module-loading/page-module-import.service.js +83 -22
  259. package/src/services/module-loading/server-module-transpiler.service.d.ts +8 -14
  260. package/src/services/module-loading/server-module-transpiler.service.js +5 -2
  261. package/src/services/module-loading/source-module-support.d.ts +5 -0
  262. package/src/services/module-loading/source-module-support.js +8 -0
  263. package/src/services/runtime-state/dev-graph.service.d.ts +6 -6
  264. package/src/services/runtime-state/dev-graph.service.js +10 -10
  265. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +1 -1
  266. package/src/services/runtime-state/server-invalidation-state.service.d.ts +1 -1
  267. package/src/static-site-generator/static-site-generator.d.ts +23 -28
  268. package/src/static-site-generator/static-site-generator.js +119 -156
  269. package/src/{internal-types.d.ts → types/internal-types.d.ts} +34 -23
  270. package/src/types/internal-types.js +0 -0
  271. package/src/{public-types.d.ts → types/public-types.d.ts} +195 -37
  272. package/src/types/public-types.js +0 -0
  273. package/src/utils/html-escaping.d.ts +7 -0
  274. package/src/utils/html-escaping.js +6 -0
  275. package/src/utils/locals-utils.d.ts +1 -1
  276. package/src/utils/parse-cli-args.d.ts +4 -1
  277. package/src/utils/parse-cli-args.js +16 -1
  278. package/src/utils/resolve-work-dir.js +1 -1
  279. package/src/watchers/project-watcher.d.ts +4 -4
  280. package/src/watchers/project-watcher.js +35 -41
  281. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  282. package/src/watchers/project-watcher.test-helpers.js +5 -5
  283. package/CHANGELOG.md +0 -31
  284. package/src/adapters/abstract/application-adapter.ts +0 -337
  285. package/src/adapters/abstract/router-adapter.ts +0 -30
  286. package/src/adapters/abstract/server-adapter.ts +0 -79
  287. package/src/adapters/bun/client-bridge.ts +0 -62
  288. package/src/adapters/bun/create-app.ts +0 -189
  289. package/src/adapters/bun/hmr-manager.ts +0 -409
  290. package/src/adapters/bun/index.ts +0 -2
  291. package/src/adapters/bun/server-adapter.ts +0 -499
  292. package/src/adapters/bun/server-lifecycle.d.ts +0 -63
  293. package/src/adapters/bun/server-lifecycle.js +0 -92
  294. package/src/adapters/bun/server-lifecycle.ts +0 -124
  295. package/src/adapters/index.ts +0 -6
  296. package/src/adapters/node/bootstrap-dependency-resolver.d.ts +0 -44
  297. package/src/adapters/node/bootstrap-dependency-resolver.js +0 -172
  298. package/src/adapters/node/bootstrap-dependency-resolver.ts +0 -301
  299. package/src/adapters/node/create-app.ts +0 -179
  300. package/src/adapters/node/index.d.ts +0 -6
  301. package/src/adapters/node/index.js +0 -11
  302. package/src/adapters/node/index.ts +0 -16
  303. package/src/adapters/node/node-client-bridge.ts +0 -79
  304. package/src/adapters/node/node-hmr-manager.ts +0 -381
  305. package/src/adapters/node/runtime-adapter.d.ts +0 -46
  306. package/src/adapters/node/runtime-adapter.js +0 -306
  307. package/src/adapters/node/runtime-adapter.ts +0 -439
  308. package/src/adapters/node/server-adapter.ts +0 -488
  309. package/src/adapters/node/static-content-server.ts +0 -239
  310. package/src/adapters/node/write-runtime-manifest.d.ts +0 -26
  311. package/src/adapters/node/write-runtime-manifest.js +0 -12
  312. package/src/adapters/node/write-runtime-manifest.ts +0 -38
  313. package/src/adapters/shared/api-response.ts +0 -104
  314. package/src/adapters/shared/application-adapter.ts +0 -199
  315. package/src/adapters/shared/define-api-handler.ts +0 -66
  316. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -140
  317. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -127
  318. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  319. package/src/adapters/shared/fs-server-response-matcher.ts +0 -205
  320. package/src/adapters/shared/hmr-entrypoint-registrar.ts +0 -149
  321. package/src/adapters/shared/hmr-html-response.ts +0 -52
  322. package/src/adapters/shared/render-context.ts +0 -120
  323. package/src/adapters/shared/runtime-bootstrap.d.ts +0 -38
  324. package/src/adapters/shared/runtime-bootstrap.js +0 -43
  325. package/src/adapters/shared/runtime-bootstrap.ts +0 -79
  326. package/src/adapters/shared/server-adapter.ts +0 -489
  327. package/src/adapters/shared/server-route-handler.ts +0 -153
  328. package/src/adapters/shared/server-static-builder.ts +0 -166
  329. package/src/build/build-adapter.ts +0 -361
  330. package/src/build/build-manifest.ts +0 -54
  331. package/src/build/build-types.ts +0 -83
  332. package/src/build/dev-build-coordinator.d.ts +0 -74
  333. package/src/build/dev-build-coordinator.js +0 -161
  334. package/src/build/dev-build-coordinator.ts +0 -221
  335. package/src/build/esbuild-build-adapter.d.ts +0 -72
  336. package/src/build/esbuild-build-adapter.js +0 -422
  337. package/src/build/esbuild-build-adapter.ts +0 -559
  338. package/src/build/runtime-build-executor.ts +0 -34
  339. package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
  340. package/src/build/runtime-specifier-alias-plugin.js +0 -31
  341. package/src/build/runtime-specifier-alias-plugin.ts +0 -58
  342. package/src/config/config-builder.ts +0 -706
  343. package/src/constants.ts +0 -54
  344. package/src/create-app.ts +0 -87
  345. package/src/dev/sc-server.ts +0 -143
  346. package/src/eco/component-render-context.d.ts +0 -105
  347. package/src/eco/component-render-context.js +0 -87
  348. package/src/eco/component-render-context.ts +0 -224
  349. package/src/eco/eco.ts +0 -242
  350. package/src/eco/eco.types.ts +0 -221
  351. package/src/eco/eco.utils.ts +0 -89
  352. package/src/eco/global-injector-map.ts +0 -112
  353. package/src/eco/lazy-injector-map.ts +0 -120
  354. package/src/eco/module-dependencies.ts +0 -75
  355. package/src/errors/http-error.ts +0 -72
  356. package/src/errors/index.ts +0 -2
  357. package/src/errors/locals-access-error.ts +0 -7
  358. package/src/global/app-logger.ts +0 -4
  359. package/src/hmr/client/hmr-runtime.ts +0 -152
  360. package/src/hmr/hmr-strategy.ts +0 -172
  361. package/src/hmr/hmr.postcss.test.e2e.ts +0 -41
  362. package/src/hmr/hmr.test.e2e.ts +0 -66
  363. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  364. package/src/hmr/strategies/js-hmr-strategy.ts +0 -320
  365. package/src/index.browser.ts +0 -3
  366. package/src/index.ts +0 -5
  367. package/src/integrations/ghtml/ghtml-renderer.ts +0 -96
  368. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  369. package/src/internal-types.ts +0 -232
  370. package/src/plugins/alias-resolver-plugin.ts +0 -63
  371. package/src/plugins/eco-component-meta-plugin.ts +0 -481
  372. package/src/plugins/integration-plugin.ts +0 -226
  373. package/src/plugins/processor.ts +0 -240
  374. package/src/plugins/runtime-capability.ts +0 -14
  375. package/src/public-types.ts +0 -1317
  376. package/src/route-renderer/component-graph/component-graph-executor.d.ts +0 -32
  377. package/src/route-renderer/component-graph/component-graph-executor.js +0 -31
  378. package/src/route-renderer/component-graph/component-graph-executor.ts +0 -84
  379. package/src/route-renderer/component-graph/component-graph.d.ts +0 -42
  380. package/src/route-renderer/component-graph/component-graph.js +0 -72
  381. package/src/route-renderer/component-graph/component-graph.ts +0 -159
  382. package/src/route-renderer/component-graph/component-marker.d.ts +0 -52
  383. package/src/route-renderer/component-graph/component-marker.js +0 -46
  384. package/src/route-renderer/component-graph/component-marker.ts +0 -117
  385. package/src/route-renderer/component-graph/component-reference.d.ts +0 -10
  386. package/src/route-renderer/component-graph/component-reference.js +0 -19
  387. package/src/route-renderer/component-graph/component-reference.ts +0 -29
  388. package/src/route-renderer/component-graph/marker-graph-resolver.d.ts +0 -77
  389. package/src/route-renderer/component-graph/marker-graph-resolver.js +0 -95
  390. package/src/route-renderer/component-graph/marker-graph-resolver.ts +0 -155
  391. package/src/route-renderer/orchestration/integration-renderer.ts +0 -790
  392. package/src/route-renderer/orchestration/render-execution.service.d.ts +0 -103
  393. package/src/route-renderer/orchestration/render-execution.service.js +0 -121
  394. package/src/route-renderer/orchestration/render-execution.service.ts +0 -230
  395. package/src/route-renderer/orchestration/render-preparation.service.d.ts +0 -121
  396. package/src/route-renderer/orchestration/render-preparation.service.js +0 -332
  397. package/src/route-renderer/orchestration/render-preparation.service.ts +0 -476
  398. package/src/route-renderer/page-loading/dependency-resolver.ts +0 -612
  399. package/src/route-renderer/page-loading/page-module-loader.ts +0 -181
  400. package/src/route-renderer/route-renderer.ts +0 -115
  401. package/src/router/client/link-intent.test.browser.ts +0 -51
  402. package/src/router/client/link-intent.ts +0 -92
  403. package/src/router/client/navigation-coordinator.ts +0 -433
  404. package/src/router/server/fs-router-scanner.d.ts +0 -41
  405. package/src/router/server/fs-router-scanner.js +0 -156
  406. package/src/router/server/fs-router-scanner.ts +0 -219
  407. package/src/router/server/fs-router.d.ts +0 -26
  408. package/src/router/server/fs-router.js +0 -100
  409. package/src/router/server/fs-router.ts +0 -122
  410. package/src/services/assets/asset-processing-service/asset-processing.service.ts +0 -401
  411. package/src/services/assets/asset-processing-service/asset.factory.ts +0 -105
  412. package/src/services/assets/asset-processing-service/assets.types.ts +0 -113
  413. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +0 -95
  414. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +0 -78
  415. package/src/services/assets/asset-processing-service/index.ts +0 -5
  416. package/src/services/assets/asset-processing-service/processor.interface.ts +0 -27
  417. package/src/services/assets/asset-processing-service/processor.registry.ts +0 -18
  418. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +0 -82
  419. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +0 -95
  420. package/src/services/assets/asset-processing-service/processors/index.ts +0 -5
  421. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  422. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  423. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +0 -85
  424. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  425. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -80
  426. package/src/services/assets/browser-bundle.service.ts +0 -53
  427. package/src/services/cache/cache.types.ts +0 -126
  428. package/src/services/cache/index.ts +0 -18
  429. package/src/services/cache/memory-cache-store.ts +0 -130
  430. package/src/services/cache/page-cache-service.ts +0 -202
  431. package/src/services/cache/page-request-cache-coordinator.service.ts +0 -131
  432. package/src/services/html/html-rewriter-provider.service.ts +0 -103
  433. package/src/services/html/html-transformer.service.ts +0 -279
  434. package/src/services/invalidation/development-invalidation.service.ts +0 -261
  435. package/src/services/module-loading/app-server-module-transpiler.service.ts +0 -52
  436. package/src/services/module-loading/page-module-import.service.ts +0 -200
  437. package/src/services/module-loading/server-loader.service.d.ts +0 -96
  438. package/src/services/module-loading/server-loader.service.js +0 -32
  439. package/src/services/module-loading/server-loader.service.ts +0 -130
  440. package/src/services/module-loading/server-module-transpiler.service.ts +0 -105
  441. package/src/services/runtime-manifest/node-runtime-manifest.service.d.ts +0 -35
  442. package/src/services/runtime-manifest/node-runtime-manifest.service.js +0 -60
  443. package/src/services/runtime-manifest/node-runtime-manifest.service.ts +0 -101
  444. package/src/services/runtime-state/dev-graph.service.ts +0 -217
  445. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +0 -136
  446. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +0 -69
  447. package/src/services/runtime-state/runtime-specifier-registry.service.js +0 -37
  448. package/src/services/runtime-state/runtime-specifier-registry.service.ts +0 -96
  449. package/src/services/runtime-state/server-invalidation-state.service.ts +0 -68
  450. package/src/services/validation/schema-validation-service.ts +0 -204
  451. package/src/services/validation/standard-schema.types.ts +0 -68
  452. package/src/static-site-generator/static-site-generator.ts +0 -462
  453. package/src/utils/css.d.ts +0 -1
  454. package/src/utils/css.js +0 -7
  455. package/src/utils/css.ts +0 -5
  456. package/src/utils/deep-merge.ts +0 -47
  457. package/src/utils/hash.ts +0 -5
  458. package/src/utils/html.ts +0 -1
  459. package/src/utils/invariant.ts +0 -15
  460. package/src/utils/locals-utils.ts +0 -37
  461. package/src/utils/parse-cli-args.ts +0 -83
  462. package/src/utils/path-utils.module.ts +0 -14
  463. package/src/utils/resolve-work-dir.ts +0 -45
  464. package/src/utils/runtime.ts +0 -44
  465. package/src/utils/server-utils.module.ts +0 -67
  466. package/src/watchers/project-watcher.test-helpers.ts +0 -41
  467. package/src/watchers/project-watcher.ts +0 -363
  468. /package/src/{internal-types.js → adapters/shared/runtime-host.js} +0 -0
  469. /package/src/{public-types.js → adapters/shared/static-preview-host.js} +0 -0
  470. /package/src/{constants.d.ts → config/constants.d.ts} +0 -0
  471. /package/src/{constants.js → config/constants.js} +0 -0
@@ -1,481 +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 path from 'node:path';
30
- import { parseSync } from 'oxc-parser';
31
- import type { EcoBuildPlugin } from '../build/build-types.ts';
32
- import type { EcoPagesAppConfig } from '../internal-types.ts';
33
- import { fileSystem } from '@ecopages/file-system';
34
- import { rapidhash } from '../utils/hash.ts';
35
-
36
- /**
37
- * Pattern to match regex special characters that need escaping.
38
- * Used when building the file extension filter pattern.
39
- */
40
- const REGEX_SPECIAL_CHARS = /[.*+?^${}()|[\]\\]/g;
41
-
42
- /**
43
- * Set of valid Bun loader extensions.
44
- * Only files with these base extensions can be processed by Bun's loader system.
45
- */
46
- const VALID_LOADER_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);
47
-
48
- /**
49
- * Checks if an extension can be handled by a valid Bun loader.
50
- *
51
- * Compound extensions like `.kita.tsx` are valid because the final
52
- * extension is `.tsx`, which Bun can process.
53
- *
54
- * @param ext - The file extension to check (e.g., '.tsx', '.kita.tsx')
55
- * @returns `true` if the extension ends with a valid loader extension
56
- */
57
- function hasValidLoaderExtension(ext: string): boolean {
58
- for (const validExt of VALID_LOADER_EXTENSIONS) {
59
- if (ext.endsWith(validExt)) {
60
- return true;
61
- }
62
- }
63
- return false;
64
- }
65
-
66
- /**
67
- * Builds a mapping from file extensions to integration names.
68
- *
69
- * The mapping is sorted by extension length (longest first) to ensure
70
- * more specific extensions like `.kita.tsx` are matched before generic
71
- * ones like `.tsx`.
72
- *
73
- * @param integrations - Array of integration configurations from EcoPagesAppConfig
74
- * @returns Array of [extension, integrationName] tuples, sorted by specificity
75
- *
76
- * @example
77
- * ```typescript
78
- * const map = buildExtensionToIntegrationMap([
79
- * { name: 'kitajs', extensions: ['.kita.tsx'] },
80
- * { name: 'react', extensions: ['.tsx'] },
81
- * ]);
82
- * // Returns: [['.kita.tsx', 'kitajs'], ['.tsx', 'react']]
83
- * ```
84
- */
85
- function buildExtensionToIntegrationMap(integrations: EcoPagesAppConfig['integrations']): [string, string][] {
86
- const mapping: [string, string][] = [];
87
-
88
- for (const integration of integrations) {
89
- for (const ext of integration.extensions) {
90
- mapping.push([ext, integration.name]);
91
- }
92
- }
93
-
94
- mapping.sort((a, b) => b[0].length - a[0].length);
95
-
96
- return mapping;
97
- }
98
-
99
- /**
100
- * Detects the integration type for a file based on its extension.
101
- *
102
- * Uses the pre-sorted extension-to-integration map to find the most
103
- * specific matching extension.
104
- *
105
- * @param filePath - Absolute path to the file
106
- * @param extensionToIntegration - Pre-built extension mapping from buildExtensionToIntegrationMap
107
- * @returns The integration identifier (e.g., 'react', 'kitajs', 'lit', 'ghtml')
108
- */
109
- function detectIntegration(filePath: string, extensionToIntegration: [string, string][]): string {
110
- for (const [ext, integration] of extensionToIntegration) {
111
- if (filePath.endsWith(ext)) {
112
- return integration;
113
- }
114
- }
115
- return 'ghtml';
116
- }
117
-
118
- /**
119
- * Creates a RegExp pattern that matches files with any of the configured extensions.
120
- *
121
- * The pattern also matches optional query strings (e.g., `file.tsx?update=123`)
122
- * which are used for cache-busting in development mode.
123
- *
124
- * @param extensions - Array of file extensions to match
125
- * @returns RegExp pattern for use with Bun's onLoad filter
126
- * @throws Error if no extensions are provided
127
- *
128
- * @example
129
- * ```typescript
130
- * const pattern = createExtensionPattern(['.tsx', '.kita.tsx']);
131
- * pattern.test('component.tsx'); // true
132
- * pattern.test('component.tsx?v=123'); // true
133
- * pattern.test('component.ts'); // false
134
- * ```
135
- */
136
- function createExtensionPattern(extensions: string[]): RegExp {
137
- if (extensions.length === 0) {
138
- throw new Error('[eco-component-meta-plugin] No extensions configured. At least one integration is required.');
139
- }
140
- const uniqueExtensions = [...new Set(extensions)];
141
- const escaped = uniqueExtensions.map((ext) => ext.replace(REGEX_SPECIAL_CHARS, '\\$&'));
142
- return new RegExp(`(${escaped.join('|')})(\\?.*)?$`);
143
- }
144
-
145
- /**
146
- * Options for creating the eco-component-meta-plugin.
147
- */
148
- export interface EcoComponentDirPluginOptions {
149
- /** The EcoPages application configuration containing integration settings */
150
- config: EcoPagesAppConfig;
151
- }
152
-
153
- /**
154
- * Creates a build plugin that auto-injects `__eco` metadata into EcoComponent config objects.
155
- *
156
- * This plugin intercepts file loading for all integration-compatible files and:
157
- * 1. Strips any query string from the file path (for dev mode cache-busting)
158
- * 2. Reads the file contents
159
- * 3. Parses the AST using oxc-parser to find injection points
160
- * 4. Injects `__eco: { id: "...", file: "...", integration: "..." }` into config objects
161
- * 5. Returns the transformed content with the appropriate loader
162
- *
163
- * Supported patterns:
164
- * - `eco.page({ ... })` - Page component declarations
165
- * - `eco.component({ ... })` - Reusable component declarations
166
- * - `eco.html({ ... })` - HTML shell declarations
167
- * - `eco.layout({ ... })` - Layout declarations
168
- * - `Component.config = { ... }` - Config assignment pattern
169
- * - `config: { ... }` - Config property in object literals
170
- * - `export const config = { ... }` - Exported config declarations
171
- *
172
- * @param options - Plugin options containing the EcoPages config
173
- * @returns A build plugin instance ready for registration
174
- *
175
- * @example
176
- * ```typescript
177
- * import { createEcoComponentMetaPlugin } from '@ecopages/core';
178
- *
179
- * const plugin = createEcoComponentMetaPlugin({ config: appConfig });
180
- * appConfig.loaders.set(plugin.name, plugin);
181
- * ```
182
- */
183
- export function createEcoComponentMetaPlugin(options: EcoComponentDirPluginOptions): EcoBuildPlugin {
184
- return {
185
- name: 'eco-component-meta-plugin',
186
- setup(build) {
187
- const allExtensions = options.config.integrations
188
- .flatMap((integration) => integration.extensions)
189
- .filter(hasValidLoaderExtension);
190
-
191
- if (allExtensions.length === 0) {
192
- return;
193
- }
194
-
195
- const extensionPattern = createExtensionPattern(allExtensions);
196
- const extensionToIntegration = buildExtensionToIntegrationMap(options.config.integrations);
197
-
198
- build.onLoad({ filter: extensionPattern }, (args) => {
199
- const filePath = args.path.split('?')[0];
200
- const contents = fileSystem.readFileSync(filePath);
201
- const integration = detectIntegration(filePath, extensionToIntegration);
202
- const transformedContents = injectEcoMeta(contents, filePath, integration);
203
-
204
- const ext = path.extname(filePath).slice(1) as 'ts' | 'tsx' | 'js' | 'jsx';
205
-
206
- return {
207
- contents: transformedContents,
208
- loader: ext || 'ts',
209
- };
210
- });
211
- },
212
- };
213
- }
214
-
215
- /**
216
- * Represents a text insertion to be made in the source code.
217
- */
218
- interface Insertion {
219
- /** Character position in the source where text should be inserted */
220
- position: number;
221
- /** The text to insert at the position */
222
- text: string;
223
- }
224
-
225
- /**
226
- * Recursively walks the AST (Abstract Syntax Tree) to find all injection points for `__eco` metadata.
227
- *
228
- * ## What is an AST?
229
- *
230
- * An AST is a tree representation of source code. Instead of treating code as text,
231
- * a parser breaks it down into a structured tree where each node represents a
232
- * syntactic construct (variable, function call, object, etc.).
233
- *
234
- * For example, this code:
235
- * ```typescript
236
- * eco.page({ render: () => 'hi' })
237
- * ```
238
- *
239
- * Becomes an AST like:
240
- * ```
241
- * CallExpression
242
- * ├── callee: MemberExpression
243
- * │ ├── object: Identifier (name: "eco")
244
- * │ └── property: Identifier (name: "page")
245
- * └── arguments: [
246
- * └── ObjectExpression (start: 9) <-- We inject here at position 10 (after "{")
247
- * └── properties: [...]
248
- * ]
249
- * ```
250
- *
251
- * ## How this function works
252
- *
253
- * 1. **Recursive traversal**: Visits every node in the tree, checking each one
254
- * 2. **Pattern matching**: Checks if the current node matches one of our target patterns
255
- * 3. **Position tracking**: When a match is found, records the `start` position of the
256
- * config object (the character index in the original source where `{` appears)
257
- * 4. **Insertion offset**: Adds +1 to insert right after the opening `{`
258
- *
259
- * ## Supported patterns
260
- *
261
- * | Pattern | AST Node Type | Example | File Types |
262
- * |---------|---------------|---------|------------|
263
- * | `eco.page({...})` | CallExpression | `export default eco.page({ render: () => 'hi' })` | All |
264
- * | `eco.component({...})` | CallExpression | `export const Btn = eco.component({ render: () => '<button/>' })` | All |
265
- * | `eco.html({...})` | CallExpression | `export default eco.html({ render: () => '<html />' })` | All |
266
- * | `eco.layout({...})` | CallExpression | `export const MainLayout = eco.layout({ render: () => '<main />' })` | All |
267
- * | `X.config = {...}` | AssignmentExpression | `MyComponent.config = { dependencies: [] }` | All |
268
- * | `config: {...}` | ObjectProperty | `const X: EcoComponent = { config: {...} }` | EcoComponent-typed only |
269
- *
270
- * ## Why AST over regex?
271
- *
272
- * Regex would fail on edge cases like:
273
- * - `eco.page<ComplexType<(arg: string) => void>>({...})` - generics with arrows
274
- * - `// eco.page({ commented out })` - comments
275
- * - `const str = "eco.page({ in a string })"` - string literals
276
- * - Nested objects that look like config patterns
277
- *
278
- * AST parsing understands the actual code structure, not just text patterns.
279
- *
280
- * @param node - Current AST node being visited (starts with the root Program node)
281
- * @param insertions - Array to collect insertion points (mutated by this function)
282
- * @param injection - The injection text to insert at each point (e.g., ` __eco: {...},`)
283
- * @param isInsideEcoComponent - Whether we're inside an EcoComponent-typed declaration
284
- */
285
- function findInjectionPoints(
286
- node: unknown,
287
- insertions: Insertion[],
288
- injection: string,
289
- isInsideEcoComponent = false,
290
- ): void {
291
- if (!node || typeof node !== 'object') return;
292
-
293
- const n = node as Record<string, unknown>;
294
-
295
- /**
296
- * Pattern 1: eco.page({...}), eco.component({...}), eco.html({...}), or eco.layout({...})
297
- * AST structure: CallExpression with MemberExpression callee where object is "eco"
298
- */
299
- if (n.type === 'CallExpression') {
300
- const callee = n.callee as Record<string, unknown> | undefined;
301
-
302
- /**
303
- * MemberExpression represents "something.property" syntax.
304
- * StaticMemberExpression is oxc's variant for computed vs non-computed access.
305
- */
306
- if (callee?.type === 'MemberExpression' || callee?.type === 'StaticMemberExpression') {
307
- const obj = callee.object as Record<string, unknown> | undefined;
308
- const prop = callee.property as Record<string, unknown> | undefined;
309
-
310
- /** Check: is this `eco.page(...)`, `eco.component(...)`, `eco.html(...)`, or `eco.layout(...)`? */
311
- if (
312
- obj?.type === 'Identifier' &&
313
- obj?.name === 'eco' &&
314
- (prop?.name === 'page' ||
315
- prop?.name === 'component' ||
316
- prop?.name === 'html' ||
317
- prop?.name === 'layout')
318
- ) {
319
- /** Get the first argument - should be an object literal {...} */
320
- const args = n.arguments as Array<Record<string, unknown>> | undefined;
321
- const firstArg = args?.[0];
322
- if (firstArg?.type === 'ObjectExpression') {
323
- /**
324
- * `start` is the character index where this object begins (the "{").
325
- * Insert at position+1 to place content right after "{".
326
- */
327
- const start = firstArg.start as number | undefined;
328
- if (typeof start === 'number') {
329
- insertions.push({ position: start + 1, text: injection });
330
- }
331
- }
332
- }
333
- }
334
- }
335
-
336
- /**
337
- * Pattern 2: Something.config = {...}
338
- * AST structure: AssignmentExpression with MemberExpression left side ending in "config"
339
- * This pattern is safe for all files because it requires a qualifier (e.g., MyComponent.config).
340
- */
341
- if (n.type === 'AssignmentExpression') {
342
- const left = n.left as Record<string, unknown> | undefined;
343
- const right = n.right as Record<string, unknown> | undefined;
344
-
345
- /** Case: MyComponent.config = {...} */
346
- if (left?.type === 'MemberExpression' || left?.type === 'StaticMemberExpression') {
347
- const prop = left.property as Record<string, unknown> | undefined;
348
- if (prop?.name === 'config' && right?.type === 'ObjectExpression') {
349
- const start = right.start as number | undefined;
350
- if (typeof start === 'number') {
351
- insertions.push({ position: start + 1, text: injection });
352
- }
353
- }
354
- }
355
- }
356
-
357
- /**
358
- * Pattern 3: { config: {...} } - config as an object property inside EcoComponent
359
- * AST structure: ObjectProperty/Property with key "config" and value as ObjectExpression
360
- *
361
- * This pattern is matched when the parent VariableDeclarator has a type annotation
362
- * containing "EcoComponent", e.g., `const X: EcoComponent = { config: {...} }`
363
- *
364
- * We track whether we're inside an EcoComponent-typed object via the `isInsideEcoComponent` flag.
365
- */
366
- if (n.type === 'ObjectProperty' || n.type === 'Property') {
367
- const key = n.key as Record<string, unknown> | undefined;
368
- const value = n.value as Record<string, unknown> | undefined;
369
-
370
- if (
371
- (key?.type === 'Identifier' || key?.type === 'IdentifierName') &&
372
- key?.name === 'config' &&
373
- value?.type === 'ObjectExpression' &&
374
- isInsideEcoComponent
375
- ) {
376
- const start = value.start as number | undefined;
377
- if (typeof start === 'number') {
378
- insertions.push({ position: start + 1, text: injection });
379
- }
380
- }
381
- }
382
-
383
- /**
384
- * Check if we're entering an EcoComponent-typed variable declaration.
385
- * This sets a flag for child nodes to know they're inside an EcoComponent.
386
- *
387
- * Type annotation is on the `id` (Identifier), not the VariableDeclarator directly.
388
- * e.g., `const X: EcoComponent = {...}` has the annotation on the "X" Identifier.
389
- */
390
- let childIsInsideEcoComponent = isInsideEcoComponent;
391
- if (n.type === 'VariableDeclarator') {
392
- const id = n.id as Record<string, unknown> | undefined;
393
- const typeAnnotation = id?.typeAnnotation as Record<string, unknown> | undefined;
394
- if (typeAnnotation) {
395
- const typeStr = JSON.stringify(typeAnnotation);
396
- if (typeStr.includes('EcoComponent')) {
397
- childIsInsideEcoComponent = true;
398
- }
399
- }
400
- }
401
-
402
- /**
403
- * Recursive traversal: Visit all child nodes in the AST.
404
- *
405
- * This is how we "walk" the tree - for each property of the current node,
406
- * if it's an array (like `body` containing statements) or an object (like `callee`),
407
- * we recursively call findInjectionPoints on it.
408
- * We skip metadata properties (start, end, type) that don't contain child nodes.
409
- */
410
- for (const key in n) {
411
- if (key === 'start' || key === 'end' || key === 'type') continue;
412
-
413
- const value = n[key];
414
- if (Array.isArray(value)) {
415
- for (const child of value) {
416
- findInjectionPoints(child, insertions, injection, childIsInsideEcoComponent);
417
- }
418
- } else if (typeof value === 'object' && value !== null) {
419
- findInjectionPoints(value, insertions, injection, childIsInsideEcoComponent);
420
- }
421
- }
422
- }
423
-
424
- /**
425
- * Injects `__eco` metadata into EcoComponent config objects in file content.
426
- *
427
- * Uses oxc-parser for robust AST-based code analysis, which handles edge cases
428
- * that regex-based approaches would miss (e.g., complex generics, nested objects,
429
- * comments, string literals containing similar patterns).
430
- *
431
- * The injection is performed by:
432
- * 1. Parsing the source code into an AST
433
- * 2. Walking the AST to find all config object patterns
434
- * 3. Collecting insertion points (sorted in reverse order to preserve positions)
435
- * 4. Inserting the `__eco` property at each point
436
- *
437
- * @param contents - The source code content to transform
438
- * @param filePath - Absolute path to the file (used to derive the directory)
439
- * @param integration - The integration identifier for this file type
440
- * @returns Transformed source code with `__eco` injected, or original if no patterns found
441
- *
442
- * @example
443
- * ```typescript
444
- * const result = injectEcoMeta(
445
- * 'export default eco.page({ render: () => "<div>Hi</div>" });',
446
- * '/app/src/pages/index.tsx',
447
- * 'react'
448
- * );
449
- * // Result: 'export default eco.page({ __eco: { id: "<hash>", file: "/app/src/pages/index.tsx", integration: "react" }, render: () => "<div>Hi</div>" });'
450
- * ```
451
- */
452
- export function injectEcoMeta(contents: string, filePath: string, integration: string): string {
453
- const result = parseSync(filePath, contents);
454
-
455
- if (result.errors.length > 0) {
456
- console.warn(`[eco-component-meta-plugin] Parse errors in ${filePath}:`, result.errors);
457
- return contents;
458
- }
459
-
460
- const ast = result.program;
461
- const id = rapidhash(filePath).toString(36);
462
- const injection = ` __eco: { id: "${id}", file: "${filePath}", integration: "${integration}" },`;
463
-
464
- const insertions: Insertion[] = [];
465
- findInjectionPoints(ast, insertions, injection);
466
-
467
- if (insertions.length === 0) {
468
- return contents;
469
- }
470
-
471
- insertions.sort((a, b) => b.position - a.position);
472
-
473
- let transformed = contents;
474
- for (const { position, text } of insertions) {
475
- transformed = transformed.slice(0, position) + text + transformed.slice(position);
476
- }
477
-
478
- return transformed;
479
- }
480
-
481
- export default createEcoComponentMetaPlugin;
@@ -1,226 +0,0 @@
1
- import type { EcoBuildPlugin } from '../build/build-types';
2
- import type { EcoPagesAppConfig, IHmrManager } from '../internal-types';
3
- import type { HmrStrategy } from '../hmr/hmr-strategy';
4
- import type { EcoComponent, EcoPagesElement } from '../public-types';
5
- import type { IntegrationRenderer } from '../route-renderer/orchestration/integration-renderer';
6
- import { AssetProcessingService } from '../services/assets/asset-processing-service/asset-processing.service';
7
- import type { AssetDefinition, ProcessedAsset } from '../services/assets/asset-processing-service/assets.types';
8
- import type { RuntimeCapabilityDeclaration } from './runtime-capability.ts';
9
-
10
- export type { RuntimeCapabilityDeclaration, RuntimeCapabilityTag } from './runtime-capability.ts';
11
-
12
- export const INTEGRATION_PLUGIN_ERRORS = {
13
- NOT_INITIALIZED_WITH_APP_CONFIG: 'Plugin not initialized with app config',
14
- NOT_INITIALIZED_WITH_ASSET_SERVICE: 'Plugin not initialized with asset dependency service',
15
- } as const;
16
-
17
- export interface IntegrationPluginConfig {
18
- /**
19
- * The name of the integration plugin.
20
- */
21
- name: string;
22
- /**
23
- * The extensions that this plugin supports (e.g., ['.kita.js', '.kita.tsx']).
24
- */
25
- extensions: string[];
26
- /**
27
- * The dependencies that this plugin requires on a global level.
28
- * These dependencies will be resolved during the setup process and injected into the global scope of the application.
29
- * They are not specific to any particular page or component.
30
- */
31
- integrationDependencies?: AssetDefinition[];
32
- /**
33
- * The strategy to use for static building.
34
- * - 'render': Execute component function directly (faster, efficient).
35
- * - 'fetch': Start server and fetch URL (slower, needed for some SSR like Lit).
36
- * @default 'render'
37
- */
38
- staticBuildStep?: 'render' | 'fetch';
39
- /**
40
- * Declares runtime-specific requirements that must be satisfied before the
41
- * app can start with this integration enabled.
42
- */
43
- runtimeCapability?: RuntimeCapabilityDeclaration;
44
- }
45
-
46
- /**
47
- * Metadata used by integration-owned boundary policy.
48
- *
49
- * This payload describes the currently active integration pass together with the
50
- * target component boundary being entered.
51
- */
52
- export type ComponentBoundaryPolicyInput = {
53
- currentIntegration: string;
54
- targetIntegration?: string;
55
- component: EcoComponent;
56
- };
57
-
58
- type RendererClass<C> = new (options: {
59
- appConfig: EcoPagesAppConfig;
60
- assetProcessingService: AssetProcessingService;
61
- resolvedIntegrationDependencies: ProcessedAsset[];
62
- runtimeOrigin: string;
63
- }) => IntegrationRenderer<C>;
64
-
65
- export abstract class IntegrationPlugin<C = EcoPagesElement> {
66
- readonly name: string;
67
- readonly extensions: string[];
68
- abstract renderer: RendererClass<C>;
69
- readonly staticBuildStep: 'render' | 'fetch';
70
- readonly runtimeCapability?: RuntimeCapabilityDeclaration;
71
-
72
- protected integrationDependencies: AssetDefinition[];
73
- protected resolvedIntegrationDependencies: ProcessedAsset[] = [];
74
- protected options?: Record<string, unknown>;
75
- protected appConfig?: EcoPagesAppConfig;
76
- protected assetProcessingService?: AssetProcessingService;
77
- protected hmrManager?: IHmrManager;
78
- declare runtimeOrigin: string;
79
-
80
- get plugins(): EcoBuildPlugin[] {
81
- return [];
82
- }
83
-
84
- constructor(config: IntegrationPluginConfig) {
85
- this.name = config.name;
86
- this.extensions = config.extensions;
87
- this.integrationDependencies = config.integrationDependencies || [];
88
- this.staticBuildStep = config.staticBuildStep || 'render';
89
- this.runtimeCapability = config.runtimeCapability;
90
- }
91
-
92
- setConfig(appConfig: EcoPagesAppConfig): void {
93
- this.appConfig = appConfig;
94
- this.initializeAssetDefinitionService();
95
- }
96
-
97
- setRuntimeOrigin(runtimeOrigin: string) {
98
- this.runtimeOrigin = runtimeOrigin;
99
- }
100
-
101
- /**
102
- * Returns an HMR strategy for this integration, if applicable.
103
- * The strategy will be registered with the HmrManager during initialization.
104
- *
105
- * @returns HmrStrategy instance or undefined if no custom HMR handling needed
106
- *
107
- * @example
108
- * ```typescript
109
- * getHmrStrategy(): HmrStrategy {
110
- * const context = this.hmrManager!.getDefaultContext();
111
- * return new ReactHmrStrategy(context);
112
- * }
113
- * ```
114
- */
115
- getHmrStrategy?(): HmrStrategy | undefined;
116
-
117
- /**
118
- * Returns bare-specifier mappings that should be registered in the active
119
- * runtime specifier registry.
120
- *
121
- * @remarks
122
- * Override this when the integration owns browser runtime bundles that must
123
- * be addressable from client-side imports through stable bare specifiers.
124
- *
125
- * Today these mappings are consumed by the development runtime and browser
126
- * bundle aliasing path. They are intentionally generic enough to grow into a
127
- * broader import-map-style facility later without moving framework-specific
128
- * map contents into core.
129
- */
130
- getRuntimeSpecifierMap(): Record<string, string> {
131
- return {};
132
- }
133
-
134
- setHmrManager(hmrManager: IHmrManager) {
135
- this.hmrManager = hmrManager;
136
- hmrManager.registerSpecifierMap(this.getRuntimeSpecifierMap());
137
-
138
- const strategy = this.getHmrStrategy?.();
139
- if (strategy) {
140
- hmrManager.registerStrategy(strategy);
141
- }
142
-
143
- if (this.assetProcessingService) {
144
- this.assetProcessingService.setHmrManager(hmrManager);
145
- }
146
- }
147
-
148
- initializeAssetDefinitionService(): void {
149
- if (!this.appConfig) throw new Error(INTEGRATION_PLUGIN_ERRORS.NOT_INITIALIZED_WITH_APP_CONFIG);
150
-
151
- this.assetProcessingService = AssetProcessingService.createWithDefaultProcessors(this.appConfig);
152
- if (this.hmrManager) {
153
- this.assetProcessingService.setHmrManager(this.hmrManager);
154
- }
155
- }
156
-
157
- getResolvedIntegrationDependencies(): ProcessedAsset[] {
158
- return this.resolvedIntegrationDependencies;
159
- }
160
-
161
- initializeRenderer(): IntegrationRenderer<C> {
162
- if (!this.appConfig) {
163
- throw new Error(INTEGRATION_PLUGIN_ERRORS.NOT_INITIALIZED_WITH_APP_CONFIG);
164
- }
165
-
166
- const assetProcessingService = AssetProcessingService.createWithDefaultProcessors(this.appConfig);
167
- if (this.hmrManager) {
168
- assetProcessingService.setHmrManager(this.hmrManager);
169
- }
170
-
171
- const renderer = new this.renderer({
172
- appConfig: this.appConfig,
173
- assetProcessingService,
174
- resolvedIntegrationDependencies: this.resolvedIntegrationDependencies,
175
- runtimeOrigin: this.runtimeOrigin,
176
- });
177
-
178
- if (this.hmrManager) {
179
- renderer.setHmrManager(this.hmrManager);
180
- }
181
-
182
- return renderer;
183
- }
184
-
185
- /**
186
- * Declares whether a component boundary targeting this integration should be
187
- * deferred through the marker pipeline.
188
- *
189
- * The default implementation never defers. Integrations that require deferred
190
- * subtree rendering should override this method and return `true` when their
191
- * boundary must be resolved during the marker graph stage.
192
- *
193
- * @param input Boundary metadata for the current render pass.
194
- * @returns `true` when the boundary should be deferred; otherwise `false`.
195
- */
196
- shouldDeferComponentBoundary(_input: ComponentBoundaryPolicyInput): boolean {
197
- return false;
198
- }
199
-
200
- /**
201
- * Prepares build-facing contributions before the app build manifest is sealed.
202
- *
203
- * @remarks
204
- * Override this when an integration needs to materialize runtime/build plugin
205
- * declarations ahead of runtime startup. Keep runtime-only side effects out of
206
- * this hook; they belong in `setup()`.
207
- */
208
- async prepareBuildContributions(): Promise<void> {}
209
-
210
- /**
211
- * Performs runtime-only integration setup after config build has already
212
- * sealed manifest contributions.
213
- */
214
- async setup(): Promise<void> {
215
- if (this.integrationDependencies.length === 0) return;
216
- if (!this.assetProcessingService) throw new Error(INTEGRATION_PLUGIN_ERRORS.NOT_INITIALIZED_WITH_ASSET_SERVICE);
217
-
218
- this.resolvedIntegrationDependencies = await this.assetProcessingService.processDependencies(
219
- this.integrationDependencies,
220
- this.name,
221
- );
222
-
223
- this.initializeRenderer();
224
- }
225
- async teardown(): Promise<void> {}
226
- }