@ecopages/core 0.2.0-alpha.2 → 0.2.0-alpha.20

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 (391) hide show
  1. package/CHANGELOG.md +26 -64
  2. package/README.md +212 -14
  3. package/package.json +116 -66
  4. package/src/adapters/README.md +39 -0
  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 +80 -21
  13. package/src/adapters/bun/hmr-manager.js +168 -62
  14. package/src/adapters/bun/index.d.ts +2 -3
  15. package/src/adapters/bun/index.js +3 -3
  16. package/src/adapters/bun/server-adapter.d.ts +5 -5
  17. package/src/adapters/bun/server-adapter.js +40 -34
  18. package/src/adapters/bun/server-lifecycle.d.ts +28 -17
  19. package/src/adapters/bun/server-lifecycle.js +34 -62
  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 +2 -6
  23. package/src/adapters/index.js +2 -8
  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 +89 -18
  28. package/src/adapters/node/node-hmr-manager.js +185 -95
  29. package/src/adapters/node/server-adapter.d.ts +6 -35
  30. package/src/adapters/node/server-adapter.js +44 -105
  31. package/src/adapters/node/static-content-server.d.ts +37 -1
  32. package/src/adapters/node/static-content-server.js +29 -1
  33. package/src/adapters/shared/application-adapter.d.ts +1 -1
  34. package/src/{define-api-handler.d.ts → 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/explicit-static-route-matcher.js +4 -1
  37. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +1 -1
  38. package/src/adapters/shared/file-route-middleware-pipeline.js +1 -0
  39. package/src/adapters/shared/fs-server-response-factory.d.ts +2 -2
  40. package/src/adapters/shared/fs-server-response-factory.js +1 -1
  41. package/src/adapters/shared/fs-server-response-matcher.d.ts +8 -12
  42. package/src/adapters/shared/fs-server-response-matcher.js +10 -18
  43. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  44. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  45. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  46. package/src/adapters/shared/hmr-html-response.js +32 -0
  47. package/src/adapters/shared/render-context.d.ts +2 -1
  48. package/src/adapters/shared/render-context.js +6 -3
  49. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  50. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  51. package/src/adapters/shared/server-adapter.d.ts +13 -3
  52. package/src/adapters/shared/server-adapter.js +42 -5
  53. package/src/adapters/shared/server-route-handler.d.ts +4 -4
  54. package/src/adapters/shared/server-route-handler.js +6 -15
  55. package/src/adapters/shared/server-static-builder.d.ts +38 -6
  56. package/src/adapters/shared/server-static-builder.js +64 -10
  57. package/src/build/README.md +107 -0
  58. package/src/build/build-adapter.d.ts +168 -3
  59. package/src/build/build-adapter.js +604 -16
  60. package/src/build/build-manifest.d.ts +27 -0
  61. package/src/build/build-manifest.js +30 -0
  62. package/src/build/dev-build-coordinator.d.ts +72 -0
  63. package/src/build/dev-build-coordinator.js +154 -0
  64. package/src/build/esbuild-build-adapter.d.ts +15 -6
  65. package/src/build/esbuild-build-adapter.js +189 -74
  66. package/src/build/runtime-build-executor.d.ts +14 -0
  67. package/src/build/runtime-build-executor.js +22 -0
  68. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  69. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  70. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  71. package/src/build/runtime-specifier-aliases.js +95 -0
  72. package/src/config/README.md +36 -0
  73. package/src/config/config-builder.d.ts +52 -27
  74. package/src/config/config-builder.js +260 -49
  75. package/src/{constants.d.ts → config/constants.d.ts} +13 -0
  76. package/src/{constants.js → config/constants.js} +4 -0
  77. package/src/declarations.d.ts +19 -14
  78. package/src/dev/sc-server.d.ts +1 -1
  79. package/src/dev/sc-server.js +1 -1
  80. package/src/eco/README.md +70 -16
  81. package/src/eco/eco.browser.d.ts +2 -0
  82. package/src/eco/eco.browser.js +83 -0
  83. package/src/eco/eco.js +32 -57
  84. package/src/eco/eco.types.d.ts +12 -4
  85. package/src/eco/eco.utils.d.ts +1 -40
  86. package/src/eco/eco.utils.js +5 -35
  87. package/src/eco/global-injector-map.d.ts +1 -1
  88. package/src/eco/lazy-injector-map.d.ts +1 -1
  89. package/src/hmr/README.md +26 -0
  90. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  91. package/src/hmr/client/hmr-runtime.js +30 -7
  92. package/src/hmr/hmr-strategy.d.ts +16 -13
  93. package/src/hmr/hmr-strategy.js +22 -7
  94. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  95. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  96. package/src/hmr/hmr.test.e2e.js +26 -33
  97. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  98. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  99. package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -43
  100. package/src/hmr/strategies/js-hmr-strategy.js +72 -73
  101. package/src/index.browser.d.ts +2 -2
  102. package/src/index.browser.js +1 -1
  103. package/src/index.d.ts +4 -3
  104. package/src/index.js +16 -5
  105. package/src/integrations/ghtml/ghtml-renderer.d.ts +7 -2
  106. package/src/integrations/ghtml/ghtml-renderer.js +33 -30
  107. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  108. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  109. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  110. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  111. package/src/plugins/README.md +35 -0
  112. package/src/plugins/alias-resolver-plugin.js +17 -3
  113. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  114. package/src/plugins/eco-component-meta-plugin.js +27 -21
  115. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  116. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  117. package/src/plugins/integration-plugin.d.ts +145 -28
  118. package/src/plugins/integration-plugin.js +109 -13
  119. package/src/plugins/processor.d.ts +15 -2
  120. package/src/plugins/processor.js +16 -2
  121. package/src/plugins/runtime-capability.d.ts +9 -0
  122. package/src/plugins/source-transform.d.ts +46 -0
  123. package/src/plugins/source-transform.js +71 -0
  124. package/src/route-renderer/GRAPH.md +64 -98
  125. package/src/route-renderer/README.md +67 -46
  126. package/src/route-renderer/orchestration/boundary-planning.service.d.ts +25 -0
  127. package/src/route-renderer/orchestration/boundary-planning.service.js +97 -0
  128. package/src/route-renderer/orchestration/component-render-context.d.ts +83 -0
  129. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  130. package/src/route-renderer/orchestration/integration-renderer.d.ts +554 -0
  131. package/src/route-renderer/orchestration/integration-renderer.js +957 -0
  132. package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +89 -0
  133. package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +155 -0
  134. package/src/route-renderer/orchestration/render-execution.service.d.ts +43 -0
  135. package/src/route-renderer/orchestration/render-execution.service.js +106 -0
  136. package/src/{eco/eco.utils.ts → route-renderer/orchestration/render-output.utils.d.ts} +10 -53
  137. package/src/route-renderer/orchestration/render-output.utils.js +65 -0
  138. package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +18 -10
  139. package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +115 -17
  140. package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +50 -0
  141. package/src/route-renderer/orchestration/route-shell-composer.service.js +81 -0
  142. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  143. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  144. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  145. package/src/route-renderer/{dependency-resolver.js → page-loading/dependency-resolver.js} +28 -12
  146. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  147. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
  148. package/src/route-renderer/route-renderer.d.ts +45 -4
  149. package/src/route-renderer/route-renderer.js +38 -3
  150. package/src/router/README.md +97 -0
  151. package/src/router/client/link-intent.d.ts +53 -0
  152. package/src/router/client/link-intent.js +34 -0
  153. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  154. package/src/router/client/link-intent.test.browser.js +43 -0
  155. package/src/router/client/navigation-coordinator.d.ts +149 -0
  156. package/src/router/client/navigation-coordinator.js +215 -0
  157. package/src/router/{fs-router-scanner.d.ts → server/fs-router-scanner.d.ts} +3 -3
  158. package/src/router/{fs-router-scanner.js → server/fs-router-scanner.js} +14 -8
  159. package/src/router/{fs-router.d.ts → server/fs-router.d.ts} +1 -1
  160. package/src/router/{fs-router.js → server/fs-router.js} +1 -1
  161. package/src/services/README.md +29 -0
  162. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
  163. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +91 -10
  164. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  165. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  166. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +2 -1
  167. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  168. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +48 -0
  169. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  170. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  171. package/src/services/assets/asset-processing-service/index.d.ts +5 -0
  172. package/src/services/assets/asset-processing-service/index.js +5 -0
  173. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  174. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  175. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  176. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +9 -4
  177. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.d.ts +5 -4
  178. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.js +15 -23
  179. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  180. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  181. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +2 -2
  182. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.js +1 -1
  183. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  184. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +16 -4
  185. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
  186. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +6 -5
  187. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +2 -2
  188. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.js +1 -1
  189. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  190. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +5 -2
  191. package/src/services/assets/browser-bundle.service.d.ts +32 -0
  192. package/src/services/assets/browser-bundle.service.js +33 -0
  193. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  194. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  195. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  196. package/src/services/html/html-rewriter-provider.service.js +68 -0
  197. package/src/services/html/html-transformer.service.d.ts +77 -0
  198. package/src/services/html/html-transformer.service.js +215 -0
  199. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  200. package/src/services/invalidation/development-invalidation.service.js +190 -0
  201. package/src/services/module-loading/app-module-loader.service.d.ts +28 -0
  202. package/src/services/module-loading/app-module-loader.service.js +35 -0
  203. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  204. package/src/services/module-loading/app-server-module-transpiler.service.js +109 -0
  205. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  206. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  207. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  208. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  209. package/src/services/module-loading/node-bootstrap-plugin.js +204 -0
  210. package/src/services/module-loading/page-module-import.service.d.ts +76 -0
  211. package/src/services/module-loading/page-module-import.service.js +173 -0
  212. package/src/services/module-loading/server-module-transpiler.service.d.ts +72 -0
  213. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  214. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  215. package/src/services/runtime-state/dev-graph.service.js +162 -0
  216. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  217. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  218. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
  219. package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
  220. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  221. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  222. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  223. package/src/static-site-generator/README.md +26 -0
  224. package/src/static-site-generator/static-site-generator.d.ts +50 -3
  225. package/src/static-site-generator/static-site-generator.js +71 -5
  226. package/src/{internal-types.d.ts → types/internal-types.d.ts} +53 -22
  227. package/src/types/internal-types.js +0 -0
  228. package/src/{public-types.d.ts → types/public-types.d.ts} +146 -21
  229. package/src/types/public-types.js +0 -0
  230. package/src/utils/html-escaping.d.ts +7 -0
  231. package/src/utils/html-escaping.js +6 -0
  232. package/src/utils/locals-utils.d.ts +1 -1
  233. package/src/utils/parse-cli-args.d.ts +4 -1
  234. package/src/utils/parse-cli-args.js +16 -1
  235. package/src/utils/resolve-work-dir.d.ts +11 -0
  236. package/src/utils/resolve-work-dir.js +31 -0
  237. package/src/watchers/project-watcher.d.ts +40 -24
  238. package/src/watchers/project-watcher.js +129 -92
  239. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  240. package/src/watchers/project-watcher.test-helpers.js +1 -0
  241. package/src/adapters/abstract/application-adapter.ts +0 -337
  242. package/src/adapters/abstract/router-adapter.ts +0 -30
  243. package/src/adapters/abstract/server-adapter.ts +0 -79
  244. package/src/adapters/bun/client-bridge.ts +0 -62
  245. package/src/adapters/bun/create-app.ts +0 -189
  246. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  247. package/src/adapters/bun/define-api-handler.ts +0 -114
  248. package/src/adapters/bun/hmr-manager.ts +0 -281
  249. package/src/adapters/bun/index.ts +0 -3
  250. package/src/adapters/bun/server-adapter.ts +0 -492
  251. package/src/adapters/bun/server-lifecycle.ts +0 -154
  252. package/src/adapters/index.ts +0 -6
  253. package/src/adapters/node/create-app.ts +0 -179
  254. package/src/adapters/node/index.d.ts +0 -4
  255. package/src/adapters/node/index.js +0 -8
  256. package/src/adapters/node/index.ts +0 -9
  257. package/src/adapters/node/node-client-bridge.ts +0 -79
  258. package/src/adapters/node/node-hmr-manager.ts +0 -271
  259. package/src/adapters/node/server-adapter.ts +0 -561
  260. package/src/adapters/node/static-content-server.ts +0 -203
  261. package/src/adapters/shared/api-response.ts +0 -104
  262. package/src/adapters/shared/application-adapter.ts +0 -199
  263. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  264. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  265. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  266. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  267. package/src/adapters/shared/render-context.ts +0 -105
  268. package/src/adapters/shared/server-adapter.ts +0 -442
  269. package/src/adapters/shared/server-route-handler.ts +0 -166
  270. package/src/adapters/shared/server-static-builder.ts +0 -82
  271. package/src/build/build-adapter.ts +0 -132
  272. package/src/build/build-types.ts +0 -83
  273. package/src/build/esbuild-build-adapter.ts +0 -510
  274. package/src/config/config-builder.ts +0 -474
  275. package/src/constants.ts +0 -39
  276. package/src/create-app.ts +0 -87
  277. package/src/define-api-handler.js +0 -15
  278. package/src/define-api-handler.ts +0 -66
  279. package/src/dev/sc-server.ts +0 -143
  280. package/src/eco/component-render-context.d.ts +0 -105
  281. package/src/eco/component-render-context.js +0 -77
  282. package/src/eco/component-render-context.ts +0 -202
  283. package/src/eco/eco.ts +0 -221
  284. package/src/eco/eco.types.ts +0 -202
  285. package/src/eco/global-injector-map.ts +0 -112
  286. package/src/eco/lazy-injector-map.ts +0 -120
  287. package/src/eco/module-dependencies.ts +0 -75
  288. package/src/errors/http-error.ts +0 -72
  289. package/src/errors/index.ts +0 -2
  290. package/src/errors/locals-access-error.ts +0 -7
  291. package/src/global/app-logger.ts +0 -4
  292. 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
  293. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  294. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  295. package/src/hmr/client/hmr-runtime.ts +0 -121
  296. package/src/hmr/hmr-strategy.ts +0 -172
  297. package/src/hmr/hmr.test.e2e.ts +0 -75
  298. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  299. package/src/hmr/strategies/js-hmr-strategy.ts +0 -308
  300. package/src/index.browser.ts +0 -3
  301. package/src/index.ts +0 -5
  302. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  303. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  304. package/src/internal-types.ts +0 -212
  305. package/src/plugins/alias-resolver-plugin.ts +0 -45
  306. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  307. package/src/plugins/integration-plugin.ts +0 -184
  308. package/src/plugins/processor.ts +0 -220
  309. package/src/public-types.ts +0 -1255
  310. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  311. package/src/route-renderer/component-graph-executor.js +0 -31
  312. package/src/route-renderer/component-graph-executor.ts +0 -84
  313. package/src/route-renderer/component-graph.d.ts +0 -42
  314. package/src/route-renderer/component-graph.js +0 -72
  315. package/src/route-renderer/component-graph.ts +0 -159
  316. package/src/route-renderer/component-marker.d.ts +0 -52
  317. package/src/route-renderer/component-marker.js +0 -46
  318. package/src/route-renderer/component-marker.ts +0 -117
  319. package/src/route-renderer/dependency-resolver.ts +0 -596
  320. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  321. package/src/route-renderer/html-post-processing.service.js +0 -86
  322. package/src/route-renderer/html-post-processing.service.ts +0 -103
  323. package/src/route-renderer/integration-renderer.d.ts +0 -339
  324. package/src/route-renderer/integration-renderer.js +0 -526
  325. package/src/route-renderer/integration-renderer.ts +0 -696
  326. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  327. package/src/route-renderer/marker-graph-resolver.js +0 -93
  328. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  329. package/src/route-renderer/page-module-loader.d.ts +0 -61
  330. package/src/route-renderer/page-module-loader.ts +0 -153
  331. package/src/route-renderer/render-execution.service.d.ts +0 -69
  332. package/src/route-renderer/render-execution.service.js +0 -91
  333. package/src/route-renderer/render-execution.service.ts +0 -158
  334. package/src/route-renderer/render-preparation.service.ts +0 -358
  335. package/src/route-renderer/route-renderer.ts +0 -80
  336. package/src/router/fs-router-scanner.ts +0 -217
  337. package/src/router/fs-router.ts +0 -122
  338. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  339. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  340. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  341. package/src/services/asset-processing-service/assets.types.ts +0 -112
  342. package/src/services/asset-processing-service/index.d.ts +0 -3
  343. package/src/services/asset-processing-service/index.js +0 -3
  344. package/src/services/asset-processing-service/index.ts +0 -3
  345. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  346. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  347. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  348. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  349. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  350. package/src/services/asset-processing-service/processors/index.js +0 -5
  351. package/src/services/asset-processing-service/processors/index.ts +0 -5
  352. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  353. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  354. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  355. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  356. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  357. package/src/services/cache/cache.types.ts +0 -126
  358. package/src/services/cache/index.ts +0 -18
  359. package/src/services/cache/memory-cache-store.ts +0 -130
  360. package/src/services/cache/page-cache-service.ts +0 -202
  361. package/src/services/html-transformer.service.d.ts +0 -50
  362. package/src/services/html-transformer.service.js +0 -163
  363. package/src/services/html-transformer.service.ts +0 -217
  364. package/src/services/page-module-import.service.d.ts +0 -37
  365. package/src/services/page-module-import.service.js +0 -88
  366. package/src/services/page-module-import.service.ts +0 -129
  367. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  368. package/src/services/schema-validation-service.ts +0 -204
  369. package/src/services/validation/standard-schema.types.ts +0 -68
  370. package/src/static-site-generator/static-site-generator.ts +0 -359
  371. package/src/utils/css.d.ts +0 -1
  372. package/src/utils/css.js +0 -7
  373. package/src/utils/css.ts +0 -5
  374. package/src/utils/deep-merge.ts +0 -47
  375. package/src/utils/hash.ts +0 -5
  376. package/src/utils/html.ts +0 -1
  377. package/src/utils/invariant.ts +0 -15
  378. package/src/utils/locals-utils.ts +0 -37
  379. package/src/utils/parse-cli-args.ts +0 -83
  380. package/src/utils/path-utils.module.ts +0 -14
  381. package/src/utils/runtime.ts +0 -44
  382. package/src/utils/server-utils.module.ts +0 -67
  383. package/src/watchers/project-watcher.test-helpers.ts +0 -40
  384. package/src/watchers/project-watcher.ts +0 -306
  385. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  386. /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
  387. /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
  388. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  389. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  390. /package/src/{public-types.js → services/module-loading/module-loading-types.js} +0 -0
  391. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -1,14 +1,25 @@
1
1
  import { createRequire } from "node:module";
2
+ import path from "node:path";
2
3
  import {
3
4
  AssetFactory
4
- } from "../services/asset-processing-service/index.js";
5
- import { buildGlobalInjectorBootstrapContent, buildGlobalInjectorMapScript } from "../eco/global-injector-map.js";
6
- import { runWithComponentRenderContext } from "../eco/component-render-context.js";
7
- const coreRequire = createRequire(import.meta.url);
5
+ } from "../../services/assets/asset-processing-service/index.js";
6
+ import { buildGlobalInjectorBootstrapContent, buildGlobalInjectorMapScript } from "../../eco/global-injector-map.js";
7
+ import { BoundaryPlanningService } from "./boundary-planning.service.js";
8
8
  class RenderPreparationService {
9
- constructor(appConfig, assetProcessingService) {
9
+ appConfig;
10
+ assetProcessingService;
11
+ boundaryPlanningService;
12
+ /**
13
+ * Creates the render-preparation orchestrator for one app instance.
14
+ *
15
+ * @remarks
16
+ * The service is app-scoped because it depends on finalized config defaults and
17
+ * the app-owned asset-processing pipeline while remaining renderer-agnostic.
18
+ */
19
+ constructor(appConfig, assetProcessingService, dependencies = {}) {
10
20
  this.appConfig = appConfig;
11
21
  this.assetProcessingService = assetProcessingService;
22
+ this.boundaryPlanningService = dependencies.boundaryPlanningService ?? new BoundaryPlanningService(appConfig);
12
23
  }
13
24
  /**
14
25
  * Builds the final render options object used by the integration-specific
@@ -30,6 +41,13 @@ class RenderPreparationService {
30
41
  const HtmlTemplate = await callbacks.getHtmlTemplate();
31
42
  const { props, metadata } = await callbacks.resolvePageData(pageModule, routeOptions);
32
43
  const Layout = Page.config?.layout;
44
+ const boundaryPlan = this.boundaryPlanningService.buildPlan({
45
+ routeFile: routeOptions.file,
46
+ currentIntegrationName,
47
+ HtmlTemplate,
48
+ Layout,
49
+ Page
50
+ });
33
51
  const componentsToResolve = Layout ? [HtmlTemplate, Layout, Page] : [HtmlTemplate, Page];
34
52
  const resolvedDependencies = await callbacks.resolveDependencies(componentsToResolve);
35
53
  const usedIntegrationDependencies = this.collectUsedIntegrationDependencies(
@@ -40,13 +58,13 @@ class RenderPreparationService {
40
58
  const allDependencies = [...resolvedDependencies, ...usedIntegrationDependencies, ...pageDeps];
41
59
  let componentRender;
42
60
  if (callbacks.shouldRenderPageComponent({ Page, Layout, options: routeOptions })) {
43
- componentRender = await this.renderPageRoot({
44
- currentIntegrationName,
61
+ const pageRootRender = await this.renderPageRoot({
45
62
  Page,
46
63
  props,
47
64
  routeOptions,
48
65
  callbacks
49
66
  });
67
+ componentRender = pageRootRender.componentRender;
50
68
  if (componentRender.assets?.length) {
51
69
  allDependencies.push(...componentRender.assets);
52
70
  }
@@ -56,6 +74,10 @@ class RenderPreparationService {
56
74
  const globalAssets = await this.buildGlobalInjectorAssets(triggers, currentIntegrationName);
57
75
  allDependencies.push(...globalAssets);
58
76
  }
77
+ const eagerSsrLazyAssets = await this.buildEagerSsrLazyAssets(componentsToResolve, currentIntegrationName);
78
+ if (eagerSsrLazyAssets.length > 0) {
79
+ allDependencies.push(...eagerSsrLazyAssets);
80
+ }
59
81
  callbacks.setProcessedDependencies(callbacks.dedupeProcessedAssets(allDependencies));
60
82
  const pageProps = {
61
83
  ...props,
@@ -82,7 +104,8 @@ class RenderPreparationService {
82
104
  pageProps,
83
105
  locals,
84
106
  pageLocals,
85
- cacheStrategy
107
+ cacheStrategy,
108
+ boundaryPlan
86
109
  };
87
110
  return {
88
111
  ...integrationSpecificProps,
@@ -102,6 +125,9 @@ class RenderPreparationService {
102
125
  collectResolvedTriggers(components, seen = /* @__PURE__ */ new Set()) {
103
126
  const triggers = [];
104
127
  for (const comp of components) {
128
+ if (!comp) {
129
+ continue;
130
+ }
105
131
  const ecoComp = comp;
106
132
  if (seen.has(ecoComp)) {
107
133
  continue;
@@ -152,6 +178,9 @@ class RenderPreparationService {
152
178
  collectIntegrationNames(components, seen = /* @__PURE__ */ new Set()) {
153
179
  const integrationNames = /* @__PURE__ */ new Set();
154
180
  for (const comp of components) {
181
+ if (!comp) {
182
+ continue;
183
+ }
155
184
  const ecoComp = comp;
156
185
  if (seen.has(ecoComp)) {
157
186
  continue;
@@ -180,12 +209,8 @@ class RenderPreparationService {
180
209
  * @returns Structured component render result.
181
210
  */
182
211
  async renderPageRoot(input) {
183
- const execution = await runWithComponentRenderContext(
184
- {
185
- currentIntegration: input.currentIntegrationName,
186
- boundaryContext: input.callbacks.getComponentRenderBoundaryContext()
187
- },
188
- async () => input.callbacks.renderPageComponent({
212
+ return {
213
+ componentRender: await input.callbacks.renderPageComponent({
189
214
  component: input.Page,
190
215
  props: {
191
216
  ...input.props,
@@ -193,8 +218,7 @@ class RenderPreparationService {
193
218
  query: input.routeOptions.query || {}
194
219
  }
195
220
  })
196
- );
197
- return execution.value;
221
+ };
198
222
  }
199
223
  /**
200
224
  * Builds the runtime assets needed to bootstrap global lazy trigger execution.
@@ -203,7 +227,7 @@ class RenderPreparationService {
203
227
  * @returns Processed assets that should be merged into the final dependency set.
204
228
  */
205
229
  async buildGlobalInjectorAssets(triggers, currentIntegrationName) {
206
- const globalInjectorImportPath = coreRequire.resolve("@ecopages/scripts-injector/global");
230
+ const globalInjectorImportPath = createRequire(import.meta.url).resolve("@ecopages/scripts-injector/global");
207
231
  const globalInjectorRuntimeAsset = AssetFactory.createNodeModuleScript({
208
232
  position: "head",
209
233
  name: "ecopages-scripts-injector-global",
@@ -237,6 +261,80 @@ class RenderPreparationService {
237
261
  currentIntegrationName
238
262
  );
239
263
  }
264
+ async buildEagerSsrLazyAssets(components, currentIntegrationName) {
265
+ const dependencies = this.collectEagerSsrLazyDependencies(components);
266
+ if (dependencies.length === 0) {
267
+ return [];
268
+ }
269
+ return this.assetProcessingService.processDependencies(dependencies, `${currentIntegrationName}:ssr-lazy`);
270
+ }
271
+ collectEagerSsrLazyDependencies(components) {
272
+ const dependencies = [];
273
+ const visitedConfigs = /* @__PURE__ */ new Set();
274
+ const seenKeys = /* @__PURE__ */ new Set();
275
+ const normalizeAttributes = (attributes) => ({
276
+ type: "module",
277
+ defer: "",
278
+ ...attributes ?? {}
279
+ });
280
+ const collect = (config) => {
281
+ if (!config || visitedConfigs.has(config)) {
282
+ return;
283
+ }
284
+ visitedConfigs.add(config);
285
+ const componentFile = config.__eco?.file;
286
+ if (componentFile) {
287
+ const componentDir = path.dirname(componentFile);
288
+ for (const script of config.dependencies?.scripts ?? []) {
289
+ if (typeof script === "string" || !script.lazy || script.ssr !== true) {
290
+ continue;
291
+ }
292
+ const attributes = normalizeAttributes(script.attributes);
293
+ if (script.content) {
294
+ const key2 = `content:${script.content}:${JSON.stringify(attributes)}`;
295
+ if (seenKeys.has(key2)) {
296
+ continue;
297
+ }
298
+ seenKeys.add(key2);
299
+ dependencies.push(
300
+ AssetFactory.createContentScript({
301
+ position: "head",
302
+ content: script.content,
303
+ attributes
304
+ })
305
+ );
306
+ continue;
307
+ }
308
+ if (!script.src) {
309
+ continue;
310
+ }
311
+ const resolvedPath = path.resolve(componentDir, script.src);
312
+ const key = `file:${resolvedPath}:${JSON.stringify(attributes)}`;
313
+ if (seenKeys.has(key)) {
314
+ continue;
315
+ }
316
+ seenKeys.add(key);
317
+ dependencies.push(
318
+ AssetFactory.createFileScript({
319
+ filepath: resolvedPath,
320
+ position: "head",
321
+ attributes
322
+ })
323
+ );
324
+ }
325
+ }
326
+ if (config.layout?.config) {
327
+ collect(config.layout.config);
328
+ }
329
+ for (const nestedComponent of config.dependencies?.components ?? []) {
330
+ collect(nestedComponent?.config);
331
+ }
332
+ };
333
+ for (const component of components) {
334
+ collect(component.config);
335
+ }
336
+ return dependencies;
337
+ }
240
338
  }
241
339
  export {
242
340
  RenderPreparationService
@@ -0,0 +1,50 @@
1
+ import type { ComponentRenderInput, ComponentRenderResult, EcoComponent, HtmlTemplateProps, PageMetadataProps } from '../../types/public-types.js';
2
+ import type { ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
3
+ import type { RenderToResponseContext } from './integration-renderer.js';
4
+ export interface RouteShellComposerCallbacks {
5
+ hasForeignBoundaryDescendants(component: EcoComponent): boolean;
6
+ createHtmlResponse(body: BodyInit, ctx: RenderToResponseContext): Response;
7
+ renderComponentBoundary(input: ComponentRenderInput): Promise<ComponentRenderResult>;
8
+ prepareViewDependencies(view: EcoComponent, layout?: EcoComponent): Promise<ProcessedAsset[]>;
9
+ getHtmlTemplate(): Promise<EcoComponent<HtmlTemplateProps>>;
10
+ resolveViewMetadata<P>(view: EcoComponent<P>, props: P): Promise<PageMetadataProps>;
11
+ appendProcessedDependencies(...assetGroups: Array<readonly ProcessedAsset[] | undefined>): ProcessedAsset[];
12
+ finalizeResolvedHtml(options: {
13
+ html: string;
14
+ partial?: boolean;
15
+ componentRootAttributes?: Record<string, string>;
16
+ documentAttributes?: Record<string, string>;
17
+ transformHtml?: boolean;
18
+ }): Promise<string>;
19
+ docType: string;
20
+ }
21
+ export declare class RouteShellComposer {
22
+ renderPartialViewResponse<P>(input: {
23
+ view: EcoComponent<P>;
24
+ props: P;
25
+ ctx: RenderToResponseContext;
26
+ renderInline?: () => Promise<BodyInit>;
27
+ transformHtml?: (html: string) => string;
28
+ }, callbacks: RouteShellComposerCallbacks): Promise<Response>;
29
+ renderViewWithDocumentShell<P>(input: {
30
+ view: EcoComponent<P>;
31
+ props: P;
32
+ ctx: RenderToResponseContext;
33
+ layout?: EcoComponent;
34
+ }, callbacks: RouteShellComposerCallbacks): Promise<Response>;
35
+ renderPageWithDocumentShell(input: {
36
+ page: {
37
+ component: EcoComponent;
38
+ props: Record<string, unknown>;
39
+ };
40
+ layout?: {
41
+ component: EcoComponent;
42
+ props?: Record<string, unknown>;
43
+ };
44
+ htmlTemplate: EcoComponent;
45
+ metadata: PageMetadataProps;
46
+ pageProps: Record<string, unknown>;
47
+ documentProps?: Record<string, unknown>;
48
+ transformDocumentHtml?: (html: string) => string;
49
+ }, callbacks: RouteShellComposerCallbacks): Promise<string>;
50
+ }
@@ -0,0 +1,81 @@
1
+ class RouteShellComposer {
2
+ async renderPartialViewResponse(input, callbacks) {
3
+ if (input.renderInline && !callbacks.hasForeignBoundaryDescendants(input.view)) {
4
+ return callbacks.createHtmlResponse(await input.renderInline(), input.ctx);
5
+ }
6
+ const rendererCache = /* @__PURE__ */ new Map();
7
+ const viewRender = await callbacks.renderComponentBoundary({
8
+ component: input.view,
9
+ props: input.props ?? {},
10
+ integrationContext: { rendererCache }
11
+ });
12
+ const html = input.transformHtml ? input.transformHtml(viewRender.html) : viewRender.html;
13
+ return callbacks.createHtmlResponse(html, input.ctx);
14
+ }
15
+ async renderViewWithDocumentShell(input, callbacks) {
16
+ const normalizedProps = input.props ?? {};
17
+ if (input.ctx.partial) {
18
+ return this.renderPartialViewResponse(input, callbacks);
19
+ }
20
+ await callbacks.prepareViewDependencies(input.view, input.layout);
21
+ const HtmlTemplate = await callbacks.getHtmlTemplate();
22
+ const metadata = await callbacks.resolveViewMetadata(input.view, input.props);
23
+ const rendererCache = /* @__PURE__ */ new Map();
24
+ const viewRender = await callbacks.renderComponentBoundary({
25
+ component: input.view,
26
+ props: normalizedProps,
27
+ integrationContext: { rendererCache }
28
+ });
29
+ const layoutRender = input.layout ? await callbacks.renderComponentBoundary({
30
+ component: input.layout,
31
+ props: {},
32
+ children: viewRender.html,
33
+ integrationContext: { rendererCache }
34
+ }) : void 0;
35
+ const documentRender = await callbacks.renderComponentBoundary({
36
+ component: HtmlTemplate,
37
+ props: {
38
+ metadata,
39
+ pageProps: normalizedProps
40
+ },
41
+ children: layoutRender?.html ?? viewRender.html,
42
+ integrationContext: { rendererCache }
43
+ });
44
+ callbacks.appendProcessedDependencies(viewRender.assets, layoutRender?.assets, documentRender.assets);
45
+ const html = await callbacks.finalizeResolvedHtml({
46
+ html: `${callbacks.docType}${documentRender.html}`,
47
+ partial: false
48
+ });
49
+ return callbacks.createHtmlResponse(html, input.ctx);
50
+ }
51
+ async renderPageWithDocumentShell(input, callbacks) {
52
+ const rendererCache = /* @__PURE__ */ new Map();
53
+ const pageRender = await callbacks.renderComponentBoundary({
54
+ component: input.page.component,
55
+ props: input.page.props,
56
+ integrationContext: { rendererCache }
57
+ });
58
+ const layoutRender = input.layout ? await callbacks.renderComponentBoundary({
59
+ component: input.layout.component,
60
+ props: input.layout.props ?? {},
61
+ children: pageRender.html,
62
+ integrationContext: { rendererCache }
63
+ }) : void 0;
64
+ const documentRender = await callbacks.renderComponentBoundary({
65
+ component: input.htmlTemplate,
66
+ props: {
67
+ metadata: input.metadata,
68
+ pageProps: input.pageProps,
69
+ ...input.documentProps ?? {}
70
+ },
71
+ children: layoutRender?.html ?? pageRender.html,
72
+ integrationContext: { rendererCache }
73
+ });
74
+ callbacks.appendProcessedDependencies(pageRender.assets, layoutRender?.assets, documentRender.assets);
75
+ const documentHtml = input.transformDocumentHtml ? input.transformDocumentHtml(documentRender.html) : documentRender.html;
76
+ return `${callbacks.docType}${documentHtml}`;
77
+ }
78
+ }
79
+ export {
80
+ RouteShellComposer
81
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Minimal template-result shape that core can serialize generically.
3
+ *
4
+ * @remarks
5
+ * Core intentionally models only the transport shape used during deferred
6
+ * cross-integration child passing: alternating static string segments plus
7
+ * interpolated runtime values. Concrete runtime markers that identify a given
8
+ * framework's template payload must stay outside core and be registered by the
9
+ * owning integration package.
10
+ */
11
+ export type SerializableTemplateShape = {
12
+ strings: readonly string[];
13
+ values?: readonly unknown[];
14
+ };
15
+ /**
16
+ * Integration-owned adapter that teaches core how to serialize one deferred
17
+ * template payload shape.
18
+ *
19
+ * @remarks
20
+ * The separation here is intentional: core owns the HTML serialization logic,
21
+ * but integrations own runtime-shape detection. That keeps package-specific
22
+ * markers such as framework template sentinels out of core while still letting
23
+ * deferred children round-trip through mixed renderer boundaries.
24
+ */
25
+ export type DeferredTemplateSerializer<TTemplate extends SerializableTemplateShape = SerializableTemplateShape> = {
26
+ matches(value: unknown): value is TTemplate;
27
+ serialize(template: TTemplate, serializeValue: (value: unknown) => string | undefined): string;
28
+ };
29
+ /**
30
+ * Serializes a generic template shape into HTML.
31
+ *
32
+ * @remarks
33
+ * This handles only HTML reconstruction semantics: quoted attribute values,
34
+ * boolean attributes, and omission of client-only event or property bindings.
35
+ * It does not decide whether an arbitrary value belongs to a framework-specific
36
+ * template runtime; integrations must make that decision before delegating here.
37
+ */
38
+ export declare function serializeTemplateShape(template: SerializableTemplateShape, serializeValue: (value: unknown) => string | undefined): string;
@@ -0,0 +1,45 @@
1
+ import { escapeHtmlAttribute } from "../../utils/html-escaping.js";
2
+ const ATTRIBUTE_TAIL_PATTERN = /(\s+)([@.?!]?)([^\s"'<>/=`@.?!]+)=$/;
3
+ function getSerializableTemplateAttribute(stringPart) {
4
+ const match = ATTRIBUTE_TAIL_PATTERN.exec(stringPart);
5
+ if (!match) return void 0;
6
+ return {
7
+ leading: stringPart.slice(0, match.index),
8
+ whitespace: match[1],
9
+ prefix: match[2],
10
+ name: match[3]
11
+ };
12
+ }
13
+ function serializeTemplateShape(template, serializeValue) {
14
+ const values = template.values ?? [];
15
+ let html = "";
16
+ for (let index = 0; index < values.length; index += 1) {
17
+ const stringPart = template.strings[index] ?? "";
18
+ const serializedValue = serializeValue(values[index]);
19
+ const attribute = getSerializableTemplateAttribute(stringPart);
20
+ if (!attribute) {
21
+ html += stringPart;
22
+ html += serializedValue ?? "";
23
+ continue;
24
+ }
25
+ html += attribute.leading;
26
+ if (attribute.prefix === "@" || attribute.prefix === "!" || attribute.prefix === ".") {
27
+ continue;
28
+ }
29
+ if (attribute.prefix === "?") {
30
+ if (serializedValue) {
31
+ html += `${attribute.whitespace}${attribute.name}`;
32
+ }
33
+ continue;
34
+ }
35
+ if (serializedValue === void 0) {
36
+ continue;
37
+ }
38
+ html += `${attribute.whitespace}${attribute.name}="${escapeHtmlAttribute(serializedValue)}"`;
39
+ }
40
+ html += template.strings[values.length] ?? "";
41
+ return html;
42
+ }
43
+ export {
44
+ serializeTemplateShape
45
+ };
@@ -1,6 +1,6 @@
1
- import type { EcoComponent } from '../public-types.js';
2
- import type { EcoPagesAppConfig } from '../internal-types.js';
3
- import type { AssetProcessingService, ProcessedAsset } from '../services/asset-processing-service/index.js';
1
+ import type { EcoComponent } from '../../types/public-types.js';
2
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
3
+ import type { AssetProcessingService, ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
4
4
  export declare const DEPENDENCY_ERRORS: {
5
5
  readonly INVALID_STYLESHEET_ENTRY: "Invalid stylesheet dependency entry: expected src or content";
6
6
  readonly INVALID_SCRIPT_ENTRY: "Invalid script dependency entry: expected src or content";
@@ -9,7 +9,18 @@ export declare const DEPENDENCY_ERRORS: {
9
9
  export declare class DependencyResolverService {
10
10
  private appConfig;
11
11
  private assetProcessingService;
12
+ /**
13
+ * Creates the dependency resolver used by route and component rendering.
14
+ *
15
+ * @remarks
16
+ * The resolver stays intentionally separate from HTML rendering so component
17
+ * dependency collection, lazy trigger grouping, and processed-asset generation
18
+ * can evolve without changing renderer implementations.
19
+ */
12
20
  constructor(appConfig: EcoPagesAppConfig, assetProcessingService: AssetProcessingService);
21
+ /**
22
+ * Resolves one dependency path relative to the component that declared it.
23
+ */
13
24
  resolveDependencyPath(componentDir: string, pathUrl: string): string;
14
25
  /**
15
26
  * Maps lazy script source entries to deterministic fallback public URLs
@@ -20,5 +31,5 @@ export declare class DependencyResolverService {
20
31
  * Collects and processes component dependencies (styles, scripts, modules, lazy scripts).
21
32
  * Lazy dependencies are always resolved into global-injector trigger maps.
22
33
  */
23
- processComponentDependencies(components: (EcoComponent | Partial<EcoComponent>)[], integrationName: string): Promise<ProcessedAsset[]>;
34
+ processComponentDependencies(components: Array<EcoComponent | Partial<EcoComponent> | undefined | null>, integrationName: string): Promise<ProcessedAsset[]>;
24
35
  }
@@ -1,8 +1,8 @@
1
1
  import path from "node:path";
2
2
  import { readFileSync } from "node:fs";
3
- import { rapidhash } from "../utils/hash.js";
4
- import { AssetFactory } from "../services/asset-processing-service/index.js";
5
- import { normalizeModuleDeclarations } from "../eco/module-dependencies.js";
3
+ import { rapidhash } from "../../utils/hash.js";
4
+ import { AssetFactory } from "../../services/assets/asset-processing-service/index.js";
5
+ import { normalizeModuleDeclarations } from "../../eco/module-dependencies.js";
6
6
  import { parseSync } from "oxc-parser";
7
7
  const DEPENDENCY_ERRORS = {
8
8
  INVALID_STYLESHEET_ENTRY: "Invalid stylesheet dependency entry: expected src or content",
@@ -34,7 +34,12 @@ function extractEcopagesVirtualImports(file) {
34
34
  const namedImports = [];
35
35
  for (const spec of node.specifiers ?? []) {
36
36
  if (spec.type === "ImportSpecifier") {
37
- const importedName = spec.imported?.type === "Identifier" ? spec.imported.name : spec.imported?.type === "Literal" ? spec.imported.value : spec.local?.name;
37
+ let importedName = spec.local?.name;
38
+ if (spec.imported?.type === "Identifier") {
39
+ importedName = spec.imported.name;
40
+ } else if (spec.imported?.type === "Literal") {
41
+ importedName = spec.imported.value;
42
+ }
38
43
  namedImports.push(importedName);
39
44
  }
40
45
  }
@@ -62,7 +67,7 @@ function createModuleScriptName(from, imports) {
62
67
  return `module-${hash}`;
63
68
  }
64
69
  function createNamedImportModuleSource(from, imports) {
65
- const namedImports = imports.join(", ");
70
+ const namedImports = [...new Set(imports)].sort().join(", ");
66
71
  return `export { ${namedImports} } from '${from}';`;
67
72
  }
68
73
  function createNamespaceImportModuleSource(from) {
@@ -139,10 +144,23 @@ function buildResolvedLazyTriggers(config, groups) {
139
144
  return [{ triggerId, rules }];
140
145
  }
141
146
  class DependencyResolverService {
147
+ appConfig;
148
+ assetProcessingService;
149
+ /**
150
+ * Creates the dependency resolver used by route and component rendering.
151
+ *
152
+ * @remarks
153
+ * The resolver stays intentionally separate from HTML rendering so component
154
+ * dependency collection, lazy trigger grouping, and processed-asset generation
155
+ * can evolve without changing renderer implementations.
156
+ */
142
157
  constructor(appConfig, assetProcessingService) {
143
158
  this.appConfig = appConfig;
144
159
  this.assetProcessingService = assetProcessingService;
145
160
  }
161
+ /**
162
+ * Resolves one dependency path relative to the component that declared it.
163
+ */
146
164
  resolveDependencyPath(componentDir, pathUrl) {
147
165
  return resolveDependencyPath(componentDir, pathUrl);
148
166
  }
@@ -163,6 +181,7 @@ class DependencyResolverService {
163
181
  const lazyScriptsByConfig = /* @__PURE__ */ new Map();
164
182
  const lazyDependencyKeys = /* @__PURE__ */ new Set();
165
183
  for (const component of components) {
184
+ if (!component) continue;
166
185
  const componentFile = component.config?.__eco?.file;
167
186
  if (!componentFile) continue;
168
187
  const stylesheetDependencyKeys = /* @__PURE__ */ new Set();
@@ -245,14 +264,11 @@ class DependencyResolverService {
245
264
  }
246
265
  scriptDependencyKeys.add(depKey2);
247
266
  dependencies.push(
248
- AssetFactory.createContentScript({
267
+ AssetFactory.createInlineContentScript({
249
268
  position: "head",
250
269
  content,
251
- attributes: {
252
- type: "module",
253
- defer: "",
254
- ...attributes
255
- }
270
+ bundle: false,
271
+ attributes
256
272
  })
257
273
  );
258
274
  continue;
@@ -357,7 +373,7 @@ class DependencyResolverService {
357
373
  }
358
374
  if (dependenciesConfig?.components) {
359
375
  for (const nestedComponent of dependenciesConfig.components) {
360
- if (nestedComponent.config) {
376
+ if (nestedComponent?.config) {
361
377
  collect(nestedComponent.config);
362
378
  }
363
379
  }
@@ -0,0 +1,90 @@
1
+ import type { EcoPageFile, GetMetadata, GetMetadataContext, GetStaticProps, PageMetadataProps, RouteRendererOptions, EcoPageComponent } from '../../types/public-types.js';
2
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
3
+ /**
4
+ * Loads route page modules and normalizes their data hooks for rendering.
5
+ *
6
+ * @remarks
7
+ * This service keeps the render pipeline from depending directly on raw module
8
+ * imports. It owns the shared server-module transpiler setup, the precedence
9
+ * rules between component statics and module exports, and the normalization of
10
+ * page props and metadata into one renderer-facing shape.
11
+ */
12
+ export declare class PageModuleLoaderService {
13
+ private appModuleLoader;
14
+ private appConfig;
15
+ private runtimeOrigin;
16
+ /**
17
+ * Creates the page-module loader for one app/runtime instance.
18
+ *
19
+ * @param appConfig Finalized app config that owns build and invalidation state.
20
+ * @param runtimeOrigin Runtime origin exposed to page data hooks.
21
+ */
22
+ constructor(appConfig: EcoPagesAppConfig, runtimeOrigin: string);
23
+ /**
24
+ * Imports one page module through the shared server-side module loading path.
25
+ *
26
+ * @remarks
27
+ * The underlying transpiler keeps Bun and Node aligned on one framework-owned
28
+ * loading contract even though the runtime-specific execution transport differs.
29
+ */
30
+ importPageFile(file: string, options?: {
31
+ bypassCache?: boolean;
32
+ cacheScope?: string;
33
+ }): Promise<EcoPageFile>;
34
+ /**
35
+ * Executes the page's static-props hook with Ecopages runtime context.
36
+ *
37
+ * @remarks
38
+ * Pages without a static-props hook still return a normalized empty props
39
+ * object so downstream render preparation does not branch on hook presence.
40
+ */
41
+ getStaticPropsForPage(options: {
42
+ getStaticProps?: GetStaticProps<Record<string, unknown>>;
43
+ params?: RouteRendererOptions['params'];
44
+ }): Promise<{
45
+ props: Record<string, unknown>;
46
+ metadata?: PageMetadataProps;
47
+ }>;
48
+ /**
49
+ * Builds the final page metadata object for one render request.
50
+ *
51
+ * @remarks
52
+ * App-level default metadata forms the baseline, then page-level metadata is
53
+ * overlaid so route-specific fields win without dropping global defaults.
54
+ */
55
+ getMetadataPropsForPage(options: {
56
+ getMetadata: GetMetadata | undefined;
57
+ context: GetMetadataContext;
58
+ }): Promise<PageMetadataProps>;
59
+ /**
60
+ * Loads a page module and normalizes integration-facing exports.
61
+ * When both component static methods and module exports exist, component statics win.
62
+ */
63
+ resolvePageModule(options: {
64
+ file: string;
65
+ importPageFileFn?: (file: string) => Promise<EcoPageFile>;
66
+ }): Promise<{
67
+ Page: EcoPageFile['default'] | EcoPageComponent<any>;
68
+ getStaticProps?: GetStaticProps<Record<string, unknown>>;
69
+ getMetadata?: GetMetadata;
70
+ integrationSpecificProps: Record<string, unknown>;
71
+ }>;
72
+ /**
73
+ * Resolves the page data needed by the render pipeline.
74
+ *
75
+ * @remarks
76
+ * Static props are resolved first because page metadata may depend on those
77
+ * props. This preserves the same ordering whether data hooks are declared as
78
+ * component statics or module exports.
79
+ */
80
+ resolvePageData(options: {
81
+ pageModule: {
82
+ getStaticProps?: GetStaticProps<Record<string, unknown>>;
83
+ getMetadata?: GetMetadata;
84
+ };
85
+ routeOptions: RouteRendererOptions;
86
+ }): Promise<{
87
+ props: Record<string, unknown>;
88
+ metadata: PageMetadataProps;
89
+ }>;
90
+ }