react-native-harness 0.0.0 → 1.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/README.md +7 -0
- package/bin.js +3 -0
- package/dist/bundlers/metro.d.ts +5 -0
- package/dist/bundlers/metro.d.ts.map +1 -0
- package/dist/bundlers/metro.js +52 -0
- package/dist/bundlers/webpack.d.ts +2 -0
- package/dist/bundlers/webpack.d.ts.map +1 -0
- package/dist/bundlers/webpack.js +49 -0
- package/dist/commands/test.d.ts +2 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +111 -0
- package/dist/errors/appNotInstalledError.d.ts +7 -0
- package/dist/errors/appNotInstalledError.d.ts.map +1 -0
- package/dist/errors/appNotInstalledError.js +12 -0
- package/dist/errors/bridgeTimeoutError.d.ts +7 -0
- package/dist/errors/bridgeTimeoutError.d.ts.map +1 -0
- package/dist/errors/bridgeTimeoutError.js +12 -0
- package/dist/errors/errorHandler.d.ts +2 -0
- package/dist/errors/errorHandler.d.ts.map +1 -0
- package/dist/errors/errorHandler.js +138 -0
- package/dist/errors/errors.d.ts +41 -0
- package/dist/errors/errors.d.ts.map +1 -0
- package/dist/errors/errors.js +83 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/platforms/android/build.d.ts +5 -0
- package/dist/platforms/android/build.d.ts.map +1 -0
- package/dist/platforms/android/build.js +29 -0
- package/dist/platforms/android/device.d.ts +5 -0
- package/dist/platforms/android/device.d.ts.map +1 -0
- package/dist/platforms/android/device.js +36 -0
- package/dist/platforms/android/emulator.d.ts +11 -0
- package/dist/platforms/android/emulator.d.ts.map +1 -0
- package/dist/platforms/android/emulator.js +110 -0
- package/dist/platforms/android/index.d.ts +4 -0
- package/dist/platforms/android/index.d.ts.map +1 -0
- package/dist/platforms/android/index.js +56 -0
- package/dist/platforms/ios/build.d.ts +7 -0
- package/dist/platforms/ios/build.d.ts.map +1 -0
- package/dist/platforms/ios/build.js +51 -0
- package/dist/platforms/ios/device.d.ts +7 -0
- package/dist/platforms/ios/device.d.ts.map +1 -0
- package/dist/platforms/ios/device.js +51 -0
- package/dist/platforms/ios/index.d.ts +4 -0
- package/dist/platforms/ios/index.d.ts.map +1 -0
- package/dist/platforms/ios/index.js +38 -0
- package/dist/platforms/ios/simulator.d.ts +11 -0
- package/dist/platforms/ios/simulator.d.ts.map +1 -0
- package/dist/platforms/ios/simulator.js +133 -0
- package/dist/platforms/platform-adapter.d.ts +10 -0
- package/dist/platforms/platform-adapter.d.ts.map +1 -0
- package/dist/platforms/platform-adapter.js +1 -0
- package/dist/platforms/platform-registry.d.ts +3 -0
- package/dist/platforms/platform-registry.d.ts.map +1 -0
- package/dist/platforms/platform-registry.js +19 -0
- package/dist/platforms/web/index.d.ts +4 -0
- package/dist/platforms/web/index.d.ts.map +1 -0
- package/dist/platforms/web/index.js +73 -0
- package/dist/process.d.ts +3 -0
- package/dist/process.d.ts.map +1 -0
- package/dist/process.js +28 -0
- package/dist/reporters/default-reporter.d.ts +3 -0
- package/dist/reporters/default-reporter.d.ts.map +1 -0
- package/dist/reporters/default-reporter.js +116 -0
- package/dist/reporters/junit-reporter.d.ts +3 -0
- package/dist/reporters/junit-reporter.d.ts.map +1 -0
- package/dist/reporters/junit-reporter.js +119 -0
- package/dist/reporters/live-reporter.d.ts +20 -0
- package/dist/reporters/live-reporter.d.ts.map +1 -0
- package/dist/reporters/live-reporter.js +176 -0
- package/dist/src/reporters/default-reporter.js +135 -0
- package/dist/test-reporter-demo.js +95 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +11 -0
- package/eslint.config.mjs +19 -0
- package/package.json +16 -8
- package/src/bundlers/metro.ts +79 -0
- package/src/commands/test.ts +189 -0
- package/src/errors/errorHandler.ts +184 -0
- package/src/errors/errors.ts +109 -0
- package/src/index.ts +52 -0
- package/src/platforms/android/build.ts +48 -0
- package/src/platforms/android/device.ts +48 -0
- package/src/platforms/android/emulator.ts +139 -0
- package/src/platforms/android/index.ts +87 -0
- package/src/platforms/ios/build.ts +76 -0
- package/src/platforms/ios/device.ts +76 -0
- package/src/platforms/ios/index.ts +55 -0
- package/src/platforms/ios/simulator.ts +177 -0
- package/src/platforms/platform-adapter.ts +11 -0
- package/src/platforms/platform-registry.ts +24 -0
- package/src/platforms/web/index.ts +95 -0
- package/src/process.ts +33 -0
- package/src/reporters/default-reporter.ts +149 -0
- package/src/reporters/junit-reporter.ts +179 -0
- package/src/utils.ts +12 -0
- package/tsconfig.json +16 -0
- package/tsconfig.lib.json +33 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { color, logger } from '@react-native-harness/tools';
|
|
2
|
+
export const defaultReporter = {
|
|
3
|
+
report: async (results) => {
|
|
4
|
+
logger.log('\n📋 Test Results');
|
|
5
|
+
console.log(color.dim('━'.repeat(60)));
|
|
6
|
+
for (const suite of results) {
|
|
7
|
+
console.log(formatSuiteResult(suite));
|
|
8
|
+
}
|
|
9
|
+
console.log(color.dim('━'.repeat(60)));
|
|
10
|
+
// Summary
|
|
11
|
+
let totalPassed = 0, totalFailed = 0, totalSkipped = 0, totalTodo = 0;
|
|
12
|
+
let totalDuration = 0;
|
|
13
|
+
for (const suite of results) {
|
|
14
|
+
const summary = getTestSummary(suite);
|
|
15
|
+
totalPassed += summary.passed;
|
|
16
|
+
totalFailed += summary.failed;
|
|
17
|
+
totalSkipped += summary.skipped;
|
|
18
|
+
totalTodo += summary.todo;
|
|
19
|
+
totalDuration += suite.duration || 0;
|
|
20
|
+
}
|
|
21
|
+
// Create summary with modern styling
|
|
22
|
+
const summaryParts = [];
|
|
23
|
+
if (totalPassed > 0) {
|
|
24
|
+
summaryParts.push(color.green(`${totalPassed} passed`));
|
|
25
|
+
}
|
|
26
|
+
if (totalFailed > 0) {
|
|
27
|
+
summaryParts.push(color.red(`${totalFailed} failed`));
|
|
28
|
+
}
|
|
29
|
+
if (totalSkipped > 0) {
|
|
30
|
+
summaryParts.push(color.yellow(`${totalSkipped} skipped`));
|
|
31
|
+
}
|
|
32
|
+
if (totalTodo > 0) {
|
|
33
|
+
summaryParts.push(color.blue(`${totalTodo} todo`));
|
|
34
|
+
}
|
|
35
|
+
const summaryText = summaryParts.join(color.dim(' • '));
|
|
36
|
+
const durationText = formatDuration(totalDuration);
|
|
37
|
+
logger.info(`📊 Summary: ${summaryText}${durationText}`);
|
|
38
|
+
// Show appropriate final message
|
|
39
|
+
if (totalFailed === 0 && totalPassed > 0) {
|
|
40
|
+
logger.success('All tests passed! 🎉');
|
|
41
|
+
}
|
|
42
|
+
else if (totalFailed > 0) {
|
|
43
|
+
logger.error(`${totalFailed} test${totalFailed === 1 ? '' : 's'} failed`);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
const formatDuration = (duration) => {
|
|
48
|
+
if (!duration)
|
|
49
|
+
return '';
|
|
50
|
+
return color.dim(` (${duration}ms)`);
|
|
51
|
+
};
|
|
52
|
+
const getStatusIcon = (status) => {
|
|
53
|
+
switch (status) {
|
|
54
|
+
case 'passed':
|
|
55
|
+
return color.green('✓');
|
|
56
|
+
case 'failed':
|
|
57
|
+
return color.red('✗');
|
|
58
|
+
case 'skipped':
|
|
59
|
+
return color.yellow('○');
|
|
60
|
+
case 'todo':
|
|
61
|
+
return color.blue('◐');
|
|
62
|
+
default:
|
|
63
|
+
return '?';
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const formatTestResult = (test, indent = '') => {
|
|
67
|
+
const icon = getStatusIcon(test.status);
|
|
68
|
+
const name = test.status === 'failed' ? color.red(test.name) : test.name;
|
|
69
|
+
const duration = formatDuration(test.duration);
|
|
70
|
+
let result = `${indent}${icon} ${name}${duration}`;
|
|
71
|
+
if (test.error) {
|
|
72
|
+
const errorLines = test.error.message?.split('\n') || [];
|
|
73
|
+
result +=
|
|
74
|
+
'\n' +
|
|
75
|
+
errorLines
|
|
76
|
+
.map((line) => `${indent} ${color.red(line)}`)
|
|
77
|
+
.join('\n');
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
};
|
|
81
|
+
const formatSuiteResult = (suite, indent = '') => {
|
|
82
|
+
const icon = getStatusIcon(suite.status);
|
|
83
|
+
const name = suite.status === 'failed'
|
|
84
|
+
? color.red(color.bold(suite.name))
|
|
85
|
+
: color.bold(color.cyan(suite.name));
|
|
86
|
+
const duration = formatDuration(suite.duration);
|
|
87
|
+
let result = `${indent}${icon} ${name}${duration}`;
|
|
88
|
+
if (suite.error) {
|
|
89
|
+
const errorLines = suite.error.message.split('\n');
|
|
90
|
+
result +=
|
|
91
|
+
'\n' +
|
|
92
|
+
errorLines
|
|
93
|
+
.map((line) => `${indent} ${color.red(line)}`)
|
|
94
|
+
.join('\n');
|
|
95
|
+
}
|
|
96
|
+
const childIndent = indent + ' ';
|
|
97
|
+
// Format tests
|
|
98
|
+
for (const test of suite.tests) {
|
|
99
|
+
result += '\n' + formatTestResult(test, childIndent);
|
|
100
|
+
}
|
|
101
|
+
// Format nested suites
|
|
102
|
+
for (const childSuite of suite.suites) {
|
|
103
|
+
result += '\n' + formatSuiteResult(childSuite, childIndent);
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
};
|
|
107
|
+
const getTestSummary = (suite) => {
|
|
108
|
+
let passed = 0, failed = 0, skipped = 0, todo = 0;
|
|
109
|
+
// Count tests in current suite
|
|
110
|
+
for (const test of suite.tests) {
|
|
111
|
+
switch (test.status) {
|
|
112
|
+
case 'passed':
|
|
113
|
+
passed++;
|
|
114
|
+
break;
|
|
115
|
+
case 'failed':
|
|
116
|
+
failed++;
|
|
117
|
+
break;
|
|
118
|
+
case 'skipped':
|
|
119
|
+
skipped++;
|
|
120
|
+
break;
|
|
121
|
+
case 'todo':
|
|
122
|
+
todo++;
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Count tests in nested suites
|
|
127
|
+
for (const childSuite of suite.suites) {
|
|
128
|
+
const childSummary = getTestSummary(childSuite);
|
|
129
|
+
passed += childSummary.passed;
|
|
130
|
+
failed += childSummary.failed;
|
|
131
|
+
skipped += childSummary.skipped;
|
|
132
|
+
todo += childSummary.todo;
|
|
133
|
+
}
|
|
134
|
+
return { passed, failed, skipped, todo };
|
|
135
|
+
};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { defaultReporter } from './src/reporters/default-reporter.js';
|
|
2
|
+
// Sample test results to demonstrate the new styling
|
|
3
|
+
const sampleResults = [
|
|
4
|
+
{
|
|
5
|
+
name: 'User Authentication Tests',
|
|
6
|
+
status: 'passed',
|
|
7
|
+
duration: 1250,
|
|
8
|
+
tests: [
|
|
9
|
+
{
|
|
10
|
+
name: 'should login with valid credentials',
|
|
11
|
+
status: 'passed',
|
|
12
|
+
duration: 450,
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: 'should show error with invalid credentials',
|
|
16
|
+
status: 'passed',
|
|
17
|
+
duration: 320,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'should handle network errors gracefully',
|
|
21
|
+
status: 'failed',
|
|
22
|
+
duration: 180,
|
|
23
|
+
error: {
|
|
24
|
+
name: 'NetworkError',
|
|
25
|
+
message: 'Connection timeout after 30 seconds',
|
|
26
|
+
stack: 'NetworkError: Connection timeout after 30 seconds\n at fetch (native)\n at login (auth.js:15:10)',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
suites: [],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'Navigation Tests',
|
|
34
|
+
status: 'passed',
|
|
35
|
+
duration: 890,
|
|
36
|
+
tests: [
|
|
37
|
+
{
|
|
38
|
+
name: 'should navigate to home screen',
|
|
39
|
+
status: 'passed',
|
|
40
|
+
duration: 210,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'should navigate to profile screen',
|
|
44
|
+
status: 'skipped',
|
|
45
|
+
duration: 0,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'should handle deep linking',
|
|
49
|
+
status: 'todo',
|
|
50
|
+
duration: 0,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
suites: [],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'Component Tests',
|
|
57
|
+
status: 'failed',
|
|
58
|
+
duration: 650,
|
|
59
|
+
tests: [
|
|
60
|
+
{
|
|
61
|
+
name: 'should render button correctly',
|
|
62
|
+
status: 'passed',
|
|
63
|
+
duration: 120,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'should handle button press',
|
|
67
|
+
status: 'failed',
|
|
68
|
+
duration: 95,
|
|
69
|
+
error: {
|
|
70
|
+
name: 'AssertionError',
|
|
71
|
+
message: 'Expected element to be visible but it was not found',
|
|
72
|
+
stack: 'AssertionError: Expected element to be visible but it was not found\n at expect (test-utils.js:25:10)',
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
suites: [
|
|
77
|
+
{
|
|
78
|
+
name: 'Nested Component Tests',
|
|
79
|
+
status: 'passed',
|
|
80
|
+
duration: 280,
|
|
81
|
+
tests: [
|
|
82
|
+
{
|
|
83
|
+
name: 'should render nested component',
|
|
84
|
+
status: 'passed',
|
|
85
|
+
duration: 150,
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
suites: [],
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
// Run the demo
|
|
94
|
+
console.log('🧪 Testing Updated Default Reporter\n');
|
|
95
|
+
await defaultReporter.report(sampleResults);
|
|
@@ -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.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.esnext.intl.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/commander/typings/index.d.ts","../node_modules/commander/typings/esm.d.mts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/globals.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/dom-events.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.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/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/globals.global.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/ws/index.d.mts","../../../node_modules/birpc/dist/index.d.ts","../../bridge/dist/shared/test-runner.d.ts","../../bridge/dist/shared/test-collector.d.ts","../../bridge/dist/shared.d.ts","../../bridge/dist/server.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","../../config/dist/types.d.ts","../../config/dist/reader.d.ts","../../config/dist/errors.d.ts","../../config/dist/index.d.ts","../src/platforms/platform-adapter.ts","../../tools/dist/abort.d.ts","../../../node_modules/picocolors/types.d.ts","../../../node_modules/picocolors/picocolors.d.ts","../../tools/dist/color.d.ts","../../tools/dist/logger.d.ts","../../../node_modules/@clack/core/dist/index.d.mts","../../../node_modules/@clack/prompts/dist/index.d.mts","../../tools/dist/prompts.d.ts","../../../node_modules/nano-spawn/source/index.d.ts","../../tools/dist/spawn.d.ts","../../tools/dist/react-native.d.ts","../../tools/dist/index.d.ts","../src/platforms/android/emulator.ts","../src/platforms/android/build.ts","../src/process.ts","../src/bundlers/metro.ts","../src/errors/errors.ts","../src/platforms/android/index.ts","../src/platforms/ios/simulator.ts","../src/platforms/ios/build.ts","../src/platforms/ios/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/platforms/web/index.ts","../src/platforms/platform-registry.ts","../../../node_modules/minipass/dist/esm/index.d.ts","../node_modules/lru-cache/dist/esm/index.d.ts","../node_modules/path-scurry/dist/esm/index.d.ts","../node_modules/minimatch/dist/esm/ast.d.ts","../node_modules/minimatch/dist/esm/escape.d.ts","../node_modules/minimatch/dist/esm/unescape.d.ts","../node_modules/minimatch/dist/esm/index.d.ts","../node_modules/glob/dist/esm/pattern.d.ts","../node_modules/glob/dist/esm/processor.d.ts","../node_modules/glob/dist/esm/walker.d.ts","../node_modules/glob/dist/esm/ignore.d.ts","../node_modules/glob/dist/esm/glob.d.ts","../node_modules/glob/dist/esm/has-magic.d.ts","../node_modules/glob/dist/esm/index.d.ts","../../bridge/dist/index.d.ts","../src/reporters/default-reporter.ts","../src/utils.ts","../src/commands/test.ts","../src/errors/errorhandler.ts","../src/index.ts","../src/platforms/android/device.ts","../src/platforms/ios/device.ts","../src/reporters/junit-reporter.ts","../../tools/dist/isinteractive.d.ts","../../tools/src/abort.ts","../../tools/src/color.ts","../../tools/src/isinteractive.ts","../../tools/src/logger.ts","../../tools/src/prompts.ts","../../tools/src/spawn.ts"],"fileIdsList":[[83,86,98],[86,98,136],[52,98],[55,98],[56,61,89,98],[57,68,69,76,86,97,98],[57,58,68,76,98],[59,98],[60,61,69,77,98],[61,86,94,98],[62,64,68,76,98],[63,98],[64,65,98],[68,98],[66,68,98],[68,69,70,86,97,98],[68,69,70,83,86,89,98],[98,102],[98],[64,68,71,76,86,97,98],[68,69,71,72,76,86,94,97,98],[71,73,86,94,97,98],[52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104],[68,74,98],[75,97,98],[64,68,76,86,98],[77,98],[78,98],[55,79,98],[80,96,98,102],[81,98],[82,98],[68,83,84,98],[83,85,98,100],[56,68,86,87,88,89,98],[56,86,88,98],[86,87,98],[89,98],[90,98],[68,92,93,98],[92,93,98],[61,76,86,94,98],[95,98],[76,96,98],[56,71,82,97,98],[61,98],[86,98,99],[98,100],[98,101],[56,61,68,70,79,86,97,98,100,102],[86,98,103],[68,71,73,76,86,94,97,98,103,105],[68,90,98,105],[57,98],[98,132],[98,154],[57,69,86,98,152,153],[98,155],[48,98],[98,124],[98,114,115],[98,112,113,114,116,117,122],[98,113,114],[98,122],[98,123],[98,114],[98,112,113,114,117,118,119,120,121],[98,112,113,124],[98,110],[98,106,107,110],[98,108,109],[50,98],[98,159,161,165,166,169],[98,170],[98,161,165,168],[98,159,161,165,168,169,170,171],[98,165],[98,161,165,166,168],[98,159,161,166,167,169],[98,162,163,164],[69,78,98,159,160],[49,57,98,142],[49,98,111,129,130,142,147,158,172,173,174,175],[49,98,129,147,175],[49,98,129],[49,51,69,78,97,98,142,176,177],[49,78,98,142],[49,98,142],[49,57,98,129,130,142,143,144,145,146,147],[49,98,129,130,145,146,147,149,150],[49,98,130,148,151,157],[49,98,129,130,142,146,156],[49,57,98],[49,98,129,142,173],[49,69,78,98,129,173],[49,98],[98,126,127,128],[98,126],[98,125],[98,133],[98,131,134,135,138,140,141],[98,137],[98,139]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","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":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","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":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","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":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","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":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","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":"1a2ae3df505891912038749a39e434643cf1f91a578475ae049f36e35c870c58","impliedFormat":1},{"version":"b124c0624b15412ace7d54644ade38d7a69db7e25488a1a4d2a8df6e11696538","impliedFormat":99},{"version":"7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"f749812878fecfa53cfc13b36e5d35086fb6377983a9df44175da83ccc23af1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7d2e3fea24c712c99c03ad8f556abedbfe105f87f1be10b95dbd409d24bc05a3","impliedFormat":1},{"version":"211e3f15fbced4ab4be19f49ffa990b9ff20d749d33b65ff753be691e7616239","affectsGlobalScope":true,"impliedFormat":1},{"version":"3719525a8f6ab731e3dfd585d9f87df55ec7d50d461df84f74eb4d68bb165244","impliedFormat":1},{"version":"5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713","impliedFormat":1},{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"e596c9bb2f29a2699fdd4ae89139612652245192f67f45617c5a4b20832aaae9","impliedFormat":1},{"version":"bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","impliedFormat":1},{"version":"1cdcfc1f624d6c08aa12c73935f6e13f095919cd99edf95752951796eb225729","impliedFormat":1},{"version":"4eaff3d8e10676fd7913d8c108890e71c688e1e7d52f6d1d55c39514f493dc47","impliedFormat":1},{"version":"14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","impliedFormat":1},{"version":"5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"00dee7cdca8b8420c47ea4a31a34b8e8294013ebc4f463fd941e867e7bf05029","affectsGlobalScope":true,"impliedFormat":1},{"version":"3256f3cccd578f9e7fe3a28096c505634bebcee8afb738ffa99368e536ca3a0b","impliedFormat":1},{"version":"1c84b46267610a34028edfd0d035509341751262bac1062857f3c8df7aff7153","impliedFormat":1},{"version":"7f138842074d0a40681775af008c8452093b68c383c94de31759e853c6d06b5c","impliedFormat":1},{"version":"a3d541d303ee505053f5dcbf9fafb65cac3d5631037501cd616195863a6c5740","impliedFormat":1},{"version":"8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","impliedFormat":1},{"version":"2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58","impliedFormat":1},{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true,"impliedFormat":1},{"version":"bcebb922784739bdb34c18ee51095d25a92b560c78ccd2eaacd6bd00f7443d83","impliedFormat":1},{"version":"7ee6ed878c4528215c82b664fe0cfe80e8b4da6c0d4cc80869367868774db8b1","impliedFormat":1},{"version":"b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30","impliedFormat":1},{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0715e4cd28ad471b2a93f3e552ff51a3ae423417a01a10aa1d3bc7c6b95059d6","affectsGlobalScope":true,"impliedFormat":1},{"version":"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","impliedFormat":1},{"version":"210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","impliedFormat":1},{"version":"36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","impliedFormat":1},{"version":"0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","impliedFormat":1},{"version":"25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","impliedFormat":1},{"version":"4f3fdeba4e28e21aa719c081b8dc8f91d47e12e773389b9d35679c08151c9d37","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","impliedFormat":1},{"version":"f69ff39996a61a0dd10f4bce73272b52e8024a4d58b13ab32bf4712909d0a2b7","impliedFormat":1},{"version":"3c4ba1dd9b12ffa284b565063108f2f031d150ea15b8fafbdc17f5d2a07251f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","impliedFormat":1},{"version":"1422cd9e705adcc09088fda85a900c2b70e3ad36ea85846f68bd1a884cdf4e2b","impliedFormat":1},{"version":"3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","impliedFormat":1},{"version":"5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2","impliedFormat":1},{"version":"a73ae8c0e62103bb9e21bb6538700881bf135b9a8b125b857ec68edfa0da4ed3","affectsGlobalScope":true,"impliedFormat":1},{"version":"e1c1b2fbe236bf7ee3e342eeae7e20efb8988a0ac7da1cbbfa2c1f66b76c3423","affectsGlobalScope":true,"impliedFormat":1},{"version":"868831cab82b65dfe1d68180e898af1f2101e89ba9b754d1db6fb8cc2fac1921","impliedFormat":1},{"version":"0fe8985a28f82c450a04a6edf1279d7181c0893f37da7d2a27f8efd4fd5edb03","impliedFormat":1},{"version":"e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa","impliedFormat":1},{"version":"52120bb7e4583612225bdf08e7c12559548170f11e660d33a33623bae9bbdbba","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6dd3dba8e665ac43d279e0fdf5219edda0eed69b5e9a5061f46cd6a65c4f7a1","impliedFormat":1},{"version":"316f1486e15cbf7896425f0a16dfe12d447dd57cfb3244b8b119c77df870858f","impliedFormat":99},{"version":"f2ee9c0f4e3e40fa79743b5bad3d085d41cf6854c68687737c00d3f6d0ed7941","impliedFormat":99},{"version":"be389ee0d0f5e70329ea4c2fb44b7716e7ceda3680fa0ee32c22329ef8ef7e60","impliedFormat":99},{"version":"402ac3b4c96c5718d18c00339c6e4c66ff0b1a0d8a166570107472342fd57e7a","impliedFormat":99},{"version":"0df9e64851cbe9801f868551cae57fffd2d4339ac98b4d6ff00aad10a5cd8f33","impliedFormat":99},{"version":"18b54e0f8a18bb6b39598a08fe20f310fe683c6e0421bd1d2cda71faeb36e630","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":"7b1626355a7fc135e6abf7d07c5a0d3e3d8ee2d48c073eb7b00f4d8ceca47d87","impliedFormat":99},{"version":"32ae4dd91e565f7e81d22807dcfe460b766d52d7e47141ff0a12a9d3ade09616","impliedFormat":99},{"version":"ab21498cc9c3434e5d72dede3ec195c94b992f2c37b2e8458e06503ae428d626","impliedFormat":99},{"version":"bac31d869789d8dcf7c14dd0d0fae67acea2437fdaf23e4a120eb4bcd5c7d88a","impliedFormat":99},{"version":"8e759f5797c82cb8b75098ed472371537d9c96e7beb4794f7ffef8b6349e09bb","signature":"33039f6557774d3b82268b2bd148d32e384f56b99d465c8bb293ef109e837654","impliedFormat":99},{"version":"3e442c402123b264ccdf7123c1366e1473d9c39f5db69373e938284fc01c49ce","impliedFormat":99},{"version":"590595c1230ebb7c43ebac51b2b2da956a719b213355b4358e2a6b16a8b5936c","impliedFormat":1},{"version":"8c5f0739f00f89f89b03a1fe6658c6d78000d7ebd7f556f0f8d6908fa679de35","impliedFormat":1},{"version":"a15c0df1ac9b2a4d833490522614fc57ae97d70a07bf4964a4d6bb73f3f56399","impliedFormat":99},{"version":"e4cead4a8596a6f051c36ef184f5fb6f117232eefdc1f98ef9847c9efc2c8911","impliedFormat":99},{"version":"e191585a6a460d89791b3d3d39a10607bbcefa7f7c9812af6ca5f11c33d398d1","impliedFormat":99},{"version":"24379e38ef6db808a7aed9b162dae44d16f84f63c04994efb8b0106bcc589909","impliedFormat":99},{"version":"8af66ec621033f41ccb2bcee775e883c2649fa0db71192fe863185b0281082a6","impliedFormat":99},{"version":"9d4af7bde3e345d3071b5fefbece2d3482971aae89ded50f302c8cb246e81581","impliedFormat":99},{"version":"f3eb748185038bca941a02994b1b0b5803c0a2ce818b8a7d72a24a6b814f5d3e","impliedFormat":99},{"version":"2ba26b5ab00dd3495eeb733cdb46d939a8eb755a395a91169158cdf962aff6c3","impliedFormat":99},{"version":"2e1c22b413f96fd388774b174588816f4bd787486ecfe74f5bcb361dd6bfce50","impliedFormat":99},{"version":"6eefa861b6aa125e0f5f8ad9f2f5d9cebee21ecc5f78d4494faf47a637d6208c","signature":"6fe995c2a73841b3fcd30e41789898aca49aa8873554db00f6f14c12a60eeefa","impliedFormat":99},{"version":"c86d845c9dd0aec9a416a2f9d409f19beb105abd650228a15c5cd731d96ddcf7","signature":"5a5615df20c0bdc3ed37d12b4d18ad0668a9fa9c94a6a25505aa644855e862aa","impliedFormat":99},{"version":"69798070e4c8f8553c7ed95b3210904b4448a2caf41d94e9f75a9f816691b1c7","signature":"ce1abe69f27b27079836681c6cdd68b7580e8ccbfe03e2707928241a9b244df5","impliedFormat":99},{"version":"b64eea7b48f02b36e66b4bda1a00862183c7dfeb97fff332c0df8009af449c16","signature":"a5988ef9d5643ff7dc67acc7613caf97069e0940797458fe20c8eb6506aa7e7e","impliedFormat":99},{"version":"c1760e09dd9e385870ba7f8dbb58eecd82951023efcbf5a45127728d44cb0a48","signature":"e9d0ff10b45cdd0f19764775f30faa7c1e2f18d314386d6e3ee4e77f97a3ff32","impliedFormat":99},{"version":"86ecd4570243533a3580afb652d4cb0bd7fe5875883efc989074dde45fbb05c3","signature":"1d283a2b9afc40a8734a3e8b901fec2b965635d8c1cf889ff51797857ae0f8b1","impliedFormat":99},{"version":"6c8cad21e5bbab92666187c13780cb183dec37b10fcaed3e3e8b981ef70f1c7c","signature":"bf54878ba05f58cd83ee75460343ee878f6fb1eff2c90f2ededd2cd474375f0d","impliedFormat":99},{"version":"10af6ab7f300b0efea1b97b67048a6bad016600d175654dae193ad46134287e7","signature":"90086ab58d5d9e95e55850554ca9e35850b6531e8ada7da93c4b61bdee2647ba","impliedFormat":99},{"version":"43770b6a8c1132dd655a7e8bb834d97209ce371f92dca12ecb200c1bb205e8cb","signature":"df429fc17c447fc67d0390c2d78f838378786fbd0cc989b6948fc1cd7262c17a","impliedFormat":99},{"version":"e27b7ea88d3795a698ae3454516e785c58a100d2da74d58e82ca6c3f173a5607","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"a7589d618b8b27dc24d61eaf0b66e3e02f0a53982c25fe2727c9d95a6db7cf0e","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"b07f64ff6ec710998a62b07377fbda0ab4c313ba1f0055bfe9faa22cffedd47c","impliedFormat":1},{"version":"c2aca6a7d061fa57df9a0a50b9ef9b6d611b77cfd23461edc7be01375e24a784","signature":"86172af4524210fbeb025fcabea1268e78715fc0a420b916d6a8cd20934e7eeb","impliedFormat":99},{"version":"8db703ab718fba5f6263e2b414dbbb42b4f6f8202e55fd449820df0f69594e49","signature":"9f1bad9472cb60fb2bcd138efef4f1b613b91410f44fda0d830184ab06f4b8ef","impliedFormat":99},{"version":"4115aa147c5a64817fb55274b44087cbf1bc90f54906bfdfc9ee847a71cd91cf","impliedFormat":99},{"version":"599b42c2c7227d59788f9239a30b16e465e15127c7c4541d30b801c23ca681e6","impliedFormat":99},{"version":"072f583571d6e3d30cd9760ee3485d29484fb7b54ba772ac135c747a380096a1","impliedFormat":99},{"version":"7212c2d58855b8df35275180e97903a4b6093d4fbaefea863d8d028da63938c6","impliedFormat":99},{"version":"5bd0f306b4a9dc65bccf38d9295bc52720d2fa455e06f604529d981b5eb8d9dc","impliedFormat":99},{"version":"f30992084e86f4b4c223c558b187cb0a9e83071592bd830d8ff2a471ee2bf2d4","impliedFormat":99},{"version":"854045924626ba585f454b53531c42aed4365f02301aa8eca596423f4675b71f","impliedFormat":99},{"version":"dd9faff42b456b5f03b85d8fbd64838eb92f6f7b03b36322cbc59c005b7033d3","impliedFormat":99},{"version":"6ff702721d87c0ba8e7f8950e7b0a3b009dfd912fab3997e0b63fab8d83919c3","impliedFormat":99},{"version":"9dce9fc12e9a79d1135699d525aa6b44b71a45e32e3fa0cf331060b980b16317","impliedFormat":99},{"version":"586b2fd8a7d582329658aaceec22f8a5399e05013deb49bcfde28f95f093c8ee","impliedFormat":99},{"version":"59c44b081724d4ab8039988aba34ee6b3bd41c30fc2d8686f4ed06588397b2f7","impliedFormat":99},{"version":"ef1f3eadd7bed282de45bafd7c2c00105cf1db93e22f6cd763bec8a9c2cf6df1","impliedFormat":99},{"version":"3d8885d13f76ff35b7860039e83c936ff37553849707c2fd1d580d193a52be5b","impliedFormat":99},{"version":"a955c49e9dc38915d1a9860dc049a3b5fa46cb4e9b832ebcde89d96d6e68b8e3","impliedFormat":99},{"version":"a1458c573dea42ad7717f60fa0cd280429cd406ea8f997e62f396b0780dc519e","signature":"7eafa82caf0883050cc715861484f1126fdf12900095e0dfeeac0ac8cd884343","impliedFormat":99},{"version":"7fb7e1c1820efcfc66a478e400e9b60546aaa3d5856a3f47a1f752b34c0e684b","signature":"18036d59518e53236d9c59440b5b98b8bd3c717e96b35074dd99ec73465c1156","impliedFormat":99},{"version":"943e4d430b34af4b8acfb293497df8fbb1a335a6846ff8e448a35b2e1ec4cb65","signature":"a1bd754cf6b1b8e70370e8dbad7d4abd7d73178fa1e0eb1956f36ab72b5d7144","impliedFormat":99},{"version":"c1e5c3c334c1e941b599b2461e2ffd0e8e2a36f0b4f9de1bc652da6375b44b15","signature":"72bde9177d6ecb7d2a45761aaa15ef458bf60bedd2071150f8b2c60445c3b115","impliedFormat":99},{"version":"f3c71b768f069f48a2e2bdee211f4705e64f7988f3a514bb34cc2a299c002166","signature":"43e818adf60173644896298637f47b01d5819b17eda46eaa32d0c7d64724d012","impliedFormat":99},{"version":"a7a0f447cd9fef8b36c1f55038df6b2358d871c0e62ca302cf59eee1493db464","signature":"be79133144bff926c2ec3a838ec1d42fa7a3ca4556199654d047c6588e709ab5","impliedFormat":99},{"version":"10af6ab7f300b0efea1b97b67048a6bad016600d175654dae193ad46134287e7","signature":"90086ab58d5d9e95e55850554ca9e35850b6531e8ada7da93c4b61bdee2647ba","impliedFormat":99},{"version":"ae3e1911c27e8a5db2eb579296c0952809d40c8f38c18e0f58e8fc483fe6e1e5","signature":"e6761f0a3e4e68466d38327d5cd380f5f3c75810fd82cafed45110d60d40a3cc","impliedFormat":99},{"version":"20666143132be33320b033fe7e995c3ce1dcd82585ec140bc833d2abe0bc927a","impliedFormat":99}],"root":[130,131,134,135,138,140,[143,151],157,158,[174,182]],"resolvedRoot":[[131,183],[134,184],[182,185],[135,186],[138,187],[140,188]],"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":[[136,1],[137,2],[52,3],[53,3],[55,4],[56,5],[57,6],[58,7],[59,8],[60,9],[61,10],[62,11],[63,12],[64,13],[65,13],[67,14],[66,15],[68,14],[69,16],[70,17],[54,18],[104,19],[71,20],[72,21],[73,22],[105,23],[74,24],[75,25],[76,26],[77,27],[78,28],[79,29],[80,30],[81,31],[82,32],[83,33],[84,33],[85,34],[86,35],[88,36],[87,37],[89,38],[90,39],[91,19],[92,40],[93,41],[94,42],[95,43],[96,44],[97,45],[98,46],[99,47],[100,48],[101,49],[102,50],[103,51],[106,52],[107,19],[159,53],[139,54],[133,55],[132,19],[155,56],[152,19],[153,56],[154,57],[156,58],[49,59],[48,19],[46,19],[47,19],[8,19],[10,19],[9,19],[2,19],[11,19],[12,19],[13,19],[14,19],[15,19],[16,19],[17,19],[18,19],[3,19],[19,19],[20,19],[4,19],[21,19],[25,19],[22,19],[23,19],[24,19],[26,19],[27,19],[28,19],[5,19],[29,19],[30,19],[31,19],[32,19],[6,19],[36,19],[33,19],[34,19],[35,19],[37,19],[7,19],[38,19],[43,19],[44,19],[39,19],[40,19],[41,19],[42,19],[1,19],[45,19],[125,60],[116,61],[123,62],[118,19],[119,19],[117,63],[120,64],[112,19],[113,19],[124,65],[115,66],[121,19],[122,67],[114,68],[173,69],[111,70],[110,71],[109,19],[108,19],[51,72],[50,19],[170,73],[171,74],[169,75],[172,76],[166,77],[167,78],[168,79],[160,19],[162,77],[163,77],[165,80],[164,77],[161,81],[146,82],[176,83],[177,84],[147,85],[178,86],[144,87],[179,88],[143,82],[148,89],[150,88],[180,88],[151,90],[149,88],[130,85],[158,91],[157,92],[145,93],[174,94],[181,95],[175,96],[128,19],[129,97],[127,98],[126,99],[131,19],[134,100],[142,101],[182,19],[135,19],[138,102],[141,19],[140,103]],"latestChangedDtsFile":"./platforms/ios/build.d.ts","version":"5.8.3"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAI7E;AAED,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B"}
|
package/dist/utils.js
ADDED
|
@@ -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
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-harness",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
"
|
|
3
|
+
"version": "1.0.0-alpha.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"react-native-harness": "./bin.js"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"commander": "^14.0.0",
|
|
10
|
+
"glob": "^11.0.0",
|
|
11
|
+
"playwright": "^1.53.2",
|
|
12
|
+
"tslib": "^2.3.0",
|
|
13
|
+
"@react-native-harness/config": "1.0.0-alpha.1",
|
|
14
|
+
"@react-native-harness/bridge": "1.0.0-alpha.1",
|
|
15
|
+
"@react-native-harness/tools": "1.0.0-alpha.1"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/node": "18.16.9"
|
|
11
19
|
}
|
|
12
20
|
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { type ChildProcess } from 'node:child_process';
|
|
2
|
+
import {
|
|
3
|
+
getReactNativeCliPath,
|
|
4
|
+
getExpoCliPath,
|
|
5
|
+
getTimeoutSignal,
|
|
6
|
+
spawn,
|
|
7
|
+
SubprocessError,
|
|
8
|
+
} from '@react-native-harness/tools';
|
|
9
|
+
|
|
10
|
+
const METRO_PORT = 8081;
|
|
11
|
+
|
|
12
|
+
export const runMetro = async (isExpo = false): Promise<ChildProcess> => {
|
|
13
|
+
const metro = spawn(
|
|
14
|
+
'node',
|
|
15
|
+
[
|
|
16
|
+
isExpo ? getExpoCliPath() : getReactNativeCliPath(),
|
|
17
|
+
'start',
|
|
18
|
+
'--port',
|
|
19
|
+
METRO_PORT.toString(),
|
|
20
|
+
],
|
|
21
|
+
{
|
|
22
|
+
env: {
|
|
23
|
+
...process.env,
|
|
24
|
+
RN_HARNESS: 'true',
|
|
25
|
+
...(isExpo && { EXPO_NO_METRO_WORKSPACE_ROOT: 'true' }),
|
|
26
|
+
},
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
metro.catch((error) => {
|
|
31
|
+
// This process is going to be killed by us, so we don't need to throw an error
|
|
32
|
+
if (error instanceof SubprocessError && error.signalName === 'SIGTERM') {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
throw error;
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
await waitForMetro();
|
|
40
|
+
return metro.nodeChildProcess;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const waitForMetro = async (
|
|
44
|
+
port = 8081,
|
|
45
|
+
maxRetries = 20,
|
|
46
|
+
retryDelay = 1000
|
|
47
|
+
): Promise<void> => {
|
|
48
|
+
let attempts = 0;
|
|
49
|
+
|
|
50
|
+
while (attempts < maxRetries) {
|
|
51
|
+
attempts++;
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
const response = await fetch(`http://localhost:${port}/status`, {
|
|
55
|
+
signal: getTimeoutSignal(100),
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
if (response.ok) {
|
|
59
|
+
const body = await response.text();
|
|
60
|
+
|
|
61
|
+
if (body === 'packager-status:running') {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
} catch {
|
|
66
|
+
// Errors are expected here, we're just waiting for the process to be ready
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (attempts < maxRetries) {
|
|
70
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelay));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
throw new Error(`Metro bundler is not ready after ${maxRetries} attempts`);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const reloadApp = async (): Promise<void> => {
|
|
78
|
+
await fetch(`http://localhost:${METRO_PORT}/reload`);
|
|
79
|
+
};
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getBridgeServer,
|
|
3
|
+
type BridgeServer,
|
|
4
|
+
} from '@react-native-harness/bridge/server';
|
|
5
|
+
import {
|
|
6
|
+
Config,
|
|
7
|
+
getConfig,
|
|
8
|
+
TestRunnerConfig,
|
|
9
|
+
} from '@react-native-harness/config';
|
|
10
|
+
import { getPlatformAdapter } from '../platforms/platform-registry.js';
|
|
11
|
+
import { Glob } from 'glob';
|
|
12
|
+
import { defaultReporter } from '../reporters/default-reporter.js';
|
|
13
|
+
import {
|
|
14
|
+
intro,
|
|
15
|
+
logger,
|
|
16
|
+
outro,
|
|
17
|
+
spinner,
|
|
18
|
+
progress,
|
|
19
|
+
} from '@react-native-harness/tools';
|
|
20
|
+
import { type Environment } from '../platforms/platform-adapter.js';
|
|
21
|
+
import { BridgeTimeoutError } from '../errors/errors.js';
|
|
22
|
+
import { assert } from '../utils.js';
|
|
23
|
+
import {
|
|
24
|
+
EnvironmentInitializationError,
|
|
25
|
+
NoRunnerSpecifiedError,
|
|
26
|
+
RpcClientError,
|
|
27
|
+
RunnerNotFoundError,
|
|
28
|
+
} from '../errors/errors.js';
|
|
29
|
+
import { TestResult } from '@react-native-harness/bridge';
|
|
30
|
+
|
|
31
|
+
type TestRunContext = {
|
|
32
|
+
config: Config;
|
|
33
|
+
runner: TestRunnerConfig;
|
|
34
|
+
bridge?: BridgeServer;
|
|
35
|
+
environment?: Environment;
|
|
36
|
+
testFiles?: string[];
|
|
37
|
+
results?: TestResult[];
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const setupEnvironment = async (context: TestRunContext): Promise<void> => {
|
|
41
|
+
const startSpinner = spinner();
|
|
42
|
+
const platform = context.runner.platform;
|
|
43
|
+
|
|
44
|
+
startSpinner.start(`Starting "${context.runner.name}" (${platform}) runner`);
|
|
45
|
+
|
|
46
|
+
const platformAdapter = await getPlatformAdapter(platform);
|
|
47
|
+
const serverBridge = await getBridgeServer({
|
|
48
|
+
port: 3001,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
context.bridge = serverBridge;
|
|
52
|
+
|
|
53
|
+
const readyPromise = new Promise<void>((resolve, reject) => {
|
|
54
|
+
const timeout = setTimeout(() => {
|
|
55
|
+
reject(
|
|
56
|
+
new BridgeTimeoutError(
|
|
57
|
+
context.config.bridgeTimeout,
|
|
58
|
+
context.runner.name,
|
|
59
|
+
platform
|
|
60
|
+
)
|
|
61
|
+
);
|
|
62
|
+
}, context.config.bridgeTimeout);
|
|
63
|
+
|
|
64
|
+
serverBridge.once('ready', () => {
|
|
65
|
+
clearTimeout(timeout);
|
|
66
|
+
resolve();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
context.environment = await platformAdapter.getEnvironment(context.runner);
|
|
71
|
+
|
|
72
|
+
logger.debug('Waiting for bridge to be ready');
|
|
73
|
+
await readyPromise;
|
|
74
|
+
logger.debug('Bridge is ready');
|
|
75
|
+
|
|
76
|
+
if (!context.environment) {
|
|
77
|
+
throw new EnvironmentInitializationError(
|
|
78
|
+
'Failed to initialize environment',
|
|
79
|
+
context.runner.name,
|
|
80
|
+
platform,
|
|
81
|
+
'Platform adapter returned null environment'
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
startSpinner.stop(`"${context.runner.name}" (${platform}) runner started`);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const findTestFiles = async (
|
|
89
|
+
context: TestRunContext,
|
|
90
|
+
pattern?: string
|
|
91
|
+
): Promise<void> => {
|
|
92
|
+
const discoverSpinner = spinner();
|
|
93
|
+
discoverSpinner.start('Discovering tests');
|
|
94
|
+
|
|
95
|
+
const globPattern = pattern || context.config.include;
|
|
96
|
+
const glob = new Glob(globPattern, {
|
|
97
|
+
cwd: process.cwd(),
|
|
98
|
+
});
|
|
99
|
+
context.testFiles = await glob.walk();
|
|
100
|
+
discoverSpinner.stop(`Found ${context.testFiles.length} test files`);
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const runTests = async (context: TestRunContext): Promise<void> => {
|
|
104
|
+
const { bridge, environment, testFiles } = context;
|
|
105
|
+
assert(bridge != null, 'Bridge not initialized');
|
|
106
|
+
assert(environment != null, 'Environment not initialized');
|
|
107
|
+
assert(testFiles != null, 'Test files not initialized');
|
|
108
|
+
|
|
109
|
+
let runSpinner = progress({ style: 'block' });
|
|
110
|
+
runSpinner.start('Running tests');
|
|
111
|
+
|
|
112
|
+
let shouldRestart = false;
|
|
113
|
+
|
|
114
|
+
for (const testFile of testFiles) {
|
|
115
|
+
if (shouldRestart) {
|
|
116
|
+
runSpinner = progress({ style: 'block' });
|
|
117
|
+
runSpinner.message(`Restarting environment for next test file`);
|
|
118
|
+
|
|
119
|
+
await new Promise((resolve) => {
|
|
120
|
+
bridge.once('ready', resolve);
|
|
121
|
+
environment.restart();
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
runSpinner.message(`Running tests in ${testFile}`);
|
|
126
|
+
const client = bridge.rpc.clients.at(-1);
|
|
127
|
+
if (!client) {
|
|
128
|
+
throw new RpcClientError(
|
|
129
|
+
'No RPC client available',
|
|
130
|
+
3001,
|
|
131
|
+
'No clients connected'
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const result = await client.runTests(testFile);
|
|
136
|
+
context.results = [...(context.results ?? []), ...result.suites];
|
|
137
|
+
shouldRestart = true;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const cleanUp = async (context: TestRunContext): Promise<void> => {
|
|
142
|
+
if (context.bridge) {
|
|
143
|
+
context.bridge.ws.close();
|
|
144
|
+
}
|
|
145
|
+
if (context.environment) {
|
|
146
|
+
await context.environment.dispose();
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
export const testCommand = async (
|
|
151
|
+
runnerName?: string,
|
|
152
|
+
pattern?: string
|
|
153
|
+
): Promise<void> => {
|
|
154
|
+
intro('React Native Test Harness');
|
|
155
|
+
|
|
156
|
+
const config = await getConfig(process.cwd());
|
|
157
|
+
config.reporter = defaultReporter;
|
|
158
|
+
|
|
159
|
+
const selectedRunnerName = runnerName ?? config.defaultRunner;
|
|
160
|
+
|
|
161
|
+
if (!selectedRunnerName) {
|
|
162
|
+
throw new NoRunnerSpecifiedError(config.runners);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const runner = config.runners.find((r) => r.name === selectedRunnerName);
|
|
166
|
+
|
|
167
|
+
if (!runner) {
|
|
168
|
+
throw new RunnerNotFoundError(selectedRunnerName, config.runners);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const context: TestRunContext = {
|
|
172
|
+
config,
|
|
173
|
+
runner,
|
|
174
|
+
testFiles: [],
|
|
175
|
+
results: [],
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
try {
|
|
179
|
+
await setupEnvironment(context);
|
|
180
|
+
await findTestFiles(context, pattern);
|
|
181
|
+
await runTests(context);
|
|
182
|
+
|
|
183
|
+
assert(context.results != null, 'Results not initialized');
|
|
184
|
+
config.reporter?.report(context.results);
|
|
185
|
+
outro('Test run completed successfully');
|
|
186
|
+
} finally {
|
|
187
|
+
await cleanUp(context);
|
|
188
|
+
}
|
|
189
|
+
};
|