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

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