From 97ba6567fc4848accfd2f20fc88d1f3d6623b259 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 23:52:36 +0000 Subject: [PATCH 01/13] Bump jest-junit from 16.0.0 to 17.0.0 Bumps [jest-junit](https://github.com/jest-community/jest-junit) from 16.0.0 to 17.0.0. - [Release notes](https://github.com/jest-community/jest-junit/releases) - [Commits](https://github.com/jest-community/jest-junit/compare/v16.0.0...v17.0.0) --- updated-dependencies: - dependency-name: jest-junit dependency-version: 17.0.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 24 ++++++++++++++---------- package.json | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 726b89e..e579a35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,7 +35,7 @@ "eslint-plugin-jest": "^29.15.2", "eslint-plugin-prettier": "^5.5.5", "jest": "^30.3.0", - "jest-junit": "^16.0.0", + "jest-junit": "^17.0.0", "js-yaml": "^4.1.1", "prettier": "^3.8.3", "ts-jest": "^29.4.9", @@ -6110,19 +6110,19 @@ } }, "node_modules/jest-junit": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", - "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-17.0.0.tgz", + "integrity": "sha512-RYWCkq4j59gUXj5DsgbIE7xFBZzu1gtibPhyjSjMmGaOTLnqlXhg7x9zuGCwgbCuMAyoyvk0Mi8wSrRR5uOeLA==", "dev": true, "license": "Apache-2.0", "dependencies": { "mkdirp": "^1.0.4", "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", + "uuid": "^14.0.0", "xml": "^1.0.1" }, "engines": { - "node": ">=10.12.0" + "node": ">=20.0.0" } }, "node_modules/jest-leak-detector": { @@ -8785,13 +8785,17 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", + "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist-node/bin/uuid" } }, "node_modules/v8-to-istanbul": { diff --git a/package.json b/package.json index 3d02d9e..c4e539f 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "eslint-plugin-jest": "^29.15.2", "eslint-plugin-prettier": "^5.5.5", "jest": "^30.3.0", - "jest-junit": "^16.0.0", + "jest-junit": "^17.0.0", "js-yaml": "^4.1.1", "prettier": "^3.8.3", "ts-jest": "^29.4.9", From a48134be3ee5f10276a189dd3cbbcdb42ada9b78 Mon Sep 17 00:00:00 2001 From: Felix Chapman Date: Tue, 23 Dec 2025 18:25:29 +0000 Subject: [PATCH 02/13] Add new parameter list-files for when there are multiple files in a report --- README.md | 8 +- __tests__/report/get-report.test.ts | 145 +++++++++++++++++++++++++++- action.yml | 8 ++ src/main.ts | 10 +- src/report/get-report.ts | 18 +++- 5 files changed, 182 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 38b2285..a39f83d 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,12 @@ jobs: # none list-tests: 'all' + # Limits which test result files are listed: + # all + # failed + # none + list-files: 'all' + # Limits number of created annotations with error message and stack trace captured during test execution. # Must be less or equal to 50. max-annotations: '10' @@ -444,7 +450,7 @@ Support for Swift test results in xUnit format is experimental - should work but Unfortunately, there are some known issues and limitations caused by GitHub API: - Test report (i.e. build summary) is Markdown text. No custom styling or HTML is possible. -- Maximum report size is 65535 bytes. Input parameters `list-suites` and `list-tests` will be automatically adjusted if max size is exceeded. +- Maximum report size is 65535 bytes. Input parameters `list-suites`, `list-tests`, and `list-files` will be automatically adjusted if max size is exceeded. - Test report can't reference any additional files (e.g. screenshots). You can use `actions/upload-artifact@v4` to upload them and inspect them manually. - Check Runs are created for specific commit SHA. It's not possible to specify under which workflow test report should belong if more workflows are running for the same SHA. Thanks to this GitHub "feature" it's possible your test report will appear in an unexpected place in GitHub UI. diff --git a/__tests__/report/get-report.test.ts b/__tests__/report/get-report.test.ts index 30e1e89..6543208 100644 --- a/__tests__/report/get-report.test.ts +++ b/__tests__/report/get-report.test.ts @@ -1,4 +1,5 @@ -import {getBadge, DEFAULT_OPTIONS, ReportOptions} from '../../src/report/get-report.js' +import {DEFAULT_OPTIONS, getBadge, getReport, ReportOptions} from '../../src/report/get-report.js' +import {TestCaseResult, TestGroupResult, TestRunResult, TestSuiteResult} from '../../src/test-results' describe('getBadge', () => { describe('URI encoding with special characters', () => { @@ -131,3 +132,145 @@ describe('getBadge', () => { }) }) }) + +describe('getReport', () => { + // Helper function to create test results + function createTestResult(path: string, passed: number, failed: number, skipped: number): TestRunResult { + const tests: TestCaseResult[] = [] + for (let i = 0; i < passed; i++) { + tests.push(new TestCaseResult(`passed-test-${i}`, 'success', 100)) + } + for (let i = 0; i < failed; i++) { + tests.push(new TestCaseResult(`failed-test-${i}`, 'failed', 100, { + details: 'Test failed', + message: 'Assertion error' + })) + } + for (let i = 0; i < skipped; i++) { + tests.push(new TestCaseResult(`skipped-test-${i}`, 'skipped', 0)) + } + + const group = new TestGroupResult('test-group', tests) + const suite = new TestSuiteResult('test-suite', [group]) + return new TestRunResult(path, [suite]) + } + + describe('list-files parameter', () => { + const results = [ + createTestResult('passing-file.spec.ts', 5, 0, 0), + createTestResult('failing-file.spec.ts', 3, 2, 1), + createTestResult('passing-with-skipped-file.spec.ts', 8, 0, 2) + ] + + it('shows all files when list-files is "all"', () => { + const report = getReport(results, { + ...DEFAULT_OPTIONS, + listFiles: 'all', + listSuites: 'none', + listTests: 'none' + }) + + expect(report).toContain('passing-file.spec.ts') + expect(report).toContain('failing-file.spec.ts') + expect(report).toContain('passing-with-skipped-file.spec.ts') + }) + + it('shows only failed files when list-files is "failed"', () => { + const report = getReport(results, { + ...DEFAULT_OPTIONS, + listFiles: 'failed', + listSuites: 'none', + listTests: 'none' + }) + + expect(report).not.toContain('passing-file.spec.ts') + expect(report).toContain('failing-file.spec.ts') + expect(report).not.toContain('passing-with-skipped-file.spec.ts') + }) + + it('shows no file details when list-files is "none"', () => { + const report = getReport(results, { + ...DEFAULT_OPTIONS, + listFiles: 'none', + listSuites: 'none', + listTests: 'none' + }) + + // Should still have badge + expect(report).toContain('![') + // Should not have file names in detail sections + expect(report).not.toContain('passing-file.spec.ts') + expect(report).not.toContain('failing-file.spec.ts') + expect(report).not.toContain('passing-with-skipped-file.spec.ts') + }) + + it('includes summary table even with list-files "none"', () => { + const report = getReport(results, { + ...DEFAULT_OPTIONS, + listFiles: 'none', + listSuites: 'all', + listTests: 'none' + }) + + // Badge should still be present + expect(report).toContain('![') + expect(report).toContain('badge') + // File names should not be present + expect(report).not.toContain('passing-file.spec.ts') + expect(report).not.toContain('failing-file.spec.ts') + expect(report).not.toContain('passing-with-skipped-file.spec.ts') + }) + + it('works correctly with list-suites and list-tests when list-files is "failed"', () => { + const report = getReport(results, { + ...DEFAULT_OPTIONS, + listFiles: 'failed', + listSuites: 'all', + listTests: 'all' + }) + + expect(report).not.toContain('passing-file.spec.ts') + expect(report).toContain('failing-file.spec.ts') + expect(report).not.toContain('passing-with-skipped-file.spec.ts') + // Should show suite details for the failed file + expect(report).toContain('test-suite') + }) + + it('filters correctly when all files pass and list-files is "failed"', () => { + const allPassingResults = [ + createTestResult('passing-file-1.spec.ts', 5, 0, 0), + createTestResult('passing-file-2.spec.ts', 8, 0, 2) + ] + + const report = getReport(allPassingResults, { + ...DEFAULT_OPTIONS, + listFiles: 'failed', + listSuites: 'all', + listTests: 'none' + }) + + expect(report).not.toContain('passing-file-1.spec.ts') + expect(report).not.toContain('passing-file-2.spec.ts') + // Badge should still be present + expect(report).toContain('![') + expect(report).toContain('badge') + }) + + it('filters correctly when all files fail and list-files is "failed"', () => { + const allFailingResults = [ + createTestResult('failing-file-1.spec.ts', 0, 5, 0), + createTestResult('failing-file-2.spec.ts', 1, 2, 1) + ] + + const report = getReport(allFailingResults, { + ...DEFAULT_OPTIONS, + listFiles: 'failed', + listSuites: 'all', + listTests: 'none' + }) + + expect(report).toContain('failing-file-1.spec.ts') + expect(report).toContain('failing-file-2.spec.ts') + }) + }) +}) diff --git a/action.yml b/action.yml index be606d4..577b0c3 100644 --- a/action.yml +++ b/action.yml @@ -54,6 +54,14 @@ inputs: - none required: false default: 'all' + list-files: + description: | + Limits which test result files are listed. Supported options: + - all + - failed + - none + required: false + default: 'all' max-annotations: description: | Limits number of created annotations with error message and stack trace captured during test execution. diff --git a/src/main.ts b/src/main.ts index fc6ea16..6705acb 100644 --- a/src/main.ts +++ b/src/main.ts @@ -44,6 +44,7 @@ class TestReporter { readonly reporter = core.getInput('reporter', {required: true}) readonly listSuites = core.getInput('list-suites', {required: true}) as 'all' | 'failed' | 'none' readonly listTests = core.getInput('list-tests', {required: true}) as 'all' | 'failed' | 'none' + readonly listFiles = core.getInput('list-files', {required: true}) as 'all' | 'failed' | 'none' readonly maxAnnotations = parseInt(core.getInput('max-annotations', {required: true})) readonly failOnError = core.getInput('fail-on-error', {required: true}) === 'true' readonly failOnEmpty = core.getInput('fail-on-empty', {required: true}) === 'true' @@ -71,6 +72,11 @@ class TestReporter { return } + if (this.listFiles !== 'all' && this.listFiles !== 'failed' && this.listFiles !== 'none') { + core.setFailed(`Input parameter 'list-files' has invalid value`) + return + } + if (this.collapsed !== 'auto' && this.collapsed !== 'always' && this.collapsed !== 'never') { core.setFailed(`Input parameter 'collapsed' has invalid value`) return @@ -177,7 +183,7 @@ class TestReporter { } } - const {listSuites, listTests, slugPrefix, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed} = this + const {listSuites, listTests, slugPrefix, listFiles, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed} = this const passed = results.reduce((sum, tr) => sum + tr.passed, 0) const failed = results.reduce((sum, tr) => sum + tr.failed, 0) @@ -192,6 +198,7 @@ class TestReporter { listSuites, listTests, slugPrefix, + listFiles, baseUrl, onlySummary, useActionsSummary, @@ -224,6 +231,7 @@ class TestReporter { listSuites, listTests, slugPrefix, + listFiles, baseUrl, onlySummary, useActionsSummary, diff --git a/src/report/get-report.ts b/src/report/get-report.ts index 325e28c..c6fc185 100644 --- a/src/report/get-report.ts +++ b/src/report/get-report.ts @@ -11,7 +11,8 @@ const MAX_ACTIONS_SUMMARY_LENGTH = 1048576 export interface ReportOptions { listSuites: 'all' | 'failed' | 'none' listTests: 'all' | 'failed' | 'none' - slugPrefix: string + slugPrefix: string; + listFiles: 'all' | 'failed' | 'none' baseUrl: string onlySummary: boolean useActionsSummary: boolean @@ -24,6 +25,7 @@ export const DEFAULT_OPTIONS: ReportOptions = { listSuites: 'all', listTests: 'all', slugPrefix: '', + listFiles: 'all', baseUrl: '', onlySummary: false, useActionsSummary: true, @@ -173,8 +175,16 @@ function getTestRunsReport(testRuns: TestRunResult[], options: ReportOptions): s sections.push(` `) } - if (testRuns.length > 0 || options.onlySummary) { - const tableData = testRuns + // Filter test runs based on list-files option + const filteredTestRuns = + options.listFiles === 'failed' + ? testRuns.filter(tr => tr.result === 'failed') + : options.listFiles === 'none' + ? [] + : testRuns + + if (filteredTestRuns.length > 0 || options.onlySummary) { + const tableData = filteredTestRuns .map((tr, originalIndex) => ({tr, originalIndex})) .filter(({tr}) => tr.passed > 0 || tr.failed > 0 || tr.skipped > 0) .map(({tr, originalIndex}) => { @@ -197,7 +207,7 @@ function getTestRunsReport(testRuns: TestRunResult[], options: ReportOptions): s } if (options.onlySummary === false) { - const suitesReports = testRuns.map((tr, i) => getSuitesReport(tr, i, options)).flat() + const suitesReports = filteredTestRuns.map((tr, i) => getSuitesReport(tr, i, options)).flat() sections.push(...suitesReports) } From ba6f1d11e2db25ec4dcbe7d39e4628d10fb5e8ff Mon Sep 17 00:00:00 2001 From: Felix Chapman Date: Wed, 24 Dec 2025 11:24:30 +0000 Subject: [PATCH 03/13] Correct README to indicate list-files is not automatically adjusted --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a39f83d..81d04a5 100644 --- a/README.md +++ b/README.md @@ -450,7 +450,7 @@ Support for Swift test results in xUnit format is experimental - should work but Unfortunately, there are some known issues and limitations caused by GitHub API: - Test report (i.e. build summary) is Markdown text. No custom styling or HTML is possible. -- Maximum report size is 65535 bytes. Input parameters `list-suites`, `list-tests`, and `list-files` will be automatically adjusted if max size is exceeded. +- Maximum report size is 65535 bytes. Input parameters `list-suites` and `list-tests` will be automatically adjusted if max size is exceeded. - Test report can't reference any additional files (e.g. screenshots). You can use `actions/upload-artifact@v4` to upload them and inspect them manually. - Check Runs are created for specific commit SHA. It's not possible to specify under which workflow test report should belong if more workflows are running for the same SHA. Thanks to this GitHub "feature" it's possible your test report will appear in an unexpected place in GitHub UI. From 45c8d46681ab4f9ee9dd01180e5773fc95017b92 Mon Sep 17 00:00:00 2001 From: Jozef Izso Date: Sat, 25 Apr 2026 12:13:19 +0200 Subject: [PATCH 04/13] Resolve list-files conflicts on current main --- __tests__/report/get-report.test.ts | 12 +++++++----- dist/index.js | 22 ++++++++++++++++++---- src/main.ts | 12 +++++++++++- src/report/get-report.ts | 2 +- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/__tests__/report/get-report.test.ts b/__tests__/report/get-report.test.ts index 6543208..6908c6c 100644 --- a/__tests__/report/get-report.test.ts +++ b/__tests__/report/get-report.test.ts @@ -1,5 +1,5 @@ import {DEFAULT_OPTIONS, getBadge, getReport, ReportOptions} from '../../src/report/get-report.js' -import {TestCaseResult, TestGroupResult, TestRunResult, TestSuiteResult} from '../../src/test-results' +import {TestCaseResult, TestGroupResult, TestRunResult, TestSuiteResult} from '../../src/test-results.js' describe('getBadge', () => { describe('URI encoding with special characters', () => { @@ -141,10 +141,12 @@ describe('getReport', () => { tests.push(new TestCaseResult(`passed-test-${i}`, 'success', 100)) } for (let i = 0; i < failed; i++) { - tests.push(new TestCaseResult(`failed-test-${i}`, 'failed', 100, { - details: 'Test failed', - message: 'Assertion error' - })) + tests.push( + new TestCaseResult(`failed-test-${i}`, 'failed', 100, { + details: 'Test failed', + message: 'Assertion error' + }) + ) } for (let i = 0; i < skipped; i++) { tests.push(new TestCaseResult(`skipped-test-${i}`, 'skipped', 0)) diff --git a/dist/index.js b/dist/index.js index c8865b0..576e7ab 100644 --- a/dist/index.js +++ b/dist/index.js @@ -56954,6 +56954,7 @@ const DEFAULT_OPTIONS = { listSuites: 'all', listTests: 'all', slugPrefix: '', + listFiles: 'all', baseUrl: '', onlySummary: false, useActionsSummary: true, @@ -57074,8 +57075,14 @@ function getTestRunsReport(testRuns, options) { sections.push(`
Expand for details`); sections.push(` `); } - if (testRuns.length > 0 || options.onlySummary) { - const tableData = testRuns + // Filter test runs based on list-files option + const filteredTestRuns = options.listFiles === 'failed' + ? testRuns.filter(tr => tr.result === 'failed') + : options.listFiles === 'none' + ? [] + : testRuns; + if (filteredTestRuns.length > 0 || options.onlySummary) { + const tableData = filteredTestRuns .map((tr, originalIndex) => ({ tr, originalIndex })) .filter(({ tr }) => tr.passed > 0 || tr.failed > 0 || tr.skipped > 0) .map(({ tr, originalIndex }) => { @@ -57092,7 +57099,7 @@ function getTestRunsReport(testRuns, options) { sections.push(resultsTable); } if (options.onlySummary === false) { - const suitesReports = testRuns.map((tr, i) => getSuitesReport(tr, i, options)).flat(); + const suitesReports = filteredTestRuns.map((tr, i) => getSuitesReport(tr, i, options)).flat(); sections.push(...suitesReports); } if (shouldCollapse) { @@ -58949,6 +58956,7 @@ class TestReporter { reporter = getInput('reporter', { required: true }); listSuites = getInput('list-suites', { required: true }); listTests = getInput('list-tests', { required: true }); + listFiles = getInput('list-files', { required: true }); maxAnnotations = parseInt(getInput('max-annotations', { required: true })); failOnError = getInput('fail-on-error', { required: true }) === 'true'; failOnEmpty = getInput('fail-on-empty', { required: true }) === 'true'; @@ -58972,6 +58980,10 @@ class TestReporter { setFailed(`Input parameter 'list-tests' has invalid value`); return; } + if (this.listFiles !== 'all' && this.listFiles !== 'failed' && this.listFiles !== 'none') { + setFailed(`Input parameter 'list-files' has invalid value`); + return; + } if (this.collapsed !== 'auto' && this.collapsed !== 'always' && this.collapsed !== 'never') { setFailed(`Input parameter 'collapsed' has invalid value`); return; @@ -59056,7 +59068,7 @@ class TestReporter { throw error; } } - const { listSuites, listTests, slugPrefix, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed } = this; + const { listSuites, listTests, slugPrefix, listFiles, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed } = this; const passed = results.reduce((sum, tr) => sum + tr.passed, 0); const failed = results.reduce((sum, tr) => sum + tr.failed, 0); const skipped = results.reduce((sum, tr) => sum + tr.skipped, 0); @@ -59067,6 +59079,7 @@ class TestReporter { listSuites, listTests, slugPrefix, + listFiles, baseUrl, onlySummary, useActionsSummary, @@ -59096,6 +59109,7 @@ class TestReporter { listSuites, listTests, slugPrefix, + listFiles, baseUrl, onlySummary, useActionsSummary, diff --git a/src/main.ts b/src/main.ts index 6705acb..eb1b3a5 100644 --- a/src/main.ts +++ b/src/main.ts @@ -183,7 +183,17 @@ class TestReporter { } } - const {listSuites, listTests, slugPrefix, listFiles, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed} = this + const { + listSuites, + listTests, + slugPrefix, + listFiles, + onlySummary, + useActionsSummary, + badgeTitle, + reportTitle, + collapsed + } = this const passed = results.reduce((sum, tr) => sum + tr.passed, 0) const failed = results.reduce((sum, tr) => sum + tr.failed, 0) diff --git a/src/report/get-report.ts b/src/report/get-report.ts index c6fc185..52f8645 100644 --- a/src/report/get-report.ts +++ b/src/report/get-report.ts @@ -11,7 +11,7 @@ const MAX_ACTIONS_SUMMARY_LENGTH = 1048576 export interface ReportOptions { listSuites: 'all' | 'failed' | 'none' listTests: 'all' | 'failed' | 'none' - slugPrefix: string; + slugPrefix: string listFiles: 'all' | 'failed' | 'none' baseUrl: string onlySummary: boolean From 0e1fe1690fc8277c287147114c8cfed4a5c6f4d4 Mon Sep 17 00:00:00 2001 From: alexanderthoren Date: Mon, 23 Feb 2026 16:12:01 +0100 Subject: [PATCH 05/13] feat: add sort-suites input to order suites by time descending Add a new 'sort-suites' input parameter that accepts 'name' (default, alphabetical) or 'time-desc' (slowest first). This allows consumers to surface the slowest test suites at the top of the report. Co-authored-by: Cursor --- action.yml | 7 +++++++ dist/index.js | 21 +++++++++++++++++---- src/main.ts | 20 +++++++++++++++++++- src/report/get-report.ts | 12 +++++++++--- 4 files changed, 52 insertions(+), 8 deletions(-) diff --git a/action.yml b/action.yml index be606d4..7b7ddee 100644 --- a/action.yml +++ b/action.yml @@ -46,6 +46,13 @@ inputs: - none required: false default: 'all' + sort-suites: + description: | + Sort order for test suites. Supported options: + - name: Sort alphabetically by name (default) + - time-desc: Sort by execution time, slowest first + required: false + default: 'name' list-tests: description: | Limits which test cases are listed. Supported options: diff --git a/dist/index.js b/dist/index.js index c8865b0..4d3a526 100644 --- a/dist/index.js +++ b/dist/index.js @@ -56954,6 +56954,7 @@ const DEFAULT_OPTIONS = { listSuites: 'all', listTests: 'all', slugPrefix: '', + sortSuites: 'name', baseUrl: '', onlySummary: false, useActionsSummary: true, @@ -56962,7 +56963,7 @@ const DEFAULT_OPTIONS = { collapsed: 'auto' }; function getReport(results, options = DEFAULT_OPTIONS, shortSummary = '') { - applySort(results); + applySort(results, options); const opts = { ...options }; let lines = renderReport(results, opts, shortSummary); let report = lines.join('\n'); @@ -57010,10 +57011,15 @@ function trimReport(lines, options) { reportLines.push(errorMsg); return reportLines.join('\n'); } -function applySort(results) { +function applySort(results, options) { results.sort((a, b) => a.path.localeCompare(b.path, DEFAULT_LOCALE)); for (const res of results) { - res.suites.sort((a, b) => a.name.localeCompare(b.name, DEFAULT_LOCALE)); + if (options.sortSuites === 'time-desc') { + res.suites.sort((a, b) => b.time - a.time); + } + else { + res.suites.sort((a, b) => a.name.localeCompare(b.name, DEFAULT_LOCALE)); + } } } function getByteLength(text) { @@ -58948,6 +58954,7 @@ class TestReporter { pathReplaceBackslashes = getInput('path-replace-backslashes', { required: false }) === 'true'; reporter = getInput('reporter', { required: true }); listSuites = getInput('list-suites', { required: true }); + sortSuites = getInput('sort-suites', { required: false }); listTests = getInput('list-tests', { required: true }); maxAnnotations = parseInt(getInput('max-annotations', { required: true })); failOnError = getInput('fail-on-error', { required: true }) === 'true'; @@ -58968,6 +58975,10 @@ class TestReporter { setFailed(`Input parameter 'list-suites' has invalid value`); return; } + if (this.sortSuites !== 'name' && this.sortSuites !== 'time-desc') { + setFailed(`Input parameter 'sort-suites' has invalid value`); + return; + } if (this.listTests !== 'all' && this.listTests !== 'failed' && this.listTests !== 'none') { setFailed(`Input parameter 'list-tests' has invalid value`); return; @@ -59056,7 +59067,7 @@ class TestReporter { throw error; } } - const { listSuites, listTests, slugPrefix, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed } = this; + const { listSuites, sortSuites, listTests, slugPrefix, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed } = this; const passed = results.reduce((sum, tr) => sum + tr.passed, 0); const failed = results.reduce((sum, tr) => sum + tr.failed, 0); const skipped = results.reduce((sum, tr) => sum + tr.skipped, 0); @@ -59065,6 +59076,7 @@ class TestReporter { if (this.useActionsSummary) { const summary = getReport(results, { listSuites, + sortSuites, listTests, slugPrefix, baseUrl, @@ -59094,6 +59106,7 @@ class TestReporter { baseUrl = createResp.data.html_url; const summary = getReport(results, { listSuites, + sortSuites, listTests, slugPrefix, baseUrl, diff --git a/src/main.ts b/src/main.ts index fc6ea16..330eaff 100644 --- a/src/main.ts +++ b/src/main.ts @@ -43,6 +43,7 @@ class TestReporter { readonly pathReplaceBackslashes = core.getInput('path-replace-backslashes', {required: false}) === 'true' readonly reporter = core.getInput('reporter', {required: true}) readonly listSuites = core.getInput('list-suites', {required: true}) as 'all' | 'failed' | 'none' + readonly sortSuites = core.getInput('sort-suites', {required: false}) as 'name' | 'time-desc' readonly listTests = core.getInput('list-tests', {required: true}) as 'all' | 'failed' | 'none' readonly maxAnnotations = parseInt(core.getInput('max-annotations', {required: true})) readonly failOnError = core.getInput('fail-on-error', {required: true}) === 'true' @@ -66,6 +67,11 @@ class TestReporter { return } + if (this.sortSuites !== 'name' && this.sortSuites !== 'time-desc') { + core.setFailed(`Input parameter 'sort-suites' has invalid value`) + return + } + if (this.listTests !== 'all' && this.listTests !== 'failed' && this.listTests !== 'none') { core.setFailed(`Input parameter 'list-tests' has invalid value`) return @@ -177,7 +183,17 @@ class TestReporter { } } - const {listSuites, listTests, slugPrefix, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed} = this + const { + listSuites, + sortSuites, + listTests, + slugPrefix, + onlySummary, + useActionsSummary, + badgeTitle, + reportTitle, + collapsed + } = this const passed = results.reduce((sum, tr) => sum + tr.passed, 0) const failed = results.reduce((sum, tr) => sum + tr.failed, 0) @@ -190,6 +206,7 @@ class TestReporter { results, { listSuites, + sortSuites, listTests, slugPrefix, baseUrl, @@ -222,6 +239,7 @@ class TestReporter { baseUrl = createResp.data.html_url as string const summary = getReport(results, { listSuites, + sortSuites, listTests, slugPrefix, baseUrl, diff --git a/src/report/get-report.ts b/src/report/get-report.ts index 325e28c..8fd30b5 100644 --- a/src/report/get-report.ts +++ b/src/report/get-report.ts @@ -12,6 +12,7 @@ export interface ReportOptions { listSuites: 'all' | 'failed' | 'none' listTests: 'all' | 'failed' | 'none' slugPrefix: string + sortSuites: 'name' | 'time-desc' baseUrl: string onlySummary: boolean useActionsSummary: boolean @@ -24,6 +25,7 @@ export const DEFAULT_OPTIONS: ReportOptions = { listSuites: 'all', listTests: 'all', slugPrefix: '', + sortSuites: 'name', baseUrl: '', onlySummary: false, useActionsSummary: true, @@ -37,7 +39,7 @@ export function getReport( options: ReportOptions = DEFAULT_OPTIONS, shortSummary = '' ): string { - applySort(results) + applySort(results, options) const opts = {...options} let lines = renderReport(results, opts, shortSummary) @@ -96,10 +98,14 @@ function trimReport(lines: string[], options: ReportOptions): string { return reportLines.join('\n') } -function applySort(results: TestRunResult[]): void { +function applySort(results: TestRunResult[], options: ReportOptions): void { results.sort((a, b) => a.path.localeCompare(b.path, DEFAULT_LOCALE)) for (const res of results) { - res.suites.sort((a, b) => a.name.localeCompare(b.name, DEFAULT_LOCALE)) + if (options.sortSuites === 'time-desc') { + res.suites.sort((a, b) => b.time - a.time) + } else { + res.suites.sort((a, b) => a.name.localeCompare(b.name, DEFAULT_LOCALE)) + } } } From a1f5af1564bae090c6a233d53ccee0738b00f081 Mon Sep 17 00:00:00 2001 From: Jozef Izso Date: Sat, 25 Apr 2026 12:15:53 +0200 Subject: [PATCH 06/13] Add sort-suites report coverage --- __tests__/report/get-report.test.ts | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/__tests__/report/get-report.test.ts b/__tests__/report/get-report.test.ts index 30e1e89..2f60d03 100644 --- a/__tests__/report/get-report.test.ts +++ b/__tests__/report/get-report.test.ts @@ -1,4 +1,5 @@ -import {getBadge, DEFAULT_OPTIONS, ReportOptions} from '../../src/report/get-report.js' +import {DEFAULT_OPTIONS, getBadge, getReport, ReportOptions} from '../../src/report/get-report.js' +import {TestCaseResult, TestGroupResult, TestRunResult, TestSuiteResult} from '../../src/test-results.js' describe('getBadge', () => { describe('URI encoding with special characters', () => { @@ -131,3 +132,28 @@ describe('getBadge', () => { }) }) }) + +describe('getReport', () => { + it('sorts suites by descending time when configured', () => { + const results = [ + new TestRunResult('report.xml', [ + createSuite('unit', 10), + createSuite('integration', 30), + createSuite('smoke', 20) + ]) + ] + + const report = getReport(results, { + ...DEFAULT_OPTIONS, + sortSuites: 'time-desc', + listTests: 'none' + }) + + expect(report.indexOf('integration')).toBeLessThan(report.indexOf('smoke')) + expect(report.indexOf('smoke')).toBeLessThan(report.indexOf('unit')) + }) +}) + +function createSuite(name: string, time: number): TestSuiteResult { + return new TestSuiteResult(name, [new TestGroupResult(name, [new TestCaseResult(`${name}-test`, 'success', time)])]) +} From d7f15447e633efd2285e381ef4a3deb0100f3485 Mon Sep 17 00:00:00 2001 From: Jozef Izso Date: Sat, 25 Apr 2026 13:04:58 +0200 Subject: [PATCH 07/13] Tighten list-files report tests --- __tests__/report/get-report.test.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/__tests__/report/get-report.test.ts b/__tests__/report/get-report.test.ts index 6908c6c..182469e 100644 --- a/__tests__/report/get-report.test.ts +++ b/__tests__/report/get-report.test.ts @@ -172,6 +172,7 @@ describe('getReport', () => { listTests: 'none' }) + expect(report).toContain('|Report|Passed|Failed|Skipped|Time|') expect(report).toContain('passing-file.spec.ts') expect(report).toContain('failing-file.spec.ts') expect(report).toContain('passing-with-skipped-file.spec.ts') @@ -185,6 +186,7 @@ describe('getReport', () => { listTests: 'none' }) + expect(report).toContain('|Report|Passed|Failed|Skipped|Time|') expect(report).not.toContain('passing-file.spec.ts') expect(report).toContain('failing-file.spec.ts') expect(report).not.toContain('passing-with-skipped-file.spec.ts') @@ -198,26 +200,24 @@ describe('getReport', () => { listTests: 'none' }) - // Should still have badge expect(report).toContain('![') - // Should not have file names in detail sections + expect(report).not.toContain('|Report|Passed|Failed|Skipped|Time|') expect(report).not.toContain('passing-file.spec.ts') expect(report).not.toContain('failing-file.spec.ts') expect(report).not.toContain('passing-with-skipped-file.spec.ts') }) - it('includes summary table even with list-files "none"', () => { + it('shows an empty summary table when list-files is "none" and only-summary is enabled', () => { const report = getReport(results, { ...DEFAULT_OPTIONS, listFiles: 'none', listSuites: 'all', + onlySummary: true, listTests: 'none' }) - // Badge should still be present expect(report).toContain('![') - expect(report).toContain('badge') - // File names should not be present + expect(report).toContain('|Report|Passed|Failed|Skipped|Time|') expect(report).not.toContain('passing-file.spec.ts') expect(report).not.toContain('failing-file.spec.ts') expect(report).not.toContain('passing-with-skipped-file.spec.ts') @@ -231,6 +231,7 @@ describe('getReport', () => { listTests: 'all' }) + expect(report).toContain('|Report|Passed|Failed|Skipped|Time|') expect(report).not.toContain('passing-file.spec.ts') expect(report).toContain('failing-file.spec.ts') expect(report).not.toContain('passing-with-skipped-file.spec.ts') @@ -253,9 +254,8 @@ describe('getReport', () => { expect(report).not.toContain('passing-file-1.spec.ts') expect(report).not.toContain('passing-file-2.spec.ts') - // Badge should still be present expect(report).toContain('![') - expect(report).toContain('badge') + expect(report).not.toContain('|Report|Passed|Failed|Skipped|Time|') }) it('filters correctly when all files fail and list-files is "failed"', () => { From e05b863b43f247da6aa3fe54d89138e16f576d23 Mon Sep 17 00:00:00 2001 From: Jozef Izso Date: Sat, 25 Apr 2026 13:17:09 +0200 Subject: [PATCH 08/13] Suppress empty list-files summary table --- __tests__/report/get-report.test.ts | 4 ++-- dist/index.js | 28 ++++++++++++++-------------- src/report/get-report.ts | 28 ++++++++++++++-------------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/__tests__/report/get-report.test.ts b/__tests__/report/get-report.test.ts index 182469e..560f849 100644 --- a/__tests__/report/get-report.test.ts +++ b/__tests__/report/get-report.test.ts @@ -207,7 +207,7 @@ describe('getReport', () => { expect(report).not.toContain('passing-with-skipped-file.spec.ts') }) - it('shows an empty summary table when list-files is "none" and only-summary is enabled', () => { + it('does not show an empty summary table when list-files is "none" and only-summary is enabled', () => { const report = getReport(results, { ...DEFAULT_OPTIONS, listFiles: 'none', @@ -217,7 +217,7 @@ describe('getReport', () => { }) expect(report).toContain('![') - expect(report).toContain('|Report|Passed|Failed|Skipped|Time|') + expect(report).not.toContain('|Report|Passed|Failed|Skipped|Time|') expect(report).not.toContain('passing-file.spec.ts') expect(report).not.toContain('failing-file.spec.ts') expect(report).not.toContain('passing-with-skipped-file.spec.ts') diff --git a/dist/index.js b/dist/index.js index 576e7ab..2847890 100644 --- a/dist/index.js +++ b/dist/index.js @@ -57081,20 +57081,20 @@ function getTestRunsReport(testRuns, options) { : options.listFiles === 'none' ? [] : testRuns; - if (filteredTestRuns.length > 0 || options.onlySummary) { - const tableData = filteredTestRuns - .map((tr, originalIndex) => ({ tr, originalIndex })) - .filter(({ tr }) => tr.passed > 0 || tr.failed > 0 || tr.skipped > 0) - .map(({ tr, originalIndex }) => { - const time = formatTime(tr.time); - const name = tr.path; - const addr = options.baseUrl + makeRunSlug(originalIndex, options).link; - const nameLink = markdown_utils_link(name, addr); - const passed = tr.passed > 0 ? `${tr.passed} ${Icon.success}` : ''; - const failed = tr.failed > 0 ? `${tr.failed} ${Icon.fail}` : ''; - const skipped = tr.skipped > 0 ? `${tr.skipped} ${Icon.skip}` : ''; - return [nameLink, passed, failed, skipped, time]; - }); + const tableData = filteredTestRuns + .map((tr, originalIndex) => ({ tr, originalIndex })) + .filter(({ tr }) => tr.passed > 0 || tr.failed > 0 || tr.skipped > 0) + .map(({ tr, originalIndex }) => { + const time = formatTime(tr.time); + const name = tr.path; + const addr = options.baseUrl + makeRunSlug(originalIndex, options).link; + const nameLink = markdown_utils_link(name, addr); + const passed = tr.passed > 0 ? `${tr.passed} ${Icon.success}` : ''; + const failed = tr.failed > 0 ? `${tr.failed} ${Icon.fail}` : ''; + const skipped = tr.skipped > 0 ? `${tr.skipped} ${Icon.skip}` : ''; + return [nameLink, passed, failed, skipped, time]; + }); + if (tableData.length > 0) { const resultsTable = table(['Report', 'Passed', 'Failed', 'Skipped', 'Time'], [Align.Left, Align.Right, Align.Right, Align.Right, Align.Right], ...tableData); sections.push(resultsTable); } diff --git a/src/report/get-report.ts b/src/report/get-report.ts index 52f8645..cac5596 100644 --- a/src/report/get-report.ts +++ b/src/report/get-report.ts @@ -183,21 +183,21 @@ function getTestRunsReport(testRuns: TestRunResult[], options: ReportOptions): s ? [] : testRuns - if (filteredTestRuns.length > 0 || options.onlySummary) { - const tableData = filteredTestRuns - .map((tr, originalIndex) => ({tr, originalIndex})) - .filter(({tr}) => tr.passed > 0 || tr.failed > 0 || tr.skipped > 0) - .map(({tr, originalIndex}) => { - const time = formatTime(tr.time) - const name = tr.path - const addr = options.baseUrl + makeRunSlug(originalIndex, options).link - const nameLink = link(name, addr) - const passed = tr.passed > 0 ? `${tr.passed} ${Icon.success}` : '' - const failed = tr.failed > 0 ? `${tr.failed} ${Icon.fail}` : '' - const skipped = tr.skipped > 0 ? `${tr.skipped} ${Icon.skip}` : '' - return [nameLink, passed, failed, skipped, time] - }) + const tableData = filteredTestRuns + .map((tr, originalIndex) => ({tr, originalIndex})) + .filter(({tr}) => tr.passed > 0 || tr.failed > 0 || tr.skipped > 0) + .map(({tr, originalIndex}) => { + const time = formatTime(tr.time) + const name = tr.path + const addr = options.baseUrl + makeRunSlug(originalIndex, options).link + const nameLink = link(name, addr) + const passed = tr.passed > 0 ? `${tr.passed} ${Icon.success}` : '' + const failed = tr.failed > 0 ? `${tr.failed} ${Icon.fail}` : '' + const skipped = tr.skipped > 0 ? `${tr.skipped} ${Icon.skip}` : '' + return [nameLink, passed, failed, skipped, time] + }) + if (tableData.length > 0) { const resultsTable = table( ['Report', 'Passed', 'Failed', 'Skipped', 'Time'], [Align.Left, Align.Right, Align.Right, Align.Right, Align.Right], From 528bb1a4e4ccc68f5ba254d5c58e0184343719e1 Mon Sep 17 00:00:00 2001 From: Jozef Izso Date: Sat, 25 Apr 2026 13:31:01 +0200 Subject: [PATCH 09/13] Add changelog for `list-files` input --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20a8c2b..3b107e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 3.1.0 +* Feature: Add `list-files` input to control test report file listing https://github.com/dorny/test-reporter/pull/773 + ## 3.0.0 * Feature: Use NodeJS 24 LTS as default runtime https://github.com/dorny/test-reporter/pull/738 From f610967bd1ed134f3eeeb601764bacf26a6bcb1d Mon Sep 17 00:00:00 2001 From: Jozef Izso Date: Sat, 25 Apr 2026 12:10:34 +0200 Subject: [PATCH 10/13] Add generated summary action output --- README.md | 1 + action.yml | 2 ++ dist/index.js | 2 ++ src/main.ts | 2 ++ 4 files changed, 7 insertions(+) diff --git a/README.md b/README.md index 81d04a5..a7e4674 100644 --- a/README.md +++ b/README.md @@ -225,6 +225,7 @@ jobs: | time | Test execution time [ms] | | url | Check run URL | | url_html | Check run URL HTML | +| summary | Generated test report summary in Markdown format | | slug_prefix| Random anchor links slug prefix generated for the summary headers | ## Supported formats diff --git a/action.yml b/action.yml index 577b0c3..ef1aeff 100644 --- a/action.yml +++ b/action.yml @@ -130,6 +130,8 @@ outputs: description: Check run URL url_html: description: Check run URL HTML + summary: + description: Generated test report summary in Markdown format slug_prefix: description: Random prefix added to generated report anchor slugs for this action run runs: diff --git a/dist/index.js b/dist/index.js index 2847890..b4a075b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -59089,6 +59089,7 @@ class TestReporter { }, shortSummary); info('Summary content:'); info(summary); + setOutput('summary', summary); await summary_summary.addRaw(summary).write(); } else { @@ -59119,6 +59120,7 @@ class TestReporter { }); info('Creating annotations'); const annotations = getAnnotations(results, this.maxAnnotations); + setOutput('summary', summary); const isFailed = this.failOnError && results.some(tr => tr.result === 'failed'); const conclusion = isFailed ? 'failure' : 'success'; info(`Updating check run conclusion (${conclusion}) and output`); diff --git a/src/main.ts b/src/main.ts index eb1b3a5..f6cfcc0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -221,6 +221,7 @@ class TestReporter { core.info('Summary content:') core.info(summary) + core.setOutput('summary', summary) await core.summary.addRaw(summary).write() } else { core.info(`Creating check run ${name}`) @@ -252,6 +253,7 @@ class TestReporter { core.info('Creating annotations') const annotations = getAnnotations(results, this.maxAnnotations) + core.setOutput('summary', summary) const isFailed = this.failOnError && results.some(tr => tr.result === 'failed') const conclusion = isFailed ? 'failure' : 'success' From 49ad12d837ddc68517d419b7faa3a666345cd134 Mon Sep 17 00:00:00 2001 From: Jozef Izso Date: Sat, 25 Apr 2026 13:57:07 +0200 Subject: [PATCH 11/13] Add changelog for `summary` output --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b107e0..815a17f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 3.1.0 * Feature: Add `list-files` input to control test report file listing https://github.com/dorny/test-reporter/pull/773 +* Feature: Add `summary` output with the generated summary in Markdown format https://github.com/dorny/test-reporter/pull/772 ## 3.0.0 * Feature: Use NodeJS 24 LTS as default runtime https://github.com/dorny/test-reporter/pull/738 From bd45c7a5596c6d34c60c5ca27233c05e2de7e6e1 Mon Sep 17 00:00:00 2001 From: Jozef Izso Date: Sat, 25 Apr 2026 14:20:21 +0200 Subject: [PATCH 12/13] Refactor summary output to use a temporary file --- CHANGELOG.md | 2 +- README.md | 2 +- action.yml | 4 ++-- src/main.ts | 15 +++++++++++++-- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 815a17f..7835fed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## 3.1.0 * Feature: Add `list-files` input to control test report file listing https://github.com/dorny/test-reporter/pull/773 -* Feature: Add `summary` output with the generated summary in Markdown format https://github.com/dorny/test-reporter/pull/772 +* Feature: Add `summary_file` output with the path to the generated summary in Markdown format https://github.com/dorny/test-reporter/pull/772 ## 3.0.0 * Feature: Use NodeJS 24 LTS as default runtime https://github.com/dorny/test-reporter/pull/738 diff --git a/README.md b/README.md index a7e4674..f6624d8 100644 --- a/README.md +++ b/README.md @@ -225,7 +225,7 @@ jobs: | time | Test execution time [ms] | | url | Check run URL | | url_html | Check run URL HTML | -| summary | Generated test report summary in Markdown format | +| summary_file | Path to a file containing the generated test report summary in Markdown format | | slug_prefix| Random anchor links slug prefix generated for the summary headers | ## Supported formats diff --git a/action.yml b/action.yml index ef1aeff..fb11227 100644 --- a/action.yml +++ b/action.yml @@ -130,8 +130,8 @@ outputs: description: Check run URL url_html: description: Check run URL HTML - summary: - description: Generated test report summary in Markdown format + summary_file: + description: Path to a file containing the generated test report summary in Markdown format slug_prefix: description: Random prefix added to generated report anchor slugs for this action run runs: diff --git a/src/main.ts b/src/main.ts index f6cfcc0..62da4bc 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,6 +2,9 @@ import * as core from '@actions/core' import * as github from '@actions/github' import {GitHub} from '@actions/github/lib/utils' import {randomBytes} from 'node:crypto' +import {writeFileSync} from 'node:fs' +import {tmpdir} from 'node:os' +import {join} from 'node:path' import {ArtifactProvider} from './input-providers/artifact-provider.js' import {LocalFileProvider} from './input-providers/local-file-provider.js' @@ -221,7 +224,7 @@ class TestReporter { core.info('Summary content:') core.info(summary) - core.setOutput('summary', summary) + this.writeSummaryFile(summary) await core.summary.addRaw(summary).write() } else { core.info(`Creating check run ${name}`) @@ -253,7 +256,7 @@ class TestReporter { core.info('Creating annotations') const annotations = getAnnotations(results, this.maxAnnotations) - core.setOutput('summary', summary) + this.writeSummaryFile(summary) const isFailed = this.failOnError && results.some(tr => tr.result === 'failed') const conclusion = isFailed ? 'failure' : 'success' @@ -280,6 +283,14 @@ class TestReporter { return results } + writeSummaryFile(summary: string): void { + const dir = process.env.RUNNER_TEMP || tmpdir() + const file = join(dir, `test-reporter-summary-${randomBytes(8).toString('hex')}.md`) + writeFileSync(file, summary) + core.info(`Summary written to ${file}`) + core.setOutput('summary_file', file) + } + getParser(reporter: string, options: ParseOptions): TestParser { switch (reporter) { case 'dart-json': From 373689ed6bea431780db3a93fd31f97596b51d85 Mon Sep 17 00:00:00 2001 From: Jozef Izso Date: Sat, 25 Apr 2026 14:20:38 +0200 Subject: [PATCH 13/13] chore: rebuild dist folder --- dist/index.js | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/dist/index.js b/dist/index.js index b4a075b..8f0b42f 100644 --- a/dist/index.js +++ b/dist/index.js @@ -16015,7 +16015,7 @@ module.exports.fetch = async function fetch (init, options = undefined) { } module.exports.Headers = __nccwpck_require__(660).Headers module.exports.Response = __nccwpck_require__(9051).Response -module.exports.Request = __nccwpck_require__(2348).Request +module.exports.Request = __nccwpck_require__(9967).Request module.exports.FormData = __nccwpck_require__(5910).FormData module.exports.File = globalThis.File ?? (__nccwpck_require__(4573).File) module.exports.FileReader = __nccwpck_require__(8355).FileReader @@ -27430,7 +27430,7 @@ const { urlEquals, getFieldValues } = __nccwpck_require__(6798) const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(3440) const { webidl } = __nccwpck_require__(5893) const { Response, cloneResponse, fromInnerResponse } = __nccwpck_require__(9051) -const { Request, fromInnerRequest } = __nccwpck_require__(2348) +const { Request, fromInnerRequest } = __nccwpck_require__(9967) const { kState } = __nccwpck_require__(3627) const { fetching } = __nccwpck_require__(4398) const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(3168) @@ -29744,7 +29744,7 @@ module.exports = { const { pipeline } = __nccwpck_require__(7075) const { fetching } = __nccwpck_require__(4398) -const { makeRequest } = __nccwpck_require__(2348) +const { makeRequest } = __nccwpck_require__(9967) const { webidl } = __nccwpck_require__(5893) const { EventSourceStream } = __nccwpck_require__(4031) const { parseMIMEType } = __nccwpck_require__(1900) @@ -33368,7 +33368,7 @@ const { fromInnerResponse } = __nccwpck_require__(9051) const { HeadersList } = __nccwpck_require__(660) -const { Request, cloneRequest } = __nccwpck_require__(2348) +const { Request, cloneRequest } = __nccwpck_require__(9967) const zlib = __nccwpck_require__(8522) const { bytesMatch, @@ -35632,7 +35632,7 @@ module.exports = { /***/ }), -/***/ 2348: +/***/ 9967: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { /* globals AbortController */ @@ -40814,7 +40814,7 @@ const { const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = __nccwpck_require__(8625) const { channels } = __nccwpck_require__(2414) const { CloseEvent } = __nccwpck_require__(5188) -const { makeRequest } = __nccwpck_require__(2348) +const { makeRequest } = __nccwpck_require__(9967) const { fetching } = __nccwpck_require__(4398) const { Headers, getHeadersList } = __nccwpck_require__(660) const { getDecodeSplit } = __nccwpck_require__(3168) @@ -56445,6 +56445,12 @@ function getOctokit(token, options, ...additionalPlugins) { //# sourceMappingURL=github.js.map // EXTERNAL MODULE: external "node:crypto" var external_node_crypto_ = __nccwpck_require__(7598); +;// CONCATENATED MODULE: external "node:fs" +const external_node_fs_namespaceObject = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("node:fs"); +;// CONCATENATED MODULE: external "node:os" +const external_node_os_namespaceObject = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("node:os"); +;// CONCATENATED MODULE: external "node:path" +const external_node_path_namespaceObject = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("node:path"); // EXTERNAL MODULE: ./node_modules/adm-zip/adm-zip.js var adm_zip = __nccwpck_require__(1316); // EXTERNAL MODULE: ./node_modules/picomatch/index.js @@ -58932,6 +58938,9 @@ class NetteTesterJunitParser { + + + @@ -59089,7 +59098,7 @@ class TestReporter { }, shortSummary); info('Summary content:'); info(summary); - setOutput('summary', summary); + this.writeSummaryFile(summary); await summary_summary.addRaw(summary).write(); } else { @@ -59120,7 +59129,7 @@ class TestReporter { }); info('Creating annotations'); const annotations = getAnnotations(results, this.maxAnnotations); - setOutput('summary', summary); + this.writeSummaryFile(summary); const isFailed = this.failOnError && results.some(tr => tr.result === 'failed'); const conclusion = isFailed ? 'failure' : 'success'; info(`Updating check run conclusion (${conclusion}) and output`); @@ -59143,6 +59152,13 @@ class TestReporter { } return results; } + writeSummaryFile(summary) { + const dir = process.env.RUNNER_TEMP || (0,external_node_os_namespaceObject.tmpdir)(); + const file = (0,external_node_path_namespaceObject.join)(dir, `test-reporter-summary-${(0,external_node_crypto_.randomBytes)(8).toString('hex')}.md`); + (0,external_node_fs_namespaceObject.writeFileSync)(file, summary); + info(`Summary written to ${file}`); + setOutput('summary_file', file); + } getParser(reporter, options) { switch (reporter) { case 'dart-json':