diff --git a/packages/reporters/README.md b/packages/reporters/README.md
deleted file mode 100644
index 79652a30..00000000
--- a/packages/reporters/README.md
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-### Test Reporters for React Native Harness
-
-[![mit licence][license-badge]][license]
-[![npm downloads][npm-downloads-badge]][npm-downloads]
-[![Chat][chat-badge]][chat]
-[![PRs Welcome][prs-welcome-badge]][prs-welcome]
-
-Collection of test reporters that format and display test results in various formats, providing clear feedback during test execution and final result summaries.
-
-## Made with ❤️ at Callstack
-
-`@react-native-harness/reporters` is an open source project and will always remain free to use. If you think it's cool, please star it 🌟. [Callstack][callstack-readme-with-love] is a group of React and React Native geeks, contact us at [hello@callstack.com](mailto:hello@callstack.com) if you need any help with these or just want to say hi!
-
-Like the project? ⚛️ [Join the team](https://callstack.com/careers/?utm_campaign=Senior_RN&utm_source=github&utm_medium=readme) who does amazing stuff for clients and drives React Native Open Source! 🔥
-
-[callstack-readme-with-love]: https://callstack.com/?utm_source=github.com&utm_medium=referral&utm_campaign=react-native-harness&utm_term=readme-with-love
-[license-badge]: https://img.shields.io/npm/l/@react-native-harness/reporters?style=for-the-badge
-[license]: https://github.com/callstackincubator/react-native-harness/blob/main/LICENSE
-[npm-downloads-badge]: https://img.shields.io/npm/dm/@react-native-harness/reporters?style=for-the-badge
-[npm-downloads]: https://www.npmjs.com/package/@react-native-harness/reporters
-[prs-welcome-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=for-the-badge
-[prs-welcome]: ../../CONTRIBUTING.md
-[chat-badge]: https://img.shields.io/discord/426714625279524876.svg?style=for-the-badge
-[chat]: https://discord.gg/xgGt7KAjxv
diff --git a/packages/reporters/package.json b/packages/reporters/package.json
deleted file mode 100644
index 081edb59..00000000
--- a/packages/reporters/package.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "name": "@react-native-harness/reporters",
- "version": "1.0.0",
- "type": "module",
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "dependencies": {
- "@react-native-harness/tools": "workspace:*"
- },
- "devDependencies": {
- "@react-native-harness/bridge": "workspace:*"
- },
- "license": "MIT"
-}
diff --git a/packages/reporters/src/default-reporter.ts b/packages/reporters/src/default-reporter.ts
deleted file mode 100644
index bcddb4dd..00000000
--- a/packages/reporters/src/default-reporter.ts
+++ /dev/null
@@ -1,152 +0,0 @@
-import { color, logger } from '@react-native-harness/tools';
-import type { TestSuiteResult, TestResult } from '@react-native-harness/bridge';
-import { Reporter } from './reporter.js';
-
-export const defaultReporter: Reporter = {
- report: async (results) => {
- logger.info('Test Results');
-
- for (const suite of results) {
- logger.info(formatSuiteResult(suite));
- }
-
- // Summary
- let totalPassed = 0,
- totalFailed = 0,
- totalSkipped = 0,
- totalTodo = 0;
- let totalDuration = 0;
-
- for (const suite of results) {
- const summary = getTestSummary(suite);
- totalPassed += summary.passed;
- totalFailed += summary.failed;
- totalSkipped += summary.skipped;
- totalTodo += summary.todo;
- totalDuration += suite.duration || 0;
- }
-
- const summaryText = [
- color.green(`${totalPassed} passed`),
- color.red(`${totalFailed} failed`),
- color.yellow(`${totalSkipped} skipped`),
- color.blue(`${totalTodo} todo`),
- ].join(', ');
-
- logger.info(`Summary: ${summaryText}`);
- logger.info(`Total time: ${formatDuration(totalDuration)}`);
- },
-};
-
-const formatDuration = (duration?: number): string => {
- if (duration == null) return '';
- return color.dim(` (${duration}ms)`);
-};
-
-const getStatusIcon = (status: string): string => {
- switch (status) {
- case 'passed':
- return color.green('✓');
- case 'failed':
- return color.red('✗');
- case 'skipped':
- return color.yellow('○');
- case 'todo':
- return color.blue('◐');
- default:
- return '?';
- }
-};
-
-const formatTestResult = (test: TestResult, indent = ''): string => {
- const icon = getStatusIcon(test.status);
- const name = test.status === 'failed' ? color.red(test.name) : test.name;
- const duration = formatDuration(test.duration);
-
- let result = `${indent}${icon} ${name}${duration}`;
-
- if (test.error) {
- const errorLines = test.error.message?.split('\n') || [];
- result +=
- '\n' +
- errorLines
- .map((line: string) => `${indent} ${color.red(line)}`)
- .join('\n');
-
- if (test.error?.codeFrame) {
- result += '\n' + test.error.codeFrame.content;
- }
- }
-
- return result;
-};
-
-const formatSuiteResult = (suite: TestSuiteResult, indent = ''): string => {
- const icon = getStatusIcon(suite.status);
- const name =
- suite.status === 'failed' ? color.red(suite.name) : color.bold(suite.name);
- const duration = formatDuration(suite.duration);
-
- let result = `${indent}${icon} ${name}${duration}`;
-
- if (suite.error) {
- const errorLines = suite.error.message.split('\n');
- result +=
- '\n' +
- errorLines
- .map((line: string) => `${indent} ${color.red(line)}`)
- .join('\n');
- }
-
- const childIndent = indent + ' ';
-
- // Format tests
- for (const test of suite.tests) {
- result += '\n' + formatTestResult(test, childIndent);
- }
-
- // Format nested suites
- for (const childSuite of suite.suites) {
- result += '\n' + formatSuiteResult(childSuite, childIndent);
- }
-
- return result;
-};
-
-const getTestSummary = (
- suite: TestSuiteResult
-): { passed: number; failed: number; skipped: number; todo: number } => {
- let passed = 0,
- failed = 0,
- skipped = 0,
- todo = 0;
-
- // Count tests in current suite
- for (const test of suite.tests) {
- switch (test.status) {
- case 'passed':
- passed++;
- break;
- case 'failed':
- failed++;
- break;
- case 'skipped':
- skipped++;
- break;
- case 'todo':
- todo++;
- break;
- }
- }
-
- // Count tests in nested suites
- for (const childSuite of suite.suites) {
- const childSummary = getTestSummary(childSuite);
- passed += childSummary.passed;
- failed += childSummary.failed;
- skipped += childSummary.skipped;
- todo += childSummary.todo;
- }
-
- return { passed, failed, skipped, todo };
-};
diff --git a/packages/reporters/src/index.ts b/packages/reporters/src/index.ts
deleted file mode 100644
index 2ad06e14..00000000
--- a/packages/reporters/src/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export { defaultReporter } from './default-reporter.js';
-export { junitReporter } from './junit-reporter.js';
-export type { Reporter } from './reporter.js';
diff --git a/packages/reporters/src/junit-reporter.ts b/packages/reporters/src/junit-reporter.ts
deleted file mode 100644
index 54474121..00000000
--- a/packages/reporters/src/junit-reporter.ts
+++ /dev/null
@@ -1,179 +0,0 @@
-import type { TestSuiteResult, TestResult } from '@react-native-harness/bridge';
-import { writeFileSync } from 'fs';
-import { join } from 'path';
-import { Reporter } from './reporter.js';
-
-export const junitReporter: Reporter = {
- report: async (results) => {
- const xml = generateJUnitXML(results);
-
- // Write to junit.xml file
- const outputPath = join(process.cwd(), 'junit.xml');
- writeFileSync(outputPath, xml, 'utf8');
-
- console.log(`📄 JUnit report written to: ${outputPath}`);
- },
-};
-
-const generateJUnitXML = (results: TestSuiteResult[]): string => {
- const { totalTests, totalFailures, totalSkipped, totalTime } =
- calculateTotals(results);
-
- let xml = '\n';
- xml += `\n`;
-
- for (const suite of results) {
- xml += generateTestSuiteXML(suite, ' ');
- }
-
- xml += '\n';
-
- return xml;
-};
-
-const generateTestSuiteXML = (
- suite: TestSuiteResult,
- indent: string
-): string => {
- const { tests, failures, skipped, time } = getSuiteStats(suite);
-
- let xml = `${indent}\n';
-
- // Add suite-level error if present
- if (suite.error) {
- xml += `${indent} ';
- if (suite.error.codeFrame) {
- xml += escapeXML(suite.error.codeFrame.content);
- }
- xml += '\n';
- }
-
- // Add individual test cases
- for (const test of suite.tests) {
- xml += generateTestCaseXML(test, indent + ' ');
- }
-
- // Add nested suites
- for (const nestedSuite of suite.suites) {
- xml += generateTestSuiteXML(nestedSuite, indent + ' ');
- }
-
- xml += `${indent}\n`;
-
- return xml;
-};
-
-const generateTestCaseXML = (test: TestResult, indent: string): string => {
- const time = (test.duration || 0) / 1000;
- let xml = `${indent}\n';
- } else {
- xml += '>\n';
-
- switch (test.status) {
- case 'failed':
- xml += `${indent} ';
- if (test.error?.codeFrame) {
- xml += escapeXML(test.error.codeFrame.content);
- }
- xml += '\n';
- break;
- case 'skipped':
- xml += `${indent} \n`;
- break;
- case 'todo':
- xml += `${indent} \n`;
- break;
- }
-
- xml += `${indent}\n`;
- }
-
- return xml;
-};
-
-const calculateTotals = (
- results: TestSuiteResult[]
-): {
- totalTests: number;
- totalFailures: number;
- totalSkipped: number;
- totalTime: number;
-} => {
- let totalTests = 0;
- let totalFailures = 0;
- let totalSkipped = 0;
- let totalTime = 0;
-
- for (const suite of results) {
- const stats = getSuiteStats(suite);
- totalTests += stats.tests;
- totalFailures += stats.failures;
- totalSkipped += stats.skipped;
- totalTime += stats.time;
- }
-
- return { totalTests, totalFailures, totalSkipped, totalTime };
-};
-
-const getSuiteStats = (
- suite: TestSuiteResult
-): {
- tests: number;
- failures: number;
- skipped: number;
- time: number;
-} => {
- let tests = suite.tests.length;
- let failures = suite.tests.filter((t) => t.status === 'failed').length;
- let skipped = suite.tests.filter(
- (t) => t.status === 'skipped' || t.status === 'todo'
- ).length;
- let time = suite.duration || 0;
-
- // Add stats from nested suites
- for (const nestedSuite of suite.suites) {
- const nestedStats = getSuiteStats(nestedSuite);
- tests += nestedStats.tests;
- failures += nestedStats.failures;
- skipped += nestedStats.skipped;
- time += nestedStats.time;
- }
-
- return { tests, failures, skipped, time };
-};
-
-const escapeXML = (str: string): string => {
- return str
- .replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"')
- .replace(/'/g, ''');
-};
diff --git a/packages/reporters/src/reporter.ts b/packages/reporters/src/reporter.ts
deleted file mode 100644
index f7622765..00000000
--- a/packages/reporters/src/reporter.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { TestSuiteResult } from '@react-native-harness/bridge';
-
-export type Reporter = {
- report: (results: TestSuiteResult[]) => Promise;
-};
diff --git a/packages/reporters/tsconfig.json b/packages/reporters/tsconfig.json
deleted file mode 100644
index 7b2e963e..00000000
--- a/packages/reporters/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "files": [],
- "include": [],
- "references": [
- {
- "path": "../tools"
- },
- {
- "path": "../bridge"
- },
- {
- "path": "./tsconfig.lib.json"
- }
- ]
-}
diff --git a/packages/reporters/tsconfig.lib.json b/packages/reporters/tsconfig.lib.json
deleted file mode 100644
index aeaad4c5..00000000
--- a/packages/reporters/tsconfig.lib.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": ".",
- "rootDir": "src",
- "outDir": "dist",
- "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
- "emitDeclarationOnly": false,
- "forceConsistentCasingInFileNames": true,
- "types": ["node"]
- },
- "include": ["src/**/*.ts"],
- "references": [
- {
- "path": "../tools/tsconfig.lib.json"
- },
- {
- "path": "../bridge/tsconfig.lib.json"
- }
- ]
-}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9a2d1e5e..9e0be875 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -515,16 +515,6 @@ importers:
specifier: ^2.3.0
version: 2.8.1
- packages/reporters:
- dependencies:
- '@react-native-harness/tools':
- specifier: workspace:*
- version: link:../tools
- devDependencies:
- '@react-native-harness/bridge':
- specifier: workspace:*
- version: link:../bridge
-
packages/runtime:
dependencies:
'@react-native-harness/bridge':
diff --git a/tsconfig.json b/tsconfig.json
index cc7cc572..9636d917 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -33,9 +33,6 @@
{
"path": "./packages/react-native-harness"
},
- {
- "path": "./packages/reporters"
- },
{
"path": "./packages/jest"
},