@ecopages/core 0.2.0-beta.1 → 0.2.0-beta.10

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 (216) hide show
  1. package/package.json +107 -3
  2. package/src/adapters/abstract/application-adapter.d.ts +73 -1
  3. package/src/adapters/abstract/application-adapter.js +89 -0
  4. package/src/adapters/abstract/server-adapter.d.ts +3 -0
  5. package/src/adapters/abstract/ws-pattern-matcher.d.ts +60 -0
  6. package/src/adapters/abstract/ws-pattern-matcher.js +61 -0
  7. package/src/adapters/bun/client-bridge.d.ts +1 -0
  8. package/src/adapters/bun/client-bridge.js +3 -0
  9. package/src/adapters/bun/create-app.d.ts +5 -3
  10. package/src/adapters/bun/create-app.js +44 -39
  11. package/src/adapters/bun/hmr-manager.d.ts +2 -1
  12. package/src/adapters/bun/hmr-manager.js +2 -2
  13. package/src/adapters/bun/server-adapter.d.ts +81 -20
  14. package/src/adapters/bun/server-adapter.js +220 -78
  15. package/src/adapters/bun/static-preview-host.js +25 -20
  16. package/src/adapters/create-app.d.ts +13 -0
  17. package/src/adapters/create-app.js +10 -1
  18. package/src/adapters/node/create-app.d.ts +4 -0
  19. package/src/adapters/node/create-app.js +38 -9
  20. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  21. package/src/adapters/node/node-client-bridge.js +3 -0
  22. package/src/adapters/node/node-hmr-manager.d.ts +2 -1
  23. package/src/adapters/node/node-hmr-manager.js +2 -2
  24. package/src/adapters/node/server-adapter-dependencies.js +2 -0
  25. package/src/adapters/node/server-adapter.d.ts +55 -19
  26. package/src/adapters/node/server-adapter.js +140 -132
  27. package/src/adapters/node/static-content-server.d.ts +1 -0
  28. package/src/adapters/node/static-content-server.js +10 -2
  29. package/src/adapters/node/static-preview-host.js +27 -12
  30. package/src/adapters/shared/bun-user-websocket-lifecycle.d.ts +22 -0
  31. package/src/adapters/shared/bun-user-websocket-lifecycle.js +96 -0
  32. package/src/adapters/shared/copy-runtime-public-dir.d.ts +6 -0
  33. package/src/adapters/shared/copy-runtime-public-dir.js +24 -0
  34. package/src/adapters/shared/hmr-html-response.d.ts +1 -1
  35. package/src/adapters/shared/hmr-html-response.js +4 -1
  36. package/src/adapters/shared/node-http-websocket-upgrades.d.ts +21 -0
  37. package/src/adapters/shared/node-http-websocket-upgrades.js +100 -0
  38. package/src/adapters/shared/port-manager.d.ts +116 -0
  39. package/src/adapters/shared/port-manager.js +196 -0
  40. package/src/adapters/shared/runtime-app-bootstrap.d.ts +2 -1
  41. package/src/adapters/shared/runtime-app-bootstrap.js +3 -6
  42. package/src/adapters/shared/runtime-server-lifecycle.d.ts +38 -0
  43. package/src/adapters/shared/runtime-server-lifecycle.js +39 -0
  44. package/src/adapters/shared/server-adapter.d.ts +2 -1
  45. package/src/adapters/shared/server-adapter.js +12 -4
  46. package/src/adapters/shared/server-route-handler.d.ts +4 -1
  47. package/src/adapters/shared/server-route-handler.js +5 -2
  48. package/src/adapters/shared/server-static-builder.d.ts +14 -29
  49. package/src/adapters/shared/server-static-builder.js +91 -70
  50. package/src/adapters/shared/shared-hmr-manager.d.ts +12 -0
  51. package/src/adapters/shared/shared-hmr-manager.js +64 -7
  52. package/src/adapters/shared/static-preview-host.d.ts +5 -0
  53. package/src/adapters/shared/websocket-lifecycle.d.ts +24 -0
  54. package/src/adapters/shared/websocket-lifecycle.js +55 -0
  55. package/src/build/README.md +77 -14
  56. package/src/build/app-build-manifest-runtime.d.ts +10 -0
  57. package/src/build/app-build-manifest-runtime.js +90 -0
  58. package/src/build/build-adapter.d.ts +17 -319
  59. package/src/build/build-adapter.js +28 -94
  60. package/src/build/build-contracts.d.ts +97 -0
  61. package/src/build/build-contracts.js +0 -0
  62. package/src/build/build-input-fingerprint.d.ts +28 -0
  63. package/src/build/build-input-fingerprint.js +31 -0
  64. package/src/build/build-profile-options.d.ts +7 -0
  65. package/src/build/build-profile-options.js +37 -0
  66. package/src/build/build-runtime.d.ts +24 -0
  67. package/src/build/build-runtime.js +65 -0
  68. package/src/build/deduping-build-executor.d.ts +28 -0
  69. package/src/build/deduping-build-executor.js +56 -0
  70. package/src/build/jsx-ownership-plugins.d.ts +24 -0
  71. package/src/build/jsx-ownership-plugins.js +41 -0
  72. package/src/build/pages-unified-graph-build.d.ts +31 -0
  73. package/src/build/pages-unified-graph-build.js +206 -0
  74. package/src/build/parallel-build-executor.d.ts +21 -0
  75. package/src/build/parallel-build-executor.js +52 -0
  76. package/src/build/production-build-cache.d.ts +20 -0
  77. package/src/build/production-build-cache.js +63 -0
  78. package/src/build/rolldown-adapter-helpers.d.ts +3 -6
  79. package/src/build/rolldown-adapter-helpers.js +71 -6
  80. package/src/build/rolldown-build-adapter.d.ts +2 -6
  81. package/src/build/rolldown-build-adapter.js +3 -3
  82. package/src/build/rolldown-build-invocation-metrics.d.ts +12 -0
  83. package/src/build/rolldown-build-invocation-metrics.js +43 -0
  84. package/src/build/rolldown-plugin-bridge.d.ts +15 -1
  85. package/src/build/rolldown-plugin-bridge.js +20 -5
  86. package/src/build/rolldown-source-transform-pass.d.ts +15 -0
  87. package/src/build/rolldown-source-transform-pass.js +58 -0
  88. package/src/build/runtime-build-executor.d.ts +8 -15
  89. package/src/build/runtime-build-executor.js +12 -15
  90. package/src/build/runtime-build-output-normalizer.d.ts +7 -0
  91. package/src/build/runtime-build-output-normalizer.js +94 -2
  92. package/src/build/server-entry-build-cache.d.ts +44 -0
  93. package/src/build/server-entry-build-cache.js +161 -0
  94. package/src/config/config-builder.d.ts +12 -7
  95. package/src/config/config-builder.js +12 -9
  96. package/src/dev/client-bridge-registry.d.ts +5 -0
  97. package/src/dev/client-bridge-registry.js +15 -0
  98. package/src/dev/dev-client-ownership.d.ts +7 -0
  99. package/src/dev/dev-client-ownership.js +6 -0
  100. package/src/dev/host-runtime.d.ts +3 -0
  101. package/src/dev/host-runtime.js +7 -0
  102. package/src/hmr/client/hmr-runtime.js +5 -2
  103. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  104. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +29 -0
  105. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  106. package/src/integrations/ghtml/ghtml-renderer.js +2 -51
  107. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  108. package/src/integrations/ghtml/ghtml.plugin.js +7 -14
  109. package/src/plugins/define-integration.d.ts +26 -0
  110. package/src/plugins/define-integration.js +19 -0
  111. package/src/plugins/eco-component-meta-plugin.js +5 -8
  112. package/src/plugins/foreign-jsx-override-plugin.js +4 -6
  113. package/src/plugins/integration-plugin.d.ts +19 -9
  114. package/src/plugins/integration-plugin.js +7 -4
  115. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  116. package/src/plugins/jsx-import-source.utils.js +26 -0
  117. package/src/plugins/processor.d.ts +19 -4
  118. package/src/plugins/processor.js +22 -4
  119. package/src/plugins/source-transform.d.ts +31 -0
  120. package/src/plugins/source-transform.js +23 -1
  121. package/src/route-renderer/GRAPH.md +8 -8
  122. package/src/route-renderer/README.md +30 -28
  123. package/src/route-renderer/orchestration/component-graph-collectors.d.ts +10 -0
  124. package/src/route-renderer/orchestration/component-graph-collectors.js +143 -0
  125. package/src/route-renderer/orchestration/component-graph.d.ts +36 -0
  126. package/src/route-renderer/orchestration/component-graph.js +90 -0
  127. package/src/route-renderer/orchestration/component-render-context.d.ts +3 -10
  128. package/src/route-renderer/orchestration/component-render-context.js +3 -1
  129. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +1 -18
  130. package/src/route-renderer/orchestration/declared-ownership-graph.js +5 -31
  131. package/src/route-renderer/orchestration/document-shell-render.service.d.ts +54 -0
  132. package/src/route-renderer/orchestration/document-shell-render.service.js +54 -0
  133. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +59 -29
  134. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +164 -35
  135. package/src/route-renderer/orchestration/global-injector-assets.service.d.ts +7 -0
  136. package/src/route-renderer/orchestration/global-injector-assets.service.js +32 -0
  137. package/src/route-renderer/orchestration/integration-renderer.d.ts +18 -54
  138. package/src/route-renderer/orchestration/integration-renderer.js +108 -194
  139. package/src/route-renderer/orchestration/integration-route-render-adapter.d.ts +38 -0
  140. package/src/route-renderer/orchestration/integration-route-render-adapter.js +27 -0
  141. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +4 -0
  142. package/src/route-renderer/orchestration/ownership-validation.service.js +11 -1
  143. package/src/route-renderer/orchestration/page-browser-graph-contribution.loader.d.ts +9 -0
  144. package/src/route-renderer/orchestration/page-browser-graph-contribution.loader.js +7 -0
  145. package/src/route-renderer/orchestration/page-browser-graph.service.d.ts +25 -0
  146. package/src/route-renderer/orchestration/page-browser-graph.service.js +174 -0
  147. package/src/route-renderer/orchestration/render-output.utils.d.ts +2 -0
  148. package/src/route-renderer/orchestration/render-output.utils.js +4 -0
  149. package/src/route-renderer/orchestration/route-html-finalization.service.d.ts +17 -0
  150. package/src/route-renderer/orchestration/route-html-finalization.service.js +26 -0
  151. package/src/route-renderer/orchestration/route-prepared-options.builder.d.ts +24 -0
  152. package/src/route-renderer/orchestration/route-prepared-options.builder.js +52 -0
  153. package/src/route-renderer/orchestration/route-prepared-options.utils.d.ts +4 -0
  154. package/src/route-renderer/orchestration/route-prepared-options.utils.js +33 -0
  155. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +5 -38
  156. package/src/route-renderer/orchestration/route-render-orchestrator.js +51 -459
  157. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  158. package/src/route-renderer/orchestration/string-markup-renderer.js +54 -0
  159. package/src/router/client/navigation-coordinator.d.ts +1 -1
  160. package/src/router/client/navigation-coordinator.js +12 -2
  161. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +1 -0
  162. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
  163. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  164. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +27 -7
  165. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +32 -14
  166. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +17 -3
  167. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  168. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +2 -31
  169. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  170. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +2 -30
  171. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  172. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +43 -0
  173. package/src/services/assets/browser-bundle.service.d.ts +3 -1
  174. package/src/services/assets/browser-bundle.service.js +17 -5
  175. package/src/services/html/html-transformer.service.d.ts +1 -1
  176. package/src/services/html/html-transformer.service.js +4 -4
  177. package/src/services/invalidation/development-invalidation.service.d.ts +10 -1
  178. package/src/services/invalidation/development-invalidation.service.js +31 -2
  179. package/src/services/module-loading/README.md +49 -0
  180. package/src/services/module-loading/app-server-module-transpiler.service.js +5 -17
  181. package/src/services/module-loading/page-module-import.service.d.ts +4 -1
  182. package/src/services/module-loading/page-module-import.service.js +61 -41
  183. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  184. package/src/services/module-loading/route-module-build-cache-registry.js +37 -0
  185. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  186. package/src/services/module-loading/route-module-build-cache.js +38 -0
  187. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  188. package/src/services/module-loading/route-module-build-cache.store.js +207 -0
  189. package/src/services/module-loading/route-module-build-manifest.d.ts +61 -0
  190. package/src/services/module-loading/route-module-build-manifest.js +116 -0
  191. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  192. package/src/services/module-loading/route-module-dependency-hasher.js +121 -0
  193. package/src/services/module-loading/server-module-transpiler.service.js +1 -1
  194. package/src/static-site-generator/README.md +33 -0
  195. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  196. package/src/static-site-generator/static-build-invalidation.js +59 -0
  197. package/src/static-site-generator/static-export-context.d.ts +22 -0
  198. package/src/static-site-generator/static-export-context.js +0 -0
  199. package/src/static-site-generator/static-site-generator.d.ts +17 -20
  200. package/src/static-site-generator/static-site-generator.js +188 -85
  201. package/src/types/internal-types.d.ts +12 -9
  202. package/src/types/public-types.d.ts +87 -22
  203. package/src/utils/parse-cli-args.d.ts +1 -0
  204. package/src/utils/parse-cli-args.js +3 -0
  205. package/src/watchers/project-watcher.d.ts +14 -2
  206. package/src/watchers/project-watcher.js +50 -20
  207. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  208. package/src/build/rolldown-dev-build-adapter.js +0 -166
  209. package/src/hmr/hmr.postcss.test.e2e.d.ts +0 -1
  210. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  211. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  212. package/src/hmr/hmr.test.e2e.js +0 -43
  213. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  214. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  215. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  216. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ecopages/core",
3
- "version": "0.2.0-beta.1",
3
+ "version": "0.2.0-beta.10",
4
4
  "description": "Core package for Ecopages",
5
5
  "keywords": [
6
6
  "ecopages",
@@ -13,11 +13,11 @@
13
13
  "sideEffects": false,
14
14
  "repository": {
15
15
  "type": "git",
16
- "url": "https://github.com/ecopages/ecopages.git",
16
+ "url": "git+https://github.com/ecopages/ecopages.git",
17
17
  "directory": "packages/core"
18
18
  },
19
19
  "dependencies": {
20
- "@ecopages/file-system": "0.2.0-beta.1",
20
+ "@ecopages/file-system": "0.2.0-beta.10",
21
21
  "@ecopages/logger": "^0.2.3",
22
22
  "@ecopages/scripts-injector": "^0.1.5",
23
23
  "@oxc-project/runtime": "0.134.0",
@@ -45,11 +45,23 @@
45
45
  "types": "./src/route-renderer/orchestration/integration-renderer.d.ts",
46
46
  "default": "./src/route-renderer/orchestration/integration-renderer.js"
47
47
  },
48
+ "./route-renderer/string-markup-renderer": {
49
+ "types": "./src/route-renderer/orchestration/string-markup-renderer.d.ts",
50
+ "default": "./src/route-renderer/orchestration/string-markup-renderer.js"
51
+ },
52
+ "./route-renderer/route-renderer": {
53
+ "types": "./src/route-renderer/route-renderer.d.ts",
54
+ "default": "./src/route-renderer/route-renderer.js"
55
+ },
48
56
  "./route-renderer/component-render-context": {
49
57
  "import": "./src/route-renderer/orchestration/component-render-context.js",
50
58
  "types": "./src/route-renderer/orchestration/component-render-context.d.ts",
51
59
  "default": "./src/route-renderer/orchestration/component-render-context.js"
52
60
  },
61
+ "./route-renderer/orchestration/foreign-subtree-execution.service": {
62
+ "types": "./src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts",
63
+ "default": "./src/route-renderer/orchestration/foreign-subtree-execution.service.js"
64
+ },
53
65
  "./router/navigation-coordinator": {
54
66
  "types": "./src/router/client/navigation-coordinator.d.ts",
55
67
  "default": "./src/router/client/navigation-coordinator.js"
@@ -93,6 +105,14 @@
93
105
  "types": "./src/dev/host-runtime.d.ts",
94
106
  "default": "./src/dev/host-runtime.js"
95
107
  },
108
+ "./dev/client-bridge-registry": {
109
+ "types": "./src/dev/client-bridge-registry.d.ts",
110
+ "default": "./src/dev/client-bridge-registry.js"
111
+ },
112
+ "./dev/dev-client-ownership": {
113
+ "types": "./src/dev/dev-client-ownership.d.ts",
114
+ "default": "./src/dev/dev-client-ownership.js"
115
+ },
96
116
  "./services/asset-processing-service": {
97
117
  "types": "./src/services/assets/asset-processing-service/index.d.ts",
98
118
  "default": "./src/services/assets/asset-processing-service/index.js"
@@ -105,6 +125,10 @@
105
125
  "types": "./src/plugins/integration-plugin.d.ts",
106
126
  "default": "./src/plugins/integration-plugin.js"
107
127
  },
128
+ "./plugins/define-integration": {
129
+ "types": "./src/plugins/define-integration.d.ts",
130
+ "default": "./src/plugins/define-integration.js"
131
+ },
108
132
  "./plugins/source-transform": {
109
133
  "types": "./src/plugins/source-transform.d.ts",
110
134
  "default": "./src/plugins/source-transform.js"
@@ -117,6 +141,26 @@
117
141
  "types": "./src/build/build-adapter.d.ts",
118
142
  "default": "./src/build/build-adapter.js"
119
143
  },
144
+ "./build/runtime-build-executor": {
145
+ "types": "./src/build/runtime-build-executor.d.ts",
146
+ "default": "./src/build/runtime-build-executor.js"
147
+ },
148
+ "./build/build-runtime": {
149
+ "types": "./src/build/build-runtime.d.ts",
150
+ "default": "./src/build/build-runtime.js"
151
+ },
152
+ "./build/build-contracts": {
153
+ "types": "./src/build/build-contracts.d.ts",
154
+ "default": "./src/build/build-contracts.js"
155
+ },
156
+ "./build/production-build-cache": {
157
+ "types": "./src/build/production-build-cache.d.ts",
158
+ "default": "./src/build/production-build-cache.js"
159
+ },
160
+ "./build/server-entry-build-cache": {
161
+ "types": "./src/build/server-entry-build-cache.d.ts",
162
+ "default": "./src/build/server-entry-build-cache.js"
163
+ },
120
164
  "./build/runtime-build-output-normalizer": {
121
165
  "types": "./src/build/runtime-build-output-normalizer.d.ts",
122
166
  "default": "./src/build/runtime-build-output-normalizer.js"
@@ -129,6 +173,10 @@
129
173
  "types": "./src/build/browser-runtime-plugin.d.ts",
130
174
  "default": "./src/build/browser-runtime-plugin.js"
131
175
  },
176
+ "./build/jsx-ownership-plugins": {
177
+ "types": "./src/build/jsx-ownership-plugins.d.ts",
178
+ "default": "./src/build/jsx-ownership-plugins.js"
179
+ },
132
180
  "./cache": {
133
181
  "types": "./src/cache/index.d.ts",
134
182
  "default": "./src/cache/index.js"
@@ -137,6 +185,10 @@
137
185
  "types": "./src/plugins/foreign-jsx-override-plugin.d.ts",
138
186
  "default": "./src/plugins/foreign-jsx-override-plugin.js"
139
187
  },
188
+ "./plugins/jsx-import-source.utils": {
189
+ "types": "./src/plugins/jsx-import-source.utils.d.ts",
190
+ "default": "./src/plugins/jsx-import-source.utils.js"
191
+ },
140
192
  "./html": {
141
193
  "import": "./src/utils/html.js",
142
194
  "default": "./src/utils/html.js",
@@ -174,11 +226,23 @@
174
226
  "types": "./src/route-renderer/orchestration/integration-renderer.d.ts",
175
227
  "default": "./src/route-renderer/orchestration/integration-renderer.js"
176
228
  },
229
+ "./route-renderer/string-markup-renderer.ts": {
230
+ "types": "./src/route-renderer/orchestration/string-markup-renderer.d.ts",
231
+ "default": "./src/route-renderer/orchestration/string-markup-renderer.js"
232
+ },
233
+ "./route-renderer/route-renderer.ts": {
234
+ "types": "./src/route-renderer/route-renderer.d.ts",
235
+ "default": "./src/route-renderer/route-renderer.js"
236
+ },
177
237
  "./route-renderer/component-render-context.ts": {
178
238
  "import": "./src/route-renderer/orchestration/component-render-context.js",
179
239
  "types": "./src/route-renderer/orchestration/component-render-context.d.ts",
180
240
  "default": "./src/route-renderer/orchestration/component-render-context.js"
181
241
  },
242
+ "./route-renderer/orchestration/foreign-subtree-execution.service.ts": {
243
+ "types": "./src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts",
244
+ "default": "./src/route-renderer/orchestration/foreign-subtree-execution.service.js"
245
+ },
182
246
  "./router/navigation-coordinator.ts": {
183
247
  "types": "./src/router/client/navigation-coordinator.d.ts",
184
248
  "default": "./src/router/client/navigation-coordinator.js"
@@ -222,6 +286,14 @@
222
286
  "types": "./src/dev/host-runtime.d.ts",
223
287
  "default": "./src/dev/host-runtime.js"
224
288
  },
289
+ "./dev/client-bridge-registry.ts": {
290
+ "types": "./src/dev/client-bridge-registry.d.ts",
291
+ "default": "./src/dev/client-bridge-registry.js"
292
+ },
293
+ "./dev/dev-client-ownership.ts": {
294
+ "types": "./src/dev/dev-client-ownership.d.ts",
295
+ "default": "./src/dev/dev-client-ownership.js"
296
+ },
225
297
  "./services/asset-processing-service.ts": {
226
298
  "types": "./src/services/assets/asset-processing-service/index.d.ts",
227
299
  "default": "./src/services/assets/asset-processing-service/index.js"
@@ -234,6 +306,10 @@
234
306
  "types": "./src/plugins/integration-plugin.d.ts",
235
307
  "default": "./src/plugins/integration-plugin.js"
236
308
  },
309
+ "./plugins/define-integration.ts": {
310
+ "types": "./src/plugins/define-integration.d.ts",
311
+ "default": "./src/plugins/define-integration.js"
312
+ },
237
313
  "./plugins/source-transform.ts": {
238
314
  "types": "./src/plugins/source-transform.d.ts",
239
315
  "default": "./src/plugins/source-transform.js"
@@ -246,6 +322,26 @@
246
322
  "types": "./src/build/build-adapter.d.ts",
247
323
  "default": "./src/build/build-adapter.js"
248
324
  },
325
+ "./build/runtime-build-executor.ts": {
326
+ "types": "./src/build/runtime-build-executor.d.ts",
327
+ "default": "./src/build/runtime-build-executor.js"
328
+ },
329
+ "./build/build-runtime.ts": {
330
+ "types": "./src/build/build-runtime.d.ts",
331
+ "default": "./src/build/build-runtime.js"
332
+ },
333
+ "./build/build-contracts.ts": {
334
+ "types": "./src/build/build-contracts.d.ts",
335
+ "default": "./src/build/build-contracts.js"
336
+ },
337
+ "./build/production-build-cache.ts": {
338
+ "types": "./src/build/production-build-cache.d.ts",
339
+ "default": "./src/build/production-build-cache.js"
340
+ },
341
+ "./build/server-entry-build-cache.ts": {
342
+ "types": "./src/build/server-entry-build-cache.d.ts",
343
+ "default": "./src/build/server-entry-build-cache.js"
344
+ },
249
345
  "./build/runtime-build-output-normalizer.ts": {
250
346
  "types": "./src/build/runtime-build-output-normalizer.d.ts",
251
347
  "default": "./src/build/runtime-build-output-normalizer.js"
@@ -258,6 +354,10 @@
258
354
  "types": "./src/build/browser-runtime-plugin.d.ts",
259
355
  "default": "./src/build/browser-runtime-plugin.js"
260
356
  },
357
+ "./build/jsx-ownership-plugins.ts": {
358
+ "types": "./src/build/jsx-ownership-plugins.d.ts",
359
+ "default": "./src/build/jsx-ownership-plugins.js"
360
+ },
261
361
  "./cache.ts": {
262
362
  "types": "./src/cache/index.d.ts",
263
363
  "default": "./src/cache/index.js"
@@ -266,6 +366,10 @@
266
366
  "types": "./src/plugins/foreign-jsx-override-plugin.d.ts",
267
367
  "default": "./src/plugins/foreign-jsx-override-plugin.js"
268
368
  },
369
+ "./plugins/jsx-import-source.utils.ts": {
370
+ "types": "./src/plugins/jsx-import-source.utils.d.ts",
371
+ "default": "./src/plugins/jsx-import-source.utils.js"
372
+ },
269
373
  "./html.ts": {
270
374
  "import": "./src/utils/html.js",
271
375
  "default": "./src/utils/html.js",
@@ -9,6 +9,7 @@
9
9
  import type { SourceModuleLoader } from '../../services/module-loading/module-loading-types.js';
10
10
  import type { EcoPagesAppConfig } from '../../types/internal-types.js';
11
11
  import type { ApiHandler, ApiHandlerContext, ErrorHandler, Middleware, RouteOptions, StaticRoute, ViewLoader } from '../../types/public-types.js';
12
+ import type { EcopagesWebSocketHandler } from '../../types/public-types.js';
12
13
  import { type ReturnParseCliArgs } from '../../utils/parse-cli-args.js';
13
14
  /**
14
15
  * Runtime bootstrap options layered on top of the app config.
@@ -25,6 +26,21 @@ export interface ApplicationRuntimeOptions {
25
26
  * adapter auto-detects a host module loader from the global scope.
26
27
  */
27
28
  embedded?: boolean;
29
+ /**
30
+ * When true, full-page reload signaling is owned by the host dev server
31
+ * (for example Vite's `full-reload` websocket event) instead of the Ecopages
32
+ * client bridge.
33
+ *
34
+ * @deprecated Prefer `devClientOwner: 'host'`.
35
+ */
36
+ delegateBrowserReloadToHost?: boolean;
37
+ /**
38
+ * Selects which layer injects browser dev-client bootstrap (HMR runtime, reload).
39
+ *
40
+ * `host` disables core injection and reload signaling so embedded hosts like
41
+ * Vite own the full dev-client surface.
42
+ */
43
+ devClientOwner?: 'core' | 'host';
28
44
  /**
29
45
  * Explicit source module loader for request-time imports.
30
46
  *
@@ -49,8 +65,9 @@ export interface ApplicationAdapterOptions {
49
65
  /**
50
66
  * Common interface for application adapters
51
67
  */
52
- export interface ApplicationAdapter<T = any> {
68
+ export interface ApplicationAdapter<T = any> extends AsyncDisposable {
53
69
  start(): Promise<T | void>;
70
+ stop(force?: boolean): Promise<void>;
54
71
  }
55
72
  /**
56
73
  * Handler function type for route handlers
@@ -72,6 +89,11 @@ export declare abstract class AbstractApplicationAdapter<TOptions extends Applic
72
89
  protected apiHandlers: ApiHandler[];
73
90
  protected staticRoutes: StaticRoute[];
74
91
  protected errorHandler?: ErrorHandler;
92
+ /**
93
+ * App-level WebSocket handlers keyed by URL path pattern (e.g. '/ws/chat/:id').
94
+ * Both Bun and Node adapters read this map to register upgrade routes.
95
+ */
96
+ protected websocketHandlers: Map<string, EcopagesWebSocketHandler<any, any>>;
75
97
  constructor(options: TOptions);
76
98
  private clearDistFolder;
77
99
  /**
@@ -160,6 +182,46 @@ export declare abstract class AbstractApplicationAdapter<TOptions extends Applic
160
182
  * Get all registered static routes
161
183
  */
162
184
  getStaticRoutes(): StaticRoute[];
185
+ /**
186
+ * Register a WebSocket handler for the given path pattern.
187
+ *
188
+ * The runtime adapter handles the HTTP→WebSocket upgrade for this path
189
+ * and routes lifecycle events to `handler`.
190
+ *
191
+ * Supports dynamic segments via `:param` syntax. The handler receives
192
+ * typed `params` and `search` fields, and a typed `context` produced by
193
+ * the optional `context()` factory.
194
+ *
195
+ * One pattern registration matches infinite path variations. For example,
196
+ * `app.websocket('/ws/chat/:roomId', handler)` matches `/ws/chat/abc`,
197
+ * `/ws/chat/xyz`, etc. Each connection receives its own `params.roomId`.
198
+ *
199
+ * Works across both Bun and Node runtimes — no runtime-specific imports needed.
200
+ *
201
+ * @example
202
+ * ```typescript
203
+ * app.websocket<ChatContext, { roomId: string }>('/ws/chat/:roomId', {
204
+ * async context({ params, search }) {
205
+ * return { username: search.username ?? 'anonymous', roomId: params.roomId };
206
+ * },
207
+ * onConnect(socket) {
208
+ * socket.send(`Welcome to room ${socket.context.roomId}`);
209
+ * },
210
+ * onMessage(socket, message) {
211
+ * if (message.kind === 'text') {
212
+ * socket.send(message.text);
213
+ * }
214
+ * },
215
+ * });
216
+ * ```
217
+ */
218
+ websocket<TContext = unknown, TParams extends Record<string, string> = Record<string, string>>(path: string, handler: EcopagesWebSocketHandler<TContext, TParams>): this;
219
+ /**
220
+ * Get the registered WebSocket handlers map.
221
+ *
222
+ * @returns The map of WebSocket route patterns to handlers
223
+ */
224
+ getWebsocketHandlers(): Map<string, EcopagesWebSocketHandler<any, any>>;
163
225
  /**
164
226
  * Register a global error handler for all routes.
165
227
  * Useful for logging, monitoring integration, and custom error formatting.
@@ -185,6 +247,16 @@ export declare abstract class AbstractApplicationAdapter<TOptions extends Applic
185
247
  * Start the application server
186
248
  */
187
249
  abstract start(): Promise<TServer | void>;
250
+ /**
251
+ * Stops the application server and releases runtime resources.
252
+ *
253
+ * @remarks
254
+ * Subclasses override this to shut down bound servers, watchers, and other
255
+ * dev-time resources. The default implementation is a no-op so embedded
256
+ * adapters that never call `start()` can still be used with `await using`.
257
+ */
258
+ stop(_force?: boolean): Promise<void>;
259
+ [Symbol.asyncDispose](): Promise<void>;
188
260
  /**
189
261
  * Handles a standard Web request without requiring a bound network server.
190
262
  * This is the primary interoperability surface for embedding Ecopages inside
@@ -15,10 +15,21 @@ class AbstractApplicationAdapter {
15
15
  apiHandlers = [];
16
16
  staticRoutes = [];
17
17
  errorHandler;
18
+ /**
19
+ * App-level WebSocket handlers keyed by URL path pattern (e.g. '/ws/chat/:id').
20
+ * Both Bun and Node adapters read this map to register upgrade routes.
21
+ */
22
+ websocketHandlers = /* @__PURE__ */ new Map();
18
23
  constructor(options) {
19
24
  this.appConfig = options.appConfig;
20
25
  this.serverOptions = options.serverOptions || {};
21
26
  this.runtimeOptions = options.runtime ?? {};
27
+ if (options.runtime) {
28
+ this.appConfig.runtime = {
29
+ ...this.appConfig.runtime ?? {},
30
+ ...options.runtime
31
+ };
32
+ }
22
33
  this.cliArgs = parseCliArgs({ embeddedRuntime: this.runtimeOptions.embedded });
23
34
  const hostModuleLoader = this.runtimeOptions.hostModuleLoader ?? (this.runtimeOptions.embedded ? getHostModuleLoader() : void 0);
24
35
  if (hostModuleLoader) {
@@ -93,6 +104,71 @@ class AbstractApplicationAdapter {
93
104
  getStaticRoutes() {
94
105
  return this.staticRoutes;
95
106
  }
107
+ /**
108
+ * Register a WebSocket handler for the given path pattern.
109
+ *
110
+ * The runtime adapter handles the HTTP→WebSocket upgrade for this path
111
+ * and routes lifecycle events to `handler`.
112
+ *
113
+ * Supports dynamic segments via `:param` syntax. The handler receives
114
+ * typed `params` and `search` fields, and a typed `context` produced by
115
+ * the optional `context()` factory.
116
+ *
117
+ * One pattern registration matches infinite path variations. For example,
118
+ * `app.websocket('/ws/chat/:roomId', handler)` matches `/ws/chat/abc`,
119
+ * `/ws/chat/xyz`, etc. Each connection receives its own `params.roomId`.
120
+ *
121
+ * Works across both Bun and Node runtimes — no runtime-specific imports needed.
122
+ *
123
+ * @example
124
+ * ```typescript
125
+ * app.websocket<ChatContext, { roomId: string }>('/ws/chat/:roomId', {
126
+ * async context({ params, search }) {
127
+ * return { username: search.username ?? 'anonymous', roomId: params.roomId };
128
+ * },
129
+ * onConnect(socket) {
130
+ * socket.send(`Welcome to room ${socket.context.roomId}`);
131
+ * },
132
+ * onMessage(socket, message) {
133
+ * if (message.kind === 'text') {
134
+ * socket.send(message.text);
135
+ * }
136
+ * },
137
+ * });
138
+ * ```
139
+ */
140
+ websocket(path, handler) {
141
+ invariant(
142
+ typeof path === "string" && path.startsWith("/"),
143
+ `app.websocket(): path must be a string starting with "/", got "${path}".`
144
+ );
145
+ const segments = path.split("/").filter(Boolean);
146
+ const paramNames = /* @__PURE__ */ new Set();
147
+ for (const segment of segments) {
148
+ if (segment.startsWith(":")) {
149
+ const paramName = segment.slice(1);
150
+ invariant(
151
+ paramName.length > 0,
152
+ `app.websocket(): invalid pattern "${path}" \u2014 empty param name in segment ":${paramName}".`
153
+ );
154
+ invariant(
155
+ !paramNames.has(paramName),
156
+ `app.websocket(): invalid pattern "${path}" \u2014 duplicate param name ":${paramName}".`
157
+ );
158
+ paramNames.add(paramName);
159
+ }
160
+ }
161
+ this.websocketHandlers.set(path, handler);
162
+ return this;
163
+ }
164
+ /**
165
+ * Get the registered WebSocket handlers map.
166
+ *
167
+ * @returns The map of WebSocket route patterns to handlers
168
+ */
169
+ getWebsocketHandlers() {
170
+ return this.websocketHandlers;
171
+ }
96
172
  /**
97
173
  * Register a global error handler for all routes.
98
174
  * Useful for logging, monitoring integration, and custom error formatting.
@@ -115,6 +191,19 @@ class AbstractApplicationAdapter {
115
191
  getErrorHandler() {
116
192
  return this.errorHandler;
117
193
  }
194
+ /**
195
+ * Stops the application server and releases runtime resources.
196
+ *
197
+ * @remarks
198
+ * Subclasses override this to shut down bound servers, watchers, and other
199
+ * dev-time resources. The default implementation is a no-op so embedded
200
+ * adapters that never call `start()` can still be used with `await using`.
201
+ */
202
+ async stop(_force = true) {
203
+ }
204
+ async [Symbol.asyncDispose]() {
205
+ await this.stop(true);
206
+ }
118
207
  }
119
208
  export {
120
209
  AbstractApplicationAdapter
@@ -31,7 +31,9 @@ export interface ServerAdapterResult {
31
31
  }) => any;
32
32
  buildStatic: (options?: {
33
33
  preview?: boolean;
34
+ force?: boolean;
34
35
  }) => Promise<void>;
36
+ dispose(): Promise<void>;
35
37
  }
36
38
  /**
37
39
  * Abstract base class for server adapters across different runtimes
@@ -57,6 +59,7 @@ export declare abstract class AbstractServerAdapter<TOptions extends ServerAdapt
57
59
  */
58
60
  abstract buildStatic(options?: {
59
61
  preview?: boolean;
62
+ force?: boolean;
60
63
  }): Promise<void>;
61
64
  /**
62
65
  * Factory method to create a server adapter with runtime-specific functionality
@@ -0,0 +1,60 @@
1
+ import type { EcopagesWebSocketHandler } from '../../types/public-types.js';
2
+ /**
3
+ * Pattern matcher for WebSocket route paths.
4
+ *
5
+ * Supports dynamic segments via `:param` syntax. Matches are exact on literal
6
+ * segments and capture dynamic segments into a params object.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * matchWebSocketPath('/ws/chat/:id', '/ws/chat/abc123')
11
+ * // Returns: { id: 'abc123' }
12
+ *
13
+ * matchWebSocketPath('/ws/chat/:id', '/ws/chat/abc123/messages')
14
+ * // Returns: null (length mismatch)
15
+ *
16
+ * matchWebSocketPath('/ws/chat', '/ws/chat')
17
+ * // Returns: {} (no params)
18
+ * ```
19
+ *
20
+ * @remarks
21
+ * This is a minimal segment-based matcher. It does not support wildcards,
22
+ * optional segments, or catch-all patterns. Those are future concerns.
23
+ *
24
+ * @param pattern - The registered route pattern (e.g. '/ws/chat/:id')
25
+ * @param pathname - The actual request pathname (e.g. '/ws/chat/abc123')
26
+ * @returns A params object if the pattern matches, or null if it does not
27
+ */
28
+ export declare function matchWebSocketPath(pattern: string, pathname: string): Record<string, string> | null;
29
+ /**
30
+ * Represents a matched WebSocket route.
31
+ */
32
+ export type WebSocketRouteMatch = {
33
+ handler: EcopagesWebSocketHandler<any, any>;
34
+ params: Record<string, string>;
35
+ kind: string;
36
+ };
37
+ /**
38
+ * Scores a pattern for specificity ordering.
39
+ *
40
+ * Higher scores win. Rules, in order:
41
+ * 1. More literal segments beats more dynamic segments.
42
+ * 2. Fewer dynamic segments beats more dynamic segments.
43
+ * 3. Longer route (more segments) beats shorter route.
44
+ *
45
+ * @param pattern - The registered route pattern
46
+ * @returns A numeric specificity score
47
+ */
48
+ export declare function scoreWebSocketPattern(pattern: string): number;
49
+ /**
50
+ * Find the registered WebSocket handler that best matches a pathname.
51
+ *
52
+ * Iterates through the provided handlers map, computes each pattern's
53
+ * specificity score, and returns the highest-scoring match. Ties resolve
54
+ * to the earliest-registered pattern.
55
+ *
56
+ * @param handlers - The map of registered WebSocket handlers
57
+ * @param pathname - The actual request pathname
58
+ * @returns The best match, or null if no pattern matches
59
+ */
60
+ export declare function findWebSocketRoute(handlers: Map<string, EcopagesWebSocketHandler<any, any>>, pathname: string): WebSocketRouteMatch | null;
@@ -0,0 +1,61 @@
1
+ function matchWebSocketPath(pattern, pathname) {
2
+ const patternSegments = pattern.split("/").filter(Boolean);
3
+ const pathSegments = pathname.split("/").filter(Boolean);
4
+ if (patternSegments.length !== pathSegments.length) {
5
+ return null;
6
+ }
7
+ const params = {};
8
+ for (let i = 0; i < patternSegments.length; i++) {
9
+ const patternSegment = patternSegments[i];
10
+ const pathSegment = pathSegments[i];
11
+ if (!patternSegment || !pathSegment) {
12
+ return null;
13
+ }
14
+ if (patternSegment.startsWith(":")) {
15
+ const paramName = patternSegment.slice(1);
16
+ if (!paramName) {
17
+ return null;
18
+ }
19
+ params[paramName] = pathSegment;
20
+ } else if (patternSegment !== pathSegment) {
21
+ return null;
22
+ }
23
+ }
24
+ return params;
25
+ }
26
+ function scoreWebSocketPattern(pattern) {
27
+ const segments = pattern.split("/").filter(Boolean);
28
+ let literals = 0;
29
+ let dynamics = 0;
30
+ for (const segment of segments) {
31
+ if (segment.startsWith(":")) {
32
+ dynamics += 1;
33
+ } else {
34
+ literals += 1;
35
+ }
36
+ }
37
+ return literals * 100 - dynamics * 10 + segments.length;
38
+ }
39
+ function findWebSocketRoute(handlers, pathname) {
40
+ let best = null;
41
+ let index = 0;
42
+ for (const [pattern, handler] of handlers) {
43
+ const params = matchWebSocketPath(pattern, pathname);
44
+ if (params === null) {
45
+ index += 1;
46
+ continue;
47
+ }
48
+ const score = scoreWebSocketPattern(pattern);
49
+ const match = { handler, params, kind: pattern };
50
+ if (best === null || score > best.score || score === best.score && index < best.index) {
51
+ best = { score, match, index };
52
+ }
53
+ index += 1;
54
+ }
55
+ return best?.match ?? null;
56
+ }
57
+ export {
58
+ findWebSocketRoute,
59
+ matchWebSocketPath,
60
+ scoreWebSocketPattern
61
+ };
@@ -30,5 +30,6 @@ export declare class ClientBridge implements IClientBridge {
30
30
  */
31
31
  error(message: string): void;
32
32
  get subscriberCount(): number;
33
+ destroy(): void;
33
34
  }
34
35
  export {};
@@ -42,6 +42,9 @@ class ClientBridge {
42
42
  get subscriberCount() {
43
43
  return this.subscribers.size;
44
44
  }
45
+ destroy() {
46
+ this.subscribers.clear();
47
+ }
45
48
  }
46
49
  export {
47
50
  ClientBridge
@@ -11,7 +11,6 @@ import type { Server } from 'bun';
11
11
  import type { ApiHandlerContext, RouteGroupBuilder } from '../../types/public-types.js';
12
12
  import { SharedApplicationAdapter } from '../shared/application-adapter.js';
13
13
  import type { RuntimeHost } from '../shared/runtime-host.js';
14
- import type { StaticPreviewHost } from '../shared/static-preview-host.js';
15
14
  import type { EcopagesAppOptions } from '../create-app.js';
16
15
  import { type BunServerAdapterResult } from './server-adapter.js';
17
16
  /**
@@ -31,13 +30,15 @@ export type BunRouteGroupBuilder<WebSocketData = undefined, TContext extends Api
31
30
  export declare class BunEcopagesApp<WebSocketData = undefined> extends SharedApplicationAdapter<EcopagesAppOptions, Server<WebSocketData>, Request> {
32
31
  serverAdapter: BunServerAdapterResult | undefined;
33
32
  private server;
33
+ private stopped;
34
34
  private readonly runtimeHost;
35
- private readonly previewHost;
36
35
  constructor(options: EcopagesAppOptions, dependencies: {
37
36
  runtimeHost: RuntimeHost<Server<WebSocketData>, Bun.Serve.Options<WebSocketData>>;
38
- previewHost: StaticPreviewHost;
39
37
  });
40
38
  fetch(request: Request): Promise<Response>;
39
+ attachWebSocketUpgrades(httpServer: import('node:http').Server, options?: {
40
+ passthroughUnmatched?: boolean;
41
+ }): Promise<void>;
41
42
  /**
42
43
  * Complete the initialization of the server adapter by processing dynamic routes
43
44
  * @param server The Bun server instance
@@ -53,6 +54,7 @@ export declare class BunEcopagesApp<WebSocketData = undefined> extends SharedApp
53
54
  * @param options.autoCompleteInitialization Whether to automatically complete initialization with dynamic routes after server start (defaults to true)
54
55
  */
55
56
  start(): Promise<Server<WebSocketData> | void>;
57
+ stop(force?: boolean): Promise<void>;
56
58
  }
57
59
  /**
58
60
  * Factory function to create a Bun application