@react-native-harness/platform-web 1.0.0-alpha.24

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/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Callstack
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,98 @@
1
+ ![harness-banner](https://react-native-harness.dev/harness-banner.jpg)
2
+
3
+ [![mit licence][license-badge]][license]
4
+ [![npm downloads][npm-downloads-badge]][npm-downloads]
5
+ [![Chat][chat-badge]][chat]
6
+ [![PRs Welcome][prs-welcome-badge]][prs-welcome]
7
+
8
+ Web platform for React Native Harness - enables testing on web browsers using Playwright.
9
+
10
+ ## Installation
11
+
12
+ ```bash
13
+ npm install @react-native-harness/platform-web
14
+ # or
15
+ pnpm add @react-native-harness/platform-web
16
+ # or
17
+ yarn add @react-native-harness/platform-web
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ Import the Web platform functions in your `rn-harness.config.mjs`:
23
+
24
+ ```javascript
25
+ import {
26
+ webPlatform,
27
+ chromium,
28
+ chrome,
29
+ firefox,
30
+ webkit,
31
+ } from '@react-native-harness/platform-web';
32
+
33
+ const config = {
34
+ runners: [
35
+ webPlatform({
36
+ name: 'web-chrome',
37
+ browser: chrome('http://localhost:8081/index.html'),
38
+ }),
39
+ webPlatform({
40
+ name: 'web-firefox-headful',
41
+ browser: firefox('http://localhost:8081/index.html', { headless: false }),
42
+ }),
43
+ ],
44
+ // ... other config
45
+ };
46
+
47
+ export default config;
48
+ ```
49
+
50
+ ## API
51
+
52
+ ### `webPlatform(config)`
53
+
54
+ Creates a Web platform runner configuration.
55
+
56
+ **Parameters:**
57
+
58
+ - `config.name` - Unique name for the runner
59
+ - `config.browser` - Browser configuration (created via helper factories)
60
+
61
+ ### Helper Factories
62
+
63
+ #### `chromium(url, options)`
64
+
65
+ #### `chrome(url, options)`
66
+
67
+ #### `firefox(url, options)`
68
+
69
+ #### `webkit(url, options)`
70
+
71
+ Convenience functions for creating browser configurations.
72
+
73
+ **Options:**
74
+
75
+ - `headless` - Whether to run the browser in headless mode (default: `true`)
76
+ - `channel` - Browser channel (e.g., `'chrome'`, `'msedge'`)
77
+ - `executablePath` - Path to a specific browser binary
78
+
79
+ ## Requirements
80
+
81
+ - Browsers installed (handled by Playwright or use system browsers via `channel`)
82
+ - React Native project configured for web (e.g., `react-native-web`)
83
+
84
+ ## Made with ❤️ at Callstack
85
+
86
+ `react-native-harness` is an open source project and will always remain free to use. If you think it's cool, please star it 🌟. [Callstack][callstack-readme-with-love] is a group of React and React Native geeks, contact us at [hello@callstack.com](mailto:hello@callstack.com) if you need any help with these or just want to say hi!
87
+
88
+ Like the project? ⚛️ [Join the team](https://callstack.com/careers/?utm_campaign=Senior_RN&utm_source=github&utm_medium=readme) who does amazing stuff for clients and drives React Native Open Source! 🔥
89
+
90
+ [callstack-readme-with-love]: https://callstack.com/?utm_source=github.com&utm_medium=referral&utm_campaign=react-native-harness&utm_term=readme-with-love
91
+ [license-badge]: https://img.shields.io/npm/l/react-native-harness?style=for-the-badge
92
+ [license]: https://github.com/callstackincubator/react-native-harness/blob/main/LICENSE
93
+ [npm-downloads-badge]: https://img.shields.io/npm/dm/react-native-harness?style=for-the-badge
94
+ [npm-downloads]: https://www.npmjs.com/package/react-native-harness
95
+ [prs-welcome-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=for-the-badge
96
+ [prs-welcome]: ./CONTRIBUTING.md
97
+ [chat-badge]: https://img.shields.io/discord/426714625279524876.svg?style=for-the-badge
98
+ [chat]: https://discord.gg/xgGt7KAjxv
@@ -0,0 +1,63 @@
1
+ import { z } from 'zod';
2
+ export declare const WebBrowserConfigSchema: z.ZodObject<{
3
+ type: z.ZodEnum<["chromium", "firefox", "webkit"]>;
4
+ url: z.ZodString;
5
+ headless: z.ZodDefault<z.ZodBoolean>;
6
+ channel: z.ZodOptional<z.ZodString>;
7
+ executablePath: z.ZodOptional<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ type: "chromium" | "firefox" | "webkit";
10
+ url: string;
11
+ headless: boolean;
12
+ channel?: string | undefined;
13
+ executablePath?: string | undefined;
14
+ }, {
15
+ type: "chromium" | "firefox" | "webkit";
16
+ url: string;
17
+ headless?: boolean | undefined;
18
+ channel?: string | undefined;
19
+ executablePath?: string | undefined;
20
+ }>;
21
+ export declare const WebPlatformConfigSchema: z.ZodObject<{
22
+ name: z.ZodString;
23
+ browser: z.ZodObject<{
24
+ type: z.ZodEnum<["chromium", "firefox", "webkit"]>;
25
+ url: z.ZodString;
26
+ headless: z.ZodDefault<z.ZodBoolean>;
27
+ channel: z.ZodOptional<z.ZodString>;
28
+ executablePath: z.ZodOptional<z.ZodString>;
29
+ }, "strip", z.ZodTypeAny, {
30
+ type: "chromium" | "firefox" | "webkit";
31
+ url: string;
32
+ headless: boolean;
33
+ channel?: string | undefined;
34
+ executablePath?: string | undefined;
35
+ }, {
36
+ type: "chromium" | "firefox" | "webkit";
37
+ url: string;
38
+ headless?: boolean | undefined;
39
+ channel?: string | undefined;
40
+ executablePath?: string | undefined;
41
+ }>;
42
+ }, "strip", z.ZodTypeAny, {
43
+ name: string;
44
+ browser: {
45
+ type: "chromium" | "firefox" | "webkit";
46
+ url: string;
47
+ headless: boolean;
48
+ channel?: string | undefined;
49
+ executablePath?: string | undefined;
50
+ };
51
+ }, {
52
+ name: string;
53
+ browser: {
54
+ type: "chromium" | "firefox" | "webkit";
55
+ url: string;
56
+ headless?: boolean | undefined;
57
+ channel?: string | undefined;
58
+ executablePath?: string | undefined;
59
+ };
60
+ }>;
61
+ export type WebBrowserConfig = z.infer<typeof WebBrowserConfigSchema>;
62
+ export type WebPlatformConfig = z.infer<typeof WebPlatformConfigSchema>;
63
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;EAMjC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGlC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,12 @@
1
+ import { z } from 'zod';
2
+ export const WebBrowserConfigSchema = z.object({
3
+ type: z.enum(['chromium', 'firefox', 'webkit']),
4
+ url: z.string().url('A valid URL is required'),
5
+ headless: z.boolean().default(true),
6
+ channel: z.string().optional(),
7
+ executablePath: z.string().optional(),
8
+ });
9
+ export const WebPlatformConfigSchema = z.object({
10
+ name: z.string().min(1, 'Name is required'),
11
+ browser: WebBrowserConfigSchema,
12
+ });
@@ -0,0 +1,8 @@
1
+ import { HarnessPlatform } from '@react-native-harness/platforms';
2
+ import { type WebPlatformConfig, type WebBrowserConfig } from './config.js';
3
+ export declare const webPlatform: (config: WebPlatformConfig) => HarnessPlatform<WebPlatformConfig>;
4
+ export declare const chromium: (url: string, options?: Partial<Omit<WebBrowserConfig, "type" | "url">>) => WebBrowserConfig;
5
+ export declare const chrome: (url: string, options?: Partial<Omit<WebBrowserConfig, "type" | "url" | "channel">>) => WebBrowserConfig;
6
+ export declare const firefox: (url: string, options?: Partial<Omit<WebBrowserConfig, "type" | "url">>) => WebBrowserConfig;
7
+ export declare const webkit: (url: string, options?: Partial<Omit<WebBrowserConfig, "type" | "url">>) => WebBrowserConfig;
8
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5E,eAAO,MAAM,WAAW,GACtB,QAAQ,iBAAiB,KACxB,eAAe,CAAC,iBAAiB,CAIlC,CAAC;AAEH,eAAO,MAAM,QAAQ,GACnB,KAAK,MAAM,EACX,UAAS,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,KAAK,CAAC,CAAM,KAC5D,gBAKD,CAAC;AAEH,eAAO,MAAM,MAAM,GACjB,KAAK,MAAM,EACX,UAAS,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC,CAAM,KACxE,gBAMD,CAAC;AAEH,eAAO,MAAM,OAAO,GAClB,KAAK,MAAM,EACX,UAAS,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,KAAK,CAAC,CAAM,KAC5D,gBAKD,CAAC;AAEH,eAAO,MAAM,MAAM,GACjB,KAAK,MAAM,EACX,UAAS,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,KAAK,CAAC,CAAM,KAC5D,gBAKD,CAAC"}
@@ -0,0 +1,30 @@
1
+ export const webPlatform = (config) => ({
2
+ name: config.name,
3
+ config,
4
+ runner: import.meta.resolve('./runner.js'),
5
+ });
6
+ export const chromium = (url, options = {}) => ({
7
+ type: 'chromium',
8
+ url,
9
+ headless: true,
10
+ ...options,
11
+ });
12
+ export const chrome = (url, options = {}) => ({
13
+ type: 'chromium',
14
+ channel: 'chrome',
15
+ url,
16
+ headless: true,
17
+ ...options,
18
+ });
19
+ export const firefox = (url, options = {}) => ({
20
+ type: 'firefox',
21
+ url,
22
+ headless: true,
23
+ ...options,
24
+ });
25
+ export const webkit = (url, options = {}) => ({
26
+ type: 'webkit',
27
+ url,
28
+ headless: true,
29
+ ...options,
30
+ });
@@ -0,0 +1,4 @@
1
+ export { webPlatform, chromium, chrome, firefox, webkit } from './factory.js';
2
+ export { getRunTargets } from './targets.js';
3
+ export type { WebPlatformConfig } from './config.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { webPlatform, chromium, chrome, firefox, webkit } from './factory.js';
2
+ export { getRunTargets } from './targets.js';
@@ -0,0 +1,5 @@
1
+ import { HarnessPlatformRunner } from '@react-native-harness/platforms';
2
+ import { type WebPlatformConfig } from './config.js';
3
+ declare const getWebRunner: (config: WebPlatformConfig) => Promise<HarnessPlatformRunner>;
4
+ export default getWebRunner;
5
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAExE,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE9E,QAAA,MAAM,YAAY,GAChB,QAAQ,iBAAiB,KACxB,OAAO,CAAC,qBAAqB,CAiH/B,CAAC;AAEF,eAAe,YAAY,CAAC"}
package/dist/runner.js ADDED
@@ -0,0 +1,96 @@
1
+ import { chromium, firefox, webkit } from 'playwright';
2
+ import { WebPlatformConfigSchema } from './config.js';
3
+ const getWebRunner = async (config) => {
4
+ const parsedConfig = WebPlatformConfigSchema.parse(config);
5
+ let browser = null;
6
+ let page = null;
7
+ const launchBrowser = async () => {
8
+ const browserType = {
9
+ chromium,
10
+ firefox,
11
+ webkit,
12
+ }[parsedConfig.browser.type];
13
+ browser = await browserType.launch({
14
+ headless: parsedConfig.browser.headless,
15
+ channel: parsedConfig.browser.channel,
16
+ executablePath: parsedConfig.browser.executablePath,
17
+ });
18
+ const context = await browser.newContext();
19
+ page = await context.newPage();
20
+ // Expose functions for the UI package bridge
21
+ await page.exposeFunction('__RN_HARNESS_CAPTURE_SCREENSHOT__', async (bounds) => {
22
+ if (!page)
23
+ return null;
24
+ const buffer = await page.screenshot({
25
+ clip: bounds
26
+ ? {
27
+ x: bounds.x,
28
+ y: bounds.y,
29
+ width: bounds.width,
30
+ height: bounds.height,
31
+ }
32
+ : undefined,
33
+ });
34
+ return buffer.toString('base64');
35
+ });
36
+ await page.exposeFunction('__RN_HARNESS_SIMULATE_PRESS__', async (x, y) => {
37
+ if (!page)
38
+ return;
39
+ await page.mouse.click(x, y);
40
+ });
41
+ await page.exposeFunction('__RN_HARNESS_TYPE_CHAR__', async (char) => {
42
+ if (!page)
43
+ return;
44
+ await page.keyboard.type(char);
45
+ });
46
+ await page.exposeFunction('__RN_HARNESS_BLUR__', async (options) => {
47
+ if (!page)
48
+ return;
49
+ if (options.submitEditing) {
50
+ await page.keyboard.press('Enter');
51
+ // Allow some time for the event to be processed
52
+ await new Promise((resolve) => setTimeout(resolve, 50));
53
+ }
54
+ await page.evaluate(() => {
55
+ if (document.activeElement instanceof HTMLElement ||
56
+ document.activeElement instanceof SVGElement) {
57
+ document.activeElement.blur();
58
+ }
59
+ });
60
+ });
61
+ await page.goto(parsedConfig.browser.url);
62
+ };
63
+ return {
64
+ startApp: async () => {
65
+ if (!browser) {
66
+ await launchBrowser();
67
+ }
68
+ },
69
+ restartApp: async () => {
70
+ if (page) {
71
+ await page.reload();
72
+ }
73
+ else {
74
+ await launchBrowser();
75
+ }
76
+ },
77
+ stopApp: async () => {
78
+ if (browser) {
79
+ await browser.close();
80
+ browser = null;
81
+ page = null;
82
+ }
83
+ },
84
+ dispose: async () => {
85
+ if (browser) {
86
+ await browser.close();
87
+ browser = null;
88
+ page = null;
89
+ }
90
+ },
91
+ isAppRunning: async () => {
92
+ return browser !== null && page !== null && !page.isClosed();
93
+ },
94
+ };
95
+ };
96
+ export default getWebRunner;
@@ -0,0 +1,3 @@
1
+ import { RunTarget } from '@react-native-harness/platforms';
2
+ export declare const getRunTargets: () => Promise<RunTarget[]>;
3
+ //# sourceMappingURL=targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAE5D,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,SAAS,EAAE,CAwBzD,CAAC"}
@@ -0,0 +1,25 @@
1
+ export const getRunTargets = async () => {
2
+ return [
3
+ {
4
+ type: 'browser',
5
+ name: 'Chromium',
6
+ platform: 'web',
7
+ description: 'Playwright Chromium browser',
8
+ device: { browserType: 'chromium' },
9
+ },
10
+ {
11
+ type: 'browser',
12
+ name: 'Firefox',
13
+ platform: 'web',
14
+ description: 'Playwright Firefox browser',
15
+ device: { browserType: 'firefox' },
16
+ },
17
+ {
18
+ type: 'browser',
19
+ name: 'WebKit',
20
+ platform: 'web',
21
+ description: 'Playwright WebKit browser',
22
+ device: { browserType: 'webkit' },
23
+ },
24
+ ];
25
+ };
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/tslib/tslib.d.ts","../../../node_modules/tslib/modules/index.d.ts","../../../node_modules/zod/dist/types/v3/helpers/typealiases.d.ts","../../../node_modules/zod/dist/types/v3/helpers/util.d.ts","../../../node_modules/zod/dist/types/v3/zoderror.d.ts","../../../node_modules/zod/dist/types/v3/locales/en.d.ts","../../../node_modules/zod/dist/types/v3/errors.d.ts","../../../node_modules/zod/dist/types/v3/helpers/parseutil.d.ts","../../../node_modules/zod/dist/types/v3/helpers/enumutil.d.ts","../../../node_modules/zod/dist/types/v3/helpers/errorutil.d.ts","../../../node_modules/zod/dist/types/v3/helpers/partialutil.d.ts","../../../node_modules/zod/dist/types/v3/standard-schema.d.ts","../../../node_modules/zod/dist/types/v3/types.d.ts","../../../node_modules/zod/dist/types/v3/external.d.ts","../../../node_modules/zod/dist/types/v3/index.d.ts","../../../node_modules/zod/dist/types/index.d.ts","../src/config.ts","../../platforms/dist/types.d.ts","../../platforms/dist/errors.d.ts","../../platforms/dist/index.d.ts","../src/factory.ts","../src/targets.ts","../src/index.ts","../../../node_modules/playwright-core/types/protocol.d.ts","../../../node_modules/playwright-core/types/structs.d.ts","../../../node_modules/playwright-core/types/types.d.ts","../../../node_modules/playwright-core/index.d.ts","../../../node_modules/playwright/index.d.ts","../src/runner.ts","../../../node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/buffer/index.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/file.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/filereader.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[93,137,140],[93,139,140],[140],[93,140,145,173],[93,140,141,146,151,159,170,181],[93,140,141,142,151,159],[93,140],[88,89,90,93,140],[93,140,143,182],[93,140,144,145,152,160],[93,140,145,170,178],[93,140,146,148,151,159],[93,139,140,147],[93,140,148,149],[93,140,150,151],[93,139,140,151],[93,140,151,152,153,170,181],[93,140,151,152,153,166,170,173],[93,140,148,151,154,159,170,181],[93,140,151,152,154,155,159,170,178,181],[93,140,154,156,170,178,181],[91,92,93,94,95,96,97,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187],[93,140,151,157],[93,140,158,181,186],[93,140,148,151,159,170],[93,140,160],[93,140,161],[93,139,140,162],[93,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187],[93,140,164],[93,140,165],[93,140,151,166,167],[93,140,166,168,182,184],[93,140,151,170,171,173],[93,140,172,173],[93,140,170,171],[93,140,173],[93,140,174],[93,137,140,170,175],[93,140,151,176,177],[93,140,176,177],[93,140,145,159,170,178],[93,140,179],[93,140,159,180],[93,140,154,165,181],[93,140,145,182],[93,140,170,183],[93,140,158,184],[93,140,185],[93,135,140],[93,135,140,151,153,162,170,173,181,184,186],[93,140,170,187],[84,93,140],[82,83,93,140,141,152,170],[85,93,140],[59,93,140],[93,107,111,140,181],[93,107,140,170,181],[93,102,140],[93,104,107,140,178,181],[93,140,159,178],[93,140,188],[93,102,140,188],[93,104,107,140,159,181],[93,99,100,103,106,140,151,170,181],[93,107,114,140],[93,99,105,140],[93,107,128,129,140],[93,103,107,140,173,181,188],[93,128,140,188],[93,101,102,140,188],[93,107,140],[93,101,102,103,104,105,106,107,108,109,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,140],[93,107,122,140],[93,107,114,115,140],[93,105,107,115,116,140],[93,106,140],[93,99,102,107,140],[93,107,111,115,116,140],[93,111,140],[93,105,107,110,140,181],[93,99,104,107,114,140],[93,140,170],[93,102,107,128,140,186,188],[73,93,140],[63,64,93,140],[61,62,63,65,66,71,93,140],[62,63,93,140],[71,93,140],[72,93,140],[63,93,140],[61,62,63,66,67,68,69,70,93,140],[61,62,73,93,140],[60,74,93,140],[60,75,78,93,140],[60,75,79,80,93,140],[60,75,78,86,93,140],[60,78,93,140],[76,77,93,140]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"b8f34dd1757f68e03262b1ca3ddfa668a855b872f8bdd5224d6f993a7b37dc2c","impliedFormat":99},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"54f6ec6ea75acea6eb23635617252d249145edbc7bcd9d53f2d70280d2aef953","impliedFormat":1},{"version":"c25ce98cca43a3bfa885862044be0d59557be4ecd06989b2001a83dcf69620fd","impliedFormat":1},{"version":"8e71e53b02c152a38af6aec45e288cc65bede077b92b9b43b3cb54a37978bb33","impliedFormat":1},{"version":"754a9396b14ca3a4241591afb4edc644b293ccc8a3397f49be4dfd520c08acb3","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"e4b03ddcf8563b1c0aee782a185286ed85a255ce8a30df8453aade2188bbc904","impliedFormat":1},{"version":"de2316e90fc6d379d83002f04ad9698bc1e5285b4d52779778f454dd12ce9f44","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"2da997a01a6aa5c5c09de5d28f0f4407b597c5e1aecfd32f1815809c532650a2","impliedFormat":1},{"version":"5d26d2e47e2352def36f89a3e8bf8581da22b7f857e07ef3114cd52cf4813445","impliedFormat":1},{"version":"3db2efd285e7328d8014b54a7fce3f4861ebcdc655df40517092ed0050983617","impliedFormat":1},{"version":"d5d39a24c759df40480a4bfc0daffd364489702fdbcbdfc1711cde34f8739995","impliedFormat":1},{"version":"7ffe6816e72cbe61429124011e39fc63edfdc519eee4a46b8e73d719a5149708","signature":"5531bc82b5a558b7818c7e048a848a2b7fc1aa45c48501751bb28a1a8ee799dd","impliedFormat":99},{"version":"becc8697f278cd03fd38fb44ae3824ebd5922c065d282347fdc103603ce60d02","impliedFormat":99},{"version":"44263a54de2d83eb035fc6287e43d38d848c164dce9a531d873d8dbd1f8ae9f7","impliedFormat":99},{"version":"7f0472b099b0981192a1dd94e6ff3ae48f6ac59b0593f8d2923be0d07f302bdc","impliedFormat":99},{"version":"e2ea8b2bd098283123d0b278663d5212ccace1e490e33e12914a703422f68199","signature":"40b1f154a0b875eeb859243eb70d4bcffb9af7da9bad659a424a13260eb98757","impliedFormat":99},{"version":"52fb0b74a1af13800fc5646b010a250b96b58a2e6ba2ec19d666d393afb58e54","signature":"de5a9a4f0943c6b18d91c387697b7f2b581f9bf4f51e9fcb628fce5ec1bb6722","impliedFormat":99},{"version":"3dd47185e67d2f2610c486b0957f0f49760d039d12e411f4f3195dfe03e8934d","impliedFormat":99},{"version":"b34209befaf07b7cc1932e5cc137ce121cbc9f892551126962d9e908be91adb4","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"2c0b5ace721ddf7314b622bbad664a9958cfd1068422dbed5cdb760cba1c7f0c","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"b07f64ff6ec710998a62b07377fbda0ab4c313ba1f0055bfe9faa22cffedd47c","impliedFormat":1},{"version":"14b3373483e2abc3a71d99176f1ccd87b3262b0772eeb0d1197e90268ffcde43","signature":"7a1f2508f2a65ebbbae1c22cde8bd5e6f914e03ddd2bd6659718a82b61b17b27","impliedFormat":99},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba481bca06f37d3f2c137ce343c7d5937029b2468f8e26111f3c9d9963d6568d","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true,"impliedFormat":1},{"version":"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","impliedFormat":1},{"version":"3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true,"impliedFormat":1},{"version":"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true,"impliedFormat":1},{"version":"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","impliedFormat":1},{"version":"58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","impliedFormat":1},{"version":"2fd4c143eff88dabb57701e6a40e02a4dbc36d5eb1362e7964d32028056a782b","impliedFormat":1},{"version":"714435130b9015fae551788df2a88038471a5a11eb471f27c4ede86552842bc9","impliedFormat":1},{"version":"855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"27fdb0da0daf3b337c5530c5f266efe046a6ceb606e395b346974e4360c36419","impliedFormat":1},{"version":"2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true,"impliedFormat":1},{"version":"00877fef624f3171c2e44944fb63a55e2a9f9120d7c8b5eb4181c263c9a077cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"47ab634529c5955b6ad793474ae188fce3e6163e3a3fb5edd7e0e48f14435333","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"0225ecb9ed86bdb7a2c7fd01f1556906902929377b44483dc4b83e03b3ef227d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","impliedFormat":1},{"version":"5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"f9ab232778f2842ffd6955f88b1049982fa2ecb764d129ee4893cbc290f41977","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true,"impliedFormat":1},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true,"impliedFormat":1},{"version":"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","impliedFormat":1},{"version":"1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","impliedFormat":1},{"version":"f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e","impliedFormat":1},{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"05db535df8bdc30d9116fe754a3473d1b6479afbc14ae8eb18b605c62677d518","impliedFormat":1},{"version":"b1810689b76fd473bd12cc9ee219f8e62f54a7d08019a235d07424afbf074d25","impliedFormat":1}],"root":[75,[79,81],87],"options":{"composite":true,"declarationMap":true,"emitDeclarationOnly":false,"importHelpers":true,"module":199,"noEmitOnError":true,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUnusedLocals":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./tsconfig.lib.tsbuildinfo"},"referencedMap":[[137,1],[138,1],[139,2],[93,3],[140,4],[141,5],[142,6],[88,7],[91,8],[89,7],[90,7],[143,9],[144,10],[145,11],[146,12],[147,13],[148,14],[149,14],[150,15],[151,16],[152,17],[153,18],[94,7],[92,7],[154,19],[155,20],[156,21],[188,22],[157,23],[158,24],[159,25],[160,26],[161,27],[162,28],[163,29],[164,30],[165,31],[166,32],[167,32],[168,33],[169,7],[170,34],[172,35],[171,36],[173,37],[174,38],[175,39],[176,40],[177,41],[178,42],[179,43],[180,44],[181,45],[182,46],[183,47],[184,48],[185,49],[95,7],[96,7],[97,7],[136,50],[186,51],[187,52],[98,7],[85,53],[82,7],[83,53],[84,54],[86,55],[60,56],[59,7],[57,7],[58,7],[10,7],[12,7],[11,7],[2,7],[13,7],[14,7],[15,7],[16,7],[17,7],[18,7],[19,7],[20,7],[3,7],[21,7],[22,7],[4,7],[23,7],[27,7],[24,7],[25,7],[26,7],[28,7],[29,7],[30,7],[5,7],[31,7],[32,7],[33,7],[34,7],[6,7],[38,7],[35,7],[36,7],[37,7],[39,7],[7,7],[40,7],[45,7],[46,7],[41,7],[42,7],[43,7],[44,7],[8,7],[50,7],[47,7],[48,7],[49,7],[51,7],[9,7],[52,7],[53,7],[54,7],[56,7],[55,7],[1,7],[114,57],[124,58],[113,57],[134,59],[105,60],[104,61],[133,62],[127,63],[132,64],[107,65],[121,66],[106,67],[130,68],[102,69],[101,62],[131,70],[103,71],[108,72],[109,7],[112,72],[99,7],[135,73],[125,74],[116,75],[117,76],[119,77],[115,78],[118,79],[128,62],[110,80],[111,81],[120,82],[100,83],[123,74],[122,72],[126,7],[129,84],[74,85],[65,86],[72,87],[67,7],[68,7],[66,88],[69,89],[61,7],[62,7],[73,90],[64,91],[70,7],[71,92],[63,93],[75,94],[79,95],[81,96],[87,97],[80,98],[77,7],[78,99],[76,7]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
@@ -0,0 +1,19 @@
1
+ import baseConfig from '../../eslint.config.mjs';
2
+
3
+ export default [
4
+ ...baseConfig,
5
+ {
6
+ files: ['**/*.json'],
7
+ rules: {
8
+ '@nx/dependency-checks': [
9
+ 'error',
10
+ {
11
+ ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}'],
12
+ },
13
+ ],
14
+ },
15
+ languageOptions: {
16
+ parser: await import('jsonc-eslint-parser'),
17
+ },
18
+ },
19
+ ];
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@react-native-harness/platform-web",
3
+ "description": "Web platform for React Native Harness using Playwright",
4
+ "version": "1.0.0-alpha.24",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ "./package.json": "./package.json",
11
+ ".": {
12
+ "development": "./src/index.ts",
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "dependencies": {
19
+ "playwright": "^1.50.0",
20
+ "zod": "^3.25.67",
21
+ "tslib": "^2.3.0",
22
+ "@react-native-harness/platforms": "1.0.0-alpha.24"
23
+ },
24
+ "license": "MIT"
25
+ }
package/src/config.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+
3
+ export const WebBrowserConfigSchema = z.object({
4
+ type: z.enum(['chromium', 'firefox', 'webkit']),
5
+ url: z.string().url('A valid URL is required'),
6
+ headless: z.boolean().default(true),
7
+ channel: z.string().optional(),
8
+ executablePath: z.string().optional(),
9
+ });
10
+
11
+ export const WebPlatformConfigSchema = z.object({
12
+ name: z.string().min(1, 'Name is required'),
13
+ browser: WebBrowserConfigSchema,
14
+ });
15
+
16
+ export type WebBrowserConfig = z.infer<typeof WebBrowserConfigSchema>;
17
+ export type WebPlatformConfig = z.infer<typeof WebPlatformConfigSchema>;
package/src/factory.ts ADDED
@@ -0,0 +1,51 @@
1
+ import { HarnessPlatform } from '@react-native-harness/platforms';
2
+ import { type WebPlatformConfig, type WebBrowserConfig } from './config.js';
3
+
4
+ export const webPlatform = (
5
+ config: WebPlatformConfig
6
+ ): HarnessPlatform<WebPlatformConfig> => ({
7
+ name: config.name,
8
+ config,
9
+ runner: import.meta.resolve('./runner.js'),
10
+ });
11
+
12
+ export const chromium = (
13
+ url: string,
14
+ options: Partial<Omit<WebBrowserConfig, 'type' | 'url'>> = {}
15
+ ): WebBrowserConfig => ({
16
+ type: 'chromium',
17
+ url,
18
+ headless: true,
19
+ ...options,
20
+ });
21
+
22
+ export const chrome = (
23
+ url: string,
24
+ options: Partial<Omit<WebBrowserConfig, 'type' | 'url' | 'channel'>> = {}
25
+ ): WebBrowserConfig => ({
26
+ type: 'chromium',
27
+ channel: 'chrome',
28
+ url,
29
+ headless: true,
30
+ ...options,
31
+ });
32
+
33
+ export const firefox = (
34
+ url: string,
35
+ options: Partial<Omit<WebBrowserConfig, 'type' | 'url'>> = {}
36
+ ): WebBrowserConfig => ({
37
+ type: 'firefox',
38
+ url,
39
+ headless: true,
40
+ ...options,
41
+ });
42
+
43
+ export const webkit = (
44
+ url: string,
45
+ options: Partial<Omit<WebBrowserConfig, 'type' | 'url'>> = {}
46
+ ): WebBrowserConfig => ({
47
+ type: 'webkit',
48
+ url,
49
+ headless: true,
50
+ ...options,
51
+ });
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { webPlatform, chromium, chrome, firefox, webkit } from './factory.js';
2
+ export { getRunTargets } from './targets.js';
3
+ export type { WebPlatformConfig } from './config.js';
package/src/runner.ts ADDED
@@ -0,0 +1,122 @@
1
+ import { HarnessPlatformRunner } from '@react-native-harness/platforms';
2
+ import { chromium, firefox, webkit, type Browser, type Page } from 'playwright';
3
+ import { WebPlatformConfigSchema, type WebPlatformConfig } from './config.js';
4
+
5
+ const getWebRunner = async (
6
+ config: WebPlatformConfig
7
+ ): Promise<HarnessPlatformRunner> => {
8
+ const parsedConfig = WebPlatformConfigSchema.parse(config);
9
+
10
+ let browser: Browser | null = null;
11
+ let page: Page | null = null;
12
+
13
+ const launchBrowser = async () => {
14
+ const browserType = {
15
+ chromium,
16
+ firefox,
17
+ webkit,
18
+ }[parsedConfig.browser.type];
19
+
20
+ browser = await browserType.launch({
21
+ headless: parsedConfig.browser.headless,
22
+ channel: parsedConfig.browser.channel,
23
+ executablePath: parsedConfig.browser.executablePath,
24
+ });
25
+
26
+ const context = await browser.newContext();
27
+ page = await context.newPage();
28
+
29
+ // Expose functions for the UI package bridge
30
+ await page.exposeFunction(
31
+ '__RN_HARNESS_CAPTURE_SCREENSHOT__',
32
+ async (
33
+ bounds: { x: number; y: number; width: number; height: number } | null
34
+ ) => {
35
+ if (!page) return null;
36
+ const buffer = await page.screenshot({
37
+ clip: bounds
38
+ ? {
39
+ x: bounds.x,
40
+ y: bounds.y,
41
+ width: bounds.width,
42
+ height: bounds.height,
43
+ }
44
+ : undefined,
45
+ });
46
+ return buffer.toString('base64');
47
+ }
48
+ );
49
+
50
+ await page.exposeFunction(
51
+ '__RN_HARNESS_SIMULATE_PRESS__',
52
+ async (x: number, y: number) => {
53
+ if (!page) return;
54
+ await page.mouse.click(x, y);
55
+ }
56
+ );
57
+
58
+ await page.exposeFunction(
59
+ '__RN_HARNESS_TYPE_CHAR__',
60
+ async (char: string) => {
61
+ if (!page) return;
62
+ await page.keyboard.type(char);
63
+ }
64
+ );
65
+
66
+ await page.exposeFunction(
67
+ '__RN_HARNESS_BLUR__',
68
+ async (options: { submitEditing?: boolean }) => {
69
+ if (!page) return;
70
+ if (options.submitEditing) {
71
+ await page.keyboard.press('Enter');
72
+ // Allow some time for the event to be processed
73
+ await new Promise((resolve) => setTimeout(resolve, 50));
74
+ }
75
+ await page.evaluate(() => {
76
+ if (
77
+ document.activeElement instanceof HTMLElement ||
78
+ document.activeElement instanceof SVGElement
79
+ ) {
80
+ document.activeElement.blur();
81
+ }
82
+ });
83
+ }
84
+ );
85
+
86
+ await page.goto(parsedConfig.browser.url);
87
+ };
88
+
89
+ return {
90
+ startApp: async () => {
91
+ if (!browser) {
92
+ await launchBrowser();
93
+ }
94
+ },
95
+ restartApp: async () => {
96
+ if (page) {
97
+ await page.reload();
98
+ } else {
99
+ await launchBrowser();
100
+ }
101
+ },
102
+ stopApp: async () => {
103
+ if (browser) {
104
+ await browser.close();
105
+ browser = null;
106
+ page = null;
107
+ }
108
+ },
109
+ dispose: async () => {
110
+ if (browser) {
111
+ await browser.close();
112
+ browser = null;
113
+ page = null;
114
+ }
115
+ },
116
+ isAppRunning: async () => {
117
+ return browser !== null && page !== null && !page.isClosed();
118
+ },
119
+ };
120
+ };
121
+
122
+ export default getWebRunner;
package/src/targets.ts ADDED
@@ -0,0 +1,27 @@
1
+ import { RunTarget } from '@react-native-harness/platforms';
2
+
3
+ export const getRunTargets = async (): Promise<RunTarget[]> => {
4
+ return [
5
+ {
6
+ type: 'browser',
7
+ name: 'Chromium',
8
+ platform: 'web',
9
+ description: 'Playwright Chromium browser',
10
+ device: { browserType: 'chromium' },
11
+ },
12
+ {
13
+ type: 'browser',
14
+ name: 'Firefox',
15
+ platform: 'web',
16
+ description: 'Playwright Firefox browser',
17
+ device: { browserType: 'firefox' },
18
+ },
19
+ {
20
+ type: 'browser',
21
+ name: 'WebKit',
22
+ platform: 'web',
23
+ description: 'Playwright WebKit browser',
24
+ device: { browserType: 'webkit' },
25
+ },
26
+ ];
27
+ };
package/tsconfig.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "files": [],
4
+ "include": [],
5
+ "references": [
6
+ {
7
+ "path": "../platforms"
8
+ },
9
+ {
10
+ "path": "./tsconfig.lib.json"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "baseUrl": ".",
5
+ "rootDir": "src",
6
+ "outDir": "dist",
7
+ "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
8
+ "emitDeclarationOnly": false,
9
+ "forceConsistentCasingInFileNames": true,
10
+ "lib": ["es2022", "dom"],
11
+ "types": ["node"]
12
+ },
13
+ "include": ["src/**/*.ts"],
14
+ "references": [
15
+ {
16
+ "path": "../platforms/tsconfig.lib.json"
17
+ }
18
+ ]
19
+ }