@noego/wood 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/browser-test-setup.cjs +29 -0
- package/dist/browser-test-setup.cjs.map +1 -0
- package/dist/browser-test-setup.d.cts +8 -0
- package/dist/browser-test-setup.d.ts +8 -0
- package/dist/browser-test-setup.js +9 -0
- package/dist/browser-test-setup.js.map +1 -0
- package/dist/client/global_polyfill.d.cts +1 -0
- package/dist/client/global_polyfill.d.ts +1 -0
- package/dist/client/index.cjs +7 -0
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +7 -4
- package/dist/client/index.d.ts +7 -4
- package/dist/client/index.js +6 -1
- package/dist/client/index.js.map +1 -1
- package/dist/codegen/renderer_app_generator.cjs +97 -24
- package/dist/codegen/renderer_app_generator.cjs.map +1 -1
- package/dist/codegen/renderer_app_generator.js +97 -24
- package/dist/codegen/renderer_app_generator.js.map +1 -1
- package/dist/codegen/type_generator.cjs +9 -0
- package/dist/codegen/type_generator.cjs.map +1 -1
- package/dist/codegen/type_generator.js +9 -0
- package/dist/codegen/type_generator.js.map +1 -1
- package/dist/config/config_parser.cjs +10 -0
- package/dist/config/config_parser.cjs.map +1 -1
- package/dist/config/config_parser.js +10 -0
- package/dist/config/config_parser.js.map +1 -1
- package/dist/fetch.cjs +38 -0
- package/dist/fetch.cjs.map +1 -0
- package/dist/fetch.d.cts +7 -0
- package/dist/fetch.d.ts +7 -0
- package/dist/fetch.js +12 -0
- package/dist/fetch.js.map +1 -0
- package/dist/frontend/frontend_page.cjs +3 -3
- package/dist/frontend/frontend_page.cjs.map +1 -1
- package/dist/frontend/frontend_page.d.cts +1 -1
- package/dist/frontend/frontend_page.d.ts +1 -1
- package/dist/frontend/frontend_page.js +3 -3
- package/dist/frontend/frontend_page.js.map +1 -1
- package/dist/frontend/frontend_surface.cjs +31 -17
- package/dist/frontend/frontend_surface.cjs.map +1 -1
- package/dist/frontend/frontend_surface.d.cts +12 -2
- package/dist/frontend/frontend_surface.d.ts +12 -2
- package/dist/frontend/frontend_surface.js +37 -17
- package/dist/frontend/frontend_surface.js.map +1 -1
- package/dist/frontend/index.d.cts +2 -0
- package/dist/frontend/index.d.ts +2 -0
- package/dist/index.cjs +5 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/loader/index.cjs +19 -2
- package/dist/loader/index.cjs.map +1 -1
- package/dist/loader/index.d.cts +1 -0
- package/dist/loader/index.d.ts +1 -0
- package/dist/loader/index.js +19 -1
- package/dist/loader/index.js.map +1 -1
- package/dist/loader/loader_orchestration.cjs +82 -0
- package/dist/loader/loader_orchestration.cjs.map +1 -0
- package/dist/loader/loader_orchestration.d.cts +66 -0
- package/dist/loader/loader_orchestration.d.ts +66 -0
- package/dist/loader/loader_orchestration.js +51 -0
- package/dist/loader/loader_orchestration.js.map +1 -0
- package/dist/loader/loader_runner.cjs +46 -41
- package/dist/loader/loader_runner.cjs.map +1 -1
- package/dist/loader/loader_runner.d.cts +12 -6
- package/dist/loader/loader_runner.d.ts +12 -6
- package/dist/loader/loader_runner.js +50 -41
- package/dist/loader/loader_runner.js.map +1 -1
- package/dist/native_browser.types-BY2daUOS.d.ts +189 -0
- package/dist/native_browser.types-vWXtE4rM.d.cts +189 -0
- package/dist/navigation/index.cjs +15 -2
- package/dist/navigation/index.cjs.map +1 -1
- package/dist/navigation/index.d.cts +2 -0
- package/dist/navigation/index.d.ts +2 -0
- package/dist/navigation/index.js +8 -1
- package/dist/navigation/index.js.map +1 -1
- package/dist/runtime/get_container.cjs +2 -0
- package/dist/runtime/get_container.cjs.map +1 -1
- package/dist/runtime/get_container.js +2 -0
- package/dist/runtime/get_container.js.map +1 -1
- package/dist/runtime/index.cjs +5 -0
- package/dist/runtime/index.cjs.map +1 -1
- package/dist/runtime/index.d.cts +2 -0
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/runtime_capabilities.cjs +35 -0
- package/dist/runtime/runtime_capabilities.cjs.map +1 -0
- package/dist/runtime/runtime_capabilities.d.cts +6 -0
- package/dist/runtime/runtime_capabilities.d.ts +6 -0
- package/dist/runtime/runtime_capabilities.js +11 -0
- package/dist/runtime/runtime_capabilities.js.map +1 -0
- package/dist/runtime/runtime_module.cjs +2 -0
- package/dist/runtime/runtime_module.cjs.map +1 -1
- package/dist/runtime/runtime_module.js +2 -0
- package/dist/runtime/runtime_module.js.map +1 -1
- package/dist/test-wood.cjs +150 -0
- package/dist/test-wood.cjs.map +1 -0
- package/dist/test-wood.d.cts +62 -0
- package/dist/test-wood.d.ts +62 -0
- package/dist/test-wood.js +115 -0
- package/dist/test-wood.js.map +1 -0
- package/dist/testing/browser.cjs +92 -163
- package/dist/testing/browser.cjs.map +1 -1
- package/dist/testing/browser.d.cts +14 -13
- package/dist/testing/browser.d.ts +14 -13
- package/dist/testing/browser.js +88 -162
- package/dist/testing/browser.js.map +1 -1
- package/dist/testing/create_controller_harness.d.cts +2 -1
- package/dist/testing/create_controller_harness.d.ts +2 -1
- package/dist/testing/create_router_bridge.cjs +19 -15
- package/dist/testing/create_router_bridge.cjs.map +1 -1
- package/dist/testing/create_router_bridge.d.cts +8 -1
- package/dist/testing/create_router_bridge.d.ts +8 -1
- package/dist/testing/create_router_bridge.js +18 -15
- package/dist/testing/create_router_bridge.js.map +1 -1
- package/dist/testing/index.cjs +12 -4
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +11 -5
- package/dist/testing/index.d.ts +11 -5
- package/dist/testing/index.js +9 -3
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/native_browser/browser_pool.cjs +31 -0
- package/dist/testing/native_browser/browser_pool.cjs.map +1 -0
- package/dist/testing/native_browser/browser_pool.d.cts +1 -0
- package/dist/testing/native_browser/browser_pool.d.ts +1 -0
- package/dist/testing/native_browser/browser_pool.js +6 -0
- package/dist/testing/native_browser/browser_pool.js.map +1 -0
- package/dist/testing/native_browser/happy_dom_tab.cjs +107 -0
- package/dist/testing/native_browser/happy_dom_tab.cjs.map +1 -0
- package/dist/testing/native_browser/happy_dom_tab.d.cts +35 -0
- package/dist/testing/native_browser/happy_dom_tab.d.ts +35 -0
- package/dist/testing/native_browser/happy_dom_tab.js +73 -0
- package/dist/testing/native_browser/happy_dom_tab.js.map +1 -0
- package/dist/testing/native_browser/happy_dom_transfer.cjs +29 -0
- package/dist/testing/native_browser/happy_dom_transfer.cjs.map +1 -0
- package/dist/testing/native_browser/happy_dom_transfer.d.cts +1 -0
- package/dist/testing/native_browser/happy_dom_transfer.d.ts +1 -0
- package/dist/testing/native_browser/happy_dom_transfer.js +5 -0
- package/dist/testing/native_browser/happy_dom_transfer.js.map +1 -0
- package/dist/testing/native_browser/host_transport.cjs +89 -0
- package/dist/testing/native_browser/host_transport.cjs.map +1 -0
- package/dist/testing/native_browser/host_transport.d.cts +44 -0
- package/dist/testing/native_browser/host_transport.d.ts +44 -0
- package/dist/testing/native_browser/host_transport.js +65 -0
- package/dist/testing/native_browser/host_transport.js.map +1 -0
- package/dist/testing/native_browser/native_browser.types.cjs +17 -0
- package/dist/testing/native_browser/native_browser.types.cjs.map +1 -0
- package/dist/testing/native_browser/native_browser.types.d.cts +31 -0
- package/dist/testing/native_browser/native_browser.types.d.ts +31 -0
- package/dist/testing/native_browser/native_browser.types.js +1 -0
- package/dist/testing/native_browser/native_browser.types.js.map +1 -0
- package/dist/testing/native_browser/native_browser_environment.cjs +143 -0
- package/dist/testing/native_browser/native_browser_environment.cjs.map +1 -0
- package/dist/testing/native_browser/native_browser_environment.d.cts +36 -0
- package/dist/testing/native_browser/native_browser_environment.d.ts +36 -0
- package/dist/testing/native_browser/native_browser_environment.js +109 -0
- package/dist/testing/native_browser/native_browser_environment.js.map +1 -0
- package/dist/testing/native_browser/native_browser_lifecycle.cjs +31 -0
- package/dist/testing/native_browser/native_browser_lifecycle.cjs.map +1 -0
- package/dist/testing/native_browser/native_browser_lifecycle.d.cts +1 -0
- package/dist/testing/native_browser/native_browser_lifecycle.d.ts +1 -0
- package/dist/testing/native_browser/native_browser_lifecycle.js +6 -0
- package/dist/testing/native_browser/native_browser_lifecycle.js.map +1 -0
- package/dist/testing/native_browser/playwright_tab.cjs +124 -0
- package/dist/testing/native_browser/playwright_tab.cjs.map +1 -0
- package/dist/testing/native_browser/playwright_tab.d.cts +35 -0
- package/dist/testing/native_browser/playwright_tab.d.ts +35 -0
- package/dist/testing/native_browser/playwright_tab.js +100 -0
- package/dist/testing/native_browser/playwright_tab.js.map +1 -0
- package/dist/testing/native_browser/renderer_compilation.cjs +149 -0
- package/dist/testing/native_browser/renderer_compilation.cjs.map +1 -0
- package/dist/testing/native_browser/renderer_compilation.d.cts +35 -0
- package/dist/testing/native_browser/renderer_compilation.d.ts +35 -0
- package/dist/testing/native_browser/renderer_compilation.js +115 -0
- package/dist/testing/native_browser/renderer_compilation.js.map +1 -0
- package/dist/testing/native_browser/renderer_entry.cjs +148 -0
- package/dist/testing/native_browser/renderer_entry.cjs.map +1 -0
- package/dist/testing/native_browser/renderer_entry.d.cts +13 -0
- package/dist/testing/native_browser/renderer_entry.d.ts +13 -0
- package/dist/testing/native_browser/renderer_entry.js +114 -0
- package/dist/testing/native_browser/renderer_entry.js.map +1 -0
- package/dist/testing/registration_only_root.cjs +61 -5
- package/dist/testing/registration_only_root.cjs.map +1 -1
- package/dist/testing/registration_only_root.d.cts +25 -4
- package/dist/testing/registration_only_root.d.ts +25 -4
- package/dist/testing/registration_only_root.js +60 -5
- package/dist/testing/registration_only_root.js.map +1 -1
- package/dist/testing/runner_importer.cjs +75 -0
- package/dist/testing/runner_importer.cjs.map +1 -0
- package/dist/testing/runner_importer.d.cts +8 -0
- package/dist/testing/runner_importer.d.ts +8 -0
- package/dist/testing/runner_importer.js +41 -0
- package/dist/testing/runner_importer.js.map +1 -0
- package/dist/testing/test_wood_config.cjs +387 -272
- package/dist/testing/test_wood_config.cjs.map +1 -1
- package/dist/testing/test_wood_config.d.cts +18 -123
- package/dist/testing/test_wood_config.d.ts +18 -123
- package/dist/testing/test_wood_config.js +396 -270
- package/dist/testing/test_wood_config.js.map +1 -1
- package/dist/testing/wood_config_source.cjs +12 -0
- package/dist/testing/wood_config_source.cjs.map +1 -1
- package/dist/testing/wood_config_source.d.cts +10 -0
- package/dist/testing/wood_config_source.d.ts +10 -0
- package/dist/testing/wood_config_source.js +12 -0
- package/dist/testing/wood_config_source.js.map +1 -1
- package/dist/testing/wood_env_renderer.cjs +28 -3
- package/dist/testing/wood_env_renderer.cjs.map +1 -1
- package/dist/testing/wood_env_renderer.d.cts +12 -1
- package/dist/testing/wood_env_renderer.d.ts +12 -1
- package/dist/testing/wood_env_renderer.js +28 -3
- package/dist/testing/wood_env_renderer.js.map +1 -1
- package/dist/testing/wood_lazy_runtime.cjs +109 -0
- package/dist/testing/wood_lazy_runtime.cjs.map +1 -0
- package/dist/testing/wood_lazy_runtime.d.cts +36 -0
- package/dist/testing/wood_lazy_runtime.d.ts +36 -0
- package/dist/testing/wood_lazy_runtime.js +84 -0
- package/dist/testing/wood_lazy_runtime.js.map +1 -0
- package/dist/testing/wood_test_selection.cjs +34 -55
- package/dist/testing/wood_test_selection.cjs.map +1 -1
- package/dist/testing/wood_test_selection.d.cts +18 -24
- package/dist/testing/wood_test_selection.d.ts +18 -24
- package/dist/testing/wood_test_selection.js +30 -54
- package/dist/testing/wood_test_selection.js.map +1 -1
- package/dist/testing-api.cjs +17 -0
- package/dist/testing-api.cjs.map +1 -0
- package/dist/testing-api.d.cts +18 -0
- package/dist/testing-api.d.ts +18 -0
- package/dist/testing-api.js +1 -0
- package/dist/testing-api.js.map +1 -0
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.cts +4 -0
- package/dist/types/config.d.ts +4 -0
- package/docs/native-browser-testing.md +164 -0
- package/package.json +31 -5
- package/src/components/NavigationShell.browser.test.ts +10 -10
- package/src/components/NavigationShell.cleanup.browser.test.ts +57 -0
- package/src/components/NavigationShell.scopes.browser.test.ts +5 -5
- package/src/components/NavigationShell.svelte +50 -24
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import '@noego/testing/fetch';
|
|
2
|
+
import 'playwright';
|
|
3
|
+
import 'happy-dom';
|
|
4
|
+
export { h as NativeBrowserInputs, k as NativeBrowserTab, l as NativeRendererAsset, i as NativeRendererBundle, j as NativeRendererRoute, N as NativeWoodPage, a as NativeWoodTestEnvironment, W as WoodBrowserHost, b as WoodBrowserOpenOptions, c as WoodTestEnvironmentFor } from '../../native_browser.types-vWXtE4rM.cjs';
|
|
5
|
+
import '../wood_config_source.cjs';
|
|
6
|
+
import '../../types/views.cjs';
|
|
7
|
+
import '../create_router_bridge.cjs';
|
|
8
|
+
import '../../testing-api.cjs';
|
|
9
|
+
import '@noego/ioc';
|
|
10
|
+
import '@noego/testing';
|
|
11
|
+
import '../../router/wood_router.cjs';
|
|
12
|
+
import '../../types/operations.cjs';
|
|
13
|
+
import '../../types/context.cjs';
|
|
14
|
+
import '../../validation/schema_validator.cjs';
|
|
15
|
+
import '../../middleware/middleware_resolver.cjs';
|
|
16
|
+
import '../../controller/controller_resolver.cjs';
|
|
17
|
+
import '../../types/config.cjs';
|
|
18
|
+
import '../../frontend/frontend_surface.cjs';
|
|
19
|
+
import '../../navigation/index.cjs';
|
|
20
|
+
import '../../navigation/layout_preservation.cjs';
|
|
21
|
+
import '../../navigation/automation_introspection.cjs';
|
|
22
|
+
import '../../loader/loader_orchestration.cjs';
|
|
23
|
+
import '../../frontend/page_catalog.cjs';
|
|
24
|
+
import '../../frontend/work_registry.cjs';
|
|
25
|
+
import '../../frontend/frontend_lifecycle.cjs';
|
|
26
|
+
import '../../frontend/frontend_page.cjs';
|
|
27
|
+
import '../wood_test_selection.cjs';
|
|
28
|
+
import '../wood_env_renderer.cjs';
|
|
29
|
+
import '../wood_dom_animation.cjs';
|
|
30
|
+
import '../registration_only_root.cjs';
|
|
31
|
+
import '../test_wood.cjs';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import '@noego/testing/fetch';
|
|
2
|
+
import 'playwright';
|
|
3
|
+
import 'happy-dom';
|
|
4
|
+
export { h as NativeBrowserInputs, k as NativeBrowserTab, l as NativeRendererAsset, i as NativeRendererBundle, j as NativeRendererRoute, N as NativeWoodPage, a as NativeWoodTestEnvironment, W as WoodBrowserHost, b as WoodBrowserOpenOptions, c as WoodTestEnvironmentFor } from '../../native_browser.types-BY2daUOS.js';
|
|
5
|
+
import '../wood_config_source.js';
|
|
6
|
+
import '../../types/views.js';
|
|
7
|
+
import '../create_router_bridge.js';
|
|
8
|
+
import '../../testing-api.js';
|
|
9
|
+
import '@noego/ioc';
|
|
10
|
+
import '@noego/testing';
|
|
11
|
+
import '../../router/wood_router.js';
|
|
12
|
+
import '../../types/operations.js';
|
|
13
|
+
import '../../types/context.js';
|
|
14
|
+
import '../../validation/schema_validator.js';
|
|
15
|
+
import '../../middleware/middleware_resolver.js';
|
|
16
|
+
import '../../controller/controller_resolver.js';
|
|
17
|
+
import '../../types/config.js';
|
|
18
|
+
import '../../frontend/frontend_surface.js';
|
|
19
|
+
import '../../navigation/index.js';
|
|
20
|
+
import '../../navigation/layout_preservation.js';
|
|
21
|
+
import '../../navigation/automation_introspection.js';
|
|
22
|
+
import '../../loader/loader_orchestration.js';
|
|
23
|
+
import '../../frontend/page_catalog.js';
|
|
24
|
+
import '../../frontend/work_registry.js';
|
|
25
|
+
import '../../frontend/frontend_lifecycle.js';
|
|
26
|
+
import '../../frontend/frontend_page.js';
|
|
27
|
+
import '../wood_test_selection.js';
|
|
28
|
+
import '../wood_env_renderer.js';
|
|
29
|
+
import '../wood_dom_animation.js';
|
|
30
|
+
import '../registration_only_root.js';
|
|
31
|
+
import '../test_wood.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=native_browser.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var native_browser_environment_exports = {};
|
|
30
|
+
__export(native_browser_environment_exports, {
|
|
31
|
+
createNativeBrowserEnvironment: () => createNativeBrowserEnvironment
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(native_browser_environment_exports);
|
|
34
|
+
var import_browser = require("@noego/testing/browser");
|
|
35
|
+
var import_testing = require("@noego/testing");
|
|
36
|
+
var import_wood_router = require("../../router/wood_router.js");
|
|
37
|
+
var import_renderer_compilation = require("./renderer_compilation.js");
|
|
38
|
+
var import_browser_pool = require("./browser_pool.js");
|
|
39
|
+
var import_native_browser_lifecycle = require("./native_browser_lifecycle.js");
|
|
40
|
+
function createNativeBrowserEnvironment(inputs, host) {
|
|
41
|
+
const base = inputs.environment;
|
|
42
|
+
const tabs = [];
|
|
43
|
+
const opening = /* @__PURE__ */ new Set();
|
|
44
|
+
let context = null;
|
|
45
|
+
let browserLease = null;
|
|
46
|
+
let disposed = false;
|
|
47
|
+
let closing = null;
|
|
48
|
+
const assertOpen = () => {
|
|
49
|
+
if (disposed) throw new Error("Wood native browser environment is disposed");
|
|
50
|
+
};
|
|
51
|
+
async function playwrightContext() {
|
|
52
|
+
context ?? (context = (async () => {
|
|
53
|
+
browserLease = await (0, import_browser_pool.acquireNativeBrowser)(inputs.source.configDir);
|
|
54
|
+
try {
|
|
55
|
+
const context2 = await browserLease.browser.newContext({ serviceWorkers: "block" });
|
|
56
|
+
try {
|
|
57
|
+
await (0, import_browser.installBrowserFetch)(context2, inputs.network, "https://wood.test");
|
|
58
|
+
return context2;
|
|
59
|
+
} catch (error) {
|
|
60
|
+
await context2.close();
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
} catch (error) {
|
|
64
|
+
browserLease.release();
|
|
65
|
+
browserLease = null;
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
})());
|
|
69
|
+
return context;
|
|
70
|
+
}
|
|
71
|
+
async function open(page, options = {}) {
|
|
72
|
+
assertOpen();
|
|
73
|
+
if (!inputs.views.some((view) => `${view.windowName}.${view.pageName}` === page)) {
|
|
74
|
+
throw new Error(`renderer page "${page}" is not in the selected aperture; available pages: ${inputs.views.map((view) => `${view.windowName}.${view.pageName}`).join(", ")}`);
|
|
75
|
+
}
|
|
76
|
+
const route = { page, params: { ...options.params }, query: { ...options.query } };
|
|
77
|
+
const pending = (async () => {
|
|
78
|
+
const bundle = await (0, import_renderer_compilation.compileNativeRenderer)(inputs);
|
|
79
|
+
assertOpen();
|
|
80
|
+
await base.get(import_wood_router.WoodRouter);
|
|
81
|
+
assertOpen();
|
|
82
|
+
const tab = host === "happy_dom" ? await (await import("./happy_dom_tab.js")).openHappyDomTab(inputs, bundle, route) : await (await import("./playwright_tab.js")).openPlaywrightTab(inputs, await playwrightContext(), bundle, route);
|
|
83
|
+
tabs.push(tab);
|
|
84
|
+
assertOpen();
|
|
85
|
+
return tab.native;
|
|
86
|
+
})();
|
|
87
|
+
opening.add(pending);
|
|
88
|
+
try {
|
|
89
|
+
return await pending;
|
|
90
|
+
} finally {
|
|
91
|
+
opening.delete(pending);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
browserHost: host,
|
|
96
|
+
root: base.root,
|
|
97
|
+
router: base.router,
|
|
98
|
+
operations: base.operations,
|
|
99
|
+
api: base.api,
|
|
100
|
+
rawApi: base.rawApi,
|
|
101
|
+
get: base.get,
|
|
102
|
+
controller: base.controller,
|
|
103
|
+
get events() {
|
|
104
|
+
return inputs.events();
|
|
105
|
+
},
|
|
106
|
+
open,
|
|
107
|
+
async settle() {
|
|
108
|
+
if (disposed) {
|
|
109
|
+
await closing;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
await Promise.all([...opening]);
|
|
113
|
+
for (const tab of tabs) await tab.flush();
|
|
114
|
+
await inputs.network.settle();
|
|
115
|
+
await base.settle();
|
|
116
|
+
for (const tab of tabs) await tab.flush();
|
|
117
|
+
},
|
|
118
|
+
verify: base.verify,
|
|
119
|
+
dispose() {
|
|
120
|
+
disposed = true;
|
|
121
|
+
closing ?? (closing = (async () => {
|
|
122
|
+
await Promise.allSettled([...opening]);
|
|
123
|
+
await (0, import_native_browser_lifecycle.disposeNativeResources)("Wood native environment cleanup failed", [
|
|
124
|
+
...[...tabs].reverse().map((tab) => () => tab.dispose()),
|
|
125
|
+
async () => {
|
|
126
|
+
if (context) await (await context.catch(() => null))?.close();
|
|
127
|
+
},
|
|
128
|
+
() => browserLease?.release(),
|
|
129
|
+
() => base.dispose(),
|
|
130
|
+
() => inputs.events().clear()
|
|
131
|
+
]);
|
|
132
|
+
})());
|
|
133
|
+
return closing;
|
|
134
|
+
},
|
|
135
|
+
// test.* observation/verification continues to see the real main environment.
|
|
136
|
+
...{ [import_testing.ENV_REGISTRY]: base[import_testing.ENV_REGISTRY] }
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
140
|
+
0 && (module.exports = {
|
|
141
|
+
createNativeBrowserEnvironment
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=native_browser_environment.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/native_browser/native_browser_environment.ts"],"sourcesContent":["import { installBrowserFetch } from '@noego/testing/browser';\nimport type { BrowserContext } from 'playwright';\nimport { ENV_REGISTRY } from '@noego/testing';\nimport { WoodRouter } from '../../router/wood_router.js';\nimport { compileNativeRenderer } from './renderer_compilation.js';\nimport { acquireNativeBrowser } from './browser_pool.js';\nimport { disposeNativeResources } from './native_browser_lifecycle.js';\nimport type {\n NativeBrowserInputs, NativeBrowserTab, NativeWoodPage, NativeWoodTestEnvironment,\n WoodBrowserHost, WoodBrowserOpenOptions,\n} from './native_browser.types.js';\n\n/** Attach only host ownership. No renderer/test-library objects are wrapped. */\nexport function createNativeBrowserEnvironment<H extends WoodBrowserHost>(\n inputs: NativeBrowserInputs, host: H,\n): NativeWoodTestEnvironment<H> {\n const base = inputs.environment;\n const tabs: NativeBrowserTab[] = [];\n const opening = new Set<Promise<unknown>>();\n let context: Promise<BrowserContext> | null = null;\n let browserLease: Awaited<ReturnType<typeof acquireNativeBrowser>> | null = null;\n let disposed = false;\n let closing: Promise<void> | null = null;\n const assertOpen = () => { if (disposed) throw new Error('Wood native browser environment is disposed'); };\n\n async function playwrightContext(): Promise<BrowserContext> {\n context ??= (async () => {\n browserLease = await acquireNativeBrowser(inputs.source.configDir);\n try {\n const context = await browserLease.browser.newContext({serviceWorkers: 'block'});\n try { await installBrowserFetch(context, inputs.network, 'https://wood.test'); return context; }\n catch (error) { await context.close(); throw error; }\n }\n catch (error) {browserLease.release(); browserLease = null; throw error;}\n })();\n return context;\n }\n\n async function open(page: string, options: WoodBrowserOpenOptions = {}): Promise<NativeWoodPage<H>> {\n assertOpen();\n if (!inputs.views.some(view => `${view.windowName}.${view.pageName}` === page)) {\n throw new Error(`renderer page \"${page}\" is not in the selected aperture; available pages: ${inputs.views.map(view => `${view.windowName}.${view.pageName}`).join(', ')}`);\n }\n const route = {page, params: {...options.params}, query: {...options.query}};\n const pending = (async () => {\n const bundle = await compileNativeRenderer(inputs);\n assertOpen();\n // Acquire the production main graph once, before any page can invoke it.\n await base.get(WoodRouter);\n assertOpen();\n const tab = host === 'happy_dom'\n ? await (await import('./happy_dom_tab.js')).openHappyDomTab(inputs, bundle, route)\n : await (await import('./playwright_tab.js')).openPlaywrightTab(inputs, await playwrightContext(), bundle, route);\n // Enroll before checking disposal: a close racing the mount owns this tab.\n tabs.push(tab);\n assertOpen();\n return tab.native as NativeWoodPage<H>;\n })();\n opening.add(pending);\n try { return await pending; }\n finally { opening.delete(pending); }\n }\n\n return {\n browserHost: host,\n root: base.root,\n router: base.router,\n operations: base.operations,\n api: base.api,\n rawApi: base.rawApi,\n get: base.get,\n controller: base.controller,\n get events() { return inputs.events(); },\n open,\n async settle() {\n if (disposed) { await closing; return; }\n await Promise.all([...opening]);\n for (const tab of tabs) await tab.flush();\n await inputs.network.settle();\n await base.settle();\n for (const tab of tabs) await tab.flush();\n },\n verify: base.verify,\n dispose() {\n disposed = true; // admission fence before awaiting mounts/resources\n closing ??= (async () => {\n await Promise.allSettled([...opening]);\n await disposeNativeResources('Wood native environment cleanup failed', [\n ...[...tabs].reverse().map(tab => () => tab.dispose()),\n async () => { if (context) await (await context.catch(() => null))?.close(); },\n () => browserLease?.release(),\n () => base.dispose(),\n () => inputs.events().clear(),\n ]);\n })();\n return closing;\n },\n // test.* observation/verification continues to see the real main environment.\n ...{[ENV_REGISTRY]: base[ENV_REGISTRY]},\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoC;AAEpC,qBAA6B;AAC7B,yBAA2B;AAC3B,kCAAsC;AACtC,0BAAqC;AACrC,sCAAuC;AAOhC,SAAS,+BACd,QAA6B,MACC;AAC9B,QAAM,OAAO,OAAO;AACpB,QAAM,OAA2B,CAAC;AAClC,QAAM,UAAU,oBAAI,IAAsB;AAC1C,MAAI,UAA0C;AAC9C,MAAI,eAAwE;AAC5E,MAAI,WAAW;AACf,MAAI,UAAgC;AACpC,QAAM,aAAa,MAAM;AAAE,QAAI,SAAU,OAAM,IAAI,MAAM,6CAA6C;AAAA,EAAG;AAEzG,iBAAe,oBAA6C;AAC1D,2BAAa,YAAY;AACvB,qBAAe,UAAM,0CAAqB,OAAO,OAAO,SAAS;AACjE,UAAI;AACF,cAAMA,WAAU,MAAM,aAAa,QAAQ,WAAW,EAAC,gBAAgB,QAAO,CAAC;AAC/E,YAAI;AAAE,oBAAM,oCAAoBA,UAAS,OAAO,SAAS,mBAAmB;AAAG,iBAAOA;AAAA,QAAS,SACxF,OAAO;AAAE,gBAAMA,SAAQ,MAAM;AAAG,gBAAM;AAAA,QAAO;AAAA,MACtD,SACO,OAAO;AAAC,qBAAa,QAAQ;AAAG,uBAAe;AAAM,cAAM;AAAA,MAAM;AAAA,IAC1E,GAAG;AACH,WAAO;AAAA,EACT;AAEA,iBAAe,KAAK,MAAc,UAAkC,CAAC,GAA+B;AAClG,eAAW;AACX,QAAI,CAAC,OAAO,MAAM,KAAK,UAAQ,GAAG,KAAK,UAAU,IAAI,KAAK,QAAQ,OAAO,IAAI,GAAG;AAC9E,YAAM,IAAI,MAAM,kBAAkB,IAAI,uDAAuD,OAAO,MAAM,IAAI,UAAQ,GAAG,KAAK,UAAU,IAAI,KAAK,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IAC3K;AACA,UAAM,QAAQ,EAAC,MAAM,QAAQ,EAAC,GAAG,QAAQ,OAAM,GAAG,OAAO,EAAC,GAAG,QAAQ,MAAK,EAAC;AAC3E,UAAM,WAAW,YAAY;AAC3B,YAAM,SAAS,UAAM,mDAAsB,MAAM;AACjD,iBAAW;AAEX,YAAM,KAAK,IAAI,6BAAU;AACzB,iBAAW;AACX,YAAM,MAAM,SAAS,cACjB,OAAO,MAAM,OAAO,oBAAoB,GAAG,gBAAgB,QAAQ,QAAQ,KAAK,IAChF,OAAO,MAAM,OAAO,qBAAqB,GAAG,kBAAkB,QAAQ,MAAM,kBAAkB,GAAG,QAAQ,KAAK;AAElH,WAAK,KAAK,GAAG;AACb,iBAAW;AACX,aAAO,IAAI;AAAA,IACb,GAAG;AACH,YAAQ,IAAI,OAAO;AACnB,QAAI;AAAE,aAAO,MAAM;AAAA,IAAS,UAC5B;AAAU,cAAQ,OAAO,OAAO;AAAA,IAAG;AAAA,EACrC;AAEA,SAAO;AAAA,IACL,aAAa;AAAA,IACb,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK;AAAA,IACb,YAAY,KAAK;AAAA,IACjB,KAAK,KAAK;AAAA,IACV,QAAQ,KAAK;AAAA,IACb,KAAK,KAAK;AAAA,IACV,YAAY,KAAK;AAAA,IACjB,IAAI,SAAS;AAAE,aAAO,OAAO,OAAO;AAAA,IAAG;AAAA,IACvC;AAAA,IACA,MAAM,SAAS;AACb,UAAI,UAAU;AAAE,cAAM;AAAS;AAAA,MAAQ;AACvC,YAAM,QAAQ,IAAI,CAAC,GAAG,OAAO,CAAC;AAC9B,iBAAW,OAAO,KAAM,OAAM,IAAI,MAAM;AACxC,YAAM,OAAO,QAAQ,OAAO;AAC5B,YAAM,KAAK,OAAO;AAClB,iBAAW,OAAO,KAAM,OAAM,IAAI,MAAM;AAAA,IAC1C;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,UAAU;AACR,iBAAW;AACX,6BAAa,YAAY;AACvB,cAAM,QAAQ,WAAW,CAAC,GAAG,OAAO,CAAC;AACrC,kBAAM,wDAAuB,0CAA0C;AAAA,UACrE,GAAG,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,SAAO,MAAM,IAAI,QAAQ,CAAC;AAAA,UACrD,YAAY;AAAE,gBAAI,QAAS,QAAO,MAAM,QAAQ,MAAM,MAAM,IAAI,IAAI,MAAM;AAAA,UAAG;AAAA,UAC7E,MAAM,cAAc,QAAQ;AAAA,UAC5B,MAAM,KAAK,QAAQ;AAAA,UACnB,MAAM,OAAO,OAAO,EAAE,MAAM;AAAA,QAC9B,CAAC;AAAA,MACH,GAAG;AACH,aAAO;AAAA,IACT;AAAA;AAAA,IAEA,GAAG,EAAC,CAAC,2BAAY,GAAG,KAAK,2BAAY,EAAC;AAAA,EACxC;AACF;","names":["context"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { W as WoodBrowserHost, h as NativeBrowserInputs, a as NativeWoodTestEnvironment } from '../../native_browser.types-vWXtE4rM.cjs';
|
|
2
|
+
import '@noego/testing/fetch';
|
|
3
|
+
import 'playwright';
|
|
4
|
+
import 'happy-dom';
|
|
5
|
+
import '../wood_config_source.cjs';
|
|
6
|
+
import '../../types/config.cjs';
|
|
7
|
+
import '../../types/operations.cjs';
|
|
8
|
+
import '../../types/views.cjs';
|
|
9
|
+
import '../create_router_bridge.cjs';
|
|
10
|
+
import '../../router/wood_router.cjs';
|
|
11
|
+
import '../../types/context.cjs';
|
|
12
|
+
import '../../validation/schema_validator.cjs';
|
|
13
|
+
import '../../middleware/middleware_resolver.cjs';
|
|
14
|
+
import '../../controller/controller_resolver.cjs';
|
|
15
|
+
import '../../testing-api.cjs';
|
|
16
|
+
import '@noego/ioc';
|
|
17
|
+
import '@noego/testing';
|
|
18
|
+
import '../../frontend/frontend_surface.cjs';
|
|
19
|
+
import '../../navigation/index.cjs';
|
|
20
|
+
import '../../navigation/layout_preservation.cjs';
|
|
21
|
+
import '../../navigation/automation_introspection.cjs';
|
|
22
|
+
import '../../loader/loader_orchestration.cjs';
|
|
23
|
+
import '../../frontend/page_catalog.cjs';
|
|
24
|
+
import '../../frontend/work_registry.cjs';
|
|
25
|
+
import '../../frontend/frontend_lifecycle.cjs';
|
|
26
|
+
import '../../frontend/frontend_page.cjs';
|
|
27
|
+
import '../wood_test_selection.cjs';
|
|
28
|
+
import '../wood_env_renderer.cjs';
|
|
29
|
+
import '../wood_dom_animation.cjs';
|
|
30
|
+
import '../registration_only_root.cjs';
|
|
31
|
+
import '../test_wood.cjs';
|
|
32
|
+
|
|
33
|
+
/** Attach only host ownership. No renderer/test-library objects are wrapped. */
|
|
34
|
+
declare function createNativeBrowserEnvironment<H extends WoodBrowserHost>(inputs: NativeBrowserInputs, host: H): NativeWoodTestEnvironment<H>;
|
|
35
|
+
|
|
36
|
+
export { createNativeBrowserEnvironment };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { W as WoodBrowserHost, h as NativeBrowserInputs, a as NativeWoodTestEnvironment } from '../../native_browser.types-BY2daUOS.js';
|
|
2
|
+
import '@noego/testing/fetch';
|
|
3
|
+
import 'playwright';
|
|
4
|
+
import 'happy-dom';
|
|
5
|
+
import '../wood_config_source.js';
|
|
6
|
+
import '../../types/config.js';
|
|
7
|
+
import '../../types/operations.js';
|
|
8
|
+
import '../../types/views.js';
|
|
9
|
+
import '../create_router_bridge.js';
|
|
10
|
+
import '../../router/wood_router.js';
|
|
11
|
+
import '../../types/context.js';
|
|
12
|
+
import '../../validation/schema_validator.js';
|
|
13
|
+
import '../../middleware/middleware_resolver.js';
|
|
14
|
+
import '../../controller/controller_resolver.js';
|
|
15
|
+
import '../../testing-api.js';
|
|
16
|
+
import '@noego/ioc';
|
|
17
|
+
import '@noego/testing';
|
|
18
|
+
import '../../frontend/frontend_surface.js';
|
|
19
|
+
import '../../navigation/index.js';
|
|
20
|
+
import '../../navigation/layout_preservation.js';
|
|
21
|
+
import '../../navigation/automation_introspection.js';
|
|
22
|
+
import '../../loader/loader_orchestration.js';
|
|
23
|
+
import '../../frontend/page_catalog.js';
|
|
24
|
+
import '../../frontend/work_registry.js';
|
|
25
|
+
import '../../frontend/frontend_lifecycle.js';
|
|
26
|
+
import '../../frontend/frontend_page.js';
|
|
27
|
+
import '../wood_test_selection.js';
|
|
28
|
+
import '../wood_env_renderer.js';
|
|
29
|
+
import '../wood_dom_animation.js';
|
|
30
|
+
import '../registration_only_root.js';
|
|
31
|
+
import '../test_wood.js';
|
|
32
|
+
|
|
33
|
+
/** Attach only host ownership. No renderer/test-library objects are wrapped. */
|
|
34
|
+
declare function createNativeBrowserEnvironment<H extends WoodBrowserHost>(inputs: NativeBrowserInputs, host: H): NativeWoodTestEnvironment<H>;
|
|
35
|
+
|
|
36
|
+
export { createNativeBrowserEnvironment };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { installBrowserFetch } from "@noego/testing/browser";
|
|
2
|
+
import { ENV_REGISTRY } from "@noego/testing";
|
|
3
|
+
import { WoodRouter } from "../../router/wood_router.js";
|
|
4
|
+
import { compileNativeRenderer } from "./renderer_compilation.js";
|
|
5
|
+
import { acquireNativeBrowser } from "./browser_pool.js";
|
|
6
|
+
import { disposeNativeResources } from "./native_browser_lifecycle.js";
|
|
7
|
+
function createNativeBrowserEnvironment(inputs, host) {
|
|
8
|
+
const base = inputs.environment;
|
|
9
|
+
const tabs = [];
|
|
10
|
+
const opening = /* @__PURE__ */ new Set();
|
|
11
|
+
let context = null;
|
|
12
|
+
let browserLease = null;
|
|
13
|
+
let disposed = false;
|
|
14
|
+
let closing = null;
|
|
15
|
+
const assertOpen = () => {
|
|
16
|
+
if (disposed) throw new Error("Wood native browser environment is disposed");
|
|
17
|
+
};
|
|
18
|
+
async function playwrightContext() {
|
|
19
|
+
context ?? (context = (async () => {
|
|
20
|
+
browserLease = await acquireNativeBrowser(inputs.source.configDir);
|
|
21
|
+
try {
|
|
22
|
+
const context2 = await browserLease.browser.newContext({ serviceWorkers: "block" });
|
|
23
|
+
try {
|
|
24
|
+
await installBrowserFetch(context2, inputs.network, "https://wood.test");
|
|
25
|
+
return context2;
|
|
26
|
+
} catch (error) {
|
|
27
|
+
await context2.close();
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
} catch (error) {
|
|
31
|
+
browserLease.release();
|
|
32
|
+
browserLease = null;
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
})());
|
|
36
|
+
return context;
|
|
37
|
+
}
|
|
38
|
+
async function open(page, options = {}) {
|
|
39
|
+
assertOpen();
|
|
40
|
+
if (!inputs.views.some((view) => `${view.windowName}.${view.pageName}` === page)) {
|
|
41
|
+
throw new Error(`renderer page "${page}" is not in the selected aperture; available pages: ${inputs.views.map((view) => `${view.windowName}.${view.pageName}`).join(", ")}`);
|
|
42
|
+
}
|
|
43
|
+
const route = { page, params: { ...options.params }, query: { ...options.query } };
|
|
44
|
+
const pending = (async () => {
|
|
45
|
+
const bundle = await compileNativeRenderer(inputs);
|
|
46
|
+
assertOpen();
|
|
47
|
+
await base.get(WoodRouter);
|
|
48
|
+
assertOpen();
|
|
49
|
+
const tab = host === "happy_dom" ? await (await import("./happy_dom_tab.js")).openHappyDomTab(inputs, bundle, route) : await (await import("./playwright_tab.js")).openPlaywrightTab(inputs, await playwrightContext(), bundle, route);
|
|
50
|
+
tabs.push(tab);
|
|
51
|
+
assertOpen();
|
|
52
|
+
return tab.native;
|
|
53
|
+
})();
|
|
54
|
+
opening.add(pending);
|
|
55
|
+
try {
|
|
56
|
+
return await pending;
|
|
57
|
+
} finally {
|
|
58
|
+
opening.delete(pending);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
browserHost: host,
|
|
63
|
+
root: base.root,
|
|
64
|
+
router: base.router,
|
|
65
|
+
operations: base.operations,
|
|
66
|
+
api: base.api,
|
|
67
|
+
rawApi: base.rawApi,
|
|
68
|
+
get: base.get,
|
|
69
|
+
controller: base.controller,
|
|
70
|
+
get events() {
|
|
71
|
+
return inputs.events();
|
|
72
|
+
},
|
|
73
|
+
open,
|
|
74
|
+
async settle() {
|
|
75
|
+
if (disposed) {
|
|
76
|
+
await closing;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
await Promise.all([...opening]);
|
|
80
|
+
for (const tab of tabs) await tab.flush();
|
|
81
|
+
await inputs.network.settle();
|
|
82
|
+
await base.settle();
|
|
83
|
+
for (const tab of tabs) await tab.flush();
|
|
84
|
+
},
|
|
85
|
+
verify: base.verify,
|
|
86
|
+
dispose() {
|
|
87
|
+
disposed = true;
|
|
88
|
+
closing ?? (closing = (async () => {
|
|
89
|
+
await Promise.allSettled([...opening]);
|
|
90
|
+
await disposeNativeResources("Wood native environment cleanup failed", [
|
|
91
|
+
...[...tabs].reverse().map((tab) => () => tab.dispose()),
|
|
92
|
+
async () => {
|
|
93
|
+
if (context) await (await context.catch(() => null))?.close();
|
|
94
|
+
},
|
|
95
|
+
() => browserLease?.release(),
|
|
96
|
+
() => base.dispose(),
|
|
97
|
+
() => inputs.events().clear()
|
|
98
|
+
]);
|
|
99
|
+
})());
|
|
100
|
+
return closing;
|
|
101
|
+
},
|
|
102
|
+
// test.* observation/verification continues to see the real main environment.
|
|
103
|
+
...{ [ENV_REGISTRY]: base[ENV_REGISTRY] }
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
export {
|
|
107
|
+
createNativeBrowserEnvironment
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=native_browser_environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/native_browser/native_browser_environment.ts"],"sourcesContent":["import { installBrowserFetch } from '@noego/testing/browser';\nimport type { BrowserContext } from 'playwright';\nimport { ENV_REGISTRY } from '@noego/testing';\nimport { WoodRouter } from '../../router/wood_router.js';\nimport { compileNativeRenderer } from './renderer_compilation.js';\nimport { acquireNativeBrowser } from './browser_pool.js';\nimport { disposeNativeResources } from './native_browser_lifecycle.js';\nimport type {\n NativeBrowserInputs, NativeBrowserTab, NativeWoodPage, NativeWoodTestEnvironment,\n WoodBrowserHost, WoodBrowserOpenOptions,\n} from './native_browser.types.js';\n\n/** Attach only host ownership. No renderer/test-library objects are wrapped. */\nexport function createNativeBrowserEnvironment<H extends WoodBrowserHost>(\n inputs: NativeBrowserInputs, host: H,\n): NativeWoodTestEnvironment<H> {\n const base = inputs.environment;\n const tabs: NativeBrowserTab[] = [];\n const opening = new Set<Promise<unknown>>();\n let context: Promise<BrowserContext> | null = null;\n let browserLease: Awaited<ReturnType<typeof acquireNativeBrowser>> | null = null;\n let disposed = false;\n let closing: Promise<void> | null = null;\n const assertOpen = () => { if (disposed) throw new Error('Wood native browser environment is disposed'); };\n\n async function playwrightContext(): Promise<BrowserContext> {\n context ??= (async () => {\n browserLease = await acquireNativeBrowser(inputs.source.configDir);\n try {\n const context = await browserLease.browser.newContext({serviceWorkers: 'block'});\n try { await installBrowserFetch(context, inputs.network, 'https://wood.test'); return context; }\n catch (error) { await context.close(); throw error; }\n }\n catch (error) {browserLease.release(); browserLease = null; throw error;}\n })();\n return context;\n }\n\n async function open(page: string, options: WoodBrowserOpenOptions = {}): Promise<NativeWoodPage<H>> {\n assertOpen();\n if (!inputs.views.some(view => `${view.windowName}.${view.pageName}` === page)) {\n throw new Error(`renderer page \"${page}\" is not in the selected aperture; available pages: ${inputs.views.map(view => `${view.windowName}.${view.pageName}`).join(', ')}`);\n }\n const route = {page, params: {...options.params}, query: {...options.query}};\n const pending = (async () => {\n const bundle = await compileNativeRenderer(inputs);\n assertOpen();\n // Acquire the production main graph once, before any page can invoke it.\n await base.get(WoodRouter);\n assertOpen();\n const tab = host === 'happy_dom'\n ? await (await import('./happy_dom_tab.js')).openHappyDomTab(inputs, bundle, route)\n : await (await import('./playwright_tab.js')).openPlaywrightTab(inputs, await playwrightContext(), bundle, route);\n // Enroll before checking disposal: a close racing the mount owns this tab.\n tabs.push(tab);\n assertOpen();\n return tab.native as NativeWoodPage<H>;\n })();\n opening.add(pending);\n try { return await pending; }\n finally { opening.delete(pending); }\n }\n\n return {\n browserHost: host,\n root: base.root,\n router: base.router,\n operations: base.operations,\n api: base.api,\n rawApi: base.rawApi,\n get: base.get,\n controller: base.controller,\n get events() { return inputs.events(); },\n open,\n async settle() {\n if (disposed) { await closing; return; }\n await Promise.all([...opening]);\n for (const tab of tabs) await tab.flush();\n await inputs.network.settle();\n await base.settle();\n for (const tab of tabs) await tab.flush();\n },\n verify: base.verify,\n dispose() {\n disposed = true; // admission fence before awaiting mounts/resources\n closing ??= (async () => {\n await Promise.allSettled([...opening]);\n await disposeNativeResources('Wood native environment cleanup failed', [\n ...[...tabs].reverse().map(tab => () => tab.dispose()),\n async () => { if (context) await (await context.catch(() => null))?.close(); },\n () => browserLease?.release(),\n () => base.dispose(),\n () => inputs.events().clear(),\n ]);\n })();\n return closing;\n },\n // test.* observation/verification continues to see the real main environment.\n ...{[ENV_REGISTRY]: base[ENV_REGISTRY]},\n };\n}\n"],"mappings":"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","names":["context"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var native_browser_lifecycle_exports = {};
|
|
20
|
+
__export(native_browser_lifecycle_exports, {
|
|
21
|
+
disposeNativeResources: () => import_browser.disposeNativeResources,
|
|
22
|
+
hostDeadline: () => import_browser.hostDeadline
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(native_browser_lifecycle_exports);
|
|
25
|
+
var import_browser = require("@noego/testing/browser");
|
|
26
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
27
|
+
0 && (module.exports = {
|
|
28
|
+
disposeNativeResources,
|
|
29
|
+
hostDeadline
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=native_browser_lifecycle.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/native_browser/native_browser_lifecycle.ts"],"sourcesContent":["export { disposeNativeResources, hostDeadline } from '@noego/testing/browser';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAqD;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { disposeNativeResources, hostDeadline } from '@noego/testing/browser';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { disposeNativeResources, hostDeadline } from '@noego/testing/browser';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/native_browser/native_browser_lifecycle.ts"],"sourcesContent":["export { disposeNativeResources, hostDeadline } from '@noego/testing/browser';\n"],"mappings":"AAAA,SAAS,wBAAwB,oBAAoB;","names":[]}
|
|
@@ -0,0 +1,124 @@
|
|
|
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 playwright_tab_exports = {};
|
|
20
|
+
__export(playwright_tab_exports, {
|
|
21
|
+
openPlaywrightTab: () => openPlaywrightTab
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(playwright_tab_exports);
|
|
24
|
+
var import_browser = require("@noego/testing/browser");
|
|
25
|
+
var import_host_transport = require("./host_transport.js");
|
|
26
|
+
var import_native_browser_lifecycle = require("./native_browser_lifecycle.js");
|
|
27
|
+
function requestedAsset(bundle, pathname) {
|
|
28
|
+
const normalized = pathname.replace(/^\/+/, "");
|
|
29
|
+
for (const [fileName, asset] of bundle.assets) {
|
|
30
|
+
if (normalized === fileName || normalized.endsWith("/" + fileName)) return asset;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
async function openPlaywrightTab(inputs, context, bundle, route) {
|
|
35
|
+
const page = await context.newPage();
|
|
36
|
+
const errors = [];
|
|
37
|
+
page.on("pageerror", (error) => errors.push(error.message));
|
|
38
|
+
const transport = (0, import_host_transport.nativeHostTransport)(inputs, (channel, payload) => page.evaluate(({ channel: channel2, payload: payload2 }) => {
|
|
39
|
+
window.__woodNativeEmit(channel2, payload2);
|
|
40
|
+
}, { channel, payload }));
|
|
41
|
+
page.on("framenavigated", (frame) => {
|
|
42
|
+
if (frame === page.mainFrame()) transport.resetSubscriptions();
|
|
43
|
+
});
|
|
44
|
+
page.on("close", () => transport.dispose());
|
|
45
|
+
let closing = null;
|
|
46
|
+
const dispose = () => closing ?? (closing = (0, import_native_browser_lifecycle.disposeNativeResources)("Wood Playwright tab cleanup failed", [
|
|
47
|
+
() => page.isClosed() ? void 0 : (0, import_native_browser_lifecycle.hostDeadline)(page.evaluate(() => window.__woodNativeDispose?.()), "renderer teardown"),
|
|
48
|
+
() => transport.dispose(),
|
|
49
|
+
() => page.isClosed() ? void 0 : (0, import_native_browser_lifecycle.hostDeadline)(transport.flush(), "event drain"),
|
|
50
|
+
() => page.close()
|
|
51
|
+
]));
|
|
52
|
+
try {
|
|
53
|
+
await page.exposeFunction("__woodNativeInvoke", transport.invoke);
|
|
54
|
+
await page.exposeFunction("__woodNativeSubscribe", transport.subscribe);
|
|
55
|
+
await page.exposeFunction("__woodNativeTrace", transport.trace);
|
|
56
|
+
await page.exposeFunction("__woodNativeLog", transport.log);
|
|
57
|
+
await page.addInitScript((input) => {
|
|
58
|
+
window.__woodNativeRoute = input;
|
|
59
|
+
globalThis.global = globalThis;
|
|
60
|
+
}, route);
|
|
61
|
+
const windowConfig = inputs.source.config.windows[route.page.split(".")[0]];
|
|
62
|
+
if (windowConfig) await page.setViewportSize({ width: windowConfig.width, height: windowConfig.height });
|
|
63
|
+
const url = `https://wood.test/${encodeURIComponent(route.page)}`;
|
|
64
|
+
const scriptUrl = `${url}/__wood.js`;
|
|
65
|
+
const cssUrl = `${url}/__wood.css`;
|
|
66
|
+
await page.route("https://wood.test/**", async (intercepted) => {
|
|
67
|
+
const requestUrl = intercepted.request().url();
|
|
68
|
+
if (requestUrl === url) {
|
|
69
|
+
await intercepted.fulfill({
|
|
70
|
+
contentType: "text/html",
|
|
71
|
+
body: `<!doctype html><html><head><meta charset="utf-8"><link rel="stylesheet" href="${cssUrl}"></head><body><div id="app"></div><script src="${scriptUrl}"></script></body></html>`
|
|
72
|
+
});
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (requestUrl === scriptUrl) {
|
|
76
|
+
await intercepted.fulfill({ contentType: "text/javascript", body: bundle.code });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (requestUrl === cssUrl) {
|
|
80
|
+
await intercepted.fulfill({ contentType: "text/css", body: bundle.css });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const asset = requestedAsset(bundle, new URL(requestUrl).pathname);
|
|
84
|
+
if (asset) {
|
|
85
|
+
await intercepted.fulfill({ contentType: (0, import_browser.assetContentType)(asset.fileName), body: Buffer.from(asset.source) });
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
await intercepted.fulfill({ status: 404, contentType: "text/plain", body: "Wood native asset not found" });
|
|
89
|
+
});
|
|
90
|
+
await page.goto(url);
|
|
91
|
+
await (0, import_native_browser_lifecycle.hostDeadline)(page.evaluate(() => window.__woodNativeReady), "initial mount");
|
|
92
|
+
if (errors.length) throw new Error(errors.join("\n"));
|
|
93
|
+
return {
|
|
94
|
+
native: page,
|
|
95
|
+
async flush() {
|
|
96
|
+
if (page.isClosed()) return;
|
|
97
|
+
await (0, import_native_browser_lifecycle.hostDeadline)(page.evaluate(() => window.__woodNativeFlush()), "renderer flush");
|
|
98
|
+
await (0, import_native_browser_lifecycle.hostDeadline)(transport.flush(), "event flush");
|
|
99
|
+
await page.evaluate(() => window.__woodNativeFlush());
|
|
100
|
+
},
|
|
101
|
+
dispose
|
|
102
|
+
};
|
|
103
|
+
} catch (error) {
|
|
104
|
+
let html = "";
|
|
105
|
+
if (!page.isClosed()) {
|
|
106
|
+
try {
|
|
107
|
+
html = (await page.content()).slice(0, 4e3);
|
|
108
|
+
} catch {
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const primary = Object.assign(new Error(`Wood could not open ${route.page}: ${error instanceof Error ? error.message : String(error)}
|
|
112
|
+
${errors.join("\n")}
|
|
113
|
+
${html}`), { cause: error });
|
|
114
|
+
await (0, import_native_browser_lifecycle.disposeNativeResources)("Wood browser open failed", [() => {
|
|
115
|
+
throw primary;
|
|
116
|
+
}, dispose]);
|
|
117
|
+
throw primary;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
121
|
+
0 && (module.exports = {
|
|
122
|
+
openPlaywrightTab
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=playwright_tab.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/native_browser/playwright_tab.ts"],"sourcesContent":["import { assetContentType } from '@noego/testing/browser';\nimport type { BrowserContext } from 'playwright';\nimport type { NativeBrowserInputs, NativeBrowserTab, NativeRendererBundle, NativeRendererRoute } from './native_browser.types.js';\nimport { nativeHostTransport } from './host_transport.js';\nimport { disposeNativeResources, hostDeadline } from './native_browser_lifecycle.js';\n\n\nfunction requestedAsset(bundle: NativeRendererBundle, pathname: string) {\n const normalized = pathname.replace(/^\\/+/, '');\n for (const [fileName, asset] of bundle.assets) {\n if (normalized === fileName || normalized.endsWith('/' + fileName)) return asset;\n }\n return null;\n}\n\nexport async function openPlaywrightTab(\n inputs: NativeBrowserInputs, context: BrowserContext, bundle: NativeRendererBundle, route: NativeRendererRoute,\n): Promise<NativeBrowserTab> {\n const page = await context.newPage();\n const errors: string[] = [];\n page.on('pageerror', error => errors.push(error.message));\n const transport = nativeHostTransport(inputs, (channel, payload) => page.evaluate(({channel, payload}) => {\n (window as any).__woodNativeEmit(channel, payload);\n }, {channel, payload}));\n page.on('framenavigated', frame => {\n if (frame === page.mainFrame()) transport.resetSubscriptions();\n });\n page.on('close', () => transport.dispose());\n let closing: Promise<void> | null = null;\n const dispose = () => closing ??= disposeNativeResources('Wood Playwright tab cleanup failed', [\n () => page.isClosed() ? undefined : hostDeadline(page.evaluate(() => (window as any).__woodNativeDispose?.()), 'renderer teardown'),\n () => transport.dispose(),\n () => page.isClosed() ? undefined : hostDeadline(transport.flush(), 'event drain'),\n () => page.close(),\n ]);\n try {\n await page.exposeFunction('__woodNativeInvoke', transport.invoke);\n await page.exposeFunction('__woodNativeSubscribe', transport.subscribe);\n await page.exposeFunction('__woodNativeTrace', transport.trace);\n await page.exposeFunction('__woodNativeLog', transport.log);\n await page.addInitScript(input => {\n (window as any).__woodNativeRoute = input;\n (globalThis as any).global = globalThis;\n }, route);\n const windowConfig = inputs.source.config.windows[route.page.split('.')[0]!];\n if (windowConfig) await page.setViewportSize({width: windowConfig.width, height: windowConfig.height});\n // A real origin permits native cookies/localStorage. Bundle assets are\n // inlined by Vite library mode; no per-test Vite server or browser launch.\n const url = `https://wood.test/${encodeURIComponent(route.page)}`;\n const scriptUrl = `${url}/__wood.js`;\n const cssUrl = `${url}/__wood.css`;\n await page.route('https://wood.test/**', async intercepted => {\n const requestUrl = intercepted.request().url();\n if (requestUrl === url) {\n await intercepted.fulfill({\n contentType: 'text/html',\n body: `<!doctype html><html><head><meta charset=\"utf-8\"><link rel=\"stylesheet\" href=\"${cssUrl}\"></head><body><div id=\"app\"></div><script src=\"${scriptUrl}\"></script></body></html>`,\n });\n return;\n }\n if (requestUrl === scriptUrl) {\n await intercepted.fulfill({contentType: 'text/javascript', body: bundle.code});\n return;\n }\n if (requestUrl === cssUrl) {\n await intercepted.fulfill({contentType: 'text/css', body: bundle.css});\n return;\n }\n const asset = requestedAsset(bundle, new URL(requestUrl).pathname);\n if (asset) {\n await intercepted.fulfill({contentType: assetContentType(asset.fileName), body: Buffer.from(asset.source)});\n return;\n }\n await intercepted.fulfill({status: 404, contentType: 'text/plain', body: 'Wood native asset not found'});\n });\n await page.goto(url);\n await hostDeadline(page.evaluate(() => (window as any).__woodNativeReady), 'initial mount');\n if (errors.length) throw new Error(errors.join('\\n'));\n return {\n native: page,\n async flush() {\n if (page.isClosed()) return;\n await hostDeadline(page.evaluate(() => (window as any).__woodNativeFlush()), 'renderer flush');\n await hostDeadline(transport.flush(), 'event flush');\n await page.evaluate(() => (window as any).__woodNativeFlush());\n },\n dispose,\n };\n } catch (error) {\n let html = '';\n if (!page.isClosed()) { try {html = (await page.content()).slice(0, 4000);} catch {} }\n const primary = Object.assign(new Error(`Wood could not open ${route.page}: ${error instanceof Error ? error.message : String(error)}\\n${errors.join('\\n')}\\n${html}`), {cause: error});\n await disposeNativeResources('Wood browser open failed', [() => {throw primary;}, dispose]);\n throw primary;\n }\n}\n"],"mappings":"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","names":["channel","payload"]}
|