From 4676e76214b3d45cecb172edc5ccbb6711071f1c Mon Sep 17 00:00:00 2001 From: Szymon Chmal Date: Tue, 31 Mar 2026 08:43:24 +0200 Subject: [PATCH] refactor: remove unused reporters --- packages/reporters/README.md | 26 --- packages/reporters/package.json | 14 -- packages/reporters/src/default-reporter.ts | 152 ----------------- packages/reporters/src/index.ts | 3 - packages/reporters/src/junit-reporter.ts | 179 --------------------- packages/reporters/src/reporter.ts | 5 - packages/reporters/tsconfig.json | 16 -- packages/reporters/tsconfig.lib.json | 21 --- pnpm-lock.yaml | 10 -- tsconfig.json | 3 - 10 files changed, 429 deletions(-) delete mode 100644 packages/reporters/README.md delete mode 100644 packages/reporters/package.json delete mode 100644 packages/reporters/src/default-reporter.ts delete mode 100644 packages/reporters/src/index.ts delete mode 100644 packages/reporters/src/junit-reporter.ts delete mode 100644 packages/reporters/src/reporter.ts delete mode 100644 packages/reporters/tsconfig.json delete mode 100644 packages/reporters/tsconfig.lib.json 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 @@ -![harness-banner](https://react-native-harness.dev/harness-banner.jpg) - -### 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`; - - return xml; -}; - -const generateTestCaseXML = (test: TestResult, indent: string): string => { - const time = (test.duration || 0) / 1000; - let 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" },