@noego/wood 0.6.2 → 0.7.0

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 (242) hide show
  1. package/README.md +7 -0
  2. package/dist/browser-test-setup.cjs +29 -0
  3. package/dist/browser-test-setup.cjs.map +1 -0
  4. package/dist/browser-test-setup.d.cts +8 -0
  5. package/dist/browser-test-setup.d.ts +8 -0
  6. package/dist/browser-test-setup.js +9 -0
  7. package/dist/browser-test-setup.js.map +1 -0
  8. package/dist/client/global_polyfill.d.cts +1 -0
  9. package/dist/client/global_polyfill.d.ts +1 -0
  10. package/dist/client/index.cjs +7 -0
  11. package/dist/client/index.cjs.map +1 -1
  12. package/dist/client/index.d.cts +7 -4
  13. package/dist/client/index.d.ts +7 -4
  14. package/dist/client/index.js +6 -1
  15. package/dist/client/index.js.map +1 -1
  16. package/dist/codegen/renderer_app_generator.cjs +97 -24
  17. package/dist/codegen/renderer_app_generator.cjs.map +1 -1
  18. package/dist/codegen/renderer_app_generator.js +97 -24
  19. package/dist/codegen/renderer_app_generator.js.map +1 -1
  20. package/dist/codegen/type_generator.cjs +9 -0
  21. package/dist/codegen/type_generator.cjs.map +1 -1
  22. package/dist/codegen/type_generator.js +9 -0
  23. package/dist/codegen/type_generator.js.map +1 -1
  24. package/dist/config/config_parser.cjs +10 -0
  25. package/dist/config/config_parser.cjs.map +1 -1
  26. package/dist/config/config_parser.js +10 -0
  27. package/dist/config/config_parser.js.map +1 -1
  28. package/dist/fetch.cjs +38 -0
  29. package/dist/fetch.cjs.map +1 -0
  30. package/dist/fetch.d.cts +7 -0
  31. package/dist/fetch.d.ts +7 -0
  32. package/dist/fetch.js +12 -0
  33. package/dist/fetch.js.map +1 -0
  34. package/dist/frontend/frontend_page.cjs +3 -3
  35. package/dist/frontend/frontend_page.cjs.map +1 -1
  36. package/dist/frontend/frontend_page.d.cts +1 -1
  37. package/dist/frontend/frontend_page.d.ts +1 -1
  38. package/dist/frontend/frontend_page.js +3 -3
  39. package/dist/frontend/frontend_page.js.map +1 -1
  40. package/dist/frontend/frontend_surface.cjs +31 -17
  41. package/dist/frontend/frontend_surface.cjs.map +1 -1
  42. package/dist/frontend/frontend_surface.d.cts +12 -2
  43. package/dist/frontend/frontend_surface.d.ts +12 -2
  44. package/dist/frontend/frontend_surface.js +37 -17
  45. package/dist/frontend/frontend_surface.js.map +1 -1
  46. package/dist/frontend/index.d.cts +2 -0
  47. package/dist/frontend/index.d.ts +2 -0
  48. package/dist/index.cjs +5 -0
  49. package/dist/index.cjs.map +1 -1
  50. package/dist/index.d.cts +25 -0
  51. package/dist/index.d.ts +25 -0
  52. package/dist/index.js +3 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/loader/index.cjs +19 -2
  55. package/dist/loader/index.cjs.map +1 -1
  56. package/dist/loader/index.d.cts +1 -0
  57. package/dist/loader/index.d.ts +1 -0
  58. package/dist/loader/index.js +19 -1
  59. package/dist/loader/index.js.map +1 -1
  60. package/dist/loader/loader_orchestration.cjs +82 -0
  61. package/dist/loader/loader_orchestration.cjs.map +1 -0
  62. package/dist/loader/loader_orchestration.d.cts +66 -0
  63. package/dist/loader/loader_orchestration.d.ts +66 -0
  64. package/dist/loader/loader_orchestration.js +51 -0
  65. package/dist/loader/loader_orchestration.js.map +1 -0
  66. package/dist/loader/loader_runner.cjs +46 -41
  67. package/dist/loader/loader_runner.cjs.map +1 -1
  68. package/dist/loader/loader_runner.d.cts +12 -6
  69. package/dist/loader/loader_runner.d.ts +12 -6
  70. package/dist/loader/loader_runner.js +50 -41
  71. package/dist/loader/loader_runner.js.map +1 -1
  72. package/dist/native_browser.types-BY2daUOS.d.ts +189 -0
  73. package/dist/native_browser.types-vWXtE4rM.d.cts +189 -0
  74. package/dist/navigation/index.cjs +15 -2
  75. package/dist/navigation/index.cjs.map +1 -1
  76. package/dist/navigation/index.d.cts +2 -0
  77. package/dist/navigation/index.d.ts +2 -0
  78. package/dist/navigation/index.js +8 -1
  79. package/dist/navigation/index.js.map +1 -1
  80. package/dist/runtime/get_container.cjs +2 -0
  81. package/dist/runtime/get_container.cjs.map +1 -1
  82. package/dist/runtime/get_container.js +2 -0
  83. package/dist/runtime/get_container.js.map +1 -1
  84. package/dist/runtime/index.cjs +5 -0
  85. package/dist/runtime/index.cjs.map +1 -1
  86. package/dist/runtime/index.d.cts +2 -0
  87. package/dist/runtime/index.d.ts +2 -0
  88. package/dist/runtime/index.js +3 -0
  89. package/dist/runtime/index.js.map +1 -1
  90. package/dist/runtime/runtime_capabilities.cjs +35 -0
  91. package/dist/runtime/runtime_capabilities.cjs.map +1 -0
  92. package/dist/runtime/runtime_capabilities.d.cts +6 -0
  93. package/dist/runtime/runtime_capabilities.d.ts +6 -0
  94. package/dist/runtime/runtime_capabilities.js +11 -0
  95. package/dist/runtime/runtime_capabilities.js.map +1 -0
  96. package/dist/runtime/runtime_module.cjs +2 -0
  97. package/dist/runtime/runtime_module.cjs.map +1 -1
  98. package/dist/runtime/runtime_module.js +2 -0
  99. package/dist/runtime/runtime_module.js.map +1 -1
  100. package/dist/test-wood.cjs +150 -0
  101. package/dist/test-wood.cjs.map +1 -0
  102. package/dist/test-wood.d.cts +62 -0
  103. package/dist/test-wood.d.ts +62 -0
  104. package/dist/test-wood.js +115 -0
  105. package/dist/test-wood.js.map +1 -0
  106. package/dist/testing/browser.cjs +92 -163
  107. package/dist/testing/browser.cjs.map +1 -1
  108. package/dist/testing/browser.d.cts +14 -13
  109. package/dist/testing/browser.d.ts +14 -13
  110. package/dist/testing/browser.js +88 -162
  111. package/dist/testing/browser.js.map +1 -1
  112. package/dist/testing/create_controller_harness.d.cts +2 -1
  113. package/dist/testing/create_controller_harness.d.ts +2 -1
  114. package/dist/testing/create_router_bridge.cjs +19 -15
  115. package/dist/testing/create_router_bridge.cjs.map +1 -1
  116. package/dist/testing/create_router_bridge.d.cts +8 -1
  117. package/dist/testing/create_router_bridge.d.ts +8 -1
  118. package/dist/testing/create_router_bridge.js +18 -15
  119. package/dist/testing/create_router_bridge.js.map +1 -1
  120. package/dist/testing/index.cjs +12 -4
  121. package/dist/testing/index.cjs.map +1 -1
  122. package/dist/testing/index.d.cts +11 -5
  123. package/dist/testing/index.d.ts +11 -5
  124. package/dist/testing/index.js +9 -3
  125. package/dist/testing/index.js.map +1 -1
  126. package/dist/testing/native_browser/browser_pool.cjs +31 -0
  127. package/dist/testing/native_browser/browser_pool.cjs.map +1 -0
  128. package/dist/testing/native_browser/browser_pool.d.cts +1 -0
  129. package/dist/testing/native_browser/browser_pool.d.ts +1 -0
  130. package/dist/testing/native_browser/browser_pool.js +6 -0
  131. package/dist/testing/native_browser/browser_pool.js.map +1 -0
  132. package/dist/testing/native_browser/happy_dom_tab.cjs +107 -0
  133. package/dist/testing/native_browser/happy_dom_tab.cjs.map +1 -0
  134. package/dist/testing/native_browser/happy_dom_tab.d.cts +35 -0
  135. package/dist/testing/native_browser/happy_dom_tab.d.ts +35 -0
  136. package/dist/testing/native_browser/happy_dom_tab.js +73 -0
  137. package/dist/testing/native_browser/happy_dom_tab.js.map +1 -0
  138. package/dist/testing/native_browser/happy_dom_transfer.cjs +29 -0
  139. package/dist/testing/native_browser/happy_dom_transfer.cjs.map +1 -0
  140. package/dist/testing/native_browser/happy_dom_transfer.d.cts +1 -0
  141. package/dist/testing/native_browser/happy_dom_transfer.d.ts +1 -0
  142. package/dist/testing/native_browser/happy_dom_transfer.js +5 -0
  143. package/dist/testing/native_browser/happy_dom_transfer.js.map +1 -0
  144. package/dist/testing/native_browser/host_transport.cjs +89 -0
  145. package/dist/testing/native_browser/host_transport.cjs.map +1 -0
  146. package/dist/testing/native_browser/host_transport.d.cts +44 -0
  147. package/dist/testing/native_browser/host_transport.d.ts +44 -0
  148. package/dist/testing/native_browser/host_transport.js +65 -0
  149. package/dist/testing/native_browser/host_transport.js.map +1 -0
  150. package/dist/testing/native_browser/native_browser.types.cjs +17 -0
  151. package/dist/testing/native_browser/native_browser.types.cjs.map +1 -0
  152. package/dist/testing/native_browser/native_browser.types.d.cts +31 -0
  153. package/dist/testing/native_browser/native_browser.types.d.ts +31 -0
  154. package/dist/testing/native_browser/native_browser.types.js +1 -0
  155. package/dist/testing/native_browser/native_browser.types.js.map +1 -0
  156. package/dist/testing/native_browser/native_browser_environment.cjs +143 -0
  157. package/dist/testing/native_browser/native_browser_environment.cjs.map +1 -0
  158. package/dist/testing/native_browser/native_browser_environment.d.cts +36 -0
  159. package/dist/testing/native_browser/native_browser_environment.d.ts +36 -0
  160. package/dist/testing/native_browser/native_browser_environment.js +109 -0
  161. package/dist/testing/native_browser/native_browser_environment.js.map +1 -0
  162. package/dist/testing/native_browser/native_browser_lifecycle.cjs +31 -0
  163. package/dist/testing/native_browser/native_browser_lifecycle.cjs.map +1 -0
  164. package/dist/testing/native_browser/native_browser_lifecycle.d.cts +1 -0
  165. package/dist/testing/native_browser/native_browser_lifecycle.d.ts +1 -0
  166. package/dist/testing/native_browser/native_browser_lifecycle.js +6 -0
  167. package/dist/testing/native_browser/native_browser_lifecycle.js.map +1 -0
  168. package/dist/testing/native_browser/playwright_tab.cjs +124 -0
  169. package/dist/testing/native_browser/playwright_tab.cjs.map +1 -0
  170. package/dist/testing/native_browser/playwright_tab.d.cts +35 -0
  171. package/dist/testing/native_browser/playwright_tab.d.ts +35 -0
  172. package/dist/testing/native_browser/playwright_tab.js +100 -0
  173. package/dist/testing/native_browser/playwright_tab.js.map +1 -0
  174. package/dist/testing/native_browser/renderer_compilation.cjs +149 -0
  175. package/dist/testing/native_browser/renderer_compilation.cjs.map +1 -0
  176. package/dist/testing/native_browser/renderer_compilation.d.cts +35 -0
  177. package/dist/testing/native_browser/renderer_compilation.d.ts +35 -0
  178. package/dist/testing/native_browser/renderer_compilation.js +115 -0
  179. package/dist/testing/native_browser/renderer_compilation.js.map +1 -0
  180. package/dist/testing/native_browser/renderer_entry.cjs +148 -0
  181. package/dist/testing/native_browser/renderer_entry.cjs.map +1 -0
  182. package/dist/testing/native_browser/renderer_entry.d.cts +13 -0
  183. package/dist/testing/native_browser/renderer_entry.d.ts +13 -0
  184. package/dist/testing/native_browser/renderer_entry.js +114 -0
  185. package/dist/testing/native_browser/renderer_entry.js.map +1 -0
  186. package/dist/testing/registration_only_root.cjs +61 -5
  187. package/dist/testing/registration_only_root.cjs.map +1 -1
  188. package/dist/testing/registration_only_root.d.cts +25 -4
  189. package/dist/testing/registration_only_root.d.ts +25 -4
  190. package/dist/testing/registration_only_root.js +60 -5
  191. package/dist/testing/registration_only_root.js.map +1 -1
  192. package/dist/testing/runner_importer.cjs +75 -0
  193. package/dist/testing/runner_importer.cjs.map +1 -0
  194. package/dist/testing/runner_importer.d.cts +8 -0
  195. package/dist/testing/runner_importer.d.ts +8 -0
  196. package/dist/testing/runner_importer.js +41 -0
  197. package/dist/testing/runner_importer.js.map +1 -0
  198. package/dist/testing/test_wood_config.cjs +387 -272
  199. package/dist/testing/test_wood_config.cjs.map +1 -1
  200. package/dist/testing/test_wood_config.d.cts +18 -123
  201. package/dist/testing/test_wood_config.d.ts +18 -123
  202. package/dist/testing/test_wood_config.js +396 -270
  203. package/dist/testing/test_wood_config.js.map +1 -1
  204. package/dist/testing/wood_config_source.cjs +12 -0
  205. package/dist/testing/wood_config_source.cjs.map +1 -1
  206. package/dist/testing/wood_config_source.d.cts +10 -0
  207. package/dist/testing/wood_config_source.d.ts +10 -0
  208. package/dist/testing/wood_config_source.js +12 -0
  209. package/dist/testing/wood_config_source.js.map +1 -1
  210. package/dist/testing/wood_env_renderer.cjs +28 -3
  211. package/dist/testing/wood_env_renderer.cjs.map +1 -1
  212. package/dist/testing/wood_env_renderer.d.cts +12 -1
  213. package/dist/testing/wood_env_renderer.d.ts +12 -1
  214. package/dist/testing/wood_env_renderer.js +28 -3
  215. package/dist/testing/wood_env_renderer.js.map +1 -1
  216. package/dist/testing/wood_lazy_runtime.cjs +109 -0
  217. package/dist/testing/wood_lazy_runtime.cjs.map +1 -0
  218. package/dist/testing/wood_lazy_runtime.d.cts +36 -0
  219. package/dist/testing/wood_lazy_runtime.d.ts +36 -0
  220. package/dist/testing/wood_lazy_runtime.js +84 -0
  221. package/dist/testing/wood_lazy_runtime.js.map +1 -0
  222. package/dist/testing/wood_test_selection.cjs +34 -55
  223. package/dist/testing/wood_test_selection.cjs.map +1 -1
  224. package/dist/testing/wood_test_selection.d.cts +18 -24
  225. package/dist/testing/wood_test_selection.d.ts +18 -24
  226. package/dist/testing/wood_test_selection.js +30 -54
  227. package/dist/testing/wood_test_selection.js.map +1 -1
  228. package/dist/testing-api.cjs +17 -0
  229. package/dist/testing-api.cjs.map +1 -0
  230. package/dist/testing-api.d.cts +18 -0
  231. package/dist/testing-api.d.ts +18 -0
  232. package/dist/testing-api.js +1 -0
  233. package/dist/testing-api.js.map +1 -0
  234. package/dist/types/config.cjs.map +1 -1
  235. package/dist/types/config.d.cts +4 -0
  236. package/dist/types/config.d.ts +4 -0
  237. package/docs/native-browser-testing.md +164 -0
  238. package/package.json +31 -5
  239. package/src/components/NavigationShell.browser.test.ts +10 -10
  240. package/src/components/NavigationShell.cleanup.browser.test.ts +57 -0
  241. package/src/components/NavigationShell.scopes.browser.test.ts +5 -5
  242. package/src/components/NavigationShell.svelte +50 -24
@@ -4,13 +4,14 @@ import { RouterBridgeResult } from './create_router_bridge.cjs';
4
4
  import { createTestRouter } from './create_test_router.cjs';
5
5
  import '../navigation/layout_preservation.cjs';
6
6
  import '../navigation/automation_introspection.cjs';
7
+ import '../loader/loader_orchestration.cjs';
8
+ import '../types/context.cjs';
7
9
  import '@noego/trace/testing';
8
10
  import '../trace_hub-Cpo_nVze.cjs';
9
11
  import 'rxjs';
10
12
  import '../tracing/trace_provider.cjs';
11
13
  import '../router/wood_router.cjs';
12
14
  import '../types/operations.cjs';
13
- import '../types/context.cjs';
14
15
  import '../validation/schema_validator.cjs';
15
16
  import '../middleware/middleware_resolver.cjs';
16
17
  import '../controller/controller_resolver.cjs';
@@ -4,13 +4,14 @@ import { RouterBridgeResult } from './create_router_bridge.js';
4
4
  import { createTestRouter } from './create_test_router.js';
5
5
  import '../navigation/layout_preservation.js';
6
6
  import '../navigation/automation_introspection.js';
7
+ import '../loader/loader_orchestration.js';
8
+ import '../types/context.js';
7
9
  import '@noego/trace/testing';
8
10
  import '../trace_hub-Cpo_nVze.js';
9
11
  import 'rxjs';
10
12
  import '../tracing/trace_provider.js';
11
13
  import '../router/wood_router.js';
12
14
  import '../types/operations.js';
13
- import '../types/context.js';
14
15
  import '../validation/schema_validator.js';
15
16
  import '../middleware/middleware_resolver.js';
16
17
  import '../controller/controller_resolver.js';
@@ -19,6 +19,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var create_router_bridge_exports = {};
20
20
  __export(create_router_bridge_exports, {
21
21
  RouterBridgeEvents: () => RouterBridgeEvents,
22
+ createOperationApi: () => createOperationApi,
22
23
  createRouterBridge: () => createRouterBridge
23
24
  });
24
25
  module.exports = __toCommonJS(create_router_bridge_exports);
@@ -68,36 +69,39 @@ class RouterBridgeEvents {
68
69
  return total;
69
70
  }
70
71
  }
71
- function createRouterBridge(router) {
72
- const events = new RouterBridgeEvents();
73
- const bridge = buildBridgeTree(router, events);
74
- return { bridge, events };
75
- }
76
- function buildBridgeTree(router, events) {
72
+ function createOperationApi(channels, dispatch) {
77
73
  const tree = {};
78
- for (const channel of router.getChannels()) {
74
+ for (const channel of channels) {
79
75
  const parts = channel.split(".");
80
76
  let current = tree;
81
77
  for (let i = 0; i < parts.length - 1; i++) {
82
- if (!current[parts[i]]) {
83
- current[parts[i]] = {};
84
- }
85
- current = current[parts[i]];
78
+ const part = parts[i];
79
+ if (!current[part]) current[part] = {};
80
+ current = current[part];
86
81
  }
87
82
  const leaf = parts[parts.length - 1];
88
- current[leaf] = (data) => router.dispatch(channel, data ?? {});
83
+ current[leaf] = (data) => dispatch(channel, data ?? {});
89
84
  }
90
- tree.on = (channel, callback) => {
85
+ return tree;
86
+ }
87
+ function createRouterBridge(router) {
88
+ const events = new RouterBridgeEvents();
89
+ const bridge = createOperationApi(
90
+ router.getChannels(),
91
+ (channel, data) => router.dispatch(channel, data ?? {})
92
+ );
93
+ bridge.on = (channel, callback) => {
91
94
  return events.on(channel, callback);
92
95
  };
93
- tree.__trace = async (payload) => {
96
+ bridge.__trace = async (payload) => {
94
97
  return (0, import_tracing.dispatchRendererTracePayload)(payload);
95
98
  };
96
- return tree;
99
+ return { bridge, events };
97
100
  }
98
101
  // Annotate the CommonJS export names for ESM import in node:
99
102
  0 && (module.exports = {
100
103
  RouterBridgeEvents,
104
+ createOperationApi,
101
105
  createRouterBridge
102
106
  });
103
107
  //# sourceMappingURL=create_router_bridge.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/testing/create_router_bridge.ts"],"sourcesContent":["import type { WoodRouter } from '../router/wood_router.cjs';\nimport { dispatchRendererTracePayload } from '../tracing/index.js';\n\n/**\n * An in-process event emitter that replaces Electron's\n * `webContents.send('__event:channel', data)` / `ipcRenderer.on('__event:channel', cb)`.\n *\n * The server side calls `WindowEventService.send(channel, data)` which prepends\n * `__event:` and calls the configured sender. In production that sender is\n * `mainWindow.webContents.send`. In tests we wire it to `RouterBridgeEvents.emit`\n * which strips the prefix and delivers to subscribers registered via `on()`.\n */\nexport class RouterBridgeEvents {\n private listeners = new Map<string, Set<(...args: unknown[]) => void>>();\n\n /**\n * Subscribe to a channel. Returns an unsubscribe function.\n * This is exposed as bridge.on() — matching the WoodBridge contract.\n */\n on(channel: string, callback: (...args: unknown[]) => void): () => void {\n if (!this.listeners.has(channel)) {\n this.listeners.set(channel, new Set());\n }\n this.listeners.get(channel)!.add(callback);\n return () => {\n this.listeners.get(channel)?.delete(callback);\n };\n }\n\n /**\n * Deliver an event to subscribers. Called by the WindowEventService sender.\n * Strips the `__event:` prefix that WindowEventService always prepends.\n */\n emit(channel: string, data: unknown): void {\n const stripped = channel.startsWith('__event:')\n ? channel.slice('__event:'.length)\n : channel;\n\n const handlers = this.listeners.get(stripped);\n if (handlers) {\n for (const cb of handlers) {\n cb(data);\n }\n }\n }\n\n /** Remove all listeners (for cleanup in afterEach). */\n clear(): void {\n this.listeners.clear();\n }\n\n listenerCount(channel?: string): number {\n if (channel) {\n return this.listeners.get(channel)?.size ?? 0;\n }\n\n let total = 0;\n for (const handlers of this.listeners.values()) {\n total += handlers.size;\n }\n return total;\n }\n}\n\nexport interface RouterBridgeResult {\n /**\n * A WoodBridge-shaped object where every operation method calls\n * `router.dispatch(channel, data)` — with real validation, scoped\n * containers, and middleware. The `on()` method delivers events\n * from the in-process event emitter.\n *\n * Wire this to your UI controllers as the WoodBridge dependency.\n */\n bridge: Record<string, any>;\n\n /**\n * The event emitter backing bridge.on().\n * Wire `WindowEventService.configure((ch, data) => events.emit(ch, data))`\n * to close the server→UI event loop.\n */\n events: RouterBridgeEvents;\n}\n\n/**\n * Build a WoodBridge-shaped object backed by `router.dispatch()`.\n *\n * Every operation channel (e.g. `chat.messages.send`) becomes a nested\n * method on the returned bridge that calls `router.dispatch(channel, data)`.\n * This means every call goes through the full WoodRouter pipeline:\n * input validation, scoped container, middleware, controller resolution.\n *\n * The bridge also includes an `on(channel, callback)` method backed by\n * an in-process event emitter. Connect `WindowEventService.configure()`\n * to `events.emit` to complete the server→UI push loop.\n *\n * Usage:\n * const { router } = createTestRouter(...);\n * const { bridge, events } = createRouterBridge(router);\n *\n * // Wire server→UI events\n * const windowEvents = await container.get(WindowEventService);\n * windowEvents.configure((ch, data) => events.emit(ch, data));\n *\n * // Use bridge as WoodBridge\n * const controller = new ConversationController(bridge, ...);\n */\nexport function createRouterBridge(router: WoodRouter): RouterBridgeResult {\n const events = new RouterBridgeEvents();\n const bridge = buildBridgeTree(router, events);\n\n return { bridge, events };\n}\n\n/**\n * Build the nested bridge object from the router's registered channels.\n *\n * Channels like `chat.messages.send` become `bridge.chat.messages.send(data)`.\n * The nesting algorithm is identical to the one used by the preload generator\n * and test mock generator in @noego/wood codegen — split on `.`, intermediate\n * segments become namespace objects, leaf segments become dispatch functions.\n */\nfunction buildBridgeTree(router: WoodRouter, events: RouterBridgeEvents): Record<string, any> {\n const tree: Record<string, any> = {};\n\n for (const channel of router.getChannels()) {\n const parts = channel.split('.');\n let current = tree;\n\n // Create/traverse intermediate namespace objects\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) {\n current[parts[i]] = {};\n }\n current = current[parts[i]];\n }\n\n // Leaf: function that dispatches through the router\n const leaf = parts[parts.length - 1];\n current[leaf] = (data?: unknown) => router.dispatch(channel, data ?? {});\n }\n\n // Attach the event subscription method (matches WoodBridge.on)\n tree.on = (channel: string, callback: (...args: unknown[]) => void) => {\n return events.on(channel, callback);\n };\n tree.__trace = async (payload: unknown) => {\n return dispatchRendererTracePayload(payload);\n };\n\n return tree;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAA6C;AAWtC,MAAM,mBAAmB;AAAA,EAAzB;AACL,SAAQ,YAAY,oBAAI,IAA+C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvE,GAAG,SAAiB,UAAoD;AACtE,QAAI,CAAC,KAAK,UAAU,IAAI,OAAO,GAAG;AAChC,WAAK,UAAU,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,IACvC;AACA,SAAK,UAAU,IAAI,OAAO,EAAG,IAAI,QAAQ;AACzC,WAAO,MAAM;AACX,WAAK,UAAU,IAAI,OAAO,GAAG,OAAO,QAAQ;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,SAAiB,MAAqB;AACzC,UAAM,WAAW,QAAQ,WAAW,UAAU,IAC1C,QAAQ,MAAM,WAAW,MAAM,IAC/B;AAEJ,UAAM,WAAW,KAAK,UAAU,IAAI,QAAQ;AAC5C,QAAI,UAAU;AACZ,iBAAW,MAAM,UAAU;AACzB,WAAG,IAAI;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA,EAEA,cAAc,SAA0B;AACtC,QAAI,SAAS;AACX,aAAO,KAAK,UAAU,IAAI,OAAO,GAAG,QAAQ;AAAA,IAC9C;AAEA,QAAI,QAAQ;AACZ,eAAW,YAAY,KAAK,UAAU,OAAO,GAAG;AAC9C,eAAS,SAAS;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AACF;AA4CO,SAAS,mBAAmB,QAAwC;AACzE,QAAM,SAAS,IAAI,mBAAmB;AACtC,QAAM,SAAS,gBAAgB,QAAQ,MAAM;AAE7C,SAAO,EAAE,QAAQ,OAAO;AAC1B;AAUA,SAAS,gBAAgB,QAAoB,QAAiD;AAC5F,QAAM,OAA4B,CAAC;AAEnC,aAAW,WAAW,OAAO,YAAY,GAAG;AAC1C,UAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,QAAI,UAAU;AAGd,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAI,CAAC,QAAQ,MAAM,CAAC,CAAC,GAAG;AACtB,gBAAQ,MAAM,CAAC,CAAC,IAAI,CAAC;AAAA,MACvB;AACA,gBAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC5B;AAGA,UAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,YAAQ,IAAI,IAAI,CAAC,SAAmB,OAAO,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,EACzE;AAGA,OAAK,KAAK,CAAC,SAAiB,aAA2C;AACrE,WAAO,OAAO,GAAG,SAAS,QAAQ;AAAA,EACpC;AACA,OAAK,UAAU,OAAO,YAAqB;AACzC,eAAO,6CAA6B,OAAO;AAAA,EAC7C;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/testing/create_router_bridge.ts"],"sourcesContent":["import type { WoodRouter } from '../router/wood_router.cjs';\nimport { dispatchRendererTracePayload } from '../tracing/index.js';\n\n/**\n * An in-process event emitter that replaces Electron's\n * `webContents.send('__event:channel', data)` / `ipcRenderer.on('__event:channel', cb)`.\n *\n * The server side calls `WindowEventService.send(channel, data)` which prepends\n * `__event:` and calls the configured sender. In production that sender is\n * `mainWindow.webContents.send`. In tests we wire it to `RouterBridgeEvents.emit`\n * which strips the prefix and delivers to subscribers registered via `on()`.\n */\nexport class RouterBridgeEvents {\n private listeners = new Map<string, Set<(...args: unknown[]) => void>>();\n\n /**\n * Subscribe to a channel. Returns an unsubscribe function.\n * This is exposed as bridge.on() — matching the WoodBridge contract.\n */\n on(channel: string, callback: (...args: unknown[]) => void): () => void {\n if (!this.listeners.has(channel)) {\n this.listeners.set(channel, new Set());\n }\n this.listeners.get(channel)!.add(callback);\n return () => {\n this.listeners.get(channel)?.delete(callback);\n };\n }\n\n /**\n * Deliver an event to subscribers. Called by the WindowEventService sender.\n * Strips the `__event:` prefix that WindowEventService always prepends.\n */\n emit(channel: string, data: unknown): void {\n const stripped = channel.startsWith('__event:')\n ? channel.slice('__event:'.length)\n : channel;\n\n const handlers = this.listeners.get(stripped);\n if (handlers) {\n for (const cb of handlers) {\n cb(data);\n }\n }\n }\n\n /** Remove all listeners (for cleanup in afterEach). */\n clear(): void {\n this.listeners.clear();\n }\n\n listenerCount(channel?: string): number {\n if (channel) {\n return this.listeners.get(channel)?.size ?? 0;\n }\n\n let total = 0;\n for (const handlers of this.listeners.values()) {\n total += handlers.size;\n }\n return total;\n }\n}\n\nexport type OperationApiDispatch = (channel: string, input?: unknown) => Promise<unknown>;\n\n/**\n * Build the nested operation API used by testWood and the in-process bridge.\n * Channel paths stay authoritative: `backend_service.status` becomes\n * `api.backend_service.status()` and dispatch still enters the real router.\n */\nexport function createOperationApi(\n channels: Iterable<string>,\n dispatch: OperationApiDispatch,\n): Record<string, any> {\n const tree: Record<string, any> = {};\n\n for (const channel of channels) {\n const parts = channel.split('.');\n let current = tree;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (!current[part]) current[part] = {};\n current = current[part];\n }\n\n const leaf = parts[parts.length - 1]!;\n current[leaf] = (data?: unknown) => dispatch(channel, data ?? {});\n }\n\n return tree;\n}\n\nexport interface RouterBridgeResult {\n /**\n * A WoodBridge-shaped object where every operation method calls\n * `router.dispatch(channel, data)` — with real validation, scoped\n * containers, and middleware. The `on()` method delivers events\n * from the in-process event emitter.\n *\n * Wire this to your UI controllers as the WoodBridge dependency.\n */\n bridge: Record<string, any>;\n\n /**\n * The event emitter backing bridge.on().\n * Wire `WindowEventService.configure((ch, data) => events.emit(ch, data))`\n * to close the server→UI event loop.\n */\n events: RouterBridgeEvents;\n}\n\n/**\n * Build a WoodBridge-shaped object backed by `router.dispatch()`.\n *\n * Every operation channel (e.g. `chat.messages.send`) becomes a nested\n * method on the returned bridge that calls `router.dispatch(channel, data)`.\n * This means every call goes through the full WoodRouter pipeline:\n * input validation, scoped container, middleware, controller resolution.\n *\n * The bridge also includes an `on(channel, callback)` method backed by\n * an in-process event emitter. Connect `WindowEventService.configure()`\n * to `events.emit` to complete the server→UI push loop.\n *\n * Usage:\n * const { router } = createTestRouter(...);\n * const { bridge, events } = createRouterBridge(router);\n *\n * // Wire server→UI events\n * const windowEvents = await container.get(WindowEventService);\n * windowEvents.configure((ch, data) => events.emit(ch, data));\n *\n * // Use bridge as WoodBridge\n * const controller = new ConversationController(bridge, ...);\n */\nexport function createRouterBridge(router: WoodRouter): RouterBridgeResult {\n const events = new RouterBridgeEvents();\n const bridge = createOperationApi(\n router.getChannels(),\n (channel, data) => router.dispatch(channel, data ?? {}),\n );\n\n // Attach the event subscription method (matches WoodBridge.on).\n bridge.on = (channel: string, callback: (...args: unknown[]) => void) => {\n return events.on(channel, callback);\n };\n bridge.__trace = async (payload: unknown) => {\n return dispatchRendererTracePayload(payload);\n };\n\n return { bridge, events };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAA6C;AAWtC,MAAM,mBAAmB;AAAA,EAAzB;AACL,SAAQ,YAAY,oBAAI,IAA+C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvE,GAAG,SAAiB,UAAoD;AACtE,QAAI,CAAC,KAAK,UAAU,IAAI,OAAO,GAAG;AAChC,WAAK,UAAU,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,IACvC;AACA,SAAK,UAAU,IAAI,OAAO,EAAG,IAAI,QAAQ;AACzC,WAAO,MAAM;AACX,WAAK,UAAU,IAAI,OAAO,GAAG,OAAO,QAAQ;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,SAAiB,MAAqB;AACzC,UAAM,WAAW,QAAQ,WAAW,UAAU,IAC1C,QAAQ,MAAM,WAAW,MAAM,IAC/B;AAEJ,UAAM,WAAW,KAAK,UAAU,IAAI,QAAQ;AAC5C,QAAI,UAAU;AACZ,iBAAW,MAAM,UAAU;AACzB,WAAG,IAAI;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA,EAEA,cAAc,SAA0B;AACtC,QAAI,SAAS;AACX,aAAO,KAAK,UAAU,IAAI,OAAO,GAAG,QAAQ;AAAA,IAC9C;AAEA,QAAI,QAAQ;AACZ,eAAW,YAAY,KAAK,UAAU,OAAO,GAAG;AAC9C,eAAS,SAAS;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AACF;AASO,SAAS,mBACd,UACA,UACqB;AACrB,QAAM,OAA4B,CAAC;AAEnC,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,QAAI,UAAU;AAEd,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,CAAC,QAAQ,IAAI,EAAG,SAAQ,IAAI,IAAI,CAAC;AACrC,gBAAU,QAAQ,IAAI;AAAA,IACxB;AAEA,UAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,YAAQ,IAAI,IAAI,CAAC,SAAmB,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,EAClE;AAEA,SAAO;AACT;AA4CO,SAAS,mBAAmB,QAAwC;AACzE,QAAM,SAAS,IAAI,mBAAmB;AACtC,QAAM,SAAS;AAAA,IACb,OAAO,YAAY;AAAA,IACnB,CAAC,SAAS,SAAS,OAAO,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,EACxD;AAGA,SAAO,KAAK,CAAC,SAAiB,aAA2C;AACvE,WAAO,OAAO,GAAG,SAAS,QAAQ;AAAA,EACpC;AACA,SAAO,UAAU,OAAO,YAAqB;AAC3C,eAAO,6CAA6B,OAAO;AAAA,EAC7C;AAEA,SAAO,EAAE,QAAQ,OAAO;AAC1B;","names":[]}
@@ -30,6 +30,13 @@ declare class RouterBridgeEvents {
30
30
  clear(): void;
31
31
  listenerCount(channel?: string): number;
32
32
  }
33
+ type OperationApiDispatch = (channel: string, input?: unknown) => Promise<unknown>;
34
+ /**
35
+ * Build the nested operation API used by testWood and the in-process bridge.
36
+ * Channel paths stay authoritative: `backend_service.status` becomes
37
+ * `api.backend_service.status()` and dispatch still enters the real router.
38
+ */
39
+ declare function createOperationApi(channels: Iterable<string>, dispatch: OperationApiDispatch): Record<string, any>;
33
40
  interface RouterBridgeResult {
34
41
  /**
35
42
  * A WoodBridge-shaped object where every operation method calls
@@ -72,4 +79,4 @@ interface RouterBridgeResult {
72
79
  */
73
80
  declare function createRouterBridge(router: WoodRouter): RouterBridgeResult;
74
81
 
75
- export { RouterBridgeEvents, type RouterBridgeResult, createRouterBridge };
82
+ export { type OperationApiDispatch, RouterBridgeEvents, type RouterBridgeResult, createOperationApi, createRouterBridge };
@@ -30,6 +30,13 @@ declare class RouterBridgeEvents {
30
30
  clear(): void;
31
31
  listenerCount(channel?: string): number;
32
32
  }
33
+ type OperationApiDispatch = (channel: string, input?: unknown) => Promise<unknown>;
34
+ /**
35
+ * Build the nested operation API used by testWood and the in-process bridge.
36
+ * Channel paths stay authoritative: `backend_service.status` becomes
37
+ * `api.backend_service.status()` and dispatch still enters the real router.
38
+ */
39
+ declare function createOperationApi(channels: Iterable<string>, dispatch: OperationApiDispatch): Record<string, any>;
33
40
  interface RouterBridgeResult {
34
41
  /**
35
42
  * A WoodBridge-shaped object where every operation method calls
@@ -72,4 +79,4 @@ interface RouterBridgeResult {
72
79
  */
73
80
  declare function createRouterBridge(router: WoodRouter): RouterBridgeResult;
74
81
 
75
- export { RouterBridgeEvents, type RouterBridgeResult, createRouterBridge };
82
+ export { type OperationApiDispatch, RouterBridgeEvents, type RouterBridgeResult, createOperationApi, createRouterBridge };
@@ -44,35 +44,38 @@ class RouterBridgeEvents {
44
44
  return total;
45
45
  }
46
46
  }
47
- function createRouterBridge(router) {
48
- const events = new RouterBridgeEvents();
49
- const bridge = buildBridgeTree(router, events);
50
- return { bridge, events };
51
- }
52
- function buildBridgeTree(router, events) {
47
+ function createOperationApi(channels, dispatch) {
53
48
  const tree = {};
54
- for (const channel of router.getChannels()) {
49
+ for (const channel of channels) {
55
50
  const parts = channel.split(".");
56
51
  let current = tree;
57
52
  for (let i = 0; i < parts.length - 1; i++) {
58
- if (!current[parts[i]]) {
59
- current[parts[i]] = {};
60
- }
61
- current = current[parts[i]];
53
+ const part = parts[i];
54
+ if (!current[part]) current[part] = {};
55
+ current = current[part];
62
56
  }
63
57
  const leaf = parts[parts.length - 1];
64
- current[leaf] = (data) => router.dispatch(channel, data ?? {});
58
+ current[leaf] = (data) => dispatch(channel, data ?? {});
65
59
  }
66
- tree.on = (channel, callback) => {
60
+ return tree;
61
+ }
62
+ function createRouterBridge(router) {
63
+ const events = new RouterBridgeEvents();
64
+ const bridge = createOperationApi(
65
+ router.getChannels(),
66
+ (channel, data) => router.dispatch(channel, data ?? {})
67
+ );
68
+ bridge.on = (channel, callback) => {
67
69
  return events.on(channel, callback);
68
70
  };
69
- tree.__trace = async (payload) => {
71
+ bridge.__trace = async (payload) => {
70
72
  return dispatchRendererTracePayload(payload);
71
73
  };
72
- return tree;
74
+ return { bridge, events };
73
75
  }
74
76
  export {
75
77
  RouterBridgeEvents,
78
+ createOperationApi,
76
79
  createRouterBridge
77
80
  };
78
81
  //# sourceMappingURL=create_router_bridge.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/testing/create_router_bridge.ts"],"sourcesContent":["import type { WoodRouter } from '../router/wood_router.js';\nimport { dispatchRendererTracePayload } from '../tracing/index.js';\n\n/**\n * An in-process event emitter that replaces Electron's\n * `webContents.send('__event:channel', data)` / `ipcRenderer.on('__event:channel', cb)`.\n *\n * The server side calls `WindowEventService.send(channel, data)` which prepends\n * `__event:` and calls the configured sender. In production that sender is\n * `mainWindow.webContents.send`. In tests we wire it to `RouterBridgeEvents.emit`\n * which strips the prefix and delivers to subscribers registered via `on()`.\n */\nexport class RouterBridgeEvents {\n private listeners = new Map<string, Set<(...args: unknown[]) => void>>();\n\n /**\n * Subscribe to a channel. Returns an unsubscribe function.\n * This is exposed as bridge.on() — matching the WoodBridge contract.\n */\n on(channel: string, callback: (...args: unknown[]) => void): () => void {\n if (!this.listeners.has(channel)) {\n this.listeners.set(channel, new Set());\n }\n this.listeners.get(channel)!.add(callback);\n return () => {\n this.listeners.get(channel)?.delete(callback);\n };\n }\n\n /**\n * Deliver an event to subscribers. Called by the WindowEventService sender.\n * Strips the `__event:` prefix that WindowEventService always prepends.\n */\n emit(channel: string, data: unknown): void {\n const stripped = channel.startsWith('__event:')\n ? channel.slice('__event:'.length)\n : channel;\n\n const handlers = this.listeners.get(stripped);\n if (handlers) {\n for (const cb of handlers) {\n cb(data);\n }\n }\n }\n\n /** Remove all listeners (for cleanup in afterEach). */\n clear(): void {\n this.listeners.clear();\n }\n\n listenerCount(channel?: string): number {\n if (channel) {\n return this.listeners.get(channel)?.size ?? 0;\n }\n\n let total = 0;\n for (const handlers of this.listeners.values()) {\n total += handlers.size;\n }\n return total;\n }\n}\n\nexport interface RouterBridgeResult {\n /**\n * A WoodBridge-shaped object where every operation method calls\n * `router.dispatch(channel, data)` — with real validation, scoped\n * containers, and middleware. The `on()` method delivers events\n * from the in-process event emitter.\n *\n * Wire this to your UI controllers as the WoodBridge dependency.\n */\n bridge: Record<string, any>;\n\n /**\n * The event emitter backing bridge.on().\n * Wire `WindowEventService.configure((ch, data) => events.emit(ch, data))`\n * to close the server→UI event loop.\n */\n events: RouterBridgeEvents;\n}\n\n/**\n * Build a WoodBridge-shaped object backed by `router.dispatch()`.\n *\n * Every operation channel (e.g. `chat.messages.send`) becomes a nested\n * method on the returned bridge that calls `router.dispatch(channel, data)`.\n * This means every call goes through the full WoodRouter pipeline:\n * input validation, scoped container, middleware, controller resolution.\n *\n * The bridge also includes an `on(channel, callback)` method backed by\n * an in-process event emitter. Connect `WindowEventService.configure()`\n * to `events.emit` to complete the server→UI push loop.\n *\n * Usage:\n * const { router } = createTestRouter(...);\n * const { bridge, events } = createRouterBridge(router);\n *\n * // Wire server→UI events\n * const windowEvents = await container.get(WindowEventService);\n * windowEvents.configure((ch, data) => events.emit(ch, data));\n *\n * // Use bridge as WoodBridge\n * const controller = new ConversationController(bridge, ...);\n */\nexport function createRouterBridge(router: WoodRouter): RouterBridgeResult {\n const events = new RouterBridgeEvents();\n const bridge = buildBridgeTree(router, events);\n\n return { bridge, events };\n}\n\n/**\n * Build the nested bridge object from the router's registered channels.\n *\n * Channels like `chat.messages.send` become `bridge.chat.messages.send(data)`.\n * The nesting algorithm is identical to the one used by the preload generator\n * and test mock generator in @noego/wood codegen — split on `.`, intermediate\n * segments become namespace objects, leaf segments become dispatch functions.\n */\nfunction buildBridgeTree(router: WoodRouter, events: RouterBridgeEvents): Record<string, any> {\n const tree: Record<string, any> = {};\n\n for (const channel of router.getChannels()) {\n const parts = channel.split('.');\n let current = tree;\n\n // Create/traverse intermediate namespace objects\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) {\n current[parts[i]] = {};\n }\n current = current[parts[i]];\n }\n\n // Leaf: function that dispatches through the router\n const leaf = parts[parts.length - 1];\n current[leaf] = (data?: unknown) => router.dispatch(channel, data ?? {});\n }\n\n // Attach the event subscription method (matches WoodBridge.on)\n tree.on = (channel: string, callback: (...args: unknown[]) => void) => {\n return events.on(channel, callback);\n };\n tree.__trace = async (payload: unknown) => {\n return dispatchRendererTracePayload(payload);\n };\n\n return tree;\n}\n"],"mappings":"AACA,SAAS,oCAAoC;AAWtC,MAAM,mBAAmB;AAAA,EAAzB;AACL,SAAQ,YAAY,oBAAI,IAA+C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvE,GAAG,SAAiB,UAAoD;AACtE,QAAI,CAAC,KAAK,UAAU,IAAI,OAAO,GAAG;AAChC,WAAK,UAAU,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,IACvC;AACA,SAAK,UAAU,IAAI,OAAO,EAAG,IAAI,QAAQ;AACzC,WAAO,MAAM;AACX,WAAK,UAAU,IAAI,OAAO,GAAG,OAAO,QAAQ;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,SAAiB,MAAqB;AACzC,UAAM,WAAW,QAAQ,WAAW,UAAU,IAC1C,QAAQ,MAAM,WAAW,MAAM,IAC/B;AAEJ,UAAM,WAAW,KAAK,UAAU,IAAI,QAAQ;AAC5C,QAAI,UAAU;AACZ,iBAAW,MAAM,UAAU;AACzB,WAAG,IAAI;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA,EAEA,cAAc,SAA0B;AACtC,QAAI,SAAS;AACX,aAAO,KAAK,UAAU,IAAI,OAAO,GAAG,QAAQ;AAAA,IAC9C;AAEA,QAAI,QAAQ;AACZ,eAAW,YAAY,KAAK,UAAU,OAAO,GAAG;AAC9C,eAAS,SAAS;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AACF;AA4CO,SAAS,mBAAmB,QAAwC;AACzE,QAAM,SAAS,IAAI,mBAAmB;AACtC,QAAM,SAAS,gBAAgB,QAAQ,MAAM;AAE7C,SAAO,EAAE,QAAQ,OAAO;AAC1B;AAUA,SAAS,gBAAgB,QAAoB,QAAiD;AAC5F,QAAM,OAA4B,CAAC;AAEnC,aAAW,WAAW,OAAO,YAAY,GAAG;AAC1C,UAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,QAAI,UAAU;AAGd,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAI,CAAC,QAAQ,MAAM,CAAC,CAAC,GAAG;AACtB,gBAAQ,MAAM,CAAC,CAAC,IAAI,CAAC;AAAA,MACvB;AACA,gBAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC5B;AAGA,UAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,YAAQ,IAAI,IAAI,CAAC,SAAmB,OAAO,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,EACzE;AAGA,OAAK,KAAK,CAAC,SAAiB,aAA2C;AACrE,WAAO,OAAO,GAAG,SAAS,QAAQ;AAAA,EACpC;AACA,OAAK,UAAU,OAAO,YAAqB;AACzC,WAAO,6BAA6B,OAAO;AAAA,EAC7C;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/testing/create_router_bridge.ts"],"sourcesContent":["import type { WoodRouter } from '../router/wood_router.js';\nimport { dispatchRendererTracePayload } from '../tracing/index.js';\n\n/**\n * An in-process event emitter that replaces Electron's\n * `webContents.send('__event:channel', data)` / `ipcRenderer.on('__event:channel', cb)`.\n *\n * The server side calls `WindowEventService.send(channel, data)` which prepends\n * `__event:` and calls the configured sender. In production that sender is\n * `mainWindow.webContents.send`. In tests we wire it to `RouterBridgeEvents.emit`\n * which strips the prefix and delivers to subscribers registered via `on()`.\n */\nexport class RouterBridgeEvents {\n private listeners = new Map<string, Set<(...args: unknown[]) => void>>();\n\n /**\n * Subscribe to a channel. Returns an unsubscribe function.\n * This is exposed as bridge.on() — matching the WoodBridge contract.\n */\n on(channel: string, callback: (...args: unknown[]) => void): () => void {\n if (!this.listeners.has(channel)) {\n this.listeners.set(channel, new Set());\n }\n this.listeners.get(channel)!.add(callback);\n return () => {\n this.listeners.get(channel)?.delete(callback);\n };\n }\n\n /**\n * Deliver an event to subscribers. Called by the WindowEventService sender.\n * Strips the `__event:` prefix that WindowEventService always prepends.\n */\n emit(channel: string, data: unknown): void {\n const stripped = channel.startsWith('__event:')\n ? channel.slice('__event:'.length)\n : channel;\n\n const handlers = this.listeners.get(stripped);\n if (handlers) {\n for (const cb of handlers) {\n cb(data);\n }\n }\n }\n\n /** Remove all listeners (for cleanup in afterEach). */\n clear(): void {\n this.listeners.clear();\n }\n\n listenerCount(channel?: string): number {\n if (channel) {\n return this.listeners.get(channel)?.size ?? 0;\n }\n\n let total = 0;\n for (const handlers of this.listeners.values()) {\n total += handlers.size;\n }\n return total;\n }\n}\n\nexport type OperationApiDispatch = (channel: string, input?: unknown) => Promise<unknown>;\n\n/**\n * Build the nested operation API used by testWood and the in-process bridge.\n * Channel paths stay authoritative: `backend_service.status` becomes\n * `api.backend_service.status()` and dispatch still enters the real router.\n */\nexport function createOperationApi(\n channels: Iterable<string>,\n dispatch: OperationApiDispatch,\n): Record<string, any> {\n const tree: Record<string, any> = {};\n\n for (const channel of channels) {\n const parts = channel.split('.');\n let current = tree;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (!current[part]) current[part] = {};\n current = current[part];\n }\n\n const leaf = parts[parts.length - 1]!;\n current[leaf] = (data?: unknown) => dispatch(channel, data ?? {});\n }\n\n return tree;\n}\n\nexport interface RouterBridgeResult {\n /**\n * A WoodBridge-shaped object where every operation method calls\n * `router.dispatch(channel, data)` — with real validation, scoped\n * containers, and middleware. The `on()` method delivers events\n * from the in-process event emitter.\n *\n * Wire this to your UI controllers as the WoodBridge dependency.\n */\n bridge: Record<string, any>;\n\n /**\n * The event emitter backing bridge.on().\n * Wire `WindowEventService.configure((ch, data) => events.emit(ch, data))`\n * to close the server→UI event loop.\n */\n events: RouterBridgeEvents;\n}\n\n/**\n * Build a WoodBridge-shaped object backed by `router.dispatch()`.\n *\n * Every operation channel (e.g. `chat.messages.send`) becomes a nested\n * method on the returned bridge that calls `router.dispatch(channel, data)`.\n * This means every call goes through the full WoodRouter pipeline:\n * input validation, scoped container, middleware, controller resolution.\n *\n * The bridge also includes an `on(channel, callback)` method backed by\n * an in-process event emitter. Connect `WindowEventService.configure()`\n * to `events.emit` to complete the server→UI push loop.\n *\n * Usage:\n * const { router } = createTestRouter(...);\n * const { bridge, events } = createRouterBridge(router);\n *\n * // Wire server→UI events\n * const windowEvents = await container.get(WindowEventService);\n * windowEvents.configure((ch, data) => events.emit(ch, data));\n *\n * // Use bridge as WoodBridge\n * const controller = new ConversationController(bridge, ...);\n */\nexport function createRouterBridge(router: WoodRouter): RouterBridgeResult {\n const events = new RouterBridgeEvents();\n const bridge = createOperationApi(\n router.getChannels(),\n (channel, data) => router.dispatch(channel, data ?? {}),\n );\n\n // Attach the event subscription method (matches WoodBridge.on).\n bridge.on = (channel: string, callback: (...args: unknown[]) => void) => {\n return events.on(channel, callback);\n };\n bridge.__trace = async (payload: unknown) => {\n return dispatchRendererTracePayload(payload);\n };\n\n return { bridge, events };\n}\n"],"mappings":"AACA,SAAS,oCAAoC;AAWtC,MAAM,mBAAmB;AAAA,EAAzB;AACL,SAAQ,YAAY,oBAAI,IAA+C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvE,GAAG,SAAiB,UAAoD;AACtE,QAAI,CAAC,KAAK,UAAU,IAAI,OAAO,GAAG;AAChC,WAAK,UAAU,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,IACvC;AACA,SAAK,UAAU,IAAI,OAAO,EAAG,IAAI,QAAQ;AACzC,WAAO,MAAM;AACX,WAAK,UAAU,IAAI,OAAO,GAAG,OAAO,QAAQ;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,SAAiB,MAAqB;AACzC,UAAM,WAAW,QAAQ,WAAW,UAAU,IAC1C,QAAQ,MAAM,WAAW,MAAM,IAC/B;AAEJ,UAAM,WAAW,KAAK,UAAU,IAAI,QAAQ;AAC5C,QAAI,UAAU;AACZ,iBAAW,MAAM,UAAU;AACzB,WAAG,IAAI;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA,EAEA,cAAc,SAA0B;AACtC,QAAI,SAAS;AACX,aAAO,KAAK,UAAU,IAAI,OAAO,GAAG,QAAQ;AAAA,IAC9C;AAEA,QAAI,QAAQ;AACZ,eAAW,YAAY,KAAK,UAAU,OAAO,GAAG;AAC9C,eAAS,SAAS;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AACF;AASO,SAAS,mBACd,UACA,UACqB;AACrB,QAAM,OAA4B,CAAC;AAEnC,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,QAAI,UAAU;AAEd,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,CAAC,QAAQ,IAAI,EAAG,SAAQ,IAAI,IAAI,CAAC;AACrC,gBAAU,QAAQ,IAAI;AAAA,IACxB;AAEA,UAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,YAAQ,IAAI,IAAI,CAAC,SAAmB,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,EAClE;AAEA,SAAO;AACT;AA4CO,SAAS,mBAAmB,QAAwC;AACzE,QAAM,SAAS,IAAI,mBAAmB;AACtC,QAAM,SAAS;AAAA,IACb,OAAO,YAAY;AAAA,IACnB,CAAC,SAAS,SAAS,OAAO,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,EACxD;AAGA,SAAO,KAAK,CAAC,SAAiB,aAA2C;AACvE,WAAO,OAAO,GAAG,SAAS,QAAQ;AAAA,EACpC;AACA,SAAO,UAAU,OAAO,YAAqB;AAC3C,WAAO,6BAA6B,OAAO;AAAA,EAC7C;AAEA,SAAO,EAAE,QAAQ,OAAO;AAC1B;","names":[]}
@@ -36,9 +36,10 @@ __export(testing_exports, {
36
36
  WorkRegistry: () => import_frontend.WorkRegistry,
37
37
  assertLoopbackSerializable: () => import_transport.assertLoopbackSerializable,
38
38
  automationAssertions: () => import_automation_assertions.automationAssertions,
39
- browser: () => import_browser.browser,
39
+ browserAssertions: () => import_browser.browserAssertions,
40
40
  buildTransportBridge: () => import_transport.buildTransportBridge,
41
41
  createBrowserBridgeFixture: () => import_browser.createBrowserBridgeFixture,
42
+ createBrowserFixture: () => import_browser.createBrowserFixture,
42
43
  createControllerHarness: () => import_create_controller_harness.createControllerHarness,
43
44
  createFrontendSurface: () => import_frontend.createFrontendSurface,
44
45
  createRouterBridge: () => import_create_router_bridge.createRouterBridge,
@@ -61,11 +62,14 @@ __export(testing_exports, {
61
62
  sharedRectEdges: () => import_automation_assertions.sharedRectEdges,
62
63
  stableAfterAnimation: () => import_automation_assertions.stableAfterAnimation,
63
64
  startSharedBrowserViteServer: () => import_browser.startSharedBrowserViteServer,
65
+ startSharedWoodBrowser: () => import_browser_pool.startSharedWoodBrowser,
64
66
  testWood: () => import_test_wood_config.testWood,
65
- visible: () => import_automation_assertions.visible
67
+ visible: () => import_automation_assertions.visible,
68
+ vitestModuleImporter: () => import_runner_importer.vitestModuleImporter
66
69
  });
67
70
  module.exports = __toCommonJS(testing_exports);
68
71
  var import_test_wood_config = require("./test_wood_config.cjs");
72
+ var import_runner_importer = require("./runner_importer.cjs");
69
73
  var import_test_wood = require("./test_wood.cjs");
70
74
  var import_registration_only_root = require("./registration_only_root.cjs");
71
75
  var import_frontend = require("../frontend/index.cjs");
@@ -78,6 +82,7 @@ var import_browser = require("./browser.js");
78
82
  var import_automation_assertions = require("./automation_assertions.js");
79
83
  var import_transport = require("../transport/index.js");
80
84
  var import_trace_testing = require("../trace-testing/index.js");
85
+ var import_browser_pool = require("./native_browser/browser_pool.js");
81
86
  // Annotate the CommonJS export names for ESM import in node:
82
87
  0 && (module.exports = {
83
88
  FrontendLifecycleOwner,
@@ -98,9 +103,10 @@ var import_trace_testing = require("../trace-testing/index.js");
98
103
  WorkRegistry,
99
104
  assertLoopbackSerializable,
100
105
  automationAssertions,
101
- browser,
106
+ browserAssertions,
102
107
  buildTransportBridge,
103
108
  createBrowserBridgeFixture,
109
+ createBrowserFixture,
104
110
  createControllerHarness,
105
111
  createFrontendSurface,
106
112
  createRouterBridge,
@@ -123,7 +129,9 @@ var import_trace_testing = require("../trace-testing/index.js");
123
129
  sharedRectEdges,
124
130
  stableAfterAnimation,
125
131
  startSharedBrowserViteServer,
132
+ startSharedWoodBrowser,
126
133
  testWood,
127
- visible
134
+ visible,
135
+ vitestModuleImporter
128
136
  });
129
137
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/testing/index.ts"],"sourcesContent":["// Canonical entry point — config-driven, real-IoC testWood(configPath).\nexport { testWood, TestWoodBuilder } from './test_wood_config.cjs';\nexport type {\n TestWoodEnvironment,\n WoodComposeContext,\n WoodComposeMain,\n WoodComposeResult,\n WoodRootComposer,\n} from './test_wood_config.cjs';\nexport type { WoodTestSelection, WoodMainSelection, WoodDomMode } from './wood_test_selection.cjs';\nexport type { WoodPageHost, WoodMountedPage, WoodRendererHooks } from './wood_env_renderer.cjs';\nexport type { ModuleImporter } from './wood_config_source.cjs';\nexport { TestWoodError, WOOD_FRONTEND_BRIDGE } from './test_wood.cjs';\nexport { TestWoodCleanupError, type CleanupFailure } from './registration_only_root.cjs';\nexport { FrontendLifecycleOwner, FrontendWorkError, PageCatalogError, PageCatalog, WorkRegistry, TrackedTransport, createFrontendSurface, parseViewsSource, pageIdentity } from '../frontend/index.cjs';\nexport type { FrontendApplicationSurface, FrontendOpenOptions, FrontendPage, FrontendLifecycle, RendererSelection, ViewsSource, CreateFrontendSurfaceOptions, WorkFailure, WorkDescriptor } from '../frontend/index.cjs';\n\n/** @deprecated createTestContainer's fake container bypasses real dependency\n * resolution and is retained only for parser/compiler fixtures that do not\n * claim production-equivalent IoC behavior. Canonical tests use testWood /\n * @noego/testing's testIoc, which build fresh REAL @noego/ioc roots. */\nexport { createTestContainer } from './create_test_container.js';\nexport {\n createControllerHarness,\n type ControllerHarnessResult,\n type CreateControllerHarnessOptions,\n} from './create_controller_harness.js';\nexport { createTestRouter, type TestRouterResult } from './create_test_router.js';\nexport { mockElectron, getElectronMockFactory } from './mock_electron.js';\nexport {\n createRouterBridge,\n RouterBridgeEvents,\n type RouterBridgeResult,\n} from './create_router_bridge.js';\nexport {\n browser,\n createBrowserBridgeFixture,\n startSharedBrowserViteServer,\n type MountedWoodBridge,\n type MountedWoodComponent,\n type MountedWoodNavigation,\n type MountedWoodRoute,\n type MountedWoodSurface,\n type MountedWoodTree,\n type MountComponentOptions,\n type MountRouteOptions,\n type MountTreeOptions,\n type WoodBridgeFixtureContext,\n type WoodBridgeFixtureInput,\n type WoodBridgeRecordedCall,\n type WoodBridgeRecordedEvent,\n type WoodRpcManifestEntryInput,\n type WoodBrowserExpect,\n type WoodHitTestResult,\n type WoodRectSnapshot,\n type WoodBrowserHarness,\n type WoodBrowserHarnessConfig,\n type WoodBrowserPageContext,\n type WoodBrowserTraceConfig,\n type WoodViewport,\n} from './browser.js';\nexport {\n automationAssertions,\n visible,\n hidden,\n insideViewport,\n notClipped,\n notOverlapping,\n hitTestReachable,\n sharedEdges,\n evenSpacing,\n stableAfterAnimation,\n rectsOverlap,\n gaps,\n sharedRectEdges,\n evenSpacingRects,\n type AssertionVerdict,\n type AutomationTarget,\n type AutomationRectTarget,\n type GeometryVerdict,\n type RectAxis,\n type RectBox,\n type RectEdge,\n} from './automation_assertions.js';\nexport {\n InProcessRouterTransport,\n LoopbackRemoteTransport,\n LoopbackRemoteTransportServer,\n assertLoopbackSerializable,\n LoopbackSerializationError,\n buildTransportBridge,\n type WoodRpcTransport,\n type WoodChannelContract,\n type WoodChannelMapLike,\n type WoodChannelInput,\n type WoodChannelOutput,\n type TypedCall,\n type TransportBridgeResult,\n} from '../transport/index.js';\nexport { TraceRecorder } from '../trace-testing/index.js';\nexport type {\n TraceDispatchResult,\n TraceEvent,\n TraceInput,\n TraceWaitOptions,\n} from '../tracing/index.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,8BAA0C;AAW1C,uBAAoD;AACpD,oCAA0D;AAC1D,sBAAgL;AAOhL,mCAAoC;AACpC,uCAIO;AACP,gCAAwD;AACxD,2BAAqD;AACrD,kCAIO;AACP,qBA0BO;AACP,mCAsBO;AACP,uBAcO;AACP,2BAA8B;","names":[]}
1
+ {"version":3,"sources":["../../src/testing/index.ts"],"sourcesContent":["// Canonical entry point — config-driven, real-IoC testWood(configPath).\nexport { testWood, TestWoodBuilder } from './test_wood_config.cjs';\nexport type {\n TestWoodEnvironment,\n WoodComposeContext,\n WoodComposeMain,\n WoodComposeResult,\n} from './test_wood_config.cjs';\nexport type { WoodTestApi, WoodTestRawApi } from '../testing-api.js';\nexport type { WoodTestSelection, WoodMainSelection, WoodRendererSelection, WoodDomMode, ResolvedWoodSelection } from './wood_test_selection.cjs';\nexport type { WoodPageHost, WoodMountedPage, WoodRendererHooks } from './wood_env_renderer.cjs';\nexport type { ModuleImporter } from './wood_config_source.cjs';\nexport { vitestModuleImporter } from './runner_importer.cjs';\nexport { TestWoodError, WOOD_FRONTEND_BRIDGE } from './test_wood.cjs';\nexport { TestWoodCleanupError, type CleanupFailure } from './registration_only_root.cjs';\nexport { FrontendLifecycleOwner, FrontendWorkError, PageCatalogError, PageCatalog, WorkRegistry, TrackedTransport, createFrontendSurface, parseViewsSource, pageIdentity } from '../frontend/index.cjs';\nexport type { FrontendApplicationSurface, FrontendOpenOptions, FrontendPage, FrontendLifecycle, RendererSelection, ViewsSource, CreateFrontendSurfaceOptions, WorkFailure, WorkDescriptor } from '../frontend/index.cjs';\n\n/** @deprecated createTestContainer's fake container bypasses real dependency\n * resolution and is retained only for parser/compiler fixtures that do not\n * claim production-equivalent IoC behavior. Canonical tests use testWood /\n * @noego/testing's testIoc, which build fresh REAL @noego/ioc roots. */\nexport { createTestContainer } from './create_test_container.js';\nexport {\n createControllerHarness,\n type ControllerHarnessResult,\n type CreateControllerHarnessOptions,\n} from './create_controller_harness.js';\nexport { createTestRouter, type TestRouterResult } from './create_test_router.js';\nexport { mockElectron, getElectronMockFactory } from './mock_electron.js';\nexport {\n createRouterBridge,\n RouterBridgeEvents,\n type RouterBridgeResult,\n} from './create_router_bridge.js';\nexport {\n createBrowserFixture,\n browserAssertions,\n createBrowserBridgeFixture,\n startSharedBrowserViteServer,\n type MountedWoodBridge,\n type MountedWoodComponent,\n type MountedWoodNavigation,\n type MountedWoodRoute,\n type MountedWoodSurface,\n type MountedWoodTree,\n type MountComponentOptions,\n type MountRouteOptions,\n type MountTreeOptions,\n type WoodBridgeFixtureContext,\n type WoodBridgeFixtureInput,\n type WoodBridgeRecordedCall,\n type WoodBridgeRecordedEvent,\n type WoodRpcManifestEntryInput,\n type WoodBrowserExpect,\n type WoodHitTestResult,\n type WoodRectSnapshot,\n type WoodBrowserFixture,\n type WoodBrowserHarnessConfig,\n type WoodBrowserPageContext,\n type WoodBrowserTraceConfig,\n type WoodViewport,\n} from './browser.js';\nexport {\n automationAssertions,\n visible,\n hidden,\n insideViewport,\n notClipped,\n notOverlapping,\n hitTestReachable,\n sharedEdges,\n evenSpacing,\n stableAfterAnimation,\n rectsOverlap,\n gaps,\n sharedRectEdges,\n evenSpacingRects,\n type AssertionVerdict,\n type AutomationTarget,\n type AutomationRectTarget,\n type GeometryVerdict,\n type RectAxis,\n type RectBox,\n type RectEdge,\n} from './automation_assertions.js';\nexport {\n InProcessRouterTransport,\n LoopbackRemoteTransport,\n LoopbackRemoteTransportServer,\n assertLoopbackSerializable,\n LoopbackSerializationError,\n buildTransportBridge,\n type WoodRpcTransport,\n type WoodChannelContract,\n type WoodChannelMapLike,\n type WoodChannelInput,\n type WoodChannelOutput,\n type TypedCall,\n type TransportBridgeResult,\n} from '../transport/index.js';\nexport { TraceRecorder } from '../trace-testing/index.js';\nexport type {\n TraceDispatchResult,\n TraceEvent,\n TraceInput,\n TraceWaitOptions,\n} from '../tracing/index.js';\n\nexport type { WoodBrowserHost, NativeWoodPage, NativeWoodTestEnvironment, WoodTestEnvironmentFor, WoodBrowserOpenOptions } from './native_browser/native_browser.types.js';\nexport { startSharedWoodBrowser } from './native_browser/browser_pool.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,8BAA0C;AAW1C,6BAAqC;AACrC,uBAAoD;AACpD,oCAA0D;AAC1D,sBAAgL;AAOhL,mCAAoC;AACpC,uCAIO;AACP,gCAAwD;AACxD,2BAAqD;AACrD,kCAIO;AACP,qBA2BO;AACP,mCAsBO;AACP,uBAcO;AACP,2BAA8B;AAS9B,0BAAuC;","names":[]}
@@ -1,7 +1,9 @@
1
- export { TestWoodBuilder, TestWoodEnvironment, WoodComposeContext, WoodComposeMain, WoodComposeResult, WoodRootComposer, testWood } from './test_wood_config.cjs';
2
- export { WoodDomMode, WoodMainSelection, WoodTestSelection } from './wood_test_selection.cjs';
1
+ export { N as NativeWoodPage, a as NativeWoodTestEnvironment, d as TestWoodBuilder, T as TestWoodEnvironment, W as WoodBrowserHost, b as WoodBrowserOpenOptions, e as WoodComposeContext, f as WoodComposeMain, g as WoodComposeResult, c as WoodTestEnvironmentFor, t as testWood } from '../native_browser.types-vWXtE4rM.cjs';
2
+ export { WoodTestApi, WoodTestRawApi } from '../testing-api.cjs';
3
+ export { ResolvedWoodSelection, WoodDomMode, WoodMainSelection, WoodRendererSelection, WoodTestSelection } from './wood_test_selection.cjs';
3
4
  export { WoodMountedPage, WoodPageHost, WoodRendererHooks } from './wood_env_renderer.cjs';
4
5
  export { ModuleImporter } from './wood_config_source.cjs';
6
+ export { vitestModuleImporter } from './runner_importer.cjs';
5
7
  export { TestWoodError, WOOD_FRONTEND_BRIDGE } from './test_wood.cjs';
6
8
  export { CleanupFailure, TestWoodCleanupError } from './registration_only_root.cjs';
7
9
  export { FrontendWorkError, WorkDescriptor, WorkFailure, WorkRegistry } from '../frontend/work_registry.cjs';
@@ -15,7 +17,7 @@ export { ControllerHarnessResult, CreateControllerHarnessOptions, createControll
15
17
  export { TestRouterResult, createTestRouter } from './create_test_router.cjs';
16
18
  export { getElectronMockFactory, mockElectron } from './mock_electron.cjs';
17
19
  export { RouterBridgeEvents, RouterBridgeResult, createRouterBridge } from './create_router_bridge.cjs';
18
- export { MountComponentOptions, MountRouteOptions, MountTreeOptions, MountedWoodBridge, MountedWoodComponent, MountedWoodNavigation, MountedWoodRoute, MountedWoodSurface, MountedWoodTree, WoodBridgeFixtureContext, WoodBridgeFixtureInput, WoodBridgeRecordedCall, WoodBridgeRecordedEvent, WoodBrowserExpect, WoodBrowserHarness, WoodBrowserHarnessConfig, WoodBrowserPageContext, WoodBrowserTraceConfig, WoodHitTestResult, WoodRectSnapshot, WoodRpcManifestEntryInput, WoodViewport, browser, createBrowserBridgeFixture, startSharedBrowserViteServer } from './browser.cjs';
20
+ export { MountComponentOptions, MountRouteOptions, MountTreeOptions, MountedWoodBridge, MountedWoodComponent, MountedWoodNavigation, MountedWoodRoute, MountedWoodSurface, MountedWoodTree, WoodBridgeFixtureContext, WoodBridgeFixtureInput, WoodBridgeRecordedCall, WoodBridgeRecordedEvent, WoodBrowserExpect, WoodBrowserFixture, WoodBrowserHarnessConfig, WoodBrowserPageContext, WoodBrowserTraceConfig, WoodHitTestResult, WoodRectSnapshot, WoodRpcManifestEntryInput, WoodViewport, browserAssertions, createBrowserBridgeFixture, createBrowserFixture, startSharedBrowserViteServer } from './browser.cjs';
19
21
  export { AssertionVerdict, AutomationRectTarget, AutomationTarget, automationAssertions, evenSpacing, hidden, hitTestReachable, insideViewport, notClipped, notOverlapping, sharedEdges, stableAfterAnimation, visible } from './automation_assertions.cjs';
20
22
  export { TypedCall, WoodChannelContract, WoodChannelInput, WoodChannelMapLike, WoodChannelOutput, WoodRpcTransport } from '../transport/wood_rpc_transport.cjs';
21
23
  export { InProcessRouterTransport } from '../transport/in_process_router_transport.cjs';
@@ -24,7 +26,12 @@ export { LoopbackSerializationError, assertLoopbackSerializable } from '../trans
24
26
  export { TransportBridgeResult, buildTransportBridge } from '../transport/build_transport_bridge.cjs';
25
27
  export { TraceRecorder } from '../trace-testing/trace_recorder.cjs';
26
28
  export { T as TraceDispatchResult, a as TraceEvent, b as TraceInput, f as TraceWaitOptions } from '../trace_hub-Cpo_nVze.cjs';
29
+ export { startSharedBrowser as startSharedWoodBrowser } from '@noego/testing/browser';
27
30
  export { GeometryVerdict, RectAxis, RectBox, RectEdge, evenSpacing as evenSpacingRects, gaps, rectsOverlap, sharedEdges as sharedRectEdges } from './geometry.cjs';
31
+ import '@noego/testing/fetch';
32
+ import 'playwright';
33
+ import 'happy-dom';
34
+ import '../types/views.cjs';
28
35
  import '@noego/ioc';
29
36
  import '@noego/testing';
30
37
  import '../router/wood_router.cjs';
@@ -34,12 +41,11 @@ import '../validation/schema_validator.cjs';
34
41
  import '../middleware/middleware_resolver.cjs';
35
42
  import '../controller/controller_resolver.cjs';
36
43
  import '../types/config.cjs';
37
- import '../types/views.cjs';
44
+ import '../loader/loader_orchestration.cjs';
38
45
  import './wood_dom_animation.cjs';
39
46
  import '../navigation/index.cjs';
40
47
  import '../navigation/layout_preservation.cjs';
41
48
  import '../navigation/automation_introspection.cjs';
42
- import 'playwright';
43
49
  import '@noego/trace/testing';
44
50
  import '../tracing/trace_provider.cjs';
45
51
  import 'rxjs';
@@ -1,7 +1,9 @@
1
- export { TestWoodBuilder, TestWoodEnvironment, WoodComposeContext, WoodComposeMain, WoodComposeResult, WoodRootComposer, testWood } from './test_wood_config.js';
2
- export { WoodDomMode, WoodMainSelection, WoodTestSelection } from './wood_test_selection.js';
1
+ export { N as NativeWoodPage, a as NativeWoodTestEnvironment, d as TestWoodBuilder, T as TestWoodEnvironment, W as WoodBrowserHost, b as WoodBrowserOpenOptions, e as WoodComposeContext, f as WoodComposeMain, g as WoodComposeResult, c as WoodTestEnvironmentFor, t as testWood } from '../native_browser.types-BY2daUOS.js';
2
+ export { WoodTestApi, WoodTestRawApi } from '../testing-api.js';
3
+ export { ResolvedWoodSelection, WoodDomMode, WoodMainSelection, WoodRendererSelection, WoodTestSelection } from './wood_test_selection.js';
3
4
  export { WoodMountedPage, WoodPageHost, WoodRendererHooks } from './wood_env_renderer.js';
4
5
  export { ModuleImporter } from './wood_config_source.js';
6
+ export { vitestModuleImporter } from './runner_importer.js';
5
7
  export { TestWoodError, WOOD_FRONTEND_BRIDGE } from './test_wood.js';
6
8
  export { CleanupFailure, TestWoodCleanupError } from './registration_only_root.js';
7
9
  export { FrontendWorkError, WorkDescriptor, WorkFailure, WorkRegistry } from '../frontend/work_registry.js';
@@ -15,7 +17,7 @@ export { ControllerHarnessResult, CreateControllerHarnessOptions, createControll
15
17
  export { TestRouterResult, createTestRouter } from './create_test_router.js';
16
18
  export { getElectronMockFactory, mockElectron } from './mock_electron.js';
17
19
  export { RouterBridgeEvents, RouterBridgeResult, createRouterBridge } from './create_router_bridge.js';
18
- export { MountComponentOptions, MountRouteOptions, MountTreeOptions, MountedWoodBridge, MountedWoodComponent, MountedWoodNavigation, MountedWoodRoute, MountedWoodSurface, MountedWoodTree, WoodBridgeFixtureContext, WoodBridgeFixtureInput, WoodBridgeRecordedCall, WoodBridgeRecordedEvent, WoodBrowserExpect, WoodBrowserHarness, WoodBrowserHarnessConfig, WoodBrowserPageContext, WoodBrowserTraceConfig, WoodHitTestResult, WoodRectSnapshot, WoodRpcManifestEntryInput, WoodViewport, browser, createBrowserBridgeFixture, startSharedBrowserViteServer } from './browser.js';
20
+ export { MountComponentOptions, MountRouteOptions, MountTreeOptions, MountedWoodBridge, MountedWoodComponent, MountedWoodNavigation, MountedWoodRoute, MountedWoodSurface, MountedWoodTree, WoodBridgeFixtureContext, WoodBridgeFixtureInput, WoodBridgeRecordedCall, WoodBridgeRecordedEvent, WoodBrowserExpect, WoodBrowserFixture, WoodBrowserHarnessConfig, WoodBrowserPageContext, WoodBrowserTraceConfig, WoodHitTestResult, WoodRectSnapshot, WoodRpcManifestEntryInput, WoodViewport, browserAssertions, createBrowserBridgeFixture, createBrowserFixture, startSharedBrowserViteServer } from './browser.js';
19
21
  export { AssertionVerdict, AutomationRectTarget, AutomationTarget, automationAssertions, evenSpacing, hidden, hitTestReachable, insideViewport, notClipped, notOverlapping, sharedEdges, stableAfterAnimation, visible } from './automation_assertions.js';
20
22
  export { TypedCall, WoodChannelContract, WoodChannelInput, WoodChannelMapLike, WoodChannelOutput, WoodRpcTransport } from '../transport/wood_rpc_transport.js';
21
23
  export { InProcessRouterTransport } from '../transport/in_process_router_transport.js';
@@ -24,7 +26,12 @@ export { LoopbackSerializationError, assertLoopbackSerializable } from '../trans
24
26
  export { TransportBridgeResult, buildTransportBridge } from '../transport/build_transport_bridge.js';
25
27
  export { TraceRecorder } from '../trace-testing/trace_recorder.js';
26
28
  export { T as TraceDispatchResult, a as TraceEvent, b as TraceInput, f as TraceWaitOptions } from '../trace_hub-Cpo_nVze.js';
29
+ export { startSharedBrowser as startSharedWoodBrowser } from '@noego/testing/browser';
27
30
  export { GeometryVerdict, RectAxis, RectBox, RectEdge, evenSpacing as evenSpacingRects, gaps, rectsOverlap, sharedEdges as sharedRectEdges } from './geometry.js';
31
+ import '@noego/testing/fetch';
32
+ import 'playwright';
33
+ import 'happy-dom';
34
+ import '../types/views.js';
28
35
  import '@noego/ioc';
29
36
  import '@noego/testing';
30
37
  import '../router/wood_router.js';
@@ -34,12 +41,11 @@ import '../validation/schema_validator.js';
34
41
  import '../middleware/middleware_resolver.js';
35
42
  import '../controller/controller_resolver.js';
36
43
  import '../types/config.js';
37
- import '../types/views.js';
44
+ import '../loader/loader_orchestration.js';
38
45
  import './wood_dom_animation.js';
39
46
  import '../navigation/index.js';
40
47
  import '../navigation/layout_preservation.js';
41
48
  import '../navigation/automation_introspection.js';
42
- import 'playwright';
43
49
  import '@noego/trace/testing';
44
50
  import '../tracing/trace_provider.js';
45
51
  import 'rxjs';
@@ -1,4 +1,5 @@
1
1
  import { testWood, TestWoodBuilder } from "./test_wood_config.js";
2
+ import { vitestModuleImporter } from "./runner_importer.js";
2
3
  import { TestWoodError, WOOD_FRONTEND_BRIDGE } from "./test_wood.js";
3
4
  import { TestWoodCleanupError } from "./registration_only_root.js";
4
5
  import { FrontendLifecycleOwner, FrontendWorkError, PageCatalogError, PageCatalog, WorkRegistry, TrackedTransport, createFrontendSurface, parseViewsSource, pageIdentity } from "../frontend/index.js";
@@ -13,7 +14,8 @@ import {
13
14
  RouterBridgeEvents
14
15
  } from "./create_router_bridge.js";
15
16
  import {
16
- browser,
17
+ createBrowserFixture,
18
+ browserAssertions,
17
19
  createBrowserBridgeFixture,
18
20
  startSharedBrowserViteServer
19
21
  } from "./browser.js";
@@ -42,6 +44,7 @@ import {
42
44
  buildTransportBridge
43
45
  } from "../transport/index.js";
44
46
  import { TraceRecorder } from "../trace-testing/index.js";
47
+ import { startSharedWoodBrowser } from "./native_browser/browser_pool.js";
45
48
  export {
46
49
  FrontendLifecycleOwner,
47
50
  FrontendWorkError,
@@ -61,9 +64,10 @@ export {
61
64
  WorkRegistry,
62
65
  assertLoopbackSerializable,
63
66
  automationAssertions,
64
- browser,
67
+ browserAssertions,
65
68
  buildTransportBridge,
66
69
  createBrowserBridgeFixture,
70
+ createBrowserFixture,
67
71
  createControllerHarness,
68
72
  createFrontendSurface,
69
73
  createRouterBridge,
@@ -86,7 +90,9 @@ export {
86
90
  sharedRectEdges,
87
91
  stableAfterAnimation,
88
92
  startSharedBrowserViteServer,
93
+ startSharedWoodBrowser,
89
94
  testWood,
90
- visible
95
+ visible,
96
+ vitestModuleImporter
91
97
  };
92
98
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/testing/index.ts"],"sourcesContent":["// Canonical entry point — config-driven, real-IoC testWood(configPath).\nexport { testWood, TestWoodBuilder } from './test_wood_config.js';\nexport type {\n TestWoodEnvironment,\n WoodComposeContext,\n WoodComposeMain,\n WoodComposeResult,\n WoodRootComposer,\n} from './test_wood_config.js';\nexport type { WoodTestSelection, WoodMainSelection, WoodDomMode } from './wood_test_selection.js';\nexport type { WoodPageHost, WoodMountedPage, WoodRendererHooks } from './wood_env_renderer.js';\nexport type { ModuleImporter } from './wood_config_source.js';\nexport { TestWoodError, WOOD_FRONTEND_BRIDGE } from './test_wood.js';\nexport { TestWoodCleanupError, type CleanupFailure } from './registration_only_root.js';\nexport { FrontendLifecycleOwner, FrontendWorkError, PageCatalogError, PageCatalog, WorkRegistry, TrackedTransport, createFrontendSurface, parseViewsSource, pageIdentity } from '../frontend/index.js';\nexport type { FrontendApplicationSurface, FrontendOpenOptions, FrontendPage, FrontendLifecycle, RendererSelection, ViewsSource, CreateFrontendSurfaceOptions, WorkFailure, WorkDescriptor } from '../frontend/index.js';\n\n/** @deprecated createTestContainer's fake container bypasses real dependency\n * resolution and is retained only for parser/compiler fixtures that do not\n * claim production-equivalent IoC behavior. Canonical tests use testWood /\n * @noego/testing's testIoc, which build fresh REAL @noego/ioc roots. */\nexport { createTestContainer } from './create_test_container.js';\nexport {\n createControllerHarness,\n type ControllerHarnessResult,\n type CreateControllerHarnessOptions,\n} from './create_controller_harness.js';\nexport { createTestRouter, type TestRouterResult } from './create_test_router.js';\nexport { mockElectron, getElectronMockFactory } from './mock_electron.js';\nexport {\n createRouterBridge,\n RouterBridgeEvents,\n type RouterBridgeResult,\n} from './create_router_bridge.js';\nexport {\n browser,\n createBrowserBridgeFixture,\n startSharedBrowserViteServer,\n type MountedWoodBridge,\n type MountedWoodComponent,\n type MountedWoodNavigation,\n type MountedWoodRoute,\n type MountedWoodSurface,\n type MountedWoodTree,\n type MountComponentOptions,\n type MountRouteOptions,\n type MountTreeOptions,\n type WoodBridgeFixtureContext,\n type WoodBridgeFixtureInput,\n type WoodBridgeRecordedCall,\n type WoodBridgeRecordedEvent,\n type WoodRpcManifestEntryInput,\n type WoodBrowserExpect,\n type WoodHitTestResult,\n type WoodRectSnapshot,\n type WoodBrowserHarness,\n type WoodBrowserHarnessConfig,\n type WoodBrowserPageContext,\n type WoodBrowserTraceConfig,\n type WoodViewport,\n} from './browser.js';\nexport {\n automationAssertions,\n visible,\n hidden,\n insideViewport,\n notClipped,\n notOverlapping,\n hitTestReachable,\n sharedEdges,\n evenSpacing,\n stableAfterAnimation,\n rectsOverlap,\n gaps,\n sharedRectEdges,\n evenSpacingRects,\n type AssertionVerdict,\n type AutomationTarget,\n type AutomationRectTarget,\n type GeometryVerdict,\n type RectAxis,\n type RectBox,\n type RectEdge,\n} from './automation_assertions.js';\nexport {\n InProcessRouterTransport,\n LoopbackRemoteTransport,\n LoopbackRemoteTransportServer,\n assertLoopbackSerializable,\n LoopbackSerializationError,\n buildTransportBridge,\n type WoodRpcTransport,\n type WoodChannelContract,\n type WoodChannelMapLike,\n type WoodChannelInput,\n type WoodChannelOutput,\n type TypedCall,\n type TransportBridgeResult,\n} from '../transport/index.js';\nexport { TraceRecorder } from '../trace-testing/index.js';\nexport type {\n TraceDispatchResult,\n TraceEvent,\n TraceInput,\n TraceWaitOptions,\n} from '../tracing/index.js';\n"],"mappings":"AACA,SAAS,UAAU,uBAAuB;AAW1C,SAAS,eAAe,4BAA4B;AACpD,SAAS,4BAAiD;AAC1D,SAAS,wBAAwB,mBAAmB,kBAAkB,aAAa,cAAc,kBAAkB,uBAAuB,kBAAkB,oBAAoB;AAOhL,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,OAGK;AACP,SAAS,wBAA+C;AACxD,SAAS,cAAc,8BAA8B;AACrD;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAuBK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAQK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAQK;AACP,SAAS,qBAAqB;","names":[]}
1
+ {"version":3,"sources":["../../src/testing/index.ts"],"sourcesContent":["// Canonical entry point — config-driven, real-IoC testWood(configPath).\nexport { testWood, TestWoodBuilder } from './test_wood_config.js';\nexport type {\n TestWoodEnvironment,\n WoodComposeContext,\n WoodComposeMain,\n WoodComposeResult,\n} from './test_wood_config.js';\nexport type { WoodTestApi, WoodTestRawApi } from '../testing-api.js';\nexport type { WoodTestSelection, WoodMainSelection, WoodRendererSelection, WoodDomMode, ResolvedWoodSelection } from './wood_test_selection.js';\nexport type { WoodPageHost, WoodMountedPage, WoodRendererHooks } from './wood_env_renderer.js';\nexport type { ModuleImporter } from './wood_config_source.js';\nexport { vitestModuleImporter } from './runner_importer.js';\nexport { TestWoodError, WOOD_FRONTEND_BRIDGE } from './test_wood.js';\nexport { TestWoodCleanupError, type CleanupFailure } from './registration_only_root.js';\nexport { FrontendLifecycleOwner, FrontendWorkError, PageCatalogError, PageCatalog, WorkRegistry, TrackedTransport, createFrontendSurface, parseViewsSource, pageIdentity } from '../frontend/index.js';\nexport type { FrontendApplicationSurface, FrontendOpenOptions, FrontendPage, FrontendLifecycle, RendererSelection, ViewsSource, CreateFrontendSurfaceOptions, WorkFailure, WorkDescriptor } from '../frontend/index.js';\n\n/** @deprecated createTestContainer's fake container bypasses real dependency\n * resolution and is retained only for parser/compiler fixtures that do not\n * claim production-equivalent IoC behavior. Canonical tests use testWood /\n * @noego/testing's testIoc, which build fresh REAL @noego/ioc roots. */\nexport { createTestContainer } from './create_test_container.js';\nexport {\n createControllerHarness,\n type ControllerHarnessResult,\n type CreateControllerHarnessOptions,\n} from './create_controller_harness.js';\nexport { createTestRouter, type TestRouterResult } from './create_test_router.js';\nexport { mockElectron, getElectronMockFactory } from './mock_electron.js';\nexport {\n createRouterBridge,\n RouterBridgeEvents,\n type RouterBridgeResult,\n} from './create_router_bridge.js';\nexport {\n createBrowserFixture,\n browserAssertions,\n createBrowserBridgeFixture,\n startSharedBrowserViteServer,\n type MountedWoodBridge,\n type MountedWoodComponent,\n type MountedWoodNavigation,\n type MountedWoodRoute,\n type MountedWoodSurface,\n type MountedWoodTree,\n type MountComponentOptions,\n type MountRouteOptions,\n type MountTreeOptions,\n type WoodBridgeFixtureContext,\n type WoodBridgeFixtureInput,\n type WoodBridgeRecordedCall,\n type WoodBridgeRecordedEvent,\n type WoodRpcManifestEntryInput,\n type WoodBrowserExpect,\n type WoodHitTestResult,\n type WoodRectSnapshot,\n type WoodBrowserFixture,\n type WoodBrowserHarnessConfig,\n type WoodBrowserPageContext,\n type WoodBrowserTraceConfig,\n type WoodViewport,\n} from './browser.js';\nexport {\n automationAssertions,\n visible,\n hidden,\n insideViewport,\n notClipped,\n notOverlapping,\n hitTestReachable,\n sharedEdges,\n evenSpacing,\n stableAfterAnimation,\n rectsOverlap,\n gaps,\n sharedRectEdges,\n evenSpacingRects,\n type AssertionVerdict,\n type AutomationTarget,\n type AutomationRectTarget,\n type GeometryVerdict,\n type RectAxis,\n type RectBox,\n type RectEdge,\n} from './automation_assertions.js';\nexport {\n InProcessRouterTransport,\n LoopbackRemoteTransport,\n LoopbackRemoteTransportServer,\n assertLoopbackSerializable,\n LoopbackSerializationError,\n buildTransportBridge,\n type WoodRpcTransport,\n type WoodChannelContract,\n type WoodChannelMapLike,\n type WoodChannelInput,\n type WoodChannelOutput,\n type TypedCall,\n type TransportBridgeResult,\n} from '../transport/index.js';\nexport { TraceRecorder } from '../trace-testing/index.js';\nexport type {\n TraceDispatchResult,\n TraceEvent,\n TraceInput,\n TraceWaitOptions,\n} from '../tracing/index.js';\n\nexport type { WoodBrowserHost, NativeWoodPage, NativeWoodTestEnvironment, WoodTestEnvironmentFor, WoodBrowserOpenOptions } from './native_browser/native_browser.types.js';\nexport { startSharedWoodBrowser } from './native_browser/browser_pool.js';\n"],"mappings":"AACA,SAAS,UAAU,uBAAuB;AAW1C,SAAS,4BAA4B;AACrC,SAAS,eAAe,4BAA4B;AACpD,SAAS,4BAAiD;AAC1D,SAAS,wBAAwB,mBAAmB,kBAAkB,aAAa,cAAc,kBAAkB,uBAAuB,kBAAkB,oBAAoB;AAOhL,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,OAGK;AACP,SAAS,wBAA+C;AACxD,SAAS,cAAc,8BAA8B;AACrD;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAuBK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAQK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAQK;AACP,SAAS,qBAAqB;AAS9B,SAAS,8BAA8B;","names":[]}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var browser_pool_exports = {};
20
+ __export(browser_pool_exports, {
21
+ acquireNativeBrowser: () => import_browser.acquireNativeBrowser,
22
+ startSharedWoodBrowser: () => import_browser.startSharedBrowser
23
+ });
24
+ module.exports = __toCommonJS(browser_pool_exports);
25
+ var import_browser = require("@noego/testing/browser");
26
+ // Annotate the CommonJS export names for ESM import in node:
27
+ 0 && (module.exports = {
28
+ acquireNativeBrowser,
29
+ startSharedWoodBrowser
30
+ });
31
+ //# sourceMappingURL=browser_pool.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/testing/native_browser/browser_pool.ts"],"sourcesContent":["export { acquireNativeBrowser, startSharedBrowser as startSharedWoodBrowser } from '@noego/testing/browser';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAmF;","names":[]}
@@ -0,0 +1 @@
1
+ export { acquireNativeBrowser, startSharedBrowser as startSharedWoodBrowser } from '@noego/testing/browser';
@@ -0,0 +1 @@
1
+ export { acquireNativeBrowser, startSharedBrowser as startSharedWoodBrowser } from '@noego/testing/browser';
@@ -0,0 +1,6 @@
1
+ import { acquireNativeBrowser, startSharedBrowser } from "@noego/testing/browser";
2
+ export {
3
+ acquireNativeBrowser,
4
+ startSharedBrowser as startSharedWoodBrowser
5
+ };
6
+ //# sourceMappingURL=browser_pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/testing/native_browser/browser_pool.ts"],"sourcesContent":["export { acquireNativeBrowser, startSharedBrowser as startSharedWoodBrowser } from '@noego/testing/browser';\n"],"mappings":"AAAA,SAAS,sBAA4C,0BAA8B;","names":[]}