@ecopages/core 0.2.0-alpha.9 → 0.2.1

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 (357) hide show
  1. package/CHANGELOG.md +18 -11
  2. package/README.md +23 -26
  3. package/package.json +76 -58
  4. package/src/adapters/README.md +2 -2
  5. package/src/adapters/abstract/application-adapter.d.ts +28 -2
  6. package/src/adapters/abstract/application-adapter.js +14 -2
  7. package/src/adapters/abstract/router-adapter.d.ts +1 -1
  8. package/src/adapters/abstract/server-adapter.d.ts +2 -2
  9. package/src/adapters/bun/client-bridge.d.ts +1 -1
  10. package/src/adapters/bun/create-app.d.ts +4 -12
  11. package/src/adapters/bun/create-app.js +4 -5
  12. package/src/adapters/bun/hmr-manager.d.ts +4 -4
  13. package/src/adapters/bun/hmr-manager.js +8 -8
  14. package/src/adapters/bun/index.d.ts +1 -1
  15. package/src/adapters/bun/index.js +2 -2
  16. package/src/adapters/bun/server-adapter.d.ts +5 -5
  17. package/src/adapters/bun/server-adapter.js +6 -5
  18. package/src/adapters/bun/server-lifecycle.d.ts +4 -4
  19. package/src/adapters/bun/server-lifecycle.js +2 -2
  20. package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
  21. package/src/{create-app.js → adapters/create-app.js} +4 -4
  22. package/src/adapters/index.d.ts +1 -5
  23. package/src/adapters/index.js +1 -7
  24. package/src/adapters/node/create-app.d.ts +6 -9
  25. package/src/adapters/node/create-app.js +12 -6
  26. package/src/adapters/node/node-client-bridge.d.ts +1 -1
  27. package/src/adapters/node/node-hmr-manager.d.ts +2 -2
  28. package/src/adapters/node/node-hmr-manager.js +3 -3
  29. package/src/adapters/node/server-adapter.d.ts +4 -4
  30. package/src/adapters/node/server-adapter.js +13 -12
  31. package/src/adapters/node/static-content-server.d.ts +1 -1
  32. package/src/adapters/node/static-content-server.js +1 -1
  33. package/src/adapters/shared/application-adapter.d.ts +1 -1
  34. package/src/adapters/shared/define-api-handler.d.ts +1 -1
  35. package/src/adapters/shared/explicit-static-route-matcher.d.ts +2 -2
  36. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +1 -1
  37. package/src/adapters/shared/fs-server-response-factory.d.ts +2 -2
  38. package/src/adapters/shared/fs-server-response-factory.js +1 -1
  39. package/src/adapters/shared/fs-server-response-matcher.d.ts +1 -1
  40. package/src/adapters/shared/hmr-entrypoint-registrar.js +1 -1
  41. package/src/adapters/shared/hmr-html-response.d.ts +1 -1
  42. package/src/adapters/shared/render-context.d.ts +2 -1
  43. package/src/adapters/shared/render-context.js +3 -1
  44. package/src/adapters/shared/runtime-bootstrap.d.ts +1 -1
  45. package/src/adapters/shared/runtime-bootstrap.js +1 -1
  46. package/src/adapters/shared/server-adapter.d.ts +1 -1
  47. package/src/adapters/shared/server-adapter.js +5 -1
  48. package/src/adapters/shared/server-route-handler.d.ts +4 -4
  49. package/src/adapters/shared/server-route-handler.js +3 -3
  50. package/src/adapters/shared/server-static-builder.d.ts +5 -5
  51. package/src/adapters/shared/server-static-builder.js +5 -4
  52. package/src/build/README.md +19 -13
  53. package/src/build/build-adapter.d.ts +67 -20
  54. package/src/build/build-adapter.js +420 -19
  55. package/src/build/dev-build-coordinator.d.ts +10 -12
  56. package/src/build/dev-build-coordinator.js +8 -15
  57. package/src/build/esbuild-build-adapter.d.ts +6 -0
  58. package/src/build/esbuild-build-adapter.js +94 -11
  59. package/src/build/runtime-build-executor.d.ts +5 -4
  60. package/src/build/runtime-build-executor.js +5 -3
  61. package/src/build/runtime-specifier-alias-plugin.js +19 -15
  62. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  63. package/src/build/runtime-specifier-aliases.js +95 -0
  64. package/src/config/README.md +5 -2
  65. package/src/config/config-builder.d.ts +25 -2
  66. package/src/config/config-builder.js +44 -7
  67. package/src/declarations.d.ts +1 -1
  68. package/src/dev/sc-server.d.ts +1 -1
  69. package/src/dev/sc-server.js +1 -1
  70. package/src/eco/eco.browser.d.ts +2 -0
  71. package/src/eco/eco.browser.js +83 -0
  72. package/src/eco/eco.js +19 -48
  73. package/src/eco/eco.types.d.ts +1 -1
  74. package/src/eco/eco.utils.d.ts +1 -40
  75. package/src/eco/eco.utils.js +5 -35
  76. package/src/eco/global-injector-map.d.ts +1 -1
  77. package/src/eco/lazy-injector-map.d.ts +1 -1
  78. package/src/hmr/hmr-strategy.d.ts +16 -13
  79. package/src/hmr/hmr-strategy.js +22 -7
  80. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  81. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  82. package/src/hmr/strategies/js-hmr-strategy.d.ts +2 -2
  83. package/src/hmr/strategies/js-hmr-strategy.js +2 -2
  84. package/src/index.browser.d.ts +2 -2
  85. package/src/index.browser.js +1 -1
  86. package/src/index.d.ts +3 -2
  87. package/src/index.js +15 -4
  88. package/src/integrations/ghtml/ghtml-renderer.d.ts +6 -1
  89. package/src/integrations/ghtml/ghtml-renderer.js +29 -28
  90. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -2
  91. package/src/integrations/ghtml/ghtml.plugin.js +2 -2
  92. package/src/plugins/README.md +1 -0
  93. package/src/plugins/eco-component-meta-plugin.d.ts +12 -1
  94. package/src/plugins/eco-component-meta-plugin.js +26 -20
  95. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  96. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  97. package/src/plugins/integration-plugin.d.ts +99 -33
  98. package/src/plugins/integration-plugin.js +68 -21
  99. package/src/plugins/processor.d.ts +2 -2
  100. package/src/plugins/processor.js +2 -2
  101. package/src/plugins/source-transform.d.ts +46 -0
  102. package/src/plugins/source-transform.js +71 -0
  103. package/src/route-renderer/GRAPH.md +54 -84
  104. package/src/route-renderer/README.md +14 -20
  105. package/src/route-renderer/orchestration/component-render-context.d.ts +83 -0
  106. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  107. package/src/route-renderer/orchestration/integration-renderer.d.ts +233 -76
  108. package/src/route-renderer/orchestration/integration-renderer.js +500 -143
  109. package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +93 -0
  110. package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +155 -0
  111. package/src/route-renderer/orchestration/render-execution.service.d.ts +11 -71
  112. package/src/route-renderer/orchestration/render-execution.service.js +65 -80
  113. package/src/{eco/eco.utils.ts → route-renderer/orchestration/render-output.utils.d.ts} +10 -53
  114. package/src/route-renderer/orchestration/render-output.utils.js +65 -0
  115. package/src/route-renderer/orchestration/render-preparation.service.d.ts +2 -8
  116. package/src/route-renderer/orchestration/render-preparation.service.js +10 -17
  117. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  118. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  119. package/src/route-renderer/page-loading/dependency-resolver.d.ts +2 -2
  120. package/src/route-renderer/page-loading/dependency-resolver.js +10 -8
  121. package/src/route-renderer/page-loading/page-module-loader.d.ts +6 -4
  122. package/src/route-renderer/page-loading/page-module-loader.js +7 -5
  123. package/src/route-renderer/route-renderer.d.ts +5 -3
  124. package/src/route-renderer/route-renderer.js +13 -3
  125. package/src/router/README.md +79 -8
  126. package/src/router/client/navigation-coordinator.js +2 -2
  127. package/src/router/server/fs-router-scanner.d.ts +1 -1
  128. package/src/router/server/fs-router-scanner.js +6 -1
  129. package/src/router/server/fs-router.d.ts +1 -1
  130. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +3 -3
  131. package/src/services/assets/asset-processing-service/asset-processing.service.js +6 -6
  132. package/src/services/assets/asset-processing-service/asset.factory.d.ts +1 -1
  133. package/src/services/assets/asset-processing-service/asset.factory.js +2 -2
  134. package/src/services/assets/asset-processing-service/index.d.ts +5 -5
  135. package/src/services/assets/asset-processing-service/index.js +5 -5
  136. package/src/services/assets/asset-processing-service/processor.interface.d.ts +2 -2
  137. package/src/services/assets/asset-processing-service/processor.registry.d.ts +2 -2
  138. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +1 -1
  139. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +1 -1
  140. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +3 -3
  141. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +2 -2
  142. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -5
  143. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  144. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +2 -2
  145. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +1 -1
  146. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +4 -3
  147. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +15 -3
  148. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +3 -3
  149. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +1 -1
  150. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +2 -2
  151. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +1 -1
  152. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  153. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +1 -1
  154. package/src/services/assets/browser-bundle.service.d.ts +1 -1
  155. package/src/services/assets/browser-bundle.service.js +2 -2
  156. package/src/services/html/html-rewriter-provider.service.js +4 -1
  157. package/src/services/html/html-transformer.service.d.ts +2 -2
  158. package/src/services/html/html-transformer.service.js +4 -10
  159. package/src/services/invalidation/development-invalidation.service.d.ts +1 -1
  160. package/src/services/invalidation/development-invalidation.service.js +1 -0
  161. package/src/services/module-loading/app-module-loader.service.d.ts +25 -0
  162. package/src/services/module-loading/app-module-loader.service.js +31 -0
  163. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +9 -1
  164. package/src/services/module-loading/app-server-module-transpiler.service.js +77 -2
  165. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  166. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  167. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  168. package/src/{adapters/node/bootstrap-dependency-resolver.d.ts → services/module-loading/node-bootstrap-plugin.d.ts} +2 -24
  169. package/src/{adapters/node/bootstrap-dependency-resolver.js → services/module-loading/node-bootstrap-plugin.js} +42 -22
  170. package/src/services/module-loading/page-module-import.service.d.ts +4 -0
  171. package/src/services/module-loading/page-module-import.service.js +38 -9
  172. package/src/services/module-loading/server-module-transpiler.service.d.ts +3 -0
  173. package/src/services/module-loading/server-module-transpiler.service.js +4 -1
  174. package/src/services/runtime-state/dev-graph.service.d.ts +6 -6
  175. package/src/services/runtime-state/dev-graph.service.js +10 -10
  176. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +1 -1
  177. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +1 -1
  178. package/src/services/runtime-state/server-invalidation-state.service.d.ts +1 -1
  179. package/src/static-site-generator/static-site-generator.d.ts +2 -2
  180. package/src/static-site-generator/static-site-generator.js +1 -1
  181. package/src/{internal-types.d.ts → types/internal-types.d.ts} +24 -14
  182. package/src/{public-types.d.ts → types/public-types.d.ts} +30 -14
  183. package/src/types/public-types.js +0 -0
  184. package/src/utils/html-escaping.d.ts +7 -0
  185. package/src/utils/html-escaping.js +6 -0
  186. package/src/utils/locals-utils.d.ts +1 -1
  187. package/src/utils/parse-cli-args.d.ts +4 -1
  188. package/src/utils/parse-cli-args.js +16 -1
  189. package/src/utils/resolve-work-dir.js +1 -1
  190. package/src/watchers/project-watcher.d.ts +4 -4
  191. package/src/watchers/project-watcher.js +4 -10
  192. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  193. package/src/adapters/abstract/application-adapter.ts +0 -337
  194. package/src/adapters/abstract/router-adapter.ts +0 -30
  195. package/src/adapters/abstract/server-adapter.ts +0 -79
  196. package/src/adapters/bun/client-bridge.ts +0 -62
  197. package/src/adapters/bun/create-app.ts +0 -189
  198. package/src/adapters/bun/hmr-manager.ts +0 -409
  199. package/src/adapters/bun/index.ts +0 -2
  200. package/src/adapters/bun/server-adapter.ts +0 -499
  201. package/src/adapters/bun/server-lifecycle.ts +0 -124
  202. package/src/adapters/index.ts +0 -6
  203. package/src/adapters/node/bootstrap-dependency-resolver.ts +0 -301
  204. package/src/adapters/node/create-app.ts +0 -179
  205. package/src/adapters/node/index.d.ts +0 -6
  206. package/src/adapters/node/index.js +0 -11
  207. package/src/adapters/node/index.ts +0 -16
  208. package/src/adapters/node/node-client-bridge.ts +0 -79
  209. package/src/adapters/node/node-hmr-manager.ts +0 -381
  210. package/src/adapters/node/runtime-adapter.d.ts +0 -46
  211. package/src/adapters/node/runtime-adapter.js +0 -306
  212. package/src/adapters/node/runtime-adapter.ts +0 -439
  213. package/src/adapters/node/server-adapter.ts +0 -488
  214. package/src/adapters/node/static-content-server.ts +0 -239
  215. package/src/adapters/node/write-runtime-manifest.d.ts +0 -26
  216. package/src/adapters/node/write-runtime-manifest.js +0 -12
  217. package/src/adapters/node/write-runtime-manifest.ts +0 -38
  218. package/src/adapters/shared/api-response.ts +0 -104
  219. package/src/adapters/shared/application-adapter.ts +0 -199
  220. package/src/adapters/shared/define-api-handler.ts +0 -66
  221. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -140
  222. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -127
  223. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  224. package/src/adapters/shared/fs-server-response-matcher.ts +0 -205
  225. package/src/adapters/shared/hmr-entrypoint-registrar.ts +0 -149
  226. package/src/adapters/shared/hmr-html-response.ts +0 -52
  227. package/src/adapters/shared/render-context.ts +0 -120
  228. package/src/adapters/shared/runtime-bootstrap.ts +0 -79
  229. package/src/adapters/shared/server-adapter.ts +0 -489
  230. package/src/adapters/shared/server-route-handler.ts +0 -153
  231. package/src/adapters/shared/server-static-builder.ts +0 -166
  232. package/src/build/build-adapter.ts +0 -361
  233. package/src/build/build-manifest.ts +0 -54
  234. package/src/build/build-types.ts +0 -83
  235. package/src/build/dev-build-coordinator.ts +0 -221
  236. package/src/build/esbuild-build-adapter.ts +0 -559
  237. package/src/build/runtime-build-executor.ts +0 -34
  238. package/src/build/runtime-specifier-alias-plugin.ts +0 -58
  239. package/src/config/config-builder.ts +0 -706
  240. package/src/constants.ts +0 -54
  241. package/src/create-app.ts +0 -87
  242. package/src/dev/sc-server.ts +0 -143
  243. package/src/eco/component-render-context.d.ts +0 -105
  244. package/src/eco/component-render-context.js +0 -87
  245. package/src/eco/component-render-context.ts +0 -224
  246. package/src/eco/eco.ts +0 -242
  247. package/src/eco/eco.types.ts +0 -221
  248. package/src/eco/global-injector-map.ts +0 -112
  249. package/src/eco/lazy-injector-map.ts +0 -120
  250. package/src/eco/module-dependencies.ts +0 -75
  251. package/src/errors/http-error.ts +0 -72
  252. package/src/errors/index.ts +0 -2
  253. package/src/errors/locals-access-error.ts +0 -7
  254. package/src/global/app-logger.ts +0 -4
  255. package/src/hmr/client/hmr-runtime.ts +0 -152
  256. package/src/hmr/hmr-strategy.ts +0 -172
  257. package/src/hmr/hmr.postcss.test.e2e.ts +0 -41
  258. package/src/hmr/hmr.test.e2e.ts +0 -66
  259. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  260. package/src/hmr/strategies/js-hmr-strategy.ts +0 -320
  261. package/src/index.browser.ts +0 -3
  262. package/src/index.ts +0 -5
  263. package/src/integrations/ghtml/ghtml-renderer.ts +0 -96
  264. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  265. package/src/internal-types.ts +0 -232
  266. package/src/plugins/alias-resolver-plugin.ts +0 -63
  267. package/src/plugins/eco-component-meta-plugin.ts +0 -481
  268. package/src/plugins/integration-plugin.ts +0 -226
  269. package/src/plugins/processor.ts +0 -240
  270. package/src/plugins/runtime-capability.ts +0 -14
  271. package/src/public-types.ts +0 -1317
  272. package/src/route-renderer/component-graph/component-graph-executor.d.ts +0 -32
  273. package/src/route-renderer/component-graph/component-graph-executor.js +0 -31
  274. package/src/route-renderer/component-graph/component-graph-executor.ts +0 -84
  275. package/src/route-renderer/component-graph/component-graph.d.ts +0 -42
  276. package/src/route-renderer/component-graph/component-graph.js +0 -72
  277. package/src/route-renderer/component-graph/component-graph.ts +0 -159
  278. package/src/route-renderer/component-graph/component-marker.d.ts +0 -52
  279. package/src/route-renderer/component-graph/component-marker.js +0 -46
  280. package/src/route-renderer/component-graph/component-marker.ts +0 -117
  281. package/src/route-renderer/component-graph/component-reference.d.ts +0 -10
  282. package/src/route-renderer/component-graph/component-reference.js +0 -19
  283. package/src/route-renderer/component-graph/component-reference.ts +0 -29
  284. package/src/route-renderer/component-graph/marker-graph-resolver.d.ts +0 -77
  285. package/src/route-renderer/component-graph/marker-graph-resolver.js +0 -95
  286. package/src/route-renderer/component-graph/marker-graph-resolver.ts +0 -155
  287. package/src/route-renderer/orchestration/integration-renderer.ts +0 -790
  288. package/src/route-renderer/orchestration/render-execution.service.ts +0 -230
  289. package/src/route-renderer/orchestration/render-preparation.service.ts +0 -476
  290. package/src/route-renderer/page-loading/dependency-resolver.ts +0 -612
  291. package/src/route-renderer/page-loading/page-module-loader.ts +0 -181
  292. package/src/route-renderer/route-renderer.ts +0 -115
  293. package/src/router/client/link-intent.test.browser.ts +0 -51
  294. package/src/router/client/link-intent.ts +0 -92
  295. package/src/router/client/navigation-coordinator.ts +0 -433
  296. package/src/router/server/fs-router-scanner.ts +0 -219
  297. package/src/router/server/fs-router.ts +0 -122
  298. package/src/services/assets/asset-processing-service/asset-processing.service.ts +0 -401
  299. package/src/services/assets/asset-processing-service/asset.factory.ts +0 -105
  300. package/src/services/assets/asset-processing-service/assets.types.ts +0 -113
  301. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +0 -95
  302. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +0 -78
  303. package/src/services/assets/asset-processing-service/index.ts +0 -5
  304. package/src/services/assets/asset-processing-service/processor.interface.ts +0 -27
  305. package/src/services/assets/asset-processing-service/processor.registry.ts +0 -18
  306. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +0 -82
  307. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +0 -95
  308. package/src/services/assets/asset-processing-service/processors/index.ts +0 -5
  309. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  310. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  311. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +0 -85
  312. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  313. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -80
  314. package/src/services/assets/browser-bundle.service.ts +0 -53
  315. package/src/services/cache/cache.types.ts +0 -126
  316. package/src/services/cache/index.ts +0 -18
  317. package/src/services/cache/memory-cache-store.ts +0 -130
  318. package/src/services/cache/page-cache-service.ts +0 -202
  319. package/src/services/cache/page-request-cache-coordinator.service.ts +0 -131
  320. package/src/services/html/html-rewriter-provider.service.ts +0 -103
  321. package/src/services/html/html-transformer.service.ts +0 -279
  322. package/src/services/invalidation/development-invalidation.service.ts +0 -261
  323. package/src/services/module-loading/app-server-module-transpiler.service.ts +0 -52
  324. package/src/services/module-loading/page-module-import.service.ts +0 -200
  325. package/src/services/module-loading/server-loader.service.d.ts +0 -96
  326. package/src/services/module-loading/server-loader.service.js +0 -32
  327. package/src/services/module-loading/server-loader.service.ts +0 -130
  328. package/src/services/module-loading/server-module-transpiler.service.ts +0 -105
  329. package/src/services/runtime-manifest/node-runtime-manifest.service.d.ts +0 -35
  330. package/src/services/runtime-manifest/node-runtime-manifest.service.js +0 -60
  331. package/src/services/runtime-manifest/node-runtime-manifest.service.ts +0 -101
  332. package/src/services/runtime-state/dev-graph.service.ts +0 -217
  333. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +0 -136
  334. package/src/services/runtime-state/runtime-specifier-registry.service.ts +0 -96
  335. package/src/services/runtime-state/server-invalidation-state.service.ts +0 -68
  336. package/src/services/validation/schema-validation-service.ts +0 -204
  337. package/src/services/validation/standard-schema.types.ts +0 -68
  338. package/src/static-site-generator/static-site-generator.ts +0 -462
  339. package/src/utils/css.d.ts +0 -1
  340. package/src/utils/css.js +0 -7
  341. package/src/utils/css.ts +0 -5
  342. package/src/utils/deep-merge.ts +0 -47
  343. package/src/utils/hash.ts +0 -5
  344. package/src/utils/html.ts +0 -1
  345. package/src/utils/invariant.ts +0 -15
  346. package/src/utils/locals-utils.ts +0 -37
  347. package/src/utils/parse-cli-args.ts +0 -83
  348. package/src/utils/path-utils.module.ts +0 -14
  349. package/src/utils/resolve-work-dir.ts +0 -45
  350. package/src/utils/runtime.ts +0 -44
  351. package/src/utils/server-utils.module.ts +0 -67
  352. package/src/watchers/project-watcher.test-helpers.ts +0 -41
  353. package/src/watchers/project-watcher.ts +0 -363
  354. /package/src/{constants.d.ts → config/constants.d.ts} +0 -0
  355. /package/src/{constants.js → config/constants.js} +0 -0
  356. /package/src/{internal-types.js → services/module-loading/module-loading-types.js} +0 -0
  357. /package/src/{public-types.js → types/internal-types.js} +0 -0
package/src/eco/eco.js CHANGED
@@ -1,56 +1,27 @@
1
- import { createNodeId, createPropsRef, createSlotRef, getComponentRenderContext } from "./component-render-context.js";
2
- import { createComponentMarker, parseComponentMarkers } from "../route-renderer/component-graph/component-marker.js";
3
- import { getComponentReference } from "../route-renderer/component-graph/component-reference.js";
4
- import { addTriggerAttribute, isThenable, wrapWithScriptsInjector } from "./eco.utils.js";
1
+ import {
2
+ finalizeComponentRender,
3
+ interceptComponentBoundary
4
+ } from "../route-renderer/orchestration/component-render-context.js";
5
+ import { isThenable } from "../route-renderer/orchestration/render-output.utils.js";
5
6
  function createComponentFactory(options) {
6
7
  const integrationName = options.integration ?? options.__eco?.integration;
7
8
  const comp = ((props) => {
8
- const renderContext = getComponentRenderContext();
9
- const shouldEmitMarker = renderContext !== void 0 && renderContext.boundaryContext.decideBoundaryRender({
10
- currentIntegration: renderContext.currentIntegration,
11
- targetIntegration: integrationName,
12
- component: comp
13
- }) === "defer";
14
- if (shouldEmitMarker && renderContext) {
15
- const nodeId = createNodeId(renderContext);
16
- const propsRef = createPropsRef(renderContext);
17
- const componentRef = getComponentReference(comp);
18
- const componentProps = props ?? {};
19
- renderContext.propsByRef[propsRef] = componentProps;
20
- let slotRef;
21
- const children = componentProps.children;
22
- if (typeof children === "string" && children.includes("<eco-marker")) {
23
- const childMarkers = parseComponentMarkers(children);
24
- if (childMarkers.length > 0) {
25
- slotRef = createSlotRef(renderContext);
26
- renderContext.slotChildrenByRef[slotRef] = childMarkers.map((marker) => marker.nodeId);
27
- }
28
- }
29
- return createComponentMarker({
30
- nodeId,
31
- integration: integrationName,
32
- componentRef,
33
- propsRef,
34
- slotRef
35
- });
9
+ const componentProps = props ?? {};
10
+ const renderInline = () => finalizeComponentRender(comp, options.render(props));
11
+ const boundaryRender = interceptComponentBoundary({
12
+ component: comp,
13
+ props: componentProps,
14
+ targetIntegration: integrationName
15
+ });
16
+ if (isThenable(boundaryRender)) {
17
+ return boundaryRender.then(
18
+ (resolvedBoundaryRender) => resolvedBoundaryRender !== void 0 ? resolvedBoundaryRender : renderInline()
19
+ );
36
20
  }
37
- const content = options.render(props);
38
- const lazyTriggers = comp.config?._resolvedLazyTriggers;
39
- if (lazyTriggers && lazyTriggers.length > 0) {
40
- const triggerId = lazyTriggers[0].triggerId;
41
- if (isThenable(content)) {
42
- return content.then((resolvedContent) => addTriggerAttribute(resolvedContent, triggerId));
43
- }
44
- return addTriggerAttribute(content, triggerId);
21
+ if (boundaryRender !== void 0) {
22
+ return boundaryRender;
45
23
  }
46
- const lazyGroups = comp.config?._resolvedLazyScripts;
47
- if (lazyGroups && lazyGroups.length > 0) {
48
- if (isThenable(content)) {
49
- return content.then((resolvedContent) => wrapWithScriptsInjector(resolvedContent, lazyGroups));
50
- }
51
- return wrapWithScriptsInjector(content, lazyGroups);
52
- }
53
- return content;
24
+ return renderInline();
54
25
  });
55
26
  comp.config = {
56
27
  __eco: options.__eco,
@@ -2,7 +2,7 @@
2
2
  * Type definitions for the eco namespace API
3
3
  * @module
4
4
  */
5
- import type { DependencyLazyTrigger, EcoComponent, EcoComponentDependencies, EcoHtmlComponent, EcoInjectedMeta, EcoLayoutComponent, EcoPageLayoutComponent, EcoPagesElement, GetMetadata, GetStaticPaths, GetStaticProps, HtmlTemplateProps, LayoutProps, Middleware, RequestLocals, RequestPageContext } from '../public-types.js';
5
+ import type { DependencyLazyTrigger, EcoComponent, EcoComponentDependencies, EcoHtmlComponent, EcoInjectedMeta, EcoLayoutComponent, EcoPageLayoutComponent, EcoPagesElement, GetMetadata, GetStaticPaths, GetStaticProps, HtmlTemplateProps, LayoutProps, Middleware, RequestLocals, RequestPageContext } from '../types/public-types.js';
6
6
  import type { CacheStrategy } from '../services/cache/cache.types.js';
7
7
  type WithRequiredLocals<K extends keyof RequestLocals> = Omit<RequestLocals, K> & {
8
8
  [P in K]-?: Exclude<RequestLocals[P], null | undefined>;
@@ -1,40 +1 @@
1
- import type { EcoComponent } from '../public-types.js';
2
- /**
3
- * Returns `true` when `value` is a thenable (Promise-like) object.
4
- *
5
- * Used to transparently handle both synchronous and asynchronous component
6
- * render results without requiring every caller to branch on `instanceof Promise`.
7
- *
8
- * @typeParam T Expected resolved type of the thenable.
9
- */
10
- export declare function isThenable<T>(value: unknown): value is PromiseLike<T>;
11
- /**
12
- * Injects `data-eco-trigger` into the first real HTML element opening tag of
13
- * a component's rendered output string.
14
- *
15
- * The scan skips over leading whitespace, HTML comments (`<!-- -->`), CDATA
16
- * sections, and doctype declarations so that the attribute is always placed on
17
- * the first actual element — not spurious markup that can precede it.
18
- *
19
- * The insertion point is the end of the element's tag name, before any existing
20
- * attributes or the closing `>`, which produces output like:
21
- *
22
- * ```html
23
- * <my-element data-eco-trigger="eco-trigger-abc123" class="foo">…</my-element>
24
- * ```
25
- *
26
- * When no eligible opening tag is found the original string is returned
27
- * unchanged so callers never receive a broken fragment.
28
- *
29
- * @param content Rendered HTML string (or any value coercible to string).
30
- * @param triggerId Stable trigger identifier produced by `buildResolvedLazyTriggers`.
31
- */
32
- export declare function addTriggerAttribute(content: unknown, triggerId: string): string;
33
- /**
34
- * Wraps rendered component output in a `<scripts-injector>` element that
35
- * carries an inline injector map for the legacy (non-global-injector) path.
36
- *
37
- * @param content Rendered component HTML.
38
- * @param lazyGroups Resolved lazy script groups attached to the component config.
39
- */
40
- export declare function wrapWithScriptsInjector(content: unknown, lazyGroups: NonNullable<EcoComponent['config']>['_resolvedLazyScripts']): string;
1
+ export { addTriggerAttribute, isThenable, wrapWithScriptsInjector, } from '../route-renderer/orchestration/render-output.utils.js';
@@ -1,38 +1,8 @@
1
- import { buildInjectorMapScript } from "./lazy-injector-map.js";
2
- function isThenable(value) {
3
- return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
4
- }
5
- function addTriggerAttribute(content, triggerId) {
6
- const str = String(content);
7
- let i = 0;
8
- while (i < str.length) {
9
- if (str[i] !== "<") {
10
- i++;
11
- continue;
12
- }
13
- const next = str[i + 1];
14
- if (next === "!" || next === "?") {
15
- const end = str.indexOf(">", i);
16
- if (end === -1) break;
17
- i = end + 1;
18
- continue;
19
- }
20
- if (next && /[a-zA-Z]/.test(next)) {
21
- const tagSlice = str.slice(i + 1);
22
- const nameEnd = tagSlice.search(/[\s/>]/);
23
- if (nameEnd === -1) break;
24
- const insertAt = i + 1 + nameEnd;
25
- return `${str.slice(0, insertAt)} data-eco-trigger="${triggerId}"${str.slice(insertAt)}`;
26
- }
27
- break;
28
- }
29
- return str;
30
- }
31
- function wrapWithScriptsInjector(content, lazyGroups) {
32
- const wrappedContent = String(content);
33
- const injectorMapScript = buildInjectorMapScript(lazyGroups ?? []);
34
- return `<scripts-injector><script type="ecopages/injector-map">${injectorMapScript}<\/script>${wrappedContent}<\/scripts-injector>`;
35
- }
1
+ import {
2
+ addTriggerAttribute,
3
+ isThenable,
4
+ wrapWithScriptsInjector
5
+ } from "../route-renderer/orchestration/render-output.utils.js";
36
6
  export {
37
7
  addTriggerAttribute,
38
8
  isThenable,
@@ -1,4 +1,4 @@
1
- import type { ResolvedLazyTrigger } from '../public-types.js';
1
+ import type { ResolvedLazyTrigger } from '../types/public-types.js';
2
2
  /**
3
3
  * Serializes resolved lazy triggers into a JSON string safe for embedding
4
4
  * inside an inline `<script type="ecopages/global-injector-map">` tag.
@@ -1,4 +1,4 @@
1
- import type { ResolvedLazyScriptGroup } from '../public-types.js';
1
+ import type { ResolvedLazyScriptGroup } from '../types/public-types.js';
2
2
  /**
3
3
  * Creates a safe JSON payload string for `<script type="ecopages/injector-map">`.
4
4
  *
@@ -1,4 +1,4 @@
1
- import type { ClientBridgeEvent } from '../public-types';
1
+ import type { ClientBridgeEvent } from '../types/public-types.js';
2
2
  /**
3
3
  * HMR Strategy Pattern
4
4
  *
@@ -18,11 +18,13 @@ import type { ClientBridgeEvent } from '../public-types';
18
18
  * async process(filePath: string): Promise<HmrAction> {
19
19
  * return {
20
20
  * type: 'broadcast',
21
- * events: [{ type: 'update', path: filePath, timestamp: Date.now() }]
21
+ * events: [{ type: 'update', path: filePath, timestamp: Date.now() }],
22
22
  * };
23
23
  * }
24
24
  * }
25
-
25
+ * ```
26
+ */
27
+ /**
26
28
  * Defines the category of an HMR strategy, which determines its execution priority.
27
29
  * Strategies are evaluated in descending order: INTEGRATION → ASSET → SCRIPT → FALLBACK.
28
30
  *
@@ -30,28 +32,29 @@ import type { ClientBridgeEvent } from '../public-types';
30
32
  * The numeric values represent base priorities. Strategies can fine-tune their priority
31
33
  * using the `priorityOffset` property.
32
34
  */
33
- export declare enum HmrStrategyType {
35
+ export declare const HmrStrategyType: {
34
36
  /**
35
37
  * Integration-specific strategies (React, Lit, etc.)
36
38
  * Highest priority to allow framework-specific HMR handling.
37
39
  */
38
- INTEGRATION = 100,
40
+ readonly INTEGRATION: 100;
39
41
  /**
40
42
  * Asset processing strategies (CSS, images, etc.)
41
43
  * High priority for specialized asset handling.
42
44
  */
43
- ASSET = 50,
45
+ readonly ASSET: 50;
44
46
  /**
45
47
  * Generic script bundling strategies (JS/TS)
46
48
  * Medium priority for standard script processing.
47
49
  */
48
- SCRIPT = 25,
50
+ readonly SCRIPT: 25;
49
51
  /**
50
52
  * Fallback strategy for unhandled file types.
51
53
  * Lowest priority, triggers full page reload.
52
54
  */
53
- FALLBACK = 0
54
- }
55
+ readonly FALLBACK: 0;
56
+ };
57
+ export type HmrStrategyType = (typeof HmrStrategyType)[keyof typeof HmrStrategyType];
55
58
  /**
56
59
  * Represents an action to be taken after processing a file change.
57
60
  */
@@ -62,7 +65,7 @@ export interface HmrAction {
62
65
  type: 'broadcast' | 'none';
63
66
  /**
64
67
  * The HMR events to broadcast, if type is 'broadcast'.
65
- * capable of broadcasting multiple events at once.
68
+ * Multiple events may be broadcast in one action.
66
69
  */
67
70
  events?: ClientBridgeEvent[];
68
71
  }
@@ -74,8 +77,8 @@ export interface HmrAction {
74
77
  * whether they match the changed file path.
75
78
  *
76
79
  * @remarks
77
- * Strategies should be stateless and idempotent. The same file change should always
78
- * produce the same result when processed by the same strategy.
80
+ * Strategies are expected to be stateless and idempotent. The same file change
81
+ * should produce the same result when processed by the same strategy.
79
82
  *
80
83
  * @example
81
84
  * ```typescript
@@ -120,7 +123,7 @@ export declare abstract class HmrStrategy {
120
123
  * Determines if this strategy can handle the given file path.
121
124
  *
122
125
  * @param filePath - Absolute path to the changed file
123
- * @returns True if this strategy should process the file
126
+ * @returns `true` when this strategy should process the file
124
127
  *
125
128
  * @example
126
129
  * ```typescript
@@ -1,10 +1,25 @@
1
- var HmrStrategyType = /* @__PURE__ */ ((HmrStrategyType2) => {
2
- HmrStrategyType2[HmrStrategyType2["INTEGRATION"] = 100] = "INTEGRATION";
3
- HmrStrategyType2[HmrStrategyType2["ASSET"] = 50] = "ASSET";
4
- HmrStrategyType2[HmrStrategyType2["SCRIPT"] = 25] = "SCRIPT";
5
- HmrStrategyType2[HmrStrategyType2["FALLBACK"] = 0] = "FALLBACK";
6
- return HmrStrategyType2;
7
- })(HmrStrategyType || {});
1
+ const HmrStrategyType = {
2
+ /**
3
+ * Integration-specific strategies (React, Lit, etc.)
4
+ * Highest priority to allow framework-specific HMR handling.
5
+ */
6
+ INTEGRATION: 100,
7
+ /**
8
+ * Asset processing strategies (CSS, images, etc.)
9
+ * High priority for specialized asset handling.
10
+ */
11
+ ASSET: 50,
12
+ /**
13
+ * Generic script bundling strategies (JS/TS)
14
+ * Medium priority for standard script processing.
15
+ */
16
+ SCRIPT: 25,
17
+ /**
18
+ * Fallback strategy for unhandled file types.
19
+ * Lowest priority, triggers full page reload.
20
+ */
21
+ FALLBACK: 0
22
+ };
8
23
  class HmrStrategy {
9
24
  /**
10
25
  * Optional offset to fine-tune priority within the same category.
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @module
8
8
  */
9
- import { HmrStrategy, HmrStrategyType, type HmrAction } from '../hmr-strategy';
9
+ import { HmrStrategy, type HmrAction } from '../hmr-strategy.js';
10
10
  /**
11
11
  * Default fallback strategy for unhandled file types.
12
12
  *
@@ -25,7 +25,7 @@ import { HmrStrategy, HmrStrategyType, type HmrAction } from '../hmr-strategy';
25
25
  * ```
26
26
  */
27
27
  export declare class DefaultHmrStrategy extends HmrStrategy {
28
- readonly type = HmrStrategyType.FALLBACK;
28
+ readonly type: 0;
29
29
  /**
30
30
  * Matches all file paths.
31
31
  *
@@ -1,4 +1,4 @@
1
- import { HmrStrategy, HmrStrategyType } from "../hmr-strategy";
1
+ import { HmrStrategy, HmrStrategyType } from "../hmr-strategy.js";
2
2
  class DefaultHmrStrategy extends HmrStrategy {
3
3
  type = HmrStrategyType.FALLBACK;
4
4
  /**
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
- import { HmrStrategy, HmrStrategyType, type HmrAction } from '../hmr-strategy';
10
+ import { HmrStrategy, type HmrAction } from '../hmr-strategy.js';
11
11
  import type { EcoBuildPlugin } from '../../build/build-types.js';
12
12
  import type { BrowserBundleExecutor } from '../../services/assets/browser-bundle.service.js';
13
13
  import type { EntrypointDependencyGraph } from '../../services/runtime-state/entrypoint-dependency-graph.service.js';
@@ -94,7 +94,7 @@ export interface JsHmrContext {
94
94
  * ```
95
95
  */
96
96
  export declare class JsHmrStrategy extends HmrStrategy {
97
- readonly type = HmrStrategyType.SCRIPT;
97
+ readonly type: 25;
98
98
  private context;
99
99
  constructor(context: JsHmrContext);
100
100
  /**
@@ -1,7 +1,7 @@
1
1
  import path from "node:path";
2
2
  import { fileSystem } from "@ecopages/file-system";
3
- import { HmrStrategy, HmrStrategyType } from "../hmr-strategy";
4
- import { appLogger } from "../../global/app-logger";
3
+ import { HmrStrategy, HmrStrategyType } from "../hmr-strategy.js";
4
+ import { appLogger } from "../../global/app-logger.js";
5
5
  class JsHmrStrategy extends HmrStrategy {
6
6
  type = HmrStrategyType.SCRIPT;
7
7
  context;
@@ -1,3 +1,3 @@
1
- export type * from './public-types.js';
1
+ export type * from './types/public-types.js';
2
2
  export type * from './eco/eco.types.js';
3
- export { eco } from './eco/eco.js';
3
+ export { eco } from './eco/eco.browser.js';
@@ -1,4 +1,4 @@
1
- import { eco } from "./eco/eco.js";
1
+ import { eco } from "./eco/eco.browser.js";
2
2
  export {
3
3
  eco
4
4
  };
package/src/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- export type * from './public-types.js';
1
+ export type * from './types/public-types.js';
2
2
  export type * from './eco/eco.types.js';
3
3
  export { eco } from './eco/eco.js';
4
- export { EcopagesApp, createApp, type EcopagesAppOptions } from './create-app.js';
5
4
  export { defineApiHandler, defineGroupHandler, type GroupHandler } from './adapters/shared/define-api-handler.js';
5
+ export { createEcoBuildPluginFromSourceTransform, createVitePluginsFromAppSourceTransforms, getAppSourceTransforms, createVitePluginFromSourceTransform, normalizeTransformId, type EcoSourceTransform, type EcoSourceTransformResult, type EcoViteCompatiblePlugin, } from './plugins/source-transform.js';
6
+ export { createEcoComponentMetaTransform } from './plugins/eco-component-meta-plugin.js';
package/src/index.js CHANGED
@@ -1,10 +1,21 @@
1
1
  import { eco } from "./eco/eco.js";
2
- import { EcopagesApp, createApp } from "./create-app.js";
3
2
  import { defineApiHandler, defineGroupHandler } from "./adapters/shared/define-api-handler.js";
3
+ import {
4
+ createEcoBuildPluginFromSourceTransform,
5
+ createVitePluginsFromAppSourceTransforms,
6
+ getAppSourceTransforms,
7
+ createVitePluginFromSourceTransform,
8
+ normalizeTransformId
9
+ } from "./plugins/source-transform.js";
10
+ import { createEcoComponentMetaTransform } from "./plugins/eco-component-meta-plugin.js";
4
11
  export {
5
- EcopagesApp,
6
- createApp,
12
+ createEcoBuildPluginFromSourceTransform,
13
+ createEcoComponentMetaTransform,
14
+ createVitePluginFromSourceTransform,
15
+ createVitePluginsFromAppSourceTransforms,
7
16
  defineApiHandler,
8
17
  defineGroupHandler,
9
- eco
18
+ eco,
19
+ getAppSourceTransforms,
20
+ normalizeTransformId
10
21
  };
@@ -2,7 +2,7 @@
2
2
  * This module contains the ghtml renderer
3
3
  * @module
4
4
  */
5
- import type { EcoComponent, EcoPagesElement, IntegrationRendererRenderOptions, RouteRendererBody } from '../../public-types.js';
5
+ import type { ComponentRenderInput, ComponentRenderResult, EcoComponent, EcoPagesElement, IntegrationRendererRenderOptions, RouteRendererBody } from '../../types/public-types.js';
6
6
  import { IntegrationRenderer, type RenderToResponseContext } from '../../route-renderer/orchestration/integration-renderer.js';
7
7
  /**
8
8
  * A renderer for the ghtml integration.
@@ -10,6 +10,11 @@ import { IntegrationRenderer, type RenderToResponseContext } from '../../route-r
10
10
  */
11
11
  export declare class GhtmlRenderer extends IntegrationRenderer<EcoPagesElement> {
12
12
  name: string;
13
+ renderComponent(input: ComponentRenderInput): Promise<ComponentRenderResult>;
14
+ protected createComponentBoundaryRuntime(options: {
15
+ boundaryInput: ComponentRenderInput;
16
+ rendererCache: Map<string, IntegrationRenderer<any>>;
17
+ }): import("../../index.browser.js").ComponentBoundaryRuntime;
13
18
  render({ params, query, props, locals, pageLocals, metadata, Page, Layout, HtmlTemplate, }: IntegrationRendererRenderOptions): Promise<RouteRendererBody>;
14
19
  renderToResponse<P = Record<string, unknown>>(view: EcoComponent<P>, props: P, ctx: RenderToResponseContext): Promise<Response>;
15
20
  }
@@ -4,6 +4,18 @@ import {
4
4
  import { GHTML_PLUGIN_NAME } from "./ghtml.plugin.js";
5
5
  class GhtmlRenderer extends IntegrationRenderer {
6
6
  name = GHTML_PLUGIN_NAME;
7
+ async renderComponent(input) {
8
+ return this.renderStringComponentBoundaryWithQueuedForeignBoundaries(
9
+ input,
10
+ input.component
11
+ );
12
+ }
13
+ createComponentBoundaryRuntime(options) {
14
+ return this.createQueuedBoundaryRuntime({
15
+ boundaryInput: options.boundaryInput,
16
+ rendererCache: options.rendererCache
17
+ });
18
+ }
7
19
  async render({
8
20
  params,
9
21
  query,
@@ -16,42 +28,31 @@ class GhtmlRenderer extends IntegrationRenderer {
16
28
  HtmlTemplate
17
29
  }) {
18
30
  try {
19
- const pageContent = await Page({ params, query, ...props, locals: pageLocals });
20
- const children = Layout && typeof Layout === "function" ? await Layout({ children: pageContent, locals }) : pageContent;
21
- const body = await HtmlTemplate({
31
+ return await this.renderPageWithDocumentShell({
32
+ page: {
33
+ component: Page,
34
+ props: { params, query, ...props, locals: pageLocals }
35
+ },
36
+ layout: Layout ? {
37
+ component: Layout,
38
+ props: locals ? { locals } : {}
39
+ } : void 0,
40
+ htmlTemplate: HtmlTemplate,
22
41
  metadata,
23
- children,
24
- pageProps: props || {}
42
+ pageProps: props ?? {}
25
43
  });
26
- return this.DOC_TYPE + body;
27
44
  } catch (error) {
28
45
  throw this.createRenderError("Error rendering page", error);
29
46
  }
30
47
  }
31
48
  async renderToResponse(view, props, ctx) {
32
49
  try {
33
- const Layout = view.config?.layout;
34
- const viewFn = view;
35
- const pageContent = await viewFn(props);
36
- let body;
37
- if (ctx.partial) {
38
- body = pageContent;
39
- } else {
40
- const children = Layout ? await Layout({ children: pageContent }) : pageContent;
41
- const HtmlTemplate = await this.getHtmlTemplate();
42
- const metadata = view.metadata ? await view.metadata({
43
- params: {},
44
- query: {},
45
- props,
46
- appConfig: this.appConfig
47
- }) : this.appConfig.defaultMetadata;
48
- body = this.DOC_TYPE + await HtmlTemplate({
49
- metadata,
50
- children,
51
- pageProps: props
52
- });
53
- }
54
- return this.createHtmlResponse(body, ctx);
50
+ return await this.renderViewWithDocumentShell({
51
+ view,
52
+ props,
53
+ ctx,
54
+ layout: view.config?.layout
55
+ });
55
56
  } catch (error) {
56
57
  throw this.createRenderError("Error rendering view", error);
57
58
  }
@@ -1,5 +1,5 @@
1
- import { IntegrationPlugin, type IntegrationPluginConfig } from '../../plugins/integration-plugin';
2
- import { GhtmlRenderer } from './ghtml-renderer';
1
+ import { IntegrationPlugin, type IntegrationPluginConfig } from '../../plugins/integration-plugin.js';
2
+ import { GhtmlRenderer } from './ghtml-renderer.js';
3
3
  /**
4
4
  * The name of the ghtml plugin
5
5
  */
@@ -1,5 +1,5 @@
1
- import { IntegrationPlugin } from "../../plugins/integration-plugin";
2
- import { GhtmlRenderer } from "./ghtml-renderer";
1
+ import { IntegrationPlugin } from "../../plugins/integration-plugin.js";
2
+ import { GhtmlRenderer } from "./ghtml-renderer.js";
3
3
  const GHTML_PLUGIN_NAME = "ghtml";
4
4
  class GhtmlPlugin extends IntegrationPlugin {
5
5
  renderer = GhtmlRenderer;
@@ -18,6 +18,7 @@ These contracts are responsible for:
18
18
  - `integration-plugin.ts`: framework-semantics contract for render integrations
19
19
  - `processor.ts`: asset-transformation contract for processors
20
20
  - `runtime-capability.ts`: runtime compatibility declaration types
21
+ - `source-transform.ts`: bundler-neutral source-transform primitive with Ecopages adapters plus app-level Vite plugin composition helpers
21
22
  - `eco-component-meta-plugin.ts`: shared metadata transform used by core loading/build paths
22
23
 
23
24
  ## Ownership Rules
@@ -26,7 +26,8 @@
26
26
  * @module eco-component-meta-plugin
27
27
  */
28
28
  import type { EcoBuildPlugin } from '../build/build-types.js';
29
- import type { EcoPagesAppConfig } from '../internal-types.js';
29
+ import type { EcoPagesAppConfig } from '../types/internal-types.js';
30
+ import { type EcoSourceTransform, type EcoViteCompatiblePlugin } from './source-transform.js';
30
31
  /**
31
32
  * Options for creating the eco-component-meta-plugin.
32
33
  */
@@ -34,6 +35,11 @@ export interface EcoComponentDirPluginOptions {
34
35
  /** The EcoPages application configuration containing integration settings */
35
36
  config: EcoPagesAppConfig;
36
37
  }
38
+ /**
39
+ * Creates the bundler-neutral metadata transform used by Ecopages loaders and
40
+ * Vite-compatible adapters.
41
+ */
42
+ export declare function createEcoComponentMetaTransform(options: EcoComponentDirPluginOptions): EcoSourceTransform;
37
43
  /**
38
44
  * Creates a build plugin that auto-injects `__eco` metadata into EcoComponent config objects.
39
45
  *
@@ -65,6 +71,11 @@ export interface EcoComponentDirPluginOptions {
65
71
  * ```
66
72
  */
67
73
  export declare function createEcoComponentMetaPlugin(options: EcoComponentDirPluginOptions): EcoBuildPlugin;
74
+ /**
75
+ * Creates a Vite-compatible metadata injection plugin from the shared
76
+ * Ecopages source-transform primitive.
77
+ */
78
+ export declare function createEcoComponentMetaVitePlugin(options: EcoComponentDirPluginOptions): EcoViteCompatiblePlugin;
68
79
  /**
69
80
  * Injects `__eco` metadata into EcoComponent config objects in file content.
70
81
  *
@@ -1,7 +1,10 @@
1
1
  import path from "node:path";
2
2
  import { parseSync } from "oxc-parser";
3
- import { fileSystem } from "@ecopages/file-system";
4
3
  import { rapidhash } from "../utils/hash.js";
4
+ import {
5
+ createEcoBuildPluginFromSourceTransform,
6
+ createVitePluginFromSourceTransform
7
+ } from "./source-transform.js";
5
8
  const REGEX_SPECIAL_CHARS = /[.*+?^${}()|[\]\\]/g;
6
9
  const VALID_LOADER_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".tsx", ".js", ".jsx"]);
7
10
  function hasValidLoaderExtension(ext) {
@@ -38,30 +41,31 @@ function createExtensionPattern(extensions) {
38
41
  const escaped = uniqueExtensions.map((ext) => ext.replace(REGEX_SPECIAL_CHARS, "\\$&"));
39
42
  return new RegExp(`(${escaped.join("|")})(\\?.*)?$`);
40
43
  }
41
- function createEcoComponentMetaPlugin(options) {
44
+ function createEcoComponentMetaTransform(options) {
45
+ const allExtensions = options.config.integrations.flatMap((integration) => integration.extensions).filter(hasValidLoaderExtension);
46
+ if (allExtensions.length === 0) {
47
+ throw new Error("[eco-component-meta-plugin] No extensions configured. At least one integration is required.");
48
+ }
49
+ const extensionPattern = createExtensionPattern(allExtensions);
50
+ const extensionToIntegration = buildExtensionToIntegrationMap(options.config.integrations);
42
51
  return {
43
52
  name: "eco-component-meta-plugin",
44
- setup(build) {
45
- const allExtensions = options.config.integrations.flatMap((integration) => integration.extensions).filter(hasValidLoaderExtension);
46
- if (allExtensions.length === 0) {
47
- return;
48
- }
49
- const extensionPattern = createExtensionPattern(allExtensions);
50
- const extensionToIntegration = buildExtensionToIntegrationMap(options.config.integrations);
51
- build.onLoad({ filter: extensionPattern }, (args) => {
52
- const filePath = args.path.split("?")[0];
53
- const contents = fileSystem.readFileSync(filePath);
54
- const integration = detectIntegration(filePath, extensionToIntegration);
55
- const transformedContents = injectEcoMeta(contents, filePath, integration);
56
- const ext = path.extname(filePath).slice(1);
57
- return {
58
- contents: transformedContents,
59
- loader: ext || "ts"
60
- };
61
- });
53
+ enforce: "pre",
54
+ filter: extensionPattern,
55
+ transform(code, id) {
56
+ const integration = detectIntegration(id, extensionToIntegration);
57
+ return {
58
+ code: injectEcoMeta(code, id, integration)
59
+ };
62
60
  }
63
61
  };
64
62
  }
63
+ function createEcoComponentMetaPlugin(options) {
64
+ return createEcoBuildPluginFromSourceTransform(createEcoComponentMetaTransform(options));
65
+ }
66
+ function createEcoComponentMetaVitePlugin(options) {
67
+ return createVitePluginFromSourceTransform(createEcoComponentMetaTransform(options));
68
+ }
65
69
  function findInjectionPoints(node, insertions, injection, isInsideEcoComponent = false) {
66
70
  if (!node || typeof node !== "object") return;
67
71
  const n = node;
@@ -152,6 +156,8 @@ function injectEcoMeta(contents, filePath, integration) {
152
156
  var eco_component_meta_plugin_default = createEcoComponentMetaPlugin;
153
157
  export {
154
158
  createEcoComponentMetaPlugin,
159
+ createEcoComponentMetaTransform,
160
+ createEcoComponentMetaVitePlugin,
155
161
  eco_component_meta_plugin_default as default,
156
162
  injectEcoMeta
157
163
  };