mirror of
https://github.com/dorny/test-reporter.git
synced 2025-12-15 22:07:09 +01:00
Improve README and action.yml
This commit is contained in:
parent
8fdf2aead9
commit
92cb68e21e
7 changed files with 299 additions and 80 deletions
2
LICENSE
2
LICENSE
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2020 Michal Dorner and contributors
|
||||
Copyright (c) 2021 Michal Dorner and contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
|||
186
README.md
186
README.md
|
|
@ -1,12 +1,180 @@
|
|||
**WIP**
|
||||
# Test Reporter
|
||||
|
||||
# Test Check Report
|
||||
This [Github Action](https://github.com/features/actions) displays test results from popular testing frameworks directly in GitHub.
|
||||
- [x] Parses test results in XML or JSON format and creates nice report (Github Check Run)
|
||||
- [x] Annotates code where it failed based on message and stack trace captured during test execution
|
||||
- [x] Sets output variable conclusion to `success` if all tests passed or `failure` if any test failed
|
||||
|
||||
Goal of this project is to create [Github Action](https://github.com/features/actions)
|
||||
that could presents test results from popular testing frameworks as Github check run with code annotation in places where test failed.
|
||||
**Supported languages / frameworks:**
|
||||
- .NET / [xUnit](https://xunit.net/) / [NUnit](https://nunit.org/) / [MSTest](https://github.com/Microsoft/testfx-docs)
|
||||
- Dart / [test](https://pub.dev/packages/test)
|
||||
- Flutter / [test](https://pub.dev/packages/test)
|
||||
- JavaScript / [JEST](https://jestjs.io/)
|
||||
|
||||
Support for following test reports are planned for initial release:
|
||||
- [ ] dart-json: [`dart test --file-reporter=\"json:test-results.json`](https://pub.dev/packages/test)
|
||||
- [ ] dotnet-trx: [`dotnet test --logger "trx;LogFileName=test-results.trx"`](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#examples)
|
||||
- [ ] flutter-machine: [`flutter test --machine > test-results.json`](https://flutter.dev/docs/cookbook/testing/unit/introduction)
|
||||
- [ ] jest-junit: [`jest --ci --reporters=jest-junit`](https://github.com/jest-community/jest-junit#readme)
|
||||
For more information see [Supported formats](#supported-formats) section.
|
||||
|
||||
**Support is planned for:**
|
||||
- Java / [JUnit 5](https://junit.org/junit5/)
|
||||
|
||||
Do you miss support for your favorite language or framework?
|
||||
Please create [Issue](https://github.com/dorny/test-reporter/issues/new) or contribute with PR.
|
||||
|
||||
## Example
|
||||
|
||||
```yaml
|
||||
jobs:
|
||||
build-test:
|
||||
name: 'Build & Test'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2 # checkout the repo
|
||||
- run: npm ci # install packages
|
||||
- run: npm test # run tests (configured to use jest-junit reporter)
|
||||
|
||||
- name: 'Test Report'
|
||||
uses: dorny/test-reporter@v1
|
||||
if: always() # run this step even if previous step failed
|
||||
with:
|
||||
name: 'JEST Tests' # Name of the check run which will be created
|
||||
path: '__reports__/jest-*.xml' # Path to test report
|
||||
reporter: 'jest-junit' # Format of test report
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```yaml
|
||||
- uses: dorny/test-reporter@v1
|
||||
with:
|
||||
|
||||
# Name of the Check Run which will be created
|
||||
name: ''
|
||||
|
||||
# Path to test report
|
||||
# Supports wildcards via [fast-glob](https://github.com/mrmlnc/fast-glob)
|
||||
# Path may match multiple result files of same format
|
||||
path: ''
|
||||
|
||||
# Format of test report. Supported options:
|
||||
# dart-json
|
||||
# dotnet-trx
|
||||
# flutter-machine
|
||||
# jest-junit
|
||||
reporter: ''
|
||||
|
||||
# Enables code annotations with error message and stack trace
|
||||
annotations: 'true'
|
||||
|
||||
# Set action as failed if test report contain any failed test
|
||||
fail-on-error: 'true'
|
||||
|
||||
# Relative path under $GITHUB_WORKSPACE where the repository was checked out.
|
||||
working-directory: ''
|
||||
|
||||
# Personal access token used to interact with Github API
|
||||
# Default: ${{ github.token }}
|
||||
token: ''
|
||||
```
|
||||
|
||||
## Supported formats
|
||||
|
||||
<details>
|
||||
<summary>dart-json</summary>
|
||||
|
||||
Test run must be configured to use [JSON](https://github.com/dart-lang/test/blob/master/pkgs/test/doc/configuration.md#reporter) reporter.
|
||||
You can configure it in `dart_test.yaml`:
|
||||
|
||||
```yml
|
||||
file_reporters:
|
||||
json: reports/test-results.json
|
||||
```
|
||||
|
||||
Or with CLI arguments:
|
||||
|
||||
[`dart test --file-reporter="json:test-results.json"`](https://pub.dev/packages/test)
|
||||
|
||||
For more information see:
|
||||
- [test package](https://pub.dev/packages/test)
|
||||
- [test configuration](https://github.com/dart-lang/test/blob/master/pkgs/test/doc/configuration.md)
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>dotnet-trx</summary>
|
||||
|
||||
Test execution must be configured to produce *Visual Studio Test Results* files (TRX).
|
||||
To get test results in TRX format you can execute your tests with CLI arguments:
|
||||
|
||||
`dotnet test --logger "trx;LogFileName=test-results.trx"`
|
||||
|
||||
Or you can configure TRX test output in `*.csproj` or `Directory.Build.props`:
|
||||
```xml
|
||||
<PropertyGroup>
|
||||
<VSTestLogger>trx%3bLogFileName=$(MSBuildProjectName).trx</VSTestLogger>
|
||||
<VSTestResultsDirectory>$(MSBuildThisFileDirectory)/reports</VSTestResultsDirectory>
|
||||
</PropertyGroup>
|
||||
```
|
||||
|
||||
Supported testing frameworks:
|
||||
- [xUnit](https://xunit.net/)
|
||||
- [NUnit](https://nunit.org/)
|
||||
- [MSTest](https://github.com/Microsoft/testfx-docs)
|
||||
|
||||
For more information see [dotnet test](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#examples)
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>flutter-machine</summary>
|
||||
|
||||
Test run must be configured to use [JSON](https://github.com/dart-lang/test/blob/master/pkgs/test/doc/configuration.md#reporter) reporter.
|
||||
You can configure it in `dart_test.yaml`:
|
||||
```yml
|
||||
file_reporters:
|
||||
json: reports/test-results.json
|
||||
```
|
||||
|
||||
Or with (undocumented) CLI argument:
|
||||
|
||||
`flutter test --machine > test-results.json`
|
||||
|
||||
|
||||
According to documentation `dart_test.yaml` should be at the root of the package, next to the package's pubspec.
|
||||
It works in dart projects but the file is ignored by flutter. With flutter it works when `dart_test.yaml` is placed inside your `test` folder.
|
||||
|
||||
For more information see:
|
||||
- [test package](https://pub.dev/packages/test)
|
||||
- [test configuration](https://github.com/dart-lang/test/blob/master/pkgs/test/doc/configuration.md)
|
||||
- [flutter-cli](https://flutter.dev/docs/reference/flutter-cli)
|
||||
- [unit testing introduction](https://flutter.dev/docs/cookbook/testing/unit/introduction)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>jest-junit</summary>
|
||||
|
||||
[JEST](https://jestjs.io/) testing framework support requires usage of [jest-junit](https://github.com/jest-community/jest-junit) reporter.
|
||||
It will create test results in junit XML format which can be then processed by this action.
|
||||
You can use following example configuration in `package.json`:
|
||||
```json
|
||||
"scripts": {
|
||||
"test": "jest --ci --reporters=default --reporters=jest-junit"
|
||||
},
|
||||
"devDependencies": {
|
||||
"jest": "^26.5.3",
|
||||
"jest-junit": "^12.0.0"
|
||||
},
|
||||
"jest-junit": {
|
||||
"outputDirectory": "__reports__",
|
||||
"outputName": "jest-junit.xml",
|
||||
"ancestorSeparator": " › ",
|
||||
"uniqueOutputName": "false",
|
||||
"suiteNameTemplate": "{filepath}",
|
||||
"classNameTemplate": "{classname}",
|
||||
"titleTemplate": "{title}"
|
||||
}
|
||||
```
|
||||
|
||||
Configuration of `uniqueOutputName`, `suiteNameTemplate`, `classNameTemplate`, `titleTemplate` is important for proper visualization of test results.
|
||||
</details>
|
||||
|
||||
## License
|
||||
|
||||
The scripts and documentation in this project are released under the [MIT License](https://github.com/dorny/test-reporter/blob/master/LICENSE)
|
||||
|
|
|
|||
24
action.yml
24
action.yml
|
|
@ -1,26 +1,22 @@
|
|||
name: 'Test Check Reporter'
|
||||
name: Test Reporter
|
||||
description: |
|
||||
Presents test results from popular testing frameworks as Github check run.
|
||||
Supports:
|
||||
- dotnet (trx logger)
|
||||
- flutter (JSON output with '--machine' flag )
|
||||
- jest (jest-junit reporter)
|
||||
|
||||
author: 'Michal Dorner <dorner.michal@gmail.com>'
|
||||
Displays test results from popular testing frameworks directly in GitHub.
|
||||
Supports .NET (xUnit, NUnit, MSTest), Dart, Flutter and JavaScript (JEST).
|
||||
author: Michal Dorner <dorner.michal@gmail.com>
|
||||
inputs:
|
||||
annotations:
|
||||
description: 'Annotate code where exceptions in tests were thrown'
|
||||
description: Enables code annotations with error message and stack trace captured during test execution
|
||||
required: true
|
||||
default: 'true'
|
||||
fail-on-error:
|
||||
description: 'Set this action as failed if test report contains any failed test'
|
||||
description: Set this action as failed if test report contain any failed test
|
||||
required: true
|
||||
default: 'true'
|
||||
name:
|
||||
description: 'Name of the check run'
|
||||
description: Name of the check run
|
||||
required: true
|
||||
path:
|
||||
description: 'Path to test report'
|
||||
description: Path to test report
|
||||
required: true
|
||||
reporter:
|
||||
description: |
|
||||
|
|
@ -31,11 +27,11 @@ inputs:
|
|||
- jest-junit
|
||||
required: true
|
||||
token:
|
||||
description: 'GitHub Access Token'
|
||||
description: GitHub Access Token
|
||||
required: false
|
||||
default: ${{ github.token }}
|
||||
working-directory:
|
||||
description: 'Relative path under $GITHUB_WORKSPACE where the repository was checked out.'
|
||||
description: Relative path under $GITHUB_WORKSPACE where the repository was checked out
|
||||
required: false
|
||||
outputs:
|
||||
conclusion:
|
||||
|
|
|
|||
95
dist/index.js
generated
vendored
95
dist/index.js
generated
vendored
|
|
@ -3536,6 +3536,7 @@ function copyFile(srcFile, destFile, force) {
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;
|
||||
const fs = __nccwpck_require__(5747);
|
||||
exports.FILE_SYSTEM_ADAPTER = {
|
||||
lstat: fs.lstat,
|
||||
|
|
@ -3562,6 +3563,7 @@ exports.createFileSystemAdapter = createFileSystemAdapter;
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = void 0;
|
||||
const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.');
|
||||
const MAJOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[0], 10);
|
||||
const MINOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[1], 10);
|
||||
|
|
@ -3583,6 +3585,7 @@ exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_B
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.Settings = exports.scandirSync = exports.scandir = void 0;
|
||||
const async = __nccwpck_require__(4507);
|
||||
const sync = __nccwpck_require__(9560);
|
||||
const settings_1 = __nccwpck_require__(8662);
|
||||
|
|
@ -3615,10 +3618,12 @@ function getSettings(settingsOrOptions = {}) {
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.readdir = exports.readdirWithFileTypes = exports.read = void 0;
|
||||
const fsStat = __nccwpck_require__(109);
|
||||
const rpl = __nccwpck_require__(5288);
|
||||
const constants_1 = __nccwpck_require__(8838);
|
||||
const utils = __nccwpck_require__(6297);
|
||||
const common = __nccwpck_require__(3847);
|
||||
function read(directory, settings, callback) {
|
||||
if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {
|
||||
return readdirWithFileTypes(directory, settings, callback);
|
||||
|
|
@ -3634,7 +3639,7 @@ function readdirWithFileTypes(directory, settings, callback) {
|
|||
const entries = dirents.map((dirent) => ({
|
||||
dirent,
|
||||
name: dirent.name,
|
||||
path: `${directory}${settings.pathSegmentSeparator}${dirent.name}`
|
||||
path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)
|
||||
}));
|
||||
if (!settings.followSymbolicLinks) {
|
||||
return callSuccessCallback(callback, entries);
|
||||
|
|
@ -3671,7 +3676,7 @@ function readdir(directory, settings, callback) {
|
|||
if (readdirError !== null) {
|
||||
return callFailureCallback(callback, readdirError);
|
||||
}
|
||||
const filepaths = names.map((name) => `${directory}${settings.pathSegmentSeparator}${name}`);
|
||||
const filepaths = names.map((name) => common.joinPathSegments(directory, name, settings.pathSegmentSeparator));
|
||||
const tasks = filepaths.map((filepath) => {
|
||||
return (done) => fsStat.stat(filepath, settings.fsStatSettings, done);
|
||||
});
|
||||
|
|
@ -3705,6 +3710,27 @@ function callSuccessCallback(callback, result) {
|
|||
}
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ 3847:
|
||||
/***/ ((__unused_webpack_module, exports) => {
|
||||
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.joinPathSegments = void 0;
|
||||
function joinPathSegments(a, b, separator) {
|
||||
/**
|
||||
* The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).
|
||||
*/
|
||||
if (a.endsWith(separator)) {
|
||||
return a + b;
|
||||
}
|
||||
return a + separator + b;
|
||||
}
|
||||
exports.joinPathSegments = joinPathSegments;
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ 9560:
|
||||
|
|
@ -3713,9 +3739,11 @@ function callSuccessCallback(callback, result) {
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.readdir = exports.readdirWithFileTypes = exports.read = void 0;
|
||||
const fsStat = __nccwpck_require__(109);
|
||||
const constants_1 = __nccwpck_require__(8838);
|
||||
const utils = __nccwpck_require__(6297);
|
||||
const common = __nccwpck_require__(3847);
|
||||
function read(directory, settings) {
|
||||
if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {
|
||||
return readdirWithFileTypes(directory, settings);
|
||||
|
|
@ -3729,7 +3757,7 @@ function readdirWithFileTypes(directory, settings) {
|
|||
const entry = {
|
||||
dirent,
|
||||
name: dirent.name,
|
||||
path: `${directory}${settings.pathSegmentSeparator}${dirent.name}`
|
||||
path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)
|
||||
};
|
||||
if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) {
|
||||
try {
|
||||
|
|
@ -3749,7 +3777,7 @@ exports.readdirWithFileTypes = readdirWithFileTypes;
|
|||
function readdir(directory, settings) {
|
||||
const names = settings.fs.readdirSync(directory);
|
||||
return names.map((name) => {
|
||||
const entryPath = `${directory}${settings.pathSegmentSeparator}${name}`;
|
||||
const entryPath = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);
|
||||
const stats = fsStat.statSync(entryPath, settings.fsStatSettings);
|
||||
const entry = {
|
||||
name,
|
||||
|
|
@ -3791,7 +3819,7 @@ class Settings {
|
|||
});
|
||||
}
|
||||
_getValue(option, value) {
|
||||
return option === undefined ? value : option;
|
||||
return option !== null && option !== void 0 ? option : value;
|
||||
}
|
||||
}
|
||||
exports.default = Settings;
|
||||
|
|
@ -3805,6 +3833,7 @@ exports.default = Settings;
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.createDirentFromStats = void 0;
|
||||
class DirentFromStats {
|
||||
constructor(name, stats) {
|
||||
this.name = name;
|
||||
|
|
@ -3831,6 +3860,7 @@ exports.createDirentFromStats = createDirentFromStats;
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.fs = void 0;
|
||||
const fs = __nccwpck_require__(883);
|
||||
exports.fs = fs;
|
||||
|
||||
|
|
@ -3843,6 +3873,7 @@ exports.fs = fs;
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;
|
||||
const fs = __nccwpck_require__(5747);
|
||||
exports.FILE_SYSTEM_ADAPTER = {
|
||||
lstat: fs.lstat,
|
||||
|
|
@ -3867,6 +3898,7 @@ exports.createFileSystemAdapter = createFileSystemAdapter;
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.statSync = exports.stat = exports.Settings = void 0;
|
||||
const async = __nccwpck_require__(4147);
|
||||
const sync = __nccwpck_require__(4527);
|
||||
const settings_1 = __nccwpck_require__(2410);
|
||||
|
|
@ -3899,6 +3931,7 @@ function getSettings(settingsOrOptions = {}) {
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.read = void 0;
|
||||
function read(path, settings, callback) {
|
||||
settings.fs.lstat(path, (lstatError, lstat) => {
|
||||
if (lstatError !== null) {
|
||||
|
|
@ -3938,6 +3971,7 @@ function callSuccessCallback(callback, result) {
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.read = void 0;
|
||||
function read(path, settings) {
|
||||
const lstat = settings.fs.lstatSync(path);
|
||||
if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {
|
||||
|
|
@ -3978,7 +4012,7 @@ class Settings {
|
|||
this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);
|
||||
}
|
||||
_getValue(option, value) {
|
||||
return option === undefined ? value : option;
|
||||
return option !== null && option !== void 0 ? option : value;
|
||||
}
|
||||
}
|
||||
exports.default = Settings;
|
||||
|
|
@ -3992,6 +4026,7 @@ exports.default = Settings;
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.Settings = exports.walkStream = exports.walkSync = exports.walk = void 0;
|
||||
const async_1 = __nccwpck_require__(7523);
|
||||
const stream_1 = __nccwpck_require__(6737);
|
||||
const sync_1 = __nccwpck_require__(3068);
|
||||
|
|
@ -4080,7 +4115,11 @@ class StreamProvider {
|
|||
this._stream = new stream_1.Readable({
|
||||
objectMode: true,
|
||||
read: () => { },
|
||||
destroy: this._reader.destroy.bind(this._reader)
|
||||
destroy: () => {
|
||||
if (!this._reader.isDestroyed) {
|
||||
this._reader.destroy();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
read() {
|
||||
|
|
@ -4158,6 +4197,9 @@ class AsyncReader extends reader_1.default {
|
|||
});
|
||||
return this._emitter;
|
||||
}
|
||||
get isDestroyed() {
|
||||
return this._isDestroyed;
|
||||
}
|
||||
destroy() {
|
||||
if (this._isDestroyed) {
|
||||
throw new Error('The reader is already destroyed');
|
||||
|
|
@ -4194,7 +4236,7 @@ class AsyncReader extends reader_1.default {
|
|||
});
|
||||
}
|
||||
_handleError(error) {
|
||||
if (!common.isFatalError(this._settings, error)) {
|
||||
if (this._isDestroyed || !common.isFatalError(this._settings, error)) {
|
||||
return;
|
||||
}
|
||||
this._isFatalError = true;
|
||||
|
|
@ -4231,6 +4273,7 @@ exports.default = AsyncReader;
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.joinPathSegments = exports.replacePathSegmentSeparator = exports.isAppliedFilter = exports.isFatalError = void 0;
|
||||
function isFatalError(settings, error) {
|
||||
if (settings.errorFilter === null) {
|
||||
return true;
|
||||
|
|
@ -4243,13 +4286,19 @@ function isAppliedFilter(filter, value) {
|
|||
}
|
||||
exports.isAppliedFilter = isAppliedFilter;
|
||||
function replacePathSegmentSeparator(filepath, separator) {
|
||||
return filepath.split(/[\\/]/).join(separator);
|
||||
return filepath.split(/[/\\]/).join(separator);
|
||||
}
|
||||
exports.replacePathSegmentSeparator = replacePathSegmentSeparator;
|
||||
function joinPathSegments(a, b, separator) {
|
||||
if (a === '') {
|
||||
return b;
|
||||
}
|
||||
/**
|
||||
* The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).
|
||||
*/
|
||||
if (a.endsWith(separator)) {
|
||||
return a + b;
|
||||
}
|
||||
return a + separator + b;
|
||||
}
|
||||
exports.joinPathSegments = joinPathSegments;
|
||||
|
|
@ -4369,7 +4418,7 @@ class Settings {
|
|||
});
|
||||
}
|
||||
_getValue(option, value) {
|
||||
return option === undefined ? value : option;
|
||||
return option !== null && option !== void 0 ? option : value;
|
||||
}
|
||||
}
|
||||
exports.default = Settings;
|
||||
|
|
@ -9700,7 +9749,11 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|||
exports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0;
|
||||
const fs = __nccwpck_require__(5747);
|
||||
const os = __nccwpck_require__(2087);
|
||||
const CPU_COUNT = os.cpus().length;
|
||||
/**
|
||||
* The `os.cpus` method can return zero. We expect the number of cores to be greater than zero.
|
||||
* https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107
|
||||
*/
|
||||
const CPU_COUNT = Math.max(os.cpus().length, 1);
|
||||
exports.DEFAULT_FILE_SYSTEM_ADAPTER = {
|
||||
lstat: fs.lstat,
|
||||
lstatSync: fs.lstatSync,
|
||||
|
|
@ -10089,10 +10142,15 @@ function fastqueue (context, worker, concurrency) {
|
|||
context = null
|
||||
}
|
||||
|
||||
if (concurrency < 1) {
|
||||
throw new Error('fastqueue concurrency must be greater than 1')
|
||||
}
|
||||
|
||||
var cache = reusify(Task)
|
||||
var queueHead = null
|
||||
var queueTail = null
|
||||
var _running = 0
|
||||
var errorHandler = null
|
||||
|
||||
var self = {
|
||||
push: push,
|
||||
|
|
@ -10109,7 +10167,8 @@ function fastqueue (context, worker, concurrency) {
|
|||
unshift: unshift,
|
||||
empty: noop,
|
||||
kill: kill,
|
||||
killAndDrain: killAndDrain
|
||||
killAndDrain: killAndDrain,
|
||||
error: error
|
||||
}
|
||||
|
||||
return self
|
||||
|
|
@ -10166,6 +10225,7 @@ function fastqueue (context, worker, concurrency) {
|
|||
current.release = release
|
||||
current.value = value
|
||||
current.callback = done || noop
|
||||
current.errorHandler = errorHandler
|
||||
|
||||
if (_running === self.concurrency || self.paused) {
|
||||
if (queueTail) {
|
||||
|
|
@ -10241,6 +10301,10 @@ function fastqueue (context, worker, concurrency) {
|
|||
self.drain()
|
||||
self.drain = noop
|
||||
}
|
||||
|
||||
function error (handler) {
|
||||
errorHandler = handler
|
||||
}
|
||||
}
|
||||
|
||||
function noop () {}
|
||||
|
|
@ -10251,13 +10315,19 @@ function Task () {
|
|||
this.next = null
|
||||
this.release = noop
|
||||
this.context = null
|
||||
this.errorHandler = null
|
||||
|
||||
var self = this
|
||||
|
||||
this.worked = function worked (err, result) {
|
||||
var callback = self.callback
|
||||
var errorHandler = self.errorHandler
|
||||
var val = self.value
|
||||
self.value = null
|
||||
self.callback = noop
|
||||
if (self.errorHandler) {
|
||||
errorHandler(err, val)
|
||||
}
|
||||
callback.call(self.context, err, result)
|
||||
self.release(self)
|
||||
}
|
||||
|
|
@ -14395,6 +14465,7 @@ module.exports = reusify
|
|||
/***/ 5288:
|
||||
/***/ ((module) => {
|
||||
|
||||
/*! run-parallel. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
||||
module.exports = runParallel
|
||||
|
||||
function runParallel (tasks, cb) {
|
||||
|
|
|
|||
2
dist/index.js.map
generated
vendored
2
dist/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
67
package-lock.json
generated
67
package-lock.json
generated
|
|
@ -1814,28 +1814,25 @@
|
|||
}
|
||||
},
|
||||
"@nodelib/fs.scandir": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
|
||||
"integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
|
||||
"dev": true,
|
||||
"version": "2.1.4",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
|
||||
"integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
|
||||
"requires": {
|
||||
"@nodelib/fs.stat": "2.0.3",
|
||||
"@nodelib/fs.stat": "2.0.4",
|
||||
"run-parallel": "^1.1.9"
|
||||
}
|
||||
},
|
||||
"@nodelib/fs.stat": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
|
||||
"integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
|
||||
"dev": true
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
|
||||
"integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q=="
|
||||
},
|
||||
"@nodelib/fs.walk": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
|
||||
"integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
|
||||
"dev": true,
|
||||
"version": "1.2.6",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
|
||||
"integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
|
||||
"requires": {
|
||||
"@nodelib/fs.scandir": "2.1.3",
|
||||
"@nodelib/fs.scandir": "2.1.4",
|
||||
"fastq": "^1.6.0"
|
||||
}
|
||||
},
|
||||
|
|
@ -4417,10 +4414,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"fast-glob": {
|
||||
"version": "3.2.4",
|
||||
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
|
||||
"integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
|
||||
"dev": true,
|
||||
"version": "3.2.5",
|
||||
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
|
||||
"integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
|
||||
"requires": {
|
||||
"@nodelib/fs.stat": "^2.0.2",
|
||||
"@nodelib/fs.walk": "^1.2.3",
|
||||
|
|
@ -4434,7 +4430,6 @@
|
|||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fill-range": "^7.0.1"
|
||||
}
|
||||
|
|
@ -4443,7 +4438,6 @@
|
|||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
}
|
||||
|
|
@ -4451,14 +4445,12 @@
|
|||
"is-number": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
||||
"dev": true
|
||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
|
||||
},
|
||||
"micromatch": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
|
||||
"integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"braces": "^3.0.1",
|
||||
"picomatch": "^2.0.5"
|
||||
|
|
@ -4468,7 +4460,6 @@
|
|||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
||||
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-number": "^7.0.0"
|
||||
}
|
||||
|
|
@ -4488,10 +4479,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"fastq": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
|
||||
"integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
|
||||
"dev": true,
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz",
|
||||
"integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==",
|
||||
"requires": {
|
||||
"reusify": "^1.0.4"
|
||||
}
|
||||
|
|
@ -4696,7 +4686,6 @@
|
|||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
|
||||
"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-glob": "^4.0.1"
|
||||
}
|
||||
|
|
@ -5101,8 +5090,7 @@
|
|||
"is-extglob": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
||||
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
|
||||
"dev": true
|
||||
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
|
||||
},
|
||||
"is-generator-fn": {
|
||||
"version": "2.1.0",
|
||||
|
|
@ -5114,7 +5102,6 @@
|
|||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
|
||||
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-extglob": "^2.1.1"
|
||||
}
|
||||
|
|
@ -8813,8 +8800,7 @@
|
|||
"merge2": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
||||
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
|
||||
},
|
||||
"micromatch": {
|
||||
"version": "3.1.10",
|
||||
|
|
@ -9308,8 +9294,7 @@
|
|||
"picomatch": {
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
|
||||
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
|
||||
},
|
||||
"pify": {
|
||||
"version": "2.3.0",
|
||||
|
|
@ -9708,8 +9693,7 @@
|
|||
"reusify": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
|
||||
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
|
||||
"dev": true
|
||||
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
|
||||
},
|
||||
"rimraf": {
|
||||
"version": "3.0.2",
|
||||
|
|
@ -9727,10 +9711,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"run-parallel": {
|
||||
"version": "1.1.9",
|
||||
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
|
||||
"integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
|
||||
"dev": true
|
||||
"version": "1.1.10",
|
||||
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
|
||||
"integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw=="
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
"@actions/core": "^1.2.6",
|
||||
"@actions/exec": "^1.0.4",
|
||||
"@actions/github": "^4.0.0",
|
||||
"fast-glob": "^3.2.5",
|
||||
"xml2js": "^0.4.23"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue