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.
Files changed (103) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +7 -0
  3. package/bin.js +3 -0
  4. package/dist/bundlers/metro.d.ts +5 -0
  5. package/dist/bundlers/metro.d.ts.map +1 -0
  6. package/dist/bundlers/metro.js +52 -0
  7. package/dist/bundlers/webpack.d.ts +2 -0
  8. package/dist/bundlers/webpack.d.ts.map +1 -0
  9. package/dist/bundlers/webpack.js +49 -0
  10. package/dist/commands/test.d.ts +2 -0
  11. package/dist/commands/test.d.ts.map +1 -0
  12. package/dist/commands/test.js +111 -0
  13. package/dist/errors/appNotInstalledError.d.ts +7 -0
  14. package/dist/errors/appNotInstalledError.d.ts.map +1 -0
  15. package/dist/errors/appNotInstalledError.js +12 -0
  16. package/dist/errors/bridgeTimeoutError.d.ts +7 -0
  17. package/dist/errors/bridgeTimeoutError.d.ts.map +1 -0
  18. package/dist/errors/bridgeTimeoutError.js +12 -0
  19. package/dist/errors/errorHandler.d.ts +2 -0
  20. package/dist/errors/errorHandler.d.ts.map +1 -0
  21. package/dist/errors/errorHandler.js +138 -0
  22. package/dist/errors/errors.d.ts +41 -0
  23. package/dist/errors/errors.d.ts.map +1 -0
  24. package/dist/errors/errors.js +83 -0
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +37 -0
  28. package/dist/platforms/android/build.d.ts +5 -0
  29. package/dist/platforms/android/build.d.ts.map +1 -0
  30. package/dist/platforms/android/build.js +29 -0
  31. package/dist/platforms/android/device.d.ts +5 -0
  32. package/dist/platforms/android/device.d.ts.map +1 -0
  33. package/dist/platforms/android/device.js +36 -0
  34. package/dist/platforms/android/emulator.d.ts +11 -0
  35. package/dist/platforms/android/emulator.d.ts.map +1 -0
  36. package/dist/platforms/android/emulator.js +110 -0
  37. package/dist/platforms/android/index.d.ts +4 -0
  38. package/dist/platforms/android/index.d.ts.map +1 -0
  39. package/dist/platforms/android/index.js +56 -0
  40. package/dist/platforms/ios/build.d.ts +7 -0
  41. package/dist/platforms/ios/build.d.ts.map +1 -0
  42. package/dist/platforms/ios/build.js +51 -0
  43. package/dist/platforms/ios/device.d.ts +7 -0
  44. package/dist/platforms/ios/device.d.ts.map +1 -0
  45. package/dist/platforms/ios/device.js +51 -0
  46. package/dist/platforms/ios/index.d.ts +4 -0
  47. package/dist/platforms/ios/index.d.ts.map +1 -0
  48. package/dist/platforms/ios/index.js +38 -0
  49. package/dist/platforms/ios/simulator.d.ts +11 -0
  50. package/dist/platforms/ios/simulator.d.ts.map +1 -0
  51. package/dist/platforms/ios/simulator.js +133 -0
  52. package/dist/platforms/platform-adapter.d.ts +10 -0
  53. package/dist/platforms/platform-adapter.d.ts.map +1 -0
  54. package/dist/platforms/platform-adapter.js +1 -0
  55. package/dist/platforms/platform-registry.d.ts +3 -0
  56. package/dist/platforms/platform-registry.d.ts.map +1 -0
  57. package/dist/platforms/platform-registry.js +19 -0
  58. package/dist/platforms/web/index.d.ts +4 -0
  59. package/dist/platforms/web/index.d.ts.map +1 -0
  60. package/dist/platforms/web/index.js +73 -0
  61. package/dist/process.d.ts +3 -0
  62. package/dist/process.d.ts.map +1 -0
  63. package/dist/process.js +28 -0
  64. package/dist/reporters/default-reporter.d.ts +3 -0
  65. package/dist/reporters/default-reporter.d.ts.map +1 -0
  66. package/dist/reporters/default-reporter.js +116 -0
  67. package/dist/reporters/junit-reporter.d.ts +3 -0
  68. package/dist/reporters/junit-reporter.d.ts.map +1 -0
  69. package/dist/reporters/junit-reporter.js +119 -0
  70. package/dist/reporters/live-reporter.d.ts +20 -0
  71. package/dist/reporters/live-reporter.d.ts.map +1 -0
  72. package/dist/reporters/live-reporter.js +176 -0
  73. package/dist/src/reporters/default-reporter.js +135 -0
  74. package/dist/test-reporter-demo.js +95 -0
  75. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  76. package/dist/utils.d.ts +5 -0
  77. package/dist/utils.d.ts.map +1 -0
  78. package/dist/utils.js +11 -0
  79. package/eslint.config.mjs +19 -0
  80. package/package.json +16 -8
  81. package/src/bundlers/metro.ts +79 -0
  82. package/src/commands/test.ts +189 -0
  83. package/src/errors/errorHandler.ts +184 -0
  84. package/src/errors/errors.ts +109 -0
  85. package/src/index.ts +52 -0
  86. package/src/platforms/android/build.ts +48 -0
  87. package/src/platforms/android/device.ts +48 -0
  88. package/src/platforms/android/emulator.ts +139 -0
  89. package/src/platforms/android/index.ts +87 -0
  90. package/src/platforms/ios/build.ts +76 -0
  91. package/src/platforms/ios/device.ts +76 -0
  92. package/src/platforms/ios/index.ts +55 -0
  93. package/src/platforms/ios/simulator.ts +177 -0
  94. package/src/platforms/platform-adapter.ts +11 -0
  95. package/src/platforms/platform-registry.ts +24 -0
  96. package/src/platforms/web/index.ts +95 -0
  97. package/src/process.ts +33 -0
  98. package/src/reporters/default-reporter.ts +149 -0
  99. package/src/reporters/junit-reporter.ts +179 -0
  100. package/src/utils.ts +12 -0
  101. package/tsconfig.json +16 -0
  102. package/tsconfig.lib.json +33 -0
  103. 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"}
@@ -0,0 +1,5 @@
1
+ export declare function assert(condition: boolean, message: string): asserts condition;
2
+ export declare class AssertionError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ //# sourceMappingURL=utils.d.ts.map
@@ -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,11 @@
1
+ export function assert(condition, message) {
2
+ if (!condition) {
3
+ throw new AssertionError(message);
4
+ }
5
+ }
6
+ export class AssertionError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = 'AssertionError';
10
+ }
11
+ }
@@ -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.0",
4
- "description": "",
5
- "main": "index.js",
6
- "keywords": [],
7
- "author": "",
8
- "license": "MIT",
9
- "scripts": {
10
- "test": "echo \"Error: no test specified\" && exit 1"
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
+ };