@ecopages/core 0.2.0-beta.2 → 0.2.0-beta.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 (273) hide show
  1. package/README.md +1 -1
  2. package/package.json +163 -3
  3. package/src/adapters/abstract/application-adapter.d.ts +104 -5
  4. package/src/adapters/abstract/application-adapter.js +125 -1
  5. package/src/adapters/abstract/server-adapter.d.ts +6 -2
  6. package/src/adapters/abstract/ws-pattern-matcher.d.ts +60 -0
  7. package/src/adapters/abstract/ws-pattern-matcher.js +61 -0
  8. package/src/adapters/bun/client-bridge.d.ts +1 -0
  9. package/src/adapters/bun/client-bridge.js +3 -0
  10. package/src/adapters/bun/create-app.d.ts +6 -4
  11. package/src/adapters/bun/create-app.js +65 -43
  12. package/src/adapters/bun/hmr-manager.d.ts +2 -1
  13. package/src/adapters/bun/hmr-manager.js +2 -2
  14. package/src/adapters/bun/server-adapter.d.ts +90 -22
  15. package/src/adapters/bun/server-adapter.js +265 -84
  16. package/src/adapters/bun/static-preview-host.js +25 -20
  17. package/src/adapters/create-app.d.ts +13 -11
  18. package/src/adapters/create-app.js +2 -51
  19. package/src/adapters/index.d.ts +1 -1
  20. package/src/adapters/index.js +1 -2
  21. package/src/adapters/node/create-app.d.ts +5 -1
  22. package/src/adapters/node/create-app.js +51 -12
  23. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  24. package/src/adapters/node/node-client-bridge.js +3 -0
  25. package/src/adapters/node/node-hmr-manager.d.ts +2 -1
  26. package/src/adapters/node/node-hmr-manager.js +2 -2
  27. package/src/adapters/node/server-adapter-dependencies.js +4 -0
  28. package/src/adapters/node/server-adapter.d.ts +62 -20
  29. package/src/adapters/node/server-adapter.js +161 -131
  30. package/src/adapters/node/static-content-server.d.ts +1 -0
  31. package/src/adapters/node/static-content-server.js +10 -2
  32. package/src/adapters/node/static-preview-host.js +27 -12
  33. package/src/adapters/shared/bun-user-websocket-lifecycle.d.ts +22 -0
  34. package/src/adapters/shared/bun-user-websocket-lifecycle.js +96 -0
  35. package/src/adapters/shared/copy-runtime-public-dir.d.ts +6 -0
  36. package/src/adapters/shared/copy-runtime-public-dir.js +24 -0
  37. package/src/adapters/shared/fs-server-response-matcher.d.ts +2 -0
  38. package/src/adapters/shared/fs-server-response-matcher.js +40 -18
  39. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -2
  40. package/src/adapters/shared/hmr-entrypoint-registrar.js +3 -26
  41. package/src/adapters/shared/hmr-html-response.d.ts +1 -1
  42. package/src/adapters/shared/hmr-html-response.js +4 -1
  43. package/src/adapters/shared/node-http-websocket-upgrades.d.ts +21 -0
  44. package/src/adapters/shared/node-http-websocket-upgrades.js +100 -0
  45. package/src/adapters/shared/port-manager.d.ts +116 -0
  46. package/src/adapters/shared/port-manager.js +196 -0
  47. package/src/adapters/shared/runtime-app-bootstrap.d.ts +2 -1
  48. package/src/adapters/shared/runtime-app-bootstrap.js +3 -6
  49. package/src/adapters/shared/runtime-server-lifecycle.d.ts +38 -0
  50. package/src/adapters/shared/runtime-server-lifecycle.js +43 -0
  51. package/src/adapters/shared/server-adapter.d.ts +2 -1
  52. package/src/adapters/shared/server-adapter.js +13 -6
  53. package/src/adapters/shared/server-route-handler.d.ts +4 -1
  54. package/src/adapters/shared/server-route-handler.js +5 -2
  55. package/src/adapters/shared/server-static-builder.d.ts +23 -32
  56. package/src/adapters/shared/server-static-builder.js +97 -73
  57. package/src/adapters/shared/shared-hmr-manager.d.ts +28 -0
  58. package/src/adapters/shared/shared-hmr-manager.js +119 -9
  59. package/src/adapters/shared/static-preview-host.d.ts +5 -0
  60. package/src/adapters/shared/websocket-lifecycle.d.ts +24 -0
  61. package/src/adapters/shared/websocket-lifecycle.js +55 -0
  62. package/src/build/README.md +77 -14
  63. package/src/build/app-build-manifest-runtime.d.ts +10 -0
  64. package/src/build/app-build-manifest-runtime.js +90 -0
  65. package/src/build/build-adapter.d.ts +17 -319
  66. package/src/build/build-adapter.js +28 -94
  67. package/src/build/build-contracts.d.ts +97 -0
  68. package/src/build/build-contracts.js +0 -0
  69. package/src/build/build-input-fingerprint.d.ts +28 -0
  70. package/src/build/build-input-fingerprint.js +31 -0
  71. package/src/build/build-profile-options.d.ts +7 -0
  72. package/src/build/build-profile-options.js +37 -0
  73. package/src/build/build-runtime.d.ts +24 -0
  74. package/src/build/build-runtime.js +65 -0
  75. package/src/build/deduping-build-executor.d.ts +28 -0
  76. package/src/build/deduping-build-executor.js +56 -0
  77. package/src/build/jsx-ownership-plugins.d.ts +24 -0
  78. package/src/build/jsx-ownership-plugins.js +41 -0
  79. package/src/build/pages-unified-graph-build.d.ts +31 -0
  80. package/src/build/pages-unified-graph-build.js +206 -0
  81. package/src/build/parallel-build-executor.d.ts +21 -0
  82. package/src/build/parallel-build-executor.js +52 -0
  83. package/src/build/production-build-cache.d.ts +20 -0
  84. package/src/build/production-build-cache.js +63 -0
  85. package/src/build/rolldown-adapter-helpers.d.ts +3 -6
  86. package/src/build/rolldown-adapter-helpers.js +71 -6
  87. package/src/build/rolldown-build-adapter.d.ts +2 -6
  88. package/src/build/rolldown-build-adapter.js +3 -3
  89. package/src/build/rolldown-build-invocation-metrics.d.ts +12 -0
  90. package/src/build/rolldown-build-invocation-metrics.js +43 -0
  91. package/src/build/rolldown-plugin-bridge.d.ts +15 -1
  92. package/src/build/rolldown-plugin-bridge.js +20 -5
  93. package/src/build/rolldown-source-transform-pass.d.ts +15 -0
  94. package/src/build/rolldown-source-transform-pass.js +58 -0
  95. package/src/build/runtime-build-executor.d.ts +8 -15
  96. package/src/build/runtime-build-executor.js +12 -15
  97. package/src/build/runtime-build-output-normalizer.d.ts +7 -0
  98. package/src/build/runtime-build-output-normalizer.js +94 -2
  99. package/src/build/server-entry-build-cache.d.ts +44 -0
  100. package/src/build/server-entry-build-cache.js +161 -0
  101. package/src/client/navigation-scripts/classification.d.ts +16 -0
  102. package/src/client/navigation-scripts/classification.js +41 -0
  103. package/src/client/navigation-scripts/index.d.ts +3 -0
  104. package/src/client/navigation-scripts/index.js +23 -0
  105. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +65 -0
  106. package/src/client/navigation-scripts/registry.d.ts +11 -0
  107. package/src/client/navigation-scripts/registry.js +12 -0
  108. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  109. package/src/client/navigation-scripts/rerun-queue.js +73 -0
  110. package/src/client/scroll.d.ts +17 -0
  111. package/src/client/scroll.js +25 -0
  112. package/src/client/scroll.test.browser.js +37 -0
  113. package/src/client/view-transitions.d.ts +16 -0
  114. package/src/client/view-transitions.js +63 -0
  115. package/src/config/config-builder.d.ts +12 -7
  116. package/src/config/config-builder.js +12 -9
  117. package/src/dev/client-bridge-registry.d.ts +5 -0
  118. package/src/dev/client-bridge-registry.js +15 -0
  119. package/src/dev/dev-client-ownership.d.ts +7 -0
  120. package/src/dev/dev-client-ownership.js +6 -0
  121. package/src/dev/hmr-manager-registry.d.ts +8 -0
  122. package/src/dev/hmr-manager-registry.js +15 -0
  123. package/src/dev/host-runtime.d.ts +3 -0
  124. package/src/dev/host-runtime.js +7 -0
  125. package/src/dev/runtime-server-started-message.d.ts +2 -0
  126. package/src/dev/runtime-server-started-message.js +6 -0
  127. package/src/eco/README.md +11 -0
  128. package/src/eco/eco-declared-component.d.ts +14 -0
  129. package/src/eco/eco-declared-component.js +16 -0
  130. package/src/eco/eco.browser.js +5 -6
  131. package/src/eco/eco.js +5 -6
  132. package/src/eco/eco.types.d.ts +2 -2
  133. package/src/eco/page-layout-normalization.d.ts +21 -0
  134. package/src/eco/page-layout-normalization.js +59 -0
  135. package/src/errors/index.d.ts +1 -0
  136. package/src/errors/index.js +7 -1
  137. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  138. package/src/errors/undeclared-component-dependency-error.js +17 -0
  139. package/src/hmr/client/hmr-runtime.js +5 -2
  140. package/src/hmr/hmr-entrypoint-output.d.ts +28 -0
  141. package/src/hmr/hmr-entrypoint-output.js +58 -0
  142. package/src/hmr/strategies/js-hmr-strategy.d.ts +3 -0
  143. package/src/hmr/strategies/js-hmr-strategy.js +68 -18
  144. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  145. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +29 -0
  146. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  147. package/src/integrations/ghtml/ghtml-renderer.js +2 -51
  148. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  149. package/src/integrations/ghtml/ghtml.plugin.js +7 -14
  150. package/src/plugins/define-integration.d.ts +26 -0
  151. package/src/plugins/define-integration.js +19 -0
  152. package/src/plugins/eco-component-meta-plugin.js +5 -8
  153. package/src/plugins/foreign-jsx-override-plugin.js +4 -6
  154. package/src/plugins/integration-plugin.d.ts +19 -9
  155. package/src/plugins/integration-plugin.js +7 -4
  156. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  157. package/src/plugins/jsx-import-source.utils.js +26 -0
  158. package/src/plugins/processor.d.ts +19 -4
  159. package/src/plugins/processor.js +22 -4
  160. package/src/plugins/source-transform.d.ts +31 -0
  161. package/src/plugins/source-transform.js +23 -1
  162. package/src/route-renderer/GRAPH.md +8 -8
  163. package/src/route-renderer/README.md +30 -28
  164. package/src/route-renderer/orchestration/component-graph-collectors.d.ts +10 -0
  165. package/src/route-renderer/orchestration/component-graph-collectors.js +143 -0
  166. package/src/route-renderer/orchestration/component-graph.d.ts +36 -0
  167. package/src/route-renderer/orchestration/component-graph.js +98 -0
  168. package/src/route-renderer/orchestration/component-render-context.d.ts +3 -10
  169. package/src/route-renderer/orchestration/component-render-context.js +3 -1
  170. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +1 -18
  171. package/src/route-renderer/orchestration/declared-ownership-graph.js +5 -31
  172. package/src/route-renderer/orchestration/document-shell-render.service.d.ts +90 -0
  173. package/src/route-renderer/orchestration/document-shell-render.service.js +120 -0
  174. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +59 -29
  175. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +164 -35
  176. package/src/route-renderer/orchestration/global-injector-assets.service.d.ts +7 -0
  177. package/src/route-renderer/orchestration/global-injector-assets.service.js +32 -0
  178. package/src/route-renderer/orchestration/integration-renderer.d.ts +18 -54
  179. package/src/route-renderer/orchestration/integration-renderer.js +113 -195
  180. package/src/route-renderer/orchestration/integration-route-render-adapter.d.ts +38 -0
  181. package/src/route-renderer/orchestration/integration-route-render-adapter.js +27 -0
  182. package/src/route-renderer/orchestration/layout-shell-props.service.d.ts +20 -0
  183. package/src/route-renderer/orchestration/layout-shell-props.service.js +31 -0
  184. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +5 -0
  185. package/src/route-renderer/orchestration/ownership-validation.service.js +29 -1
  186. package/src/route-renderer/orchestration/page-browser-graph-contribution.loader.d.ts +9 -0
  187. package/src/route-renderer/orchestration/page-browser-graph-contribution.loader.js +7 -0
  188. package/src/route-renderer/orchestration/page-browser-graph.service.d.ts +25 -0
  189. package/src/route-renderer/orchestration/page-browser-graph.service.js +174 -0
  190. package/src/route-renderer/orchestration/render-output.utils.d.ts +2 -0
  191. package/src/route-renderer/orchestration/render-output.utils.js +4 -0
  192. package/src/route-renderer/orchestration/route-html-finalization.service.d.ts +17 -0
  193. package/src/route-renderer/orchestration/route-html-finalization.service.js +26 -0
  194. package/src/route-renderer/orchestration/route-prepared-options.builder.d.ts +26 -0
  195. package/src/route-renderer/orchestration/route-prepared-options.builder.js +54 -0
  196. package/src/route-renderer/orchestration/route-prepared-options.utils.d.ts +4 -0
  197. package/src/route-renderer/orchestration/route-prepared-options.utils.js +33 -0
  198. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +8 -39
  199. package/src/route-renderer/orchestration/route-render-orchestrator.js +53 -461
  200. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  201. package/src/route-renderer/orchestration/string-markup-renderer.js +55 -0
  202. package/src/route-renderer/page-loading/component-dependency-collection.js +5 -2
  203. package/src/router/client/link-intent.d.ts +11 -21
  204. package/src/router/client/link-intent.js +10 -0
  205. package/src/router/client/link-intent.test.browser.js +12 -1
  206. package/src/router/client/link-navigation-policy.d.ts +45 -0
  207. package/src/router/client/link-navigation-policy.js +101 -0
  208. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  209. package/src/router/client/link-navigation-policy.test.browser.js +92 -0
  210. package/src/router/client/navigation-coordinator.d.ts +1 -1
  211. package/src/router/client/navigation-coordinator.js +12 -2
  212. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +1 -0
  213. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
  214. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  215. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +27 -7
  216. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +36 -14
  217. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +17 -3
  218. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  219. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +2 -31
  220. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  221. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +2 -30
  222. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  223. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +43 -0
  224. package/src/services/assets/browser-bundle.service.d.ts +3 -1
  225. package/src/services/assets/browser-bundle.service.js +17 -5
  226. package/src/services/html/html-transformer.service.d.ts +1 -1
  227. package/src/services/html/html-transformer.service.js +4 -4
  228. package/src/services/invalidation/development-invalidation.service.d.ts +20 -2
  229. package/src/services/invalidation/development-invalidation.service.js +56 -2
  230. package/src/services/module-loading/README.md +49 -0
  231. package/src/services/module-loading/app-server-module-transpiler.service.js +5 -17
  232. package/src/services/module-loading/page-module-import.service.d.ts +5 -1
  233. package/src/services/module-loading/page-module-import.service.js +97 -45
  234. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  235. package/src/services/module-loading/route-module-build-cache-registry.js +37 -0
  236. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  237. package/src/services/module-loading/route-module-build-cache.js +38 -0
  238. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  239. package/src/services/module-loading/route-module-build-cache.store.js +207 -0
  240. package/src/services/module-loading/route-module-build-manifest.d.ts +61 -0
  241. package/src/services/module-loading/route-module-build-manifest.js +116 -0
  242. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  243. package/src/services/module-loading/route-module-dependency-hasher.js +121 -0
  244. package/src/services/module-loading/server-module-transpiler.service.js +1 -1
  245. package/src/static-site-generator/README.md +33 -0
  246. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  247. package/src/static-site-generator/static-build-invalidation.js +59 -0
  248. package/src/static-site-generator/static-export-context.d.ts +22 -0
  249. package/src/static-site-generator/static-export-context.js +0 -0
  250. package/src/static-site-generator/static-site-generator.d.ts +17 -20
  251. package/src/static-site-generator/static-site-generator.js +188 -85
  252. package/src/types/internal-types.d.ts +16 -9
  253. package/src/types/public-types.d.ts +138 -26
  254. package/src/utils/parse-cli-args.d.ts +2 -0
  255. package/src/utils/parse-cli-args.js +6 -0
  256. package/src/utils/server-utils.module.d.ts +3 -2
  257. package/src/utils/server-utils.module.js +5 -6
  258. package/src/utils/static-file-extensions.d.ts +12 -0
  259. package/src/utils/static-file-extensions.js +48 -0
  260. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  261. package/src/watchers/project-watcher-ignore.js +16 -0
  262. package/src/watchers/project-watcher.d.ts +25 -2
  263. package/src/watchers/project-watcher.js +130 -23
  264. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  265. package/src/build/rolldown-dev-build-adapter.js +0 -166
  266. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  267. package/src/hmr/hmr.test.e2e.js +0 -43
  268. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  269. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  270. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  271. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  272. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → client/navigation-scripts/navigation-scripts.test.browser.d.ts} +0 -0
  273. /package/src/{hmr/hmr.test.e2e.d.ts → client/scroll.test.browser.d.ts} +0 -0
@@ -7,6 +7,7 @@ export declare class NodeEcopagesApp extends SharedApplicationAdapter<EcopagesAp
7
7
  serverAdapter: NodeServerAdapterResult | undefined;
8
8
  private server;
9
9
  private runtimeOrigin;
10
+ private stopped;
10
11
  private readonly runtimeHost;
11
12
  constructor(options: EcopagesAppOptions, dependencies: {
12
13
  runtimeHost: RuntimeHost<NodeServerInstance, {
@@ -17,8 +18,11 @@ export declare class NodeEcopagesApp extends SharedApplicationAdapter<EcopagesAp
17
18
  protected createServerAdapter(params: Parameters<typeof createNodeServerAdapter>[0]): Promise<NodeServerAdapterResult>;
18
19
  stop(force?: boolean): Promise<void>;
19
20
  protected initializeServerAdapter(): Promise<NodeServerAdapterResult>;
20
- start(): Promise<NodeServerInstance | void>;
21
+ protected bootServer(): Promise<NodeServerInstance | void>;
21
22
  fetch(request: Request): Promise<Response>;
23
+ attachWebSocketUpgrades(httpServer: import('node:http').Server, options?: {
24
+ passthroughUnmatched?: boolean;
25
+ }): Promise<void>;
22
26
  }
23
27
  export declare function createNodeApp(options: EcopagesAppOptions): Promise<NodeEcopagesApp>;
24
28
  export declare function createApp(options: EcopagesAppOptions): Promise<NodeEcopagesApp>;
@@ -1,28 +1,36 @@
1
1
  import { appLogger } from "../../global/app-logger.js";
2
2
  import { SharedApplicationAdapter } from "../shared/application-adapter.js";
3
- import { resolveRuntimeBinding } from "../shared/runtime-app-bootstrap.js";
3
+ import { resolveRuntimeBinding, resolveStaticRuntimeMode } from "../shared/runtime-app-bootstrap.js";
4
4
  import { createNodeServerAdapter } from "./server-adapter.js";
5
5
  import { NodeHttpRequestBridge } from "./http-request-bridge.js";
6
6
  import { NodeRuntimeHost } from "./runtime-host.js";
7
+ import { hostOwnsDevClient } from "../../dev/dev-client-ownership.js";
7
8
  class NodeEcopagesApp extends SharedApplicationAdapter {
8
9
  serverAdapter;
9
10
  server = null;
10
11
  runtimeOrigin = "";
12
+ stopped = false;
11
13
  runtimeHost;
12
14
  constructor(options, dependencies) {
13
- super(options);
15
+ super(options, "Node");
14
16
  this.runtimeHost = dependencies.runtimeHost;
15
17
  }
16
18
  createServerAdapter(params) {
17
19
  return createNodeServerAdapter(params);
18
20
  }
19
21
  async stop(force = true) {
20
- if (!this.server) {
22
+ if (this.stopped) {
21
23
  return;
22
24
  }
23
- const activeServer = this.server;
24
- this.server = null;
25
- await this.runtimeHost.stop(activeServer, { force });
25
+ if (this.server) {
26
+ const activeServer = this.server;
27
+ this.server = null;
28
+ await this.runtimeHost.stop(activeServer, { force });
29
+ }
30
+ if (this.serverAdapter) {
31
+ await this.serverAdapter.dispose();
32
+ }
33
+ this.stopped = true;
26
34
  }
27
35
  async initializeServerAdapter() {
28
36
  const binding = resolveRuntimeBinding({
@@ -36,23 +44,43 @@ class NodeEcopagesApp extends SharedApplicationAdapter {
36
44
  apiHandlers: this.apiHandlers,
37
45
  staticRoutes: this.staticRoutes,
38
46
  errorHandler: this.errorHandler,
47
+ websocketHandlers: this.websocketHandlers.size > 0 ? this.websocketHandlers : void 0,
39
48
  options: { watch: binding.watch },
40
- serveOptions: binding.serveOptions
49
+ serveOptions: binding.serveOptions,
50
+ hostOwnsDevClient: hostOwnsDevClient(this.runtimeOptions),
51
+ deferRuntimeAssetSetup: resolveStaticRuntimeMode({
52
+ appConfig: this.appConfig,
53
+ cliArgs: this.cliArgs
54
+ }).canBuildWithoutRuntimeServer,
55
+ allowPortFallback: binding.allowPortFallback
41
56
  });
42
57
  }
43
- async start() {
58
+ async bootServer() {
59
+ if (this.stopped) {
60
+ this.serverAdapter = void 0;
61
+ this.stopped = false;
62
+ }
44
63
  if (!this.serverAdapter) {
45
64
  this.serverAdapter = await this.initializeServerAdapter();
46
65
  }
47
66
  if (this.server) {
48
67
  return this.server;
49
68
  }
50
- const { build, preview } = this.cliArgs;
69
+ const { build, preview, force, serveOnly } = this.cliArgs;
70
+ if (preview && serveOnly) {
71
+ const previewOrigin = await this.serverAdapter.servePreviewOnly();
72
+ if (previewOrigin) {
73
+ this.notifyListening(previewOrigin);
74
+ }
75
+ return;
76
+ }
51
77
  if (build || preview) {
52
78
  appLogger.debugTime("Building static pages");
53
- await this.serverAdapter.buildStatic({ preview });
54
- await this.stop(true);
79
+ const previewOrigin = await this.serverAdapter.buildStatic({ preview, force });
55
80
  appLogger.debugTimeEnd("Building static pages");
81
+ if (preview && previewOrigin) {
82
+ this.notifyListening(previewOrigin);
83
+ }
56
84
  if (build) {
57
85
  process.exit(0);
58
86
  }
@@ -67,7 +95,7 @@ class NodeEcopagesApp extends SharedApplicationAdapter {
67
95
  });
68
96
  this.runtimeOrigin = this.runtimeHost.getOrigin(this.server, serveOptions);
69
97
  await this.serverAdapter.completeInitialization(this.server);
70
- appLogger.info(`Node server running at ${this.runtimeOrigin}`);
98
+ this.notifyListening(this.runtimeOrigin);
71
99
  return this.server;
72
100
  }
73
101
  async fetch(request) {
@@ -76,6 +104,17 @@ class NodeEcopagesApp extends SharedApplicationAdapter {
76
104
  }
77
105
  return this.serverAdapter.handleRequest(request);
78
106
  }
107
+ async attachWebSocketUpgrades(httpServer, options) {
108
+ if (!this.serverAdapter) {
109
+ this.serverAdapter = await this.initializeServerAdapter();
110
+ }
111
+ if (!this.server) {
112
+ this.server = httpServer;
113
+ await this.serverAdapter.completeInitialization(httpServer);
114
+ return;
115
+ }
116
+ this.serverAdapter.attachUserWebSocketUpgrades(httpServer, options);
117
+ }
79
118
  }
80
119
  async function createNodeApp(options) {
81
120
  return new NodeEcopagesApp(options, {
@@ -23,4 +23,5 @@ export declare class NodeClientBridge implements IClientBridge {
23
23
  * Call this when the dev server is shutting down.
24
24
  */
25
25
  destroy(): void;
26
+ [Symbol.dispose](): void;
26
27
  }
@@ -60,6 +60,9 @@ class NodeClientBridge {
60
60
  }
61
61
  this.subscribers.clear();
62
62
  }
63
+ [Symbol.dispose]() {
64
+ this.destroy();
65
+ }
63
66
  }
64
67
  export {
65
68
  NodeClientBridge
@@ -4,6 +4,7 @@ import { SharedHmrManager } from '../shared/shared-hmr-manager.js';
4
4
  export interface NodeHmrManagerParams {
5
5
  appConfig: EcoPagesAppConfig;
6
6
  bridge: IClientBridge;
7
+ registrationTimeoutMs?: number;
7
8
  }
8
9
  /**
9
10
  * Node development HMR manager.
@@ -28,7 +29,7 @@ export declare class NodeHmrManager extends SharedHmrManager {
28
29
  * actually differs: dependency-graph storage, missing-file tolerance, and how
29
30
  * runtime bundle failures disable HMR.
30
31
  */
31
- constructor({ appConfig, bridge }: NodeHmrManagerParams);
32
+ constructor({ appConfig, bridge, registrationTimeoutMs }: NodeHmrManagerParams);
32
33
  /**
33
34
  * Reuses the shared in-memory dependency graph when the app already has one and
34
35
  * otherwise creates the default Node development graph.
@@ -13,8 +13,8 @@ class NodeHmrManager extends SharedHmrManager {
13
13
  * actually differs: dependency-graph storage, missing-file tolerance, and how
14
14
  * runtime bundle failures disable HMR.
15
15
  */
16
- constructor({ appConfig, bridge }) {
17
- super({ appConfig, bridge });
16
+ constructor({ appConfig, bridge, registrationTimeoutMs }) {
17
+ super({ appConfig, bridge, registrationTimeoutMs });
18
18
  }
19
19
  /**
20
20
  * Reuses the shared in-memory dependency graph when the app already has one and
@@ -1,4 +1,6 @@
1
1
  import { WebSocketServer } from "ws";
2
+ import { setAppDevClientBridge } from "../../dev/client-bridge-registry.js";
3
+ import { setAppHmrManager } from "../../dev/hmr-manager-registry.js";
2
4
  import { NodeClientBridge } from "./node-client-bridge.js";
3
5
  import { NodeHmrManager } from "./node-hmr-manager.js";
4
6
  class DefaultNodeServerDevRuntimeFactory {
@@ -6,6 +8,8 @@ class DefaultNodeServerDevRuntimeFactory {
6
8
  const websocketServer = new WebSocketServer({ noServer: true });
7
9
  const bridge = new NodeClientBridge();
8
10
  const hmrManager = new NodeHmrManager({ appConfig: options.appConfig, bridge });
11
+ setAppDevClientBridge(options.appConfig, bridge);
12
+ setAppHmrManager(options.appConfig, hmrManager);
9
13
  return {
10
14
  websocketServer,
11
15
  bridge,
@@ -1,6 +1,6 @@
1
1
  import { type Server as NodeHttpServer } from 'node:http';
2
2
  import type { EcoPagesAppConfig } from '../../types/internal-types.js';
3
- import type { ApiHandler, ErrorHandler, StaticRoute } from '../../types/public-types.js';
3
+ import type { ApiHandler, ErrorHandler, StaticRoute, EcopagesWebSocketHandler } from '../../types/public-types.js';
4
4
  import { SharedServerAdapter } from '../shared/server-adapter.js';
5
5
  import type { ServerAdapterResult } from '../abstract/server-adapter.js';
6
6
  import { NodeHttpRequestBridge } from './http-request-bridge.js';
@@ -19,9 +19,14 @@ export interface NodeServerAdapterParams {
19
19
  apiHandlers?: ApiHandler[];
20
20
  staticRoutes?: StaticRoute[];
21
21
  errorHandler?: ErrorHandler;
22
+ websocketHandlers?: Map<string, EcopagesWebSocketHandler<any, any>>;
23
+ delegateBrowserReloadToHost?: boolean;
24
+ hostOwnsDevClient?: boolean;
22
25
  options?: {
23
26
  watch?: boolean;
24
27
  };
28
+ deferRuntimeAssetSetup?: boolean;
29
+ allowPortFallback?: boolean;
25
30
  previewHost?: StaticPreviewHost;
26
31
  requestBridge?: NodeHttpRequestBridge;
27
32
  devRuntimeFactory?: NodeServerDevRuntimeFactory;
@@ -29,6 +34,10 @@ export interface NodeServerAdapterParams {
29
34
  export interface NodeServerAdapterResult extends ServerAdapterResult {
30
35
  completeInitialization: (server: NodeServerInstance) => Promise<void>;
31
36
  handleRequest: (request: Request) => Promise<Response>;
37
+ attachUserWebSocketUpgrades: (server: NodeServerInstance, options?: {
38
+ passthroughUnmatched?: boolean;
39
+ }) => void;
40
+ dispose: () => Promise<void>;
32
41
  }
33
42
  /**
34
43
  * Node.js HTTP server adapter for the Ecopages runtime.
@@ -58,13 +67,47 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
58
67
  private errorHandler?;
59
68
  private bridge;
60
69
  private hmrManager;
70
+ private projectWatcher;
71
+ private adapterDisposed;
72
+ private readonly deferRuntimeAssetSetup;
73
+ private readonly allowPortFallback;
61
74
  private readonly previewHost;
62
75
  private readonly requestBridge;
63
76
  private readonly devRuntimeFactory;
64
- private shouldInjectHmrScript;
65
- private isHtmlResponse;
77
+ /**
78
+ * Reference to the application-level WebSocket handlers map.
79
+ *
80
+ * @remarks
81
+ * This is a reference to the map owned by `AbstractApplicationAdapter`,
82
+ * passed in via the constructor. The Node adapter reads from it to wire
83
+ * WebSocket upgrades for user-registered patterns.
84
+ */
85
+ protected websocketHandlers: Map<string, EcopagesWebSocketHandler<any, any>>;
86
+ /**
87
+ * Wires user WebSocket routes onto a foreign Node HTTP server.
88
+ *
89
+ * Host integrations such as the Vite plugin call this so `app.websocket()`
90
+ * handlers work while HTTP is still served by the host dev server.
91
+ */
92
+ attachUserWebSocketUpgrades(server: NodeServerInstance, options?: {
93
+ passthroughUnmatched?: boolean;
94
+ }): void;
95
+ private wireUserWebSocketUpgrades;
66
96
  private maybeInjectHmrScript;
67
- constructor(options: NodeServerAdapterParams);
97
+ /**
98
+ * @remarks
99
+ * `previewHost`, `requestBridge`, and `devRuntimeFactory` are optional on the
100
+ * public {@link NodeServerAdapterParams} so factory callers can omit them, but
101
+ * they are mandatory by the time the concrete adapter is constructed —
102
+ * {@link createNodeServerAdapter} fills in Node-specific defaults first. The
103
+ * constructor signature makes that invariant explicit instead of relying on
104
+ * non-null assertions.
105
+ */
106
+ constructor(options: NodeServerAdapterParams & {
107
+ previewHost: StaticPreviewHost;
108
+ requestBridge: NodeHttpRequestBridge;
109
+ devRuntimeFactory: NodeServerDevRuntimeFactory;
110
+ });
68
111
  /**
69
112
  * Prepares the adapter for use.
70
113
  *
@@ -79,27 +122,26 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
79
122
  * processors during their `setup()` calls.
80
123
  */
81
124
  initialize(): Promise<void>;
82
- private prepareRuntimePublicDir;
83
125
  getServerOptions(): NodeServeAdapterServerOptions;
84
126
  buildStatic(options?: {
85
127
  preview?: boolean;
86
- }): Promise<void>;
87
- private startBuildRuntimeServer;
88
- private getListeningServerOrigin;
128
+ force?: boolean;
129
+ }): Promise<string | undefined>;
89
130
  /**
90
- * Gracefully shuts down the ephemeral build runtime server.
91
- *
92
- * `closeAllConnections()` is called *before* `close()` because `server.close()`
93
- * only stops accepting new connections — it waits for existing keep-alive
94
- * connections to finish naturally, which can stall the build indefinitely.
95
- * `closeAllConnections()` force-closes any lingering sockets immediately so
96
- * the `close()` callback fires promptly.
97
- *
98
- * The `NodeClientBridge` heartbeat is also destroyed here so its `setInterval`
99
- * does not prevent the Node.js process from exiting cleanly after the build.
131
+ * Serves an existing static export without running SSG. Used by e2e preview
132
+ * launchers after a shared prewarm build.
100
133
  */
101
- private stopBuildRuntimeServer;
134
+ servePreviewOnly(): Promise<string | undefined>;
135
+ private startPreviewServer;
102
136
  createAdapter(): Promise<NodeServerAdapterResult>;
137
+ /**
138
+ * Releases dev-time resources owned by the adapter.
139
+ *
140
+ * @remarks
141
+ * Safe to call multiple times. Does not stop the bound HTTP server — callers
142
+ * should shut down transport through the runtime host before disposing.
143
+ */
144
+ dispose(): Promise<void>;
103
145
  /**
104
146
  * Handles a single incoming Web `Request` and returns a Web `Response`.
105
147
  *
@@ -123,7 +165,7 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
123
165
  * - Shared watcher bootstrapping listens for route-level file changes and
124
166
  * refreshes the router and response handlers when pages are added or removed.
125
167
  *
126
- * WebSocket upgrade requests that do not target `/_hmr` are rejected with an
168
+ * WebSocket upgrade requests that do not match a known path are rejected with an
127
169
  * immediate socket destroy to prevent unhandled upgrade leaks.
128
170
  */
129
171
  completeInitialization(server: NodeServerInstance): Promise<void>;