@taqwright/taqwright 0.0.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 +201 -0
- package/README.md +108 -0
- package/dist/auto-appium.d.ts +12 -0
- package/dist/auto-appium.js +77 -0
- package/dist/bin/branding.d.ts +6 -0
- package/dist/bin/branding.js +22 -0
- package/dist/bin/index.d.ts +2 -0
- package/dist/bin/index.js +321 -0
- package/dist/bin/init.d.ts +26 -0
- package/dist/bin/init.js +902 -0
- package/dist/bin/inspect.d.ts +9 -0
- package/dist/bin/inspect.js +91 -0
- package/dist/bin/report-branding.d.ts +2 -0
- package/dist/bin/report-branding.js +42 -0
- package/dist/branding-assets.d.ts +1 -0
- package/dist/branding-assets.js +1 -0
- package/dist/capabilities-helpers.d.ts +7 -0
- package/dist/capabilities-helpers.js +14 -0
- package/dist/capabilities.d.ts +6 -0
- package/dist/capabilities.js +86 -0
- package/dist/config.d.ts +17 -0
- package/dist/config.js +235 -0
- package/dist/discovery-setup.d.ts +1 -0
- package/dist/discovery-setup.js +61 -0
- package/dist/discovery.d.ts +17 -0
- package/dist/discovery.js +55 -0
- package/dist/docs/configuration.html +376 -0
- package/dist/docs/custom-reporters.html +265 -0
- package/dist/docs/docker.html +339 -0
- package/dist/docs/docs.js +173 -0
- package/dist/docs/generating-tests.html +161 -0
- package/dist/docs/images/taqwright-html-report.png +0 -0
- package/dist/docs/index.html +13 -0
- package/dist/docs/installation.html +686 -0
- package/dist/docs/parallel.html +271 -0
- package/dist/docs/running-tests.html +385 -0
- package/dist/docs/styles.css +460 -0
- package/dist/docs/writing-tests.html +565 -0
- package/dist/doctor.d.ts +33 -0
- package/dist/doctor.js +508 -0
- package/dist/expect.d.ts +38 -0
- package/dist/expect.js +96 -0
- package/dist/fixture/artifact-mode.d.ts +2 -0
- package/dist/fixture/artifact-mode.js +7 -0
- package/dist/fixture/index.d.ts +15 -0
- package/dist/fixture/index.js +324 -0
- package/dist/images/taqwright-html-report.png +0 -0
- package/dist/images/taqwright_favicon.png +0 -0
- package/dist/images/taqwright_logo.png +0 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +7 -0
- package/dist/inspector/codegen-appium.d.ts +3 -0
- package/dist/inspector/codegen-appium.js +228 -0
- package/dist/inspector/devices.d.ts +41 -0
- package/dist/inspector/devices.js +422 -0
- package/dist/inspector/locator-suggester.d.ts +23 -0
- package/dist/inspector/locator-suggester.js +539 -0
- package/dist/inspector/recorder.d.ts +128 -0
- package/dist/inspector/recorder.js +162 -0
- package/dist/inspector/server.d.ts +39 -0
- package/dist/inspector/server.js +1210 -0
- package/dist/inspector/session.d.ts +84 -0
- package/dist/inspector/session.js +262 -0
- package/dist/inspector/ui.d.ts +1 -0
- package/dist/inspector/ui.js +5508 -0
- package/dist/keys.d.ts +3 -0
- package/dist/keys.js +28 -0
- package/dist/locator/index.d.ts +206 -0
- package/dist/locator/index.js +1506 -0
- package/dist/logger.d.ts +5 -0
- package/dist/logger.js +5 -0
- package/dist/mobile/index.d.ts +130 -0
- package/dist/mobile/index.js +762 -0
- package/dist/network/android.d.ts +5 -0
- package/dist/network/android.js +87 -0
- package/dist/network/ca.d.ts +10 -0
- package/dist/network/ca.js +136 -0
- package/dist/network/har.d.ts +90 -0
- package/dist/network/har.js +101 -0
- package/dist/network/host-proxy.d.ts +16 -0
- package/dist/network/host-proxy.js +134 -0
- package/dist/network/index.d.ts +26 -0
- package/dist/network/index.js +105 -0
- package/dist/network/ios-sim.d.ts +3 -0
- package/dist/network/ios-sim.js +29 -0
- package/dist/network/proxy.d.ts +13 -0
- package/dist/network/proxy.js +310 -0
- package/dist/providers/appium.d.ts +23 -0
- package/dist/providers/appium.js +288 -0
- package/dist/providers/browserstack/index.d.ts +5 -0
- package/dist/providers/browserstack/index.js +77 -0
- package/dist/providers/browserstack/utils.d.ts +1 -0
- package/dist/providers/browserstack/utils.js +6 -0
- package/dist/providers/cloud.d.ts +53 -0
- package/dist/providers/cloud.js +117 -0
- package/dist/providers/emulator/index.d.ts +8 -0
- package/dist/providers/emulator/index.js +47 -0
- package/dist/providers/index.d.ts +10 -0
- package/dist/providers/index.js +33 -0
- package/dist/providers/lambdatest/index.d.ts +28 -0
- package/dist/providers/lambdatest/index.js +99 -0
- package/dist/providers/lambdatest/utils.d.ts +1 -0
- package/dist/providers/lambdatest/utils.js +6 -0
- package/dist/providers/local/index.d.ts +9 -0
- package/dist/providers/local/index.js +53 -0
- package/dist/providers/local-session.d.ts +16 -0
- package/dist/providers/local-session.js +55 -0
- package/dist/setup/archive.d.ts +2 -0
- package/dist/setup/archive.js +43 -0
- package/dist/setup/avd.d.ts +12 -0
- package/dist/setup/avd.js +103 -0
- package/dist/setup/index.d.ts +6 -0
- package/dist/setup/index.js +55 -0
- package/dist/setup/install-android.d.ts +2 -0
- package/dist/setup/install-android.js +70 -0
- package/dist/setup/install-appium.d.ts +1 -0
- package/dist/setup/install-appium.js +64 -0
- package/dist/setup/install-jdk.d.ts +1 -0
- package/dist/setup/install-jdk.js +58 -0
- package/dist/setup/paths.d.ts +16 -0
- package/dist/setup/paths.js +88 -0
- package/dist/setup/spawn-tool.d.ts +3 -0
- package/dist/setup/spawn-tool.js +11 -0
- package/dist/tracer/index.d.ts +34 -0
- package/dist/tracer/index.js +687 -0
- package/dist/tracer/proxy.d.ts +3 -0
- package/dist/tracer/proxy.js +60 -0
- package/dist/types/index.d.ts +189 -0
- package/dist/types/index.js +6 -0
- package/dist/utils.d.ts +2 -0
- package/dist/utils.js +37 -0
- package/package.json +79 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Locator } from '../locator/index.js';
|
|
2
|
+
const CHAIN_METHODS = new Set(['filter', 'first', 'last', 'nth', 'locator', 'and', 'or']);
|
|
3
|
+
const MOBILE_PASS_THROUGH = new Set(['raw', 'getPlatform']);
|
|
4
|
+
export function wrapForTracing(mobile, tracer) {
|
|
5
|
+
return new Proxy(mobile, {
|
|
6
|
+
get(target, prop, receiver) {
|
|
7
|
+
const orig = Reflect.get(target, prop, receiver);
|
|
8
|
+
const name = String(prop);
|
|
9
|
+
if (MOBILE_PASS_THROUGH.has(name) || typeof orig !== 'function') {
|
|
10
|
+
return orig;
|
|
11
|
+
}
|
|
12
|
+
const fn = orig;
|
|
13
|
+
return (...args) => {
|
|
14
|
+
const result = fn.apply(target, args);
|
|
15
|
+
if (result instanceof Locator) {
|
|
16
|
+
return wrapLocator(result, tracer);
|
|
17
|
+
}
|
|
18
|
+
if (isPromise(result)) {
|
|
19
|
+
return tracer.record(`mobile.${name}`, args, () => result);
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
};
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function wrapLocator(loc, tracer) {
|
|
27
|
+
return new Proxy(loc, {
|
|
28
|
+
get(target, prop, receiver) {
|
|
29
|
+
const orig = Reflect.get(target, prop, receiver);
|
|
30
|
+
if (typeof orig !== 'function')
|
|
31
|
+
return orig;
|
|
32
|
+
const name = String(prop);
|
|
33
|
+
const fn = orig;
|
|
34
|
+
if (CHAIN_METHODS.has(name)) {
|
|
35
|
+
return (...args) => {
|
|
36
|
+
const r = fn.apply(target, args);
|
|
37
|
+
return r instanceof Locator ? wrapLocator(r, tracer) : r;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return (...args) => {
|
|
41
|
+
const r = fn.apply(target, args);
|
|
42
|
+
if (isPromise(r)) {
|
|
43
|
+
return tracer
|
|
44
|
+
.record(`locator.${name}`, args, () => r)
|
|
45
|
+
.then((resolved) => wrapResolved(resolved, tracer));
|
|
46
|
+
}
|
|
47
|
+
return r;
|
|
48
|
+
};
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function wrapResolved(value, tracer) {
|
|
53
|
+
if (Array.isArray(value) && value.every((v) => v instanceof Locator)) {
|
|
54
|
+
return value.map((l) => wrapLocator(l, tracer));
|
|
55
|
+
}
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
function isPromise(v) {
|
|
59
|
+
return (v !== null && typeof v === 'object' && typeof v.then === 'function');
|
|
60
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import type { Client as WebDriverClient } from 'webdriver';
|
|
2
|
+
export declare enum Platform {
|
|
3
|
+
ANDROID = "android",
|
|
4
|
+
IOS = "ios"
|
|
5
|
+
}
|
|
6
|
+
export type ScrollDirection = 'up' | 'down' | 'left' | 'right';
|
|
7
|
+
export type SwipeDirection = 'up' | 'down' | 'left' | 'right';
|
|
8
|
+
export type HardwareButton = 'HOME' | 'BACK' | 'POWER' | 'VOLUME_UP' | 'VOLUME_DOWN' | 'ENTER';
|
|
9
|
+
export type DeviceOrientation = 'portrait' | 'landscape';
|
|
10
|
+
export interface DevicePoolEntry {
|
|
11
|
+
udid: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
osVersion?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface EmulatorDeviceConfig {
|
|
16
|
+
provider: 'emulator';
|
|
17
|
+
name?: string | RegExp;
|
|
18
|
+
osVersion?: string;
|
|
19
|
+
udid?: string;
|
|
20
|
+
orientation?: DeviceOrientation;
|
|
21
|
+
pool?: DevicePoolEntry[];
|
|
22
|
+
autoDiscover?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface LocalDeviceConfig {
|
|
25
|
+
provider: 'local-device';
|
|
26
|
+
name?: string | RegExp;
|
|
27
|
+
udid?: string;
|
|
28
|
+
osVersion?: string;
|
|
29
|
+
orientation?: DeviceOrientation;
|
|
30
|
+
pool?: DevicePoolEntry[];
|
|
31
|
+
autoDiscover?: boolean;
|
|
32
|
+
}
|
|
33
|
+
interface CloudDeviceConfigBase {
|
|
34
|
+
name: string;
|
|
35
|
+
osVersion: string;
|
|
36
|
+
orientation?: DeviceOrientation;
|
|
37
|
+
enableCameraImageInjection?: boolean;
|
|
38
|
+
}
|
|
39
|
+
export interface BrowserStackDeviceConfig extends CloudDeviceConfigBase {
|
|
40
|
+
provider: 'browserstack';
|
|
41
|
+
}
|
|
42
|
+
export interface LambdaTestDeviceConfig extends CloudDeviceConfigBase {
|
|
43
|
+
provider: 'lambdatest';
|
|
44
|
+
}
|
|
45
|
+
export type DeviceConfig = EmulatorDeviceConfig | LocalDeviceConfig | BrowserStackDeviceConfig | LambdaTestDeviceConfig;
|
|
46
|
+
export interface DeviceHandle {
|
|
47
|
+
driver: WebDriverClient;
|
|
48
|
+
bundleId?: string;
|
|
49
|
+
options: {
|
|
50
|
+
expectTimeout: number;
|
|
51
|
+
};
|
|
52
|
+
provider: string;
|
|
53
|
+
}
|
|
54
|
+
export interface DeviceProvider {
|
|
55
|
+
globalSetup?(): Promise<void>;
|
|
56
|
+
getDevice(): Promise<DeviceHandle>;
|
|
57
|
+
syncTestDetails?(details: {
|
|
58
|
+
status?: string;
|
|
59
|
+
reason?: string;
|
|
60
|
+
name?: string;
|
|
61
|
+
}): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
export interface AppiumServerConfig {
|
|
64
|
+
host?: string;
|
|
65
|
+
port?: number;
|
|
66
|
+
path?: string;
|
|
67
|
+
newCommandTimeout?: number;
|
|
68
|
+
connectionTimeout?: number;
|
|
69
|
+
logLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent';
|
|
70
|
+
autoStart?: boolean;
|
|
71
|
+
autoStartDevice?: boolean;
|
|
72
|
+
}
|
|
73
|
+
interface TaqwrightUseOptionsBase {
|
|
74
|
+
platform: Platform;
|
|
75
|
+
device: DeviceConfig;
|
|
76
|
+
buildPath?: string;
|
|
77
|
+
appBundleId?: string;
|
|
78
|
+
expectTimeout?: number;
|
|
79
|
+
appium?: AppiumServerConfig;
|
|
80
|
+
capabilities?: Record<string, unknown>;
|
|
81
|
+
trace?: TraceMode;
|
|
82
|
+
video?: VideoMode;
|
|
83
|
+
network?: NetworkMode;
|
|
84
|
+
}
|
|
85
|
+
export type TraceMode = 'off' | 'on' | 'on-failure' | 'retain-on-failure';
|
|
86
|
+
export type VideoMode = 'off' | 'on' | 'on-failure' | 'retain-on-failure';
|
|
87
|
+
export type NetworkMode = 'off' | 'on' | 'on-failure' | 'retain-on-failure';
|
|
88
|
+
export type TaqwrightUseOptions = TaqwrightUseOptionsBase & ({
|
|
89
|
+
resetBetweenTests?: false;
|
|
90
|
+
} | {
|
|
91
|
+
resetBetweenTests: true;
|
|
92
|
+
buildPath: string;
|
|
93
|
+
appBundleId: string;
|
|
94
|
+
});
|
|
95
|
+
interface TestRunnerOptions {
|
|
96
|
+
testDir?: string;
|
|
97
|
+
testMatch?: string | RegExp | Array<string | RegExp>;
|
|
98
|
+
testIgnore?: string | RegExp | Array<string | RegExp>;
|
|
99
|
+
timeout?: number;
|
|
100
|
+
retries?: number;
|
|
101
|
+
outputDir?: string;
|
|
102
|
+
}
|
|
103
|
+
export interface TaqwrightProjectConfig extends TestRunnerOptions {
|
|
104
|
+
name: string;
|
|
105
|
+
use: TaqwrightUseOptions;
|
|
106
|
+
grep?: RegExp | Array<RegExp>;
|
|
107
|
+
grepInvert?: RegExp | Array<RegExp>;
|
|
108
|
+
dependencies?: string[];
|
|
109
|
+
workers?: number;
|
|
110
|
+
}
|
|
111
|
+
export interface TaqwrightConfig extends TestRunnerOptions {
|
|
112
|
+
projects: TaqwrightProjectConfig[];
|
|
113
|
+
expectTimeout?: number;
|
|
114
|
+
workers?: number;
|
|
115
|
+
fullyParallel?: boolean;
|
|
116
|
+
forbidOnly?: boolean;
|
|
117
|
+
reporter?: 'list' | 'html' | 'json' | 'junit' | 'line' | 'dot' | Array<[string] | [string, unknown]>;
|
|
118
|
+
globalSetup?: string | string[];
|
|
119
|
+
globalTeardown?: string | string[];
|
|
120
|
+
}
|
|
121
|
+
export interface BoundingBox {
|
|
122
|
+
x: number;
|
|
123
|
+
y: number;
|
|
124
|
+
width: number;
|
|
125
|
+
height: number;
|
|
126
|
+
}
|
|
127
|
+
export interface ScreenSize {
|
|
128
|
+
width: number;
|
|
129
|
+
height: number;
|
|
130
|
+
}
|
|
131
|
+
export interface GesturePointer {
|
|
132
|
+
x: number;
|
|
133
|
+
y: number;
|
|
134
|
+
time: number;
|
|
135
|
+
}
|
|
136
|
+
export interface GestureOptions {
|
|
137
|
+
pointers: GesturePointer[][];
|
|
138
|
+
}
|
|
139
|
+
export interface LocatorStrategy {
|
|
140
|
+
using: 'accessibility id' | 'id' | 'class name' | 'xpath' | 'name' | 'css selector' | '-android uiautomator' | '-ios predicate string' | '-ios class chain';
|
|
141
|
+
value: string;
|
|
142
|
+
textFilter?: string | RegExp;
|
|
143
|
+
}
|
|
144
|
+
export declare const W3C_ELEMENT_KEY: "element-6066-11e4-a52e-4f735466cecf";
|
|
145
|
+
export type ElementRef = Record<typeof W3C_ELEMENT_KEY, string>;
|
|
146
|
+
export type SerializedText = string | {
|
|
147
|
+
regex: string;
|
|
148
|
+
flags: string;
|
|
149
|
+
};
|
|
150
|
+
export type LocatorDescriptor = {
|
|
151
|
+
kind: 'leaf';
|
|
152
|
+
using: LocatorStrategy['using'];
|
|
153
|
+
value: string;
|
|
154
|
+
textFilter?: SerializedText;
|
|
155
|
+
} | {
|
|
156
|
+
kind: 'first';
|
|
157
|
+
on: LocatorDescriptor;
|
|
158
|
+
} | {
|
|
159
|
+
kind: 'last';
|
|
160
|
+
on: LocatorDescriptor;
|
|
161
|
+
} | {
|
|
162
|
+
kind: 'nth';
|
|
163
|
+
on: LocatorDescriptor;
|
|
164
|
+
n: number;
|
|
165
|
+
} | {
|
|
166
|
+
kind: 'filter';
|
|
167
|
+
on: LocatorDescriptor;
|
|
168
|
+
filter: SerializedFilter;
|
|
169
|
+
} | {
|
|
170
|
+
kind: 'child';
|
|
171
|
+
parent: LocatorDescriptor;
|
|
172
|
+
child: LocatorDescriptor;
|
|
173
|
+
} | {
|
|
174
|
+
kind: 'and';
|
|
175
|
+
left: LocatorDescriptor;
|
|
176
|
+
right: LocatorDescriptor;
|
|
177
|
+
} | {
|
|
178
|
+
kind: 'or';
|
|
179
|
+
left: LocatorDescriptor;
|
|
180
|
+
right: LocatorDescriptor;
|
|
181
|
+
};
|
|
182
|
+
export interface SerializedFilter {
|
|
183
|
+
has?: LocatorDescriptor;
|
|
184
|
+
hasNot?: LocatorDescriptor;
|
|
185
|
+
hasText?: SerializedText;
|
|
186
|
+
hasNotText?: SerializedText;
|
|
187
|
+
visible?: boolean;
|
|
188
|
+
}
|
|
189
|
+
export {};
|
package/dist/utils.d.ts
ADDED
package/dist/utils.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { extname } from 'node:path';
|
|
3
|
+
export function validateBuildPath(buildPath, expectedExt) {
|
|
4
|
+
if (!buildPath) {
|
|
5
|
+
throw new Error('Build path not found. Please set `buildPath` in your taqwright config.');
|
|
6
|
+
}
|
|
7
|
+
const isUrl = buildPath.startsWith('http') || buildPath.startsWith('bs://') || buildPath.startsWith('lt://');
|
|
8
|
+
if (!isUrl) {
|
|
9
|
+
if (!existsSync(buildPath)) {
|
|
10
|
+
throw new Error(`Build file not found: ${buildPath}`);
|
|
11
|
+
}
|
|
12
|
+
const ext = extname(buildPath).toLowerCase();
|
|
13
|
+
if (ext !== expectedExt.toLowerCase()) {
|
|
14
|
+
throw new Error(`Build path "${buildPath}" must end in ${expectedExt}, got ${ext || '(no extension)'}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function getLatestBuildToolsVersions(versions) {
|
|
19
|
+
if (versions.length === 0)
|
|
20
|
+
return undefined;
|
|
21
|
+
const cmp = (a, b) => {
|
|
22
|
+
const pa = a.split('-')[0].split('.').map(Number);
|
|
23
|
+
const pb = b.split('-')[0].split('.').map(Number);
|
|
24
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
25
|
+
const av = pa[i] ?? 0;
|
|
26
|
+
const bv = pb[i] ?? 0;
|
|
27
|
+
if (av !== bv)
|
|
28
|
+
return av - bv;
|
|
29
|
+
}
|
|
30
|
+
const aRc = a.includes('-rc');
|
|
31
|
+
const bRc = b.includes('-rc');
|
|
32
|
+
if (aRc !== bRc)
|
|
33
|
+
return aRc ? -1 : 1;
|
|
34
|
+
return 0;
|
|
35
|
+
};
|
|
36
|
+
return [...versions].sort(cmp).pop();
|
|
37
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@taqwright/taqwright",
|
|
3
|
+
"version": "0.0.24",
|
|
4
|
+
"description": "E2E mobile testing on the Playwright runner",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/taqelah/taqwright.git"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"main": "dist/index.js",
|
|
12
|
+
"types": "dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"bin": {
|
|
20
|
+
"taqwright": "dist/bin/index.js"
|
|
21
|
+
},
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"README.md",
|
|
28
|
+
"LICENSE"
|
|
29
|
+
],
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=24.0.0 <26.0.0"
|
|
32
|
+
},
|
|
33
|
+
"overrides": {
|
|
34
|
+
"@wdio/config": {
|
|
35
|
+
"glob": "^13"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc --build && node scripts/copy-assets.mjs",
|
|
40
|
+
"clean": "tsc --build --clean",
|
|
41
|
+
"lint": "eslint .",
|
|
42
|
+
"lint:fix": "eslint . --fix",
|
|
43
|
+
"format": "prettier --write .",
|
|
44
|
+
"format:check": "prettier --check .",
|
|
45
|
+
"test": "npm run build && node --test test/*.test.js",
|
|
46
|
+
"test:watch": "node --test --watch test/*.test.js",
|
|
47
|
+
"test:coverage": "npm run build && node --test --experimental-test-coverage test/*.test.js",
|
|
48
|
+
"prepare": "npm run build",
|
|
49
|
+
"prepublishOnly": "npm run build",
|
|
50
|
+
"version": "node scripts/sync-readme-version.mjs && git add README.md"
|
|
51
|
+
},
|
|
52
|
+
"keywords": [
|
|
53
|
+
"e2e",
|
|
54
|
+
"automation",
|
|
55
|
+
"ios",
|
|
56
|
+
"android",
|
|
57
|
+
"mobile",
|
|
58
|
+
"testing",
|
|
59
|
+
"playwright",
|
|
60
|
+
"appium"
|
|
61
|
+
],
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@playwright/test": "^1.60.0",
|
|
64
|
+
"commander": "^15.0.0",
|
|
65
|
+
"node-forge": "^1.3.1",
|
|
66
|
+
"webdriver": "^9.27.2"
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@eslint/js": "^10.0.1",
|
|
70
|
+
"@types/node": "^25.9.2",
|
|
71
|
+
"@types/node-forge": "^1.3.11",
|
|
72
|
+
"eslint": "^10.4.1",
|
|
73
|
+
"eslint-config-prettier": "^10.1.8",
|
|
74
|
+
"globals": "^17.6.0",
|
|
75
|
+
"prettier": "^3.8.4",
|
|
76
|
+
"typescript": "^5.4.0",
|
|
77
|
+
"typescript-eslint": "^8.61.0"
|
|
78
|
+
}
|
|
79
|
+
}
|