@react-native-harness/jest 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/__tests__/bridge.test.d.ts +2 -0
  2. package/dist/__tests__/bridge.test.d.ts.map +1 -0
  3. package/dist/__tests__/bridge.test.js +142 -0
  4. package/dist/__tests__/client-log-handler.test.js +116 -72
  5. package/dist/__tests__/crash-monitor.test.d.ts +2 -0
  6. package/dist/__tests__/crash-monitor.test.d.ts.map +1 -0
  7. package/dist/__tests__/crash-monitor.test.js +212 -0
  8. package/dist/__tests__/execute-run.test.d.ts +2 -0
  9. package/dist/__tests__/execute-run.test.d.ts.map +1 -0
  10. package/dist/__tests__/execute-run.test.js +229 -0
  11. package/dist/__tests__/harness.test.js +35 -0
  12. package/dist/__tests__/hook-queue.test.d.ts +2 -0
  13. package/dist/__tests__/hook-queue.test.d.ts.map +1 -0
  14. package/dist/__tests__/hook-queue.test.js +56 -0
  15. package/dist/__tests__/index.test.js +94 -37
  16. package/dist/__tests__/resource-lock.test.js +24 -24
  17. package/dist/cli-args.test.d.ts +2 -0
  18. package/dist/cli-args.test.d.ts.map +1 -0
  19. package/dist/cli-args.test.js +1 -0
  20. package/dist/client-log-handler.d.ts +10 -11
  21. package/dist/client-log-handler.d.ts.map +1 -1
  22. package/dist/client-log-handler.js +36 -58
  23. package/dist/crash-monitor.d.ts +23 -0
  24. package/dist/crash-monitor.d.ts.map +1 -0
  25. package/dist/crash-monitor.js +176 -0
  26. package/dist/event-mapper.d.ts +16 -0
  27. package/dist/event-mapper.d.ts.map +1 -0
  28. package/dist/event-mapper.js +120 -0
  29. package/dist/execute-run.d.ts +4 -0
  30. package/dist/execute-run.d.ts.map +1 -0
  31. package/dist/execute-run.js +151 -0
  32. package/dist/global-setup.d.ts +3 -0
  33. package/dist/global-setup.d.ts.map +1 -0
  34. package/dist/global-setup.js +60 -0
  35. package/dist/global-teardown.d.ts +3 -0
  36. package/dist/global-teardown.d.ts.map +1 -0
  37. package/dist/global-teardown.js +11 -0
  38. package/dist/harness-reporter.d.ts +8 -0
  39. package/dist/harness-reporter.d.ts.map +1 -0
  40. package/dist/harness-reporter.js +12 -0
  41. package/dist/harness-session.d.ts +34 -0
  42. package/dist/harness-session.d.ts.map +1 -0
  43. package/dist/harness-session.js +523 -0
  44. package/dist/harness.d.ts.map +1 -1
  45. package/dist/harness.js +6 -1
  46. package/dist/hook-queue.d.ts +6 -0
  47. package/dist/hook-queue.d.ts.map +1 -0
  48. package/dist/hook-queue.js +18 -0
  49. package/dist/index.d.ts +0 -3
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +12 -230
  52. package/dist/jest-options.d.ts +2 -0
  53. package/dist/jest-options.d.ts.map +1 -0
  54. package/dist/jest-options.js +1 -0
  55. package/dist/logs.d.ts +1 -0
  56. package/dist/logs.d.ts.map +1 -1
  57. package/dist/logs.js +3 -0
  58. package/dist/resource-lock.d.ts +0 -1
  59. package/dist/resource-lock.d.ts.map +1 -1
  60. package/dist/resource-lock.js +1 -1
  61. package/dist/run.d.ts +2 -2
  62. package/dist/run.d.ts.map +1 -1
  63. package/dist/run.js +3 -3
  64. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  65. package/dist/types.d.ts +17 -0
  66. package/dist/types.d.ts.map +1 -0
  67. package/dist/types.js +1 -0
  68. package/package.json +7 -8
  69. package/src/__tests__/bridge.test.ts +184 -0
  70. package/src/__tests__/client-log-handler.test.ts +117 -81
  71. package/src/__tests__/crash-monitor.test.ts +288 -0
  72. package/src/__tests__/execute-run.test.ts +325 -0
  73. package/src/__tests__/hook-queue.test.ts +77 -0
  74. package/src/__tests__/index.test.ts +135 -55
  75. package/src/__tests__/resource-lock.test.ts +29 -42
  76. package/src/client-log-handler.ts +48 -64
  77. package/src/crash-monitor.ts +248 -0
  78. package/src/execute-run.ts +199 -0
  79. package/src/harness-session.ts +734 -0
  80. package/src/hook-queue.ts +26 -0
  81. package/src/index.ts +17 -330
  82. package/src/logs.ts +4 -0
  83. package/src/resource-lock.ts +1 -1
  84. package/src/run.ts +5 -5
  85. package/tsconfig.tsbuildinfo +1 -0
  86. package/src/__tests__/crash-supervisor.test.ts +0 -200
  87. package/src/__tests__/harness-cache.test.ts +0 -74
  88. package/src/__tests__/harness.test.ts +0 -870
  89. package/src/crash-supervisor.ts +0 -321
  90. package/src/env.d.ts +0 -9
  91. package/src/harness.ts +0 -864
  92. package/src/setup.ts +0 -127
  93. package/src/teardown.ts +0 -14
@@ -0,0 +1,120 @@
1
+ export const getHarnessEventMapper = (emit) => {
2
+ const state = {
3
+ suiteHierarchy: [],
4
+ testResults: new Map(),
5
+ fileStartTime: 0,
6
+ };
7
+ const handleBridgeEvent = (event, test) => {
8
+ // Filter to only process test runner events
9
+ if (event.type.startsWith('test-') ||
10
+ event.type.startsWith('suite-') ||
11
+ event.type.startsWith('file-')) {
12
+ switch (event.type) {
13
+ case 'file-started':
14
+ handleFileStarted(event, test);
15
+ break;
16
+ case 'file-finished':
17
+ handleFileFinished(event, test);
18
+ break;
19
+ case 'suite-started':
20
+ handleSuiteStarted(event);
21
+ break;
22
+ case 'suite-finished':
23
+ handleSuiteFinished(event);
24
+ break;
25
+ case 'test-started':
26
+ handleTestStarted(event, test);
27
+ break;
28
+ case 'test-finished':
29
+ handleTestFinished(event, test);
30
+ break;
31
+ }
32
+ }
33
+ };
34
+ const handleFileStarted = (event, test) => {
35
+ state.currentTest = test;
36
+ state.fileStartTime = Date.now();
37
+ state.suiteHierarchy = [];
38
+ state.testResults.clear();
39
+ // Don't emit test-file-start here - that should be handled by the Jest runner
40
+ // when it actually starts running the test file
41
+ };
42
+ const handleFileFinished = (_event, _test) => {
43
+ // File finished - all test results should already be emitted
44
+ // The final TestResult will be handled by the runHarnessTestFile function
45
+ };
46
+ const handleSuiteStarted = (event) => {
47
+ state.suiteHierarchy.push(event.name);
48
+ };
49
+ const handleSuiteFinished = (event) => {
50
+ // Remove the suite from hierarchy when it finishes
51
+ const index = state.suiteHierarchy.lastIndexOf(event.name);
52
+ if (index !== -1) {
53
+ state.suiteHierarchy.splice(index, 1);
54
+ }
55
+ };
56
+ const handleTestStarted = (event, test) => {
57
+ const testCaseStartInfo = {
58
+ ancestorTitles: [...state.suiteHierarchy],
59
+ fullName: `${state.suiteHierarchy.join(' ')} ${event.name}`.trim(),
60
+ title: event.name,
61
+ mode: 'skip', // Default mode, will be updated based on test status
62
+ };
63
+ emit('test-case-start', [test.path, testCaseStartInfo]);
64
+ };
65
+ const handleTestFinished = (event, test) => {
66
+ const testCaseResult = {
67
+ ancestorTitles: [...state.suiteHierarchy],
68
+ duration: event.duration,
69
+ failureDetails: [],
70
+ failureMessages: event.error ? [formatError(event.error)] : [],
71
+ fullName: `${state.suiteHierarchy.join(' ')} ${event.name}`.trim(),
72
+ numPassingAsserts: event.status === 'passed' ? 1 : 0,
73
+ status: mapStatus(event.status),
74
+ title: event.name,
75
+ startedAt: Date.now() - event.duration,
76
+ };
77
+ state.testResults.set(event.name, testCaseResult);
78
+ emit('test-case-result', [test.path, testCaseResult]);
79
+ };
80
+ const mapStatus = (status) => {
81
+ return status;
82
+ };
83
+ const formatError = (error) => {
84
+ let errorMessage = `${error.name}: ${error.message}`;
85
+ if (error.codeFrame) {
86
+ errorMessage += '\n\n' + formatCodeFrame(error.codeFrame);
87
+ }
88
+ return errorMessage;
89
+ };
90
+ const formatCodeFrame = (codeFrame) => {
91
+ const lines = codeFrame.content.split('\n');
92
+ const lineNumber = codeFrame.location?.row || 1;
93
+ const column = codeFrame.location?.column || 1;
94
+ let formatted = `\n${codeFrame.fileName}:${lineNumber}:${column}\n`;
95
+ // Add context lines around the error
96
+ const startLine = Math.max(0, lineNumber - 3);
97
+ const endLine = Math.min(lines.length, lineNumber + 2);
98
+ for (let i = startLine; i < endLine; i++) {
99
+ const lineNum = i + 1;
100
+ const line = lines[i];
101
+ const isErrorLine = lineNum === lineNumber;
102
+ formatted += `${lineNum.toString().padStart(3)} | ${line}\n`;
103
+ if (isErrorLine && column > 0) {
104
+ const pointer = ' '.repeat(column + 5) + '^';
105
+ formatted += pointer + '\n';
106
+ }
107
+ }
108
+ return formatted;
109
+ };
110
+ const reset = () => {
111
+ state.suiteHierarchy = [];
112
+ state.testResults.clear();
113
+ state.fileStartTime = 0;
114
+ state.currentTest = undefined;
115
+ };
116
+ return {
117
+ handleBridgeEvent,
118
+ reset,
119
+ };
120
+ };
@@ -0,0 +1,4 @@
1
+ import type { OnTestFailure, OnTestStart, OnTestSuccess, Test, TestWatcher, Config } from 'jest-runner';
2
+ import { type HarnessSession } from './harness-session.js';
3
+ export declare const executeRun: (session: HarnessSession, tests: Array<Test>, watcher: TestWatcher, onStart: OnTestStart, onResult: OnTestSuccess, onFailure: OnTestFailure, globalConfig: Config.GlobalConfig) => Promise<void>;
4
+ //# sourceMappingURL=execute-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-run.d.ts","sourceRoot":"","sources":["../src/execute-run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,aAAa,EACb,IAAI,EACJ,WAAW,EACX,MAAM,EACP,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,KAAK,cAAc,EAAwB,MAAM,sBAAsB,CAAC;AAsCjF,eAAO,MAAM,UAAU,GACrB,SAAS,cAAc,EACvB,OAAO,KAAK,CAAC,IAAI,CAAC,EAClB,SAAS,WAAW,EACpB,SAAS,WAAW,EACpB,UAAU,aAAa,EACvB,WAAW,aAAa,EACxB,cAAc,MAAM,CAAC,YAAY,KAChC,OAAO,CAAC,IAAI,CA8Id,CAAC"}
@@ -0,0 +1,151 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { runHarnessTestFile } from './run.js';
4
+ import { NativeCrashError, StartupStallError, } from './errors.js';
5
+ import { DeviceNotRespondingError } from '@react-native-harness/bridge/server';
6
+ const createRunSummary = () => ({ passed: 0, failed: 0, skipped: 0, todo: 0 });
7
+ const applyJestResultToSummary = (summary, result) => {
8
+ summary.passed += result.numPassingTests;
9
+ summary.failed += result.numFailingTests;
10
+ summary.skipped += result.numPendingTests;
11
+ summary.todo += result.numTodoTests;
12
+ };
13
+ class CancelRun extends Error {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = 'CancelRun';
17
+ }
18
+ }
19
+ const buildTestFailure = (err) => {
20
+ if (err instanceof NativeCrashError ||
21
+ err instanceof StartupStallError ||
22
+ err instanceof DeviceNotRespondingError) {
23
+ return { message: err.message, stack: '' };
24
+ }
25
+ return err;
26
+ };
27
+ export const executeRun = async (session, tests, watcher, onStart, onResult, onFailure, globalConfig) => {
28
+ const runId = randomUUID();
29
+ const startTime = Date.now();
30
+ const watchMode = globalConfig.watch || globalConfig.watchAll;
31
+ const rootDir = globalConfig.rootDir ?? process.cwd();
32
+ const testFiles = tests.map((t) => path.relative(rootDir, t.path));
33
+ const summary = createRunSummary();
34
+ const updateRunState = (overrides = {}) => {
35
+ const state = {
36
+ runId,
37
+ startTime,
38
+ testFiles,
39
+ watchMode,
40
+ coverageEnabled: globalConfig.collectCoverage,
41
+ summary,
42
+ status: summary.failed > 0 ? 'failed' : 'passed',
43
+ ...overrides,
44
+ };
45
+ session.setRunState(state);
46
+ return state;
47
+ };
48
+ updateRunState();
49
+ await session.callHook('run:started', {
50
+ runId,
51
+ startTime,
52
+ testFiles,
53
+ watchMode,
54
+ coverageEnabled: globalConfig.collectCoverage,
55
+ });
56
+ await session.callHook('metro:initialized', {
57
+ runId,
58
+ port: session.config.metroPort,
59
+ host: session.config.host?.trim() || undefined,
60
+ });
61
+ const shouldResetEnv = session.config.resetEnvironmentBetweenTestFiles;
62
+ let isFirstTest = true;
63
+ let runError;
64
+ try {
65
+ for (const test of tests) {
66
+ if (watcher.isInterrupted())
67
+ throw new CancelRun();
68
+ const relativeTestPath = path.relative(rootDir, test.path);
69
+ const fileStartedAt = Date.now();
70
+ let emittedTestFileFinished = false;
71
+ const emitTestFileFinished = async (options) => {
72
+ emittedTestFileFinished = true;
73
+ await session.callHook('test-file:finished', {
74
+ runId,
75
+ file: relativeTestPath,
76
+ duration: options.duration,
77
+ status: options.status,
78
+ result: options.result,
79
+ });
80
+ };
81
+ await session.callHook('test-file:started', { runId, file: relativeTestPath });
82
+ try {
83
+ if (shouldResetEnv && !isFirstTest) {
84
+ await session.restartApp(test.path);
85
+ }
86
+ isFirstTest = false;
87
+ session.flushClientLogs();
88
+ await onStart(test);
89
+ await session.ensureAppReady(test.path);
90
+ // Crash detection is handled inside session.runTestFile; NativeCrashError
91
+ // propagates here if a crash wins the race.
92
+ const result = await runHarnessTestFile({
93
+ testPath: test.path,
94
+ session,
95
+ globalConfig,
96
+ projectConfig: test.context.config,
97
+ });
98
+ applyJestResultToSummary(summary, result.jestResult);
99
+ const clientLogs = session.flushClientLogs();
100
+ if (clientLogs.length > 0) {
101
+ result.jestResult.console = clientLogs;
102
+ }
103
+ updateRunState();
104
+ await emitTestFileFinished({
105
+ status: result.harnessResult.status,
106
+ duration: result.duration,
107
+ result: result.harnessResult,
108
+ });
109
+ await onResult(test, result.jestResult);
110
+ }
111
+ catch (err) {
112
+ if (!emittedTestFileFinished) {
113
+ await emitTestFileFinished({
114
+ status: 'failed',
115
+ duration: Date.now() - fileStartedAt,
116
+ result: null,
117
+ });
118
+ }
119
+ const isRuntimeFailure = err instanceof NativeCrashError ||
120
+ err instanceof StartupStallError ||
121
+ err instanceof DeviceNotRespondingError;
122
+ if (isRuntimeFailure) {
123
+ summary.failed += 1;
124
+ updateRunState();
125
+ }
126
+ if (err instanceof NativeCrashError) {
127
+ session.resetCrashState();
128
+ }
129
+ updateRunState({ error: isRuntimeFailure ? undefined : err });
130
+ onFailure(test, buildTestFailure(err));
131
+ }
132
+ }
133
+ }
134
+ catch (err) {
135
+ runError = err;
136
+ if (!(err instanceof CancelRun))
137
+ throw err;
138
+ }
139
+ finally {
140
+ const runState = updateRunState(runError != null ? { error: runError, status: 'failed' } : {});
141
+ await session.callHook('run:finished', {
142
+ runId,
143
+ startTime,
144
+ duration: Date.now() - startTime,
145
+ testFiles,
146
+ summary,
147
+ status: runState.status ?? (runError != null ? 'failed' : 'passed'),
148
+ ...(runError != null ? { error: runError } : {}),
149
+ });
150
+ }
151
+ };
@@ -0,0 +1,3 @@
1
+ import type { Config as JestConfig } from 'jest-runner';
2
+ export default function (globalConfig: JestConfig.GlobalConfig): Promise<void>;
3
+ //# sourceMappingURL=global-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-setup.d.ts","sourceRoot":"","sources":["../src/global-setup.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AA4CxD,yBAA+B,YAAY,EAAE,UAAU,CAAC,YAAY,iBA4CnE"}
@@ -0,0 +1,60 @@
1
+ import { getConfig, } from '@react-native-harness/config';
2
+ import { getHarness as getHarnessExternal, NoRunnerSpecifiedError, RunnerNotFoundError, } from '@react-native-harness/cli/external';
3
+ import { preRunMessage } from 'jest-util';
4
+ import { getAdditionalCliArgs } from './cli-args.js';
5
+ import { logTestEnvironmentReady, logTestRunHeader } from './logs.js';
6
+ const getHarnessConfig = async (globalConfig) => {
7
+ const projectRoot = globalConfig.rootDir;
8
+ const { config: harnessConfig } = await getConfig(projectRoot);
9
+ return harnessConfig;
10
+ };
11
+ const getHarnessRunner = (config, cliArgs) => {
12
+ const selectedRunnerName = cliArgs.harnessRunner ?? config.defaultRunner;
13
+ if (!selectedRunnerName) {
14
+ throw new NoRunnerSpecifiedError(config.runners);
15
+ }
16
+ const runner = config.runners.find((runner) => runner.name === selectedRunnerName);
17
+ if (!runner) {
18
+ throw new RunnerNotFoundError(selectedRunnerName, config.runners);
19
+ }
20
+ return runner;
21
+ };
22
+ const getHarness = async (runner) => {
23
+ return await getHarnessExternal(runner);
24
+ };
25
+ export default async function (globalConfig) {
26
+ preRunMessage.remove(process.stderr);
27
+ const harnessConfig = global.HARNESS_CONFIG ?? (await getHarnessConfig(globalConfig));
28
+ const isWatchMode = globalConfig.watch || globalConfig.watchAll;
29
+ if (global.HARNESS) {
30
+ // Do not setup again if HARNESS is already initialized
31
+ // This is useful when running tests in watch mode
32
+ if (harnessConfig.resetEnvironmentBetweenTestFiles) {
33
+ // In watch mode, we want to restart the environment before each test run
34
+ await new Promise((resolve) => {
35
+ global.HARNESS.bridge.once('ready', resolve);
36
+ global.HARNESS.environment.restart();
37
+ });
38
+ }
39
+ return;
40
+ }
41
+ if (isWatchMode) {
42
+ // In watch mode, we want to dispose the Harness when the process exits.
43
+ process.on('exit', async () => {
44
+ await global.HARNESS.bridge.dispose();
45
+ await global.HARNESS.environment.dispose();
46
+ });
47
+ }
48
+ const cliArgs = getAdditionalCliArgs();
49
+ const selectedRunner = getHarnessRunner(harnessConfig, cliArgs);
50
+ if (globalConfig.collectCoverage) {
51
+ // This is going to be used by @react-native-harness/babel-preset
52
+ // to enable instrumentation of test files.
53
+ process.env.RN_HARNESS_COLLECT_COVERAGE = 'true';
54
+ }
55
+ logTestRunHeader(selectedRunner);
56
+ const harness = await getHarness(selectedRunner);
57
+ logTestEnvironmentReady(selectedRunner);
58
+ global.HARNESS_CONFIG = harnessConfig;
59
+ global.HARNESS = harness;
60
+ }
@@ -0,0 +1,3 @@
1
+ import type { Config as JestConfig } from 'jest-runner';
2
+ export default function (globalConfig: JestConfig.GlobalConfig): Promise<void>;
3
+ //# sourceMappingURL=global-teardown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-teardown.d.ts","sourceRoot":"","sources":["../src/global-teardown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AAExD,yBAA+B,YAAY,EAAE,UAAU,CAAC,YAAY,iBAYnE"}
@@ -0,0 +1,11 @@
1
+ export default async function (globalConfig) {
2
+ const isWatchMode = globalConfig.watch || globalConfig.watchAll;
3
+ if (isWatchMode) {
4
+ // In watch mode, we don't want to dispose the Harness.
5
+ return;
6
+ }
7
+ if (global.HARNESS) {
8
+ await global.HARNESS.bridge.dispose();
9
+ await global.HARNESS.environment.dispose();
10
+ }
11
+ }
@@ -0,0 +1,8 @@
1
+ import { BaseReporter } from '@jest/reporters';
2
+ import { Config } from '@jest/types';
3
+ export default class HarnessReporter extends BaseReporter {
4
+ #private;
5
+ constructor(globalConfig: Config.GlobalConfig);
6
+ onRunStart(): void;
7
+ }
8
+ //# sourceMappingURL=harness-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-reporter.d.ts","sourceRoot":"","sources":["../src/harness-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,YAAY;;gBAE3C,YAAY,EAAE,MAAM,CAAC,YAAY;IAKpC,UAAU,IAAI,IAAI;CAM5B"}
@@ -0,0 +1,12 @@
1
+ import { BaseReporter } from '@jest/reporters';
2
+ export default class HarnessReporter extends BaseReporter {
3
+ #globalConfig;
4
+ constructor(globalConfig) {
5
+ super();
6
+ this.#globalConfig = globalConfig;
7
+ }
8
+ onRunStart() {
9
+ super.onRunStart();
10
+ this.log(`Selected runner: ${this.#globalConfig.selectedRunner.name}`);
11
+ }
12
+ }
@@ -0,0 +1,34 @@
1
+ import { type HarnessContext, type TestExecutionOptions, type TestSuiteResult } from '@react-native-harness/bridge';
2
+ import { type HarnessPlatform } from '@react-native-harness/platforms';
3
+ import { type HarnessPluginManager, type HarnessRunStatus, type HarnessRunSummary } from '@react-native-harness/plugins';
4
+ import { type Config as HarnessConfig } from '@react-native-harness/config';
5
+ import type { Config as JestConfig } from 'jest-runner';
6
+ import { type ClientLogBuffer } from './client-log-handler.js';
7
+ import { type ResourceLockManager } from './resource-lock.js';
8
+ export type HarnessRunState = {
9
+ readonly runId: string;
10
+ readonly startTime: number;
11
+ readonly testFiles: string[];
12
+ readonly watchMode: boolean;
13
+ readonly coverageEnabled: boolean;
14
+ readonly summary?: HarnessRunSummary;
15
+ readonly status?: HarnessRunStatus;
16
+ readonly error?: unknown;
17
+ };
18
+ export type HarnessRunTestsOptions = Exclude<TestExecutionOptions, 'platform'>;
19
+ export type HarnessSession = {
20
+ readonly config: HarnessConfig;
21
+ readonly context: HarnessContext;
22
+ runTestFile: (path: string, options: HarnessRunTestsOptions) => Promise<TestSuiteResult>;
23
+ ensureAppReady: (testFilePath: string) => Promise<void>;
24
+ restartApp: (testFilePath?: string) => Promise<void>;
25
+ resetCrashState: () => void;
26
+ flushClientLogs: () => ClientLogBuffer;
27
+ callHook: HarnessPluginManager<HarnessConfig, HarnessPlatform>['callHook'];
28
+ setRunState: (state: HarnessRunState | null) => void;
29
+ dispose: (reason?: 'normal' | 'abort' | 'error') => Promise<void>;
30
+ };
31
+ export declare const createHarnessSession: (globalConfig: JestConfig.GlobalConfig, { lockManager }?: {
32
+ lockManager?: ResourceLockManager;
33
+ }) => Promise<HarnessSession>;
34
+ //# sourceMappingURL=harness-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-session.d.ts","sourceRoot":"","sources":["../src/harness-session.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,eAAe,EAGrB,MAAM,iCAAiC,CAAC;AASzC,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,+BAA+B,CAAC;AAOvC,OAAO,EAEL,KAAK,MAAM,IAAI,aAAa,EAE7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AAMxD,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,oBAAoB,CAAC;AAkB5B,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;AAE/E,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACzF,cAAc,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,eAAe,CAAC;IACvC,QAAQ,EAAE,oBAAoB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3E,WAAW,EAAE,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE,CAAC;AAuOF,eAAO,MAAM,oBAAoB,GAC/B,cAAc,UAAU,CAAC,YAAY,EACrC,kBAA8C;IAAE,WAAW,CAAC,EAAE,mBAAmB,CAAA;CAAO,KACvF,OAAO,CAAC,cAAc,CA6YxB,CAAC"}