@noego/wood 0.5.0 → 0.6.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 +31 -0
- package/dist/client/index.cjs +18 -11
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +21 -1
- package/dist/client/index.d.ts +21 -1
- package/dist/client/index.js +17 -11
- package/dist/client/index.js.map +1 -1
- package/dist/codegen/renderer_app_generator.cjs +2 -9
- package/dist/codegen/renderer_app_generator.cjs.map +1 -1
- package/dist/codegen/renderer_app_generator.js +2 -9
- package/dist/codegen/renderer_app_generator.js.map +1 -1
- package/dist/controller/cleanup.cjs +39 -0
- package/dist/controller/cleanup.cjs.map +1 -0
- package/dist/controller/cleanup.d.cts +4 -0
- package/dist/controller/cleanup.d.ts +4 -0
- package/dist/controller/cleanup.js +15 -0
- package/dist/controller/cleanup.js.map +1 -0
- package/dist/controller/controller_lifecycle.cjs +26 -2
- package/dist/controller/controller_lifecycle.cjs.map +1 -1
- package/dist/controller/controller_lifecycle.d.cts +3 -1
- package/dist/controller/controller_lifecycle.d.ts +3 -1
- package/dist/controller/controller_lifecycle.js +24 -1
- package/dist/controller/controller_lifecycle.js.map +1 -1
- package/dist/frontend/frontend_lifecycle.cjs +5 -7
- package/dist/frontend/frontend_lifecycle.cjs.map +1 -1
- package/dist/frontend/frontend_lifecycle.d.cts +1 -14
- package/dist/frontend/frontend_lifecycle.d.ts +1 -14
- package/dist/frontend/frontend_lifecycle.js +5 -7
- package/dist/frontend/frontend_lifecycle.js.map +1 -1
- package/dist/frontend/frontend_surface.cjs +130 -104
- package/dist/frontend/frontend_surface.cjs.map +1 -1
- package/dist/frontend/frontend_surface.js +131 -105
- package/dist/frontend/frontend_surface.js.map +1 -1
- package/dist/frontend/work_registry.cjs +29 -4
- package/dist/frontend/work_registry.cjs.map +1 -1
- package/dist/frontend/work_registry.d.cts +2 -0
- package/dist/frontend/work_registry.d.ts +2 -0
- package/dist/frontend/work_registry.js +29 -4
- package/dist/frontend/work_registry.js.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/ipc/index.cjs +6 -2
- package/dist/ipc/index.cjs.map +1 -1
- package/dist/ipc/index.d.cts +9 -0
- package/dist/ipc/index.d.ts +9 -0
- package/dist/ipc/index.js +6 -2
- package/dist/ipc/index.js.map +1 -1
- package/dist/main/index.cjs +53 -35
- package/dist/main/index.cjs.map +1 -1
- package/dist/main/index.d.cts +11 -2
- package/dist/main/index.d.ts +11 -2
- package/dist/main/index.js +56 -40
- package/dist/main/index.js.map +1 -1
- package/dist/main/startup_failure_handler.cjs +67 -0
- package/dist/main/startup_failure_handler.cjs.map +1 -0
- package/dist/main/startup_failure_handler.d.cts +16 -0
- package/dist/main/startup_failure_handler.d.ts +16 -0
- package/dist/main/startup_failure_handler.js +43 -0
- package/dist/main/startup_failure_handler.js.map +1 -0
- package/dist/router/index.d.cts +3 -0
- package/dist/router/index.d.ts +3 -0
- package/dist/router/wood_router.cjs +204 -123
- package/dist/router/wood_router.cjs.map +1 -1
- package/dist/router/wood_router.d.cts +20 -0
- package/dist/router/wood_router.d.ts +20 -0
- package/dist/router/wood_router.js +206 -125
- package/dist/router/wood_router.js.map +1 -1
- package/dist/runtime/index.cjs +13 -0
- package/dist/runtime/index.cjs.map +1 -1
- package/dist/runtime/index.d.cts +8 -4
- package/dist/runtime/index.d.ts +8 -4
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/renderer_config_extension.cjs +1 -2
- package/dist/runtime/renderer_config_extension.cjs.map +1 -1
- package/dist/runtime/renderer_config_extension.d.cts +1 -1
- package/dist/runtime/renderer_config_extension.d.ts +1 -1
- package/dist/runtime/renderer_config_extension.js +1 -2
- package/dist/runtime/renderer_config_extension.js.map +1 -1
- package/dist/runtime/renderer_log_dispatcher.cjs +2 -0
- package/dist/runtime/renderer_log_dispatcher.cjs.map +1 -1
- package/dist/runtime/renderer_log_dispatcher.d.cts +1 -1
- package/dist/runtime/renderer_log_dispatcher.d.ts +1 -1
- package/dist/runtime/renderer_log_dispatcher.js +1 -0
- package/dist/runtime/renderer_log_dispatcher.js.map +1 -1
- package/dist/runtime/runtime.cjs +107 -57
- package/dist/runtime/runtime.cjs.map +1 -1
- package/dist/runtime/runtime.d.cts +12 -0
- package/dist/runtime/runtime.d.ts +12 -0
- package/dist/runtime/runtime.js +110 -59
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/runtime_module.cjs +58 -0
- package/dist/runtime/runtime_module.cjs.map +1 -0
- package/dist/runtime/runtime_module.d.cts +22 -0
- package/dist/runtime/runtime_module.d.ts +22 -0
- package/dist/runtime/runtime_module.js +30 -0
- package/dist/runtime/runtime_module.js.map +1 -0
- package/dist/testing/create_controller_harness.d.cts +3 -0
- package/dist/testing/create_controller_harness.d.ts +3 -0
- package/dist/testing/create_router_bridge.d.cts +3 -0
- package/dist/testing/create_router_bridge.d.ts +3 -0
- package/dist/testing/create_test_router.d.cts +3 -0
- package/dist/testing/create_test_router.d.ts +3 -0
- package/dist/testing/index.cjs +3 -0
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +6 -1
- package/dist/testing/index.d.ts +6 -1
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/registration_only_root.cjs +168 -0
- package/dist/testing/registration_only_root.cjs.map +1 -0
- package/dist/testing/registration_only_root.d.cts +46 -0
- package/dist/testing/registration_only_root.d.ts +46 -0
- package/dist/testing/registration_only_root.js +141 -0
- package/dist/testing/registration_only_root.js.map +1 -0
- package/dist/testing/test_wood_config.cjs +382 -70
- package/dist/testing/test_wood_config.cjs.map +1 -1
- package/dist/testing/test_wood_config.d.cts +25 -1
- package/dist/testing/test_wood_config.d.ts +25 -1
- package/dist/testing/test_wood_config.js +388 -71
- package/dist/testing/test_wood_config.js.map +1 -1
- package/dist/testing/wood_dom_animation.cjs +213 -0
- package/dist/testing/wood_dom_animation.cjs.map +1 -0
- package/dist/testing/wood_dom_animation.d.cts +89 -0
- package/dist/testing/wood_dom_animation.d.ts +89 -0
- package/dist/testing/wood_dom_animation.js +185 -0
- package/dist/testing/wood_dom_animation.js.map +1 -0
- package/dist/testing/wood_env_renderer.cjs +81 -32
- package/dist/testing/wood_env_renderer.cjs.map +1 -1
- package/dist/testing/wood_env_renderer.d.cts +32 -1
- package/dist/testing/wood_env_renderer.d.ts +32 -1
- package/dist/testing/wood_env_renderer.js +84 -32
- package/dist/testing/wood_env_renderer.js.map +1 -1
- package/dist/transport/in_process_router_transport.d.cts +3 -0
- package/dist/transport/in_process_router_transport.d.ts +3 -0
- package/dist/transport/index.d.cts +3 -0
- package/dist/transport/index.d.ts +3 -0
- package/package.json +8 -6
- package/src/components/NavigationShell.svelte +12 -7
- package/src/controller/cleanup.ts +8 -0
- package/src/controller/controller_lifecycle.ts +24 -0
- package/src/navigation/layout_preservation.ts +45 -0
package/dist/runtime/runtime.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { getRendererTraceBatchReceiver } from "./renderer_trace_batch_receiver_registry.js";
|
|
1
2
|
import { getLogger } from "@noego/logger";
|
|
2
3
|
import { WoodRouter } from "../router/wood_router.js";
|
|
3
|
-
import {
|
|
4
|
+
import { createWoodRoot } from "./get_container.js";
|
|
5
|
+
import { ExecutionContext } from "@noego/ioc";
|
|
6
|
+
import { installWoodRuntime } from "./runtime_module.js";
|
|
4
7
|
import {
|
|
5
8
|
RendererTraceBatchHost,
|
|
6
9
|
TraceProviderConfiguration,
|
|
@@ -11,11 +14,11 @@ import {
|
|
|
11
14
|
setRendererTraceMinLevel
|
|
12
15
|
} from "../tracing/index.js";
|
|
13
16
|
import {
|
|
14
|
-
getRendererLogDispatcher
|
|
17
|
+
getRendererLogDispatcher,
|
|
18
|
+
RendererLogDispatcher
|
|
15
19
|
} from "./renderer_log_dispatcher.js";
|
|
16
20
|
import { dispatchRendererLogBatch } from "./renderer_log_batch_receiver.js";
|
|
17
21
|
import { resolveRendererConfigExtension } from "./renderer_config_extension.js";
|
|
18
|
-
import { getRendererTraceBatchReceiver } from "./renderer_trace_batch_receiver_registry.js";
|
|
19
22
|
import { resolveWoodAppEnv } from "./app_env.js";
|
|
20
23
|
const logger = getLogger("wood:runtime");
|
|
21
24
|
function normalizeRendererLogLevel(level) {
|
|
@@ -41,7 +44,6 @@ function coerceRendererLogPayload(rawPayload, event) {
|
|
|
41
44
|
}
|
|
42
45
|
async function runtime(options) {
|
|
43
46
|
const {
|
|
44
|
-
ipcMain,
|
|
45
47
|
registerRuntime,
|
|
46
48
|
controllersDir,
|
|
47
49
|
middlewareDir,
|
|
@@ -52,60 +54,110 @@ async function runtime(options) {
|
|
|
52
54
|
rendererTraceEnabled = false,
|
|
53
55
|
rendererTraceMinLevel = "debug"
|
|
54
56
|
} = options;
|
|
55
|
-
const container = options.container ??
|
|
56
|
-
const rendererTraceBatchReceiver = options.rendererTraceBatchReceiver ?? getRendererTraceBatchReceiver();
|
|
57
|
+
const container = options.container ?? createWoodRoot();
|
|
58
|
+
const rendererTraceBatchReceiver = options.rendererTraceBatchReceiver ?? (options.legacyGlobals ? getRendererTraceBatchReceiver() : null);
|
|
57
59
|
const rendererTraceBatchEnabled = rendererTraceBatchReceiver !== null;
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
60
|
+
const handlers = [];
|
|
61
|
+
const listeners = [];
|
|
62
|
+
let router;
|
|
63
|
+
let closing;
|
|
64
|
+
const dispose = (timeoutMs) => closing ?? (closing = (async () => {
|
|
65
|
+
const errors = [];
|
|
66
|
+
for (const channel of handlers.splice(0)) {
|
|
67
|
+
try {
|
|
68
|
+
options.ipcMain.removeHandler?.(channel);
|
|
69
|
+
} catch (error) {
|
|
70
|
+
errors.push(error);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
for (const [channel, listener] of listeners.splice(0)) {
|
|
74
|
+
try {
|
|
75
|
+
if (options.ipcMain.removeListener) options.ipcMain.removeListener(channel, listener);
|
|
76
|
+
else options.ipcMain.removeAllListeners?.(channel);
|
|
77
|
+
} catch (error) {
|
|
78
|
+
errors.push(error);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
let drained = true;
|
|
82
|
+
try {
|
|
83
|
+
await router?.dispose(timeoutMs);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
drained = false;
|
|
86
|
+
errors.push(error);
|
|
87
|
+
}
|
|
88
|
+
if (!options.container && drained) {
|
|
89
|
+
try {
|
|
90
|
+
await ExecutionContext.run(container, () => container.dispose());
|
|
91
|
+
} catch (error) {
|
|
92
|
+
errors.push(error);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (errors.length) throw Object.assign(new Error("Wood runtime cleanup failed"), { errors });
|
|
96
|
+
})().catch((error) => {
|
|
97
|
+
closing = void 0;
|
|
98
|
+
throw error;
|
|
99
|
+
}));
|
|
100
|
+
const ipcMain = {
|
|
101
|
+
handle(channel, handler) {
|
|
102
|
+
options.ipcMain.handle(channel, handler);
|
|
103
|
+
handlers.push(channel);
|
|
104
|
+
},
|
|
105
|
+
on(channel, listener) {
|
|
106
|
+
options.ipcMain.on(channel, listener);
|
|
107
|
+
listeners.push([channel, listener]);
|
|
108
|
+
}
|
|
80
109
|
};
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
container
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
110
|
+
try {
|
|
111
|
+
installWoodRuntime(container, { controllersDir, middlewareDir, mode, registerRuntime });
|
|
112
|
+
if (!container.isRegistered(RendererTraceBatchHost)) {
|
|
113
|
+
container.registerFunction(RendererTraceBatchHost, () => new RendererTraceBatchHost(rendererTraceBatchReceiver));
|
|
114
|
+
}
|
|
115
|
+
const rendererTraceBatchHost = await ExecutionContext.run(container, () => container.get(RendererTraceBatchHost));
|
|
116
|
+
logger.info("runtime start", {
|
|
117
|
+
mode,
|
|
118
|
+
hasProvidedContainer: !!options.container,
|
|
119
|
+
controllersDir,
|
|
120
|
+
middlewareDir,
|
|
121
|
+
enableRendererLogBridge,
|
|
122
|
+
enableRendererTraceBridge,
|
|
123
|
+
traceMinLevel: traceMinLevel ?? "debug",
|
|
124
|
+
rendererTraceEnabled,
|
|
125
|
+
rendererTraceMinLevel,
|
|
126
|
+
rendererTraceBatchEnabled
|
|
127
|
+
});
|
|
128
|
+
const traceSettings = {
|
|
129
|
+
enableRendererLogBridge,
|
|
130
|
+
enableRendererTraceBridge,
|
|
131
|
+
traceMinLevel,
|
|
132
|
+
rendererTraceEnabled,
|
|
133
|
+
rendererTraceMinLevel,
|
|
134
|
+
rendererTraceBatchEnabled
|
|
135
|
+
};
|
|
136
|
+
await configureRuntimeTracing(container, traceSettings, options.legacyGlobals ?? false);
|
|
137
|
+
router = await ExecutionContext.run(container, () => container.get(WoodRouter));
|
|
138
|
+
registerReservedRuntimeHandlers(router, options, traceSettings, rendererTraceBatchHost);
|
|
139
|
+
registerRuntimeObservationBridges(ipcMain, traceSettings, options.resolveRendererTraceContext, options.rendererLogDispatcher ?? (options.legacyGlobals ? getRendererLogDispatcher() : new RendererLogDispatcher()));
|
|
140
|
+
router.registerIpcHandlers(ipcMain);
|
|
141
|
+
logger.info("runtime ipc handlers registered", {
|
|
142
|
+
channelCount: router.getChannels().length,
|
|
143
|
+
enableRendererLogBridge,
|
|
144
|
+
enableRendererTraceBridge
|
|
145
|
+
});
|
|
146
|
+
return { router, dispose };
|
|
147
|
+
} catch (error) {
|
|
148
|
+
try {
|
|
149
|
+
await dispose();
|
|
150
|
+
} catch (cleanupError) {
|
|
151
|
+
throw Object.assign(new Error("Wood runtime startup and cleanup failed"), { cause: error, errors: [error, cleanupError] });
|
|
152
|
+
}
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
103
155
|
}
|
|
104
|
-
async function configureRuntimeTracing(container, settings) {
|
|
105
|
-
if (
|
|
106
|
-
setMainTraceMinLevel(settings.traceMinLevel);
|
|
156
|
+
async function configureRuntimeTracing(container, settings, legacyGlobals) {
|
|
157
|
+
if (legacyGlobals) {
|
|
158
|
+
if (settings.traceMinLevel) setMainTraceMinLevel(settings.traceMinLevel);
|
|
159
|
+
setRendererTraceMinLevel(settings.rendererTraceMinLevel);
|
|
107
160
|
}
|
|
108
|
-
setRendererTraceMinLevel(settings.rendererTraceMinLevel);
|
|
109
161
|
if (typeof container.instance !== "function") {
|
|
110
162
|
return;
|
|
111
163
|
}
|
|
@@ -126,7 +178,7 @@ function registerReservedRuntimeHandlers(router, options, settings, rendererTrac
|
|
|
126
178
|
);
|
|
127
179
|
router.registerReservedHandler("__woodConfig", async () => ({
|
|
128
180
|
// App extension fields first so Wood's reserved keys always win.
|
|
129
|
-
...await resolveRendererConfigExtension(),
|
|
181
|
+
...await resolveRendererConfigExtension(options.rendererConfigExtension ?? (options.legacyGlobals ? void 0 : null)),
|
|
130
182
|
rendererTraceEnabled: settings.rendererTraceEnabled,
|
|
131
183
|
rendererTraceMinLevel: settings.rendererTraceMinLevel,
|
|
132
184
|
rendererTraceBatchEnabled: settings.rendererTraceBatchEnabled,
|
|
@@ -136,9 +188,9 @@ function registerReservedRuntimeHandlers(router, options, settings, rendererTrac
|
|
|
136
188
|
return rendererTraceBatchHost.receive(data, options.resolveRendererTraceContext?.(event) ?? {});
|
|
137
189
|
});
|
|
138
190
|
}
|
|
139
|
-
function registerRuntimeObservationBridges(ipcMain, settings, resolveContext) {
|
|
191
|
+
function registerRuntimeObservationBridges(ipcMain, settings, resolveContext, dispatcher) {
|
|
140
192
|
if (settings.enableRendererLogBridge) {
|
|
141
|
-
registerRendererLogBridge(ipcMain);
|
|
193
|
+
registerRendererLogBridge(ipcMain, dispatcher);
|
|
142
194
|
}
|
|
143
195
|
ipcMain.removeAllListeners?.("__trace");
|
|
144
196
|
if (settings.enableRendererTraceBridge && settings.rendererTraceEnabled) {
|
|
@@ -160,8 +212,7 @@ function registerRendererTraceBridge(ipcMain, resolveContext) {
|
|
|
160
212
|
});
|
|
161
213
|
logger.info("renderer trace bridge registered (fire-and-forget)");
|
|
162
214
|
}
|
|
163
|
-
function registerRendererLogBridge(ipcMain) {
|
|
164
|
-
const dispatcher = getRendererLogDispatcher();
|
|
215
|
+
function registerRendererLogBridge(ipcMain, dispatcher) {
|
|
165
216
|
ipcMain.removeAllListeners?.("__log");
|
|
166
217
|
ipcMain.on("__log", (_event, rawPayload) => {
|
|
167
218
|
const entry = coerceRendererLogPayload(rawPayload, null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/runtime.ts"],"sourcesContent":["import { getLogger } from '@noego/logger';\nimport { WoodRouter } from '../router/wood_router.js';\nimport { getContainer } from './get_container.js';\nimport {\n RendererTraceBatchHost,\n TraceProviderConfiguration,\n dispatchRendererTracePayload,\n} from '../tracing/index.js';\nimport {\n setMainTraceMinLevel,\n setRendererTraceMinLevel,\n type TraceLevel,\n type TraceRuntimeContext,\n type WoodTraceBatchReceiver,\n} from '../tracing/index.js';\nimport {\n getRendererLogDispatcher,\n type RendererLogDispatchResult,\n type RendererLogEntry,\n type RendererLogLevel,\n} from './renderer_log_dispatcher.js';\nimport { dispatchRendererLogBatch } from './renderer_log_batch_receiver.js';\nimport { resolveRendererConfigExtension } from './renderer_config_extension.js';\nimport { getRendererTraceBatchReceiver } from './renderer_trace_batch_receiver_registry.js';\nimport { resolveWoodAppEnv, type WoodAppEnv } from './app_env.js';\n\nconst logger = getLogger('wood:runtime');\n\ntype IpcMainLike = {\n handle: (channel: string, handler: (_event: unknown, data: unknown) => Promise<unknown> | unknown) => void;\n on: (channel: string, handler: (_event: unknown, ...args: unknown[]) => void) => void;\n removeHandler?: (channel: string) => void;\n removeAllListeners?: (channel: string) => void;\n};\n\nexport interface RegisterRuntimeRouter {\n registerController(name: string, cls: any): void;\n loadOperations(operations: Map<string, any>): void;\n}\n\nexport interface RuntimeOptions {\n ipcMain: IpcMainLike;\n registerRuntime: (router: RegisterRuntimeRouter) => void;\n container?: any;\n controllersDir: string;\n middlewareDir: string;\n mode?: 'bundled' | 'dev';\n /** Override the resolved app environment tier reported to renderers via __woodConfig. */\n appEnv?: WoodAppEnv;\n enableRendererLogBridge?: boolean;\n enableRendererTraceBridge?: boolean;\n traceMinLevel?: TraceLevel;\n rendererTraceEnabled?: boolean;\n rendererTraceMinLevel?: TraceLevel;\n /** Resolves only with the acknowledgement produced by the downstream durable receiver. */\n rendererTraceBatchReceiver?: WoodTraceBatchReceiver;\n onLoad?: (data: unknown, event?: unknown) => Promise<unknown>;\n onNavigate?: (data: unknown, event?: unknown) => Promise<unknown>;\n onWindow?: (data: unknown, event?: unknown) => Promise<unknown>;\n onDebug?: (data: unknown, event?: unknown) => Promise<unknown>;\n onContextMenu?: (data: unknown, event?: unknown) => Promise<unknown>;\n resolveRendererTraceContext?: (event: unknown) => TraceRuntimeContext | undefined;\n}\n\nexport interface RuntimeResult {\n router: WoodRouter;\n}\n\ntype RendererLogPayload = {\n level: string;\n logger: string;\n message: string;\n context?: unknown;\n};\n\ntype IpcInvokeEventLike = {\n sender?: {\n id?: number;\n };\n};\n\ntype RuntimeReservedHandler = (\n data: unknown,\n event?: unknown,\n) => Promise<unknown>;\n\ntype RuntimeTraceSettings = Readonly<{\n enableRendererLogBridge: boolean;\n enableRendererTraceBridge: boolean;\n traceMinLevel: TraceLevel | undefined;\n rendererTraceEnabled: boolean;\n rendererTraceMinLevel: TraceLevel;\n rendererTraceBatchEnabled: boolean;\n}>;\n\nfunction normalizeRendererLogLevel(level: unknown): RendererLogLevel {\n if (typeof level === 'string') {\n const normalized = level.trim().toLowerCase();\n if (normalized.length > 0) {\n return normalized;\n }\n }\n return 'info';\n}\n\nfunction coerceRendererLogPayload(\n rawPayload: unknown,\n event: unknown,\n): RendererLogEntry {\n const payload = (rawPayload ?? {}) as Partial<RendererLogPayload>;\n const ipcEvent = event as IpcInvokeEventLike;\n\n return {\n level: normalizeRendererLogLevel(payload.level),\n logger: typeof payload.logger === 'string' && payload.logger.trim().length > 0\n ? payload.logger\n : 'renderer',\n message: typeof payload.message === 'string' ? payload.message : '',\n context: payload.context,\n timestamp: new Date().toISOString(),\n senderId: typeof ipcEvent?.sender?.id === 'number' ? ipcEvent.sender.id : null,\n };\n}\n\n/**\n * Boot a bundled-safe Wood runtime using pre-generated static runtime artifacts.\n */\nexport async function runtime(options: RuntimeOptions): Promise<RuntimeResult> {\n const {\n ipcMain,\n registerRuntime,\n controllersDir,\n middlewareDir,\n mode = 'bundled',\n enableRendererLogBridge = true,\n enableRendererTraceBridge = true,\n traceMinLevel,\n rendererTraceEnabled = false,\n rendererTraceMinLevel = 'debug',\n } = options;\n\n const container = options.container ?? getContainer();\n const rendererTraceBatchReceiver = options.rendererTraceBatchReceiver\n ?? getRendererTraceBatchReceiver();\n const rendererTraceBatchEnabled = rendererTraceBatchReceiver !== null;\n const rendererTraceBatchHost = new RendererTraceBatchHost(\n rendererTraceBatchReceiver,\n );\n\n logger.info('runtime start', {\n mode,\n hasProvidedContainer: !!options.container,\n controllersDir,\n middlewareDir,\n enableRendererLogBridge,\n enableRendererTraceBridge,\n traceMinLevel: traceMinLevel ?? 'debug',\n rendererTraceEnabled,\n rendererTraceMinLevel,\n rendererTraceBatchEnabled,\n });\n\n const traceSettings: RuntimeTraceSettings = {\n enableRendererLogBridge,\n enableRendererTraceBridge,\n traceMinLevel,\n rendererTraceEnabled,\n rendererTraceMinLevel,\n rendererTraceBatchEnabled,\n };\n await configureRuntimeTracing(container, traceSettings);\n\n const router = new WoodRouter({\n container,\n controllersDir,\n middlewareDir,\n mode,\n });\n\n registerRuntime(router);\n logger.info('runtime registration complete');\n\n router.validateControllers();\n logger.info('runtime controller validation complete');\n\n router.precompileSchemas();\n logger.info('runtime schema pre-compilation complete');\n\n registerReservedRuntimeHandlers(router, options, traceSettings, rendererTraceBatchHost);\n registerRuntimeObservationBridges(ipcMain, traceSettings, options.resolveRendererTraceContext);\n\n router.registerIpcHandlers(ipcMain);\n logger.info('runtime ipc handlers registered', {\n channelCount: router.getChannels().length,\n enableRendererLogBridge,\n enableRendererTraceBridge,\n });\n\n return { router };\n}\n\nasync function configureRuntimeTracing(\n container: any,\n settings: RuntimeTraceSettings,\n): Promise<void> {\n if (settings.traceMinLevel) {\n setMainTraceMinLevel(settings.traceMinLevel);\n }\n setRendererTraceMinLevel(settings.rendererTraceMinLevel);\n if (typeof container.instance !== 'function') {\n return;\n }\n\n const traceConfiguration = await container.instance(TraceProviderConfiguration);\n traceConfiguration.configureRuntime('main');\n if (settings.traceMinLevel) {\n traceConfiguration.configureMinLevel(settings.traceMinLevel);\n }\n}\n\nfunction registerReservedRuntimeHandlers(\n router: WoodRouter,\n options: RuntimeOptions,\n settings: RuntimeTraceSettings,\n rendererTraceBatchHost: RendererTraceBatchHost,\n): void {\n router.registerReservedHandler('__load', requireRuntimeHandler('__load', 'onLoad', options.onLoad));\n router.registerReservedHandler('__navigate', requireRuntimeHandler('__navigate', 'onNavigate', options.onNavigate));\n router.registerReservedHandler('__window', requireRuntimeHandler('__window', 'onWindow', options.onWindow));\n router.registerReservedHandler('__debug', requireRuntimeHandler('__debug', 'onDebug', options.onDebug));\n router.registerReservedHandler(\n '__contextMenu',\n requireRuntimeHandler('__contextMenu', 'onContextMenu', options.onContextMenu),\n );\n router.registerReservedHandler('__woodConfig', async () => ({\n // App extension fields first so Wood's reserved keys always win.\n ...(await resolveRendererConfigExtension()),\n rendererTraceEnabled: settings.rendererTraceEnabled,\n rendererTraceMinLevel: settings.rendererTraceMinLevel,\n rendererTraceBatchEnabled: settings.rendererTraceBatchEnabled,\n appEnv: options.appEnv ?? await resolveWoodAppEnv(),\n }));\n router.registerReservedHandler('__traceBatch', async (data, event) => {\n return rendererTraceBatchHost.receive(data, options.resolveRendererTraceContext?.(event) ?? {});\n });\n}\n\nfunction registerRuntimeObservationBridges(\n ipcMain: IpcMainLike,\n settings: RuntimeTraceSettings,\n resolveContext: RuntimeOptions['resolveRendererTraceContext'],\n): void {\n if (settings.enableRendererLogBridge) {\n registerRendererLogBridge(ipcMain);\n }\n ipcMain.removeAllListeners?.('__trace');\n if (settings.enableRendererTraceBridge && settings.rendererTraceEnabled) {\n registerRendererTraceBridge(ipcMain, resolveContext);\n }\n}\n\nfunction requireRuntimeHandler(\n channel: string,\n optionName: string,\n handler: RuntimeReservedHandler | undefined,\n): RuntimeReservedHandler {\n return async (data, event) => {\n if (!handler) {\n throw new Error(`Reserved channel \"${channel}\" not configured. Provide runtime({ ${optionName} }).`);\n }\n return handler(data, event);\n };\n}\n\nfunction registerRendererTraceBridge(\n ipcMain: IpcMainLike,\n resolveContext?: (event: unknown) => TraceRuntimeContext | undefined,\n): void {\n ipcMain.removeAllListeners?.('__trace');\n\n ipcMain.on('__trace', (event, rawPayload) => {\n dispatchRendererTracePayload(rawPayload, resolveContext?.(event));\n });\n\n logger.info('renderer trace bridge registered (fire-and-forget)');\n}\n\nfunction registerRendererLogBridge(ipcMain: IpcMainLike): void {\n const dispatcher = getRendererLogDispatcher();\n\n ipcMain.removeAllListeners?.('__log');\n\n ipcMain.on('__log', (_event, rawPayload) => {\n const entry = coerceRendererLogPayload(rawPayload, null);\n void dispatcher.dispatch(entry).then((result) => {\n const typedResult = result as RendererLogDispatchResult;\n if (!typedResult.ok) {\n logger.warn('renderer log dispatch failed', {\n logger: entry.logger,\n messageLength: entry.message.length,\n reason: typedResult.reason ?? null,\n errorMessage: typedResult.errorMessage ?? null,\n });\n }\n });\n });\n\n ipcMain.removeAllListeners?.('__log_batch');\n\n ipcMain.on('__log_batch', (_event, rawPayload) => {\n const result = dispatchRendererLogBatch(rawPayload);\n if (!result.ok) {\n logger.warn('renderer log batch rejected', {\n reason: result.reason ?? null,\n errorMessage: result.errorMessage ?? null,\n });\n }\n });\n\n logger.info('renderer log bridge registered (fire-and-forget)');\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/runtime.ts"],"sourcesContent":["import { getRendererTraceBatchReceiver } from './renderer_trace_batch_receiver_registry.js';\nimport { getLogger } from '@noego/logger';\nimport { WoodRouter } from '../router/wood_router.js';\nimport { createWoodRoot } from './get_container.js';\nimport { ExecutionContext } from '@noego/ioc';\nimport { installWoodRuntime } from './runtime_module.js';\nimport {\n RendererTraceBatchHost,\n TraceProviderConfiguration,\n dispatchRendererTracePayload,\n} from '../tracing/index.js';\nimport {\n setMainTraceMinLevel,\n setRendererTraceMinLevel,\n type TraceLevel,\n type TraceRuntimeContext,\n type WoodTraceBatchReceiver,\n} from '../tracing/index.js';\nimport {\n getRendererLogDispatcher,\n RendererLogDispatcher,\n type RendererLogDispatchResult,\n type RendererLogEntry,\n type RendererLogLevel,\n} from './renderer_log_dispatcher.js';\nimport { dispatchRendererLogBatch } from './renderer_log_batch_receiver.js';\nimport { resolveRendererConfigExtension, type RendererConfigExtension } from './renderer_config_extension.js';\nimport { resolveWoodAppEnv, type WoodAppEnv } from './app_env.js';\n\nconst logger = getLogger('wood:runtime');\n\ntype IpcMainLike = {\n handle: (channel: string, handler: (_event: unknown, data: unknown) => Promise<unknown> | unknown) => void;\n on: (channel: string, handler: (_event: unknown, ...args: unknown[]) => void) => void;\n removeHandler?: (channel: string) => void;\n removeAllListeners?: (channel: string) => void;\n removeListener?: (channel: string, listener: (...args: any[]) => void) => void;\n};\n\nexport interface RegisterRuntimeRouter {\n registerController(name: string, cls: any): void;\n loadOperations(operations: Map<string, any>): void;\n}\n\nexport interface RuntimeOptions {\n ipcMain: IpcMainLike;\n /** Explicit migration adapter for the old process-global observation hooks. */\n legacyGlobals?: boolean;\n rendererLogDispatcher?: RendererLogDispatcher;\n rendererConfigExtension?: RendererConfigExtension;\n registerRuntime: (router: RegisterRuntimeRouter) => void;\n container?: any;\n controllersDir: string;\n middlewareDir: string;\n mode?: 'bundled' | 'dev';\n /** Override the resolved app environment tier reported to renderers via __woodConfig. */\n appEnv?: WoodAppEnv;\n enableRendererLogBridge?: boolean;\n enableRendererTraceBridge?: boolean;\n traceMinLevel?: TraceLevel;\n rendererTraceEnabled?: boolean;\n rendererTraceMinLevel?: TraceLevel;\n /** Resolves only with the acknowledgement produced by the downstream durable receiver. */\n rendererTraceBatchReceiver?: WoodTraceBatchReceiver;\n onLoad?: (data: unknown, event?: unknown) => Promise<unknown>;\n onNavigate?: (data: unknown, event?: unknown) => Promise<unknown>;\n onWindow?: (data: unknown, event?: unknown) => Promise<unknown>;\n onDebug?: (data: unknown, event?: unknown) => Promise<unknown>;\n onContextMenu?: (data: unknown, event?: unknown) => Promise<unknown>;\n resolveRendererTraceContext?: (event: unknown) => TraceRuntimeContext | undefined;\n}\n\nexport interface RuntimeResult {\n router: WoodRouter;\n /** Stop admission, drain operations, remove owned IPC handlers and dispose an internally created root. */\n dispose(timeoutMs?: number): Promise<void>;\n}\n\ntype RendererLogPayload = {\n level: string;\n logger: string;\n message: string;\n context?: unknown;\n};\n\ntype IpcInvokeEventLike = {\n sender?: {\n id?: number;\n };\n};\n\ntype RuntimeReservedHandler = (\n data: unknown,\n event?: unknown,\n) => Promise<unknown>;\n\ntype RuntimeTraceSettings = Readonly<{\n enableRendererLogBridge: boolean;\n enableRendererTraceBridge: boolean;\n traceMinLevel: TraceLevel | undefined;\n rendererTraceEnabled: boolean;\n rendererTraceMinLevel: TraceLevel;\n rendererTraceBatchEnabled: boolean;\n}>;\n\nfunction normalizeRendererLogLevel(level: unknown): RendererLogLevel {\n if (typeof level === 'string') {\n const normalized = level.trim().toLowerCase();\n if (normalized.length > 0) {\n return normalized;\n }\n }\n return 'info';\n}\n\nfunction coerceRendererLogPayload(\n rawPayload: unknown,\n event: unknown,\n): RendererLogEntry {\n const payload = (rawPayload ?? {}) as Partial<RendererLogPayload>;\n const ipcEvent = event as IpcInvokeEventLike;\n\n return {\n level: normalizeRendererLogLevel(payload.level),\n logger: typeof payload.logger === 'string' && payload.logger.trim().length > 0\n ? payload.logger\n : 'renderer',\n message: typeof payload.message === 'string' ? payload.message : '',\n context: payload.context,\n timestamp: new Date().toISOString(),\n senderId: typeof ipcEvent?.sender?.id === 'number' ? ipcEvent.sender.id : null,\n };\n}\n\n/**\n * Boot a bundled-safe Wood runtime using pre-generated static runtime artifacts.\n */\nexport async function runtime(options: RuntimeOptions): Promise<RuntimeResult> {\n const {\n registerRuntime,\n controllersDir,\n middlewareDir,\n mode = 'bundled',\n enableRendererLogBridge = true,\n enableRendererTraceBridge = true,\n traceMinLevel,\n rendererTraceEnabled = false,\n rendererTraceMinLevel = 'debug',\n } = options;\n\n const container = options.container ?? createWoodRoot();\n const rendererTraceBatchReceiver = options.rendererTraceBatchReceiver\n ?? (options.legacyGlobals ? getRendererTraceBatchReceiver() : null);\n const rendererTraceBatchEnabled = rendererTraceBatchReceiver !== null;\n const handlers: string[] = [];\n const listeners: Array<[string, (...args: any[]) => void]> = [];\n let router: WoodRouter | undefined;\n let closing: Promise<void> | undefined;\n const dispose = (timeoutMs?: number): Promise<void> => closing ??= (async () => {\n const errors: unknown[] = [];\n for (const channel of handlers.splice(0)) {\n try { options.ipcMain.removeHandler?.(channel); } catch (error) { errors.push(error); }\n }\n for (const [channel, listener] of listeners.splice(0)) {\n try {\n if (options.ipcMain.removeListener) options.ipcMain.removeListener(channel, listener);\n else options.ipcMain.removeAllListeners?.(channel);\n } catch (error) { errors.push(error); }\n }\n let drained = true;\n try { await router?.dispose(timeoutMs); } catch (error) { drained = false; errors.push(error); }\n // Pending work retains its root after a timeout. The caller can retry disposal.\n if (!options.container && drained) {\n try { await ExecutionContext.run(container, () => container.dispose()); } catch (error) { errors.push(error); }\n }\n if (errors.length) throw Object.assign(new Error('Wood runtime cleanup failed'), { errors });\n })().catch(error => { closing = undefined; throw error; });\n const ipcMain: IpcMainLike = {\n handle(channel, handler) {\n options.ipcMain.handle(channel, handler);\n handlers.push(channel);\n },\n on(channel, listener) {\n options.ipcMain.on(channel, listener);\n listeners.push([channel, listener]);\n },\n };\n try {\n installWoodRuntime(container, { controllersDir, middlewareDir, mode, registerRuntime });\n if (!container.isRegistered(RendererTraceBatchHost)) {\n container.registerFunction(RendererTraceBatchHost, () => new RendererTraceBatchHost(rendererTraceBatchReceiver));\n }\n const rendererTraceBatchHost = await ExecutionContext.run(container, () => container.get(RendererTraceBatchHost)) as RendererTraceBatchHost;\n\n logger.info('runtime start', {\n mode,\n hasProvidedContainer: !!options.container,\n controllersDir,\n middlewareDir,\n enableRendererLogBridge,\n enableRendererTraceBridge,\n traceMinLevel: traceMinLevel ?? 'debug',\n rendererTraceEnabled,\n rendererTraceMinLevel,\n rendererTraceBatchEnabled,\n });\n\n const traceSettings: RuntimeTraceSettings = {\n enableRendererLogBridge,\n enableRendererTraceBridge,\n traceMinLevel,\n rendererTraceEnabled,\n rendererTraceMinLevel,\n rendererTraceBatchEnabled,\n };\n await configureRuntimeTracing(container, traceSettings, options.legacyGlobals ?? false);\n\n router = await ExecutionContext.run(container, () => container.get(WoodRouter)) as WoodRouter;\n\n registerReservedRuntimeHandlers(router, options, traceSettings, rendererTraceBatchHost);\n registerRuntimeObservationBridges(ipcMain, traceSettings, options.resolveRendererTraceContext, options.rendererLogDispatcher ?? (options.legacyGlobals ? getRendererLogDispatcher() : new RendererLogDispatcher()));\n\n router.registerIpcHandlers(ipcMain);\n logger.info('runtime ipc handlers registered', {\n channelCount: router.getChannels().length,\n enableRendererLogBridge,\n enableRendererTraceBridge,\n });\n\n return { router, dispose };\n } catch (error) {\n try { await dispose(); } catch (cleanupError) {\n throw Object.assign(new Error('Wood runtime startup and cleanup failed'), { cause: error, errors: [error, cleanupError] });\n }\n throw error;\n }\n}\n\nasync function configureRuntimeTracing(\n container: any,\n settings: RuntimeTraceSettings,\n legacyGlobals: boolean,\n): Promise<void> {\n if (legacyGlobals) {\n if (settings.traceMinLevel) setMainTraceMinLevel(settings.traceMinLevel);\n setRendererTraceMinLevel(settings.rendererTraceMinLevel);\n }\n if (typeof container.instance !== 'function') {\n return;\n }\n\n const traceConfiguration = await container.instance(TraceProviderConfiguration);\n traceConfiguration.configureRuntime('main');\n if (settings.traceMinLevel) {\n traceConfiguration.configureMinLevel(settings.traceMinLevel);\n }\n}\n\nfunction registerReservedRuntimeHandlers(\n router: WoodRouter,\n options: RuntimeOptions,\n settings: RuntimeTraceSettings,\n rendererTraceBatchHost: RendererTraceBatchHost,\n): void {\n router.registerReservedHandler('__load', requireRuntimeHandler('__load', 'onLoad', options.onLoad));\n router.registerReservedHandler('__navigate', requireRuntimeHandler('__navigate', 'onNavigate', options.onNavigate));\n router.registerReservedHandler('__window', requireRuntimeHandler('__window', 'onWindow', options.onWindow));\n router.registerReservedHandler('__debug', requireRuntimeHandler('__debug', 'onDebug', options.onDebug));\n router.registerReservedHandler(\n '__contextMenu',\n requireRuntimeHandler('__contextMenu', 'onContextMenu', options.onContextMenu),\n );\n router.registerReservedHandler('__woodConfig', async () => ({\n // App extension fields first so Wood's reserved keys always win.\n ...(await resolveRendererConfigExtension(options.rendererConfigExtension ?? (options.legacyGlobals ? undefined : null))),\n rendererTraceEnabled: settings.rendererTraceEnabled,\n rendererTraceMinLevel: settings.rendererTraceMinLevel,\n rendererTraceBatchEnabled: settings.rendererTraceBatchEnabled,\n appEnv: options.appEnv ?? await resolveWoodAppEnv(),\n }));\n router.registerReservedHandler('__traceBatch', async (data, event) => {\n return rendererTraceBatchHost.receive(data, options.resolveRendererTraceContext?.(event) ?? {});\n });\n}\n\nfunction registerRuntimeObservationBridges(\n ipcMain: IpcMainLike,\n settings: RuntimeTraceSettings,\n resolveContext: RuntimeOptions['resolveRendererTraceContext'],\n dispatcher: RendererLogDispatcher,\n): void {\n if (settings.enableRendererLogBridge) {\n registerRendererLogBridge(ipcMain, dispatcher);\n }\n ipcMain.removeAllListeners?.('__trace');\n if (settings.enableRendererTraceBridge && settings.rendererTraceEnabled) {\n registerRendererTraceBridge(ipcMain, resolveContext);\n }\n}\n\nfunction requireRuntimeHandler(\n channel: string,\n optionName: string,\n handler: RuntimeReservedHandler | undefined,\n): RuntimeReservedHandler {\n return async (data, event) => {\n if (!handler) {\n throw new Error(`Reserved channel \"${channel}\" not configured. Provide runtime({ ${optionName} }).`);\n }\n return handler(data, event);\n };\n}\n\nfunction registerRendererTraceBridge(\n ipcMain: IpcMainLike,\n resolveContext?: (event: unknown) => TraceRuntimeContext | undefined,\n): void {\n ipcMain.removeAllListeners?.('__trace');\n\n ipcMain.on('__trace', (event, rawPayload) => {\n dispatchRendererTracePayload(rawPayload, resolveContext?.(event));\n });\n\n logger.info('renderer trace bridge registered (fire-and-forget)');\n}\n\nfunction registerRendererLogBridge(ipcMain: IpcMainLike, dispatcher: RendererLogDispatcher): void {\n\n ipcMain.removeAllListeners?.('__log');\n\n ipcMain.on('__log', (_event, rawPayload) => {\n const entry = coerceRendererLogPayload(rawPayload, null);\n void dispatcher.dispatch(entry).then((result) => {\n const typedResult = result as RendererLogDispatchResult;\n if (!typedResult.ok) {\n logger.warn('renderer log dispatch failed', {\n logger: entry.logger,\n messageLength: entry.message.length,\n reason: typedResult.reason ?? null,\n errorMessage: typedResult.errorMessage ?? null,\n });\n }\n });\n });\n\n ipcMain.removeAllListeners?.('__log_batch');\n\n ipcMain.on('__log_batch', (_event, rawPayload) => {\n const result = dispatchRendererLogBatch(rawPayload);\n if (!result.ok) {\n logger.warn('renderer log batch rejected', {\n reason: result.reason ?? null,\n errorMessage: result.errorMessage ?? null,\n });\n }\n });\n\n logger.info('renderer log bridge registered (fire-and-forget)');\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,58 @@
|
|
|
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 runtime_module_exports = {};
|
|
20
|
+
__export(runtime_module_exports, {
|
|
21
|
+
ControllerResolver: () => import_controller_resolver.ControllerResolver,
|
|
22
|
+
MiddlewareResolver: () => import_middleware_resolver.MiddlewareResolver,
|
|
23
|
+
SchemaValidator: () => import_schema_validator.SchemaValidator,
|
|
24
|
+
WoodRouter: () => import_wood_router.WoodRouter,
|
|
25
|
+
installWoodRuntime: () => installWoodRuntime
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(runtime_module_exports);
|
|
28
|
+
var import_ioc = require("@noego/ioc");
|
|
29
|
+
var import_wood_router = require("../router/wood_router.js");
|
|
30
|
+
var import_schema_validator = require("../validation/schema_validator.js");
|
|
31
|
+
var import_middleware_resolver = require("../middleware/middleware_resolver.js");
|
|
32
|
+
var import_controller_resolver = require("../controller/controller_resolver.js");
|
|
33
|
+
function installWoodRuntime(root, options) {
|
|
34
|
+
if (typeof root.isRegistered !== "function" || typeof root.registerFunction !== "function") {
|
|
35
|
+
throw new Error("Wood runtime requires an explicit IoC root; use createWoodRoot().");
|
|
36
|
+
}
|
|
37
|
+
if (!root.isRegistered(import_schema_validator.SchemaValidator)) root.registerFunction(import_schema_validator.SchemaValidator, () => new import_schema_validator.SchemaValidator());
|
|
38
|
+
if (!root.isRegistered(import_middleware_resolver.MiddlewareResolver)) root.registerFunction(import_middleware_resolver.MiddlewareResolver, () => new import_middleware_resolver.MiddlewareResolver(options.middlewareDir));
|
|
39
|
+
if (!root.isRegistered(import_controller_resolver.ControllerResolver)) root.registerFunction(import_controller_resolver.ControllerResolver, () => new import_controller_resolver.ControllerResolver(options.controllersDir, { mode: options.mode }));
|
|
40
|
+
if (!root.isRegistered(import_wood_router.WoodRouter)) {
|
|
41
|
+
root.registerFunction(import_wood_router.WoodRouter, (validator, middlewareResolver, controllerResolver) => {
|
|
42
|
+
const router = new import_wood_router.WoodRouter({ container: root, ...options, validator, middlewareResolver, controllerResolver });
|
|
43
|
+
options.registerRuntime(router);
|
|
44
|
+
router.validateControllers();
|
|
45
|
+
router.precompileSchemas();
|
|
46
|
+
return router;
|
|
47
|
+
}, { loadAs: import_ioc.LoadAs.Scoped, param: [import_schema_validator.SchemaValidator, import_middleware_resolver.MiddlewareResolver, import_controller_resolver.ControllerResolver] });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
51
|
+
0 && (module.exports = {
|
|
52
|
+
ControllerResolver,
|
|
53
|
+
MiddlewareResolver,
|
|
54
|
+
SchemaValidator,
|
|
55
|
+
WoodRouter,
|
|
56
|
+
installWoodRuntime
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=runtime_module.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/runtime_module.ts"],"sourcesContent":["import { LoadAs, type IContainer } from '@noego/ioc';\nimport { WoodRouter } from '../router/wood_router.js';\nimport { SchemaValidator } from '../validation/schema_validator.js';\nimport { MiddlewareResolver } from '../middleware/middleware_resolver.js';\nimport { ControllerResolver } from '../controller/controller_resolver.js';\n\nexport interface WoodRuntimeModuleOptions {\n controllersDir: string;\n middlewareDir: string;\n mode?: 'bundled' | 'dev';\n registerRuntime(router: WoodRouter): void;\n}\n\n/**\n * Registration-only production module, also installed by testWood before\n * scenario overlays. Resolving WoodRouter starts the selected real pipeline.\n * Existing registrations remain authoritative; token identities are exact.\n */\nexport function installWoodRuntime(root: IContainer, options: WoodRuntimeModuleOptions): void {\n if (typeof root.isRegistered !== 'function' || typeof root.registerFunction !== 'function') {\n throw new Error('Wood runtime requires an explicit IoC root; use createWoodRoot().');\n }\n if (!root.isRegistered(SchemaValidator)) root.registerFunction(SchemaValidator, () => new SchemaValidator());\n if (!root.isRegistered(MiddlewareResolver)) root.registerFunction(MiddlewareResolver, () => new MiddlewareResolver(options.middlewareDir));\n if (!root.isRegistered(ControllerResolver)) root.registerFunction(ControllerResolver, () => new ControllerResolver(options.controllersDir, { mode: options.mode }));\n if (!root.isRegistered(WoodRouter)) {\n root.registerFunction(WoodRouter, (validator: SchemaValidator, middlewareResolver: MiddlewareResolver, controllerResolver: ControllerResolver) => {\n const router = new WoodRouter({ container: root, ...options, validator, middlewareResolver, controllerResolver });\n options.registerRuntime(router);\n router.validateControllers();\n router.precompileSchemas();\n return router;\n }, { loadAs: LoadAs.Scoped, param: [SchemaValidator, MiddlewareResolver, ControllerResolver] });\n }\n}\n\nexport { WoodRouter, SchemaValidator, MiddlewareResolver, ControllerResolver };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAwC;AACxC,yBAA2B;AAC3B,8BAAgC;AAChC,iCAAmC;AACnC,iCAAmC;AAc5B,SAAS,mBAAmB,MAAkB,SAAyC;AAC5F,MAAI,OAAO,KAAK,iBAAiB,cAAc,OAAO,KAAK,qBAAqB,YAAY;AAC1F,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,MAAI,CAAC,KAAK,aAAa,uCAAe,EAAG,MAAK,iBAAiB,yCAAiB,MAAM,IAAI,wCAAgB,CAAC;AAC3G,MAAI,CAAC,KAAK,aAAa,6CAAkB,EAAG,MAAK,iBAAiB,+CAAoB,MAAM,IAAI,8CAAmB,QAAQ,aAAa,CAAC;AACzI,MAAI,CAAC,KAAK,aAAa,6CAAkB,EAAG,MAAK,iBAAiB,+CAAoB,MAAM,IAAI,8CAAmB,QAAQ,gBAAgB,EAAE,MAAM,QAAQ,KAAK,CAAC,CAAC;AAClK,MAAI,CAAC,KAAK,aAAa,6BAAU,GAAG;AAClC,SAAK,iBAAiB,+BAAY,CAAC,WAA4B,oBAAwC,uBAA2C;AAChJ,YAAM,SAAS,IAAI,8BAAW,EAAE,WAAW,MAAM,GAAG,SAAS,WAAW,oBAAoB,mBAAmB,CAAC;AAChH,cAAQ,gBAAgB,MAAM;AAC9B,aAAO,oBAAoB;AAC3B,aAAO,kBAAkB;AACzB,aAAO;AAAA,IACT,GAAG,EAAE,QAAQ,kBAAO,QAAQ,OAAO,CAAC,yCAAiB,+CAAoB,6CAAkB,EAAE,CAAC;AAAA,EAChG;AACF;","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { IContainer } from '@noego/ioc';
|
|
2
|
+
import { WoodRouter } from '../router/wood_router.cjs';
|
|
3
|
+
export { SchemaValidator } from '../validation/schema_validator.cjs';
|
|
4
|
+
export { MiddlewareResolver } from '../middleware/middleware_resolver.cjs';
|
|
5
|
+
export { ControllerResolver } from '../controller/controller_resolver.cjs';
|
|
6
|
+
import '../types/operations.cjs';
|
|
7
|
+
import '../types/context.cjs';
|
|
8
|
+
|
|
9
|
+
interface WoodRuntimeModuleOptions {
|
|
10
|
+
controllersDir: string;
|
|
11
|
+
middlewareDir: string;
|
|
12
|
+
mode?: 'bundled' | 'dev';
|
|
13
|
+
registerRuntime(router: WoodRouter): void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Registration-only production module, also installed by testWood before
|
|
17
|
+
* scenario overlays. Resolving WoodRouter starts the selected real pipeline.
|
|
18
|
+
* Existing registrations remain authoritative; token identities are exact.
|
|
19
|
+
*/
|
|
20
|
+
declare function installWoodRuntime(root: IContainer, options: WoodRuntimeModuleOptions): void;
|
|
21
|
+
|
|
22
|
+
export { WoodRouter, type WoodRuntimeModuleOptions, installWoodRuntime };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { IContainer } from '@noego/ioc';
|
|
2
|
+
import { WoodRouter } from '../router/wood_router.js';
|
|
3
|
+
export { SchemaValidator } from '../validation/schema_validator.js';
|
|
4
|
+
export { MiddlewareResolver } from '../middleware/middleware_resolver.js';
|
|
5
|
+
export { ControllerResolver } from '../controller/controller_resolver.js';
|
|
6
|
+
import '../types/operations.js';
|
|
7
|
+
import '../types/context.js';
|
|
8
|
+
|
|
9
|
+
interface WoodRuntimeModuleOptions {
|
|
10
|
+
controllersDir: string;
|
|
11
|
+
middlewareDir: string;
|
|
12
|
+
mode?: 'bundled' | 'dev';
|
|
13
|
+
registerRuntime(router: WoodRouter): void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Registration-only production module, also installed by testWood before
|
|
17
|
+
* scenario overlays. Resolving WoodRouter starts the selected real pipeline.
|
|
18
|
+
* Existing registrations remain authoritative; token identities are exact.
|
|
19
|
+
*/
|
|
20
|
+
declare function installWoodRuntime(root: IContainer, options: WoodRuntimeModuleOptions): void;
|
|
21
|
+
|
|
22
|
+
export { WoodRouter, type WoodRuntimeModuleOptions, installWoodRuntime };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { LoadAs } from "@noego/ioc";
|
|
2
|
+
import { WoodRouter } from "../router/wood_router.js";
|
|
3
|
+
import { SchemaValidator } from "../validation/schema_validator.js";
|
|
4
|
+
import { MiddlewareResolver } from "../middleware/middleware_resolver.js";
|
|
5
|
+
import { ControllerResolver } from "../controller/controller_resolver.js";
|
|
6
|
+
function installWoodRuntime(root, options) {
|
|
7
|
+
if (typeof root.isRegistered !== "function" || typeof root.registerFunction !== "function") {
|
|
8
|
+
throw new Error("Wood runtime requires an explicit IoC root; use createWoodRoot().");
|
|
9
|
+
}
|
|
10
|
+
if (!root.isRegistered(SchemaValidator)) root.registerFunction(SchemaValidator, () => new SchemaValidator());
|
|
11
|
+
if (!root.isRegistered(MiddlewareResolver)) root.registerFunction(MiddlewareResolver, () => new MiddlewareResolver(options.middlewareDir));
|
|
12
|
+
if (!root.isRegistered(ControllerResolver)) root.registerFunction(ControllerResolver, () => new ControllerResolver(options.controllersDir, { mode: options.mode }));
|
|
13
|
+
if (!root.isRegistered(WoodRouter)) {
|
|
14
|
+
root.registerFunction(WoodRouter, (validator, middlewareResolver, controllerResolver) => {
|
|
15
|
+
const router = new WoodRouter({ container: root, ...options, validator, middlewareResolver, controllerResolver });
|
|
16
|
+
options.registerRuntime(router);
|
|
17
|
+
router.validateControllers();
|
|
18
|
+
router.precompileSchemas();
|
|
19
|
+
return router;
|
|
20
|
+
}, { loadAs: LoadAs.Scoped, param: [SchemaValidator, MiddlewareResolver, ControllerResolver] });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
ControllerResolver,
|
|
25
|
+
MiddlewareResolver,
|
|
26
|
+
SchemaValidator,
|
|
27
|
+
WoodRouter,
|
|
28
|
+
installWoodRuntime
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=runtime_module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/runtime_module.ts"],"sourcesContent":["import { LoadAs, type IContainer } from '@noego/ioc';\nimport { WoodRouter } from '../router/wood_router.js';\nimport { SchemaValidator } from '../validation/schema_validator.js';\nimport { MiddlewareResolver } from '../middleware/middleware_resolver.js';\nimport { ControllerResolver } from '../controller/controller_resolver.js';\n\nexport interface WoodRuntimeModuleOptions {\n controllersDir: string;\n middlewareDir: string;\n mode?: 'bundled' | 'dev';\n registerRuntime(router: WoodRouter): void;\n}\n\n/**\n * Registration-only production module, also installed by testWood before\n * scenario overlays. Resolving WoodRouter starts the selected real pipeline.\n * Existing registrations remain authoritative; token identities are exact.\n */\nexport function installWoodRuntime(root: IContainer, options: WoodRuntimeModuleOptions): void {\n if (typeof root.isRegistered !== 'function' || typeof root.registerFunction !== 'function') {\n throw new Error('Wood runtime requires an explicit IoC root; use createWoodRoot().');\n }\n if (!root.isRegistered(SchemaValidator)) root.registerFunction(SchemaValidator, () => new SchemaValidator());\n if (!root.isRegistered(MiddlewareResolver)) root.registerFunction(MiddlewareResolver, () => new MiddlewareResolver(options.middlewareDir));\n if (!root.isRegistered(ControllerResolver)) root.registerFunction(ControllerResolver, () => new ControllerResolver(options.controllersDir, { mode: options.mode }));\n if (!root.isRegistered(WoodRouter)) {\n root.registerFunction(WoodRouter, (validator: SchemaValidator, middlewareResolver: MiddlewareResolver, controllerResolver: ControllerResolver) => {\n const router = new WoodRouter({ container: root, ...options, validator, middlewareResolver, controllerResolver });\n options.registerRuntime(router);\n router.validateControllers();\n router.precompileSchemas();\n return router;\n }, { loadAs: LoadAs.Scoped, param: [SchemaValidator, MiddlewareResolver, ControllerResolver] });\n }\n}\n\nexport { WoodRouter, SchemaValidator, MiddlewareResolver, ControllerResolver };\n"],"mappings":"AAAA,SAAS,cAA+B;AACxC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AACnC,SAAS,0BAA0B;AAc5B,SAAS,mBAAmB,MAAkB,SAAyC;AAC5F,MAAI,OAAO,KAAK,iBAAiB,cAAc,OAAO,KAAK,qBAAqB,YAAY;AAC1F,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,MAAI,CAAC,KAAK,aAAa,eAAe,EAAG,MAAK,iBAAiB,iBAAiB,MAAM,IAAI,gBAAgB,CAAC;AAC3G,MAAI,CAAC,KAAK,aAAa,kBAAkB,EAAG,MAAK,iBAAiB,oBAAoB,MAAM,IAAI,mBAAmB,QAAQ,aAAa,CAAC;AACzI,MAAI,CAAC,KAAK,aAAa,kBAAkB,EAAG,MAAK,iBAAiB,oBAAoB,MAAM,IAAI,mBAAmB,QAAQ,gBAAgB,EAAE,MAAM,QAAQ,KAAK,CAAC,CAAC;AAClK,MAAI,CAAC,KAAK,aAAa,UAAU,GAAG;AAClC,SAAK,iBAAiB,YAAY,CAAC,WAA4B,oBAAwC,uBAA2C;AAChJ,YAAM,SAAS,IAAI,WAAW,EAAE,WAAW,MAAM,GAAG,SAAS,WAAW,oBAAoB,mBAAmB,CAAC;AAChH,cAAQ,gBAAgB,MAAM;AAC9B,aAAO,oBAAoB;AAC3B,aAAO,kBAAkB;AACzB,aAAO;AAAA,IACT,GAAG,EAAE,QAAQ,OAAO,QAAQ,OAAO,CAAC,iBAAiB,oBAAoB,kBAAkB,EAAE,CAAC;AAAA,EAChG;AACF;","names":[]}
|
|
@@ -10,6 +10,9 @@ import '../tracing/trace_provider.cjs';
|
|
|
10
10
|
import '../router/wood_router.cjs';
|
|
11
11
|
import '../types/operations.cjs';
|
|
12
12
|
import '../types/context.cjs';
|
|
13
|
+
import '../validation/schema_validator.cjs';
|
|
14
|
+
import '../middleware/middleware_resolver.cjs';
|
|
15
|
+
import '../controller/controller_resolver.cjs';
|
|
13
16
|
|
|
14
17
|
interface CreateControllerHarnessOptions<T> {
|
|
15
18
|
controllerClass: new (...args: any[]) => T;
|
|
@@ -10,6 +10,9 @@ import '../tracing/trace_provider.js';
|
|
|
10
10
|
import '../router/wood_router.js';
|
|
11
11
|
import '../types/operations.js';
|
|
12
12
|
import '../types/context.js';
|
|
13
|
+
import '../validation/schema_validator.js';
|
|
14
|
+
import '../middleware/middleware_resolver.js';
|
|
15
|
+
import '../controller/controller_resolver.js';
|
|
13
16
|
|
|
14
17
|
interface CreateControllerHarnessOptions<T> {
|
|
15
18
|
controllerClass: new (...args: any[]) => T;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { WoodRouter } from '../router/wood_router.cjs';
|
|
2
2
|
import '../types/operations.cjs';
|
|
3
3
|
import '../types/context.cjs';
|
|
4
|
+
import '../validation/schema_validator.cjs';
|
|
5
|
+
import '../middleware/middleware_resolver.cjs';
|
|
6
|
+
import '../controller/controller_resolver.cjs';
|
|
4
7
|
|
|
5
8
|
/**
|
|
6
9
|
* An in-process event emitter that replaces Electron's
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { WoodRouter } from '../router/wood_router.js';
|
|
2
2
|
import '../types/operations.js';
|
|
3
3
|
import '../types/context.js';
|
|
4
|
+
import '../validation/schema_validator.js';
|
|
5
|
+
import '../middleware/middleware_resolver.js';
|
|
6
|
+
import '../controller/controller_resolver.js';
|
|
4
7
|
|
|
5
8
|
/**
|
|
6
9
|
* An in-process event emitter that replaces Electron's
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { WoodRouter } from '../router/wood_router.cjs';
|
|
2
2
|
import '../types/operations.cjs';
|
|
3
3
|
import '../types/context.cjs';
|
|
4
|
+
import '../validation/schema_validator.cjs';
|
|
5
|
+
import '../middleware/middleware_resolver.cjs';
|
|
6
|
+
import '../controller/controller_resolver.cjs';
|
|
4
7
|
|
|
5
8
|
interface TestRouterResult {
|
|
6
9
|
router: WoodRouter;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { WoodRouter } from '../router/wood_router.js';
|
|
2
2
|
import '../types/operations.js';
|
|
3
3
|
import '../types/context.js';
|
|
4
|
+
import '../validation/schema_validator.js';
|
|
5
|
+
import '../middleware/middleware_resolver.js';
|
|
6
|
+
import '../controller/controller_resolver.js';
|
|
4
7
|
|
|
5
8
|
interface TestRouterResult {
|
|
6
9
|
router: WoodRouter;
|
package/dist/testing/index.cjs
CHANGED
|
@@ -28,6 +28,7 @@ __export(testing_exports, {
|
|
|
28
28
|
PageCatalogError: () => import_frontend.PageCatalogError,
|
|
29
29
|
RouterBridgeEvents: () => import_create_router_bridge.RouterBridgeEvents,
|
|
30
30
|
TestWoodBuilder: () => import_test_wood_config.TestWoodBuilder,
|
|
31
|
+
TestWoodCleanupError: () => import_registration_only_root.TestWoodCleanupError,
|
|
31
32
|
TestWoodError: () => import_test_wood.TestWoodError,
|
|
32
33
|
TraceRecorder: () => import_trace_testing.TraceRecorder,
|
|
33
34
|
TrackedTransport: () => import_frontend.TrackedTransport,
|
|
@@ -66,6 +67,7 @@ __export(testing_exports, {
|
|
|
66
67
|
module.exports = __toCommonJS(testing_exports);
|
|
67
68
|
var import_test_wood_config = require("./test_wood_config.cjs");
|
|
68
69
|
var import_test_wood = require("./test_wood.cjs");
|
|
70
|
+
var import_registration_only_root = require("./registration_only_root.cjs");
|
|
69
71
|
var import_frontend = require("../frontend/index.cjs");
|
|
70
72
|
var import_create_test_container = require("./create_test_container.js");
|
|
71
73
|
var import_create_controller_harness = require("./create_controller_harness.js");
|
|
@@ -88,6 +90,7 @@ var import_trace_testing = require("../trace-testing/index.js");
|
|
|
88
90
|
PageCatalogError,
|
|
89
91
|
RouterBridgeEvents,
|
|
90
92
|
TestWoodBuilder,
|
|
93
|
+
TestWoodCleanupError,
|
|
91
94
|
TestWoodError,
|
|
92
95
|
TraceRecorder,
|
|
93
96
|
TrackedTransport,
|
|
@@ -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} 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 { 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;AACA,8BAA0C;
|
|
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":[]}
|
package/dist/testing/index.d.cts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export { TestWoodBuilder, TestWoodEnvironment, WoodComposeContext, WoodComposeMain, WoodComposeResult, testWood } from './test_wood_config.cjs';
|
|
1
|
+
export { TestWoodBuilder, TestWoodEnvironment, WoodComposeContext, WoodComposeMain, WoodComposeResult, WoodRootComposer, testWood } from './test_wood_config.cjs';
|
|
2
2
|
export { WoodDomMode, WoodMainSelection, WoodTestSelection } from './wood_test_selection.cjs';
|
|
3
3
|
export { WoodMountedPage, WoodPageHost, WoodRendererHooks } from './wood_env_renderer.cjs';
|
|
4
4
|
export { ModuleImporter } from './wood_config_source.cjs';
|
|
5
5
|
export { TestWoodError, WOOD_FRONTEND_BRIDGE } from './test_wood.cjs';
|
|
6
|
+
export { CleanupFailure, TestWoodCleanupError } from './registration_only_root.cjs';
|
|
6
7
|
export { FrontendWorkError, WorkDescriptor, WorkFailure, WorkRegistry } from '../frontend/work_registry.cjs';
|
|
7
8
|
export { FrontendLifecycle, FrontendLifecycleOwner } from '../frontend/frontend_lifecycle.cjs';
|
|
8
9
|
export { PageCatalog, PageCatalogError, RendererSelection, ViewsSource, pageIdentity, parseViewsSource } from '../frontend/page_catalog.cjs';
|
|
@@ -29,8 +30,12 @@ import '@noego/testing';
|
|
|
29
30
|
import '../router/wood_router.cjs';
|
|
30
31
|
import '../types/operations.cjs';
|
|
31
32
|
import '../types/context.cjs';
|
|
33
|
+
import '../validation/schema_validator.cjs';
|
|
34
|
+
import '../middleware/middleware_resolver.cjs';
|
|
35
|
+
import '../controller/controller_resolver.cjs';
|
|
32
36
|
import '../types/config.cjs';
|
|
33
37
|
import '../types/views.cjs';
|
|
38
|
+
import './wood_dom_animation.cjs';
|
|
34
39
|
import '../navigation/index.cjs';
|
|
35
40
|
import '../navigation/automation_introspection.cjs';
|
|
36
41
|
import 'playwright';
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export { TestWoodBuilder, TestWoodEnvironment, WoodComposeContext, WoodComposeMain, WoodComposeResult, testWood } from './test_wood_config.js';
|
|
1
|
+
export { TestWoodBuilder, TestWoodEnvironment, WoodComposeContext, WoodComposeMain, WoodComposeResult, WoodRootComposer, testWood } from './test_wood_config.js';
|
|
2
2
|
export { WoodDomMode, WoodMainSelection, WoodTestSelection } from './wood_test_selection.js';
|
|
3
3
|
export { WoodMountedPage, WoodPageHost, WoodRendererHooks } from './wood_env_renderer.js';
|
|
4
4
|
export { ModuleImporter } from './wood_config_source.js';
|
|
5
5
|
export { TestWoodError, WOOD_FRONTEND_BRIDGE } from './test_wood.js';
|
|
6
|
+
export { CleanupFailure, TestWoodCleanupError } from './registration_only_root.js';
|
|
6
7
|
export { FrontendWorkError, WorkDescriptor, WorkFailure, WorkRegistry } from '../frontend/work_registry.js';
|
|
7
8
|
export { FrontendLifecycle, FrontendLifecycleOwner } from '../frontend/frontend_lifecycle.js';
|
|
8
9
|
export { PageCatalog, PageCatalogError, RendererSelection, ViewsSource, pageIdentity, parseViewsSource } from '../frontend/page_catalog.js';
|
|
@@ -29,8 +30,12 @@ import '@noego/testing';
|
|
|
29
30
|
import '../router/wood_router.js';
|
|
30
31
|
import '../types/operations.js';
|
|
31
32
|
import '../types/context.js';
|
|
33
|
+
import '../validation/schema_validator.js';
|
|
34
|
+
import '../middleware/middleware_resolver.js';
|
|
35
|
+
import '../controller/controller_resolver.js';
|
|
32
36
|
import '../types/config.js';
|
|
33
37
|
import '../types/views.js';
|
|
38
|
+
import './wood_dom_animation.js';
|
|
34
39
|
import '../navigation/index.js';
|
|
35
40
|
import '../navigation/automation_introspection.js';
|
|
36
41
|
import 'playwright';
|