@noego/wood 0.6.2 → 0.7.1
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 +407 -273
- 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 +416 -271
- 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 +31 -4
- package/dist/testing/wood_env_renderer.cjs.map +1 -1
- package/dist/testing/wood_env_renderer.d.cts +14 -1
- package/dist/testing/wood_env_renderer.d.ts +14 -1
- package/dist/testing/wood_env_renderer.js +31 -4
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/testing/wood_lazy_runtime.ts"],"sourcesContent":["/**\n * Lazy, once-only runtime stages for `testWood(configPath)` environments.\n *\n * `build()` records registrations and installs overlays; the managed router,\n * `compose.start()` and the renderer tier are only initialized on the first\n * explicit use. Concurrent first uses share one initialization; a failed\n * initialization rolls the environment back (through the supplied rollback)\n * and every later use observes the same failure.\n */\nimport { TestWoodError } from './test_wood.js';\n\n/** A value that is initialized on first `acquire()` and readable once live. */\nexport interface LazyValue<T> {\n readonly current: T | null;\n acquire(): Promise<T>;\n}\n\nexport class LazyRuntimeStage<T> implements LazyValue<T> {\n private pending: Promise<T> | null = null;\n /** The bare `init()` attempt, settled (never rejecting) — excludes rollback. */\n private attempt: Promise<void> | null = null;\n private value: T | null = null;\n\n constructor(\n private readonly init: () => Promise<T>,\n private readonly rollback: (error: unknown) => Promise<never>,\n ) {}\n\n /** The initialized value, or null while this stage has not been used yet. */\n get current(): T | null {\n return this.value;\n }\n\n /** True once initialization has been requested (whether or not it finished). */\n get requested(): boolean {\n return this.pending !== null;\n }\n\n /** Initialize exactly once; concurrent callers share the same promise. */\n acquire(): Promise<T> {\n if (!this.pending) {\n const attempt = this.init();\n this.attempt = attempt.then(() => undefined, () => undefined);\n this.pending = attempt.then(\n (value) => {\n this.value = value;\n return value;\n },\n (error) => this.rollback(error),\n );\n }\n return this.pending;\n }\n\n /**\n * Resolves once an in-flight initialization attempt has finished (either\n * way); immediately when none was requested. Deliberately excludes the\n * rollback so a disposer invoked *by* the rollback never waits on itself.\n */\n settled(): Promise<void> {\n return this.attempt ?? Promise.resolve();\n }\n\n /** A derived view over one member of the initialized value. */\n map<U>(project: (value: T) => U): LazyValue<U> {\n const stage = this;\n return {\n get current() {\n return stage.value === null ? null : project(stage.value);\n },\n acquire: async () => project(await stage.acquire()),\n };\n }\n}\n\n/**\n * A member whose runtime is initialized on first use. Async methods listed in\n * `asyncMethods` initialize the runtime and then delegate; every other member\n * delegates once initialized and fails with guidance before that.\n */\nexport function lazyMember<T extends object>(\n label: string,\n value: LazyValue<T>,\n asyncMethods: ReadonlyArray<keyof T & string>,\n hint: string,\n): T {\n const isAsync = (property: PropertyKey): property is keyof T & string =>\n typeof property === 'string' && asyncMethods.includes(property as keyof T & string);\n return new Proxy({} as T, {\n get(_target, property) {\n const live = value.current;\n if (live) {\n const member = Reflect.get(live as object, property, live);\n return typeof member === 'function' ? member.bind(live) : member;\n }\n if (isAsync(property)) {\n return async (...args: unknown[]): Promise<unknown> => {\n const initialized = await value.acquire();\n const method = Reflect.get(initialized as object, property, initialized) as (...a: unknown[]) => unknown;\n return method.apply(initialized, args);\n };\n }\n // Promise resolution and inspection probe these; never treat them as use.\n if (typeof property === 'symbol' || property === 'then' || property === 'constructor') return undefined;\n throw new TestWoodError(\n `${label}.${property} is not available before the runtime is initialized; ${hint}`,\n );\n },\n has(_target, property) {\n const live = value.current;\n return live ? property in (live as object) : isAsync(property);\n },\n });\n}\n"],"mappings":"AASA,SAAS,qBAAqB;AAQvB,MAAM,iBAA4C;AAAA,EAMvD,YACmB,MACA,UACjB;AAFiB;AACA;AAPnB,SAAQ,UAA6B;AAErC;AAAA,SAAQ,UAAgC;AACxC,SAAQ,QAAkB;AAAA,EAKvB;AAAA;AAAA,EAGH,IAAI,UAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,YAAqB;AACvB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA;AAAA,EAGA,UAAsB;AACpB,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,UAAU,KAAK,KAAK;AAC1B,WAAK,UAAU,QAAQ,KAAK,MAAM,QAAW,MAAM,MAAS;AAC5D,WAAK,UAAU,QAAQ;AAAA,QACrB,CAAC,UAAU;AACT,eAAK,QAAQ;AACb,iBAAO;AAAA,QACT;AAAA,QACA,CAAC,UAAU,KAAK,SAAS,KAAK;AAAA,MAChC;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAyB;AACvB,WAAO,KAAK,WAAW,QAAQ,QAAQ;AAAA,EACzC;AAAA;AAAA,EAGA,IAAO,SAAwC;AAC7C,UAAM,QAAQ;AACd,WAAO;AAAA,MACL,IAAI,UAAU;AACZ,eAAO,MAAM,UAAU,OAAO,OAAO,QAAQ,MAAM,KAAK;AAAA,MAC1D;AAAA,MACA,SAAS,YAAY,QAAQ,MAAM,MAAM,QAAQ,CAAC;AAAA,IACpD;AAAA,EACF;AACF;AAOO,SAAS,WACd,OACA,OACA,cACA,MACG;AACH,QAAM,UAAU,CAAC,aACf,OAAO,aAAa,YAAY,aAAa,SAAS,QAA4B;AACpF,SAAO,IAAI,MAAM,CAAC,GAAQ;AAAA,IACxB,IAAI,SAAS,UAAU;AACrB,YAAM,OAAO,MAAM;AACnB,UAAI,MAAM;AACR,cAAM,SAAS,QAAQ,IAAI,MAAgB,UAAU,IAAI;AACzD,eAAO,OAAO,WAAW,aAAa,OAAO,KAAK,IAAI,IAAI;AAAA,MAC5D;AACA,UAAI,QAAQ,QAAQ,GAAG;AACrB,eAAO,UAAU,SAAsC;AACrD,gBAAM,cAAc,MAAM,MAAM,QAAQ;AACxC,gBAAM,SAAS,QAAQ,IAAI,aAAuB,UAAU,WAAW;AACvE,iBAAO,OAAO,MAAM,aAAa,IAAI;AAAA,QACvC;AAAA,MACF;AAEA,UAAI,OAAO,aAAa,YAAY,aAAa,UAAU,aAAa,cAAe,QAAO;AAC9F,YAAM,IAAI;AAAA,QACR,GAAG,KAAK,IAAI,QAAQ,wDAAwD,IAAI;AAAA,MAClF;AAAA,IACF;AAAA,IACA,IAAI,SAAS,UAAU;AACrB,YAAM,OAAO,MAAM;AACnB,aAAO,OAAO,YAAa,OAAkB,QAAQ,QAAQ;AAAA,IAC/D;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -18,77 +18,56 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var wood_test_selection_exports = {};
|
|
20
20
|
__export(wood_test_selection_exports, {
|
|
21
|
+
DECLARED_OWNERS: () => DECLARED_OWNERS,
|
|
22
|
+
hasRendererTier: () => hasRendererTier,
|
|
21
23
|
resolveSelection: () => resolveSelection,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
selectOperations: () => selectOperations,
|
|
25
|
+
selectRendererCatalog: () => selectRendererCatalog,
|
|
26
|
+
selectViews: () => selectViews
|
|
24
27
|
});
|
|
25
28
|
module.exports = __toCommonJS(wood_test_selection_exports);
|
|
29
|
+
var import_testing = require("@noego/testing");
|
|
26
30
|
var import_page_catalog = require("../frontend/page_catalog.js");
|
|
27
31
|
var import_test_wood = require("./test_wood.cjs");
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (value === true) return true;
|
|
31
|
-
if (!value || typeof value !== "object") return false;
|
|
32
|
-
const candidate = value;
|
|
33
|
-
const hasOperation = typeof candidate.operation === "string" && candidate.operation.length > 0;
|
|
34
|
-
const hasModule = typeof candidate.module === "string" && candidate.module.length > 0;
|
|
35
|
-
return hasOperation !== hasModule;
|
|
36
|
-
}
|
|
37
|
-
function isPagesSelection(value) {
|
|
38
|
-
if (value === true) return true;
|
|
39
|
-
return Array.isArray(value) && value.length > 0 && value.every((entry) => typeof entry === "string" && entry.length > 0);
|
|
32
|
+
function hasRendererTier(selection) {
|
|
33
|
+
return selection.renderer !== null;
|
|
40
34
|
}
|
|
35
|
+
const DECLARED_OWNERS = Object.freeze(["main", "renderer"]);
|
|
41
36
|
function resolveSelection(selection) {
|
|
42
|
-
if (!selection || typeof selection !== "object") {
|
|
43
|
-
throw new import_test_wood.TestWoodError("select() requires { main }
|
|
44
|
-
}
|
|
45
|
-
const { main, pages, dom } = selection;
|
|
46
|
-
if (main !== void 0 && !isMainSelection(main)) {
|
|
47
|
-
throw new import_test_wood.TestWoodError("select({ main }) must be true, { operation: string } or { module: string }");
|
|
48
|
-
}
|
|
49
|
-
if (pages !== void 0 && !isPagesSelection(pages)) {
|
|
50
|
-
throw new import_test_wood.TestWoodError("select({ pages }) must be true or a non-empty list of page identities");
|
|
51
|
-
}
|
|
52
|
-
if (dom !== void 0 && !DOM_MODES.includes(dom)) {
|
|
53
|
-
throw new import_test_wood.TestWoodError(`select({ dom }) must be one of: ${DOM_MODES.join(", ")}`);
|
|
54
|
-
}
|
|
55
|
-
if (dom !== void 0 && pages === void 0) {
|
|
56
|
-
throw new import_test_wood.TestWoodError("select({ dom }) requires { pages }: a component needs a page to mount");
|
|
37
|
+
if (!selection || typeof selection !== "object" || Array.isArray(selection)) {
|
|
38
|
+
throw new import_test_wood.TestWoodError("select() requires { main } and/or { renderer }");
|
|
57
39
|
}
|
|
58
|
-
|
|
59
|
-
|
|
40
|
+
const normalized = (0, import_testing.normalizeTestSelection)(selection, DECLARED_OWNERS);
|
|
41
|
+
if (normalized.main === void 0 && normalized.renderer === void 0) {
|
|
42
|
+
throw new import_test_wood.TestWoodError("select() built nothing: add { main } and/or { renderer }");
|
|
60
43
|
}
|
|
61
|
-
return {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return `available operations:
|
|
66
|
-
${[...operations.keys()].join("\n ")}`;
|
|
44
|
+
return Object.freeze({
|
|
45
|
+
main: normalized.main ?? null,
|
|
46
|
+
renderer: normalized.renderer ?? null
|
|
47
|
+
});
|
|
67
48
|
}
|
|
68
49
|
function selectOperations(all, main) {
|
|
69
|
-
if (main ===
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (matched.size) return matched;
|
|
73
|
-
const modules = [...new Set([...all.values()].map((operation) => operation.module).filter(Boolean))];
|
|
74
|
-
throw new import_test_wood.TestWoodError(
|
|
75
|
-
`unknown module "${main.module}"; ` + (modules.length ? `available modules: ${modules.join(", ")}` : "the config defines no modules")
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
const match = all.get(main.operation);
|
|
79
|
-
if (!match) {
|
|
80
|
-
throw new import_test_wood.TestWoodError(`no operation matches "${main.operation}"; ${operationIdentities(all)}`);
|
|
81
|
-
}
|
|
82
|
-
return /* @__PURE__ */ new Map([[main.operation, match]]);
|
|
50
|
+
if (main === null) return /* @__PURE__ */ new Map();
|
|
51
|
+
const source = [...all].map(([path, operation]) => ({ path, module: operation.module, operation }));
|
|
52
|
+
return new Map((0, import_testing.selectSourceEntries)(source, main, { owner: "main", native: true }).map((e) => [e.path, e.operation]));
|
|
83
53
|
}
|
|
84
|
-
function
|
|
54
|
+
function selectViews(views, renderer) {
|
|
85
55
|
const catalog = new import_page_catalog.PageCatalog(views);
|
|
86
|
-
|
|
56
|
+
const source = catalog.all().map((view) => ({ path: (0, import_page_catalog.pageIdentity)(view), module: view.windowName, view }));
|
|
57
|
+
const windows = [...new Set(source.map((entry) => entry.module))];
|
|
58
|
+
const selected = (0, import_testing.selectSourceEntries)(source, renderer, { owner: "renderer", native: true, modules: windows });
|
|
59
|
+
return new import_page_catalog.PageCatalog(selected.map((entry) => entry.view));
|
|
60
|
+
}
|
|
61
|
+
function selectRendererCatalog(views, selection) {
|
|
62
|
+
return selection.renderer !== null ? selectViews(views(), selection.renderer) : null;
|
|
87
63
|
}
|
|
88
64
|
// Annotate the CommonJS export names for ESM import in node:
|
|
89
65
|
0 && (module.exports = {
|
|
66
|
+
DECLARED_OWNERS,
|
|
67
|
+
hasRendererTier,
|
|
90
68
|
resolveSelection,
|
|
91
|
-
|
|
92
|
-
|
|
69
|
+
selectOperations,
|
|
70
|
+
selectRendererCatalog,
|
|
71
|
+
selectViews
|
|
93
72
|
});
|
|
94
73
|
//# sourceMappingURL=wood_test_selection.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/testing/wood_test_selection.ts"],"sourcesContent":["/**\n * `testWood(configPath).select({...})`
|
|
1
|
+
{"version":3,"sources":["../../src/testing/wood_test_selection.ts"],"sourcesContent":["/**\n * Canonical `testWood(configPath).select({...})` source aperture.\n *\n * `main` and `renderer` use the shared @noego/testing OwnerSelection contract:\n * `{ module }`, `{ path }`, or `{}`. An omitted owner is omitted; selecting a\n * renderer never widens main. Browser/DOM hosting is selected separately with\n * `.browser()` / `.browser('happy_dom')`.\n */\nimport type { OperationDef, ViewDef } from '../types/index.cjs';\nimport { normalizeTestSelection, selectSourceEntries, type OwnerSelection } from '@noego/testing';\nimport { PageCatalog, pageIdentity } from '../frontend/page_catalog.js';\nimport { TestWoodError } from './test_wood.cjs';\n\nexport type WoodMainSelection = OwnerSelection;\nexport type WoodRendererSelection = OwnerSelection;\nexport type WoodDomMode = never;\n\nexport interface WoodTestSelection {\n main?: WoodMainSelection;\n renderer?: WoodRendererSelection;\n}\n\nexport interface ResolvedWoodSelection {\n readonly main: WoodMainSelection | null;\n readonly renderer: WoodRendererSelection | null;\n}\n\nexport function hasRendererTier(selection: ResolvedWoodSelection): boolean {\n return selection.renderer !== null;\n}\n\nexport const DECLARED_OWNERS: readonly ('main' | 'renderer')[] = Object.freeze(['main', 'renderer']);\n\nexport function resolveSelection(selection: WoodTestSelection | null): ResolvedWoodSelection {\n if (!selection || typeof selection !== 'object' || Array.isArray(selection)) {\n throw new TestWoodError('select() requires { main } and/or { renderer }');\n }\n const normalized = normalizeTestSelection(selection, DECLARED_OWNERS);\n if (normalized.main === undefined && normalized.renderer === undefined) {\n throw new TestWoodError('select() built nothing: add { main } and/or { renderer }');\n }\n return Object.freeze({\n main: normalized.main ?? null,\n renderer: normalized.renderer ?? null,\n });\n}\n\nexport function selectOperations(\n all: Map<string, OperationDef>,\n main: WoodMainSelection | null,\n): Map<string, OperationDef> {\n if (main === null) return new Map();\n const source = [...all].map(([path, operation]) => ({ path, module: operation.module, operation }));\n return new Map(selectSourceEntries(source, main, { owner: 'main', native: true }).map(e => [e.path, e.operation]));\n}\n\nexport function selectViews(views: ViewDef[], renderer: WoodRendererSelection): PageCatalog {\n const catalog = new PageCatalog(views);\n const source = catalog.all().map((view) => ({ path: pageIdentity(view), module: view.windowName, view }));\n const windows = [...new Set(source.map((entry) => entry.module))];\n const selected = selectSourceEntries(source, renderer, { owner: 'renderer', native: true, modules: windows });\n return new PageCatalog(selected.map((entry) => entry.view));\n}\n\nexport function selectRendererCatalog(views: () => ViewDef[], selection: ResolvedWoodSelection): PageCatalog | null {\n return selection.renderer !== null ? selectViews(views(), selection.renderer) : null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,qBAAiF;AACjF,0BAA0C;AAC1C,uBAA8B;AAgBvB,SAAS,gBAAgB,WAA2C;AACzE,SAAO,UAAU,aAAa;AAChC;AAEO,MAAM,kBAAoD,OAAO,OAAO,CAAC,QAAQ,UAAU,CAAC;AAE5F,SAAS,iBAAiB,WAA4D;AAC3F,MAAI,CAAC,aAAa,OAAO,cAAc,YAAY,MAAM,QAAQ,SAAS,GAAG;AAC3E,UAAM,IAAI,+BAAc,gDAAgD;AAAA,EAC1E;AACA,QAAM,iBAAa,uCAAuB,WAAW,eAAe;AACpE,MAAI,WAAW,SAAS,UAAa,WAAW,aAAa,QAAW;AACtE,UAAM,IAAI,+BAAc,0DAA0D;AAAA,EACpF;AACA,SAAO,OAAO,OAAO;AAAA,IACnB,MAAM,WAAW,QAAQ;AAAA,IACzB,UAAU,WAAW,YAAY;AAAA,EACnC,CAAC;AACH;AAEO,SAAS,iBACd,KACA,MAC2B;AAC3B,MAAI,SAAS,KAAM,QAAO,oBAAI,IAAI;AAClC,QAAM,SAAS,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,SAAS,OAAO,EAAE,MAAM,QAAQ,UAAU,QAAQ,UAAU,EAAE;AAClG,SAAO,IAAI,QAAI,oCAAoB,QAAQ,MAAM,EAAE,OAAO,QAAQ,QAAQ,KAAK,CAAC,EAAE,IAAI,OAAK,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACnH;AAEO,SAAS,YAAY,OAAkB,UAA8C;AAC1F,QAAM,UAAU,IAAI,gCAAY,KAAK;AACrC,QAAM,SAAS,QAAQ,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,UAAM,kCAAa,IAAI,GAAG,QAAQ,KAAK,YAAY,KAAK,EAAE;AACxG,QAAM,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,MAAM,CAAC,CAAC;AAChE,QAAM,eAAW,oCAAoB,QAAQ,UAAU,EAAE,OAAO,YAAY,QAAQ,MAAM,SAAS,QAAQ,CAAC;AAC5G,SAAO,IAAI,gCAAY,SAAS,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAC5D;AAEO,SAAS,sBAAsB,OAAwB,WAAsD;AAClH,SAAO,UAAU,aAAa,OAAO,YAAY,MAAM,GAAG,UAAU,QAAQ,IAAI;AAClF;","names":[]}
|
|
@@ -1,39 +1,33 @@
|
|
|
1
1
|
import { OperationDef } from '../types/operations.cjs';
|
|
2
2
|
import { ViewDef } from '../types/views.cjs';
|
|
3
|
+
import { OwnerSelection } from '@noego/testing';
|
|
3
4
|
import { PageCatalog } from '../frontend/page_catalog.cjs';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
|
-
* `testWood(configPath).select({...})`
|
|
7
|
-
* tiers exist and how they are observed:
|
|
7
|
+
* Canonical `testWood(configPath).select({...})` source aperture.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* A key that is absent is not built. `pages` implies `main: true`; `dom`
|
|
14
|
-
* requires `pages`. Nothing opens at build — tests drive `open()`.
|
|
9
|
+
* `main` and `renderer` use the shared @noego/testing OwnerSelection contract:
|
|
10
|
+
* `{ module }`, `{ path }`, or `{}`. An omitted owner is omitted; selecting a
|
|
11
|
+
* renderer never widens main. Browser/DOM hosting is selected separately with
|
|
12
|
+
* `.browser()` / `.browser('happy_dom')`.
|
|
15
13
|
*/
|
|
16
14
|
|
|
17
|
-
type WoodMainSelection =
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
module: string;
|
|
21
|
-
};
|
|
22
|
-
type WoodDomMode = 'happy-dom' | 'chromium';
|
|
15
|
+
type WoodMainSelection = OwnerSelection;
|
|
16
|
+
type WoodRendererSelection = OwnerSelection;
|
|
17
|
+
type WoodDomMode = never;
|
|
23
18
|
interface WoodTestSelection {
|
|
24
19
|
main?: WoodMainSelection;
|
|
25
|
-
|
|
26
|
-
dom?: WoodDomMode;
|
|
20
|
+
renderer?: WoodRendererSelection;
|
|
27
21
|
}
|
|
28
22
|
interface ResolvedWoodSelection {
|
|
29
|
-
readonly main: WoodMainSelection;
|
|
30
|
-
readonly
|
|
31
|
-
readonly dom: WoodDomMode | null;
|
|
23
|
+
readonly main: WoodMainSelection | null;
|
|
24
|
+
readonly renderer: WoodRendererSelection | null;
|
|
32
25
|
}
|
|
26
|
+
declare function hasRendererTier(selection: ResolvedWoodSelection): boolean;
|
|
27
|
+
declare const DECLARED_OWNERS: readonly ('main' | 'renderer')[];
|
|
33
28
|
declare function resolveSelection(selection: WoodTestSelection | null): ResolvedWoodSelection;
|
|
34
|
-
|
|
35
|
-
declare function
|
|
36
|
-
|
|
37
|
-
declare function selectCatalog(views: ViewDef[], pages: true | string[]): PageCatalog;
|
|
29
|
+
declare function selectOperations(all: Map<string, OperationDef>, main: WoodMainSelection | null): Map<string, OperationDef>;
|
|
30
|
+
declare function selectViews(views: ViewDef[], renderer: WoodRendererSelection): PageCatalog;
|
|
31
|
+
declare function selectRendererCatalog(views: () => ViewDef[], selection: ResolvedWoodSelection): PageCatalog | null;
|
|
38
32
|
|
|
39
|
-
export { type ResolvedWoodSelection, type WoodDomMode, type WoodMainSelection, type WoodTestSelection,
|
|
33
|
+
export { DECLARED_OWNERS, type ResolvedWoodSelection, type WoodDomMode, type WoodMainSelection, type WoodRendererSelection, type WoodTestSelection, hasRendererTier, resolveSelection, selectOperations, selectRendererCatalog, selectViews };
|
|
@@ -1,39 +1,33 @@
|
|
|
1
1
|
import { OperationDef } from '../types/operations.js';
|
|
2
2
|
import { ViewDef } from '../types/views.js';
|
|
3
|
+
import { OwnerSelection } from '@noego/testing';
|
|
3
4
|
import { PageCatalog } from '../frontend/page_catalog.js';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
|
-
* `testWood(configPath).select({...})`
|
|
7
|
-
* tiers exist and how they are observed:
|
|
7
|
+
* Canonical `testWood(configPath).select({...})` source aperture.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* A key that is absent is not built. `pages` implies `main: true`; `dom`
|
|
14
|
-
* requires `pages`. Nothing opens at build — tests drive `open()`.
|
|
9
|
+
* `main` and `renderer` use the shared @noego/testing OwnerSelection contract:
|
|
10
|
+
* `{ module }`, `{ path }`, or `{}`. An omitted owner is omitted; selecting a
|
|
11
|
+
* renderer never widens main. Browser/DOM hosting is selected separately with
|
|
12
|
+
* `.browser()` / `.browser('happy_dom')`.
|
|
15
13
|
*/
|
|
16
14
|
|
|
17
|
-
type WoodMainSelection =
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
module: string;
|
|
21
|
-
};
|
|
22
|
-
type WoodDomMode = 'happy-dom' | 'chromium';
|
|
15
|
+
type WoodMainSelection = OwnerSelection;
|
|
16
|
+
type WoodRendererSelection = OwnerSelection;
|
|
17
|
+
type WoodDomMode = never;
|
|
23
18
|
interface WoodTestSelection {
|
|
24
19
|
main?: WoodMainSelection;
|
|
25
|
-
|
|
26
|
-
dom?: WoodDomMode;
|
|
20
|
+
renderer?: WoodRendererSelection;
|
|
27
21
|
}
|
|
28
22
|
interface ResolvedWoodSelection {
|
|
29
|
-
readonly main: WoodMainSelection;
|
|
30
|
-
readonly
|
|
31
|
-
readonly dom: WoodDomMode | null;
|
|
23
|
+
readonly main: WoodMainSelection | null;
|
|
24
|
+
readonly renderer: WoodRendererSelection | null;
|
|
32
25
|
}
|
|
26
|
+
declare function hasRendererTier(selection: ResolvedWoodSelection): boolean;
|
|
27
|
+
declare const DECLARED_OWNERS: readonly ('main' | 'renderer')[];
|
|
33
28
|
declare function resolveSelection(selection: WoodTestSelection | null): ResolvedWoodSelection;
|
|
34
|
-
|
|
35
|
-
declare function
|
|
36
|
-
|
|
37
|
-
declare function selectCatalog(views: ViewDef[], pages: true | string[]): PageCatalog;
|
|
29
|
+
declare function selectOperations(all: Map<string, OperationDef>, main: WoodMainSelection | null): Map<string, OperationDef>;
|
|
30
|
+
declare function selectViews(views: ViewDef[], renderer: WoodRendererSelection): PageCatalog;
|
|
31
|
+
declare function selectRendererCatalog(views: () => ViewDef[], selection: ResolvedWoodSelection): PageCatalog | null;
|
|
38
32
|
|
|
39
|
-
export { type ResolvedWoodSelection, type WoodDomMode, type WoodMainSelection, type WoodTestSelection,
|
|
33
|
+
export { DECLARED_OWNERS, type ResolvedWoodSelection, type WoodDomMode, type WoodMainSelection, type WoodRendererSelection, type WoodTestSelection, hasRendererTier, resolveSelection, selectOperations, selectRendererCatalog, selectViews };
|
|
@@ -1,68 +1,44 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { normalizeTestSelection, selectSourceEntries } from "@noego/testing";
|
|
2
|
+
import { PageCatalog, pageIdentity } from "../frontend/page_catalog.js";
|
|
2
3
|
import { TestWoodError } from "./test_wood.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
if (value === true) return true;
|
|
6
|
-
if (!value || typeof value !== "object") return false;
|
|
7
|
-
const candidate = value;
|
|
8
|
-
const hasOperation = typeof candidate.operation === "string" && candidate.operation.length > 0;
|
|
9
|
-
const hasModule = typeof candidate.module === "string" && candidate.module.length > 0;
|
|
10
|
-
return hasOperation !== hasModule;
|
|
11
|
-
}
|
|
12
|
-
function isPagesSelection(value) {
|
|
13
|
-
if (value === true) return true;
|
|
14
|
-
return Array.isArray(value) && value.length > 0 && value.every((entry) => typeof entry === "string" && entry.length > 0);
|
|
4
|
+
function hasRendererTier(selection) {
|
|
5
|
+
return selection.renderer !== null;
|
|
15
6
|
}
|
|
7
|
+
const DECLARED_OWNERS = Object.freeze(["main", "renderer"]);
|
|
16
8
|
function resolveSelection(selection) {
|
|
17
|
-
if (!selection || typeof selection !== "object") {
|
|
18
|
-
throw new TestWoodError("select() requires { main }
|
|
19
|
-
}
|
|
20
|
-
const { main, pages, dom } = selection;
|
|
21
|
-
if (main !== void 0 && !isMainSelection(main)) {
|
|
22
|
-
throw new TestWoodError("select({ main }) must be true, { operation: string } or { module: string }");
|
|
23
|
-
}
|
|
24
|
-
if (pages !== void 0 && !isPagesSelection(pages)) {
|
|
25
|
-
throw new TestWoodError("select({ pages }) must be true or a non-empty list of page identities");
|
|
26
|
-
}
|
|
27
|
-
if (dom !== void 0 && !DOM_MODES.includes(dom)) {
|
|
28
|
-
throw new TestWoodError(`select({ dom }) must be one of: ${DOM_MODES.join(", ")}`);
|
|
29
|
-
}
|
|
30
|
-
if (dom !== void 0 && pages === void 0) {
|
|
31
|
-
throw new TestWoodError("select({ dom }) requires { pages }: a component needs a page to mount");
|
|
9
|
+
if (!selection || typeof selection !== "object" || Array.isArray(selection)) {
|
|
10
|
+
throw new TestWoodError("select() requires { main } and/or { renderer }");
|
|
32
11
|
}
|
|
33
|
-
|
|
34
|
-
|
|
12
|
+
const normalized = normalizeTestSelection(selection, DECLARED_OWNERS);
|
|
13
|
+
if (normalized.main === void 0 && normalized.renderer === void 0) {
|
|
14
|
+
throw new TestWoodError("select() built nothing: add { main } and/or { renderer }");
|
|
35
15
|
}
|
|
36
|
-
return {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return `available operations:
|
|
41
|
-
${[...operations.keys()].join("\n ")}`;
|
|
16
|
+
return Object.freeze({
|
|
17
|
+
main: normalized.main ?? null,
|
|
18
|
+
renderer: normalized.renderer ?? null
|
|
19
|
+
});
|
|
42
20
|
}
|
|
43
21
|
function selectOperations(all, main) {
|
|
44
|
-
if (main ===
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
if (matched.size) return matched;
|
|
48
|
-
const modules = [...new Set([...all.values()].map((operation) => operation.module).filter(Boolean))];
|
|
49
|
-
throw new TestWoodError(
|
|
50
|
-
`unknown module "${main.module}"; ` + (modules.length ? `available modules: ${modules.join(", ")}` : "the config defines no modules")
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
const match = all.get(main.operation);
|
|
54
|
-
if (!match) {
|
|
55
|
-
throw new TestWoodError(`no operation matches "${main.operation}"; ${operationIdentities(all)}`);
|
|
56
|
-
}
|
|
57
|
-
return /* @__PURE__ */ new Map([[main.operation, match]]);
|
|
22
|
+
if (main === null) return /* @__PURE__ */ new Map();
|
|
23
|
+
const source = [...all].map(([path, operation]) => ({ path, module: operation.module, operation }));
|
|
24
|
+
return new Map(selectSourceEntries(source, main, { owner: "main", native: true }).map((e) => [e.path, e.operation]));
|
|
58
25
|
}
|
|
59
|
-
function
|
|
26
|
+
function selectViews(views, renderer) {
|
|
60
27
|
const catalog = new PageCatalog(views);
|
|
61
|
-
|
|
28
|
+
const source = catalog.all().map((view) => ({ path: pageIdentity(view), module: view.windowName, view }));
|
|
29
|
+
const windows = [...new Set(source.map((entry) => entry.module))];
|
|
30
|
+
const selected = selectSourceEntries(source, renderer, { owner: "renderer", native: true, modules: windows });
|
|
31
|
+
return new PageCatalog(selected.map((entry) => entry.view));
|
|
32
|
+
}
|
|
33
|
+
function selectRendererCatalog(views, selection) {
|
|
34
|
+
return selection.renderer !== null ? selectViews(views(), selection.renderer) : null;
|
|
62
35
|
}
|
|
63
36
|
export {
|
|
37
|
+
DECLARED_OWNERS,
|
|
38
|
+
hasRendererTier,
|
|
64
39
|
resolveSelection,
|
|
65
|
-
|
|
66
|
-
|
|
40
|
+
selectOperations,
|
|
41
|
+
selectRendererCatalog,
|
|
42
|
+
selectViews
|
|
67
43
|
};
|
|
68
44
|
//# sourceMappingURL=wood_test_selection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/testing/wood_test_selection.ts"],"sourcesContent":["/**\n * `testWood(configPath).select({...})`
|
|
1
|
+
{"version":3,"sources":["../../src/testing/wood_test_selection.ts"],"sourcesContent":["/**\n * Canonical `testWood(configPath).select({...})` source aperture.\n *\n * `main` and `renderer` use the shared @noego/testing OwnerSelection contract:\n * `{ module }`, `{ path }`, or `{}`. An omitted owner is omitted; selecting a\n * renderer never widens main. Browser/DOM hosting is selected separately with\n * `.browser()` / `.browser('happy_dom')`.\n */\nimport type { OperationDef, ViewDef } from '../types/index.js';\nimport { normalizeTestSelection, selectSourceEntries, type OwnerSelection } from '@noego/testing';\nimport { PageCatalog, pageIdentity } from '../frontend/page_catalog.js';\nimport { TestWoodError } from './test_wood.js';\n\nexport type WoodMainSelection = OwnerSelection;\nexport type WoodRendererSelection = OwnerSelection;\nexport type WoodDomMode = never;\n\nexport interface WoodTestSelection {\n main?: WoodMainSelection;\n renderer?: WoodRendererSelection;\n}\n\nexport interface ResolvedWoodSelection {\n readonly main: WoodMainSelection | null;\n readonly renderer: WoodRendererSelection | null;\n}\n\nexport function hasRendererTier(selection: ResolvedWoodSelection): boolean {\n return selection.renderer !== null;\n}\n\nexport const DECLARED_OWNERS: readonly ('main' | 'renderer')[] = Object.freeze(['main', 'renderer']);\n\nexport function resolveSelection(selection: WoodTestSelection | null): ResolvedWoodSelection {\n if (!selection || typeof selection !== 'object' || Array.isArray(selection)) {\n throw new TestWoodError('select() requires { main } and/or { renderer }');\n }\n const normalized = normalizeTestSelection(selection, DECLARED_OWNERS);\n if (normalized.main === undefined && normalized.renderer === undefined) {\n throw new TestWoodError('select() built nothing: add { main } and/or { renderer }');\n }\n return Object.freeze({\n main: normalized.main ?? null,\n renderer: normalized.renderer ?? null,\n });\n}\n\nexport function selectOperations(\n all: Map<string, OperationDef>,\n main: WoodMainSelection | null,\n): Map<string, OperationDef> {\n if (main === null) return new Map();\n const source = [...all].map(([path, operation]) => ({ path, module: operation.module, operation }));\n return new Map(selectSourceEntries(source, main, { owner: 'main', native: true }).map(e => [e.path, e.operation]));\n}\n\nexport function selectViews(views: ViewDef[], renderer: WoodRendererSelection): PageCatalog {\n const catalog = new PageCatalog(views);\n const source = catalog.all().map((view) => ({ path: pageIdentity(view), module: view.windowName, view }));\n const windows = [...new Set(source.map((entry) => entry.module))];\n const selected = selectSourceEntries(source, renderer, { owner: 'renderer', native: true, modules: windows });\n return new PageCatalog(selected.map((entry) => entry.view));\n}\n\nexport function selectRendererCatalog(views: () => ViewDef[], selection: ResolvedWoodSelection): PageCatalog | null {\n return selection.renderer !== null ? selectViews(views(), selection.renderer) : null;\n}\n"],"mappings":"AASA,SAAS,wBAAwB,2BAAgD;AACjF,SAAS,aAAa,oBAAoB;AAC1C,SAAS,qBAAqB;AAgBvB,SAAS,gBAAgB,WAA2C;AACzE,SAAO,UAAU,aAAa;AAChC;AAEO,MAAM,kBAAoD,OAAO,OAAO,CAAC,QAAQ,UAAU,CAAC;AAE5F,SAAS,iBAAiB,WAA4D;AAC3F,MAAI,CAAC,aAAa,OAAO,cAAc,YAAY,MAAM,QAAQ,SAAS,GAAG;AAC3E,UAAM,IAAI,cAAc,gDAAgD;AAAA,EAC1E;AACA,QAAM,aAAa,uBAAuB,WAAW,eAAe;AACpE,MAAI,WAAW,SAAS,UAAa,WAAW,aAAa,QAAW;AACtE,UAAM,IAAI,cAAc,0DAA0D;AAAA,EACpF;AACA,SAAO,OAAO,OAAO;AAAA,IACnB,MAAM,WAAW,QAAQ;AAAA,IACzB,UAAU,WAAW,YAAY;AAAA,EACnC,CAAC;AACH;AAEO,SAAS,iBACd,KACA,MAC2B;AAC3B,MAAI,SAAS,KAAM,QAAO,oBAAI,IAAI;AAClC,QAAM,SAAS,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,SAAS,OAAO,EAAE,MAAM,QAAQ,UAAU,QAAQ,UAAU,EAAE;AAClG,SAAO,IAAI,IAAI,oBAAoB,QAAQ,MAAM,EAAE,OAAO,QAAQ,QAAQ,KAAK,CAAC,EAAE,IAAI,OAAK,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACnH;AAEO,SAAS,YAAY,OAAkB,UAA8C;AAC1F,QAAM,UAAU,IAAI,YAAY,KAAK;AACrC,QAAM,SAAS,QAAQ,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,aAAa,IAAI,GAAG,QAAQ,KAAK,YAAY,KAAK,EAAE;AACxG,QAAM,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,MAAM,CAAC,CAAC;AAChE,QAAM,WAAW,oBAAoB,QAAQ,UAAU,EAAE,OAAO,YAAY,QAAQ,MAAM,SAAS,QAAQ,CAAC;AAC5G,SAAO,IAAI,YAAY,SAAS,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAC5D;AAEO,SAAS,sBAAsB,OAAwB,WAAsD;AAClH,SAAO,UAAU,aAAa,OAAO,YAAY,MAAM,GAAG,UAAU,QAAQ,IAAI;AAClF;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
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 __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
var testing_api_exports = {};
|
|
16
|
+
module.exports = __toCommonJS(testing_api_exports);
|
|
17
|
+
//# sourceMappingURL=testing-api.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testing-api.ts"],"sourcesContent":["/**\n * Project-augmentable object-shaped operation API exposed by testWood.\n *\n * Wood codegen augments this interface in each application with that\n * application's GeneratedWoodBridge contract.\n */\nexport interface WoodTestApi {}\n\n/**\n * Same operation tree as WoodTestApi, but every leaf accepts unknown input.\n * Use this only when a test intentionally attacks runtime validation with a\n * malformed payload; normal operation calls belong on TestWoodEnvironment.api.\n */\nexport type WoodTestRawApi<T = WoodTestApi> = {\n [K in keyof T]: T[K] extends (...args: infer _Args) => infer _Return\n ? (data?: unknown) => Promise<unknown>\n : T[K] extends object\n ? WoodTestRawApi<T[K]>\n : never;\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-augmentable object-shaped operation API exposed by testWood.
|
|
3
|
+
*
|
|
4
|
+
* Wood codegen augments this interface in each application with that
|
|
5
|
+
* application's GeneratedWoodBridge contract.
|
|
6
|
+
*/
|
|
7
|
+
interface WoodTestApi {
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Same operation tree as WoodTestApi, but every leaf accepts unknown input.
|
|
11
|
+
* Use this only when a test intentionally attacks runtime validation with a
|
|
12
|
+
* malformed payload; normal operation calls belong on TestWoodEnvironment.api.
|
|
13
|
+
*/
|
|
14
|
+
type WoodTestRawApi<T = WoodTestApi> = {
|
|
15
|
+
[K in keyof T]: T[K] extends (...args: infer _Args) => infer _Return ? (data?: unknown) => Promise<unknown> : T[K] extends object ? WoodTestRawApi<T[K]> : never;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export type { WoodTestApi, WoodTestRawApi };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-augmentable object-shaped operation API exposed by testWood.
|
|
3
|
+
*
|
|
4
|
+
* Wood codegen augments this interface in each application with that
|
|
5
|
+
* application's GeneratedWoodBridge contract.
|
|
6
|
+
*/
|
|
7
|
+
interface WoodTestApi {
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Same operation tree as WoodTestApi, but every leaf accepts unknown input.
|
|
11
|
+
* Use this only when a test intentionally attacks runtime validation with a
|
|
12
|
+
* malformed payload; normal operation calls belong on TestWoodEnvironment.api.
|
|
13
|
+
*/
|
|
14
|
+
type WoodTestRawApi<T = WoodTestApi> = {
|
|
15
|
+
[K in keyof T]: T[K] extends (...args: infer _Args) => infer _Return ? (data?: unknown) => Promise<unknown> : T[K] extends object ? WoodTestRawApi<T[K]> : never;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export type { WoodTestApi, WoodTestRawApi };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=testing-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/config.ts"],"sourcesContent":["/** Configuration types for wood.config.yml */\n\n/** Top-level Wood configuration parsed from wood.config.yml */\nexport interface WoodConfig {\n root: string;\n outDir: string;\n app: {\n boot: string;\n watch: string[];\n };\n main: {\n entry: string;\n controllers: string;\n middleware: string;\n openapi: string;\n watch: string[];\n testing?: MainTestingConfig;\n };\n renderer: {\n openapi: string;\n componentDir: string;\n controllers: string;\n entry?: string;\n watch?: string[];\n testing?: RendererTestingConfig;\n };\n windows: Record<string, WindowDef>;\n database?: {\n path: string;\n migrations?: string;\n };\n assets?: string[];\n dev?: DevConfig;\n build?: ElectronBuilderConfig;\n observability?: ObservabilityConfig;\n}\n\n/**\n * Test-composition hooks for the main process (`main.testing`). Only the\n * application can know how its backend composes on a fresh IoC root; the\n * config names the module so `@noego/wood/testing`'s `testWood(configPath)`\n * finds it without any test-site wiring.\n */\nexport interface MainTestingConfig {\n /**\n * Module (config-relative path) whose default export composes the app's\n * backend on the root the test builder hands it. See `WoodComposeMain`\n * in `@noego/wood/testing`.\n */\n compose?: string;\n}\n\n/** Test-composition hooks for the renderer (`renderer.testing`). */\nexport interface RendererTestingConfig {\n /**\n * Module (config-relative path) whose default export mounts a page's real\n * component for a controller under a DOM driver. See `WoodPageHost` in\n * `@noego/wood/testing`.\n */\n host?: string;\n}\n\n/**\n * Renderer→main IPC trace batching policy. Owned here (wood.config.yml) per\n * the NoEgo observability architecture: the generated preload embeds the\n * resolved values but is not the configuration owner, and changing this policy\n * never changes instrumentation call sites or record semantics.\n */\nexport interface RendererTraceBatchingConfig {\n maxQueuedEvents: number;\n maxBatchEvents: number;\n acknowledgementTimeoutMs: number;\n retryLimit: number;\n retryBaseDelayMs: number;\n}\n\nexport interface ObservabilityConfig {\n trace?: {\n rendererToMain?: {\n batching?: RendererTraceBatchingConfig;\n };\n };\n}\n\n/** BrowserWindow definition from the `windows` section of wood.config.yml */\nexport interface WindowDef {\n title: string;\n width: number;\n height: number;\n defaultRoute: string;\n frame?: boolean;\n transparent?: boolean;\n resizable?: boolean;\n alwaysOnTop?: boolean;\n minWidth?: number;\n minHeight?: number;\n maxWidth?: number;\n maxHeight?: number;\n show?: boolean;\n parent?: string;\n modal?: boolean;\n vibrancy?: string;\n backgroundMaterial?: string;\n rememberBounds?: boolean;\n contextMenu?: 'native' | 'custom';\n acceptFirstMouse?: boolean;\n nativeQuitFallback?: boolean;\n titleBarStyle?: 'default' | 'hidden' | 'hiddenInset' | 'customButtonsOnHover';\n trafficLightPosition?: { x: number; y: number };\n titleBarOverlay?: boolean | { color?: string; symbolColor?: string; height?: number };\n}\n\n/** Dev-mode settings from the `dev` section of wood.config.yml */\nexport interface DevConfig {\n port?: number;\n watch?: boolean;\n splitServe?: boolean;\n electronArgs?: string[];\n inspectPort?: number;\n backendInspectPort?: number;\n}\n\n/** Electron-builder packaging configuration from the `build` section */\nexport interface ElectronBuilderConfig {\n appId: string;\n productName: string;\n mac?: Record<string, unknown>;\n win?: Record<string, unknown>;\n linux?: Record<string, unknown>;\n [key: string]: unknown;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/types/config.ts"],"sourcesContent":["/** Configuration types for wood.config.yml */\n\n/** Top-level Wood configuration parsed from wood.config.yml */\nexport interface WoodConfig {\n root: string;\n outDir: string;\n app: {\n boot: string;\n watch: string[];\n };\n main: {\n entry: string;\n controllers: string;\n middleware: string;\n openapi: string;\n watch: string[];\n testing?: MainTestingConfig;\n };\n renderer: {\n openapi: string;\n componentDir: string;\n /** Config-relative global styles for native renderer hosts. */\n css?: string[];\n controllers: string;\n /** Production renderer-root registration module. */\n compose?: string;\n entry?: string;\n watch?: string[];\n testing?: RendererTestingConfig;\n };\n windows: Record<string, WindowDef>;\n database?: {\n path: string;\n migrations?: string;\n };\n assets?: string[];\n dev?: DevConfig;\n build?: ElectronBuilderConfig;\n observability?: ObservabilityConfig;\n}\n\n/**\n * Test-composition hooks for the main process (`main.testing`). Only the\n * application can know how its backend composes on a fresh IoC root; the\n * config names the module so `@noego/wood/testing`'s `testWood(configPath)`\n * finds it without any test-site wiring.\n */\nexport interface MainTestingConfig {\n /**\n * Module (config-relative path) whose default export composes the app's\n * backend on the root the test builder hands it. See `WoodComposeMain`\n * in `@noego/wood/testing`.\n */\n compose?: string;\n}\n\n/** Test-composition hooks for the renderer (`renderer.testing`). */\nexport interface RendererTestingConfig {\n /**\n * Module (config-relative path) whose default export mounts a page's real\n * component for a controller under a DOM driver. See `WoodPageHost` in\n * `@noego/wood/testing`.\n */\n host?: string;\n}\n\n/**\n * Renderer→main IPC trace batching policy. Owned here (wood.config.yml) per\n * the NoEgo observability architecture: the generated preload embeds the\n * resolved values but is not the configuration owner, and changing this policy\n * never changes instrumentation call sites or record semantics.\n */\nexport interface RendererTraceBatchingConfig {\n maxQueuedEvents: number;\n maxBatchEvents: number;\n acknowledgementTimeoutMs: number;\n retryLimit: number;\n retryBaseDelayMs: number;\n}\n\nexport interface ObservabilityConfig {\n trace?: {\n rendererToMain?: {\n batching?: RendererTraceBatchingConfig;\n };\n };\n}\n\n/** BrowserWindow definition from the `windows` section of wood.config.yml */\nexport interface WindowDef {\n title: string;\n width: number;\n height: number;\n defaultRoute: string;\n frame?: boolean;\n transparent?: boolean;\n resizable?: boolean;\n alwaysOnTop?: boolean;\n minWidth?: number;\n minHeight?: number;\n maxWidth?: number;\n maxHeight?: number;\n show?: boolean;\n parent?: string;\n modal?: boolean;\n vibrancy?: string;\n backgroundMaterial?: string;\n rememberBounds?: boolean;\n contextMenu?: 'native' | 'custom';\n acceptFirstMouse?: boolean;\n nativeQuitFallback?: boolean;\n titleBarStyle?: 'default' | 'hidden' | 'hiddenInset' | 'customButtonsOnHover';\n trafficLightPosition?: { x: number; y: number };\n titleBarOverlay?: boolean | { color?: string; symbolColor?: string; height?: number };\n}\n\n/** Dev-mode settings from the `dev` section of wood.config.yml */\nexport interface DevConfig {\n port?: number;\n watch?: boolean;\n splitServe?: boolean;\n electronArgs?: string[];\n inspectPort?: number;\n backendInspectPort?: number;\n}\n\n/** Electron-builder packaging configuration from the `build` section */\nexport interface ElectronBuilderConfig {\n appId: string;\n productName: string;\n mac?: Record<string, unknown>;\n win?: Record<string, unknown>;\n linux?: Record<string, unknown>;\n [key: string]: unknown;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
package/dist/types/config.d.cts
CHANGED
|
@@ -18,7 +18,11 @@ interface WoodConfig {
|
|
|
18
18
|
renderer: {
|
|
19
19
|
openapi: string;
|
|
20
20
|
componentDir: string;
|
|
21
|
+
/** Config-relative global styles for native renderer hosts. */
|
|
22
|
+
css?: string[];
|
|
21
23
|
controllers: string;
|
|
24
|
+
/** Production renderer-root registration module. */
|
|
25
|
+
compose?: string;
|
|
22
26
|
entry?: string;
|
|
23
27
|
watch?: string[];
|
|
24
28
|
testing?: RendererTestingConfig;
|
package/dist/types/config.d.ts
CHANGED
|
@@ -18,7 +18,11 @@ interface WoodConfig {
|
|
|
18
18
|
renderer: {
|
|
19
19
|
openapi: string;
|
|
20
20
|
componentDir: string;
|
|
21
|
+
/** Config-relative global styles for native renderer hosts. */
|
|
22
|
+
css?: string[];
|
|
21
23
|
controllers: string;
|
|
24
|
+
/** Production renderer-root registration module. */
|
|
25
|
+
compose?: string;
|
|
22
26
|
entry?: string;
|
|
23
27
|
watch?: string[];
|
|
24
28
|
testing?: RendererTestingConfig;
|