@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.
- package/README.md +7 -0
- package/dist/browser-test-setup.cjs +29 -0
- package/dist/browser-test-setup.cjs.map +1 -0
- package/dist/browser-test-setup.d.cts +8 -0
- package/dist/browser-test-setup.d.ts +8 -0
- package/dist/browser-test-setup.js +9 -0
- package/dist/browser-test-setup.js.map +1 -0
- package/dist/client/global_polyfill.d.cts +1 -0
- package/dist/client/global_polyfill.d.ts +1 -0
- package/dist/client/index.cjs +7 -0
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +7 -4
- package/dist/client/index.d.ts +7 -4
- package/dist/client/index.js +6 -1
- package/dist/client/index.js.map +1 -1
- package/dist/codegen/renderer_app_generator.cjs +97 -24
- package/dist/codegen/renderer_app_generator.cjs.map +1 -1
- package/dist/codegen/renderer_app_generator.js +97 -24
- package/dist/codegen/renderer_app_generator.js.map +1 -1
- package/dist/codegen/type_generator.cjs +9 -0
- package/dist/codegen/type_generator.cjs.map +1 -1
- package/dist/codegen/type_generator.js +9 -0
- package/dist/codegen/type_generator.js.map +1 -1
- package/dist/config/config_parser.cjs +10 -0
- package/dist/config/config_parser.cjs.map +1 -1
- package/dist/config/config_parser.js +10 -0
- package/dist/config/config_parser.js.map +1 -1
- package/dist/fetch.cjs +38 -0
- package/dist/fetch.cjs.map +1 -0
- package/dist/fetch.d.cts +7 -0
- package/dist/fetch.d.ts +7 -0
- package/dist/fetch.js +12 -0
- package/dist/fetch.js.map +1 -0
- package/dist/frontend/frontend_page.cjs +3 -3
- package/dist/frontend/frontend_page.cjs.map +1 -1
- package/dist/frontend/frontend_page.d.cts +1 -1
- package/dist/frontend/frontend_page.d.ts +1 -1
- package/dist/frontend/frontend_page.js +3 -3
- package/dist/frontend/frontend_page.js.map +1 -1
- package/dist/frontend/frontend_surface.cjs +31 -17
- package/dist/frontend/frontend_surface.cjs.map +1 -1
- package/dist/frontend/frontend_surface.d.cts +12 -2
- package/dist/frontend/frontend_surface.d.ts +12 -2
- package/dist/frontend/frontend_surface.js +37 -17
- package/dist/frontend/frontend_surface.js.map +1 -1
- package/dist/frontend/index.d.cts +2 -0
- package/dist/frontend/index.d.ts +2 -0
- package/dist/index.cjs +5 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/loader/index.cjs +19 -2
- package/dist/loader/index.cjs.map +1 -1
- package/dist/loader/index.d.cts +1 -0
- package/dist/loader/index.d.ts +1 -0
- package/dist/loader/index.js +19 -1
- package/dist/loader/index.js.map +1 -1
- package/dist/loader/loader_orchestration.cjs +82 -0
- package/dist/loader/loader_orchestration.cjs.map +1 -0
- package/dist/loader/loader_orchestration.d.cts +66 -0
- package/dist/loader/loader_orchestration.d.ts +66 -0
- package/dist/loader/loader_orchestration.js +51 -0
- package/dist/loader/loader_orchestration.js.map +1 -0
- package/dist/loader/loader_runner.cjs +46 -41
- package/dist/loader/loader_runner.cjs.map +1 -1
- package/dist/loader/loader_runner.d.cts +12 -6
- package/dist/loader/loader_runner.d.ts +12 -6
- package/dist/loader/loader_runner.js +50 -41
- package/dist/loader/loader_runner.js.map +1 -1
- package/dist/native_browser.types-BY2daUOS.d.ts +189 -0
- package/dist/native_browser.types-vWXtE4rM.d.cts +189 -0
- package/dist/navigation/index.cjs +15 -2
- package/dist/navigation/index.cjs.map +1 -1
- package/dist/navigation/index.d.cts +2 -0
- package/dist/navigation/index.d.ts +2 -0
- package/dist/navigation/index.js +8 -1
- package/dist/navigation/index.js.map +1 -1
- package/dist/runtime/get_container.cjs +2 -0
- package/dist/runtime/get_container.cjs.map +1 -1
- package/dist/runtime/get_container.js +2 -0
- package/dist/runtime/get_container.js.map +1 -1
- package/dist/runtime/index.cjs +5 -0
- package/dist/runtime/index.cjs.map +1 -1
- package/dist/runtime/index.d.cts +2 -0
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/runtime_capabilities.cjs +35 -0
- package/dist/runtime/runtime_capabilities.cjs.map +1 -0
- package/dist/runtime/runtime_capabilities.d.cts +6 -0
- package/dist/runtime/runtime_capabilities.d.ts +6 -0
- package/dist/runtime/runtime_capabilities.js +11 -0
- package/dist/runtime/runtime_capabilities.js.map +1 -0
- package/dist/runtime/runtime_module.cjs +2 -0
- package/dist/runtime/runtime_module.cjs.map +1 -1
- package/dist/runtime/runtime_module.js +2 -0
- package/dist/runtime/runtime_module.js.map +1 -1
- package/dist/test-wood.cjs +150 -0
- package/dist/test-wood.cjs.map +1 -0
- package/dist/test-wood.d.cts +62 -0
- package/dist/test-wood.d.ts +62 -0
- package/dist/test-wood.js +115 -0
- package/dist/test-wood.js.map +1 -0
- package/dist/testing/browser.cjs +92 -163
- package/dist/testing/browser.cjs.map +1 -1
- package/dist/testing/browser.d.cts +14 -13
- package/dist/testing/browser.d.ts +14 -13
- package/dist/testing/browser.js +88 -162
- package/dist/testing/browser.js.map +1 -1
- package/dist/testing/create_controller_harness.d.cts +2 -1
- package/dist/testing/create_controller_harness.d.ts +2 -1
- package/dist/testing/create_router_bridge.cjs +19 -15
- package/dist/testing/create_router_bridge.cjs.map +1 -1
- package/dist/testing/create_router_bridge.d.cts +8 -1
- package/dist/testing/create_router_bridge.d.ts +8 -1
- package/dist/testing/create_router_bridge.js +18 -15
- package/dist/testing/create_router_bridge.js.map +1 -1
- package/dist/testing/index.cjs +12 -4
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +11 -5
- package/dist/testing/index.d.ts +11 -5
- package/dist/testing/index.js +9 -3
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/native_browser/browser_pool.cjs +31 -0
- package/dist/testing/native_browser/browser_pool.cjs.map +1 -0
- package/dist/testing/native_browser/browser_pool.d.cts +1 -0
- package/dist/testing/native_browser/browser_pool.d.ts +1 -0
- package/dist/testing/native_browser/browser_pool.js +6 -0
- package/dist/testing/native_browser/browser_pool.js.map +1 -0
- package/dist/testing/native_browser/happy_dom_tab.cjs +107 -0
- package/dist/testing/native_browser/happy_dom_tab.cjs.map +1 -0
- package/dist/testing/native_browser/happy_dom_tab.d.cts +35 -0
- package/dist/testing/native_browser/happy_dom_tab.d.ts +35 -0
- package/dist/testing/native_browser/happy_dom_tab.js +73 -0
- package/dist/testing/native_browser/happy_dom_tab.js.map +1 -0
- package/dist/testing/native_browser/happy_dom_transfer.cjs +29 -0
- package/dist/testing/native_browser/happy_dom_transfer.cjs.map +1 -0
- package/dist/testing/native_browser/happy_dom_transfer.d.cts +1 -0
- package/dist/testing/native_browser/happy_dom_transfer.d.ts +1 -0
- package/dist/testing/native_browser/happy_dom_transfer.js +5 -0
- package/dist/testing/native_browser/happy_dom_transfer.js.map +1 -0
- package/dist/testing/native_browser/host_transport.cjs +89 -0
- package/dist/testing/native_browser/host_transport.cjs.map +1 -0
- package/dist/testing/native_browser/host_transport.d.cts +44 -0
- package/dist/testing/native_browser/host_transport.d.ts +44 -0
- package/dist/testing/native_browser/host_transport.js +65 -0
- package/dist/testing/native_browser/host_transport.js.map +1 -0
- package/dist/testing/native_browser/native_browser.types.cjs +17 -0
- package/dist/testing/native_browser/native_browser.types.cjs.map +1 -0
- package/dist/testing/native_browser/native_browser.types.d.cts +31 -0
- package/dist/testing/native_browser/native_browser.types.d.ts +31 -0
- package/dist/testing/native_browser/native_browser.types.js +1 -0
- package/dist/testing/native_browser/native_browser.types.js.map +1 -0
- package/dist/testing/native_browser/native_browser_environment.cjs +143 -0
- package/dist/testing/native_browser/native_browser_environment.cjs.map +1 -0
- package/dist/testing/native_browser/native_browser_environment.d.cts +36 -0
- package/dist/testing/native_browser/native_browser_environment.d.ts +36 -0
- package/dist/testing/native_browser/native_browser_environment.js +109 -0
- package/dist/testing/native_browser/native_browser_environment.js.map +1 -0
- package/dist/testing/native_browser/native_browser_lifecycle.cjs +31 -0
- package/dist/testing/native_browser/native_browser_lifecycle.cjs.map +1 -0
- package/dist/testing/native_browser/native_browser_lifecycle.d.cts +1 -0
- package/dist/testing/native_browser/native_browser_lifecycle.d.ts +1 -0
- package/dist/testing/native_browser/native_browser_lifecycle.js +6 -0
- package/dist/testing/native_browser/native_browser_lifecycle.js.map +1 -0
- package/dist/testing/native_browser/playwright_tab.cjs +124 -0
- package/dist/testing/native_browser/playwright_tab.cjs.map +1 -0
- package/dist/testing/native_browser/playwright_tab.d.cts +35 -0
- package/dist/testing/native_browser/playwright_tab.d.ts +35 -0
- package/dist/testing/native_browser/playwright_tab.js +100 -0
- package/dist/testing/native_browser/playwright_tab.js.map +1 -0
- package/dist/testing/native_browser/renderer_compilation.cjs +149 -0
- package/dist/testing/native_browser/renderer_compilation.cjs.map +1 -0
- package/dist/testing/native_browser/renderer_compilation.d.cts +35 -0
- package/dist/testing/native_browser/renderer_compilation.d.ts +35 -0
- package/dist/testing/native_browser/renderer_compilation.js +115 -0
- package/dist/testing/native_browser/renderer_compilation.js.map +1 -0
- package/dist/testing/native_browser/renderer_entry.cjs +148 -0
- package/dist/testing/native_browser/renderer_entry.cjs.map +1 -0
- package/dist/testing/native_browser/renderer_entry.d.cts +13 -0
- package/dist/testing/native_browser/renderer_entry.d.ts +13 -0
- package/dist/testing/native_browser/renderer_entry.js +114 -0
- package/dist/testing/native_browser/renderer_entry.js.map +1 -0
- package/dist/testing/registration_only_root.cjs +61 -5
- package/dist/testing/registration_only_root.cjs.map +1 -1
- package/dist/testing/registration_only_root.d.cts +25 -4
- package/dist/testing/registration_only_root.d.ts +25 -4
- package/dist/testing/registration_only_root.js +60 -5
- package/dist/testing/registration_only_root.js.map +1 -1
- package/dist/testing/runner_importer.cjs +75 -0
- package/dist/testing/runner_importer.cjs.map +1 -0
- package/dist/testing/runner_importer.d.cts +8 -0
- package/dist/testing/runner_importer.d.ts +8 -0
- package/dist/testing/runner_importer.js +41 -0
- package/dist/testing/runner_importer.js.map +1 -0
- package/dist/testing/test_wood_config.cjs +387 -272
- package/dist/testing/test_wood_config.cjs.map +1 -1
- package/dist/testing/test_wood_config.d.cts +18 -123
- package/dist/testing/test_wood_config.d.ts +18 -123
- package/dist/testing/test_wood_config.js +396 -270
- package/dist/testing/test_wood_config.js.map +1 -1
- package/dist/testing/wood_config_source.cjs +12 -0
- package/dist/testing/wood_config_source.cjs.map +1 -1
- package/dist/testing/wood_config_source.d.cts +10 -0
- package/dist/testing/wood_config_source.d.ts +10 -0
- package/dist/testing/wood_config_source.js +12 -0
- package/dist/testing/wood_config_source.js.map +1 -1
- package/dist/testing/wood_env_renderer.cjs +28 -3
- package/dist/testing/wood_env_renderer.cjs.map +1 -1
- package/dist/testing/wood_env_renderer.d.cts +12 -1
- package/dist/testing/wood_env_renderer.d.ts +12 -1
- package/dist/testing/wood_env_renderer.js +28 -3
- package/dist/testing/wood_env_renderer.js.map +1 -1
- package/dist/testing/wood_lazy_runtime.cjs +109 -0
- package/dist/testing/wood_lazy_runtime.cjs.map +1 -0
- package/dist/testing/wood_lazy_runtime.d.cts +36 -0
- package/dist/testing/wood_lazy_runtime.d.ts +36 -0
- package/dist/testing/wood_lazy_runtime.js +84 -0
- package/dist/testing/wood_lazy_runtime.js.map +1 -0
- package/dist/testing/wood_test_selection.cjs +34 -55
- package/dist/testing/wood_test_selection.cjs.map +1 -1
- package/dist/testing/wood_test_selection.d.cts +18 -24
- package/dist/testing/wood_test_selection.d.ts +18 -24
- package/dist/testing/wood_test_selection.js +30 -54
- package/dist/testing/wood_test_selection.js.map +1 -1
- package/dist/testing-api.cjs +17 -0
- package/dist/testing-api.cjs.map +1 -0
- package/dist/testing-api.d.cts +18 -0
- package/dist/testing-api.d.ts +18 -0
- package/dist/testing-api.js +1 -0
- package/dist/testing-api.js.map +1 -0
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.cts +4 -0
- package/dist/types/config.d.ts +4 -0
- package/docs/native-browser-testing.md +164 -0
- package/package.json +31 -5
- package/src/components/NavigationShell.browser.test.ts +10 -10
- package/src/components/NavigationShell.cleanup.browser.test.ts +57 -0
- package/src/components/NavigationShell.scopes.browser.test.ts +5 -5
- 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
|
|
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
|
|
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
|
-
|
|
83
|
-
|
|
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) =>
|
|
83
|
+
current[leaf] = (data) => dispatch(channel, data ?? {});
|
|
89
84
|
}
|
|
90
|
-
tree
|
|
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
|
-
|
|
96
|
+
bridge.__trace = async (payload) => {
|
|
94
97
|
return (0, import_tracing.dispatchRendererTracePayload)(payload);
|
|
95
98
|
};
|
|
96
|
-
return
|
|
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 =
|
|
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
|
|
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
|
|
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
|
-
|
|
59
|
-
|
|
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) =>
|
|
58
|
+
current[leaf] = (data) => dispatch(channel, data ?? {});
|
|
65
59
|
}
|
|
66
|
-
tree
|
|
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
|
-
|
|
71
|
+
bridge.__trace = async (payload) => {
|
|
70
72
|
return dispatchRendererTracePayload(payload);
|
|
71
73
|
};
|
|
72
|
-
return
|
|
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 =
|
|
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":[]}
|
package/dist/testing/index.cjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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":[]}
|
package/dist/testing/index.d.cts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
export { TestWoodBuilder, TestWoodEnvironment, WoodComposeContext, WoodComposeMain, WoodComposeResult,
|
|
2
|
-
export {
|
|
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,
|
|
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 '../
|
|
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';
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
export { TestWoodBuilder, TestWoodEnvironment, WoodComposeContext, WoodComposeMain, WoodComposeResult,
|
|
2
|
-
export {
|
|
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,
|
|
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 '../
|
|
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';
|
package/dist/testing/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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 @@
|
|
|
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":[]}
|