diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 37ed630..eefb0da 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -3,7 +3,7 @@ name: Bug report
about: Create a report to help us improve
title: ''
labels: 'bug'
-assignees: 'dorny,dharmendrasha,j-catania'
+assignees: 'dorny,dharmendrasha'
---
## Describe the bug
diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md
index d8b8558..2d6adcd 100644
--- a/.github/ISSUE_TEMPLATE/feature.md
+++ b/.github/ISSUE_TEMPLATE/feature.md
@@ -3,7 +3,7 @@ name: Feature Request
about: Suggest a feature
title: ''
labels: 'enhancement'
-assignees: 'dorny,dharmendrasha,j-catania'
+assignees: 'dorny,dharmendrasha'
---
## Describe
diff --git a/.github/workflows/check-dist.yml b/.github/workflows/check-dist.yml
index 5f4b9d2..c994dfa 100644
--- a/.github/workflows/check-dist.yml
+++ b/.github/workflows/check-dist.yml
@@ -21,10 +21,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Set Node.js
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
@@ -46,7 +46,7 @@ jobs:
id: diff
# If index.js was different than expected, upload the expected version as an artifact
- - uses: actions/upload-artifact@v3
+ - uses: actions/upload-artifact@v5
if: ${{ failure() && steps.diff.conclusion == 'failure' }}
with:
name: dist
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 545b4e3..aeec96d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -13,8 +13,8 @@ jobs:
name: Build & Test
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-node@v4
+ - uses: actions/checkout@v6
+ - uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
- run: npm ci
@@ -24,8 +24,8 @@ jobs:
- run: npm test
- name: Upload test results
- if: success() || failure()
- uses: actions/upload-artifact@v3
+ if: ${{ !cancelled() }}
+ uses: actions/upload-artifact@v5
with:
name: test-results
path: __tests__/__results__/*.xml
diff --git a/.github/workflows/manual-run.yml b/.github/workflows/manual-run.yml
index f8b1ee0..c1875a9 100644
--- a/.github/workflows/manual-run.yml
+++ b/.github/workflows/manual-run.yml
@@ -8,14 +8,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- run: npm ci
- run: npm run build
- run: npm test
- name: Create test report
uses: ./
- if: success() || failure()
+ if: ${{ !cancelled() }}
with:
name: JEST Tests
path: __tests__/__results__/*.xml
diff --git a/.github/workflows/test-report.yml b/.github/workflows/test-report.yml
index e3f9555..11b266a 100644
--- a/.github/workflows/test-report.yml
+++ b/.github/workflows/test-report.yml
@@ -11,7 +11,7 @@ jobs:
name: Workflow test
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- uses: ./
with:
artifact: test-results
diff --git a/.markdownlint.json b/.markdownlint.json
new file mode 100644
index 0000000..3f71d87
--- /dev/null
+++ b/.markdownlint.json
@@ -0,0 +1,13 @@
+{
+ "blanks-around-headings": false,
+ "blanks-around-lists": false,
+ "blanks-around-tables": false,
+ "blanks-around-fences": false,
+ "no-bare-urls": false,
+ "line-length": false,
+ "ul-style": false,
+ "no-inline-html": false,
+ "no-multiple-blanks": {
+ "maximum": 3
+ }
+}
diff --git a/.nvmrc b/.nvmrc
index eb800ed..9a2a0e2 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-v18.19.0
+v20
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bd75192..b0badd5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,50 @@
# Changelog
+## 2.3.0
+* Feature: Add Python support with `python-xunit` reporter (pytest) https://github.com/dorny/test-reporter/pull/643
+* Feature: Add pytest traceback parsing and `directory-mapping` option https://github.com/dorny/test-reporter/pull/238
+* Performance: Update sax.js to fix large XML file parsing https://github.com/dorny/test-reporter/pull/681
+* Documentation: Complete documentation for all supported reporters https://github.com/dorny/test-reporter/pull/691
+* Security: Bump js-yaml and mocha in /reports/mocha (fixes prototype pollution) https://github.com/dorny/test-reporter/pull/682
+
+## 2.2.0
+* Feature: Add collapsed option to control report summary visibility https://github.com/dorny/test-reporter/pull/664
+* Fix badge encoding for values including underscore and hyphens https://github.com/dorny/test-reporter/pull/672
+* Fix missing `report-title` attribute in action definition https://github.com/dorny/test-reporter/pull/637
+* Refactor variable names to fix shadowing issues https://github.com/dorny/test-reporter/pull/630
+
+## 2.1.1
+* Fix error when a TestMethod element does not have a className attribute in a trx file https://github.com/dorny/test-reporter/pull/623
+* Add stack trace from trx to summary https://github.com/dorny/test-reporter/pull/615
+* List only failed tests https://github.com/dorny/test-reporter/pull/606
+* Add type definitions to `github-utils.ts` https://github.com/dorny/test-reporter/pull/604
+* Avoid split on undefined https://github.com/dorny/test-reporter/pull/258
+* Return links to summary report https://github.com/dorny/test-reporter/pull/588
+* Add step summary short summary https://github.com/dorny/test-reporter/pull/589
+* Fix for empty TRX TestDefinitions https://github.com/dorny/test-reporter/pull/582
+* Increase step summary limit to 1MiB https://github.com/dorny/test-reporter/pull/581
+* Fix input description for list options https://github.com/dorny/test-reporter/pull/572
+
+## 2.1.0
+* Feature: Add summary title https://github.com/dorny/test-reporter/pull/568
+* Feature: Add Golang test parser https://github.com/dorny/test-reporter/pull/571
+* Increase step summary limit to 1MiB https://github.com/dorny/test-reporter/pull/581
+* Fix for empty TRX TestDefinitions https://github.com/dorny/test-reporter/pull/582
+* Fix input description for list options https://github.com/dorny/test-reporter/pull/572
+* Update npm packages https://github.com/dorny/test-reporter/pull/583
+
+## 2.0.0
+* Parse JUnit report with detailed message in failure https://github.com/dorny/test-reporter/pull/559
+* Support displaying test results in markdown using GitHub Actions Job Summaries https://github.com/dorny/test-reporter/pull/383
+
+## 1.9.1
+* Fix problematic retransmission of authentication token https://github.com/dorny/test-reporter/pull/438
+* Report correct number of tests in Dart https://github.com/dorny/test-reporter/pull/426
+* Number of completed tests mismatches passed/failed https://github.com/dorny/test-reporter/issues/319
+
+## 1.9.0
+* Add support for Rspec (Ruby) https://github.com/dorny/test-reporter/pull/398
+
## 1.8.0
* Add `SwiftXunitParser` class based on `JavaJunitParser` for `swift-xunit` reporter https://github.com/dorny/test-reporter/pull/317
* Use NodeJS 18 LTS as default runtime https://github.com/dorny/test-reporter/pull/332
diff --git a/README.md b/README.md
index e98cc2d..d900926 100644
--- a/README.md
+++ b/README.md
@@ -2,22 +2,25 @@
This [Github Action](https://github.com/features/actions) displays test results from popular testing frameworks directly in GitHub.
-✔️ Parses test results in XML or JSON format and creates nice report as Github Check Run
+✔️ Parses test results in XML or JSON format and creates nice report as GitHub Check Run or GitHub Actions job summaries
✔️ Annotates code where it failed based on message and stack trace captured during test execution
✔️ Provides final `conclusion` and counts of `passed`, `failed` and `skipped` tests as output parameters
**How it looks:**
-|||||
+|||||
|:--:|:--:|:--:|:--:|
**Supported languages / frameworks:**
-- .NET / [xUnit](https://xunit.net/) / [NUnit](https://nunit.org/) / [MSTest](https://github.com/Microsoft/testfx-docs)
+- .NET / [dotnet test](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#examples) ( [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)
+- Go / [go test](https://pkg.go.dev/testing)
- Java / [JUnit](https://junit.org/)
- JavaScript / [JEST](https://jestjs.io/) / [Mocha](https://mochajs.org/)
+- Python / [pytest](https://docs.pytest.org/en/stable/) / [unittest](https://docs.python.org/3/library/unittest.html)
+- Ruby / [RSpec](https://rspec.info/)
- Swift / xUnit
For more information see [Supported formats](#supported-formats) section.
@@ -43,13 +46,13 @@ jobs:
name: Build & Test
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3 # checkout the repo
+ - uses: actions/checkout@v4 # 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: success() || failure() # run this step even if previous step failed
+ uses: dorny/test-reporter@v2
+ if: ${{ !cancelled() }} # 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 results
@@ -74,11 +77,11 @@ jobs:
build-test:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3 # checkout the repo
+ - uses: actions/checkout@v4 # checkout the repo
- run: npm ci # install packages
- run: npm test # run tests (configured to use jest-junit reporter)
- - uses: actions/upload-artifact@v3 # upload test results
- if: success() || failure() # run this step even if previous step failed
+ - uses: actions/upload-artifact@v4 # upload test results
+ if: ${{ !cancelled() }} # run this step even if previous step failed
with:
name: test-results
path: jest-junit.xml
@@ -99,7 +102,7 @@ jobs:
report:
runs-on: ubuntu-latest
steps:
- - uses: dorny/test-reporter@v1
+ - uses: dorny/test-reporter@v2
with:
artifact: test-results # artifact name
name: JEST Tests # Name of the check run which will be created
@@ -110,7 +113,7 @@ jobs:
## Usage
```yaml
-- uses: dorny/test-reporter@v1
+- uses: dorny/test-reporter@v2
with:
# Name or regex of artifact containing test results
@@ -137,12 +140,16 @@ jobs:
# Format of test results. Supported options:
# dart-json
+ # dotnet-nunit
# dotnet-trx
# flutter-json
+ # golang-json
# java-junit
# jest-junit
# mocha-json
+ # python-xunit
# rspec-json
+ # swift-xunit
reporter: ''
# Allows you to generate only the summary.
@@ -150,9 +157,23 @@ jobs:
# Detailed listing of test suites and test cases will be skipped.
only-summary: 'false'
+ # Allows you to generate reports for Actions Summary
+ # https://github.blog/2022-05-09-supercharging-github-actions-with-job-summaries/
+ use-actions-summary: 'true'
+
+ # Optionally specify a title (Heading level 1) for the report. Leading and trailing whitespace are ignored.
+ # This is useful for separating your test report from other sections in the build summary.
+ # If omitted or set to whitespace/empty, no title will be printed.
+ report-title: ''
+
+ # Customize the title of badges shown for each Actions Summary.
+ # Useful when distinguish summaries for tests ran in multiple Actions steps.
+ badge-title: 'tests'
+
# Limits which test suites are listed:
# all
# failed
+ # none
list-suites: 'all'
# Limits which test cases are listed:
@@ -236,6 +257,20 @@ Supported testing frameworks:
For more information see [dotnet test](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#examples)
+
+ dotnet-nunit
+
+Test execution must be configured to generate [NUnit3](https://docs.nunit.org/articles/nunit/technical-notes/usage/Test-Result-XML-Format.html) XML test results.
+Install the [NUnit3TestAdapter](https://www.nuget.org/packages/NUnit3TestAdapter) package (required; it registers the `nunit` logger for `dotnet test`), then run tests with:
+
+`dotnet test --logger "nunit;LogFileName=test-results.xml"`
+
+Supported testing frameworks:
+- [NUnit](https://nunit.org/)
+
+For more information see [dotnet test](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#examples)
+
+
flutter-json
@@ -263,6 +298,13 @@ For more information see:
+
+ golang-json
+
+You must use the `-json` flag and output the results to a file (ex: `go test -json > testresults.json`)
+
+
+
java-junit (Experimental)
@@ -307,16 +349,57 @@ Configuration of `uniqueOutputName`, `suiteNameTemplate`, `classNameTemplate`, `
- Mocha version [v7.2.0](https://github.com/mochajs/mocha/releases/tag/v7.2.0) or higher
- Usage of [json](https://mochajs.org/#json) reporter.
-You can use the following example configuration in `package.json`:
+For Mocha >= [v9.1.0](https://github.com/mochajs/mocha/releases/tag/v9.1.0), you can use the following example configuration in `package.json`:
+```json
+"scripts": {
+ "test": "mocha --reporter json --reporter-option output=test-results.json"
+}
+```
+
+For Mocha < v9.1, the command should look like this:
```json
"scripts": {
"test": "mocha --reporter json > test-results.json"
}
```
+Additionally, test processing might fail if any of your tests write anything on standard output.
+Before version [v9.1.0](https://github.com/mochajs/mocha/releases/tag/v9.1.0), Mocha doesn't have the option to store `json` output directly to the file, and we have to rely on redirecting its standard output ([mocha#4607](https://github.com/mochajs/mocha/pull/4607)).
+Please update Mocha to version [v9.1.0](https://github.com/mochajs/mocha/releases/tag/v9.1.0) or above if you encounter this issue.
+
-Test processing might fail if any of your tests write anything on standard output.
-Mocha, unfortunately, doesn't have the option to store `json` output directly to the file, and we have to rely on redirecting its standard output.
-There is a work in progress to fix it: [mocha#4607](https://github.com/mochajs/mocha/pull/4607)
+
+ python-xunit (Experimental)
+
+Support for Python test results in xUnit format is experimental - should work but it was not extensively tested.
+
+For **pytest** support, configure [JUnit XML output](https://docs.pytest.org/en/stable/how-to/output.html#creating-junitxml-format-files) and run with the `--junit-xml` option, which also lets you specify the output path for test results.
+
+```shell
+pytest --junit-xml=test-report.xml
+```
+
+For **unittest** support, use a test runner that outputs the JUnit report format, such as [unittest-xml-reporting](https://pypi.org/project/unittest-xml-reporting/).
+
+
+
+ rspec-json
+
+[RSpec](https://rspec.info/) testing framework support requires the usage of JSON formatter.
+You can configure RSpec to output JSON format by using the `--format json` option and redirecting to a file:
+
+```shell
+rspec --format json --out rspec-results.json
+```
+
+Or configure it in `.rspec` file:
+```
+--format json
+--out rspec-results.json
+```
+
+For more information see:
+- [RSpec documentation](https://rspec.info/)
+- [RSpec Formatters](https://relishapp.com/rspec/rspec-core/docs/formatters)
@@ -329,9 +412,9 @@ 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. Check Run summary) is markdown text. No custom styling or HTML is possible.
+- 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.
-- Test report can't reference any additional files (e.g. screenshots). You can use `actions/upload-artifact@v3` to upload them and inspect them manually.
+- 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.
For more information, see [#67](https://github.com/dorny/test-reporter/issues/67).
diff --git a/__tests__/__outputs__/dart-json.md b/__tests__/__outputs__/dart-json.md
index 6fec70c..2b7ec09 100644
--- a/__tests__/__outputs__/dart-json.md
+++ b/__tests__/__outputs__/dart-json.md
@@ -1,11 +1,14 @@

-## ❌ fixtures/dart-json.json
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/dart-json.json](#user-content-r0)|1 ✅|4 ❌|1 ⚪|4s|
+## ❌ fixtures/dart-json.json
**6** tests were completed in **4s** with **1** passed, **4** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[test/main_test.dart](#r0s0)|1✅|3❌||74ms|
-|[test/second_test.dart](#r0s1)||1❌|1⚪|51ms|
-### ❌ test/main_test.dart
+|[test/main_test.dart](#user-content-r0s0)|1 ✅|3 ❌||74ms|
+|[test/second_test.dart](#user-content-r0s1)||1 ❌|1 ⚪|51ms|
+### ❌ test/main_test.dart
```
Test 1
✅ Passing test
@@ -20,7 +23,7 @@ Test 2
❌ Exception in test
Exception: Some error
```
-### ❌ test/second_test.dart
+### ❌ test/second_test.dart
```
❌ Timeout test
TimeoutException after 0:00:00.000001: Test timed out after 0 seconds.
diff --git a/__tests__/__outputs__/dotnet-nunit.md b/__tests__/__outputs__/dotnet-nunit.md
new file mode 100644
index 0000000..a0985f5
--- /dev/null
+++ b/__tests__/__outputs__/dotnet-nunit.md
@@ -0,0 +1,31 @@
+
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/dotnet-nunit.xml](#user-content-r0)|3 ✅|5 ❌|1 ⚪|230ms|
+## ❌ fixtures/dotnet-nunit.xml
+**9** tests were completed in **230ms** with **3** passed, **5** failed and **1** skipped.
+|Test suite|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[DotnetTests.NUnitV3Tests.dll.DotnetTests.XUnitTests](#user-content-r0s0)|3 ✅|5 ❌|1 ⚪|69ms|
+### ❌ DotnetTests.NUnitV3Tests.dll.DotnetTests.XUnitTests
+```
+CalculatorTests
+ ✅ Is_Even_Number(2)
+ ❌ Is_Even_Number(3)
+ Expected: True
+ But was: False
+
+ ❌ Exception_In_TargetTest
+ System.DivideByZeroException : Attempted to divide by zero.
+ ❌ Exception_In_Test
+ System.Exception : Test
+ ❌ Failing_Test
+ Expected: 3
+ But was: 2
+
+ ✅ Passing_Test
+ ✅ Passing_Test_With_Description
+ ⚪ Skipped_Test
+ ❌ Timeout_Test
+
+```
\ No newline at end of file
diff --git a/__tests__/__outputs__/dotnet-trx-only-failed.md b/__tests__/__outputs__/dotnet-trx-only-failed.md
new file mode 100644
index 0000000..5eeaec5
--- /dev/null
+++ b/__tests__/__outputs__/dotnet-trx-only-failed.md
@@ -0,0 +1,34 @@
+
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/dotnet-trx.trx](#user-content-r0)|5 ✅|5 ❌|1 ⚪|1s|
+## ❌ fixtures/dotnet-trx.trx
+**11** tests were completed in **1s** with **5** passed, **5** failed and **1** skipped.
+|Test suite|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[DotnetTests.XUnitTests.CalculatorTests](#user-content-r0s0)|5 ✅|5 ❌|1 ⚪|118ms|
+### ❌ DotnetTests.XUnitTests.CalculatorTests
+```
+❌ Exception_In_TargetTest
+ System.DivideByZeroException : Attempted to divide by zero.
+ at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.Unit\Calculator.cs:line 9
+ at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 33
+❌ Exception_In_Test
+ System.Exception : Test
+ at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 39
+❌ Failing_Test
+ Assert.Equal() Failure
+ Expected: 3
+ Actual: 2
+ at DotnetTests.XUnitTests.CalculatorTests.Failing_Test() in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 27
+❌ Is_Even_Number(i: 3)
+ Assert.True() Failure
+ Expected: True
+ Actual: False
+ at DotnetTests.XUnitTests.CalculatorTests.Is_Even_Number(Int32 i) in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 59
+❌ Should be even number(i: 3)
+ Assert.True() Failure
+ Expected: True
+ Actual: False
+ at DotnetTests.XUnitTests.CalculatorTests.Theory_With_Custom_Name(Int32 i) in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 67
+```
\ No newline at end of file
diff --git a/__tests__/__outputs__/dotnet-trx.md b/__tests__/__outputs__/dotnet-trx.md
index 0fc9f7b..40bcaf2 100644
--- a/__tests__/__outputs__/dotnet-trx.md
+++ b/__tests__/__outputs__/dotnet-trx.md
@@ -1,31 +1,40 @@

-## ❌ fixtures/dotnet-trx.trx
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/dotnet-trx.trx](#user-content-r0)|5 ✅|5 ❌|1 ⚪|1s|
+## ❌ fixtures/dotnet-trx.trx
**11** tests were completed in **1s** with **5** passed, **5** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[DotnetTests.XUnitTests.CalculatorTests](#r0s0)|5✅|5❌|1⚪|118ms|
-### ❌ DotnetTests.XUnitTests.CalculatorTests
+|[DotnetTests.XUnitTests.CalculatorTests](#user-content-r0s0)|5 ✅|5 ❌|1 ⚪|118ms|
+### ❌ DotnetTests.XUnitTests.CalculatorTests
```
✅ Custom Name
❌ Exception_In_TargetTest
System.DivideByZeroException : Attempted to divide by zero.
+ at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.Unit\Calculator.cs:line 9
+ at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 33
❌ Exception_In_Test
System.Exception : Test
+ at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 39
❌ Failing_Test
Assert.Equal() Failure
Expected: 3
Actual: 2
+ at DotnetTests.XUnitTests.CalculatorTests.Failing_Test() in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 27
✅ Is_Even_Number(i: 2)
❌ Is_Even_Number(i: 3)
Assert.True() Failure
Expected: True
Actual: False
+ at DotnetTests.XUnitTests.CalculatorTests.Is_Even_Number(Int32 i) in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 59
✅ Passing_Test
✅ Should be even number(i: 2)
❌ Should be even number(i: 3)
Assert.True() Failure
Expected: True
Actual: False
+ at DotnetTests.XUnitTests.CalculatorTests.Theory_With_Custom_Name(Int32 i) in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 67
⚪ Skipped_Test
✅ Timeout_Test
```
\ No newline at end of file
diff --git a/__tests__/__outputs__/dotnet-xunitv3.md b/__tests__/__outputs__/dotnet-xunitv3.md
new file mode 100644
index 0000000..f27f9e2
--- /dev/null
+++ b/__tests__/__outputs__/dotnet-xunitv3.md
@@ -0,0 +1,26 @@
+
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/dotnet-xunitv3.trx](#user-content-r0)|1 ✅|3 ❌||267ms|
+## ❌ fixtures/dotnet-xunitv3.trx
+**4** tests were completed in **267ms** with **1** passed, **3** failed and **0** skipped.
+|Test suite|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[DotnetTests.XUnitV3Tests.FixtureTests](#user-content-r0s0)|1 ✅|1 ❌||18ms|
+|[Unclassified](#user-content-r0s1)||2 ❌||0ms|
+### ❌ DotnetTests.XUnitV3Tests.FixtureTests
+```
+❌ Failing_Test
+ Assert.Null() Failure: Value is not null
+ Expected: null
+ Actual: Fixture { }
+ at DotnetTests.XUnitV3Tests.FixtureTests.Failing_Test() in /_/reports/dotnet/DotnetTests.XUnitV3Tests/FixtureTests.cs:line 25
+ at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
+ at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
+✅ Passing_Test
+```
+### ❌ Unclassified
+```
+❌ [Test Class Cleanup Failure (DotnetTests.XUnitV3Tests.FixtureTests.Failing_Test)]
+❌ [Test Class Cleanup Failure (DotnetTests.XUnitV3Tests.FixtureTests.Passing_Test)]
+```
\ No newline at end of file
diff --git a/__tests__/__outputs__/fluent-validation-test-results.md b/__tests__/__outputs__/fluent-validation-test-results.md
index 59a056c..83d0503 100644
--- a/__tests__/__outputs__/fluent-validation-test-results.md
+++ b/__tests__/__outputs__/fluent-validation-test-results.md
@@ -1,71 +1,76 @@

-## ✅ fixtures/external/FluentValidation.Tests.trx
+Expand for details
+
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/external/FluentValidation.Tests.trx](#user-content-r0)|803 ✅||1 ⚪|4s|
+## ✅ fixtures/external/FluentValidation.Tests.trx
**804** tests were completed in **4s** with **803** passed, **0** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[FluentValidation.Tests.AbstractValidatorTester](#r0s0)|35✅|||12ms|
-|[FluentValidation.Tests.AccessorCacheTests](#r0s1)|4✅||1⚪|4ms|
-|[FluentValidation.Tests.AssemblyScannerTester](#r0s2)|2✅|||2ms|
-|[FluentValidation.Tests.CascadingFailuresTester](#r0s3)|38✅|||23ms|
-|[FluentValidation.Tests.ChainedValidationTester](#r0s4)|13✅|||6ms|
-|[FluentValidation.Tests.ChainingValidatorsTester](#r0s5)|3✅|||1ms|
-|[FluentValidation.Tests.ChildRulesTests](#r0s6)|2✅|||7ms|
-|[FluentValidation.Tests.CollectionValidatorWithParentTests](#r0s7)|16✅|||13ms|
-|[FluentValidation.Tests.ComplexValidationTester](#r0s8)|17✅|||26ms|
-|[FluentValidation.Tests.ConditionTests](#r0s9)|18✅|||9ms|
-|[FluentValidation.Tests.CreditCardValidatorTests](#r0s10)|2✅|||2ms|
-|[FluentValidation.Tests.CustomFailureActionTester](#r0s11)|3✅|||1ms|
-|[FluentValidation.Tests.CustomMessageFormatTester](#r0s12)|6✅|||3ms|
-|[FluentValidation.Tests.CustomValidatorTester](#r0s13)|10✅|||6ms|
-|[FluentValidation.Tests.DefaultValidatorExtensionTester](#r0s14)|30✅|||38ms|
-|[FluentValidation.Tests.EmailValidatorTests](#r0s15)|36✅|||18ms|
-|[FluentValidation.Tests.EmptyTester](#r0s16)|9✅|||5ms|
-|[FluentValidation.Tests.EnumValidatorTests](#r0s17)|12✅|||24ms|
-|[FluentValidation.Tests.EqualValidatorTests](#r0s18)|10✅|||3ms|
-|[FluentValidation.Tests.ExactLengthValidatorTester](#r0s19)|6✅|||2ms|
-|[FluentValidation.Tests.ExclusiveBetweenValidatorTests](#r0s20)|19✅|||6ms|
-|[FluentValidation.Tests.ExtensionTester](#r0s21)|4✅|||1ms|
-|[FluentValidation.Tests.ForEachRuleTests](#r0s22)|34✅|||47ms|
-|[FluentValidation.Tests.GreaterThanOrEqualToValidatorTester](#r0s23)|14✅|||5ms|
-|[FluentValidation.Tests.GreaterThanValidatorTester](#r0s24)|13✅|||4ms|
-|[FluentValidation.Tests.InclusiveBetweenValidatorTests](#r0s25)|18✅|||4ms|
-|[FluentValidation.Tests.InheritanceValidatorTest](#r0s26)|11✅|||18ms|
-|[FluentValidation.Tests.InlineValidatorTester](#r0s27)|1✅|||2ms|
-|[FluentValidation.Tests.LanguageManagerTests](#r0s28)|21✅|||28ms|
-|[FluentValidation.Tests.LengthValidatorTests](#r0s29)|16✅|||17ms|
-|[FluentValidation.Tests.LessThanOrEqualToValidatorTester](#r0s30)|13✅|||4ms|
-|[FluentValidation.Tests.LessThanValidatorTester](#r0s31)|16✅|||6ms|
-|[FluentValidation.Tests.LocalisedMessagesTester](#r0s32)|6✅|||3ms|
-|[FluentValidation.Tests.LocalisedNameTester](#r0s33)|2✅|||1ms|
-|[FluentValidation.Tests.MemberAccessorTests](#r0s34)|9✅|||5ms|
-|[FluentValidation.Tests.MessageFormatterTests](#r0s35)|10✅|||2ms|
-|[FluentValidation.Tests.ModelLevelValidatorTests](#r0s36)|2✅|||1ms|
-|[FluentValidation.Tests.NameResolutionPluggabilityTester](#r0s37)|3✅|||2ms|
-|[FluentValidation.Tests.NotEmptyTester](#r0s38)|10✅|||7ms|
-|[FluentValidation.Tests.NotEqualValidatorTests](#r0s39)|11✅|||7ms|
-|[FluentValidation.Tests.NotNullTester](#r0s40)|5✅|||1ms|
-|[FluentValidation.Tests.NullTester](#r0s41)|5✅|||2ms|
-|[FluentValidation.Tests.OnFailureTests](#r0s42)|10✅|||8ms|
-|[FluentValidation.Tests.PredicateValidatorTester](#r0s43)|5✅|||2ms|
-|[FluentValidation.Tests.PropertyChainTests](#r0s44)|7✅|||1ms|
-|[FluentValidation.Tests.RegularExpressionValidatorTests](#r0s45)|15✅|||6ms|
-|[FluentValidation.Tests.RuleBuilderTests](#r0s46)|29✅|||96ms|
-|[FluentValidation.Tests.RuleDependencyTests](#r0s47)|14✅|||3s|
-|[FluentValidation.Tests.RulesetTests](#r0s48)|21✅|||14ms|
-|[FluentValidation.Tests.ScalePrecisionValidatorTests](#r0s49)|6✅|||4ms|
-|[FluentValidation.Tests.SharedConditionTests](#r0s50)|42✅|||42ms|
-|[FluentValidation.Tests.StandalonePropertyValidationTester](#r0s51)|1✅|||0ms|
-|[FluentValidation.Tests.StringEnumValidatorTests](#r0s52)|10✅|||5ms|
-|[FluentValidation.Tests.TrackingCollectionTests](#r0s53)|3✅|||2ms|
-|[FluentValidation.Tests.TransformTests](#r0s54)|4✅|||3ms|
-|[FluentValidation.Tests.UserSeverityTester](#r0s55)|7✅|||3ms|
-|[FluentValidation.Tests.UserStateTester](#r0s56)|4✅|||3ms|
-|[FluentValidation.Tests.ValidateAndThrowTester](#r0s57)|14✅|||25ms|
-|[FluentValidation.Tests.ValidationResultTests](#r0s58)|8✅|||8ms|
-|[FluentValidation.Tests.ValidatorDescriptorTester](#r0s59)|5✅|||1ms|
-|[FluentValidation.Tests.ValidatorSelectorTests](#r0s60)|10✅|||9ms|
-|[FluentValidation.Tests.ValidatorTesterTester](#r0s61)|73✅|||74ms|
-### ✅ FluentValidation.Tests.AbstractValidatorTester
+|[FluentValidation.Tests.AbstractValidatorTester](#user-content-r0s0)|35 ✅|||12ms|
+|[FluentValidation.Tests.AccessorCacheTests](#user-content-r0s1)|4 ✅||1 ⚪|4ms|
+|[FluentValidation.Tests.AssemblyScannerTester](#user-content-r0s2)|2 ✅|||2ms|
+|[FluentValidation.Tests.CascadingFailuresTester](#user-content-r0s3)|38 ✅|||23ms|
+|[FluentValidation.Tests.ChainedValidationTester](#user-content-r0s4)|13 ✅|||6ms|
+|[FluentValidation.Tests.ChainingValidatorsTester](#user-content-r0s5)|3 ✅|||1ms|
+|[FluentValidation.Tests.ChildRulesTests](#user-content-r0s6)|2 ✅|||7ms|
+|[FluentValidation.Tests.CollectionValidatorWithParentTests](#user-content-r0s7)|16 ✅|||13ms|
+|[FluentValidation.Tests.ComplexValidationTester](#user-content-r0s8)|17 ✅|||26ms|
+|[FluentValidation.Tests.ConditionTests](#user-content-r0s9)|18 ✅|||9ms|
+|[FluentValidation.Tests.CreditCardValidatorTests](#user-content-r0s10)|2 ✅|||2ms|
+|[FluentValidation.Tests.CustomFailureActionTester](#user-content-r0s11)|3 ✅|||1ms|
+|[FluentValidation.Tests.CustomMessageFormatTester](#user-content-r0s12)|6 ✅|||3ms|
+|[FluentValidation.Tests.CustomValidatorTester](#user-content-r0s13)|10 ✅|||6ms|
+|[FluentValidation.Tests.DefaultValidatorExtensionTester](#user-content-r0s14)|30 ✅|||38ms|
+|[FluentValidation.Tests.EmailValidatorTests](#user-content-r0s15)|36 ✅|||18ms|
+|[FluentValidation.Tests.EmptyTester](#user-content-r0s16)|9 ✅|||5ms|
+|[FluentValidation.Tests.EnumValidatorTests](#user-content-r0s17)|12 ✅|||24ms|
+|[FluentValidation.Tests.EqualValidatorTests](#user-content-r0s18)|10 ✅|||3ms|
+|[FluentValidation.Tests.ExactLengthValidatorTester](#user-content-r0s19)|6 ✅|||2ms|
+|[FluentValidation.Tests.ExclusiveBetweenValidatorTests](#user-content-r0s20)|19 ✅|||6ms|
+|[FluentValidation.Tests.ExtensionTester](#user-content-r0s21)|4 ✅|||1ms|
+|[FluentValidation.Tests.ForEachRuleTests](#user-content-r0s22)|34 ✅|||47ms|
+|[FluentValidation.Tests.GreaterThanOrEqualToValidatorTester](#user-content-r0s23)|14 ✅|||5ms|
+|[FluentValidation.Tests.GreaterThanValidatorTester](#user-content-r0s24)|13 ✅|||4ms|
+|[FluentValidation.Tests.InclusiveBetweenValidatorTests](#user-content-r0s25)|18 ✅|||4ms|
+|[FluentValidation.Tests.InheritanceValidatorTest](#user-content-r0s26)|11 ✅|||18ms|
+|[FluentValidation.Tests.InlineValidatorTester](#user-content-r0s27)|1 ✅|||2ms|
+|[FluentValidation.Tests.LanguageManagerTests](#user-content-r0s28)|21 ✅|||28ms|
+|[FluentValidation.Tests.LengthValidatorTests](#user-content-r0s29)|16 ✅|||17ms|
+|[FluentValidation.Tests.LessThanOrEqualToValidatorTester](#user-content-r0s30)|13 ✅|||4ms|
+|[FluentValidation.Tests.LessThanValidatorTester](#user-content-r0s31)|16 ✅|||6ms|
+|[FluentValidation.Tests.LocalisedMessagesTester](#user-content-r0s32)|6 ✅|||3ms|
+|[FluentValidation.Tests.LocalisedNameTester](#user-content-r0s33)|2 ✅|||1ms|
+|[FluentValidation.Tests.MemberAccessorTests](#user-content-r0s34)|9 ✅|||5ms|
+|[FluentValidation.Tests.MessageFormatterTests](#user-content-r0s35)|10 ✅|||2ms|
+|[FluentValidation.Tests.ModelLevelValidatorTests](#user-content-r0s36)|2 ✅|||1ms|
+|[FluentValidation.Tests.NameResolutionPluggabilityTester](#user-content-r0s37)|3 ✅|||2ms|
+|[FluentValidation.Tests.NotEmptyTester](#user-content-r0s38)|10 ✅|||7ms|
+|[FluentValidation.Tests.NotEqualValidatorTests](#user-content-r0s39)|11 ✅|||7ms|
+|[FluentValidation.Tests.NotNullTester](#user-content-r0s40)|5 ✅|||1ms|
+|[FluentValidation.Tests.NullTester](#user-content-r0s41)|5 ✅|||2ms|
+|[FluentValidation.Tests.OnFailureTests](#user-content-r0s42)|10 ✅|||8ms|
+|[FluentValidation.Tests.PredicateValidatorTester](#user-content-r0s43)|5 ✅|||2ms|
+|[FluentValidation.Tests.PropertyChainTests](#user-content-r0s44)|7 ✅|||1ms|
+|[FluentValidation.Tests.RegularExpressionValidatorTests](#user-content-r0s45)|15 ✅|||6ms|
+|[FluentValidation.Tests.RuleBuilderTests](#user-content-r0s46)|29 ✅|||96ms|
+|[FluentValidation.Tests.RuleDependencyTests](#user-content-r0s47)|14 ✅|||3s|
+|[FluentValidation.Tests.RulesetTests](#user-content-r0s48)|21 ✅|||14ms|
+|[FluentValidation.Tests.ScalePrecisionValidatorTests](#user-content-r0s49)|6 ✅|||4ms|
+|[FluentValidation.Tests.SharedConditionTests](#user-content-r0s50)|42 ✅|||42ms|
+|[FluentValidation.Tests.StandalonePropertyValidationTester](#user-content-r0s51)|1 ✅|||0ms|
+|[FluentValidation.Tests.StringEnumValidatorTests](#user-content-r0s52)|10 ✅|||5ms|
+|[FluentValidation.Tests.TrackingCollectionTests](#user-content-r0s53)|3 ✅|||2ms|
+|[FluentValidation.Tests.TransformTests](#user-content-r0s54)|4 ✅|||3ms|
+|[FluentValidation.Tests.UserSeverityTester](#user-content-r0s55)|7 ✅|||3ms|
+|[FluentValidation.Tests.UserStateTester](#user-content-r0s56)|4 ✅|||3ms|
+|[FluentValidation.Tests.ValidateAndThrowTester](#user-content-r0s57)|14 ✅|||25ms|
+|[FluentValidation.Tests.ValidationResultTests](#user-content-r0s58)|8 ✅|||8ms|
+|[FluentValidation.Tests.ValidatorDescriptorTester](#user-content-r0s59)|5 ✅|||1ms|
+|[FluentValidation.Tests.ValidatorSelectorTests](#user-content-r0s60)|10 ✅|||9ms|
+|[FluentValidation.Tests.ValidatorTesterTester](#user-content-r0s61)|73 ✅|||74ms|
+### ✅ FluentValidation.Tests.AbstractValidatorTester
```
✅ Can_replace_default_errorcode_resolver
✅ CanValidateInstancesOfType_returns_false_when_comparing_against_some_other_type
@@ -103,7 +108,7 @@
✅ WithName_should_override_field_name
✅ WithName_should_override_field_name_with_value_from_other_property
```
-### ✅ FluentValidation.Tests.AccessorCacheTests
+### ✅ FluentValidation.Tests.AccessorCacheTests
```
⚪ Benchmark
✅ Equality_comparison_check
@@ -111,12 +116,12 @@
✅ Gets_member_for_nested_property
✅ Identifies_if_memberexp_acts_on_model_instance
```
-### ✅ FluentValidation.Tests.AssemblyScannerTester
+### ✅ FluentValidation.Tests.AssemblyScannerTester
```
✅ Finds_validators_for_types
✅ ForEach_iterates_over_types
```
-### ✅ FluentValidation.Tests.CascadingFailuresTester
+### ✅ FluentValidation.Tests.CascadingFailuresTester
```
✅ Cascade_mode_can_be_set_after_validator_instantiated
✅ Cascade_mode_can_be_set_after_validator_instantiated_async
@@ -157,7 +162,7 @@
✅ Validation_stops_on_first_failure_when_set_to_StopOnFirstFailure_at_validator_level_async_legacy
✅ Validation_stops_on_first_failure_when_set_to_StopOnFirstFailure_at_validator_level_legacy
```
-### ✅ FluentValidation.Tests.ChainedValidationTester
+### ✅ FluentValidation.Tests.ChainedValidationTester
```
✅ Can_validate_using_validator_for_base_type
✅ Chained_property_should_be_excluded
@@ -173,18 +178,18 @@
✅ Uses_explicit_ruleset
✅ Validates_chained_property
```
-### ✅ FluentValidation.Tests.ChainingValidatorsTester
+### ✅ FluentValidation.Tests.ChainingValidatorsTester
```
✅ Options_should_only_apply_to_current_validator
✅ Should_create_multiple_validators
✅ Should_execute_multiple_validators
```
-### ✅ FluentValidation.Tests.ChildRulesTests
+### ✅ FluentValidation.Tests.ChildRulesTests
```
✅ Can_define_nested_rules_for_collection
✅ ChildRules_works_with_RuleSet
```
-### ✅ FluentValidation.Tests.CollectionValidatorWithParentTests
+### ✅ FluentValidation.Tests.CollectionValidatorWithParentTests
```
✅ Async_condition_should_work_with_child_collection
✅ Can_specify_condition_for_individual_collection_elements
@@ -203,7 +208,7 @@
✅ Validates_collection_several_levels_deep
✅ Validates_collection_several_levels_deep_async
```
-### ✅ FluentValidation.Tests.ComplexValidationTester
+### ✅ FluentValidation.Tests.ComplexValidationTester
```
✅ Async_condition_should_work_with_complex_property
✅ Async_condition_should_work_with_complex_property_when_validator_invoked_synchronously
@@ -223,7 +228,7 @@
✅ Validates_child_validator_synchronously
✅ Validates_complex_property
```
-### ✅ FluentValidation.Tests.ConditionTests
+### ✅ FluentValidation.Tests.ConditionTests
```
✅ Async_condition_executed_synchronosuly_with_asynchronous_collection_rule
✅ Async_condition_executed_synchronosuly_with_asynchronous_rule
@@ -244,18 +249,18 @@
✅ Validation_should_succeed_when_condition_does_not_match
✅ Validation_should_succeed_when_condition_matches
```
-### ✅ FluentValidation.Tests.CreditCardValidatorTests
+### ✅ FluentValidation.Tests.CreditCardValidatorTests
```
✅ IsValidTests
✅ When_validation_fails_the_default_error_should_be_set
```
-### ✅ FluentValidation.Tests.CustomFailureActionTester
+### ✅ FluentValidation.Tests.CustomFailureActionTester
```
✅ Does_not_invoke_action_if_validation_success
✅ Invokes_custom_action_on_failure
✅ Passes_object_being_validated_to_action
```
-### ✅ FluentValidation.Tests.CustomMessageFormatTester
+### ✅ FluentValidation.Tests.CustomMessageFormatTester
```
✅ Replaces_propertyvalue_placeholder
✅ Replaces_propertyvalue_with_empty_string_when_null
@@ -264,7 +269,7 @@
✅ Uses_custom_delegate_for_building_message_only_for_specific_validator
✅ Uses_property_value_in_message
```
-### ✅ FluentValidation.Tests.CustomValidatorTester
+### ✅ FluentValidation.Tests.CustomValidatorTester
```
✅ New_Custom_Returns_single_failure
✅ New_Custom_Returns_single_failure_async
@@ -277,7 +282,7 @@
✅ Runs_async_rule_synchronously_when_validator_invoked_synchronously
✅ Runs_sync_rule_asynchronously_when_validator_invoked_asynchronously
```
-### ✅ FluentValidation.Tests.DefaultValidatorExtensionTester
+### ✅ FluentValidation.Tests.DefaultValidatorExtensionTester
```
✅ Empty_should_create_EmptyValidator
✅ Equal_should_create_EqualValidator_with_explicit_value
@@ -310,7 +315,7 @@
✅ ScalePrecision_should_create_ScalePrecisionValidator
✅ ScalePrecision_should_create_ScalePrecisionValidator_with_ignore_trailing_zeros
```
-### ✅ FluentValidation.Tests.EmailValidatorTests
+### ✅ FluentValidation.Tests.EmailValidatorTests
```
✅ Fails_email_validation_aspnetcore_compatible(email: " \r \t \n")
✅ Fails_email_validation_aspnetcore_compatible(email: "")
@@ -349,7 +354,7 @@
✅ Valid_email_addresses_regex(email: "testperson+label@gmail.com")
✅ Valid_email_addresses_regex(email: null)
```
-### ✅ FluentValidation.Tests.EmptyTester
+### ✅ FluentValidation.Tests.EmptyTester
```
✅ Passes_for_ienumerable_that_doesnt_implement_ICollection
✅ Passes_when_collection_empty
@@ -361,7 +366,7 @@
✅ When_value_is_null_validator_should_pass
✅ When_value_is_whitespace_validation_should_pass
```
-### ✅ FluentValidation.Tests.EnumValidatorTests
+### ✅ FluentValidation.Tests.EnumValidatorTests
```
✅ Flags_enum_invalid_when_using_outofrange_negative_value
✅ Flags_enum_invalid_when_using_outofrange_positive_value
@@ -376,7 +381,7 @@
✅ When_the_enum_is_not_initialized_with_valid_value_then_the_validator_should_fail
✅ When_validation_fails_the_default_error_should_be_set
```
-### ✅ FluentValidation.Tests.EqualValidatorTests
+### ✅ FluentValidation.Tests.EqualValidatorTests
```
✅ Comparison_property_uses_custom_resolver
✅ Should_store_comparison_type
@@ -389,7 +394,7 @@
✅ When_the_objects_are_not_equal_validation_should_fail
✅ When_validation_fails_the_error_should_be_set
```
-### ✅ FluentValidation.Tests.ExactLengthValidatorTester
+### ✅ FluentValidation.Tests.ExactLengthValidatorTester
```
✅ Min_and_max_properties_should_be_set
✅ When_exact_length_rule_failes_error_should_have_exact_length_error_errorcode
@@ -398,7 +403,7 @@
✅ When_the_text_length_is_smaller_the_validator_should_fail
✅ When_the_validator_fails_the_error_message_should_be_set
```
-### ✅ FluentValidation.Tests.ExclusiveBetweenValidatorTests
+### ✅ FluentValidation.Tests.ExclusiveBetweenValidatorTests
```
✅ To_and_from_properties_should_be_set
✅ To_and_from_properties_should_be_set_for_dates
@@ -420,14 +425,14 @@
✅ When_the_value_is_smaller_than_the_range_then_the_validator_should_fail
✅ When_the_value_is_smaller_than_the_range_then_the_validator_should_fail_for_strings
```
-### ✅ FluentValidation.Tests.ExtensionTester
+### ✅ FluentValidation.Tests.ExtensionTester
```
✅ Should_extract_member_from_member_expression
✅ Should_return_null_for_non_member_expressions
✅ Should_split_pascal_cased_member_name
✅ SplitPascalCase_should_return_null_when_input_is_null
```
-### ✅ FluentValidation.Tests.ForEachRuleTests
+### ✅ FluentValidation.Tests.ForEachRuleTests
```
✅ Async_condition_should_work_with_child_collection
✅ Can_access_colletion_index
@@ -464,7 +469,7 @@
✅ When_runs_outside_RuleForEach_loop
✅ When_runs_outside_RuleForEach_loop_async
```
-### ✅ FluentValidation.Tests.GreaterThanOrEqualToValidatorTester
+### ✅ FluentValidation.Tests.GreaterThanOrEqualToValidatorTester
```
✅ Comparison_property_uses_custom_resolver
✅ Comparison_type
@@ -481,7 +486,7 @@
✅ Validates_with_nullable_when_property_not_null_cross_property
✅ Validates_with_property
```
-### ✅ FluentValidation.Tests.GreaterThanValidatorTester
+### ✅ FluentValidation.Tests.GreaterThanValidatorTester
```
✅ Comparison_property_uses_custom_resolver
✅ Comparison_Type
@@ -497,7 +502,7 @@
✅ Validates_with_nullable_when_property_not_null_cross_property
✅ Validates_with_property
```
-### ✅ FluentValidation.Tests.InclusiveBetweenValidatorTests
+### ✅ FluentValidation.Tests.InclusiveBetweenValidatorTests
```
✅ To_and_from_properties_should_be_set
✅ To_and_from_properties_should_be_set_for_strings
@@ -518,7 +523,7 @@
✅ When_the_value_is_smaller_than_the_range_then_the_validator_should_fail
✅ When_the_value_is_smaller_than_the_range_then_the_validator_should_fail_for_strings
```
-### ✅ FluentValidation.Tests.InheritanceValidatorTest
+### ✅ FluentValidation.Tests.InheritanceValidatorTest
```
✅ Can_use_custom_subclass_with_nongeneric_overload
✅ Validates_collection
@@ -532,11 +537,11 @@
✅ Validates_with_callback_accepting_derived_async
✅ Validates_with_callback_async
```
-### ✅ FluentValidation.Tests.InlineValidatorTester
+### ✅ FluentValidation.Tests.InlineValidatorTester
```
✅ Uses_inline_validator_to_build_rules
```
-### ✅ FluentValidation.Tests.LanguageManagerTests
+### ✅ FluentValidation.Tests.LanguageManagerTests
```
✅ All_languages_should_be_loaded
✅ All_localizations_have_same_parameters_as_English
@@ -560,7 +565,7 @@
✅ Gets_translation_for_specific_culture
✅ Uses_error_code_as_localization_key
```
-### ✅ FluentValidation.Tests.LengthValidatorTests
+### ✅ FluentValidation.Tests.LengthValidatorTests
```
✅ Min_and_max_properties_should_be_set
✅ When_input_is_null_then_the_validator_should_pass
@@ -579,7 +584,7 @@
✅ When_the_text_is_smaller_than_the_range_then_the_validator_should_fail
✅ When_the_validator_fails_the_error_message_should_be_set
```
-### ✅ FluentValidation.Tests.LessThanOrEqualToValidatorTester
+### ✅ FluentValidation.Tests.LessThanOrEqualToValidatorTester
```
✅ Comparison_property_uses_custom_resolver
✅ Comparison_type
@@ -595,7 +600,7 @@
✅ Validates_with_nullable_when_property_not_null_cross_property
✅ Validates_with_property
```
-### ✅ FluentValidation.Tests.LessThanValidatorTester
+### ✅ FluentValidation.Tests.LessThanValidatorTester
```
✅ Comparison_property_uses_custom_resolver
✅ Comparison_type
@@ -614,7 +619,7 @@
✅ Validates_with_nullable_when_property_not_null_cross_property
✅ Validates_with_nullable_when_property_null_cross_property
```
-### ✅ FluentValidation.Tests.LocalisedMessagesTester
+### ✅ FluentValidation.Tests.LocalisedMessagesTester
```
✅ Correctly_assigns_default_localized_error_message
✅ Does_not_throw_InvalidCastException_when_using_RuleForEach
@@ -623,12 +628,12 @@
✅ Uses_func_to_get_message
✅ Uses_string_format_with_property_value
```
-### ✅ FluentValidation.Tests.LocalisedNameTester
+### ✅ FluentValidation.Tests.LocalisedNameTester
```
✅ Uses_localized_name
✅ Uses_localized_name_expression
```
-### ✅ FluentValidation.Tests.MemberAccessorTests
+### ✅ FluentValidation.Tests.MemberAccessorTests
```
✅ ComplexPropertyGet
✅ ComplexPropertySet
@@ -640,7 +645,7 @@
✅ SimplePropertyGet
✅ SimplePropertySet
```
-### ✅ FluentValidation.Tests.MessageFormatterTests
+### ✅ FluentValidation.Tests.MessageFormatterTests
```
✅ Adds_argument_and_custom_arguments
✅ Adds_formatted_argument_and_custom_arguments
@@ -653,18 +658,18 @@
✅ Understands_date_formats
✅ Understands_numeric_formats
```
-### ✅ FluentValidation.Tests.ModelLevelValidatorTests
+### ✅ FluentValidation.Tests.ModelLevelValidatorTests
```
✅ Can_use_child_validator_at_model_level
✅ Validates_at_model_level
```
-### ✅ FluentValidation.Tests.NameResolutionPluggabilityTester
+### ✅ FluentValidation.Tests.NameResolutionPluggabilityTester
```
✅ Resolves_nested_properties
✅ ShouldHaveValidationError_Should_support_custom_propertynameresolver
✅ Uses_custom_property_name
```
-### ✅ FluentValidation.Tests.NotEmptyTester
+### ✅ FluentValidation.Tests.NotEmptyTester
```
✅ Fails_for_array
✅ Fails_for_ienumerable_that_doesnt_implement_ICollection
@@ -677,7 +682,7 @@
✅ When_value_is_null_validator_should_fail
✅ When_value_is_whitespace_validation_should_fail
```
-### ✅ FluentValidation.Tests.NotEqualValidatorTests
+### ✅ FluentValidation.Tests.NotEqualValidatorTests
```
✅ Comparison_property_uses_custom_resolver
✅ Should_handle_custom_value_types_correctly
@@ -691,7 +696,7 @@
✅ When_the_objects_are_not_equal_then_the_validator_should_pass
✅ When_the_validator_fails_the_error_message_should_be_set
```
-### ✅ FluentValidation.Tests.NotNullTester
+### ✅ FluentValidation.Tests.NotNullTester
```
✅ Fails_when_nullable_value_type_is_null
✅ Not_null_validator_should_not_crash_with_non_nullable_value_type
@@ -699,7 +704,7 @@
✅ NotNullValidator_should_pass_if_value_has_value
✅ When_the_validator_fails_the_error_message_should_be_set
```
-### ✅ FluentValidation.Tests.NullTester
+### ✅ FluentValidation.Tests.NullTester
```
✅ Not_null_validator_should_not_crash_with_non_nullable_value_type
✅ NullValidator_should_fail_if_value_has_value
@@ -707,7 +712,7 @@
✅ Passes_when_nullable_value_type_is_null
✅ When_the_validator_passes_the_error_message_should_be_set
```
-### ✅ FluentValidation.Tests.OnFailureTests
+### ✅ FluentValidation.Tests.OnFailureTests
```
✅ OnFailure_called_for_each_failed_rule
✅ OnFailure_called_for_each_failed_rule_asyncAsync
@@ -720,7 +725,7 @@
✅ WhenWithOnFailure_should_invoke_condition_on_async_inner_validator
✅ WhenWithOnFailure_should_invoke_condition_on_inner_validator
```
-### ✅ FluentValidation.Tests.PredicateValidatorTester
+### ✅ FluentValidation.Tests.PredicateValidatorTester
```
✅ Should_fail_when_predicate_returns_false
✅ Should_succeed_when_predicate_returns_true
@@ -728,7 +733,7 @@
✅ When_validation_fails_metadata_should_be_set_on_failure
✅ When_validation_fails_the_default_error_should_be_set
```
-### ✅ FluentValidation.Tests.PropertyChainTests
+### ✅ FluentValidation.Tests.PropertyChainTests
```
✅ AddIndexer_throws_when_nothing_added
✅ Calling_ToString_should_construct_string_representation_of_chain
@@ -738,7 +743,7 @@
✅ Should_ignore_blanks
✅ Should_not_be_subchain
```
-### ✅ FluentValidation.Tests.RegularExpressionValidatorTests
+### ✅ FluentValidation.Tests.RegularExpressionValidatorTests
```
✅ Can_access_expression_in_message
✅ Can_access_expression_in_message_lambda
@@ -756,7 +761,7 @@
✅ When_the_text_matches_the_regular_expression_then_the_validator_should_pass
✅ When_validation_fails_the_default_error_should_be_set
```
-### ✅ FluentValidation.Tests.RuleBuilderTests
+### ✅ FluentValidation.Tests.RuleBuilderTests
```
✅ Adding_a_validator_should_return_builder
✅ Adding_a_validator_should_store_validator
@@ -788,7 +793,7 @@
✅ Should_throw_when_inverse_predicate_is_null
✅ Should_throw_when_predicate_is_null
```
-### ✅ FluentValidation.Tests.RuleDependencyTests
+### ✅ FluentValidation.Tests.RuleDependencyTests
```
✅ Async_inside_dependent_rules
✅ Async_inside_dependent_rules_when_parent_rule_not_async
@@ -805,7 +810,7 @@
✅ TestAsyncWithDependentRules_SyncEntry
✅ Treats_root_level_RuleFor_call_as_dependent_rule_if_user_forgets_to_use_DependentRulesBuilder
```
-### ✅ FluentValidation.Tests.RulesetTests
+### ✅ FluentValidation.Tests.RulesetTests
```
✅ Applies_multiple_rulesets_to_rule
✅ Combines_rulesets_and_explicit_properties
@@ -829,7 +834,7 @@
✅ Trims_spaces
✅ WithMessage_works_inside_rulesets
```
-### ✅ FluentValidation.Tests.ScalePrecisionValidatorTests
+### ✅ FluentValidation.Tests.ScalePrecisionValidatorTests
```
✅ Scale_precision_should_be_valid
✅ Scale_precision_should_be_valid_when_ignoring_trailing_zeroes
@@ -838,7 +843,7 @@
✅ Scale_precision_should_not_be_valid_when_ignoring_trailing_zeroes
✅ Scale_precision_should_not_be_valid_when_they_are_equal
```
-### ✅ FluentValidation.Tests.SharedConditionTests
+### ✅ FluentValidation.Tests.SharedConditionTests
```
✅ Async_condition_can_be_used_inside_ruleset
✅ Condition_can_be_used_inside_ruleset
@@ -883,11 +888,11 @@
✅ When_condition_only_executed_once
✅ WhenAsync_condition_only_executed_once
```
-### ✅ FluentValidation.Tests.StandalonePropertyValidationTester
+### ✅ FluentValidation.Tests.StandalonePropertyValidationTester
```
✅ Should_validate_property_value_without_instance
```
-### ✅ FluentValidation.Tests.StringEnumValidatorTests
+### ✅ FluentValidation.Tests.StringEnumValidatorTests
```
✅ IsValidTests_CaseInsensitive_CaseCorrect
✅ IsValidTests_CaseInsensitive_CaseIncorrect
@@ -900,20 +905,20 @@
✅ When_the_property_is_initialized_with_null_then_the_validator_should_be_valid
✅ When_validation_fails_the_default_error_should_be_set
```
-### ✅ FluentValidation.Tests.TrackingCollectionTests
+### ✅ FluentValidation.Tests.TrackingCollectionTests
```
✅ Add_AddsItem
✅ Should_not_raise_event_once_handler_detached
✅ When_Item_Added_Raises_ItemAdded
```
-### ✅ FluentValidation.Tests.TransformTests
+### ✅ FluentValidation.Tests.TransformTests
```
✅ Transforms_collection_element
✅ Transforms_collection_element_async
✅ Transforms_property_value
✅ Transforms_property_value_to_another_type
```
-### ✅ FluentValidation.Tests.UserSeverityTester
+### ✅ FluentValidation.Tests.UserSeverityTester
```
✅ Can_Provide_conditional_severity
✅ Can_Provide_severity_for_item_in_collection
@@ -923,14 +928,14 @@
✅ Stores_user_severity_against_validation_failure
✅ Throws_when_provider_is_null
```
-### ✅ FluentValidation.Tests.UserStateTester
+### ✅ FluentValidation.Tests.UserStateTester
```
✅ Can_Provide_state_for_item_in_collection
✅ Correctly_provides_object_being_validated
✅ Stores_user_state_against_validation_failure
✅ Throws_when_provider_is_null
```
-### ✅ FluentValidation.Tests.ValidateAndThrowTester
+### ✅ FluentValidation.Tests.ValidateAndThrowTester
```
✅ Does_not_throw_when_valid
✅ Does_not_throw_when_valid_and_a_ruleset
@@ -947,7 +952,7 @@
✅ ValidationException_provides_correct_message_when_appendDefaultMessage_false
✅ ValidationException_provides_correct_message_when_appendDefaultMessage_true
```
-### ✅ FluentValidation.Tests.ValidationResultTests
+### ✅ FluentValidation.Tests.ValidationResultTests
```
✅ Can_serialize_failure
✅ Can_serialize_result
@@ -958,7 +963,7 @@
✅ ToString_return_error_messages_with_given_separator
✅ ToString_return_error_messages_with_newline_as_separator
```
-### ✅ FluentValidation.Tests.ValidatorDescriptorTester
+### ✅ FluentValidation.Tests.ValidatorDescriptorTester
```
✅ Does_not_throw_when_rule_declared_without_property
✅ Gets_validators_for_property
@@ -966,7 +971,7 @@
✅ Returns_empty_collection_for_property_with_no_validators
✅ Should_retrieve_name_given_to_it_pass_property_as_string
```
-### ✅ FluentValidation.Tests.ValidatorSelectorTests
+### ✅ FluentValidation.Tests.ValidatorSelectorTests
```
✅ Can_use_property_with_include
✅ Does_not_validate_other_property
@@ -979,7 +984,7 @@
✅ Validates_nullable_property_with_overriden_name_when_selected
✅ Validates_property_using_expression
```
-### ✅ FluentValidation.Tests.ValidatorTesterTester
+### ✅ FluentValidation.Tests.ValidatorTesterTester
```
✅ Allows_only_one_failure_to_match
✅ Can_use_indexer_in_string_message
@@ -1054,4 +1059,5 @@
✅ Unexpected_message_check(withoutErrMsg: "bar", errMessages: [])
✅ Unexpected_severity_check
✅ Unexpected_state_check
-```
\ No newline at end of file
+```
+
\ No newline at end of file
diff --git a/__tests__/__outputs__/golang-json.md b/__tests__/__outputs__/golang-json.md
new file mode 100644
index 0000000..8b63704
--- /dev/null
+++ b/__tests__/__outputs__/golang-json.md
@@ -0,0 +1,38 @@
+
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/golang-json.json](#user-content-r0)|5 ✅|6 ❌|1 ⚪|6s|
+## ❌ fixtures/golang-json.json
+**12** tests were completed in **6s** with **5** passed, **6** failed and **1** skipped.
+|Test suite|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[_/home/james_t/git/test-reporter/reports/go](#user-content-r0s0)|5 ✅|6 ❌|1 ⚪|6s|
+### ❌ _/home/james_t/git/test-reporter/reports/go
+```
+✅ TestPassing
+❌ TestFailing
+ calculator_test.go:19: expected 1+1 = 3, got 2
+
+❌ TestPanicInsideFunction
+ calculator_test.go:76: caught panic: runtime error: integer divide by zero
+
+❌ TestPanicInsideTest
+ calculator_test.go:76: caught panic: bad stuff
+
+⚪ TestSkipped
+ calculator_test.go:45: skipping test
+
+❌ TestCases
+
+TestCases
+ ✅ 1_+_2_=_3
+ ✅ 4_+_7_=_11
+ ❌ 2_+_3_=_4
+ calculator_test.go:67: expected 2 + 3 = 4, got 5
+
+ ❌ 1_/_2_=_1
+ calculator_test.go:67: expected 1 / 2 = 1, got 0
+
+ ✅ 9_/_3_=_3
+ ✅ 14_/_7_=_2
+```
\ No newline at end of file
diff --git a/__tests__/__outputs__/jest-junit-eslint.md b/__tests__/__outputs__/jest-junit-eslint.md
new file mode 100644
index 0000000..5ebb57e
--- /dev/null
+++ b/__tests__/__outputs__/jest-junit-eslint.md
@@ -0,0 +1,17 @@
+
+Expand for details
+
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/jest-junit-eslint.xml](#user-content-r0)|1 ✅|||0ms|
+## ✅ fixtures/jest-junit-eslint.xml
+**1** tests were completed in **0ms** with **1** passed, **0** failed and **0** skipped.
+|Test suite|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[test.jsx](#user-content-r0s0)|1 ✅|||0ms|
+### ✅ test.jsx
+```
+test
+ ✅ test.jsx
+```
+
\ No newline at end of file
diff --git a/__tests__/__outputs__/jest-junit.md b/__tests__/__outputs__/jest-junit.md
index 1579828..951256f 100644
--- a/__tests__/__outputs__/jest-junit.md
+++ b/__tests__/__outputs__/jest-junit.md
@@ -1,11 +1,14 @@

-## ❌ fixtures/jest-junit.xml
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/jest-junit.xml](#user-content-r0)|1 ✅|4 ❌|1 ⚪|1s|
+## ❌ fixtures/jest-junit.xml
**6** tests were completed in **1s** with **1** passed, **4** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[__tests__\main.test.js](#r0s0)|1✅|3❌||486ms|
-|[__tests__\second.test.js](#r0s1)||1❌|1⚪|82ms|
-### ❌ __tests__\main.test.js
+|[__tests__\main.test.js](#user-content-r0s0)|1 ✅|3 ❌||486ms|
+|[__tests__\second.test.js](#user-content-r0s1)||1 ❌|1 ⚪|82ms|
+### ❌ __tests__\main.test.js
```
Test 1
✅ Passing test
@@ -18,7 +21,7 @@ Test 2
❌ Exception in test
Error: Some error
```
-### ❌ __tests__\second.test.js
+### ❌ __tests__\second.test.js
```
❌ Timeout test
: Timeout - Async callback was not invoked within the 1 ms timeout specified by jest.setTimeout.Timeout - Async callback was not invoked within the 1 ms timeout specified by jest.setTimeout.Error:
diff --git a/__tests__/__outputs__/jest-react-component-test-results.md b/__tests__/__outputs__/jest-react-component-test-results.md
index 7891a19..1365818 100644
--- a/__tests__/__outputs__/jest-react-component-test-results.md
+++ b/__tests__/__outputs__/jest-react-component-test-results.md
@@ -1,10 +1,16 @@

-## ✅ fixtures/external/jest/jest-react-component-test-results.xml
+Expand for details
+
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/external/jest/jest-react-component-test-results.xml](#user-content-r0)|1 ✅|||1000ms|
+## ✅ fixtures/external/jest/jest-react-component-test-results.xml
**1** tests were completed in **1000ms** with **1** passed, **0** failed and **0** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[\](#r0s0)|1✅|||798ms|
-### ✅ \
+|[\](#user-content-r0s0)|1 ✅|||798ms|
+### ✅ \
```
✅ should render properly
-```
\ No newline at end of file
+```
+
\ No newline at end of file
diff --git a/__tests__/__outputs__/jest-test-results.md b/__tests__/__outputs__/jest-test-results.md
index bc86f3c..cfbc169 100644
--- a/__tests__/__outputs__/jest-test-results.md
+++ b/__tests__/__outputs__/jest-test-results.md
@@ -1,409 +1,890 @@

-## ❌ fixtures/external/jest/jest-test-results.xml
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/external/jest/jest-test-results.xml](#user-content-r0)|4207 ✅|2 ❌|30 ⚪|166s|
+## ❌ fixtures/external/jest/jest-test-results.xml
**4239** tests were completed in **166s** with **4207** passed, **2** failed and **30** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|e2e/__tests__/asyncAndCallback.test.ts|1✅|||746ms|
-|e2e/__tests__/asyncRegenerator.test.ts|1✅|||4s|
-|e2e/__tests__/autoClearMocks.test.ts|2✅|||2s|
-|e2e/__tests__/autoResetMocks.test.ts|2✅|||2s|
-|e2e/__tests__/autoRestoreMocks.test.ts|2✅|||2s|
-|e2e/__tests__/babelPluginJestHoist.test.ts|1✅|||6s|
-|e2e/__tests__/badSourceMap.test.ts|1✅|||858ms|
-|e2e/__tests__/beforeAllFiltered.ts|1✅|||958ms|
-|e2e/__tests__/beforeEachQueue.ts|1✅||1⚪|55ms|
-|e2e/__tests__/callDoneTwice.test.ts|1✅|||882ms|
-|e2e/__tests__/chaiAssertionLibrary.ts|1✅|||2s|
-|e2e/__tests__/circularInequality.test.ts|1✅|||1s|
-|e2e/__tests__/circusConcurrentEach.test.ts|2✅|||2s|
-|e2e/__tests__/circusDeclarationErrors.test.ts|1✅|||869ms|
-|e2e/__tests__/clearCache.test.ts|2✅|||1s|
-|e2e/__tests__/cliHandlesExactFilenames.test.ts|2✅|||1s|
-|e2e/__tests__/compareDomNodes.test.ts|1✅|||1s|
-|e2e/__tests__/config.test.ts|6✅|||4s|
-|e2e/__tests__/console.test.ts|7✅|||8s|
-|e2e/__tests__/consoleAfterTeardown.test.ts|1✅|||1s|
-|e2e/__tests__/consoleLogOutputWhenRunInBand.test.ts|1✅|||793ms|
-|e2e/__tests__/coverageHandlebars.test.ts|1✅|||2s|
-|e2e/__tests__/coverageRemapping.test.ts|1✅|||13s|
-|e2e/__tests__/coverageReport.test.ts|12✅|||22s|
-|e2e/__tests__/coverageThreshold.test.ts|5✅|||5s|
-|e2e/__tests__/coverageTransformInstrumented.test.ts|1✅|||5s|
-|e2e/__tests__/coverageWithoutTransform.test.ts|1✅|||1s|
-|e2e/__tests__/createProcessObject.test.ts|1✅|||908ms|
-|e2e/__tests__/customInlineSnapshotMatchers.test.ts|1✅|||2s|
-|e2e/__tests__/customMatcherStackTrace.test.ts|2✅|||2s|
-|e2e/__tests__/customReporters.test.ts|9✅|||7s|
-|e2e/__tests__/customResolver.test.ts|1✅|||826ms|
-|e2e/__tests__/customTestSequencers.test.ts|3✅|||3s|
-|e2e/__tests__/debug.test.ts|1✅|||899ms|
-|e2e/__tests__/declarationErrors.test.ts|3✅|||2s|
-|e2e/__tests__/dependencyClash.test.ts|1✅|||833ms|
-|e2e/__tests__/detectOpenHandles.ts|8✅|||8s|
-|e2e/__tests__/domDiffing.test.ts|1✅|||1s|
-|e2e/__tests__/doneInHooks.test.ts|1✅|||855ms|
-|e2e/__tests__/dynamicRequireDependencies.ts|1✅|||847ms|
-|e2e/__tests__/each.test.ts|7✅|||5s|
-|e2e/__tests__/emptyDescribeWithHooks.test.ts|4✅|||3s|
-|e2e/__tests__/emptySuiteError.test.ts|1✅|||885ms|
-|e2e/__tests__/env.test.ts|6✅|||5s|
-|e2e/__tests__/environmentAfterTeardown.test.ts|1✅|||892ms|
-|e2e/__tests__/errorOnDeprecated.test.ts|1✅||24⚪|56ms|
-|e2e/__tests__/esmConfigFile.test.ts|3✅|||526ms|
-|e2e/__tests__/executeTestsOnceInMpr.ts|1✅|||976ms|
-|e2e/__tests__/existentRoots.test.ts|4✅|||627ms|
-|e2e/__tests__/expectAsyncMatcher.test.ts|2✅|||3s|
-|e2e/__tests__/expectInVm.test.ts|1✅|||2s|
-|e2e/__tests__/extraGlobals.test.ts|1✅|||1s|
-|e2e/__tests__/failureDetailsProperty.test.ts|1✅|||907ms|
-|e2e/__tests__/failures.test.ts|7✅|||10s|
-|e2e/__tests__/fakePromises.test.ts|2✅|||2s|
-|e2e/__tests__/fatalWorkerError.test.ts|1✅|||3s|
-|e2e/__tests__/filter.test.ts|7✅|||5s|
-|e2e/__tests__/findRelatedFiles.test.ts|5✅|||6s|
-|e2e/__tests__/focusedTests.test.ts|1✅|||888ms|
-|e2e/__tests__/forceExit.test.ts|1✅|||2s|
-|e2e/__tests__/generatorMock.test.ts|1✅|||1s|
-|e2e/__tests__/global-mutation.test.ts|1✅|||40ms|
-|e2e/__tests__/global.test.ts|1✅|||31ms|
-|e2e/__tests__/globals.test.ts|10✅|||8s|
-|e2e/__tests__/globalSetup.test.ts|10✅|||14s|
-|e2e/__tests__/globalTeardown.test.ts|7✅|||12s|
-|e2e/__tests__/hasteMapMockChanged.test.ts|1✅|||379ms|
-|e2e/__tests__/hasteMapSha1.test.ts|1✅|||298ms|
-|e2e/__tests__/hasteMapSize.test.ts|2✅|||397ms|
-|e2e/__tests__/importedGlobals.test.ts|1✅|||1s|
-|e2e/__tests__/injectGlobals.test.ts|2✅|||2s|
-|e2e/__tests__/jasmineAsync.test.ts|15✅|||28s|
-|e2e/__tests__/jasmineAsyncWithPendingDuringTest.ts|1✅||1⚪|72ms|
-|e2e/__tests__/jest.config.js.test.ts|3✅|||2s|
-|e2e/__tests__/jest.config.ts.test.ts|5✅|||14s|
-|[e2e/__tests__/jestChangedFiles.test.ts](#r0s75)|9✅|1❌||9s|
-|e2e/__tests__/jestEnvironmentJsdom.test.ts|1✅|||2s|
-|e2e/__tests__/jestRequireActual.test.ts|1✅|||2s|
-|e2e/__tests__/jestRequireMock.test.ts|1✅|||2s|
-|e2e/__tests__/json.test.ts|2✅|||29ms|
-|e2e/__tests__/jsonReporter.test.ts|2✅|||2s|
-|e2e/__tests__/lifecycles.ts|1✅|||861ms|
-|e2e/__tests__/listTests.test.ts|2✅|||945ms|
-|e2e/__tests__/locationInResults.test.ts|2✅|||2s|
-|e2e/__tests__/logHeapUsage.test.ts|1✅|||884ms|
-|e2e/__tests__/mockNames.test.ts|8✅|||7s|
-|e2e/__tests__/modernFakeTimers.test.ts|2✅|||2s|
-|e2e/__tests__/moduleNameMapper.test.ts|5✅|||5s|
-|e2e/__tests__/moduleParentNullInTest.ts|1✅|||886ms|
-|e2e/__tests__/multiProjectRunner.test.ts|14✅|||16s|
-|e2e/__tests__/nativeAsyncMock.test.ts|1✅|||55ms|
-|e2e/__tests__/nativeEsm.test.ts|2✅||1⚪|905ms|
-|e2e/__tests__/nativeEsmTypescript.test.ts|1✅|||956ms|
-|e2e/__tests__/nestedEventLoop.test.ts|1✅|||1s|
-|e2e/__tests__/nestedTestDefinitions.test.ts|4✅|||5s|
-|e2e/__tests__/nodePath.test.ts|1✅|||866ms|
-|e2e/__tests__/noTestFound.test.ts|2✅|||1s|
-|e2e/__tests__/noTestsFound.test.ts|5✅|||3s|
-|[e2e/__tests__/onlyChanged.test.ts](#r0s98)|8✅|1❌||22s|
-|e2e/__tests__/onlyFailuresNonWatch.test.ts|1✅|||3s|
-|e2e/__tests__/overrideGlobals.test.ts|2✅|||2s|
-|e2e/__tests__/pnp.test.ts|1✅|||3s|
-|e2e/__tests__/presets.test.ts|2✅|||2s|
-|e2e/__tests__/processExit.test.ts|1✅|||1s|
-|e2e/__tests__/promiseReject.test.ts|1✅|||967ms|
-|e2e/__tests__/regexCharInPath.test.ts|1✅|||962ms|
-|e2e/__tests__/requireAfterTeardown.test.ts|1✅|||921ms|
-|e2e/__tests__/requireMain.test.ts|1✅|||1s|
-|e2e/__tests__/requireMainAfterCreateRequire.test.ts|1✅|||966ms|
-|e2e/__tests__/requireMainIsolateModules.test.ts|1✅|||976ms|
-|e2e/__tests__/requireMainResetModules.test.ts|2✅|||2s|
-|e2e/__tests__/requireV8Module.test.ts|1✅|||30ms|
-|e2e/__tests__/resetModules.test.ts|1✅|||926ms|
-|e2e/__tests__/resolve.test.ts|1✅|||2s|
-|e2e/__tests__/resolveGetPaths.test.ts|1✅|||1s|
-|e2e/__tests__/resolveNodeModule.test.ts|1✅|||943ms|
-|e2e/__tests__/resolveNoFileExtensions.test.ts|2✅|||1s|
-|e2e/__tests__/resolveWithPaths.test.ts|1✅|||1s|
-|e2e/__tests__/runProgrammatically.test.ts|2✅|||575ms|
-|e2e/__tests__/runTestsByPath.test.ts|1✅|||2s|
-|e2e/__tests__/runtimeInternalModuleRegistry.test.ts|1✅|||1s|
-|e2e/__tests__/selectProjects.test.ts|18✅|||5s|
-|e2e/__tests__/setImmediate.test.ts|1✅|||904ms|
-|e2e/__tests__/setupFilesAfterEnvConfig.test.ts|2✅|||2s|
-|e2e/__tests__/showConfig.test.ts|1✅|||195ms|
-|e2e/__tests__/skipBeforeAfterAll.test.ts|1✅|||1s|
-|e2e/__tests__/snapshot-unknown.test.ts|1✅|||838ms|
-|e2e/__tests__/snapshot.test.ts|9✅|||14s|
-|e2e/__tests__/snapshotMockFs.test.ts|1✅|||883ms|
-|e2e/__tests__/snapshotResolver.test.ts|1✅|||823ms|
-|e2e/__tests__/snapshotSerializers.test.ts|2✅|||2s|
-|e2e/__tests__/stackTrace.test.ts|7✅|||5s|
-|e2e/__tests__/stackTraceNoCaptureStackTrace.test.ts|1✅|||899ms|
-|e2e/__tests__/stackTraceSourceMaps.test.ts|1✅|||2s|
-|e2e/__tests__/stackTraceSourceMapsWithCoverage.test.ts|1✅|||2s|
-|e2e/__tests__/supportsDashedArgs.ts|2✅|||968ms|
-|e2e/__tests__/symbol.test.ts|1✅|||49ms|
-|e2e/__tests__/testEnvironment.test.ts|1✅|||2s|
-|e2e/__tests__/testEnvironmentAsync.test.ts|1✅|||1s|
-|e2e/__tests__/testEnvironmentCircus.test.ts|1✅|||2s|
-|e2e/__tests__/testEnvironmentCircusAsync.test.ts|1✅|||2s|
-|e2e/__tests__/testFailureExitCode.test.ts|2✅|||4s|
-|e2e/__tests__/testInRoot.test.ts|1✅|||1s|
-|e2e/__tests__/testNamePattern.test.ts|1✅|||859ms|
-|e2e/__tests__/testNamePatternSkipped.test.ts|1✅|||991ms|
-|e2e/__tests__/testPathPatternReporterMessage.test.ts|1✅|||3s|
-|e2e/__tests__/testResultsProcessor.test.ts|1✅|||910ms|
-|e2e/__tests__/testRetries.test.ts|4✅|||3s|
-|e2e/__tests__/testTodo.test.ts|5✅|||4s|
-|e2e/__tests__/timeouts.test.ts|4✅|||4s|
-|e2e/__tests__/timeoutsLegacy.test.ts|1✅||3⚪|71ms|
-|e2e/__tests__/timerResetMocks.test.ts|2✅|||2s|
-|e2e/__tests__/timerUseRealTimers.test.ts|1✅|||1s|
-|e2e/__tests__/toMatchInlineSnapshot.test.ts|12✅|||24s|
-|e2e/__tests__/toMatchInlineSnapshotWithRetries.test.ts|3✅|||5s|
-|e2e/__tests__/toMatchSnapshot.test.ts|9✅|||17s|
-|e2e/__tests__/toMatchSnapshotWithRetries.test.ts|2✅|||4s|
-|e2e/__tests__/toMatchSnapshotWithStringSerializer.test.ts|3✅|||4s|
-|e2e/__tests__/toThrowErrorMatchingInlineSnapshot.test.ts|4✅|||4s|
-|e2e/__tests__/toThrowErrorMatchingSnapshot.test.ts|5✅|||4s|
-|e2e/__tests__/transform.test.ts|16✅|||27s|
-|e2e/__tests__/transformLinkedModules.test.ts|1✅|||783ms|
-|e2e/__tests__/typescriptCoverage.test.ts|1✅|||3s|
-|e2e/__tests__/unexpectedToken.test.ts|3✅|||3s|
-|e2e/__tests__/useStderr.test.ts|1✅|||1s|
-|e2e/__tests__/v8Coverage.test.ts|2✅|||2s|
-|e2e/__tests__/verbose.test.ts|1✅|||683ms|
-|e2e/__tests__/version.test.ts|1✅|||138ms|
-|e2e/__tests__/watchModeNoAccess.test.ts|1✅|||4s|
-|e2e/__tests__/watchModeOnlyFailed.test.ts|1✅|||1s|
-|e2e/__tests__/watchModePatterns.test.ts|2✅|||4s|
-|e2e/__tests__/watchModeUpdateSnapshot.test.ts|1✅|||1s|
-|e2e/__tests__/workerForceExit.test.ts|2✅|||5s|
-|e2e/__tests__/wrongEnv.test.ts|5✅|||4s|
-|e2e/custom-test-sequencer/a.test.js|1✅|||29ms|
-|e2e/custom-test-sequencer/b.test.js|1✅|||21ms|
-|e2e/custom-test-sequencer/c.test.js|1✅|||42ms|
-|e2e/custom-test-sequencer/d.test.js|1✅|||21ms|
-|e2e/custom-test-sequencer/e.test.js|1✅|||27ms|
-|e2e/test-in-root/spec.js|1✅|||19ms|
-|e2e/test-in-root/test.js|1✅|||37ms|
-|e2e/timer-reset-mocks/after-reset-all-mocks/timerAndMock.test.js|2✅|||30ms|
-|e2e/timer-reset-mocks/with-reset-mocks/timerWithMock.test.js|1✅|||34ms|
-|e2e/v8-coverage/empty-sourcemap/test.ts|1✅|||31ms|
-|examples/angular/app.component.spec.ts|3✅|||654ms|
-|examples/angular/shared/data.service.spec.ts|2✅|||431ms|
-|examples/angular/shared/sub.service.spec.ts|1✅|||109ms|
-|examples/async/__tests__/user.test.js|8✅|||96ms|
-|examples/automatic-mocks/__tests__/automock.test.js|2✅|||74ms|
-|examples/automatic-mocks/__tests__/createMockFromModule.test.js|2✅|||115ms|
-|examples/automatic-mocks/__tests__/disableAutomocking.test.js|1✅|||24ms|
-|examples/enzyme/__tests__/CheckboxWithLabel-test.js|1✅|||434ms|
-|examples/getting-started/sum.test.js|1✅|||78ms|
-|examples/jquery/__tests__/display_user.test.js|1✅|||196ms|
-|examples/jquery/__tests__/fetch_current_user.test.js|2✅|||196ms|
-|examples/manual-mocks/__tests__/file_summarizer.test.js|1✅|||87ms|
-|examples/manual-mocks/__tests__/lodashMocking.test.js|1✅|||109ms|
-|examples/manual-mocks/__tests__/user.test.js|1✅|||41ms|
-|examples/manual-mocks/__tests__/userMocked.test.js|1✅|||105ms|
-|examples/module-mock/__tests__/full_mock.js|1✅|||60ms|
-|examples/module-mock/__tests__/mock_per_test.js|2✅|||116ms|
-|examples/module-mock/__tests__/partial_mock.js|1✅|||215ms|
-|examples/mongodb/__test__/db.test.js|1✅|||236ms|
-|examples/react-native/__tests__/intro.test.js|4✅|||9s|
-|examples/react-testing-library/__tests__/CheckboxWithLabel-test.js|1✅|||469ms|
-|examples/react/__tests__/CheckboxWithLabel-test.js|1✅|||256ms|
-|examples/snapshot/__tests__/clock.react.test.js|1✅|||62ms|
-|examples/snapshot/__tests__/link.react.test.js|4✅|||181ms|
-|examples/timer/__tests__/infinite_timer_game.test.js|1✅|||94ms|
-|examples/timer/__tests__/timer_game.test.js|3✅|||74ms|
-|examples/typescript/__tests__/calc.test.ts|6✅|||276ms|
-|examples/typescript/__tests__/CheckboxWithLabel-test.tsx|1✅|||227ms|
-|examples/typescript/__tests__/sub-test.ts|1✅|||43ms|
-|examples/typescript/__tests__/sum-test.ts|2✅|||69ms|
-|examples/typescript/__tests__/sum.test.js|2✅|||100ms|
-|packages/babel-jest/src/__tests__/index.ts|6✅|||371ms|
-|packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.test.ts|4✅|||347ms|
-|packages/diff-sequences/src/__tests__/index.property.test.ts|7✅|||357ms|
-|packages/diff-sequences/src/__tests__/index.test.ts|48✅|||195ms|
-|packages/expect/src/__tests__/assertionCounts.test.ts|6✅|||60ms|
-|packages/expect/src/__tests__/asymmetricMatchers.test.ts|38✅|||207ms|
-|packages/expect/src/__tests__/extend.test.ts|10✅|||99ms|
-|packages/expect/src/__tests__/isError.test.ts|4✅|||43ms|
-|packages/expect/src/__tests__/matchers-toContain.property.test.ts|2✅|||236ms|
-|packages/expect/src/__tests__/matchers-toContainEqual.property.test.ts|2✅|||287ms|
-|packages/expect/src/__tests__/matchers-toEqual.property.test.ts|2✅|||1s|
-|packages/expect/src/__tests__/matchers-toStrictEqual.property.test.ts|3✅|||394ms|
-|packages/expect/src/__tests__/matchers.test.js|592✅|||862ms|
-|packages/expect/src/__tests__/spyMatchers.test.ts|248✅|||395ms|
-|packages/expect/src/__tests__/stacktrace.test.ts|3✅|||69ms|
-|packages/expect/src/__tests__/symbolInObjects.test.ts|3✅|||33ms|
-|packages/expect/src/__tests__/toEqual-dom.test.ts|12✅|||99ms|
-|packages/expect/src/__tests__/toThrowMatchers.test.ts|98✅|||257ms|
-|packages/expect/src/__tests__/utils.test.ts|41✅|||147ms|
-|packages/jest-circus/src/__tests__/afterAll.test.ts|6✅|||6s|
-|packages/jest-circus/src/__tests__/baseTest.test.ts|2✅|||3s|
-|packages/jest-circus/src/__tests__/circusItTestError.test.ts|8✅|||300ms|
-|packages/jest-circus/src/__tests__/circusItTodoTestError.test.ts|3✅|||81ms|
-|packages/jest-circus/src/__tests__/hooks.test.ts|3✅|||4s|
-|packages/jest-circus/src/__tests__/hooksError.test.ts|32✅|||127ms|
-|packages/jest-cli/src/__tests__/cli/args.test.ts|17✅|||345ms|
-|packages/jest-cli/src/init/__tests__/init.test.js|24✅|||119ms|
-|packages/jest-cli/src/init/__tests__/modifyPackageJson.test.ts|4✅|||30ms|
-|packages/jest-config/src/__tests__/Defaults.test.ts|1✅|||672ms|
-|packages/jest-config/src/__tests__/getMaxWorkers.test.ts|7✅|||67ms|
-|packages/jest-config/src/__tests__/normalize.test.js|118✅|||798ms|
-|packages/jest-config/src/__tests__/readConfig.test.ts|1✅|||76ms|
-|packages/jest-config/src/__tests__/readConfigs.test.ts|3✅|||135ms|
-|packages/jest-config/src/__tests__/resolveConfigPath.test.ts|10✅|||183ms|
-|packages/jest-config/src/__tests__/setFromArgv.test.ts|4✅|||53ms|
-|packages/jest-config/src/__tests__/validatePattern.test.ts|4✅|||52ms|
-|packages/jest-console/src/__tests__/bufferedConsole.test.ts|20✅|||171ms|
-|packages/jest-console/src/__tests__/CustomConsole.test.ts|23✅|||115ms|
-|packages/jest-console/src/__tests__/getConsoleOutput.test.ts|12✅|||56ms|
-|packages/jest-core/src/__tests__/FailedTestsCache.test.js|1✅|||25ms|
-|packages/jest-core/src/__tests__/getNoTestsFoundMessage.test.js|5✅|||61ms|
-|packages/jest-core/src/__tests__/globals.test.ts|1✅|||22ms|
-|packages/jest-core/src/__tests__/runJest.test.js|2✅|||261ms|
-|packages/jest-core/src/__tests__/SearchSource.test.ts|27✅|||3s|
-|packages/jest-core/src/__tests__/SnapshotInteractiveMode.test.js|13✅|||89ms|
-|packages/jest-core/src/__tests__/TestScheduler.test.js|8✅|||520ms|
-|packages/jest-core/src/__tests__/testSchedulerHelper.test.js|12✅|||48ms|
-|packages/jest-core/src/__tests__/watch.test.js|80✅|||7s|
-|packages/jest-core/src/__tests__/watchFileChanges.test.ts|1✅|||2s|
-|packages/jest-core/src/__tests__/watchFilenamePatternMode.test.js|2✅|||165ms|
-|packages/jest-core/src/__tests__/watchTestNamePatternMode.test.js|1✅|||246ms|
-|packages/jest-core/src/lib/__tests__/isValidPath.test.ts|3✅|||166ms|
-|packages/jest-core/src/lib/__tests__/logDebugMessages.test.ts|3✅|||48ms|
-|packages/jest-create-cache-key-function/src/__tests__/index.test.ts|1✅|||75ms|
-|packages/jest-diff/src/__tests__/diff.test.ts|107✅|||625ms|
-|packages/jest-diff/src/__tests__/diffStringsRaw.test.ts|2✅|||55ms|
-|packages/jest-diff/src/__tests__/getAlignedDiffs.test.ts|24✅|||72ms|
-|packages/jest-diff/src/__tests__/joinAlignedDiffs.test.ts|6✅|||44ms|
-|packages/jest-docblock/src/__tests__/index.test.ts|36✅|||177ms|
-|packages/jest-each/src/__tests__/array.test.ts|159✅|||192ms|
-|packages/jest-each/src/__tests__/index.test.ts|10✅|||44ms|
-|packages/jest-each/src/__tests__/template.test.ts|242✅|||483ms|
-|packages/jest-environment-jsdom/src/__tests__/jsdom_environment.test.ts|2✅|||783ms|
-|packages/jest-environment-node/src/__tests__/node_environment.test.ts|6✅|||184ms|
-|packages/jest-fake-timers/src/__tests__/legacyFakeTimers.test.ts|50✅|||302ms|
-|packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts|40✅|||317ms|
-|packages/jest-get-type/src/__tests__/getType.test.ts|14✅|||45ms|
-|packages/jest-get-type/src/__tests__/isPrimitive.test.ts|18✅|||36ms|
-|packages/jest-globals/src/__tests__/index.ts|1✅|||533ms|
-|packages/jest-haste-map/src/__tests__/get_mock_name.test.js|1✅|||22ms|
-|packages/jest-haste-map/src/__tests__/includes_dotfiles.test.ts|1✅|||337ms|
-|packages/jest-haste-map/src/__tests__/index.test.js|44✅|||1s|
-|packages/jest-haste-map/src/__tests__/worker.test.js|7✅|||100ms|
-|packages/jest-haste-map/src/crawlers/__tests__/node.test.js|10✅|||170ms|
-|packages/jest-haste-map/src/crawlers/__tests__/watchman.test.js|8✅|||153ms|
-|packages/jest-haste-map/src/lib/__tests__/dependencyExtractor.test.js|15✅|||56ms|
-|packages/jest-haste-map/src/lib/__tests__/fast_path.test.js|5✅|||29ms|
-|packages/jest-haste-map/src/lib/__tests__/getPlatformExtension.test.js|1✅|||35ms|
-|packages/jest-haste-map/src/lib/__tests__/isRegExpSupported.test.js|2✅|||31ms|
-|packages/jest-haste-map/src/lib/__tests__/normalizePathSep.test.js|2✅|||35ms|
-|packages/jest-jasmine2/src/__tests__/concurrent.test.ts|3✅|||24ms|
-|packages/jest-jasmine2/src/__tests__/expectationResultFactory.test.ts|7✅|||70ms|
-|packages/jest-jasmine2/src/__tests__/hooksError.test.ts|32✅|||51ms|
-|packages/jest-jasmine2/src/__tests__/iterators.test.ts|4✅|||43ms|
-|packages/jest-jasmine2/src/__tests__/itTestError.test.ts|6✅|||32ms|
-|packages/jest-jasmine2/src/__tests__/itToTestAlias.test.ts|1✅|||23ms|
-|packages/jest-jasmine2/src/__tests__/pTimeout.test.ts|3✅|||44ms|
-|packages/jest-jasmine2/src/__tests__/queueRunner.test.ts|6✅|||93ms|
-|packages/jest-jasmine2/src/__tests__/reporter.test.ts|1✅|||107ms|
-|packages/jest-jasmine2/src/__tests__/Suite.test.ts|1✅|||84ms|
-|packages/jest-jasmine2/src/__tests__/todoError.test.ts|3✅|||27ms|
-|packages/jest-leak-detector/src/__tests__/index.test.ts|6✅|||986ms|
-|packages/jest-matcher-utils/src/__tests__/deepCyclicCopyReplaceable.test.ts|11✅|||49ms|
-|packages/jest-matcher-utils/src/__tests__/deepCyclicCopyReplaceableDom.test.ts|2✅|||48ms|
-|packages/jest-matcher-utils/src/__tests__/index.test.ts|48✅|||391ms|
-|packages/jest-matcher-utils/src/__tests__/printDiffOrStringify.test.ts|21✅|||114ms|
-|packages/jest-matcher-utils/src/__tests__/Replaceable.test.ts|17✅|||111ms|
-|packages/jest-message-util/src/__tests__/messages.test.ts|11✅|||205ms|
-|packages/jest-mock/src/__tests__/index.test.ts|84✅|||509ms|
-|packages/jest-regex-util/src/__tests__/index.test.ts|8✅|||56ms|
-|packages/jest-repl/src/__tests__/jest_repl.test.js|1✅|||1s|
-|packages/jest-repl/src/__tests__/runtime_cli.test.js|4✅|||4s|
-|packages/jest-reporters/src/__tests__/CoverageReporter.test.js|12✅|||397ms|
-|packages/jest-reporters/src/__tests__/CoverageWorker.test.js|2✅|||199ms|
-|packages/jest-reporters/src/__tests__/DefaultReporter.test.js|2✅|||148ms|
-|packages/jest-reporters/src/__tests__/generateEmptyCoverage.test.js|3✅|||1s|
-|packages/jest-reporters/src/__tests__/getResultHeader.test.js|4✅|||30ms|
-|packages/jest-reporters/src/__tests__/getSnapshotStatus.test.js|3✅|||28ms|
-|packages/jest-reporters/src/__tests__/getSnapshotSummary.test.js|4✅|||49ms|
-|packages/jest-reporters/src/__tests__/getWatermarks.test.ts|2✅|||37ms|
-|packages/jest-reporters/src/__tests__/NotifyReporter.test.ts|18✅|||166ms|
-|packages/jest-reporters/src/__tests__/SummaryReporter.test.js|4✅|||366ms|
-|packages/jest-reporters/src/__tests__/utils.test.ts|10✅|||85ms|
-|packages/jest-reporters/src/__tests__/VerboseReporter.test.js|11✅|||425ms|
-|packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts|11✅|||666ms|
-|packages/jest-resolve/src/__tests__/isBuiltinModule.test.ts|4✅|||36ms|
-|packages/jest-resolve/src/__tests__/resolve.test.ts|16✅|||1s|
-|packages/jest-runner/src/__tests__/testRunner.test.ts|2✅|||905ms|
-|packages/jest-runtime/src/__tests__/instrumentation.test.ts|1✅|||275ms|
-|packages/jest-runtime/src/__tests__/runtime_create_mock_from_module.test.js|3✅|||606ms|
-|packages/jest-runtime/src/__tests__/runtime_environment.test.js|2✅|||497ms|
-|packages/jest-runtime/src/__tests__/runtime_internal_module.test.js|4✅|||727ms|
-|packages/jest-runtime/src/__tests__/runtime_jest_fn.js|4✅|||479ms|
-|packages/jest-runtime/src/__tests__/runtime_jest_spy_on.test.js|2✅|||521ms|
-|packages/jest-runtime/src/__tests__/runtime_mock.test.js|4✅|||743ms|
-|packages/jest-runtime/src/__tests__/runtime_module_directories.test.js|4✅|||525ms|
-|packages/jest-runtime/src/__tests__/runtime_node_path.test.js|4✅|||1s|
-|packages/jest-runtime/src/__tests__/runtime_require_actual.test.js|2✅|||478ms|
-|packages/jest-runtime/src/__tests__/runtime_require_cache.test.js|2✅|||454ms|
-|packages/jest-runtime/src/__tests__/runtime_require_mock.test.js|13✅|||962ms|
-|packages/jest-runtime/src/__tests__/runtime_require_module_no_ext.test.js|1✅|||261ms|
-|packages/jest-runtime/src/__tests__/runtime_require_module_or_mock_transitive_deps.test.js|6✅|||2s|
-|packages/jest-runtime/src/__tests__/runtime_require_module_or_mock.test.js|17✅|||1s|
-|packages/jest-runtime/src/__tests__/runtime_require_module.test.js|27✅|||2s|
-|packages/jest-runtime/src/__tests__/runtime_require_resolve.test.ts|5✅|||707ms|
-|packages/jest-runtime/src/__tests__/runtime_wrap.js|2✅|||263ms|
-|packages/jest-runtime/src/__tests__/Runtime-sourceMaps.test.js|1✅|||584ms|
-|packages/jest-runtime/src/__tests__/Runtime-statics.test.js|2✅|||162ms|
-|packages/jest-serializer/src/__tests__/index.test.ts|17✅|||158ms|
-|packages/jest-snapshot/src/__tests__/dedentLines.test.ts|17✅|||94ms|
-|packages/jest-snapshot/src/__tests__/InlineSnapshots.test.ts|22✅|||1s|
-|packages/jest-snapshot/src/__tests__/matcher.test.ts|1✅|||131ms|
-|packages/jest-snapshot/src/__tests__/mockSerializer.test.ts|10✅|||45ms|
-|packages/jest-snapshot/src/__tests__/printSnapshot.test.ts|71✅|||1s|
-|packages/jest-snapshot/src/__tests__/SnapshotResolver.test.ts|10✅|||98ms|
-|packages/jest-snapshot/src/__tests__/throwMatcher.test.ts|3✅|||481ms|
-|packages/jest-snapshot/src/__tests__/utils.test.ts|26✅|||214ms|
-|packages/jest-source-map/src/__tests__/getCallsite.test.ts|3✅|||86ms|
-|packages/jest-test-result/src/__tests__/formatTestResults.test.ts|1✅|||53ms|
-|packages/jest-test-sequencer/src/__tests__/test_sequencer.test.js|8✅|||251ms|
-|packages/jest-transform/src/__tests__/ScriptTransformer.test.ts|22✅|||2s|
-|packages/jest-transform/src/__tests__/shouldInstrument.test.ts|25✅|||155ms|
-|packages/jest-util/src/__tests__/createProcessObject.test.ts|4✅|||81ms|
-|packages/jest-util/src/__tests__/deepCyclicCopy.test.ts|12✅|||86ms|
-|packages/jest-util/src/__tests__/errorWithStack.test.ts|1✅|||41ms|
-|packages/jest-util/src/__tests__/formatTime.test.ts|11✅|||82ms|
-|packages/jest-util/src/__tests__/globsToMatcher.test.ts|4✅|||56ms|
-|packages/jest-util/src/__tests__/installCommonGlobals.test.ts|2✅|||68ms|
-|packages/jest-util/src/__tests__/isInteractive.test.ts|2✅|||35ms|
-|packages/jest-util/src/__tests__/isPromise.test.ts|10✅|||30ms|
-|packages/jest-validate/src/__tests__/validate.test.ts|23✅|||283ms|
-|packages/jest-validate/src/__tests__/validateCLIOptions.test.js|6✅|||83ms|
-|packages/jest-watcher/src/lib/__tests__/formatTestNameByPattern.test.ts|11✅|||129ms|
-|packages/jest-watcher/src/lib/__tests__/prompt.test.ts|3✅|||91ms|
-|packages/jest-watcher/src/lib/__tests__/scroll.test.ts|5✅|||57ms|
-|packages/jest-worker/src/__tests__/Farm.test.js|10✅|||158ms|
-|packages/jest-worker/src/__tests__/FifoQueue.test.js|3✅|||48ms|
-|packages/jest-worker/src/__tests__/index.test.js|8✅|||230ms|
-|packages/jest-worker/src/__tests__/PriorityQueue.test.js|5✅|||63ms|
-|packages/jest-worker/src/__tests__/process-integration.test.js|5✅|||62ms|
-|packages/jest-worker/src/__tests__/thread-integration.test.js|6✅|||114ms|
-|packages/jest-worker/src/__tests__/WorkerPool.test.js|3✅|||51ms|
-|packages/jest-worker/src/base/__tests__/BaseWorkerPool.test.js|11✅|||653ms|
-|packages/jest-worker/src/workers/__tests__/ChildProcessWorker.test.js|17✅|||184ms|
-|packages/jest-worker/src/workers/__tests__/NodeThreadsWorker.test.js|15✅|||258ms|
-|packages/jest-worker/src/workers/__tests__/processChild.test.js|10✅|||135ms|
-|packages/jest-worker/src/workers/__tests__/threadChild.test.js|10✅|||120ms|
-|packages/pretty-format/src/__tests__/AsymmetricMatcher.test.ts|38✅|||137ms|
-|packages/pretty-format/src/__tests__/ConvertAnsi.test.ts|6✅|||43ms|
-|packages/pretty-format/src/__tests__/DOMCollection.test.ts|10✅|||64ms|
-|packages/pretty-format/src/__tests__/DOMElement.test.ts|28✅|||148ms|
-|packages/pretty-format/src/__tests__/Immutable.test.ts|111✅|||443ms|
-|packages/pretty-format/src/__tests__/prettyFormat.test.ts|86✅|||219ms|
-|packages/pretty-format/src/__tests__/react.test.tsx|55✅|||325ms|
-|packages/pretty-format/src/__tests__/ReactElement.test.ts|3✅|||64ms|
-### ❌ e2e/__tests__/jestChangedFiles.test.ts
+|[e2e/__tests__/asyncAndCallback.test.ts](#user-content-r0s0)|1 ✅|||746ms|
+|[e2e/__tests__/asyncRegenerator.test.ts](#user-content-r0s1)|1 ✅|||4s|
+|[e2e/__tests__/autoClearMocks.test.ts](#user-content-r0s2)|2 ✅|||2s|
+|[e2e/__tests__/autoResetMocks.test.ts](#user-content-r0s3)|2 ✅|||2s|
+|[e2e/__tests__/autoRestoreMocks.test.ts](#user-content-r0s4)|2 ✅|||2s|
+|[e2e/__tests__/babelPluginJestHoist.test.ts](#user-content-r0s5)|1 ✅|||6s|
+|[e2e/__tests__/badSourceMap.test.ts](#user-content-r0s6)|1 ✅|||858ms|
+|[e2e/__tests__/beforeAllFiltered.ts](#user-content-r0s7)|1 ✅|||958ms|
+|[e2e/__tests__/beforeEachQueue.ts](#user-content-r0s8)|1 ✅||1 ⚪|55ms|
+|[e2e/__tests__/callDoneTwice.test.ts](#user-content-r0s9)|1 ✅|||882ms|
+|[e2e/__tests__/chaiAssertionLibrary.ts](#user-content-r0s10)|1 ✅|||2s|
+|[e2e/__tests__/circularInequality.test.ts](#user-content-r0s11)|1 ✅|||1s|
+|[e2e/__tests__/circusConcurrentEach.test.ts](#user-content-r0s12)|2 ✅|||2s|
+|[e2e/__tests__/circusDeclarationErrors.test.ts](#user-content-r0s13)|1 ✅|||869ms|
+|[e2e/__tests__/clearCache.test.ts](#user-content-r0s14)|2 ✅|||1s|
+|[e2e/__tests__/cliHandlesExactFilenames.test.ts](#user-content-r0s15)|2 ✅|||1s|
+|[e2e/__tests__/compareDomNodes.test.ts](#user-content-r0s16)|1 ✅|||1s|
+|[e2e/__tests__/config.test.ts](#user-content-r0s17)|6 ✅|||4s|
+|[e2e/__tests__/console.test.ts](#user-content-r0s18)|7 ✅|||8s|
+|[e2e/__tests__/consoleAfterTeardown.test.ts](#user-content-r0s19)|1 ✅|||1s|
+|[e2e/__tests__/consoleLogOutputWhenRunInBand.test.ts](#user-content-r0s20)|1 ✅|||793ms|
+|[e2e/__tests__/coverageHandlebars.test.ts](#user-content-r0s21)|1 ✅|||2s|
+|[e2e/__tests__/coverageRemapping.test.ts](#user-content-r0s22)|1 ✅|||13s|
+|[e2e/__tests__/coverageReport.test.ts](#user-content-r0s23)|12 ✅|||22s|
+|[e2e/__tests__/coverageThreshold.test.ts](#user-content-r0s24)|5 ✅|||5s|
+|[e2e/__tests__/coverageTransformInstrumented.test.ts](#user-content-r0s25)|1 ✅|||5s|
+|[e2e/__tests__/coverageWithoutTransform.test.ts](#user-content-r0s26)|1 ✅|||1s|
+|[e2e/__tests__/createProcessObject.test.ts](#user-content-r0s27)|1 ✅|||908ms|
+|[e2e/__tests__/customInlineSnapshotMatchers.test.ts](#user-content-r0s28)|1 ✅|||2s|
+|[e2e/__tests__/customMatcherStackTrace.test.ts](#user-content-r0s29)|2 ✅|||2s|
+|[e2e/__tests__/customReporters.test.ts](#user-content-r0s30)|9 ✅|||7s|
+|[e2e/__tests__/customResolver.test.ts](#user-content-r0s31)|1 ✅|||826ms|
+|[e2e/__tests__/customTestSequencers.test.ts](#user-content-r0s32)|3 ✅|||3s|
+|[e2e/__tests__/debug.test.ts](#user-content-r0s33)|1 ✅|||899ms|
+|[e2e/__tests__/declarationErrors.test.ts](#user-content-r0s34)|3 ✅|||2s|
+|[e2e/__tests__/dependencyClash.test.ts](#user-content-r0s35)|1 ✅|||833ms|
+|[e2e/__tests__/detectOpenHandles.ts](#user-content-r0s36)|8 ✅|||8s|
+|[e2e/__tests__/domDiffing.test.ts](#user-content-r0s37)|1 ✅|||1s|
+|[e2e/__tests__/doneInHooks.test.ts](#user-content-r0s38)|1 ✅|||855ms|
+|[e2e/__tests__/dynamicRequireDependencies.ts](#user-content-r0s39)|1 ✅|||847ms|
+|[e2e/__tests__/each.test.ts](#user-content-r0s40)|7 ✅|||5s|
+|[e2e/__tests__/emptyDescribeWithHooks.test.ts](#user-content-r0s41)|4 ✅|||3s|
+|[e2e/__tests__/emptySuiteError.test.ts](#user-content-r0s42)|1 ✅|||885ms|
+|[e2e/__tests__/env.test.ts](#user-content-r0s43)|6 ✅|||5s|
+|[e2e/__tests__/environmentAfterTeardown.test.ts](#user-content-r0s44)|1 ✅|||892ms|
+|[e2e/__tests__/errorOnDeprecated.test.ts](#user-content-r0s45)|1 ✅||24 ⚪|56ms|
+|[e2e/__tests__/esmConfigFile.test.ts](#user-content-r0s46)|3 ✅|||526ms|
+|[e2e/__tests__/executeTestsOnceInMpr.ts](#user-content-r0s47)|1 ✅|||976ms|
+|[e2e/__tests__/existentRoots.test.ts](#user-content-r0s48)|4 ✅|||627ms|
+|[e2e/__tests__/expectAsyncMatcher.test.ts](#user-content-r0s49)|2 ✅|||3s|
+|[e2e/__tests__/expectInVm.test.ts](#user-content-r0s50)|1 ✅|||2s|
+|[e2e/__tests__/extraGlobals.test.ts](#user-content-r0s51)|1 ✅|||1s|
+|[e2e/__tests__/failureDetailsProperty.test.ts](#user-content-r0s52)|1 ✅|||907ms|
+|[e2e/__tests__/failures.test.ts](#user-content-r0s53)|7 ✅|||10s|
+|[e2e/__tests__/fakePromises.test.ts](#user-content-r0s54)|2 ✅|||2s|
+|[e2e/__tests__/fatalWorkerError.test.ts](#user-content-r0s55)|1 ✅|||3s|
+|[e2e/__tests__/filter.test.ts](#user-content-r0s56)|7 ✅|||5s|
+|[e2e/__tests__/findRelatedFiles.test.ts](#user-content-r0s57)|5 ✅|||6s|
+|[e2e/__tests__/focusedTests.test.ts](#user-content-r0s58)|1 ✅|||888ms|
+|[e2e/__tests__/forceExit.test.ts](#user-content-r0s59)|1 ✅|||2s|
+|[e2e/__tests__/generatorMock.test.ts](#user-content-r0s60)|1 ✅|||1s|
+|[e2e/__tests__/global-mutation.test.ts](#user-content-r0s61)|1 ✅|||40ms|
+|[e2e/__tests__/global.test.ts](#user-content-r0s62)|1 ✅|||31ms|
+|[e2e/__tests__/globals.test.ts](#user-content-r0s63)|10 ✅|||8s|
+|[e2e/__tests__/globalSetup.test.ts](#user-content-r0s64)|10 ✅|||14s|
+|[e2e/__tests__/globalTeardown.test.ts](#user-content-r0s65)|7 ✅|||12s|
+|[e2e/__tests__/hasteMapMockChanged.test.ts](#user-content-r0s66)|1 ✅|||379ms|
+|[e2e/__tests__/hasteMapSha1.test.ts](#user-content-r0s67)|1 ✅|||298ms|
+|[e2e/__tests__/hasteMapSize.test.ts](#user-content-r0s68)|2 ✅|||397ms|
+|[e2e/__tests__/importedGlobals.test.ts](#user-content-r0s69)|1 ✅|||1s|
+|[e2e/__tests__/injectGlobals.test.ts](#user-content-r0s70)|2 ✅|||2s|
+|[e2e/__tests__/jasmineAsync.test.ts](#user-content-r0s71)|15 ✅|||28s|
+|[e2e/__tests__/jasmineAsyncWithPendingDuringTest.ts](#user-content-r0s72)|1 ✅||1 ⚪|72ms|
+|[e2e/__tests__/jest.config.js.test.ts](#user-content-r0s73)|3 ✅|||2s|
+|[e2e/__tests__/jest.config.ts.test.ts](#user-content-r0s74)|5 ✅|||14s|
+|[e2e/__tests__/jestChangedFiles.test.ts](#user-content-r0s75)|9 ✅|1 ❌||9s|
+|[e2e/__tests__/jestEnvironmentJsdom.test.ts](#user-content-r0s76)|1 ✅|||2s|
+|[e2e/__tests__/jestRequireActual.test.ts](#user-content-r0s77)|1 ✅|||2s|
+|[e2e/__tests__/jestRequireMock.test.ts](#user-content-r0s78)|1 ✅|||2s|
+|[e2e/__tests__/json.test.ts](#user-content-r0s79)|2 ✅|||29ms|
+|[e2e/__tests__/jsonReporter.test.ts](#user-content-r0s80)|2 ✅|||2s|
+|[e2e/__tests__/lifecycles.ts](#user-content-r0s81)|1 ✅|||861ms|
+|[e2e/__tests__/listTests.test.ts](#user-content-r0s82)|2 ✅|||945ms|
+|[e2e/__tests__/locationInResults.test.ts](#user-content-r0s83)|2 ✅|||2s|
+|[e2e/__tests__/logHeapUsage.test.ts](#user-content-r0s84)|1 ✅|||884ms|
+|[e2e/__tests__/mockNames.test.ts](#user-content-r0s85)|8 ✅|||7s|
+|[e2e/__tests__/modernFakeTimers.test.ts](#user-content-r0s86)|2 ✅|||2s|
+|[e2e/__tests__/moduleNameMapper.test.ts](#user-content-r0s87)|5 ✅|||5s|
+|[e2e/__tests__/moduleParentNullInTest.ts](#user-content-r0s88)|1 ✅|||886ms|
+|[e2e/__tests__/multiProjectRunner.test.ts](#user-content-r0s89)|14 ✅|||16s|
+|[e2e/__tests__/nativeAsyncMock.test.ts](#user-content-r0s90)|1 ✅|||55ms|
+|[e2e/__tests__/nativeEsm.test.ts](#user-content-r0s91)|2 ✅||1 ⚪|905ms|
+|[e2e/__tests__/nativeEsmTypescript.test.ts](#user-content-r0s92)|1 ✅|||956ms|
+|[e2e/__tests__/nestedEventLoop.test.ts](#user-content-r0s93)|1 ✅|||1s|
+|[e2e/__tests__/nestedTestDefinitions.test.ts](#user-content-r0s94)|4 ✅|||5s|
+|[e2e/__tests__/nodePath.test.ts](#user-content-r0s95)|1 ✅|||866ms|
+|[e2e/__tests__/noTestFound.test.ts](#user-content-r0s96)|2 ✅|||1s|
+|[e2e/__tests__/noTestsFound.test.ts](#user-content-r0s97)|5 ✅|||3s|
+|[e2e/__tests__/onlyChanged.test.ts](#user-content-r0s98)|8 ✅|1 ❌||22s|
+|[e2e/__tests__/onlyFailuresNonWatch.test.ts](#user-content-r0s99)|1 ✅|||3s|
+|[e2e/__tests__/overrideGlobals.test.ts](#user-content-r0s100)|2 ✅|||2s|
+|[e2e/__tests__/pnp.test.ts](#user-content-r0s101)|1 ✅|||3s|
+|[e2e/__tests__/presets.test.ts](#user-content-r0s102)|2 ✅|||2s|
+|[e2e/__tests__/processExit.test.ts](#user-content-r0s103)|1 ✅|||1s|
+|[e2e/__tests__/promiseReject.test.ts](#user-content-r0s104)|1 ✅|||967ms|
+|[e2e/__tests__/regexCharInPath.test.ts](#user-content-r0s105)|1 ✅|||962ms|
+|[e2e/__tests__/requireAfterTeardown.test.ts](#user-content-r0s106)|1 ✅|||921ms|
+|[e2e/__tests__/requireMain.test.ts](#user-content-r0s107)|1 ✅|||1s|
+|[e2e/__tests__/requireMainAfterCreateRequire.test.ts](#user-content-r0s108)|1 ✅|||966ms|
+|[e2e/__tests__/requireMainIsolateModules.test.ts](#user-content-r0s109)|1 ✅|||976ms|
+|[e2e/__tests__/requireMainResetModules.test.ts](#user-content-r0s110)|2 ✅|||2s|
+|[e2e/__tests__/requireV8Module.test.ts](#user-content-r0s111)|1 ✅|||30ms|
+|[e2e/__tests__/resetModules.test.ts](#user-content-r0s112)|1 ✅|||926ms|
+|[e2e/__tests__/resolve.test.ts](#user-content-r0s113)|1 ✅|||2s|
+|[e2e/__tests__/resolveGetPaths.test.ts](#user-content-r0s114)|1 ✅|||1s|
+|[e2e/__tests__/resolveNodeModule.test.ts](#user-content-r0s115)|1 ✅|||943ms|
+|[e2e/__tests__/resolveNoFileExtensions.test.ts](#user-content-r0s116)|2 ✅|||1s|
+|[e2e/__tests__/resolveWithPaths.test.ts](#user-content-r0s117)|1 ✅|||1s|
+|[e2e/__tests__/runProgrammatically.test.ts](#user-content-r0s118)|2 ✅|||575ms|
+|[e2e/__tests__/runTestsByPath.test.ts](#user-content-r0s119)|1 ✅|||2s|
+|[e2e/__tests__/runtimeInternalModuleRegistry.test.ts](#user-content-r0s120)|1 ✅|||1s|
+|[e2e/__tests__/selectProjects.test.ts](#user-content-r0s121)|18 ✅|||5s|
+|[e2e/__tests__/setImmediate.test.ts](#user-content-r0s122)|1 ✅|||904ms|
+|[e2e/__tests__/setupFilesAfterEnvConfig.test.ts](#user-content-r0s123)|2 ✅|||2s|
+|[e2e/__tests__/showConfig.test.ts](#user-content-r0s124)|1 ✅|||195ms|
+|[e2e/__tests__/skipBeforeAfterAll.test.ts](#user-content-r0s125)|1 ✅|||1s|
+|[e2e/__tests__/snapshot-unknown.test.ts](#user-content-r0s126)|1 ✅|||838ms|
+|[e2e/__tests__/snapshot.test.ts](#user-content-r0s127)|9 ✅|||14s|
+|[e2e/__tests__/snapshotMockFs.test.ts](#user-content-r0s128)|1 ✅|||883ms|
+|[e2e/__tests__/snapshotResolver.test.ts](#user-content-r0s129)|1 ✅|||823ms|
+|[e2e/__tests__/snapshotSerializers.test.ts](#user-content-r0s130)|2 ✅|||2s|
+|[e2e/__tests__/stackTrace.test.ts](#user-content-r0s131)|7 ✅|||5s|
+|[e2e/__tests__/stackTraceNoCaptureStackTrace.test.ts](#user-content-r0s132)|1 ✅|||899ms|
+|[e2e/__tests__/stackTraceSourceMaps.test.ts](#user-content-r0s133)|1 ✅|||2s|
+|[e2e/__tests__/stackTraceSourceMapsWithCoverage.test.ts](#user-content-r0s134)|1 ✅|||2s|
+|[e2e/__tests__/supportsDashedArgs.ts](#user-content-r0s135)|2 ✅|||968ms|
+|[e2e/__tests__/symbol.test.ts](#user-content-r0s136)|1 ✅|||49ms|
+|[e2e/__tests__/testEnvironment.test.ts](#user-content-r0s137)|1 ✅|||2s|
+|[e2e/__tests__/testEnvironmentAsync.test.ts](#user-content-r0s138)|1 ✅|||1s|
+|[e2e/__tests__/testEnvironmentCircus.test.ts](#user-content-r0s139)|1 ✅|||2s|
+|[e2e/__tests__/testEnvironmentCircusAsync.test.ts](#user-content-r0s140)|1 ✅|||2s|
+|[e2e/__tests__/testFailureExitCode.test.ts](#user-content-r0s141)|2 ✅|||4s|
+|[e2e/__tests__/testInRoot.test.ts](#user-content-r0s142)|1 ✅|||1s|
+|[e2e/__tests__/testNamePattern.test.ts](#user-content-r0s143)|1 ✅|||859ms|
+|[e2e/__tests__/testNamePatternSkipped.test.ts](#user-content-r0s144)|1 ✅|||991ms|
+|[e2e/__tests__/testPathPatternReporterMessage.test.ts](#user-content-r0s145)|1 ✅|||3s|
+|[e2e/__tests__/testResultsProcessor.test.ts](#user-content-r0s146)|1 ✅|||910ms|
+|[e2e/__tests__/testRetries.test.ts](#user-content-r0s147)|4 ✅|||3s|
+|[e2e/__tests__/testTodo.test.ts](#user-content-r0s148)|5 ✅|||4s|
+|[e2e/__tests__/timeouts.test.ts](#user-content-r0s149)|4 ✅|||4s|
+|[e2e/__tests__/timeoutsLegacy.test.ts](#user-content-r0s150)|1 ✅||3 ⚪|71ms|
+|[e2e/__tests__/timerResetMocks.test.ts](#user-content-r0s151)|2 ✅|||2s|
+|[e2e/__tests__/timerUseRealTimers.test.ts](#user-content-r0s152)|1 ✅|||1s|
+|[e2e/__tests__/toMatchInlineSnapshot.test.ts](#user-content-r0s153)|12 ✅|||24s|
+|[e2e/__tests__/toMatchInlineSnapshotWithRetries.test.ts](#user-content-r0s154)|3 ✅|||5s|
+|[e2e/__tests__/toMatchSnapshot.test.ts](#user-content-r0s155)|9 ✅|||17s|
+|[e2e/__tests__/toMatchSnapshotWithRetries.test.ts](#user-content-r0s156)|2 ✅|||4s|
+|[e2e/__tests__/toMatchSnapshotWithStringSerializer.test.ts](#user-content-r0s157)|3 ✅|||4s|
+|[e2e/__tests__/toThrowErrorMatchingInlineSnapshot.test.ts](#user-content-r0s158)|4 ✅|||4s|
+|[e2e/__tests__/toThrowErrorMatchingSnapshot.test.ts](#user-content-r0s159)|5 ✅|||4s|
+|[e2e/__tests__/transform.test.ts](#user-content-r0s160)|16 ✅|||27s|
+|[e2e/__tests__/transformLinkedModules.test.ts](#user-content-r0s161)|1 ✅|||783ms|
+|[e2e/__tests__/typescriptCoverage.test.ts](#user-content-r0s162)|1 ✅|||3s|
+|[e2e/__tests__/unexpectedToken.test.ts](#user-content-r0s163)|3 ✅|||3s|
+|[e2e/__tests__/useStderr.test.ts](#user-content-r0s164)|1 ✅|||1s|
+|[e2e/__tests__/v8Coverage.test.ts](#user-content-r0s165)|2 ✅|||2s|
+|[e2e/__tests__/verbose.test.ts](#user-content-r0s166)|1 ✅|||683ms|
+|[e2e/__tests__/version.test.ts](#user-content-r0s167)|1 ✅|||138ms|
+|[e2e/__tests__/watchModeNoAccess.test.ts](#user-content-r0s168)|1 ✅|||4s|
+|[e2e/__tests__/watchModeOnlyFailed.test.ts](#user-content-r0s169)|1 ✅|||1s|
+|[e2e/__tests__/watchModePatterns.test.ts](#user-content-r0s170)|2 ✅|||4s|
+|[e2e/__tests__/watchModeUpdateSnapshot.test.ts](#user-content-r0s171)|1 ✅|||1s|
+|[e2e/__tests__/workerForceExit.test.ts](#user-content-r0s172)|2 ✅|||5s|
+|[e2e/__tests__/wrongEnv.test.ts](#user-content-r0s173)|5 ✅|||4s|
+|[e2e/custom-test-sequencer/a.test.js](#user-content-r0s174)|1 ✅|||29ms|
+|[e2e/custom-test-sequencer/b.test.js](#user-content-r0s175)|1 ✅|||21ms|
+|[e2e/custom-test-sequencer/c.test.js](#user-content-r0s176)|1 ✅|||42ms|
+|[e2e/custom-test-sequencer/d.test.js](#user-content-r0s177)|1 ✅|||21ms|
+|[e2e/custom-test-sequencer/e.test.js](#user-content-r0s178)|1 ✅|||27ms|
+|[e2e/test-in-root/spec.js](#user-content-r0s179)|1 ✅|||19ms|
+|[e2e/test-in-root/test.js](#user-content-r0s180)|1 ✅|||37ms|
+|[e2e/timer-reset-mocks/after-reset-all-mocks/timerAndMock.test.js](#user-content-r0s181)|2 ✅|||30ms|
+|[e2e/timer-reset-mocks/with-reset-mocks/timerWithMock.test.js](#user-content-r0s182)|1 ✅|||34ms|
+|[e2e/v8-coverage/empty-sourcemap/test.ts](#user-content-r0s183)|1 ✅|||31ms|
+|[examples/angular/app.component.spec.ts](#user-content-r0s184)|3 ✅|||654ms|
+|[examples/angular/shared/data.service.spec.ts](#user-content-r0s185)|2 ✅|||431ms|
+|[examples/angular/shared/sub.service.spec.ts](#user-content-r0s186)|1 ✅|||109ms|
+|[examples/async/__tests__/user.test.js](#user-content-r0s187)|8 ✅|||96ms|
+|[examples/automatic-mocks/__tests__/automock.test.js](#user-content-r0s188)|2 ✅|||74ms|
+|[examples/automatic-mocks/__tests__/createMockFromModule.test.js](#user-content-r0s189)|2 ✅|||115ms|
+|[examples/automatic-mocks/__tests__/disableAutomocking.test.js](#user-content-r0s190)|1 ✅|||24ms|
+|[examples/enzyme/__tests__/CheckboxWithLabel-test.js](#user-content-r0s191)|1 ✅|||434ms|
+|[examples/getting-started/sum.test.js](#user-content-r0s192)|1 ✅|||78ms|
+|[examples/jquery/__tests__/display_user.test.js](#user-content-r0s193)|1 ✅|||196ms|
+|[examples/jquery/__tests__/fetch_current_user.test.js](#user-content-r0s194)|2 ✅|||196ms|
+|[examples/manual-mocks/__tests__/file_summarizer.test.js](#user-content-r0s195)|1 ✅|||87ms|
+|[examples/manual-mocks/__tests__/lodashMocking.test.js](#user-content-r0s196)|1 ✅|||109ms|
+|[examples/manual-mocks/__tests__/user.test.js](#user-content-r0s197)|1 ✅|||41ms|
+|[examples/manual-mocks/__tests__/userMocked.test.js](#user-content-r0s198)|1 ✅|||105ms|
+|[examples/module-mock/__tests__/full_mock.js](#user-content-r0s199)|1 ✅|||60ms|
+|[examples/module-mock/__tests__/mock_per_test.js](#user-content-r0s200)|2 ✅|||116ms|
+|[examples/module-mock/__tests__/partial_mock.js](#user-content-r0s201)|1 ✅|||215ms|
+|[examples/mongodb/__test__/db.test.js](#user-content-r0s202)|1 ✅|||236ms|
+|[examples/react-native/__tests__/intro.test.js](#user-content-r0s203)|4 ✅|||9s|
+|[examples/react-testing-library/__tests__/CheckboxWithLabel-test.js](#user-content-r0s204)|1 ✅|||469ms|
+|[examples/react/__tests__/CheckboxWithLabel-test.js](#user-content-r0s205)|1 ✅|||256ms|
+|[examples/snapshot/__tests__/clock.react.test.js](#user-content-r0s206)|1 ✅|||62ms|
+|[examples/snapshot/__tests__/link.react.test.js](#user-content-r0s207)|4 ✅|||181ms|
+|[examples/timer/__tests__/infinite_timer_game.test.js](#user-content-r0s208)|1 ✅|||94ms|
+|[examples/timer/__tests__/timer_game.test.js](#user-content-r0s209)|3 ✅|||74ms|
+|[examples/typescript/__tests__/calc.test.ts](#user-content-r0s210)|6 ✅|||276ms|
+|[examples/typescript/__tests__/CheckboxWithLabel-test.tsx](#user-content-r0s211)|1 ✅|||227ms|
+|[examples/typescript/__tests__/sub-test.ts](#user-content-r0s212)|1 ✅|||43ms|
+|[examples/typescript/__tests__/sum-test.ts](#user-content-r0s213)|2 ✅|||69ms|
+|[examples/typescript/__tests__/sum.test.js](#user-content-r0s214)|2 ✅|||100ms|
+|[packages/babel-jest/src/__tests__/index.ts](#user-content-r0s215)|6 ✅|||371ms|
+|[packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.test.ts](#user-content-r0s216)|4 ✅|||347ms|
+|[packages/diff-sequences/src/__tests__/index.property.test.ts](#user-content-r0s217)|7 ✅|||357ms|
+|[packages/diff-sequences/src/__tests__/index.test.ts](#user-content-r0s218)|48 ✅|||195ms|
+|[packages/expect/src/__tests__/assertionCounts.test.ts](#user-content-r0s219)|6 ✅|||60ms|
+|[packages/expect/src/__tests__/asymmetricMatchers.test.ts](#user-content-r0s220)|38 ✅|||207ms|
+|[packages/expect/src/__tests__/extend.test.ts](#user-content-r0s221)|10 ✅|||99ms|
+|[packages/expect/src/__tests__/isError.test.ts](#user-content-r0s222)|4 ✅|||43ms|
+|[packages/expect/src/__tests__/matchers-toContain.property.test.ts](#user-content-r0s223)|2 ✅|||236ms|
+|[packages/expect/src/__tests__/matchers-toContainEqual.property.test.ts](#user-content-r0s224)|2 ✅|||287ms|
+|[packages/expect/src/__tests__/matchers-toEqual.property.test.ts](#user-content-r0s225)|2 ✅|||1s|
+|[packages/expect/src/__tests__/matchers-toStrictEqual.property.test.ts](#user-content-r0s226)|3 ✅|||394ms|
+|[packages/expect/src/__tests__/matchers.test.js](#user-content-r0s227)|592 ✅|||862ms|
+|[packages/expect/src/__tests__/spyMatchers.test.ts](#user-content-r0s228)|248 ✅|||395ms|
+|[packages/expect/src/__tests__/stacktrace.test.ts](#user-content-r0s229)|3 ✅|||69ms|
+|[packages/expect/src/__tests__/symbolInObjects.test.ts](#user-content-r0s230)|3 ✅|||33ms|
+|[packages/expect/src/__tests__/toEqual-dom.test.ts](#user-content-r0s231)|12 ✅|||99ms|
+|[packages/expect/src/__tests__/toThrowMatchers.test.ts](#user-content-r0s232)|98 ✅|||257ms|
+|[packages/expect/src/__tests__/utils.test.ts](#user-content-r0s233)|41 ✅|||147ms|
+|[packages/jest-circus/src/__tests__/afterAll.test.ts](#user-content-r0s234)|6 ✅|||6s|
+|[packages/jest-circus/src/__tests__/baseTest.test.ts](#user-content-r0s235)|2 ✅|||3s|
+|[packages/jest-circus/src/__tests__/circusItTestError.test.ts](#user-content-r0s236)|8 ✅|||300ms|
+|[packages/jest-circus/src/__tests__/circusItTodoTestError.test.ts](#user-content-r0s237)|3 ✅|||81ms|
+|[packages/jest-circus/src/__tests__/hooks.test.ts](#user-content-r0s238)|3 ✅|||4s|
+|[packages/jest-circus/src/__tests__/hooksError.test.ts](#user-content-r0s239)|32 ✅|||127ms|
+|[packages/jest-cli/src/__tests__/cli/args.test.ts](#user-content-r0s240)|17 ✅|||345ms|
+|[packages/jest-cli/src/init/__tests__/init.test.js](#user-content-r0s241)|24 ✅|||119ms|
+|[packages/jest-cli/src/init/__tests__/modifyPackageJson.test.ts](#user-content-r0s242)|4 ✅|||30ms|
+|[packages/jest-config/src/__tests__/Defaults.test.ts](#user-content-r0s243)|1 ✅|||672ms|
+|[packages/jest-config/src/__tests__/getMaxWorkers.test.ts](#user-content-r0s244)|7 ✅|||67ms|
+|[packages/jest-config/src/__tests__/normalize.test.js](#user-content-r0s245)|118 ✅|||798ms|
+|[packages/jest-config/src/__tests__/readConfig.test.ts](#user-content-r0s246)|1 ✅|||76ms|
+|[packages/jest-config/src/__tests__/readConfigs.test.ts](#user-content-r0s247)|3 ✅|||135ms|
+|[packages/jest-config/src/__tests__/resolveConfigPath.test.ts](#user-content-r0s248)|10 ✅|||183ms|
+|[packages/jest-config/src/__tests__/setFromArgv.test.ts](#user-content-r0s249)|4 ✅|||53ms|
+|[packages/jest-config/src/__tests__/validatePattern.test.ts](#user-content-r0s250)|4 ✅|||52ms|
+|[packages/jest-console/src/__tests__/bufferedConsole.test.ts](#user-content-r0s251)|20 ✅|||171ms|
+|[packages/jest-console/src/__tests__/CustomConsole.test.ts](#user-content-r0s252)|23 ✅|||115ms|
+|[packages/jest-console/src/__tests__/getConsoleOutput.test.ts](#user-content-r0s253)|12 ✅|||56ms|
+|[packages/jest-core/src/__tests__/FailedTestsCache.test.js](#user-content-r0s254)|1 ✅|||25ms|
+|[packages/jest-core/src/__tests__/getNoTestsFoundMessage.test.js](#user-content-r0s255)|5 ✅|||61ms|
+|[packages/jest-core/src/__tests__/globals.test.ts](#user-content-r0s256)|1 ✅|||22ms|
+|[packages/jest-core/src/__tests__/runJest.test.js](#user-content-r0s257)|2 ✅|||261ms|
+|[packages/jest-core/src/__tests__/SearchSource.test.ts](#user-content-r0s258)|27 ✅|||3s|
+|[packages/jest-core/src/__tests__/SnapshotInteractiveMode.test.js](#user-content-r0s259)|13 ✅|||89ms|
+|[packages/jest-core/src/__tests__/TestScheduler.test.js](#user-content-r0s260)|8 ✅|||520ms|
+|[packages/jest-core/src/__tests__/testSchedulerHelper.test.js](#user-content-r0s261)|12 ✅|||48ms|
+|[packages/jest-core/src/__tests__/watch.test.js](#user-content-r0s262)|80 ✅|||7s|
+|[packages/jest-core/src/__tests__/watchFileChanges.test.ts](#user-content-r0s263)|1 ✅|||2s|
+|[packages/jest-core/src/__tests__/watchFilenamePatternMode.test.js](#user-content-r0s264)|2 ✅|||165ms|
+|[packages/jest-core/src/__tests__/watchTestNamePatternMode.test.js](#user-content-r0s265)|1 ✅|||246ms|
+|[packages/jest-core/src/lib/__tests__/isValidPath.test.ts](#user-content-r0s266)|3 ✅|||166ms|
+|[packages/jest-core/src/lib/__tests__/logDebugMessages.test.ts](#user-content-r0s267)|3 ✅|||48ms|
+|[packages/jest-create-cache-key-function/src/__tests__/index.test.ts](#user-content-r0s268)|1 ✅|||75ms|
+|[packages/jest-diff/src/__tests__/diff.test.ts](#user-content-r0s269)|107 ✅|||625ms|
+|[packages/jest-diff/src/__tests__/diffStringsRaw.test.ts](#user-content-r0s270)|2 ✅|||55ms|
+|[packages/jest-diff/src/__tests__/getAlignedDiffs.test.ts](#user-content-r0s271)|24 ✅|||72ms|
+|[packages/jest-diff/src/__tests__/joinAlignedDiffs.test.ts](#user-content-r0s272)|6 ✅|||44ms|
+|[packages/jest-docblock/src/__tests__/index.test.ts](#user-content-r0s273)|36 ✅|||177ms|
+|[packages/jest-each/src/__tests__/array.test.ts](#user-content-r0s274)|159 ✅|||192ms|
+|[packages/jest-each/src/__tests__/index.test.ts](#user-content-r0s275)|10 ✅|||44ms|
+|[packages/jest-each/src/__tests__/template.test.ts](#user-content-r0s276)|242 ✅|||483ms|
+|[packages/jest-environment-jsdom/src/__tests__/jsdom_environment.test.ts](#user-content-r0s277)|2 ✅|||783ms|
+|[packages/jest-environment-node/src/__tests__/node_environment.test.ts](#user-content-r0s278)|6 ✅|||184ms|
+|[packages/jest-fake-timers/src/__tests__/legacyFakeTimers.test.ts](#user-content-r0s279)|50 ✅|||302ms|
+|[packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts](#user-content-r0s280)|40 ✅|||317ms|
+|[packages/jest-get-type/src/__tests__/getType.test.ts](#user-content-r0s281)|14 ✅|||45ms|
+|[packages/jest-get-type/src/__tests__/isPrimitive.test.ts](#user-content-r0s282)|18 ✅|||36ms|
+|[packages/jest-globals/src/__tests__/index.ts](#user-content-r0s283)|1 ✅|||533ms|
+|[packages/jest-haste-map/src/__tests__/get_mock_name.test.js](#user-content-r0s284)|1 ✅|||22ms|
+|[packages/jest-haste-map/src/__tests__/includes_dotfiles.test.ts](#user-content-r0s285)|1 ✅|||337ms|
+|[packages/jest-haste-map/src/__tests__/index.test.js](#user-content-r0s286)|44 ✅|||1s|
+|[packages/jest-haste-map/src/__tests__/worker.test.js](#user-content-r0s287)|7 ✅|||100ms|
+|[packages/jest-haste-map/src/crawlers/__tests__/node.test.js](#user-content-r0s288)|10 ✅|||170ms|
+|[packages/jest-haste-map/src/crawlers/__tests__/watchman.test.js](#user-content-r0s289)|8 ✅|||153ms|
+|[packages/jest-haste-map/src/lib/__tests__/dependencyExtractor.test.js](#user-content-r0s290)|15 ✅|||56ms|
+|[packages/jest-haste-map/src/lib/__tests__/fast_path.test.js](#user-content-r0s291)|5 ✅|||29ms|
+|[packages/jest-haste-map/src/lib/__tests__/getPlatformExtension.test.js](#user-content-r0s292)|1 ✅|||35ms|
+|[packages/jest-haste-map/src/lib/__tests__/isRegExpSupported.test.js](#user-content-r0s293)|2 ✅|||31ms|
+|[packages/jest-haste-map/src/lib/__tests__/normalizePathSep.test.js](#user-content-r0s294)|2 ✅|||35ms|
+|[packages/jest-jasmine2/src/__tests__/concurrent.test.ts](#user-content-r0s295)|3 ✅|||24ms|
+|[packages/jest-jasmine2/src/__tests__/expectationResultFactory.test.ts](#user-content-r0s296)|7 ✅|||70ms|
+|[packages/jest-jasmine2/src/__tests__/hooksError.test.ts](#user-content-r0s297)|32 ✅|||51ms|
+|[packages/jest-jasmine2/src/__tests__/iterators.test.ts](#user-content-r0s298)|4 ✅|||43ms|
+|[packages/jest-jasmine2/src/__tests__/itTestError.test.ts](#user-content-r0s299)|6 ✅|||32ms|
+|[packages/jest-jasmine2/src/__tests__/itToTestAlias.test.ts](#user-content-r0s300)|1 ✅|||23ms|
+|[packages/jest-jasmine2/src/__tests__/pTimeout.test.ts](#user-content-r0s301)|3 ✅|||44ms|
+|[packages/jest-jasmine2/src/__tests__/queueRunner.test.ts](#user-content-r0s302)|6 ✅|||93ms|
+|[packages/jest-jasmine2/src/__tests__/reporter.test.ts](#user-content-r0s303)|1 ✅|||107ms|
+|[packages/jest-jasmine2/src/__tests__/Suite.test.ts](#user-content-r0s304)|1 ✅|||84ms|
+|[packages/jest-jasmine2/src/__tests__/todoError.test.ts](#user-content-r0s305)|3 ✅|||27ms|
+|[packages/jest-leak-detector/src/__tests__/index.test.ts](#user-content-r0s306)|6 ✅|||986ms|
+|[packages/jest-matcher-utils/src/__tests__/deepCyclicCopyReplaceable.test.ts](#user-content-r0s307)|11 ✅|||49ms|
+|[packages/jest-matcher-utils/src/__tests__/deepCyclicCopyReplaceableDom.test.ts](#user-content-r0s308)|2 ✅|||48ms|
+|[packages/jest-matcher-utils/src/__tests__/index.test.ts](#user-content-r0s309)|48 ✅|||391ms|
+|[packages/jest-matcher-utils/src/__tests__/printDiffOrStringify.test.ts](#user-content-r0s310)|21 ✅|||114ms|
+|[packages/jest-matcher-utils/src/__tests__/Replaceable.test.ts](#user-content-r0s311)|17 ✅|||111ms|
+|[packages/jest-message-util/src/__tests__/messages.test.ts](#user-content-r0s312)|11 ✅|||205ms|
+|[packages/jest-mock/src/__tests__/index.test.ts](#user-content-r0s313)|84 ✅|||509ms|
+|[packages/jest-regex-util/src/__tests__/index.test.ts](#user-content-r0s314)|8 ✅|||56ms|
+|[packages/jest-repl/src/__tests__/jest_repl.test.js](#user-content-r0s315)|1 ✅|||1s|
+|[packages/jest-repl/src/__tests__/runtime_cli.test.js](#user-content-r0s316)|4 ✅|||4s|
+|[packages/jest-reporters/src/__tests__/CoverageReporter.test.js](#user-content-r0s317)|12 ✅|||397ms|
+|[packages/jest-reporters/src/__tests__/CoverageWorker.test.js](#user-content-r0s318)|2 ✅|||199ms|
+|[packages/jest-reporters/src/__tests__/DefaultReporter.test.js](#user-content-r0s319)|2 ✅|||148ms|
+|[packages/jest-reporters/src/__tests__/generateEmptyCoverage.test.js](#user-content-r0s320)|3 ✅|||1s|
+|[packages/jest-reporters/src/__tests__/getResultHeader.test.js](#user-content-r0s321)|4 ✅|||30ms|
+|[packages/jest-reporters/src/__tests__/getSnapshotStatus.test.js](#user-content-r0s322)|3 ✅|||28ms|
+|[packages/jest-reporters/src/__tests__/getSnapshotSummary.test.js](#user-content-r0s323)|4 ✅|||49ms|
+|[packages/jest-reporters/src/__tests__/getWatermarks.test.ts](#user-content-r0s324)|2 ✅|||37ms|
+|[packages/jest-reporters/src/__tests__/NotifyReporter.test.ts](#user-content-r0s325)|18 ✅|||166ms|
+|[packages/jest-reporters/src/__tests__/SummaryReporter.test.js](#user-content-r0s326)|4 ✅|||366ms|
+|[packages/jest-reporters/src/__tests__/utils.test.ts](#user-content-r0s327)|10 ✅|||85ms|
+|[packages/jest-reporters/src/__tests__/VerboseReporter.test.js](#user-content-r0s328)|11 ✅|||425ms|
+|[packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts](#user-content-r0s329)|11 ✅|||666ms|
+|[packages/jest-resolve/src/__tests__/isBuiltinModule.test.ts](#user-content-r0s330)|4 ✅|||36ms|
+|[packages/jest-resolve/src/__tests__/resolve.test.ts](#user-content-r0s331)|16 ✅|||1s|
+|[packages/jest-runner/src/__tests__/testRunner.test.ts](#user-content-r0s332)|2 ✅|||905ms|
+|[packages/jest-runtime/src/__tests__/instrumentation.test.ts](#user-content-r0s333)|1 ✅|||275ms|
+|[packages/jest-runtime/src/__tests__/runtime_create_mock_from_module.test.js](#user-content-r0s334)|3 ✅|||606ms|
+|[packages/jest-runtime/src/__tests__/runtime_environment.test.js](#user-content-r0s335)|2 ✅|||497ms|
+|[packages/jest-runtime/src/__tests__/runtime_internal_module.test.js](#user-content-r0s336)|4 ✅|||727ms|
+|[packages/jest-runtime/src/__tests__/runtime_jest_fn.js](#user-content-r0s337)|4 ✅|||479ms|
+|[packages/jest-runtime/src/__tests__/runtime_jest_spy_on.test.js](#user-content-r0s338)|2 ✅|||521ms|
+|[packages/jest-runtime/src/__tests__/runtime_mock.test.js](#user-content-r0s339)|4 ✅|||743ms|
+|[packages/jest-runtime/src/__tests__/runtime_module_directories.test.js](#user-content-r0s340)|4 ✅|||525ms|
+|[packages/jest-runtime/src/__tests__/runtime_node_path.test.js](#user-content-r0s341)|4 ✅|||1s|
+|[packages/jest-runtime/src/__tests__/runtime_require_actual.test.js](#user-content-r0s342)|2 ✅|||478ms|
+|[packages/jest-runtime/src/__tests__/runtime_require_cache.test.js](#user-content-r0s343)|2 ✅|||454ms|
+|[packages/jest-runtime/src/__tests__/runtime_require_mock.test.js](#user-content-r0s344)|13 ✅|||962ms|
+|[packages/jest-runtime/src/__tests__/runtime_require_module_no_ext.test.js](#user-content-r0s345)|1 ✅|||261ms|
+|[packages/jest-runtime/src/__tests__/runtime_require_module_or_mock_transitive_deps.test.js](#user-content-r0s346)|6 ✅|||2s|
+|[packages/jest-runtime/src/__tests__/runtime_require_module_or_mock.test.js](#user-content-r0s347)|17 ✅|||1s|
+|[packages/jest-runtime/src/__tests__/runtime_require_module.test.js](#user-content-r0s348)|27 ✅|||2s|
+|[packages/jest-runtime/src/__tests__/runtime_require_resolve.test.ts](#user-content-r0s349)|5 ✅|||707ms|
+|[packages/jest-runtime/src/__tests__/runtime_wrap.js](#user-content-r0s350)|2 ✅|||263ms|
+|[packages/jest-runtime/src/__tests__/Runtime-sourceMaps.test.js](#user-content-r0s351)|1 ✅|||584ms|
+|[packages/jest-runtime/src/__tests__/Runtime-statics.test.js](#user-content-r0s352)|2 ✅|||162ms|
+|[packages/jest-serializer/src/__tests__/index.test.ts](#user-content-r0s353)|17 ✅|||158ms|
+|[packages/jest-snapshot/src/__tests__/dedentLines.test.ts](#user-content-r0s354)|17 ✅|||94ms|
+|[packages/jest-snapshot/src/__tests__/InlineSnapshots.test.ts](#user-content-r0s355)|22 ✅|||1s|
+|[packages/jest-snapshot/src/__tests__/matcher.test.ts](#user-content-r0s356)|1 ✅|||131ms|
+|[packages/jest-snapshot/src/__tests__/mockSerializer.test.ts](#user-content-r0s357)|10 ✅|||45ms|
+|[packages/jest-snapshot/src/__tests__/printSnapshot.test.ts](#user-content-r0s358)|71 ✅|||1s|
+|[packages/jest-snapshot/src/__tests__/SnapshotResolver.test.ts](#user-content-r0s359)|10 ✅|||98ms|
+|[packages/jest-snapshot/src/__tests__/throwMatcher.test.ts](#user-content-r0s360)|3 ✅|||481ms|
+|[packages/jest-snapshot/src/__tests__/utils.test.ts](#user-content-r0s361)|26 ✅|||214ms|
+|[packages/jest-source-map/src/__tests__/getCallsite.test.ts](#user-content-r0s362)|3 ✅|||86ms|
+|[packages/jest-test-result/src/__tests__/formatTestResults.test.ts](#user-content-r0s363)|1 ✅|||53ms|
+|[packages/jest-test-sequencer/src/__tests__/test_sequencer.test.js](#user-content-r0s364)|8 ✅|||251ms|
+|[packages/jest-transform/src/__tests__/ScriptTransformer.test.ts](#user-content-r0s365)|22 ✅|||2s|
+|[packages/jest-transform/src/__tests__/shouldInstrument.test.ts](#user-content-r0s366)|25 ✅|||155ms|
+|[packages/jest-util/src/__tests__/createProcessObject.test.ts](#user-content-r0s367)|4 ✅|||81ms|
+|[packages/jest-util/src/__tests__/deepCyclicCopy.test.ts](#user-content-r0s368)|12 ✅|||86ms|
+|[packages/jest-util/src/__tests__/errorWithStack.test.ts](#user-content-r0s369)|1 ✅|||41ms|
+|[packages/jest-util/src/__tests__/formatTime.test.ts](#user-content-r0s370)|11 ✅|||82ms|
+|[packages/jest-util/src/__tests__/globsToMatcher.test.ts](#user-content-r0s371)|4 ✅|||56ms|
+|[packages/jest-util/src/__tests__/installCommonGlobals.test.ts](#user-content-r0s372)|2 ✅|||68ms|
+|[packages/jest-util/src/__tests__/isInteractive.test.ts](#user-content-r0s373)|2 ✅|||35ms|
+|[packages/jest-util/src/__tests__/isPromise.test.ts](#user-content-r0s374)|10 ✅|||30ms|
+|[packages/jest-validate/src/__tests__/validate.test.ts](#user-content-r0s375)|23 ✅|||283ms|
+|[packages/jest-validate/src/__tests__/validateCLIOptions.test.js](#user-content-r0s376)|6 ✅|||83ms|
+|[packages/jest-watcher/src/lib/__tests__/formatTestNameByPattern.test.ts](#user-content-r0s377)|11 ✅|||129ms|
+|[packages/jest-watcher/src/lib/__tests__/prompt.test.ts](#user-content-r0s378)|3 ✅|||91ms|
+|[packages/jest-watcher/src/lib/__tests__/scroll.test.ts](#user-content-r0s379)|5 ✅|||57ms|
+|[packages/jest-worker/src/__tests__/Farm.test.js](#user-content-r0s380)|10 ✅|||158ms|
+|[packages/jest-worker/src/__tests__/FifoQueue.test.js](#user-content-r0s381)|3 ✅|||48ms|
+|[packages/jest-worker/src/__tests__/index.test.js](#user-content-r0s382)|8 ✅|||230ms|
+|[packages/jest-worker/src/__tests__/PriorityQueue.test.js](#user-content-r0s383)|5 ✅|||63ms|
+|[packages/jest-worker/src/__tests__/process-integration.test.js](#user-content-r0s384)|5 ✅|||62ms|
+|[packages/jest-worker/src/__tests__/thread-integration.test.js](#user-content-r0s385)|6 ✅|||114ms|
+|[packages/jest-worker/src/__tests__/WorkerPool.test.js](#user-content-r0s386)|3 ✅|||51ms|
+|[packages/jest-worker/src/base/__tests__/BaseWorkerPool.test.js](#user-content-r0s387)|11 ✅|||653ms|
+|[packages/jest-worker/src/workers/__tests__/ChildProcessWorker.test.js](#user-content-r0s388)|17 ✅|||184ms|
+|[packages/jest-worker/src/workers/__tests__/NodeThreadsWorker.test.js](#user-content-r0s389)|15 ✅|||258ms|
+|[packages/jest-worker/src/workers/__tests__/processChild.test.js](#user-content-r0s390)|10 ✅|||135ms|
+|[packages/jest-worker/src/workers/__tests__/threadChild.test.js](#user-content-r0s391)|10 ✅|||120ms|
+|[packages/pretty-format/src/__tests__/AsymmetricMatcher.test.ts](#user-content-r0s392)|38 ✅|||137ms|
+|[packages/pretty-format/src/__tests__/ConvertAnsi.test.ts](#user-content-r0s393)|6 ✅|||43ms|
+|[packages/pretty-format/src/__tests__/DOMCollection.test.ts](#user-content-r0s394)|10 ✅|||64ms|
+|[packages/pretty-format/src/__tests__/DOMElement.test.ts](#user-content-r0s395)|28 ✅|||148ms|
+|[packages/pretty-format/src/__tests__/Immutable.test.ts](#user-content-r0s396)|111 ✅|||443ms|
+|[packages/pretty-format/src/__tests__/prettyFormat.test.ts](#user-content-r0s397)|86 ✅|||219ms|
+|[packages/pretty-format/src/__tests__/react.test.tsx](#user-content-r0s398)|55 ✅|||325ms|
+|[packages/pretty-format/src/__tests__/ReactElement.test.ts](#user-content-r0s399)|3 ✅|||64ms|
+### ✅ e2e/__tests__/asyncAndCallback.test.ts
+```
+✅ errors when a test both returns a promise and takes a callback
+```
+### ✅ e2e/__tests__/asyncRegenerator.test.ts
+```
+✅ successfully transpiles async
+```
+### ✅ e2e/__tests__/autoClearMocks.test.ts
+```
+✅ suite with auto-clear
+✅ suite without auto-clear
+```
+### ✅ e2e/__tests__/autoResetMocks.test.ts
+```
+✅ suite with auto-reset
+✅ suite without auto-reset
+```
+### ✅ e2e/__tests__/autoRestoreMocks.test.ts
+```
+✅ suite with auto-restore
+✅ suite without auto-restore
+```
+### ✅ e2e/__tests__/babelPluginJestHoist.test.ts
+```
+✅ successfully runs the tests inside `babel-plugin-jest-hoist/`
+```
+### ✅ e2e/__tests__/badSourceMap.test.ts
+```
+✅ suite with test cases that contain malformed sourcemaps
+```
+### ✅ e2e/__tests__/beforeAllFiltered.ts
+```
+Correct BeforeAll run
+ ✅ ensures the BeforeAll of ignored suite is not run
+```
+### ✅ e2e/__tests__/beforeEachQueue.ts
+```
+✅ does not work on jest-circus
+Correct beforeEach order
+ ⚪ ensures the correct order for beforeEach
+```
+### ✅ e2e/__tests__/callDoneTwice.test.ts
+```
+✅ `done()` should not be called more than once
+```
+### ✅ e2e/__tests__/chaiAssertionLibrary.ts
+```
+✅ chai assertion errors should display properly
+```
+### ✅ e2e/__tests__/circularInequality.test.ts
+```
+✅ handles circular inequality properly
+```
+### ✅ e2e/__tests__/circusConcurrentEach.test.ts
+```
+✅ works with concurrent.each
+✅ works with concurrent.only.each
+```
+### ✅ e2e/__tests__/circusDeclarationErrors.test.ts
+```
+✅ defining tests and hooks asynchronously throws
+```
+### ✅ e2e/__tests__/clearCache.test.ts
+```
+jest --clearCache
+ ✅ normal run results in cache directory being written
+ ✅ clearCache results in deleted directory and exitCode 0
+```
+### ✅ e2e/__tests__/cliHandlesExactFilenames.test.ts
+```
+✅ CLI accepts exact file names if matchers matched
+✅ CLI skips exact file names if no matchers matched
+```
+### ✅ e2e/__tests__/compareDomNodes.test.ts
+```
+✅ does not crash when expect involving a DOM node fails
+```
+### ✅ e2e/__tests__/config.test.ts
+```
+✅ config as JSON
+✅ works with sane config JSON
+✅ watchman config option is respected over default argv
+✅ config from argv is respected with sane config JSON
+✅ works with jsdom testEnvironmentOptions config JSON
+✅ negated flags override previous flags
+```
+### ✅ e2e/__tests__/console.test.ts
+```
+✅ console printing
+✅ console printing with --verbose
+✅ does not print to console with --silent
+✅ respects --noStackTrace
+✅ respects noStackTrace in config
+✅ the jsdom console is the same as the test console
+✅ does not error out when using winston
+```
+### ✅ e2e/__tests__/consoleAfterTeardown.test.ts
+```
+✅ console printing
+```
+### ✅ e2e/__tests__/consoleLogOutputWhenRunInBand.test.ts
+```
+✅ prints console.logs when run with forceExit
+```
+### ✅ e2e/__tests__/coverageHandlebars.test.ts
+```
+✅ code coverage for Handlebars
+```
+### ✅ e2e/__tests__/coverageRemapping.test.ts
+```
+✅ maps code coverage against original source
+```
+### ✅ e2e/__tests__/coverageReport.test.ts
+```
+✅ outputs coverage report
+✅ collects coverage only from specified file
+✅ collects coverage only from multiple specified files
+✅ collects coverage only from specified files avoiding dependencies
+✅ json reporter printing with --coverage
+✅ outputs coverage report as json
+✅ outputs coverage report when text is requested
+✅ outputs coverage report when text-summary is requested
+✅ outputs coverage report when text and text-summary is requested
+✅ does not output coverage report when html is requested
+✅ collects coverage from duplicate files avoiding shared cache
+✅ generates coverage when using the testRegex config param
+```
+### ✅ e2e/__tests__/coverageThreshold.test.ts
+```
+✅ exits with 1 if coverage threshold is not met
+✅ exits with 1 if path threshold group is not found in coverage data
+✅ exits with 0 if global threshold group is not found in coverage data
+✅ excludes tests matched by path threshold groups from global group
+✅ file is matched by all path and glob threshold groups
+```
+### ✅ e2e/__tests__/coverageTransformInstrumented.test.ts
+```
+✅ code coverage for transform instrumented code
+```
+### ✅ e2e/__tests__/coverageWithoutTransform.test.ts
+```
+✅ produces code coverage for uncovered files without transformer
+```
+### ✅ e2e/__tests__/createProcessObject.test.ts
+```
+✅ allows retrieving the current domain
+```
+### ✅ e2e/__tests__/customInlineSnapshotMatchers.test.ts
+```
+✅ works with custom inline snapshot matchers
+```
+### ✅ e2e/__tests__/customMatcherStackTrace.test.ts
+```
+✅ works with custom matchers
+✅ custom async matchers
+```
+### ✅ e2e/__tests__/customReporters.test.ts
+```
+Custom Reporters Integration
+ ✅ valid string format for adding reporters
+ ✅ valid array format for adding reporters
+ ✅ invalid format for adding reporters
+ ✅ default reporters enabled
+ ✅ TestReporter with all tests passing
+ ✅ TestReporter with all tests failing
+ ✅ IncompleteReporter for flexibility
+ ✅ reporters can be default exports
+ ✅ prints reporter errors
+```
+### ✅ e2e/__tests__/customResolver.test.ts
+```
+✅ use the custom resolver
+```
+### ✅ e2e/__tests__/customTestSequencers.test.ts
+```
+✅ run prioritySequence first sync
+✅ run prioritySequence first async
+✅ run failed tests async
+```
+### ✅ e2e/__tests__/debug.test.ts
+```
+jest --debug
+ ✅ outputs debugging info before running the test
+```
+### ✅ e2e/__tests__/declarationErrors.test.ts
+```
+✅ errors if describe returns a Promise
+✅ errors if describe returns something
+✅ errors if describe throws
+```
+### ✅ e2e/__tests__/dependencyClash.test.ts
+```
+✅ does not require project modules from inside node_modules
+```
+### ✅ e2e/__tests__/detectOpenHandles.ts
+```
+✅ prints message about flag on slow tests
+✅ prints message about flag on forceExit
+✅ prints out info about open handlers
+✅ does not report promises
+✅ prints out info about open handlers from inside tests
+on node >=11.10.0
+ ✅ does not report ELD histograms
+notify
+ ✅ does not report --notify flag
+on node >=11
+ ✅ does not report timeouts using unref
+```
+### ✅ e2e/__tests__/domDiffing.test.ts
+```
+✅ should work without error
+```
+### ✅ e2e/__tests__/doneInHooks.test.ts
+```
+✅ `done()` works properly in hooks
+```
+### ✅ e2e/__tests__/dynamicRequireDependencies.ts
+```
+✅ successfully runs tests with dynamic dependencies
+```
+### ✅ e2e/__tests__/each.test.ts
+```
+✅ works with passing tests
+✅ shows error message when not enough arguments are supplied to tests
+✅ shows the correct errors in stderr when failing tests
+✅ shows only the tests with .only as being ran
+✅ shows only the tests without .skip as being ran
+✅ runs only the describe.only.each tests
+✅ formats args with pretty format when given %p
+```
+### ✅ e2e/__tests__/emptyDescribeWithHooks.test.ts
+```
+✅ hook in empty describe
+✅ hook in describe with skipped test
+✅ hook in empty nested describe
+✅ multiple hooks in empty describe
+```
+### ✅ e2e/__tests__/emptySuiteError.test.ts
+```
+JSON Reporter
+ ✅ fails the test suite if it contains no tests
+```
+### ✅ e2e/__tests__/env.test.ts
+```
+Environment override
+ ✅ uses jsdom when specified
+ ✅ uses node as default from package.json
+ ✅ uses node when specified
+ ✅ fails when the env is not available
+Environment equivalent
+ ✅ uses jsdom
+ ✅ uses node
+```
+### ✅ e2e/__tests__/environmentAfterTeardown.test.ts
+```
+✅ prints useful error for environment methods after test is done
+```
+### ✅ e2e/__tests__/errorOnDeprecated.test.ts
+```
+✅ does not work on jest-circus
+⚪ fail.test.js errors in errorOnDeprecated mode
+⚪ jasmine.addMatchers.test.js errors in errorOnDeprecated mode
+⚪ jasmine.any.test.js errors in errorOnDeprecated mode
+⚪ jasmine.anything.test.js errors in errorOnDeprecated mode
+⚪ jasmine.arrayContaining.test.js errors in errorOnDeprecated mode
+⚪ jasmine.createSpy.test.js errors in errorOnDeprecated mode
+⚪ jasmine.objectContaining.test.js errors in errorOnDeprecated mode
+⚪ jasmine.stringMatching.test.js errors in errorOnDeprecated mode
+⚪ pending.test.js errors in errorOnDeprecated mode
+⚪ spyOn.test.js errors in errorOnDeprecated mode
+⚪ spyOnProperty.test.js errors in errorOnDeprecated mode
+⚪ defaultTimeoutInterval.test.js errors in errorOnDeprecated mode
+⚪ fail.test.js errors when not in errorOnDeprecated mode
+⚪ jasmine.addMatchers.test.js passes when not in errorOnDeprecated mode
+⚪ jasmine.any.test.js passes when not in errorOnDeprecated mode
+⚪ jasmine.anything.test.js passes when not in errorOnDeprecated mode
+⚪ jasmine.arrayContaining.test.js passes when not in errorOnDeprecated mode
+⚪ jasmine.createSpy.test.js passes when not in errorOnDeprecated mode
+⚪ jasmine.objectContaining.test.js passes when not in errorOnDeprecated mode
+⚪ jasmine.stringMatching.test.js passes when not in errorOnDeprecated mode
+⚪ pending.test.js passes when not in errorOnDeprecated mode
+⚪ spyOn.test.js passes when not in errorOnDeprecated mode
+⚪ spyOnProperty.test.js errors when not in errorOnDeprecated mode
+⚪ defaultTimeoutInterval.test.js passes when not in errorOnDeprecated mode
+```
+### ✅ e2e/__tests__/esmConfigFile.test.ts
+```
+✅ reads config from cjs file
+on node ^12.17.0 || >=13.2.0
+ ✅ reads config from mjs file
+ ✅ reads config from js file when package.json#type=module
+```
+### ✅ e2e/__tests__/executeTestsOnceInMpr.ts
+```
+✅ Tests are executed only once even in an MPR
+```
+### ✅ e2e/__tests__/existentRoots.test.ts
+```
+✅ error when rootDir does not exist
+✅ error when rootDir is a file
+✅ error when roots directory does not exist
+✅ error when roots is a file
+```
+### ✅ e2e/__tests__/expectAsyncMatcher.test.ts
+```
+✅ works with passing tests
+✅ shows the correct errors in stderr when failing tests
+```
+### ✅ e2e/__tests__/expectInVm.test.ts
+```
+✅ expect works correctly with RegExps created inside a VM
+```
+### ✅ e2e/__tests__/extraGlobals.test.ts
+```
+✅ works with injected globals
+```
+### ✅ e2e/__tests__/failureDetailsProperty.test.ts
+```
+✅ that the failureDetails property is set
+```
+### ✅ e2e/__tests__/failures.test.ts
+```
+✅ not throwing Error objects
+✅ works with node assert
+✅ works with assertions in separate files
+✅ works with async failures
+✅ works with snapshot failures
+✅ works with snapshot failures with hint
+✅ errors after test has completed
+```
+### ✅ e2e/__tests__/fakePromises.test.ts
+```
+Fake promises
+ ✅ should be possible to resolve with fake timers using immediates
+ ✅ should be possible to resolve with fake timers using asap
+```
+### ✅ e2e/__tests__/fatalWorkerError.test.ts
+```
+✅ fails a test that terminates the worker with a fatal error
+```
+### ✅ e2e/__tests__/filter.test.ts
+```
+Dynamic test filtering
+ ✅ uses the default JSON option
+ ✅ uses the CLI option
+ ✅ ignores the filter if requested to do so
+ ✅ throws when you return clowny stuff
+ ✅ will call setup on filter before filtering
+ ✅ will print error when filter throws
+ ✅ will return no results when setup hook throws
+```
+### ✅ e2e/__tests__/findRelatedFiles.test.ts
+```
+--findRelatedTests flag
+ ✅ runs tests related to filename
+ ✅ runs tests related to uppercased filename on case-insensitive os
+ ✅ runs tests related to filename with a custom dependency extractor
+ ✅ generates coverage report for filename
+ ✅ coverage configuration is applied correctly
+```
+### ✅ e2e/__tests__/focusedTests.test.ts
+```
+✅ runs only "it.only" tests
+```
+### ✅ e2e/__tests__/forceExit.test.ts
+```
+✅ exits the process after test are done but before timers complete
+```
+### ✅ e2e/__tests__/generatorMock.test.ts
+```
+✅ mock works with generator
+```
+### ✅ e2e/__tests__/global-mutation.test.ts
+```
+✅ can redefine global
+```
+### ✅ e2e/__tests__/global.test.ts
+```
+✅ globals are properly defined
+```
+### ✅ e2e/__tests__/globals.test.ts
+```
+✅ basic test constructs
+✅ interleaved describe and test children order
+✅ skips
+✅ only
+✅ cannot have describe with no implementation
+✅ cannot test with no implementation
+✅ skips with expand arg
+✅ only with expand arg
+✅ cannot test with no implementation with expand arg
+✅ function as descriptor
+```
+### ✅ e2e/__tests__/globalSetup.test.ts
+```
+✅ globalSetup is triggered once before all test suites
+✅ jest throws an error when globalSetup does not export a function
+✅ globalSetup function gets jest config object as a parameter
+✅ should call globalSetup function of multiple projects
+✅ should not call a globalSetup of a project if there are no tests to run from this project
+✅ should not call any globalSetup if there are no tests to run
+✅ globalSetup works with default export
+✅ globalSetup throws with named export
+✅ should not transpile the transformer
+✅ should transform node_modules if configured by transformIgnorePatterns
+```
+### ✅ e2e/__tests__/globalTeardown.test.ts
+```
+✅ globalTeardown is triggered once after all test suites
+✅ jest throws an error when globalTeardown does not export a function
+✅ globalTeardown function gets jest config object as a parameter
+✅ should call globalTeardown function of multiple projects
+✅ should not call a globalTeardown of a project if there are no tests to run from this project
+✅ globalTeardown works with default export
+✅ globalTeardown throws with named export
+```
+### ✅ e2e/__tests__/hasteMapMockChanged.test.ts
+```
+✅ should not warn when a mock file changes
+```
+### ✅ e2e/__tests__/hasteMapSha1.test.ts
+```
+✅ exits the process after test are done but before timers complete
+```
+### ✅ e2e/__tests__/hasteMapSize.test.ts
+```
+✅ reports the correct file size
+✅ updates the file size when a file changes
+```
+### ✅ e2e/__tests__/importedGlobals.test.ts
+```
+✅ imported globals
+```
+### ✅ e2e/__tests__/injectGlobals.test.ts
+```
+✅ globals are undefined if passed `false` from CLI
+✅ globals are undefined if passed `false` from config
+```
+### ✅ e2e/__tests__/jasmineAsync.test.ts
+```
+async jasmine
+ ✅ works with beforeAll
+ ✅ works with beforeEach
+ ✅ works with afterAll
+ ✅ works with afterEach
+ ✅ works with fit
+ ✅ works with xit
+ ✅ throws when not a promise is returned
+ ✅ tests async promise code
+ ✅ works with concurrent
+ ✅ works with concurrent within a describe block when invoked with testNamePattern
+ ✅ works with concurrent.each
+ ✅ works with concurrent.only.each
+ ✅ doesn't execute more than 5 tests simultaneously
+ ✅ async test fails
+ ✅ generator test
+```
+### ✅ e2e/__tests__/jasmineAsyncWithPendingDuringTest.ts
+```
+async jasmine with pending during test
+ ✅ does not work on jest-circus
+ ⚪ should be reported as a pending test
+```
+### ✅ e2e/__tests__/jest.config.js.test.ts
+```
+✅ works with jest.config.js
+✅ traverses directory tree up until it finds jest.config
+✅ invalid JS in jest.config.js
+```
+### ✅ e2e/__tests__/jest.config.ts.test.ts
+```
+✅ works with jest.config.ts
+✅ works with tsconfig.json
+✅ traverses directory tree up until it finds jest.config
+✅ it does type check the config
+✅ invalid JS in jest.config.ts
+```
+### ❌ e2e/__tests__/jestChangedFiles.test.ts
```
✅ gets hg SCM roots and dedupes them
✅ gets git SCM roots and dedupes them
@@ -417,7 +898,144 @@
✅ monitors only root paths for hg
✅ handles a bad revision for "changedSince", for hg
```
-### ❌ e2e/__tests__/onlyChanged.test.ts
+### ✅ e2e/__tests__/jestEnvironmentJsdom.test.ts
+```
+✅ check is not leaking memory
+```
+### ✅ e2e/__tests__/jestRequireActual.test.ts
+```
+✅ understands dependencies using jest.requireActual
+```
+### ✅ e2e/__tests__/jestRequireMock.test.ts
+```
+✅ understands dependencies using jest.requireMock
+```
+### ✅ e2e/__tests__/json.test.ts
+```
+✅ JSON is available in the global scope
+✅ JSON.parse creates objects from within this context
+```
+### ✅ e2e/__tests__/jsonReporter.test.ts
+```
+JSON Reporter
+ ✅ writes test result to sum.result.json
+ ✅ outputs coverage report
+```
+### ✅ e2e/__tests__/lifecycles.ts
+```
+✅ suite with invalid assertions in afterAll
+```
+### ✅ e2e/__tests__/listTests.test.ts
+```
+--listTests flag
+ ✅ causes tests to be printed in different lines
+ ✅ causes tests to be printed out as JSON when using the --json flag
+```
+### ✅ e2e/__tests__/locationInResults.test.ts
+```
+✅ defaults to null for location
+✅ adds correct location info when provided with flag
+```
+### ✅ e2e/__tests__/logHeapUsage.test.ts
+```
+✅ logs memory usage
+```
+### ✅ e2e/__tests__/mockNames.test.ts
+```
+✅ suite without mock name, mock called
+✅ suite without mock name, mock not called
+✅ suite with mock name, expect mock not called
+✅ suite with mock name, mock called, expect fail
+✅ suite with mock name, mock called 5 times
+✅ suite with mock name, mock not called 5 times, expect fail
+✅ suite with mock name, mock called
+✅ suite with mock name, mock not called
+```
+### ✅ e2e/__tests__/modernFakeTimers.test.ts
+```
+modern implementation of fake timers
+ ✅ should be possible to use modern implementation from config
+ ✅ should be possible to use modern implementation from jest-object
+```
+### ✅ e2e/__tests__/moduleNameMapper.test.ts
+```
+✅ moduleNameMapper wrong configuration
+✅ moduleNameMapper wrong array configuration
+✅ moduleNameMapper correct configuration
+✅ moduleNameMapper correct configuration mocking module of absolute path
+✅ moduleNameMapper with mocking
+```
+### ✅ e2e/__tests__/moduleParentNullInTest.ts
+```
+✅ module.parent should be null in test files
+```
+### ✅ e2e/__tests__/multiProjectRunner.test.ts
+```
+✅ --listTests doesn't duplicate the test files
+✅ can pass projects or global config
+✅ "No tests found" message for projects
+✅ allows a single non-root project
+✅ allows a single non-root project
+✅ correctly runs a single non-root project
+✅ correctly runs a single non-root project
+✅ projects can be workspaces with non-JS/JSON files
+✅ objects in project configuration
+✅ allows a single project
+✅ resolves projects and their properly
+✅ Does transform files with the corresponding project transformer
+doesn't bleed module file extensions resolution with multiple workers
+ ✅ external config files
+ ✅ inline config files
+```
+### ✅ e2e/__tests__/nativeAsyncMock.test.ts
+```
+✅ mocks async functions
+```
+### ✅ e2e/__tests__/nativeEsm.test.ts
+```
+✅ test config is without transform
+on node ^12.16.0 || >=13.7.0
+ ✅ runs test with native ESM
+on node >=14.3.0
+ ⚪ supports top-level await
+```
+### ✅ e2e/__tests__/nativeEsmTypescript.test.ts
+```
+on node ^12.16.0 || >=13.7.0
+ ✅ runs TS test with native ESM
+```
+### ✅ e2e/__tests__/nestedEventLoop.test.ts
+```
+✅ works with nested event loops
+```
+### ✅ e2e/__tests__/nestedTestDefinitions.test.ts
+```
+✅ print correct error message with nested test definitions outside describe
+✅ print correct error message with nested test definitions inside describe
+✅ print correct message when nesting describe inside it
+✅ print correct message when nesting a hook inside it
+```
+### ✅ e2e/__tests__/nodePath.test.ts
+```
+✅ supports NODE_PATH
+```
+### ✅ e2e/__tests__/noTestFound.test.ts
+```
+Coverage Report
+ ✅ outputs coverage report
+File path not found in mulit-project scenario
+ ✅ outputs coverage report
+```
+### ✅ e2e/__tests__/noTestsFound.test.ts
+```
+No tests are found
+ ✅ fails the test suite in standard situation
+ ✅ doesn't fail the test suite if --passWithNoTests passed
+ ✅ doesn't fail the test suite if using --lastCommit
+ ✅ doesn't fail the test suite if using --onlyChanged
+ ✅ doesn't fail the test suite if using --findRelatedTests
+```
+### ❌ e2e/__tests__/onlyChanged.test.ts
```
✅ run for "onlyChanged" and "changedSince"
✅ run only changed files
@@ -429,4 +1047,5416 @@
❌ gets changed files for hg
Error: expect(received).toMatch(expected)
✅ path on Windows is case-insensitive
+```
+### ✅ e2e/__tests__/onlyFailuresNonWatch.test.ts
+```
+✅ onlyFailures flag works in non-watch mode
+```
+### ✅ e2e/__tests__/overrideGlobals.test.ts
+```
+✅ overriding native promise does not freeze Jest
+✅ has a duration even if time is faked
+```
+### ✅ e2e/__tests__/pnp.test.ts
+```
+✅ successfully runs the tests inside `pnp/`
+```
+### ✅ e2e/__tests__/presets.test.ts
+```
+✅ supports json preset
+✅ supports js preset
+```
+### ✅ e2e/__tests__/processExit.test.ts
+```
+✅ prints stack trace pointing to process.exit call
+```
+### ✅ e2e/__tests__/promiseReject.test.ts
+```
+✅
+```
+### ✅ e2e/__tests__/regexCharInPath.test.ts
+```
+Regex Char In Path
+ ✅ parses paths containing regex chars correctly
+```
+### ✅ e2e/__tests__/requireAfterTeardown.test.ts
+```
+✅ prints useful error for requires after test is done
+```
+### ✅ e2e/__tests__/requireMain.test.ts
+```
+✅ provides `require.main` set to test suite module
+```
+### ✅ e2e/__tests__/requireMainAfterCreateRequire.test.ts
+```
+on node >=12.2.0
+ ✅ `require.main` not undefined after createRequire
+```
+### ✅ e2e/__tests__/requireMainIsolateModules.test.ts
+```
+✅ `require.main` on using `jest.isolateModules` should not be undefined
+```
+### ✅ e2e/__tests__/requireMainResetModules.test.ts
+```
+✅ `require.main` on using `--resetModules='true'` should not be undefined
+✅ `require.main` on using `jest.resetModules()` should not be undefined
+```
+### ✅ e2e/__tests__/requireV8Module.test.ts
+```
+✅ v8 module
+```
+### ✅ e2e/__tests__/resetModules.test.ts
+```
+✅ jest.resetModules should not error when _isMockFunction is defined but not boolean
+```
+### ✅ e2e/__tests__/resolve.test.ts
+```
+✅ resolve platform modules
+```
+### ✅ e2e/__tests__/resolveGetPaths.test.ts
+```
+✅ require.resolve.paths
+```
+### ✅ e2e/__tests__/resolveNodeModule.test.ts
+```
+✅ resolve node module
+```
+### ✅ e2e/__tests__/resolveNoFileExtensions.test.ts
+```
+✅ show error message with matching files
+✅ show error message when no js moduleFileExtensions
+```
+### ✅ e2e/__tests__/resolveWithPaths.test.ts
+```
+✅ require.resolve with paths
+```
+### ✅ e2e/__tests__/runProgrammatically.test.ts
+```
+✅ run Jest programmatically cjs
+✅ run Jest programmatically esm
+```
+### ✅ e2e/__tests__/runTestsByPath.test.ts
+```
+✅ runs tests by exact path
+```
+### ✅ e2e/__tests__/runtimeInternalModuleRegistry.test.ts
+```
+Runtime Internal Module Registry
+ ✅ correctly makes use of internal module registry when requiring modules
+```
+### ✅ e2e/__tests__/selectProjects.test.ts
+```
+Given a config with two named projects, first-project and second-project when Jest is started with `--selectProjects first-project`
+ ✅ runs the tests in the first project only
+ ✅ prints that only first-project will run
+Given a config with two named projects, first-project and second-project when Jest is started with `--selectProjects second-project`
+ ✅ runs the tests in the second project only
+ ✅ prints that only second-project will run
+Given a config with two named projects, first-project and second-project when Jest is started with `--selectProjects first-project second-project`
+ ✅ runs the tests in the first and second projects
+ ✅ prints that both first-project and second-project will run
+Given a config with two named projects, first-project and second-project when Jest is started without providing `--selectProjects`
+ ✅ runs the tests in the first and second projects
+ ✅ does not print which projects are run
+Given a config with two named projects, first-project and second-project when Jest is started with `--selectProjects third-project`
+ ✅ fails
+ ✅ prints that no project was found
+Given a config with two projects, first-project and an unnamed project when Jest is started with `--selectProjects first-project`
+ ✅ runs the tests in the first project only
+ ✅ prints that a project does not have a name
+ ✅ prints that only first-project will run
+Given a config with two projects, first-project and an unnamed project when Jest is started without providing `--selectProjects`
+ ✅ runs the tests in the first and second projects
+ ✅ does not print that a project has no name
+Given a config with two projects, first-project and an unnamed project when Jest is started with `--selectProjects third-project`
+ ✅ fails
+ ✅ prints that a project does not have a name
+ ✅ prints that no project was found
+```
+### ✅ e2e/__tests__/setImmediate.test.ts
+```
+✅ setImmediate
+```
+### ✅ e2e/__tests__/setupFilesAfterEnvConfig.test.ts
+```
+setupFilesAfterEnv
+ ✅ requires multiple setup files before each file in the suite
+ ✅ requires setup files *after* the test runners are required
+```
+### ✅ e2e/__tests__/showConfig.test.ts
+```
+✅ --showConfig outputs config info and exits
+```
+### ✅ e2e/__tests__/skipBeforeAfterAll.test.ts
+```
+✅ correctly skip `beforeAll`s in skipped tests
+```
+### ✅ e2e/__tests__/snapshot-unknown.test.ts
+```
+Snapshot serializers
+ ✅ renders snapshot
+```
+### ✅ e2e/__tests__/snapshot.test.ts
+```
+Snapshot
+ ✅ stores new snapshots on the first run
+ ✅ works with escaped characters
+ ✅ works with escaped regex
+ ✅ works with template literal substitutions
+Snapshot Validation
+ ✅ does not save snapshots in CI mode by default
+ ✅ works on subsequent runs without `-u`
+ ✅ deletes the snapshot if the test suite has been removed
+ ✅ deletes a snapshot when a test does removes all the snapshots
+ ✅ updates the snapshot when a test removes some snapshots
+```
+### ✅ e2e/__tests__/snapshotMockFs.test.ts
+```
+✅ store snapshot even if fs is mocked
+```
+### ✅ e2e/__tests__/snapshotResolver.test.ts
+```
+Custom snapshot resolver
+ ✅ Resolves snapshot files using custom resolver
+```
+### ✅ e2e/__tests__/snapshotSerializers.test.ts
+```
+Snapshot serializers
+ ✅ renders snapshot
+ ✅ compares snapshots correctly
+```
+### ✅ e2e/__tests__/stackTrace.test.ts
+```
+Stack Trace
+ ✅ prints a stack trace for runtime errors
+ ✅ does not print a stack trace for runtime errors when --noStackTrace is given
+ ✅ prints a stack trace for matching errors
+ ✅ does not print a stack trace for matching errors when --noStackTrace is given
+ ✅ prints a stack trace for errors
+ ✅ prints a stack trace for errors without message in stack trace
+ ✅ does not print a stack trace for errors when --noStackTrace is given
+```
+### ✅ e2e/__tests__/stackTraceNoCaptureStackTrace.test.ts
+```
+✅ prints a usable stack trace even if no Error.captureStackTrace
+```
+### ✅ e2e/__tests__/stackTraceSourceMaps.test.ts
+```
+✅ processes stack traces and code frames with source maps
+```
+### ✅ e2e/__tests__/stackTraceSourceMapsWithCoverage.test.ts
+```
+✅ processes stack traces and code frames with source maps with coverage
+```
+### ✅ e2e/__tests__/supportsDashedArgs.ts
+```
+✅ works with passing tests
+✅ throws error for unknown dashed & camelcase args
+```
+### ✅ e2e/__tests__/symbol.test.ts
+```
+✅ Symbol deletion
+```
+### ✅ e2e/__tests__/testEnvironment.test.ts
+```
+✅ respects testEnvironment docblock
+```
+### ✅ e2e/__tests__/testEnvironmentAsync.test.ts
+```
+✅ triggers setup/teardown hooks
+```
+### ✅ e2e/__tests__/testEnvironmentCircus.test.ts
+```
+✅ calls testEnvironment handleTestEvent
+```
+### ✅ e2e/__tests__/testEnvironmentCircusAsync.test.ts
+```
+✅ calls asynchronous handleTestEvent in testEnvironment
+```
+### ✅ e2e/__tests__/testFailureExitCode.test.ts
+```
+✅ exits with a specified code when test fail
+✅ exits with a specified code when bailing from a failed test
+```
+### ✅ e2e/__tests__/testInRoot.test.ts
+```
+✅ runs tests in only test.js and spec.js
+```
+### ✅ e2e/__tests__/testNamePattern.test.ts
+```
+✅ testNamePattern
+```
+### ✅ e2e/__tests__/testNamePatternSkipped.test.ts
+```
+✅ testNamePattern skipped
+```
+### ✅ e2e/__tests__/testPathPatternReporterMessage.test.ts
+```
+✅ prints a message with path pattern at the end
+```
+### ✅ e2e/__tests__/testResultsProcessor.test.ts
+```
+✅ testNamePattern
+```
+### ✅ e2e/__tests__/testRetries.test.ts
+```
+Test Retries
+ ✅ retries failed tests
+ ✅ reporter shows more than 1 invocation if test is retried
+ ✅ reporter shows 1 invocation if tests are not retried
+ ✅ tests are not retried if beforeAll hook failure occurs
+```
+### ✅ e2e/__tests__/testTodo.test.ts
+```
+✅ works with all statuses
+✅ shows error messages when called with no arguments
+✅ shows error messages when called with multiple arguments
+✅ shows error messages when called with invalid argument
+✅ shows todo messages when in verbose mode
+```
+### ✅ e2e/__tests__/timeouts.test.ts
+```
+✅ exceeds the timeout
+✅ does not exceed the timeout
+✅ exceeds the command line testTimeout
+✅ does not exceed the command line testTimeout
+```
+### ✅ e2e/__tests__/timeoutsLegacy.test.ts
+```
+✅ does not work on jest-circus
+⚪ exceeds the timeout set using jasmine.DEFAULT_TIMEOUT_INTERVAL
+⚪ does not exceed the timeout using jasmine.DEFAULT_TIMEOUT_INTERVAL
+⚪ can read and write jasmine.DEFAULT_TIMEOUT_INTERVAL
+```
+### ✅ e2e/__tests__/timerResetMocks.test.ts
+```
+✅ run timers after resetAllMocks test
+✅ run timers with resetMocks in config test
+```
+### ✅ e2e/__tests__/timerUseRealTimers.test.ts
+```
+✅ useRealTimers cancels "timers": "fake" for whole test file
+```
+### ✅ e2e/__tests__/toMatchInlineSnapshot.test.ts
+```
+✅ basic support
+✅ do not indent empty lines
+✅ handles property matchers
+✅ removes obsolete external snapshots
+✅ supports async matchers
+✅ supports async tests
+✅ writes snapshots with non-literals in expect(...)
+✅ handles mocking native modules prettier relies on
+✅ supports custom matchers
+✅ supports custom matchers with property matcher
+✅ multiple custom matchers and native matchers
+✅ indentation is correct in the presences of existing snapshots
+```
+### ✅ e2e/__tests__/toMatchInlineSnapshotWithRetries.test.ts
+```
+✅ works with a single snapshot
+✅ works when a different assertion is failing
+✅ works when multiple tests have snapshots but only one of them failed multiple times
+```
+### ✅ e2e/__tests__/toMatchSnapshot.test.ts
+```
+✅ basic support
+✅ error thrown before snapshot
+✅ first snapshot fails, second passes
+✅ does not mark snapshots as obsolete in skipped tests
+✅ accepts custom snapshot name
+✅ handles property matchers
+✅ handles invalid property matchers
+✅ handles property matchers with hint
+✅ handles property matchers with deep properties
+```
+### ✅ e2e/__tests__/toMatchSnapshotWithRetries.test.ts
+```
+✅ works with a single snapshot
+✅ works when multiple tests have snapshots but only one of them failed multiple times
+```
+### ✅ e2e/__tests__/toMatchSnapshotWithStringSerializer.test.ts
+```
+✅ empty external
+✅ empty internal ci false
+✅ undefined internal ci true
+```
+### ✅ e2e/__tests__/toThrowErrorMatchingInlineSnapshot.test.ts
+```
+✅ works fine when function throws error
+✅ updates existing snapshot
+✅ cannot be used with .not
+✅ should support rejecting promises
+```
+### ✅ e2e/__tests__/toThrowErrorMatchingSnapshot.test.ts
+```
+✅ works fine when function throws error
+✅ throws the error if tested function didn't throw error
+✅ accepts custom snapshot name
+✅ cannot be used with .not
+✅ should support rejecting promises
+```
+### ✅ e2e/__tests__/transform.test.ts
+```
+babel-jest
+ ✅ runs transpiled code
+ ✅ instruments only specific files and collects coverage
+babel-jest ignored
+ ✅ tells user to match ignored files
+babel-jest with manual transformer
+ ✅ runs transpiled code
+no babel-jest
+ ✅ fails with syntax error on flow types
+ ✅ instrumentation with no babel-jest
+custom transformer
+ ✅ proprocesses files
+ ✅ instruments files
+multiple-transformers
+ ✅ transforms dependencies using specific transformers
+ecmascript-modules-support
+ ✅ runs transpiled code
+transformer-config
+ ✅ runs transpiled code
+ ✅ instruments only specific files and collects coverage
+transformer caching
+ ✅ does not rerun transform within worker
+transform-environment
+ ✅ should transform the environment
+transform-runner
+ ✅ should transform runner
+transform-testrunner
+ ✅ should transform testRunner
+```
+### ✅ e2e/__tests__/transformLinkedModules.test.ts
+```
+✅ should transform linked modules
+```
+### ✅ e2e/__tests__/typescriptCoverage.test.ts
+```
+✅ instruments and collects coverage for typescript files
+```
+### ✅ e2e/__tests__/unexpectedToken.test.ts
+```
+✅ triggers unexpected token error message for non-JS assets
+✅ triggers unexpected token error message for untranspiled node_modules
+✅ does not trigger unexpected token error message for regular syntax errors
+```
+### ✅ e2e/__tests__/useStderr.test.ts
+```
+✅ no tests found message is redirected to stderr
+```
+### ✅ e2e/__tests__/v8Coverage.test.ts
+```
+✅ prints coverage with missing sourcemaps
+✅ prints coverage with empty sourcemaps
+```
+### ✅ e2e/__tests__/verbose.test.ts
+```
+✅ Verbose Reporter
+```
+### ✅ e2e/__tests__/version.test.ts
+```
+✅ works with jest.config.js
+```
+### ✅ e2e/__tests__/watchModeNoAccess.test.ts
+```
+✅ does not re-run tests when only access time is modified
+```
+### ✅ e2e/__tests__/watchModeOnlyFailed.test.ts
+```
+✅ can press "f" to run only failed tests
+```
+### ✅ e2e/__tests__/watchModePatterns.test.ts
+```
+✅ can press "p" to filter by file name
+✅ can press "t" to filter by test name
+```
+### ✅ e2e/__tests__/watchModeUpdateSnapshot.test.ts
+```
+✅ can press "u" to update snapshots
+```
+### ✅ e2e/__tests__/workerForceExit.test.ts
+```
+✅ prints a warning if a worker is force exited
+✅ force exits a worker that fails to exit gracefully
+```
+### ✅ e2e/__tests__/wrongEnv.test.ts
+```
+Wrong globals for environment
+ ✅ print useful error for window
+ ✅ print useful error for document
+ ✅ print useful error for navigator
+ ✅ print useful error for unref
+ ✅ print useful error when it explodes during evaluation
+```
+### ✅ e2e/custom-test-sequencer/a.test.js
+```
+✅ a
+```
+### ✅ e2e/custom-test-sequencer/b.test.js
+```
+✅ b
+```
+### ✅ e2e/custom-test-sequencer/c.test.js
+```
+✅ c
+```
+### ✅ e2e/custom-test-sequencer/d.test.js
+```
+✅ d
+```
+### ✅ e2e/custom-test-sequencer/e.test.js
+```
+✅ e
+```
+### ✅ e2e/test-in-root/spec.js
+```
+✅ stub
+```
+### ✅ e2e/test-in-root/test.js
+```
+✅ stub
+```
+### ✅ e2e/timer-reset-mocks/after-reset-all-mocks/timerAndMock.test.js
+```
+timers
+ ✅ should work before calling resetAllMocks
+ ✅ should not break after calling resetAllMocks
+```
+### ✅ e2e/timer-reset-mocks/with-reset-mocks/timerWithMock.test.js
+```
+timers
+ ✅ should work before calling resetAllMocks
+```
+### ✅ e2e/v8-coverage/empty-sourcemap/test.ts
+```
+✅ dummy-test
+```
+### ✅ examples/angular/app.component.spec.ts
+```
+AppComponent
+ ✅ should create the app
+ ✅ should have as title 'angular'
+ ✅ should render title in a h1 tag
+```
+### ✅ examples/angular/shared/data.service.spec.ts
+```
+Service: DataService
+ ✅ should create service
+ ✅ should return the right title
+```
+### ✅ examples/angular/shared/sub.service.spec.ts
+```
+Service: SubService
+ ✅ should create service
+```
+### ✅ examples/async/__tests__/user.test.js
+```
+✅ works with resolves
+✅ works with promises
+✅ works with async/await
+✅ works with async/await and resolves
+✅ tests error with rejects
+✅ tests error with promises
+✅ tests error with async/await
+✅ tests error with async/await and rejects
+```
+### ✅ examples/automatic-mocks/__tests__/automock.test.js
+```
+✅ if utils are mocked
+✅ mocked implementation
+```
+### ✅ examples/automatic-mocks/__tests__/createMockFromModule.test.js
+```
+✅ implementation created by automock
+✅ implementation created by jest.createMockFromModule
+```
+### ✅ examples/automatic-mocks/__tests__/disableAutomocking.test.js
+```
+✅ original implementation
+```
+### ✅ examples/enzyme/__tests__/CheckboxWithLabel-test.js
+```
+✅ CheckboxWithLabel changes the text after click
+```
+### ✅ examples/getting-started/sum.test.js
+```
+✅ adds 1 + 2 to equal 3
+```
+### ✅ examples/jquery/__tests__/display_user.test.js
+```
+✅ displays a user after a click
+```
+### ✅ examples/jquery/__tests__/fetch_current_user.test.js
+```
+✅ calls into $.ajax with the correct params
+✅ calls the callback when $.ajax requests are finished
+```
+### ✅ examples/manual-mocks/__tests__/file_summarizer.test.js
+```
+listFilesInDirectorySync
+ ✅ includes all files in the directory in the summary
+```
+### ✅ examples/manual-mocks/__tests__/lodashMocking.test.js
+```
+✅ if lodash head is mocked
+```
+### ✅ examples/manual-mocks/__tests__/user.test.js
+```
+✅ if orginal user model
+```
+### ✅ examples/manual-mocks/__tests__/userMocked.test.js
+```
+✅ if user model is mocked
+```
+### ✅ examples/module-mock/__tests__/full_mock.js
+```
+✅ does a full mock
+```
+### ✅ examples/module-mock/__tests__/mock_per_test.js
+```
+define mock per test
+ ✅ uses mocked module
+ ✅ uses actual module
+```
+### ✅ examples/module-mock/__tests__/partial_mock.js
+```
+✅ does a partial mock
+```
+### ✅ examples/mongodb/__test__/db.test.js
+```
+✅ should aggregate docs from collection
+```
+### ✅ examples/react-native/__tests__/intro.test.js
+```
+✅ renders correctly
+✅ renders the ActivityIndicator component
+✅ renders the TextInput component
+✅ renders the FlatList component
+```
+### ✅ examples/react-testing-library/__tests__/CheckboxWithLabel-test.js
+```
+✅ CheckboxWithLabel changes the text after click
+```
+### ✅ examples/react/__tests__/CheckboxWithLabel-test.js
+```
+✅ CheckboxWithLabel changes the text after click
+```
+### ✅ examples/snapshot/__tests__/clock.react.test.js
+```
+✅ renders correctly
+```
+### ✅ examples/snapshot/__tests__/link.react.test.js
+```
+✅ renders correctly
+✅ renders as an anchor when no page is set
+✅ properly escapes quotes
+✅ changes the class when hovered
+```
+### ✅ examples/timer/__tests__/infinite_timer_game.test.js
+```
+✅ schedules a 10-second timer after 1 second
+```
+### ✅ examples/timer/__tests__/timer_game.test.js
+```
+timerGame
+ ✅ waits 1 second before ending the game
+ ✅ calls the callback after 1 second via runAllTimers
+ ✅ calls the callback after 1 second via advanceTimersByTime
+```
+### ✅ examples/typescript/__tests__/calc.test.ts
+```
+calc - mocks
+ ✅ returns result from subtract
+ ✅ returns result from sum
+ ✅ adds last result to memory
+ ✅ subtracts last result to memory
+ ✅ clears the memory
+ ✅ throws an error when invalid Op is passed
+```
+### ✅ examples/typescript/__tests__/CheckboxWithLabel-test.tsx
+```
+✅ CheckboxWithLabel changes the text after click
+```
+### ✅ examples/typescript/__tests__/sub-test.ts
+```
+✅ subtracts 5 - 1 to equal 4 in TypeScript
+```
+### ✅ examples/typescript/__tests__/sum-test.ts
+```
+✅ adds 1 + 2 to equal 3 in TScript
+✅ adds 1 + 2 to equal 3 in JavaScript
+```
+### ✅ examples/typescript/__tests__/sum.test.js
+```
+✅ adds 1 + 2 to equal 3 in Typescript
+✅ adds 1 + 2 to equal 3 in JavaScript
+```
+### ✅ packages/babel-jest/src/__tests__/index.ts
+```
+✅ Returns source string with inline maps when no transformOptions is passed
+✅ can pass null to createTransformer
+caller option correctly merges from defaults and options
+ ✅ {"supportsDynamicImport":true,"supportsStaticESM":true} -> {"supportsDynamicImport":true,"supportsStaticESM":true}
+ ✅ {"supportsDynamicImport":false,"supportsStaticESM":false} -> {"supportsDynamicImport":false,"supportsStaticESM":false}
+ ✅ {"supportsStaticESM":false} -> {"supportsDynamicImport":false,"supportsStaticESM":false}
+ ✅ {"supportsDynamicImport":true} -> {"supportsDynamicImport":true,"supportsStaticESM":false}
+```
+### ✅ packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.test.ts
+```
+babel-plugin-jest-hoist
+ ✅ automatic react runtime
+ ✅ top level mocking
+ ✅ within a block
+ ✅ within a block with no siblings
+```
+### ✅ packages/diff-sequences/src/__tests__/index.property.test.ts
+```
+✅ should be reflexive
+✅ should find the same number of common items when switching the inputs
+✅ should have at most the length of its inputs
+✅ should have at most the same number of each character as its inputs
+✅ should be a subsequence of its inputs
+✅ should be no-op when passing common items
+✅ should find the exact common items when one array is subarray of the other
+```
+### ✅ packages/diff-sequences/src/__tests__/index.test.ts
+```
+invalid arg length
+ ✅ is not a number
+ ✅ Infinity is not a safe integer
+ ✅ Not a Number is not a safe integer
+ ✅ MAX_SAFE_INTEGER + 1 is not a safe integer
+ ✅ MIN_SAFE_INTEGER - 1 is not a safe integer
+ ✅ is a negative integer
+invalid arg callback
+ ✅ null is not a function
+ ✅ undefined is not a function
+input callback encapsulates comparison zero and negative zero
+ ✅ are not common according to Object.is method
+ ✅ are common according to === operator
+input callback encapsulates comparison Not a Number
+ ✅ is common according to Object.is method
+ ✅ is not common according to === operator
+input callback encapsulates sequences
+ ✅ arrays of strings
+ ✅ string and array of strings
+ ✅ strings
+no common items negative zero is equivalent to zero for length
+ ✅ of a
+ ✅ of b
+ ✅ of a and b
+no common items
+ ✅ a empty and b empty
+ ✅ a empty and b non-empty
+ ✅ a non-empty and b empty
+no common items a non-empty and b non-empty
+ ✅ baDeltaLength 0 even
+ ✅ baDeltaLength 1 odd
+ ✅ baDeltaLength 2 even
+ ✅ baDeltaLength 7 odd
+only common items
+ ✅ length 1
+ ✅ length 2
+all common items outside
+ ✅ preceding changes
+ ✅ following change
+ ✅ preceding and following changes in one sequence
+some common items inside and outside
+ ✅ preceding changes adjacent to common in both sequences
+ ✅ following changes adjacent to common in both sequences
+all common items inside non-recursive
+ ✅ move from start to end relative to change
+ ✅ move from start to end relative to common
+ ✅ move from start to end relative to change and common
+ ✅ reverse relative to change
+ ✅ preceding middle
+ ✅ following middle
+all common items inside recursive
+ ✅ prev reverse at depth 1 and preceding at depth 2
+ ✅ last forward at depth 1 and following at depth 2
+ ✅ preceding at depth 2 and both at depth 3 of following
+ ✅ interleaved single change
+ ✅ interleaved double changes
+ ✅ optimization decreases iMaxF
+ ✅ optimization decreases iMaxR
+common substrings
+ ✅ progress
+ ✅ regression
+ ✅ wrapping
+```
+### ✅ packages/expect/src/__tests__/assertionCounts.test.ts
+```
+.assertions()
+ ✅ does not throw
+ ✅ redeclares different assertion count
+ ✅ expects no assertions
+.hasAssertions()
+ ✅ does not throw if there is an assertion
+ ✅ throws if expected is not undefined
+ ✅ hasAssertions not leaking to global state
+```
+### ✅ packages/expect/src/__tests__/asymmetricMatchers.test.ts
+```
+✅ Any.asymmetricMatch()
+✅ Any.toAsymmetricMatcher()
+✅ Any.toAsymmetricMatcher() with function name
+✅ Any throws when called with empty constructor
+✅ Anything matches any type
+✅ Anything does not match null and undefined
+✅ Anything.toAsymmetricMatcher()
+✅ ArrayContaining matches
+✅ ArrayContaining does not match
+✅ ArrayContaining throws for non-arrays
+✅ ArrayNotContaining matches
+✅ ArrayNotContaining does not match
+✅ ArrayNotContaining throws for non-arrays
+✅ ObjectContaining matches
+✅ ObjectContaining does not match
+✅ ObjectContaining matches defined properties
+✅ ObjectContaining matches prototype properties
+✅ ObjectContaining throws for non-objects
+✅ ObjectContaining does not mutate the sample
+✅ ObjectNotContaining matches
+✅ ObjectNotContaining does not match
+✅ ObjectNotContaining inverts ObjectContaining
+✅ ObjectNotContaining throws for non-objects
+✅ StringContaining matches string against string
+✅ StringContaining throws if expected value is not string
+✅ StringContaining returns false if received value is not string
+✅ StringNotContaining matches string against string
+✅ StringNotContaining throws if expected value is not string
+✅ StringNotContaining returns true if received value is not string
+✅ StringMatching matches string against regexp
+✅ StringMatching matches string against string
+✅ StringMatching throws if expected value is neither string nor regexp
+✅ StringMatching returns false if received value is not string
+✅ StringMatching returns false even if coerced non-string received value matches pattern
+✅ StringNotMatching matches string against regexp
+✅ StringNotMatching matches string against string
+✅ StringNotMatching throws if expected value is neither string nor regexp
+✅ StringNotMatching returns true if received value is not string
+```
+### ✅ packages/expect/src/__tests__/extend.test.ts
+```
+✅ is available globally when matcher is unary
+✅ is available globally when matcher is variadic
+✅ exposes matcherUtils in context
+✅ is ok if there is no message specified
+✅ exposes an equality function to custom matchers
+✅ defines asymmetric unary matchers
+✅ defines asymmetric unary matchers that can be prefixed by not
+✅ defines asymmetric variadic matchers
+✅ defines asymmetric variadic matchers that can be prefixed by not
+✅ prints the Symbol into the error message
+```
+### ✅ packages/expect/src/__tests__/isError.test.ts
+```
+isError
+ ✅ should not assume objects are errors
+ ✅ should detect simple error instances
+ ✅ should detect errors from another context
+ ✅ should detect DOMException errors from another context
+```
+### ✅ packages/expect/src/__tests__/matchers-toContain.property.test.ts
+```
+toContain
+ ✅ should always find the value when inside the array
+ ✅ should not find the value if it has been cloned into the array
+```
+### ✅ packages/expect/src/__tests__/matchers-toContainEqual.property.test.ts
+```
+toContainEqual
+ ✅ should always find the value when inside the array
+ ✅ should always find the value when cloned inside the array
+```
+### ✅ packages/expect/src/__tests__/matchers-toEqual.property.test.ts
+```
+toEqual
+ ✅ should be reflexive
+ ✅ should be symmetric
+```
+### ✅ packages/expect/src/__tests__/matchers-toStrictEqual.property.test.ts
+```
+toStrictEqual
+ ✅ should be reflexive
+ ✅ should be symmetric
+toStrictEqual on node >=9
+ ✅ should be equivalent to Node deepStrictEqual
+```
+### ✅ packages/expect/src/__tests__/matchers.test.js
+```
+✅ should throw if passed two arguments
+.rejects
+ ✅ should reject
+ ✅ should reject with toThrow
+ ✅ should reject async function to toThrow
+ ✅ fails non-promise value "a" synchronously
+ ✅ fails non-promise value "a"
+ ✅ fails non-promise value [1] synchronously
+ ✅ fails non-promise value [1]
+ ✅ fails non-promise value [Function anonymous] synchronously
+ ✅ fails non-promise value [Function anonymous]
+ ✅ fails non-promise value {"a": 1} synchronously
+ ✅ fails non-promise value {"a": 1}
+ ✅ fails non-promise value 4 synchronously
+ ✅ fails non-promise value 4
+ ✅ fails non-promise value null synchronously
+ ✅ fails non-promise value null
+ ✅ fails non-promise value true synchronously
+ ✅ fails non-promise value true
+ ✅ fails non-promise value undefined synchronously
+ ✅ fails non-promise value undefined
+ ✅ fails for promise that resolves
+.resolves
+ ✅ should resolve
+ ✅ fails non-promise value "a" synchronously
+ ✅ fails non-promise value "a"
+ ✅ fails non-promise value [1] synchronously
+ ✅ fails non-promise value [1]
+ ✅ fails non-promise value [Function anonymous] synchronously
+ ✅ fails non-promise value [Function anonymous]
+ ✅ fails non-promise value {"a": 1} synchronously
+ ✅ fails non-promise value {"a": 1}
+ ✅ fails non-promise value 4 synchronously
+ ✅ fails non-promise value 4
+ ✅ fails non-promise value null synchronously
+ ✅ fails non-promise value null
+ ✅ fails non-promise value true synchronously
+ ✅ fails non-promise value true
+ ✅ fails non-promise value undefined synchronously
+ ✅ fails non-promise value undefined
+ ✅ fails for promise that rejects
+.toBe()
+ ✅ does not throw
+ ✅ fails for: 1 and 2
+ ✅ fails for: true and false
+ ✅ fails for: [Function anonymous] and [Function anonymous]
+ ✅ fails for: {} and {}
+ ✅ fails for: {"a": 1} and {"a": 1}
+ ✅ fails for: {"a": 1} and {"a": 5}
+ ✅ fails for: {"a": [Function a], "b": 2} and {"a": Any, "b": 2}
+ ✅ fails for: {"a": undefined, "b": 2} and {"b": 2}
+ ✅ fails for: 2020-02-20T00:00:00.000Z and 2020-02-20T00:00:00.000Z
+ ✅ fails for: 2020-02-21T00:00:00.000Z and 2020-02-20T00:00:00.000Z
+ ✅ fails for: /received/ and /expected/
+ ✅ fails for: Symbol(received) and Symbol(expected)
+ ✅ fails for: [Error: received] and [Error: expected]
+ ✅ fails for: "abc" and "cde"
+ ✅ fails for: "painless JavaScript testing" and "delightful JavaScript testing"
+ ✅ fails for: "" and "compare one-line string to empty string"
+ ✅ fails for: "with
+trailing space" and "without trailing space"
+ ✅ fails for: "four
+4
+line
+string" and "3
+line
+string"
+ ✅ fails for: [] and []
+ ✅ fails for: null and undefined
+ ✅ fails for: -0 and 0
+ ✅ fails for: 1n and 2n
+ ✅ fails for: {"a": 1n} and {"a": 1n}
+ ✅ fails for 'false' with '.not'
+ ✅ fails for '1' with '.not'
+ ✅ fails for '"a"' with '.not'
+ ✅ fails for 'undefined' with '.not'
+ ✅ fails for 'null' with '.not'
+ ✅ fails for '{}' with '.not'
+ ✅ fails for '[]' with '.not'
+ ✅ fails for '1n' with '.not'
+ ✅ fails for '1n' with '.not'
+ ✅ does not crash on circular references
+ ✅ assertion error matcherResult property contains matcher name, expected and actual values
+.toStrictEqual()
+ ✅ does not ignore keys with undefined values
+ ✅ does not ignore keys with undefined values inside an array
+ ✅ does not ignore keys with undefined values deep inside an object
+ ✅ passes when comparing same type
+ ✅ matches the expected snapshot when it fails
+ ✅ displays substring diff
+ ✅ displays substring diff for multiple lines
+ ✅ does not pass for different types
+ ✅ does not simply compare constructor names
+ ✅ passes for matching sparse arrays
+ ✅ does not pass when sparseness of arrays do not match
+ ✅ does not pass when equally sparse arrays have different values
+.toEqual()
+ ✅ {pass: false} expect(true).toEqual(false)
+ ✅ {pass: false} expect(1).toEqual(2)
+ ✅ {pass: false} expect(0).toEqual(-0)
+ ✅ {pass: false} expect(0).toEqual(5e-324)
+ ✅ {pass: false} expect(5e-324).toEqual(0)
+ ✅ {pass: false} expect(0).toEqual({})
+ ✅ {pass: false} expect({}).toEqual(0)
+ ✅ {pass: false} expect({}).toEqual({})
+ ✅ {pass: false} expect("abc").toEqual({"0": "a", "1": "b", "2": "c"})
+ ✅ {pass: false} expect({"0": "a", "1": "b", "2": "c"}).toEqual("abc")
+ ✅ {pass: false} expect(/abc/gsy).toEqual(/abc/g)
+ ✅ {pass: false} expect({"a": 1}).toEqual({"a": 2})
+ ✅ {pass: false} expect({"a": 5}).toEqual({"b": 6})
+ ✅ {pass: false} expect({"foo": {"bar": 1}}).toEqual({"foo": {}})
+ ✅ {pass: false} expect({"getterAndSetter": {}}).toEqual({"getterAndSetter": {"foo": "bar"}})
+ ✅ {pass: false} expect({"frozenGetterAndSetter": {}}).toEqual({"frozenGetterAndSetter": {"foo": "bar"}})
+ ✅ {pass: false} expect({"getter": {}}).toEqual({"getter": {"foo": "bar"}})
+ ✅ {pass: false} expect({"frozenGetter": {}}).toEqual({"frozenGetter": {"foo": "bar"}})
+ ✅ {pass: false} expect({"setter": undefined}).toEqual({"setter": {"foo": "bar"}})
+ ✅ {pass: false} expect({"frozenSetter": undefined}).toEqual({"frozenSetter": {"foo": "bar"}})
+ ✅ {pass: false} expect("banana").toEqual("apple")
+ ✅ {pass: false} expect("1 234,57 $").toEqual("1 234,57 $")
+ ✅ {pass: false} expect("type TypeName = T extends Function ? \"function\" : \"object\";").toEqual("type TypeName = T extends Function
+? \"function\"
+: \"object\";")
+ ✅ {pass: false} expect(null).toEqual(undefined)
+ ✅ {pass: false} expect([1]).toEqual([2])
+ ✅ {pass: false} expect([1, 2]).toEqual([2, 1])
+ ✅ {pass: false} expect(Immutable.List [1]).toEqual(Immutable.List [2])
+ ✅ {pass: false} expect(Immutable.List [1, 2]).toEqual(Immutable.List [2, 1])
+ ✅ {pass: false} expect(Map {}).toEqual(Set {})
+ ✅ {pass: false} expect(Set {1, 2}).toEqual(Set {})
+ ✅ {pass: false} expect(Set {1, 2}).toEqual(Set {1, 2, 3})
+ ✅ {pass: false} expect(Set {[1], [2]}).toEqual(Set {[1], [2], [3]})
+ ✅ {pass: false} expect(Set {[1], [2]}).toEqual(Set {[1], [2], [2]})
+ ✅ {pass: false} expect(Set {Set {1}, Set {2}}).toEqual(Set {Set {1}, Set {3}})
+ ✅ {pass: false} expect(Immutable.Set [1, 2]).toEqual(Immutable.Set [])
+ ✅ {pass: false} expect(Immutable.Set [1, 2]).toEqual(Immutable.Set [1, 2, 3])
+ ✅ {pass: false} expect(Immutable.OrderedSet [1, 2]).toEqual(Immutable.OrderedSet [2, 1])
+ ✅ {pass: false} expect(Map {1 => "one", 2 => "two"}).toEqual(Map {1 => "one"})
+ ✅ {pass: false} expect(Map {"a" => 0}).toEqual(Map {"b" => 0})
+ ✅ {pass: false} expect(Map {"v" => 1}).toEqual(Map {"v" => 2})
+ ✅ {pass: false} expect(Map {["v"] => 1}).toEqual(Map {["v"] => 2})
+ ✅ {pass: false} expect(Map {[1] => Map {[1] => "one"}}).toEqual(Map {[1] => Map {[1] => "two"}})
+ ✅ {pass: false} expect(Immutable.Map {"a": 0}).toEqual(Immutable.Map {"b": 0})
+ ✅ {pass: false} expect(Immutable.Map {"v": 1}).toEqual(Immutable.Map {"v": 2})
+ ✅ {pass: false} expect(Immutable.OrderedMap {1: "one", 2: "two"}).toEqual(Immutable.OrderedMap {2: "two", 1: "one"})
+ ✅ {pass: false} expect(Immutable.Map {"1": Immutable.Map {"2": {"a": 99}}}).toEqual(Immutable.Map {"1": Immutable.Map {"2": {"a": 11}}})
+ ✅ {pass: false} expect([97, 98, 99]).toEqual([97, 98, 100])
+ ✅ {pass: false} expect({"a": 1, "b": 2}).toEqual(ObjectContaining {"a": 2})
+ ✅ {pass: false} expect(false).toEqual(ObjectContaining {"a": 2})
+ ✅ {pass: false} expect([1, 3]).toEqual(ArrayContaining [1, 2])
+ ✅ {pass: false} expect(1).toEqual(ArrayContaining [1, 2])
+ ✅ {pass: false} expect("abd").toEqual(StringContaining "bc")
+ ✅ {pass: false} expect("abd").toEqual(StringMatching /bc/i)
+ ✅ {pass: false} expect(undefined).toEqual(Anything)
+ ✅ {pass: false} expect(undefined).toEqual(Any)
+ ✅ {pass: false} expect("Eve").toEqual({"asymmetricMatch": [Function asymmetricMatch]})
+ ✅ {pass: false} expect({"target": {"nodeType": 1, "value": "a"}}).toEqual({"target": {"nodeType": 1, "value": "b"}})
+ ✅ {pass: false} expect({"nodeName": "div", "nodeType": 1}).toEqual({"nodeName": "p", "nodeType": 1})
+ ✅ {pass: false} expect({Symbol(foo): 1, Symbol(bar): 2}).toEqual({Symbol(foo): Any, Symbol(bar): 1})
+ ✅ {pass: false} expect(1n).toEqual(2n)
+ ✅ {pass: false} expect(1n).toEqual(1)
+ ✅ {pass: true} expect(true).not.toEqual(true)
+ ✅ {pass: true} expect(1).not.toEqual(1)
+ ✅ {pass: true} expect(NaN).not.toEqual(NaN)
+ ✅ {pass: true} expect(0).not.toEqual(0)
+ ✅ {pass: true} expect(0).not.toEqual(0)
+ ✅ {pass: true} expect({}).not.toEqual({})
+ ✅ {pass: true} expect("abc").not.toEqual("abc")
+ ✅ {pass: true} expect("abc").not.toEqual("abc")
+ ✅ {pass: true} expect("abc").not.toEqual("abc")
+ ✅ {pass: true} expect([1]).not.toEqual([1])
+ ✅ {pass: true} expect([1, 2]).not.toEqual([1, 2])
+ ✅ {pass: true} expect(Immutable.List [1]).not.toEqual(Immutable.List [1])
+ ✅ {pass: true} expect(Immutable.List [1, 2]).not.toEqual(Immutable.List [1, 2])
+ ✅ {pass: true} expect({}).not.toEqual({})
+ ✅ {pass: true} expect({"a": 99}).not.toEqual({"a": 99})
+ ✅ {pass: true} expect(Set {}).not.toEqual(Set {})
+ ✅ {pass: true} expect(Set {1, 2}).not.toEqual(Set {1, 2})
+ ✅ {pass: true} expect(Set {1, 2}).not.toEqual(Set {2, 1})
+ ✅ {pass: true} expect(Set {[1], [2]}).not.toEqual(Set {[2], [1]})
+ ✅ {pass: true} expect(Set {Set {[1]}, Set {[2]}}).not.toEqual(Set {Set {[2]}, Set {[1]}})
+ ✅ {pass: true} expect(Set {[1], [2], [3], [3]}).not.toEqual(Set {[3], [3], [2], [1]})
+ ✅ {pass: true} expect(Set {{"a": 1}, {"b": 2}}).not.toEqual(Set {{"b": 2}, {"a": 1}})
+ ✅ {pass: true} expect(Immutable.Set []).not.toEqual(Immutable.Set [])
+ ✅ {pass: true} expect(Immutable.Set [1, 2]).not.toEqual(Immutable.Set [1, 2])
+ ✅ {pass: true} expect(Immutable.Set [1, 2]).not.toEqual(Immutable.Set [2, 1])
+ ✅ {pass: true} expect(Immutable.OrderedSet []).not.toEqual(Immutable.OrderedSet [])
+ ✅ {pass: true} expect(Immutable.OrderedSet [1, 2]).not.toEqual(Immutable.OrderedSet [1, 2])
+ ✅ {pass: true} expect(Map {}).not.toEqual(Map {})
+ ✅ {pass: true} expect(Map {1 => "one", 2 => "two"}).not.toEqual(Map {1 => "one", 2 => "two"})
+ ✅ {pass: true} expect(Map {1 => "one", 2 => "two"}).not.toEqual(Map {2 => "two", 1 => "one"})
+ ✅ {pass: true} expect(Map {[1] => "one", [2] => "two", [3] => "three", [3] => "four"}).not.toEqual(Map {[3] => "three", [3] => "four", [2] => "two", [1] => "one"})
+ ✅ {pass: true} expect(Map {[1] => Map {[1] => "one"}, [2] => Map {[2] => "two"}}).not.toEqual(Map {[2] => Map {[2] => "two"}, [1] => Map {[1] => "one"}})
+ ✅ {pass: true} expect(Map {[1] => "one", [2] => "two"}).not.toEqual(Map {[2] => "two", [1] => "one"})
+ ✅ {pass: true} expect(Map {{"a": 1} => "one", {"b": 2} => "two"}).not.toEqual(Map {{"b": 2} => "two", {"a": 1} => "one"})
+ ✅ {pass: true} expect(Map {1 => ["one"], 2 => ["two"]}).not.toEqual(Map {2 => ["two"], 1 => ["one"]})
+ ✅ {pass: true} expect(Immutable.Map {}).not.toEqual(Immutable.Map {})
+ ✅ {pass: true} expect(Immutable.Map {1: "one", 2: "two"}).not.toEqual(Immutable.Map {1: "one", 2: "two"})
+ ✅ {pass: true} expect(Immutable.Map {1: "one", 2: "two"}).not.toEqual(Immutable.Map {2: "two", 1: "one"})
+ ✅ {pass: true} expect(Immutable.OrderedMap {1: "one", 2: "two"}).not.toEqual(Immutable.OrderedMap {1: "one", 2: "two"})
+ ✅ {pass: true} expect(Immutable.Map {"1": Immutable.Map {"2": {"a": 99}}}).not.toEqual(Immutable.Map {"1": Immutable.Map {"2": {"a": 99}}})
+ ✅ {pass: true} expect([97, 98, 99]).not.toEqual([97, 98, 99])
+ ✅ {pass: true} expect({"a": 1, "b": 2}).not.toEqual(ObjectContaining {"a": 1})
+ ✅ {pass: true} expect([1, 2, 3]).not.toEqual(ArrayContaining [2, 3])
+ ✅ {pass: true} expect("abcd").not.toEqual(StringContaining "bc")
+ ✅ {pass: true} expect("abcd").not.toEqual(StringMatching /bc/)
+ ✅ {pass: true} expect(true).not.toEqual(Anything)
+ ✅ {pass: true} expect([Function anonymous]).not.toEqual(Any)
+ ✅ {pass: true} expect({"a": 1, "b": [Function b], "c": true}).not.toEqual({"a": 1, "b": Any, "c": Anything})
+ ✅ {pass: true} expect("Alice").not.toEqual({"asymmetricMatch": [Function asymmetricMatch]})
+ ✅ {pass: true} expect({"nodeName": "div", "nodeType": 1}).not.toEqual({"nodeName": "div", "nodeType": 1})
+ ✅ {pass: true} expect({Symbol(foo): 1, Symbol(bar): 2}).not.toEqual({Symbol(foo): Any, Symbol(bar): 2})
+ ✅ {pass: true} expect(1n).not.toEqual(1n)
+ ✅ {pass: true} expect(0n).not.toEqual(0n)
+ ✅ {pass: true} expect([1n]).not.toEqual([1n])
+ ✅ {pass: true} expect([1n, 2]).not.toEqual([1n, 2])
+ ✅ {pass: true} expect(Immutable.List [1n]).not.toEqual(Immutable.List [1n])
+ ✅ {pass: true} expect({"a": 99n}).not.toEqual({"a": 99n})
+ ✅ {pass: true} expect(Set {1n, 2n}).not.toEqual(Set {1n, 2n})
+ ✅ assertion error matcherResult property contains matcher name, expected and actual values
+ ✅ symbol based keys in arrays are processed correctly
+ ✅ non-enumerable members should be skipped during equal
+ ✅ non-enumerable symbolic members should be skipped during equal
+.toEqual() cyclic object equality
+ ✅ properties with the same circularity are equal
+ ✅ properties with different circularity are not equal
+ ✅ are not equal if circularity is not on the same property
+.toBeInstanceOf()
+ ✅ passing Map {} and [Function Map]
+ ✅ passing [] and [Function Array]
+ ✅ passing {} and [Function A]
+ ✅ passing {} and [Function B]
+ ✅ passing {} and [Function B]
+ ✅ passing {} and [Function anonymous]
+ ✅ passing {} and [Function B]
+ ✅ passing {} and [Function name() {}]
+ ✅ failing "a" and [Function String]
+ ✅ failing 1 and [Function Number]
+ ✅ failing true and [Function Boolean]
+ ✅ failing {} and [Function B]
+ ✅ failing {} and [Function A]
+ ✅ failing undefined and [Function String]
+ ✅ failing null and [Function String]
+ ✅ failing /\w+/ and [Function anonymous]
+ ✅ failing {} and [Function RegExp]
+ ✅ throws if constructor is not a function
+.toBeTruthy(), .toBeFalsy()
+ ✅ does not accept arguments
+ ✅ '{}' is truthy
+ ✅ '[]' is truthy
+ ✅ 'true' is truthy
+ ✅ '1' is truthy
+ ✅ '"a"' is truthy
+ ✅ '0.5' is truthy
+ ✅ 'Map {}' is truthy
+ ✅ '[Function anonymous]' is truthy
+ ✅ 'Infinity' is truthy
+ ✅ '1n' is truthy
+ ✅ 'false' is falsy
+ ✅ 'null' is falsy
+ ✅ 'NaN' is falsy
+ ✅ '0' is falsy
+ ✅ '""' is falsy
+ ✅ 'undefined' is falsy
+ ✅ '0n' is falsy
+.toBeNaN()
+ ✅ {pass: true} expect(NaN).toBeNaN()
+ ✅ throws
+.toBeNull()
+ ✅ fails for '{}'
+ ✅ fails for '[]'
+ ✅ fails for 'true'
+ ✅ fails for '1'
+ ✅ fails for '"a"'
+ ✅ fails for '0.5'
+ ✅ fails for 'Map {}'
+ ✅ fails for '[Function anonymous]'
+ ✅ fails for 'Infinity'
+ ✅ fails for null with .not
+ ✅ pass for null
+.toBeDefined(), .toBeUndefined()
+ ✅ '{}' is defined
+ ✅ '[]' is defined
+ ✅ 'true' is defined
+ ✅ '1' is defined
+ ✅ '"a"' is defined
+ ✅ '0.5' is defined
+ ✅ 'Map {}' is defined
+ ✅ '[Function anonymous]' is defined
+ ✅ 'Infinity' is defined
+ ✅ '1n' is defined
+ ✅ undefined is undefined
+.toBeGreaterThan(), .toBeLessThan(), .toBeGreaterThanOrEqual(), .toBeLessThanOrEqual()
+ ✅ {pass: true} expect(1).toBeLessThan(2)
+ ✅ {pass: false} expect(2).toBeLessThan(1)
+ ✅ {pass: true} expect(2).toBeGreaterThan(1)
+ ✅ {pass: false} expect(1).toBeGreaterThan(2)
+ ✅ {pass: true} expect(1).toBeLessThanOrEqual(2)
+ ✅ {pass: false} expect(2).toBeLessThanOrEqual(1)
+ ✅ {pass: true} expect(2).toBeGreaterThanOrEqual(1)
+ ✅ {pass: false} expect(1).toBeGreaterThanOrEqual(2)
+ ✅ throws: [1, 2]
+ ✅ {pass: true} expect(-Infinity).toBeLessThan(Infinity)
+ ✅ {pass: false} expect(Infinity).toBeLessThan(-Infinity)
+ ✅ {pass: true} expect(Infinity).toBeGreaterThan(-Infinity)
+ ✅ {pass: false} expect(-Infinity).toBeGreaterThan(Infinity)
+ ✅ {pass: true} expect(-Infinity).toBeLessThanOrEqual(Infinity)
+ ✅ {pass: false} expect(Infinity).toBeLessThanOrEqual(-Infinity)
+ ✅ {pass: true} expect(Infinity).toBeGreaterThanOrEqual(-Infinity)
+ ✅ {pass: false} expect(-Infinity).toBeGreaterThanOrEqual(Infinity)
+ ✅ throws: [-Infinity, Infinity]
+ ✅ {pass: true} expect(5e-324).toBeLessThan(1.7976931348623157e+308)
+ ✅ {pass: false} expect(1.7976931348623157e+308).toBeLessThan(5e-324)
+ ✅ {pass: true} expect(1.7976931348623157e+308).toBeGreaterThan(5e-324)
+ ✅ {pass: false} expect(5e-324).toBeGreaterThan(1.7976931348623157e+308)
+ ✅ {pass: true} expect(5e-324).toBeLessThanOrEqual(1.7976931348623157e+308)
+ ✅ {pass: false} expect(1.7976931348623157e+308).toBeLessThanOrEqual(5e-324)
+ ✅ {pass: true} expect(1.7976931348623157e+308).toBeGreaterThanOrEqual(5e-324)
+ ✅ {pass: false} expect(5e-324).toBeGreaterThanOrEqual(1.7976931348623157e+308)
+ ✅ throws: [5e-324, 1.7976931348623157e+308]
+ ✅ {pass: true} expect(17).toBeLessThan(34)
+ ✅ {pass: false} expect(34).toBeLessThan(17)
+ ✅ {pass: true} expect(34).toBeGreaterThan(17)
+ ✅ {pass: false} expect(17).toBeGreaterThan(34)
+ ✅ {pass: true} expect(17).toBeLessThanOrEqual(34)
+ ✅ {pass: false} expect(34).toBeLessThanOrEqual(17)
+ ✅ {pass: true} expect(34).toBeGreaterThanOrEqual(17)
+ ✅ {pass: false} expect(17).toBeGreaterThanOrEqual(34)
+ ✅ throws: [17, 34]
+ ✅ {pass: true} expect(3).toBeLessThan(7)
+ ✅ {pass: false} expect(7).toBeLessThan(3)
+ ✅ {pass: true} expect(7).toBeGreaterThan(3)
+ ✅ {pass: false} expect(3).toBeGreaterThan(7)
+ ✅ {pass: true} expect(3).toBeLessThanOrEqual(7)
+ ✅ {pass: false} expect(7).toBeLessThanOrEqual(3)
+ ✅ {pass: true} expect(7).toBeGreaterThanOrEqual(3)
+ ✅ {pass: false} expect(3).toBeGreaterThanOrEqual(7)
+ ✅ throws: [3, 7]
+ ✅ {pass: true} expect(9).toBeLessThan(18)
+ ✅ {pass: false} expect(18).toBeLessThan(9)
+ ✅ {pass: true} expect(18).toBeGreaterThan(9)
+ ✅ {pass: false} expect(9).toBeGreaterThan(18)
+ ✅ {pass: true} expect(9).toBeLessThanOrEqual(18)
+ ✅ {pass: false} expect(18).toBeLessThanOrEqual(9)
+ ✅ {pass: true} expect(18).toBeGreaterThanOrEqual(9)
+ ✅ {pass: false} expect(9).toBeGreaterThanOrEqual(18)
+ ✅ throws: [9, 18]
+ ✅ {pass: true} expect(0.1).toBeLessThan(0.2)
+ ✅ {pass: false} expect(0.2).toBeLessThan(0.1)
+ ✅ {pass: true} expect(0.2).toBeGreaterThan(0.1)
+ ✅ {pass: false} expect(0.1).toBeGreaterThan(0.2)
+ ✅ {pass: true} expect(0.1).toBeLessThanOrEqual(0.2)
+ ✅ {pass: false} expect(0.2).toBeLessThanOrEqual(0.1)
+ ✅ {pass: true} expect(0.2).toBeGreaterThanOrEqual(0.1)
+ ✅ {pass: false} expect(0.1).toBeGreaterThanOrEqual(0.2)
+ ✅ throws: [0.1, 0.2]
+ ✅ can compare BigInt to Numbers
+ ✅ {pass: true} expect(1n).toBeLessThan(2n)
+ ✅ {pass: false} expect(2n).toBeLessThan(1n)
+ ✅ {pass: true} expect(2n).toBeGreaterThan(1n)
+ ✅ {pass: false} expect(1n).toBeGreaterThan(2n)
+ ✅ {pass: true} expect(1n).toBeLessThanOrEqual(2n)
+ ✅ {pass: false} expect(2n).toBeLessThanOrEqual(1n)
+ ✅ {pass: true} expect(2n).toBeGreaterThanOrEqual(1n)
+ ✅ {pass: false} expect(1n).toBeGreaterThanOrEqual(2n)
+ ✅ throws: [1n, 2n]
+ ✅ {pass: true} expect(17n).toBeLessThan(34n)
+ ✅ {pass: false} expect(34n).toBeLessThan(17n)
+ ✅ {pass: true} expect(34n).toBeGreaterThan(17n)
+ ✅ {pass: false} expect(17n).toBeGreaterThan(34n)
+ ✅ {pass: true} expect(17n).toBeLessThanOrEqual(34n)
+ ✅ {pass: false} expect(34n).toBeLessThanOrEqual(17n)
+ ✅ {pass: true} expect(34n).toBeGreaterThanOrEqual(17n)
+ ✅ {pass: false} expect(17n).toBeGreaterThanOrEqual(34n)
+ ✅ throws: [17n, 34n]
+ ✅ {pass: true} expect(-1).toBeLessThan(2n)
+ ✅ {pass: false} expect(2n).toBeLessThan(-1)
+ ✅ {pass: true} expect(2n).toBeGreaterThan(-1)
+ ✅ {pass: false} expect(-1).toBeGreaterThan(2n)
+ ✅ {pass: true} expect(-1).toBeLessThanOrEqual(2n)
+ ✅ {pass: false} expect(2n).toBeLessThanOrEqual(-1)
+ ✅ {pass: true} expect(2n).toBeGreaterThanOrEqual(-1)
+ ✅ {pass: false} expect(-1).toBeGreaterThanOrEqual(2n)
+ ✅ throws: [-1, 2n]
+ ✅ equal numbers: [1, 1]
+ ✅ equal numbers: [5e-324, 5e-324]
+ ✅ equal numbers: [1.7976931348623157e+308, 1.7976931348623157e+308]
+ ✅ equal numbers: [Infinity, Infinity]
+ ✅ equal numbers: [-Infinity, -Infinity]
+ ✅ equal numbers: [1, 1]
+ ✅ equal numbers: [9007199254740991, 9007199254740991]
+.toContain(), .toContainEqual()
+ ✅ iterable
+ ✅ '[1, 2, 3, 4]' contains '1'
+ ✅ '["a", "b", "c", "d"]' contains '"a"'
+ ✅ '[undefined, null]' contains 'null'
+ ✅ '[undefined, null]' contains 'undefined'
+ ✅ '[Symbol(a)]' contains 'Symbol(a)'
+ ✅ '"abcdef"' contains '"abc"'
+ ✅ '"11112111"' contains '"2"'
+ ✅ 'Set {"abc", "def"}' contains '"abc"'
+ ✅ '[0, 1]' contains '1'
+ ✅ '[1n, 2n, 3n, 4n]' contains '1n'
+ ✅ '[1, 2, 3, 3n, 4]' contains '3n'
+ ✅ '[1, 2, 3]' does not contain '4'
+ ✅ '[null, undefined]' does not contain '1'
+ ✅ '[{}, []]' does not contain '[]'
+ ✅ '[{}, []]' does not contain '{}'
+ ✅ '[1n, 2n, 3n]' does not contain '3'
+ ✅ error cases
+ ✅ '[1, 2, 3, 4]' contains a value equal to '1'
+ ✅ '["a", "b", "c", "d"]' contains a value equal to '"a"'
+ ✅ '[undefined, null]' contains a value equal to 'null'
+ ✅ '[undefined, null]' contains a value equal to 'undefined'
+ ✅ '[Symbol(a)]' contains a value equal to 'Symbol(a)'
+ ✅ '[{"a": "b"}, {"a": "c"}]' contains a value equal to '{"a": "b"}'
+ ✅ 'Set {1, 2, 3, 4}' contains a value equal to '1'
+ ✅ '[0, 1]' contains a value equal to '1'
+ ✅ '[{"a": "b"}, {"a": "c"}]' does not contain a value equal to'{"a": "d"}'
+ ✅ error cases for toContainEqual
+.toBeCloseTo
+ ✅ {pass: true} expect(0).toBeCloseTo(0)
+ ✅ {pass: true} expect(0).toBeCloseTo(0.001)
+ ✅ {pass: true} expect(1.23).toBeCloseTo(1.229)
+ ✅ {pass: true} expect(1.23).toBeCloseTo(1.226)
+ ✅ {pass: true} expect(1.23).toBeCloseTo(1.225)
+ ✅ {pass: true} expect(1.23).toBeCloseTo(1.234)
+ ✅ {pass: true} expect(Infinity).toBeCloseTo(Infinity)
+ ✅ {pass: true} expect(-Infinity).toBeCloseTo(-Infinity)
+ ✅ {pass: false} expect(0).toBeCloseTo(0.01)
+ ✅ {pass: false} expect(1).toBeCloseTo(1.23)
+ ✅ {pass: false} expect(1.23).toBeCloseTo(1.2249999)
+ ✅ {pass: false} expect(Infinity).toBeCloseTo(-Infinity)
+ ✅ {pass: false} expect(Infinity).toBeCloseTo(1.23)
+ ✅ {pass: false} expect(-Infinity).toBeCloseTo(-1.23)
+ ✅ {pass: false} expect(3.141592e-7).toBeCloseTo(3e-7, 8)
+ ✅ {pass: false} expect(56789).toBeCloseTo(51234, -4)
+ ✅ {pass: true} expect(0).toBeCloseTo(0.1, 0)
+ ✅ {pass: true} expect(0).toBeCloseTo(0.0001, 3)
+ ✅ {pass: true} expect(0).toBeCloseTo(0.000004, 5)
+ ✅ {pass: true} expect(2.0000002).toBeCloseTo(2, 5)
+.toBeCloseTo throws: Matcher error
+ ✅ promise empty isNot false received
+ ✅ promise empty isNot true expected
+ ✅ promise rejects isNot false expected
+ ✅ promise rejects isNot true received
+ ✅ promise resolves isNot false received
+ ✅ promise resolves isNot true expected
+.toMatch()
+ ✅ {pass: true} expect(foo).toMatch(foo)
+ ✅ {pass: true} expect(Foo bar).toMatch(/^foo/i)
+ ✅ throws: [bar, foo]
+ ✅ throws: [bar, /foo/]
+ ✅ throws if non String actual value passed: [1, "foo"]
+ ✅ throws if non String actual value passed: [{}, "foo"]
+ ✅ throws if non String actual value passed: [[], "foo"]
+ ✅ throws if non String actual value passed: [true, "foo"]
+ ✅ throws if non String actual value passed: [/foo/i, "foo"]
+ ✅ throws if non String actual value passed: [[Function anonymous], "foo"]
+ ✅ throws if non String actual value passed: [undefined, "foo"]
+ ✅ throws if non String/RegExp expected value passed: ["foo", 1]
+ ✅ throws if non String/RegExp expected value passed: ["foo", {}]
+ ✅ throws if non String/RegExp expected value passed: ["foo", []]
+ ✅ throws if non String/RegExp expected value passed: ["foo", true]
+ ✅ throws if non String/RegExp expected value passed: ["foo", [Function anonymous]]
+ ✅ throws if non String/RegExp expected value passed: ["foo", undefined]
+ ✅ escapes strings properly
+ ✅ does not maintain RegExp state between calls
+.toHaveLength
+ ✅ {pass: true} expect([1, 2]).toHaveLength(2)
+ ✅ {pass: true} expect([]).toHaveLength(0)
+ ✅ {pass: true} expect(["a", "b"]).toHaveLength(2)
+ ✅ {pass: true} expect("abc").toHaveLength(3)
+ ✅ {pass: true} expect("").toHaveLength(0)
+ ✅ {pass: true} expect([Function anonymous]).toHaveLength(0)
+ ✅ {pass: false} expect([1, 2]).toHaveLength(3)
+ ✅ {pass: false} expect([]).toHaveLength(1)
+ ✅ {pass: false} expect(["a", "b"]).toHaveLength(99)
+ ✅ {pass: false} expect("abc").toHaveLength(66)
+ ✅ {pass: false} expect("").toHaveLength(1)
+ ✅ error cases
+.toHaveLength matcher error expected length
+ ✅ not number
+ ✅ number Infinity
+ ✅ number NaN
+ ✅ number float
+ ✅ number negative integer
+.toHaveProperty()
+ ✅ {pass: true} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a.b.c.d', 1)
+ ✅ {pass: true} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a,b,c,d', 1)
+ ✅ {pass: true} expect({"a.b.c.d": 1}).toHaveProperty('a.b.c.d', 1)
+ ✅ {pass: true} expect({"a": {"b": [1, 2, 3]}}).toHaveProperty('a,b,1', 2)
+ ✅ {pass: true} expect({"a": {"b": [1, 2, 3]}}).toHaveProperty('a,b,1', Any)
+ ✅ {pass: true} expect({"a": 0}).toHaveProperty('a', 0)
+ ✅ {pass: true} expect({"a": {"b": undefined}}).toHaveProperty('a.b', undefined)
+ ✅ {pass: true} expect({"a": {}}).toHaveProperty('a.b', undefined)
+ ✅ {pass: true} expect({"a": {"b": {"c": 5}}}).toHaveProperty('a.b', {"c": 5})
+ ✅ {pass: true} expect({"property": 1}).toHaveProperty('property', 1)
+ ✅ {pass: true} expect({}).toHaveProperty('a', undefined)
+ ✅ {pass: true} expect({}).toHaveProperty('b', "b")
+ ✅ {pass: true} expect({}).toHaveProperty('setter', undefined)
+ ✅ {pass: true} expect({"val": true}).toHaveProperty('a', undefined)
+ ✅ {pass: true} expect({"val": true}).toHaveProperty('c', "c")
+ ✅ {pass: true} expect({"val": true}).toHaveProperty('val', true)
+ ✅ {pass: true} expect({"nodeName": "DIV"}).toHaveProperty('nodeType', 1)
+ ✅ {pass: true} expect("").toHaveProperty('length', 0)
+ ✅ {pass: true} expect([Function memoized]).toHaveProperty('memo', [])
+ ✅ {pass: false} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a.b.ttt.d', 1)
+ ✅ {pass: false} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a.b.c.d', 2)
+ ✅ {pass: false} expect({"a.b.c.d": 1}).toHaveProperty('a.b.c.d', 2)
+ ✅ {pass: false} expect({"a.b.c.d": 1}).toHaveProperty('a.b.c.d', 2)
+ ✅ {pass: false} expect({"children": ["\"That cartoon\""], "props": null, "type": "p"}).toHaveProperty('children,0', "\"That cat cartoon\"")
+ ✅ {pass: false} expect({"children": ["Roses are red.
+Violets are blue.
+Testing with Jest is good for you."], "props": null, "type": "pre"}).toHaveProperty('children,0', "Roses are red, violets are blue.
+Testing with Jest
+Is good for you.")
+ ✅ {pass: false} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a,b,c,d', 2)
+ ✅ {pass: false} expect({"a": {"b": {"c": {}}}}).toHaveProperty('a.b.c.d', 1)
+ ✅ {pass: false} expect({"a": 1}).toHaveProperty('a.b.c.d', 5)
+ ✅ {pass: false} expect({}).toHaveProperty('a', "test")
+ ✅ {pass: false} expect({"a": {"b": 3}}).toHaveProperty('a.b', undefined)
+ ✅ {pass: false} expect(1).toHaveProperty('a.b.c', "test")
+ ✅ {pass: false} expect("abc").toHaveProperty('a.b.c', {"a": 5})
+ ✅ {pass: false} expect({"a": {"b": {"c": 5}}}).toHaveProperty('a.b', {"c": 4})
+ ✅ {pass: false} expect({}).toHaveProperty('a', "a")
+ ✅ {pass: false} expect({}).toHaveProperty('b', undefined)
+ ✅ {pass: true} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a.b.c.d')
+ ✅ {pass: true} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a,b,c,d')
+ ✅ {pass: true} expect({"a.b.c.d": 1}).toHaveProperty('a.b.c.d')
+ ✅ {pass: true} expect({"a": {"b": [1, 2, 3]}}).toHaveProperty('a,b,1')
+ ✅ {pass: true} expect({"a": 0}).toHaveProperty('a')
+ ✅ {pass: true} expect({"a": {"b": undefined}}).toHaveProperty('a.b')
+ ✅ {pass: false} expect({"a": {"b": {"c": {}}}}).toHaveProperty('a.b.c.d')
+ ✅ {pass: false} expect({"a": 1}).toHaveProperty('a.b.c.d')
+ ✅ {pass: false} expect({}).toHaveProperty('a')
+ ✅ {pass: false} expect(1).toHaveProperty('a.b.c')
+ ✅ {pass: false} expect("abc").toHaveProperty('a.b.c')
+ ✅ {pass: false} expect(false).toHaveProperty('key')
+ ✅ {pass: false} expect(0).toHaveProperty('key')
+ ✅ {pass: false} expect("").toHaveProperty('key')
+ ✅ {pass: false} expect(Symbol()).toHaveProperty('key')
+ ✅ {pass: false} expect({"key": 1}).toHaveProperty('not')
+ ✅ {error} expect(null).toHaveProperty('a.b')
+ ✅ {error} expect(undefined).toHaveProperty('a')
+ ✅ {error} expect({"a": {"b": {}}}).toHaveProperty('undefined')
+ ✅ {error} expect({"a": {"b": {}}}).toHaveProperty('null')
+ ✅ {error} expect({"a": {"b": {}}}).toHaveProperty('1')
+ ✅ {error} expect({}).toHaveProperty('')
+toMatchObject() circular references simple circular references
+ ✅ {pass: true} expect({"a": "hello", "ref": [Circular]}).toMatchObject({})
+ ✅ {pass: true} expect({"a": "hello", "ref": [Circular]}).toMatchObject({"a": "hello", "ref": [Circular]})
+ ✅ {pass: false} expect({}).toMatchObject({"a": "hello", "ref": [Circular]})
+ ✅ {pass: false} expect({"a": "hello", "ref": [Circular]}).toMatchObject({"a": "world", "ref": [Circular]})
+ ✅ {pass: false} expect({"ref": "not a ref"}).toMatchObject({"a": "hello", "ref": [Circular]})
+toMatchObject() circular references transitive circular references
+ ✅ {pass: true} expect({"a": "hello", "nestedObj": {"parentObj": [Circular]}}).toMatchObject({})
+ ✅ {pass: true} expect({"a": "hello", "nestedObj": {"parentObj": [Circular]}}).toMatchObject({"a": "hello", "nestedObj": {"parentObj": [Circular]}})
+ ✅ {pass: false} expect({}).toMatchObject({"a": "hello", "nestedObj": {"parentObj": [Circular]}})
+ ✅ {pass: false} expect({"a": "world", "nestedObj": {"parentObj": [Circular]}}).toMatchObject({"a": "hello", "nestedObj": {"parentObj": [Circular]}})
+ ✅ {pass: false} expect({"nestedObj": {"parentObj": "not the parent ref"}}).toMatchObject({"a": "hello", "nestedObj": {"parentObj": [Circular]}})
+toMatchObject()
+ ✅ {pass: true} expect({"a": "b", "c": "d"}).toMatchObject({"a": "b"})
+ ✅ {pass: true} expect({"a": "b", "c": "d"}).toMatchObject({"a": "b", "c": "d"})
+ ✅ {pass: true} expect({"a": "b", "t": {"x": {"r": "r"}, "z": "z"}}).toMatchObject({"a": "b", "t": {"z": "z"}})
+ ✅ {pass: true} expect({"a": "b", "t": {"x": {"r": "r"}, "z": "z"}}).toMatchObject({"t": {"x": {"r": "r"}}})
+ ✅ {pass: true} expect({"a": [3, 4, 5], "b": "b"}).toMatchObject({"a": [3, 4, 5]})
+ ✅ {pass: true} expect({"a": [3, 4, 5, "v"], "b": "b"}).toMatchObject({"a": [3, 4, 5, "v"]})
+ ✅ {pass: true} expect({"a": 1, "c": 2}).toMatchObject({"a": Any})
+ ✅ {pass: true} expect({"a": {"x": "x", "y": "y"}}).toMatchObject({"a": {"x": Any}})
+ ✅ {pass: true} expect(Set {1, 2}).toMatchObject(Set {1, 2})
+ ✅ {pass: true} expect(Set {1, 2}).toMatchObject(Set {2, 1})
+ ✅ {pass: true} expect(2015-11-30T00:00:00.000Z).toMatchObject(2015-11-30T00:00:00.000Z)
+ ✅ {pass: true} expect({"a": 2015-11-30T00:00:00.000Z, "b": "b"}).toMatchObject({"a": 2015-11-30T00:00:00.000Z})
+ ✅ {pass: true} expect({"a": null, "b": "b"}).toMatchObject({"a": null})
+ ✅ {pass: true} expect({"a": undefined, "b": "b"}).toMatchObject({"a": undefined})
+ ✅ {pass: true} expect({"a": [{"a": "a", "b": "b"}]}).toMatchObject({"a": [{"a": "a"}]})
+ ✅ {pass: true} expect([1, 2]).toMatchObject([1, 2])
+ ✅ {pass: true} expect({"a": undefined}).toMatchObject({"a": undefined})
+ ✅ {pass: true} expect([]).toMatchObject([])
+ ✅ {pass: true} expect([Error: foo]).toMatchObject([Error: foo])
+ ✅ {pass: true} expect([Error: bar]).toMatchObject({"message": "bar"})
+ ✅ {pass: true} expect({}).toMatchObject({"a": undefined, "b": "b"})
+ ✅ {pass: true} expect({"a": "b"}).toMatchObject({"a": "b"})
+ ✅ {pass: true} expect({"a": "b", "c": "d", Symbol(jest): "jest"}).toMatchObject({"a": "b", Symbol(jest): "jest"})
+ ✅ {pass: true} expect({"a": "b", "c": "d", Symbol(jest): "jest"}).toMatchObject({"a": "b", "c": "d", Symbol(jest): "jest"})
+ ✅ {pass: true} expect({}).toMatchObject({"a": undefined, "b": "b", "c": "c"})
+ ✅ {pass: true} expect({}).toMatchObject({"d": 4})
+ ✅ {pass: true} expect({"a": "b", "toString": [Function toString]}).toMatchObject({"toString": Any})
+ ✅ {pass: false} expect({"a": "b", "c": "d"}).toMatchObject({"e": "b"})
+ ✅ {pass: false} expect({"a": "b", "c": "d"}).toMatchObject({"a": "b!", "c": "d"})
+ ✅ {pass: false} expect({"a": "a", "c": "d"}).toMatchObject({"a": Any})
+ ✅ {pass: false} expect({"a": "b", "t": {"x": {"r": "r"}, "z": "z"}}).toMatchObject({"a": "b", "t": {"z": [3]}})
+ ✅ {pass: false} expect({"a": "b", "t": {"x": {"r": "r"}, "z": "z"}}).toMatchObject({"t": {"l": {"r": "r"}}})
+ ✅ {pass: false} expect({"a": [3, 4, 5], "b": "b"}).toMatchObject({"a": [3, 4, 5, 6]})
+ ✅ {pass: false} expect({"a": [3, 4, 5], "b": "b"}).toMatchObject({"a": [3, 4]})
+ ✅ {pass: false} expect({"a": [3, 4, "v"], "b": "b"}).toMatchObject({"a": ["v"]})
+ ✅ {pass: false} expect({"a": [3, 4, 5], "b": "b"}).toMatchObject({"a": {"b": 4}})
+ ✅ {pass: false} expect({"a": [3, 4, 5], "b": "b"}).toMatchObject({"a": {"b": Any}})
+ ✅ {pass: false} expect([1, 2]).toMatchObject([1, 3])
+ ✅ {pass: false} expect([0]).toMatchObject([-0])
+ ✅ {pass: false} expect(Set {1, 2}).toMatchObject(Set {2})
+ ✅ {pass: false} expect(2015-11-30T00:00:00.000Z).toMatchObject(2015-10-10T00:00:00.000Z)
+ ✅ {pass: false} expect({"a": 2015-11-30T00:00:00.000Z, "b": "b"}).toMatchObject({"a": 2015-10-10T00:00:00.000Z})
+ ✅ {pass: false} expect({"a": null, "b": "b"}).toMatchObject({"a": "4"})
+ ✅ {pass: false} expect({"a": null, "b": "b"}).toMatchObject({"a": undefined})
+ ✅ {pass: false} expect({"a": undefined}).toMatchObject({"a": null})
+ ✅ {pass: false} expect({"a": [{"a": "a", "b": "b"}]}).toMatchObject({"a": [{"a": "c"}]})
+ ✅ {pass: false} expect({"a": 1, "b": 1, "c": 1, "d": {"e": {"f": 555}}}).toMatchObject({"d": {"e": {"f": 222}}})
+ ✅ {pass: false} expect({}).toMatchObject({"a": undefined})
+ ✅ {pass: false} expect([1, 2, 3]).toMatchObject([2, 3, 1])
+ ✅ {pass: false} expect([1, 2, 3]).toMatchObject([1, 2, 2])
+ ✅ {pass: false} expect([Error: foo]).toMatchObject([Error: bar])
+ ✅ {pass: false} expect({"a": "b"}).toMatchObject({"c": "d"})
+ ✅ {pass: false} expect({"a": "b", "c": "d", Symbol(jest): "jest"}).toMatchObject({"a": "c", Symbol(jest): Any})
+ ✅ {pass: false} expect({"a": "b"}).toMatchObject({"toString": Any})
+ ✅ throws expect(null).toMatchObject({})
+ ✅ throws expect(4).toMatchObject({})
+ ✅ throws expect("44").toMatchObject({})
+ ✅ throws expect(true).toMatchObject({})
+ ✅ throws expect(undefined).toMatchObject({})
+ ✅ throws expect({}).toMatchObject(null)
+ ✅ throws expect({}).toMatchObject(4)
+ ✅ throws expect({}).toMatchObject("some string")
+ ✅ throws expect({}).toMatchObject(true)
+ ✅ throws expect({}).toMatchObject(undefined)
+ ✅ does not match properties up in the prototype chain
+```
+### ✅ packages/expect/src/__tests__/spyMatchers.test.ts
+```
+toBeCalled
+ ✅ works only on spies or jest.fn
+ ✅ passes when called
+ ✅ .not passes when called
+ ✅ fails with any argument passed
+ ✅ .not fails with any argument passed
+ ✅ includes the custom mock name in the error message
+toHaveBeenCalled
+ ✅ works only on spies or jest.fn
+ ✅ passes when called
+ ✅ .not passes when called
+ ✅ fails with any argument passed
+ ✅ .not fails with any argument passed
+ ✅ includes the custom mock name in the error message
+toBeCalledTimes
+ ✅ .not works only on spies or jest.fn
+ ✅ only accepts a number argument
+ ✅ .not only accepts a number argument
+ ✅ passes if function called equal to expected times
+ ✅ .not passes if function called more than expected times
+ ✅ .not passes if function called less than expected times
+ ✅ includes the custom mock name in the error message
+toHaveBeenCalledTimes
+ ✅ .not works only on spies or jest.fn
+ ✅ only accepts a number argument
+ ✅ .not only accepts a number argument
+ ✅ passes if function called equal to expected times
+ ✅ .not passes if function called more than expected times
+ ✅ .not passes if function called less than expected times
+ ✅ includes the custom mock name in the error message
+lastCalledWith
+ ✅ works only on spies or jest.fn
+ ✅ works when not called
+ ✅ works with no arguments
+ ✅ works with arguments that don't match
+ ✅ works with arguments that match
+ ✅ works with trailing undefined arguments
+ ✅ works with Map
+ ✅ works with Set
+ ✅ works with Immutable.js objects
+ ✅ works with many arguments
+ ✅ works with many arguments that don't match
+ ✅ includes the custom mock name in the error message
+toHaveBeenLastCalledWith
+ ✅ works only on spies or jest.fn
+ ✅ works when not called
+ ✅ works with no arguments
+ ✅ works with arguments that don't match
+ ✅ works with arguments that match
+ ✅ works with trailing undefined arguments
+ ✅ works with Map
+ ✅ works with Set
+ ✅ works with Immutable.js objects
+ ✅ works with many arguments
+ ✅ works with many arguments that don't match
+ ✅ includes the custom mock name in the error message
+nthCalledWith
+ ✅ works only on spies or jest.fn
+ ✅ works when not called
+ ✅ works with no arguments
+ ✅ works with arguments that don't match
+ ✅ works with arguments that match
+ ✅ works with trailing undefined arguments
+ ✅ works with Map
+ ✅ works with Set
+ ✅ works with Immutable.js objects
+ ✅ works with three calls
+ ✅ positive throw matcher error for n that is not positive integer
+ ✅ positive throw matcher error for n that is not integer
+ ✅ negative throw matcher error for n that is not integer
+ ✅ includes the custom mock name in the error message
+toHaveBeenNthCalledWith
+ ✅ works only on spies or jest.fn
+ ✅ works when not called
+ ✅ works with no arguments
+ ✅ works with arguments that don't match
+ ✅ works with arguments that match
+ ✅ works with trailing undefined arguments
+ ✅ works with Map
+ ✅ works with Set
+ ✅ works with Immutable.js objects
+ ✅ works with three calls
+ ✅ positive throw matcher error for n that is not positive integer
+ ✅ positive throw matcher error for n that is not integer
+ ✅ negative throw matcher error for n that is not integer
+ ✅ includes the custom mock name in the error message
+toBeCalledWith
+ ✅ works only on spies or jest.fn
+ ✅ works when not called
+ ✅ works with no arguments
+ ✅ works with arguments that don't match
+ ✅ works with arguments that match
+ ✅ works with trailing undefined arguments
+ ✅ works with Map
+ ✅ works with Set
+ ✅ works with Immutable.js objects
+ ✅ works with many arguments
+ ✅ works with many arguments that don't match
+ ✅ includes the custom mock name in the error message
+toHaveBeenCalledWith
+ ✅ works only on spies or jest.fn
+ ✅ works when not called
+ ✅ works with no arguments
+ ✅ works with arguments that don't match
+ ✅ works with arguments that match
+ ✅ works with trailing undefined arguments
+ ✅ works with Map
+ ✅ works with Set
+ ✅ works with Immutable.js objects
+ ✅ works with many arguments
+ ✅ works with many arguments that don't match
+ ✅ includes the custom mock name in the error message
+toReturn
+ ✅ .not works only on jest.fn
+ ✅ throw matcher error if received is spy
+ ✅ passes when returned
+ ✅ passes when undefined is returned
+ ✅ passes when at least one call does not throw
+ ✅ .not passes when not returned
+ ✅ .not passes when all calls throw
+ ✅ .not passes when a call throws undefined
+ ✅ fails with any argument passed
+ ✅ .not fails with any argument passed
+ ✅ includes the custom mock name in the error message
+ ✅ incomplete recursive calls are handled properly
+toHaveReturned
+ ✅ .not works only on jest.fn
+ ✅ throw matcher error if received is spy
+ ✅ passes when returned
+ ✅ passes when undefined is returned
+ ✅ passes when at least one call does not throw
+ ✅ .not passes when not returned
+ ✅ .not passes when all calls throw
+ ✅ .not passes when a call throws undefined
+ ✅ fails with any argument passed
+ ✅ .not fails with any argument passed
+ ✅ includes the custom mock name in the error message
+ ✅ incomplete recursive calls are handled properly
+toReturnTimes
+ ✅ throw matcher error if received is spy
+ ✅ only accepts a number argument
+ ✅ .not only accepts a number argument
+ ✅ passes if function returned equal to expected times
+ ✅ calls that return undefined are counted as returns
+ ✅ .not passes if function returned more than expected times
+ ✅ .not passes if function called less than expected times
+ ✅ calls that throw are not counted
+ ✅ calls that throw undefined are not counted
+ ✅ includes the custom mock name in the error message
+ ✅ incomplete recursive calls are handled properly
+toHaveReturnedTimes
+ ✅ throw matcher error if received is spy
+ ✅ only accepts a number argument
+ ✅ .not only accepts a number argument
+ ✅ passes if function returned equal to expected times
+ ✅ calls that return undefined are counted as returns
+ ✅ .not passes if function returned more than expected times
+ ✅ .not passes if function called less than expected times
+ ✅ calls that throw are not counted
+ ✅ calls that throw undefined are not counted
+ ✅ includes the custom mock name in the error message
+ ✅ incomplete recursive calls are handled properly
+lastReturnedWith
+ ✅ works only on spies or jest.fn
+ ✅ works when not called
+ ✅ works with no arguments
+ ✅ works with argument that does not match
+ ✅ works with argument that does match
+ ✅ works with undefined
+ ✅ works with Map
+ ✅ works with Set
+ ✅ works with Immutable.js objects directly created
+ ✅ works with Immutable.js objects indirectly created
+ ✅ a call that throws is not considered to have returned
+ ✅ a call that throws undefined is not considered to have returned
+ ✅ includes the custom mock name in the error message
+lastReturnedWith lastReturnedWith
+ ✅ works with three calls
+ ✅ incomplete recursive calls are handled properly
+toHaveLastReturnedWith
+ ✅ works only on spies or jest.fn
+ ✅ works when not called
+ ✅ works with no arguments
+ ✅ works with argument that does not match
+ ✅ works with argument that does match
+ ✅ works with undefined
+ ✅ works with Map
+ ✅ works with Set
+ ✅ works with Immutable.js objects directly created
+ ✅ works with Immutable.js objects indirectly created
+ ✅ a call that throws is not considered to have returned
+ ✅ a call that throws undefined is not considered to have returned
+ ✅ includes the custom mock name in the error message
+toHaveLastReturnedWith lastReturnedWith
+ ✅ works with three calls
+ ✅ incomplete recursive calls are handled properly
+nthReturnedWith
+ ✅ works only on spies or jest.fn
+ ✅ works when not called
+ ✅ works with no arguments
+ ✅ works with argument that does not match
+ ✅ works with argument that does match
+ ✅ works with undefined
+ ✅ works with Map
+ ✅ works with Set
+ ✅ works with Immutable.js objects directly created
+ ✅ works with Immutable.js objects indirectly created
+ ✅ a call that throws is not considered to have returned
+ ✅ a call that throws undefined is not considered to have returned
+ ✅ includes the custom mock name in the error message
+nthReturnedWith nthReturnedWith
+ ✅ works with three calls
+ ✅ should replace 1st, 2nd, 3rd with first, second, third
+ ✅ positive throw matcher error for n that is not positive integer
+ ✅ should reject nth value greater than number of calls
+ ✅ positive throw matcher error for n that is not integer
+ ✅ negative throw matcher error for n that is not number
+ ✅ incomplete recursive calls are handled properly
+toHaveNthReturnedWith
+ ✅ works only on spies or jest.fn
+ ✅ works when not called
+ ✅ works with no arguments
+ ✅ works with argument that does not match
+ ✅ works with argument that does match
+ ✅ works with undefined
+ ✅ works with Map
+ ✅ works with Set
+ ✅ works with Immutable.js objects directly created
+ ✅ works with Immutable.js objects indirectly created
+ ✅ a call that throws is not considered to have returned
+ ✅ a call that throws undefined is not considered to have returned
+ ✅ includes the custom mock name in the error message
+toHaveNthReturnedWith nthReturnedWith
+ ✅ works with three calls
+ ✅ should replace 1st, 2nd, 3rd with first, second, third
+ ✅ positive throw matcher error for n that is not positive integer
+ ✅ should reject nth value greater than number of calls
+ ✅ positive throw matcher error for n that is not integer
+ ✅ negative throw matcher error for n that is not number
+ ✅ incomplete recursive calls are handled properly
+toReturnWith
+ ✅ works only on spies or jest.fn
+ ✅ works when not called
+ ✅ works with no arguments
+ ✅ works with argument that does not match
+ ✅ works with argument that does match
+ ✅ works with undefined
+ ✅ works with Map
+ ✅ works with Set
+ ✅ works with Immutable.js objects directly created
+ ✅ works with Immutable.js objects indirectly created
+ ✅ a call that throws is not considered to have returned
+ ✅ a call that throws undefined is not considered to have returned
+ ✅ includes the custom mock name in the error message
+toReturnWith returnedWith
+ ✅ works with more calls than the limit
+ ✅ incomplete recursive calls are handled properly
+toHaveReturnedWith
+ ✅ works only on spies or jest.fn
+ ✅ works when not called
+ ✅ works with no arguments
+ ✅ works with argument that does not match
+ ✅ works with argument that does match
+ ✅ works with undefined
+ ✅ works with Map
+ ✅ works with Set
+ ✅ works with Immutable.js objects directly created
+ ✅ works with Immutable.js objects indirectly created
+ ✅ a call that throws is not considered to have returned
+ ✅ a call that throws undefined is not considered to have returned
+ ✅ includes the custom mock name in the error message
+toHaveReturnedWith returnedWith
+ ✅ works with more calls than the limit
+ ✅ incomplete recursive calls are handled properly
+```
+### ✅ packages/expect/src/__tests__/stacktrace.test.ts
+```
+✅ stack trace points to correct location when using matchers
+✅ stack trace points to correct location when using nested matchers
+✅ stack trace points to correct location when throwing from a custom matcher
+```
+### ✅ packages/expect/src/__tests__/symbolInObjects.test.ts
+```
+Symbol in objects
+ ✅ should compare objects with Symbol keys
+ ✅ should compare objects with mixed keys and Symbol
+ ✅ should compare objects with different Symbol keys
+```
+### ✅ packages/expect/src/__tests__/toEqual-dom.test.ts
+```
+toEqual duck type Text
+ ✅ isNot false
+ ✅ isNot true
+toEqual duck type Element
+ ✅ isNot false
+ ✅ isNot true
+toEqual duck type Fragment
+ ✅ isNot false
+ ✅ isNot true
+toEqual document createTextNode
+ ✅ isNot false
+ ✅ isNot true
+toEqual document createElement
+ ✅ isNot false
+ ✅ isNot true
+toEqual document createDocumentFragment
+ ✅ isNot false
+ ✅ isNot true
+```
+### ✅ packages/expect/src/__tests__/toThrowMatchers.test.ts
+```
+toThrowError
+ ✅ to throw or not to throw
+ ✅ invalid arguments
+ ✅ invalid actual
+toThrowError substring
+ ✅ passes
+ ✅ did not throw at all
+ ✅ threw, but message did not match (error)
+ ✅ threw, but message did not match (non-error falsey)
+ ✅ properly escapes strings when matching against errors
+ ✅ threw, but message should not match (error)
+ ✅ threw, but message should not match (non-error truthy)
+toThrowError regexp
+ ✅ passes
+ ✅ did not throw at all
+ ✅ threw, but message did not match (error)
+ ✅ threw, but message did not match (non-error falsey)
+ ✅ threw, but message should not match (error)
+ ✅ threw, but message should not match (non-error truthy)
+toThrowError error class
+ ✅ passes
+ ✅ did not throw at all
+ ✅ threw, but class did not match (error)
+ ✅ threw, but class did not match (non-error falsey)
+ ✅ threw, but class should not match (error)
+ ✅ threw, but class should not match (error subclass)
+ ✅ threw, but class should not match (error subsubclass)
+toThrowError error-message pass
+ ✅ isNot false
+ ✅ isNot true
+toThrowError error-message fail
+ ✅ isNot false
+ ✅ isNot true
+ ✅ multiline diff highlight incorrect expected space
+toThrowError asymmetric any-Class pass
+ ✅ isNot false
+ ✅ isNot true
+toThrowError asymmetric any-Class fail
+ ✅ isNot false
+ ✅ isNot true
+toThrowError asymmetric anything pass
+ ✅ isNot false
+ ✅ isNot true
+toThrowError asymmetric anything fail
+ ✅ isNot false
+ ✅ isNot true
+toThrowError asymmetric no-symbol pass
+ ✅ isNot false
+ ✅ isNot true
+toThrowError asymmetric no-symbol fail
+ ✅ isNot false
+ ✅ isNot true
+toThrowError asymmetric objectContaining pass
+ ✅ isNot false
+ ✅ isNot true
+toThrowError asymmetric objectContaining fail
+ ✅ isNot false
+ ✅ isNot true
+toThrowError promise/async throws if Error-like object is returned
+ ✅ passes
+ ✅ did not throw at all
+ ✅ threw, but class did not match
+ ✅ threw, but should not have
+toThrowError expected is undefined
+ ✅ threw, but should not have (non-error falsey)
+toThrow
+ ✅ to throw or not to throw
+ ✅ invalid arguments
+ ✅ invalid actual
+toThrow substring
+ ✅ passes
+ ✅ did not throw at all
+ ✅ threw, but message did not match (error)
+ ✅ threw, but message did not match (non-error falsey)
+ ✅ properly escapes strings when matching against errors
+ ✅ threw, but message should not match (error)
+ ✅ threw, but message should not match (non-error truthy)
+toThrow regexp
+ ✅ passes
+ ✅ did not throw at all
+ ✅ threw, but message did not match (error)
+ ✅ threw, but message did not match (non-error falsey)
+ ✅ threw, but message should not match (error)
+ ✅ threw, but message should not match (non-error truthy)
+toThrow error class
+ ✅ passes
+ ✅ did not throw at all
+ ✅ threw, but class did not match (error)
+ ✅ threw, but class did not match (non-error falsey)
+ ✅ threw, but class should not match (error)
+ ✅ threw, but class should not match (error subclass)
+ ✅ threw, but class should not match (error subsubclass)
+toThrow error-message pass
+ ✅ isNot false
+ ✅ isNot true
+toThrow error-message fail
+ ✅ isNot false
+ ✅ isNot true
+ ✅ multiline diff highlight incorrect expected space
+toThrow asymmetric any-Class pass
+ ✅ isNot false
+ ✅ isNot true
+toThrow asymmetric any-Class fail
+ ✅ isNot false
+ ✅ isNot true
+toThrow asymmetric anything pass
+ ✅ isNot false
+ ✅ isNot true
+toThrow asymmetric anything fail
+ ✅ isNot false
+ ✅ isNot true
+toThrow asymmetric no-symbol pass
+ ✅ isNot false
+ ✅ isNot true
+toThrow asymmetric no-symbol fail
+ ✅ isNot false
+ ✅ isNot true
+toThrow asymmetric objectContaining pass
+ ✅ isNot false
+ ✅ isNot true
+toThrow asymmetric objectContaining fail
+ ✅ isNot false
+ ✅ isNot true
+toThrow promise/async throws if Error-like object is returned
+ ✅ passes
+ ✅ did not throw at all
+ ✅ threw, but class did not match
+ ✅ threw, but should not have
+toThrow expected is undefined
+ ✅ threw, but should not have (non-error falsey)
+```
+### ✅ packages/expect/src/__tests__/utils.test.ts
+```
+getPath()
+ ✅ property exists
+ ✅ property doesnt exist
+ ✅ property exist but undefined
+ ✅ property is a getter on class instance
+ ✅ property is inherited
+ ✅ path breaks
+ ✅ empty object at the end
+getObjectSubset
+ ✅ expect(getObjectSubset({"a": "b", "c": "d"}, {"a": "d"})).toEqual({"a": "b"})
+ ✅ expect(getObjectSubset({"a": [1, 2], "b": "b"}, {"a": [3, 4]})).toEqual({"a": [1, 2]})
+ ✅ expect(getObjectSubset([{"a": "b", "c": "d"}], [{"a": "z"}])).toEqual([{"a": "b"}])
+ ✅ expect(getObjectSubset([1, 2], [1, 2, 3])).toEqual([1, 2])
+ ✅ expect(getObjectSubset({"a": [1]}, {"a": [1, 2]})).toEqual({"a": [1]})
+ ✅ expect(getObjectSubset(2015-11-30T00:00:00.000Z, 2016-12-30T00:00:00.000Z)).toEqual(2015-11-30T00:00:00.000Z)
+getObjectSubset returns the object instance if the subset has no extra properties
+ ✅ Date
+getObjectSubset returns the subset instance if its property values are equal
+ ✅ Object
+getObjectSubset returns the subset instance if its property values are equal Uint8Array
+ ✅ expected
+ ✅ received
+getObjectSubset calculating subsets of objects with circular references
+ ✅ simple circular references
+ ✅ transitive circular references
+emptyObject()
+ ✅ matches an empty object
+ ✅ does not match an object with keys
+ ✅ does not match a non-object
+subsetEquality()
+ ✅ matching object returns true
+ ✅ object without keys is undefined
+ ✅ objects to not match
+ ✅ null does not return errors
+ ✅ undefined does not return errors
+subsetEquality() matching subsets with circular references
+ ✅ simple circular references
+ ✅ referenced object on same level should not regarded as circular reference
+ ✅ transitive circular references
+iterableEquality
+ ✅ returns true when given circular iterators
+ ✅ returns true when given circular Set
+ ✅ returns true when given nested Sets
+ ✅ returns false when given inequal set within a set
+ ✅ returns false when given inequal map within a set
+ ✅ returns false when given inequal set within a map
+ ✅ returns true when given circular Set shape
+ ✅ returns true when given circular key in Map
+ ✅ returns true when given nested Maps
+ ✅ returns true when given circular key and value in Map
+ ✅ returns true when given circular value in Map
+```
+### ✅ packages/jest-circus/src/__tests__/afterAll.test.ts
+```
+✅ tests are not marked done until their parent afterAll runs
+✅ describe block cannot have hooks and no tests
+✅ describe block _can_ have hooks if a child describe block has tests
+✅ describe block hooks must not run if describe block is skipped
+✅ child tests marked with todo should not run if describe block is skipped
+✅ child tests marked with only should not run if describe block is skipped
+```
+### ✅ packages/jest-circus/src/__tests__/baseTest.test.ts
+```
+✅ simple test
+✅ failures
+```
+### ✅ packages/jest-circus/src/__tests__/circusItTestError.test.ts
+```
+test/it error throwing
+ ✅ it doesn't throw an error with valid arguments
+ ✅ it throws error with missing callback function
+ ✅ it throws an error when first argument isn't a string
+ ✅ it throws an error when callback function is not a function
+ ✅ test doesn't throw an error with valid arguments
+ ✅ test throws error with missing callback function
+ ✅ test throws an error when first argument isn't a string
+ ✅ test throws an error when callback function is not a function
+```
+### ✅ packages/jest-circus/src/__tests__/circusItTodoTestError.test.ts
+```
+test/it.todo error throwing
+ ✅ todo throws error when given no arguments
+ ✅ todo throws error when given more than one argument
+ ✅ todo throws error when given none string description
+```
+### ✅ packages/jest-circus/src/__tests__/hooks.test.ts
+```
+✅ beforeEach is executed before each test in current/child describe blocks
+✅ multiple before each hooks in one describe are executed in the right order
+✅ beforeAll is exectued correctly
+```
+### ✅ packages/jest-circus/src/__tests__/hooksError.test.ts
+```
+beforeEach hooks error throwing
+ ✅ beforeEach throws an error when "String" is provided as a first argument to it
+ ✅ beforeEach throws an error when 1 is provided as a first argument to it
+ ✅ beforeEach throws an error when [] is provided as a first argument to it
+ ✅ beforeEach throws an error when {} is provided as a first argument to it
+ ✅ beforeEach throws an error when Symbol(hello) is provided as a first argument to it
+ ✅ beforeEach throws an error when true is provided as a first argument to it
+ ✅ beforeEach throws an error when null is provided as a first argument to it
+ ✅ beforeEach throws an error when undefined is provided as a first argument to it
+beforeAll hooks error throwing
+ ✅ beforeAll throws an error when "String" is provided as a first argument to it
+ ✅ beforeAll throws an error when 1 is provided as a first argument to it
+ ✅ beforeAll throws an error when [] is provided as a first argument to it
+ ✅ beforeAll throws an error when {} is provided as a first argument to it
+ ✅ beforeAll throws an error when Symbol(hello) is provided as a first argument to it
+ ✅ beforeAll throws an error when true is provided as a first argument to it
+ ✅ beforeAll throws an error when null is provided as a first argument to it
+ ✅ beforeAll throws an error when undefined is provided as a first argument to it
+afterEach hooks error throwing
+ ✅ afterEach throws an error when "String" is provided as a first argument to it
+ ✅ afterEach throws an error when 1 is provided as a first argument to it
+ ✅ afterEach throws an error when [] is provided as a first argument to it
+ ✅ afterEach throws an error when {} is provided as a first argument to it
+ ✅ afterEach throws an error when Symbol(hello) is provided as a first argument to it
+ ✅ afterEach throws an error when true is provided as a first argument to it
+ ✅ afterEach throws an error when null is provided as a first argument to it
+ ✅ afterEach throws an error when undefined is provided as a first argument to it
+afterAll hooks error throwing
+ ✅ afterAll throws an error when "String" is provided as a first argument to it
+ ✅ afterAll throws an error when 1 is provided as a first argument to it
+ ✅ afterAll throws an error when [] is provided as a first argument to it
+ ✅ afterAll throws an error when {} is provided as a first argument to it
+ ✅ afterAll throws an error when Symbol(hello) is provided as a first argument to it
+ ✅ afterAll throws an error when true is provided as a first argument to it
+ ✅ afterAll throws an error when null is provided as a first argument to it
+ ✅ afterAll throws an error when undefined is provided as a first argument to it
+```
+### ✅ packages/jest-cli/src/__tests__/cli/args.test.ts
+```
+check
+ ✅ returns true if the arguments are valid
+ ✅ raises an exception if runInBand and maxWorkers are both specified
+ ✅ raises an exception if onlyChanged and watchAll are both specified
+ ✅ raises an exception if onlyFailures and watchAll are both specified
+ ✅ raises an exception when lastCommit and watchAll are both specified
+ ✅ raises an exception if findRelatedTests is specified with no file paths
+ ✅ raises an exception if maxWorkers is specified with no number
+ ✅ allows maxWorkers to be a %
+ ✅ allows using "js" file for --config option
+ ✅ allows using "ts" file for --config option
+ ✅ allows using "mjs" file for --config option
+ ✅ allows using "cjs" file for --config option
+ ✅ allows using "json" file for --config option
+ ✅ raises an exception if selectProjects is not provided any project names
+ ✅ raises an exception if config is not a valid JSON string
+ ✅ raises an exception if config is not a supported file type
+buildArgv
+ ✅ should return only camelcased args
+```
+### ✅ packages/jest-cli/src/init/__tests__/init.test.js
+```
+init project with package.json and no jest config all questions answered with answer: "No"
+ ✅ should return the default configuration (an empty config)
+ ✅ should generate empty config with mjs extension
+init project with package.json and no jest config some questions answered with answer: "Yes"
+ ✅ should create configuration for {clearMocks: true}
+ ✅ should create configuration for {coverage: true}
+ ✅ should create configuration for {coverageProvider: "babel"}
+ ✅ should create configuration for {coverageProvider: "v8"}
+ ✅ should create configuration for {environment: "jsdom"}
+ ✅ should create configuration for {environment: "node"}
+ ✅ should create package.json with configured test command when {scripts: true}
+init no package json
+ ✅ should throw an error if there is no package.json file
+init has-jest-config-file-js ask the user whether to override config or not
+ ✅ user answered with "Yes"
+ ✅ user answered with "No"
+init has-jest-config-file-ts ask the user whether to override config or not
+ ✅ user answered with "Yes"
+ ✅ user answered with "No"
+init has-jest-config-file-mjs ask the user whether to override config or not
+ ✅ user answered with "Yes"
+ ✅ user answered with "No"
+init has-jest-config-file-cjs ask the user whether to override config or not
+ ✅ user answered with "Yes"
+ ✅ user answered with "No"
+init has-jest-config-file-json ask the user whether to override config or not
+ ✅ user answered with "Yes"
+ ✅ user answered with "No"
+init project using jest.config.ts ask the user whether he wants to use Typescript or not
+ ✅ user answered with "Yes"
+ ✅ user answered with "No"
+init has jest config in package.json
+ ✅ should ask the user whether to override config or not
+init already has "jest" in packageJson.scripts.test
+ ✅ should not ask "test script question"
+```
+### ✅ packages/jest-cli/src/init/__tests__/modifyPackageJson.test.ts
+```
+✅ should remove jest config if exists
+✅ should add test script when there are no scripts
+✅ should add test script when there are scripts
+✅ should not add test script when { shouldModifyScripts: false }
+```
+### ✅ packages/jest-config/src/__tests__/Defaults.test.ts
+```
+✅ get configuration defaults
+```
+### ✅ packages/jest-config/src/__tests__/getMaxWorkers.test.ts
+```
+getMaxWorkers
+ ✅ Returns 1 when runInBand
+ ✅ Returns 1 when the OS CPUs are not available
+ ✅ Returns the `maxWorkers` when specified
+ ✅ Returns based on the number of cpus
+getMaxWorkers % based
+ ✅ 50% = 2 workers
+ ✅ < 0 workers should become 1
+ ✅ 0% shouldn't break
+```
+### ✅ packages/jest-config/src/__tests__/normalize.test.js
+```
+✅ picks a name based on the rootDir
+✅ keeps custom project name based on the projects rootDir
+✅ keeps custom names based on the rootDir
+✅ minimal config is stable across runs
+✅ sets coverageReporters correctly when argv.json is set
+rootDir
+ ✅ throws if the options is missing a rootDir property
+automock
+ ✅ falsy automock is not overwritten
+collectCoverageOnlyFrom
+ ✅ normalizes all paths relative to rootDir
+ ✅ does not change absolute paths
+ ✅ substitutes tokens
+collectCoverageFrom
+ ✅ substitutes tokens
+findRelatedTests
+ ✅ it generates --coverageCoverageFrom patterns when needed
+roots
+ ✅ normalizes all paths relative to rootDir
+ ✅ does not change absolute paths
+ ✅ substitutes tokens
+transform
+ ✅ normalizes the path
+ ✅ pulls in config if it's passed as an array, and defaults to empty object
+haste
+ ✅ normalizes the path for hasteImplModulePath
+setupFilesAfterEnv
+ ✅ normalizes the path according to rootDir
+ ✅ does not change absolute paths
+ ✅ substitutes tokens
+setupTestFrameworkScriptFile
+ ✅ logs a deprecation warning when `setupTestFrameworkScriptFile` is used
+ ✅ logs an error when `setupTestFrameworkScriptFile` and `setupFilesAfterEnv` are used
+coveragePathIgnorePatterns
+ ✅ does not normalize paths relative to rootDir
+ ✅ does not normalize trailing slashes
+ ✅ substitutes tokens
+watchPathIgnorePatterns
+ ✅ does not normalize paths relative to rootDir
+ ✅ does not normalize trailing slashes
+ ✅ substitutes tokens
+testPathIgnorePatterns
+ ✅ does not normalize paths relative to rootDir
+ ✅ does not normalize trailing slashes
+ ✅ substitutes tokens
+modulePathIgnorePatterns
+ ✅ does not normalize paths relative to rootDir
+ ✅ does not normalize trailing slashes
+ ✅ substitutes tokens
+testRunner
+ ✅ defaults to Circus
+ ✅ resolves jasmine
+ ✅ is overwritten by argv
+coverageDirectory
+ ✅ defaults to /coverage
+testEnvironment
+ ✅ resolves to an environment and prefers jest-environment-`name`
+ ✅ throws on invalid environment names
+ ✅ works with rootDir
+babel-jest
+ ✅ correctly identifies and uses babel-jest
+ ✅ uses babel-jest if babel-jest is explicitly specified in a custom transform options
+Upgrade help
+ ✅ logs a warning when `scriptPreprocessor` and/or `preprocessorIgnorePatterns` are used
+testRegex
+ ✅ testRegex empty string is mapped to empty array
+ ✅ testRegex string is mapped to an array
+ ✅ testRegex array is preserved
+testMatch
+ ✅ testMatch default not applied if testRegex is set
+ ✅ testRegex default not applied if testMatch is set
+ ✅ throws if testRegex and testMatch are both specified
+ ✅ normalizes testMatch
+moduleDirectories
+ ✅ defaults to node_modules
+ ✅ normalizes moduleDirectories
+preset
+ ✅ throws when preset not found
+ ✅ throws when module was found but no "jest-preset.js" or "jest-preset.json" files
+ ✅ throws when a dependency is missing in the preset
+ ✅ throws when preset is invalid
+ ✅ throws when preset evaluation throws type error
+ ✅ works with "react-native"
+ ✅ searches for .json and .js preset files
+ ✅ merges with options
+ ✅ merges with options and moduleNameMapper preset is overridden by options
+ ✅ merges with options and transform preset is overridden by options
+ ✅ extracts setupFilesAfterEnv from preset
+preset with globals
+ ✅ should merge the globals preset correctly
+preset without setupFiles
+ ✅ should normalize setupFiles correctly
+preset without setupFilesAfterEnv
+ ✅ should normalize setupFilesAfterEnv correctly
+runner
+ ✅ defaults to `jest-runner`
+ ✅ resolves to runners that do not have the prefix
+ ✅ resolves to runners and prefers jest-runner-`name`
+ ✅ throw error when a runner is not found
+watchPlugins
+ ✅ defaults to undefined
+ ✅ resolves to watch plugins and prefers jest-watch-`name`
+ ✅ resolves watch plugins that do not have the prefix
+ ✅ normalizes multiple watchPlugins
+ ✅ throw error when a watch plugin is not found
+testPathPattern
+ ✅ defaults to empty
+ ✅ joins multiple --testPathPatterns and
+ ✅ gives precedence to --all
+testPathPattern --testPathPattern
+ ✅ uses --testPathPattern if set
+ ✅ ignores invalid regular expressions and logs a warning
+ ✅ joins multiple --testPathPattern if set
+testPathPattern --testPathPattern posix
+ ✅ should not escape the pattern
+testPathPattern --testPathPattern win32
+ ✅ preserves any use of "\"
+ ✅ replaces POSIX path separators
+ ✅ replaces POSIX paths in multiple args
+ ✅ coerces all patterns to strings
+testPathPattern
+ ✅ uses if set
+ ✅ ignores invalid regular expressions and logs a warning
+ ✅ joins multiple if set
+testPathPattern posix
+ ✅ should not escape the pattern
+testPathPattern win32
+ ✅ preserves any use of "\"
+ ✅ replaces POSIX path separators
+ ✅ replaces POSIX paths in multiple args
+ ✅ coerces all patterns to strings
+moduleFileExtensions
+ ✅ defaults to something useful
+ ✅ throws if missing `js` but using jest-runner
+ ✅ does not throw if missing `js` with a custom runner
+cwd
+ ✅ is set to process.cwd
+ ✅ is not lost if the config has its own cwd property
+Defaults
+ ✅ should be accepted by normalize
+displayName
+ ✅ should throw an error when displayName is is an empty object
+ ✅ should throw an error when displayName is missing color
+ ✅ should throw an error when displayName is missing name
+ ✅ should throw an error when displayName is using invalid values
+ ✅ generates a default color for the runner undefined
+ ✅ generates a default color for the runner jest-runner
+ ✅ generates a default color for the runner jest-runner-eslint
+ ✅ generates a default color for the runner jest-runner-tslint
+ ✅ generates a default color for the runner jest-runner-tsc
+testTimeout
+ ✅ should return timeout value if defined
+ ✅ should throw an error if timeout is a negative number
+extensionsToTreatAsEsm
+ ✅ should pass valid config through
+ ✅ should enforce leading dots
+ ✅ throws on .js
+ ✅ throws on .mjs
+ ✅ throws on .cjs
+```
+### ✅ packages/jest-config/src/__tests__/readConfig.test.ts
+```
+✅ readConfig() throws when an object is passed without a file path
+```
+### ✅ packages/jest-config/src/__tests__/readConfigs.test.ts
+```
+✅ readConfigs() throws when called without project paths
+✅ readConfigs() loads async config file
+✅ readConfigs() reject if async was rejected
+```
+### ✅ packages/jest-config/src/__tests__/resolveConfigPath.test.ts
+```
+Resolve config path .js
+ ✅ file path with ".js"
+ ✅ directory path with ".js"
+Resolve config path .ts
+ ✅ file path with ".ts"
+ ✅ directory path with ".ts"
+Resolve config path .mjs
+ ✅ file path with ".mjs"
+ ✅ directory path with ".mjs"
+Resolve config path .cjs
+ ✅ file path with ".cjs"
+ ✅ directory path with ".cjs"
+Resolve config path .json
+ ✅ file path with ".json"
+ ✅ directory path with ".json"
+```
+### ✅ packages/jest-config/src/__tests__/setFromArgv.test.ts
+```
+✅ maps special values to valid options
+✅ maps regular values to themselves
+✅ works with string objects
+✅ explicit flags override those from --config
+```
+### ✅ packages/jest-config/src/__tests__/validatePattern.test.ts
+```
+validate pattern function
+ ✅ without passed args returns true
+ ✅ returns true for empty pattern
+ ✅ returns true for valid pattern
+ ✅ returns false for invalid pattern
+```
+### ✅ packages/jest-console/src/__tests__/bufferedConsole.test.ts
+```
+CustomConsole assert
+ ✅ do not log when the assertion is truthy
+ ✅ do not log when the assertion is truthy and there is a message
+ ✅ log the assertion error when the assertion is falsy
+ ✅ log the assertion error when the assertion is falsy with another message argument
+CustomConsole count
+ ✅ count using the default counter
+ ✅ count using the a labeled counter
+ ✅ countReset restarts default counter
+ ✅ countReset restarts custom counter
+CustomConsole group
+ ✅ group without label
+ ✅ group with label
+ ✅ groupEnd remove the indentation of the current group
+ ✅ groupEnd can not remove the indentation below the starting point
+CustomConsole time
+ ✅ should return the time between time() and timeEnd() on default timer
+ ✅ should return the time between time() and timeEnd() on custom timer
+CustomConsole dir
+ ✅ should print the deepest value
+CustomConsole timeLog
+ ✅ should return the time between time() and timeEnd() on default timer
+ ✅ should return the time between time() and timeEnd() on custom timer
+ ✅ default timer with data
+ ✅ custom timer with data
+CustomConsole console
+ ✅ should be able to initialize console instance
+```
+### ✅ packages/jest-console/src/__tests__/CustomConsole.test.ts
+```
+CustomConsole log
+ ✅ should print to stdout
+CustomConsole error
+ ✅ should print to stderr
+CustomConsole warn
+ ✅ should print to stderr
+CustomConsole assert
+ ✅ do not log when the assertion is truthy
+ ✅ do not log when the assertion is truthy and there is a message
+ ✅ log the assertion error when the assertion is falsy
+ ✅ log the assertion error when the assertion is falsy with another message argument
+CustomConsole count
+ ✅ count using the default counter
+ ✅ count using the a labeled counter
+ ✅ countReset restarts default counter
+ ✅ countReset restarts custom counter
+CustomConsole group
+ ✅ group without label
+ ✅ group with label
+ ✅ groupEnd remove the indentation of the current group
+ ✅ groupEnd can not remove the indentation below the starting point
+CustomConsole time
+ ✅ should return the time between time() and timeEnd() on default timer
+ ✅ should return the time between time() and timeEnd() on custom timer
+CustomConsole dir
+ ✅ should print the deepest value
+CustomConsole timeLog
+ ✅ should return the time between time() and timeEnd() on default timer
+ ✅ should return the time between time() and timeEnd() on custom timer
+ ✅ default timer with data
+ ✅ custom timer with data
+CustomConsole console
+ ✅ should be able to initialize console instance
+```
+### ✅ packages/jest-console/src/__tests__/getConsoleOutput.test.ts
+```
+getConsoleOutput
+ ✅ takes noStackTrace and pass it on for assert
+ ✅ takes noStackTrace and pass it on for count
+ ✅ takes noStackTrace and pass it on for debug
+ ✅ takes noStackTrace and pass it on for dir
+ ✅ takes noStackTrace and pass it on for dirxml
+ ✅ takes noStackTrace and pass it on for error
+ ✅ takes noStackTrace and pass it on for group
+ ✅ takes noStackTrace and pass it on for groupCollapsed
+ ✅ takes noStackTrace and pass it on for info
+ ✅ takes noStackTrace and pass it on for log
+ ✅ takes noStackTrace and pass it on for time
+ ✅ takes noStackTrace and pass it on for warn
+```
+### ✅ packages/jest-core/src/__tests__/FailedTestsCache.test.js
+```
+FailedTestsCache
+ ✅ should filter tests
+```
+### ✅ packages/jest-core/src/__tests__/getNoTestsFoundMessage.test.js
+```
+getNoTestsFoundMessage
+ ✅ returns correct message when monitoring only failures
+ ✅ returns correct message when monitoring only changed
+ ✅ returns correct message with verbose option
+ ✅ returns correct message without options
+ ✅ returns correct message with passWithNoTests
+```
+### ✅ packages/jest-core/src/__tests__/globals.test.ts
+```
+Common globals
+ ✅ check process
+```
+### ✅ packages/jest-core/src/__tests__/runJest.test.js
+```
+runJest
+ ✅ when watch is set then exit process
+ ✅ when watch is set then an error message is printed
+```
+### ✅ packages/jest-core/src/__tests__/SearchSource.test.ts
+```
+SearchSource isTestFilePath
+ ✅ supports ../ paths and unix separators via testRegex
+ ✅ supports unix separators
+ ✅ supports win32 separators
+SearchSource testPathsMatching
+ ✅ finds tests matching a pattern via testRegex
+ ✅ finds tests matching a pattern via testMatch
+ ✅ finds tests matching a JS regex pattern
+ ✅ finds tests matching a JS glob pattern
+ ✅ finds tests matching a JS with overriding glob patterns
+ ✅ finds tests with default file extensions using testRegex
+ ✅ finds tests with default file extensions using testMatch
+ ✅ finds tests with parentheses in their rootDir when using testMatch
+ ✅ finds tests with similar but custom file extensions
+ ✅ finds tests with totally custom foobar file extensions
+ ✅ finds tests with many kinds of file extensions
+ ✅ finds tests using a regex only
+ ✅ finds tests using a glob only
+SearchSource findRelatedTests
+ ✅ makes sure a file is related to itself
+ ✅ finds tests that depend directly on the path
+ ✅ excludes untested files from coverage
+SearchSource findRelatedTestsFromPattern
+ ✅ returns empty search result for empty input
+ ✅ returns empty search result for invalid input
+ ✅ returns empty search result if no related tests were found
+ ✅ finds tests for a single file
+ ✅ finds tests for multiple files
+ ✅ does not mistake roots folders with prefix names
+SearchSource findRelatedSourcesFromTestsInChangedFiles
+ ✅ return empty set if no SCM
+ ✅ return sources required by tests
+```
+### ✅ packages/jest-core/src/__tests__/SnapshotInteractiveMode.test.js
+```
+SnapshotInteractiveMode
+ ✅ is inactive at construction
+ ✅ call to run process the first file
+ ✅ call to abort
+ ✅ call to reset
+ ✅ press Q or ESC triggers an abort
+ ✅ press ENTER trigger a run
+ ✅ skip 1 test, then restart
+ ✅ skip 1 test, then quit
+ ✅ update 1 test, then finish and return
+ ✅ skip 2 tests, then finish and restart
+ ✅ update 2 tests, then finish and return
+ ✅ update 1 test, skip 1 test, then finish and restart
+ ✅ skip 1 test, update 1 test, then finish and restart
+```
+### ✅ packages/jest-core/src/__tests__/TestScheduler.test.js
+```
+✅ config for reporters supports `default`
+✅ .addReporter() .removeReporter()
+✅ schedule tests run in parallel per default
+✅ schedule tests run in serial if the runner flags them
+✅ should bail after `n` failures
+✅ should not bail if less than `n` failures
+✅ should set runInBand to run in serial
+✅ should set runInBand to not run in serial
+```
+### ✅ packages/jest-core/src/__tests__/testSchedulerHelper.test.js
+```
+✅ shouldRunInBand() - should return true for runInBand mode
+✅ shouldRunInBand() - should return true for runInBand mode
+✅ shouldRunInBand() - should return false for runInBand mode
+✅ shouldRunInBand() - should return false for runInBand mode
+✅ shouldRunInBand() - should return false for runInBand mode
+✅ shouldRunInBand() - should return true for runInBand mode
+✅ shouldRunInBand() - should return false for runInBand mode
+✅ shouldRunInBand() - should return true for runInBand mode
+✅ shouldRunInBand() - should return true for runInBand mode
+✅ shouldRunInBand() - should return false for runInBand mode
+✅ shouldRunInBand() - should return false for runInBand mode
+✅ shouldRunInBand() - should return true for runInBand mode
+```
+### ✅ packages/jest-core/src/__tests__/watch.test.js
+```
+Watch mode flows
+ ✅ Correctly passing test path pattern
+ ✅ Correctly passing test name pattern
+ ✅ Runs Jest once by default and shows usage
+ ✅ Runs Jest in a non-interactive environment not showing usage
+ ✅ resolves relative to the package root
+ ✅ shows prompts for WatchPlugins in alphabetical order
+ ✅ shows update snapshot prompt (without interactive)
+ ✅ shows update snapshot prompt (with interactive)
+ ✅ allows WatchPlugins to hook into JestHook
+ ✅ allows WatchPlugins to override eligible internal plugins
+ ✅ allows WatchPlugins to be configured
+ ✅ allows WatchPlugins to hook into file system changes
+ ✅ makes watch plugin initialization errors look nice
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ allows WatchPlugins to modify only white-listed global config keys
+ ✅ triggers enter on a WatchPlugin when its key is pressed
+ ✅ prevents Jest from handling keys when active and returns control when end is called
+ ✅ Pressing "o" runs test in "only changed files" mode
+ ✅ Pressing "a" runs test in "watch all" mode
+ ✅ Pressing "ENTER" reruns the tests
+ ✅ Pressing "t" reruns the tests in "test name pattern" mode
+ ✅ Pressing "p" reruns the tests in "filename pattern" mode
+ ✅ Can combine "p" and "t" filters
+ ✅ Pressing "u" reruns the tests in "update snapshot" mode
+ ✅ passWithNoTest should be set to true in watch mode
+ ✅ shows the correct usage for the f key in "only failed tests" mode
+Watch mode flows when dealing with potential watch plugin key conflicts
+ ✅ forbids WatchPlugins overriding reserved internal plugins
+ ✅ forbids WatchPlugins overriding reserved internal plugins
+ ✅ forbids WatchPlugins overriding reserved internal plugins
+ ✅ allows WatchPlugins to override non-reserved internal plugins
+ ✅ allows WatchPlugins to override non-reserved internal plugins
+ ✅ forbids third-party WatchPlugins overriding each other
+```
+### ✅ packages/jest-core/src/__tests__/watchFileChanges.test.ts
+```
+Watch mode flows with changed files
+ ✅ should correct require new files without legacy cache
+```
+### ✅ packages/jest-core/src/__tests__/watchFilenamePatternMode.test.js
+```
+Watch mode flows
+ ✅ Pressing "P" enters pattern mode
+ ✅ Pressing "c" clears the filters
+```
+### ✅ packages/jest-core/src/__tests__/watchTestNamePatternMode.test.js
+```
+Watch mode flows
+ ✅ Pressing "T" enters pattern mode
+```
+### ✅ packages/jest-core/src/lib/__tests__/isValidPath.test.ts
+```
+✅ is valid when it is a file inside roots
+✅ is not valid when it is a snapshot file
+✅ is not valid when it is a file in the coverage dir
+```
+### ✅ packages/jest-core/src/lib/__tests__/logDebugMessages.test.ts
+```
+✅ prints the jest version
+✅ prints the test framework name
+✅ prints the config object
+```
+### ✅ packages/jest-create-cache-key-function/src/__tests__/index.test.ts
+```
+✅ creation of a cache key
+```
+### ✅ packages/jest-diff/src/__tests__/diff.test.ts
+```
+different types
+ ✅ '1' and 'a'
+ ✅ '[object Object]' and 'a'
+ ✅ '' and '2'
+ ✅ 'null' and 'undefined'
+ ✅ '() => {}' and '3'
+no visual difference
+ ✅ '"a"' and '"a"'
+ ✅ '{}' and '{}'
+ ✅ '[]' and '[]'
+ ✅ '[1,2]' and '[1,2]'
+ ✅ '11' and '11'
+ ✅ 'null' and 'null'
+ ✅ 'null' and 'null'
+ ✅ 'undefined' and 'undefined'
+ ✅ 'null' and 'null'
+ ✅ 'undefined' and 'undefined'
+ ✅ 'false' and 'false'
+ ✅ '{"a":1}' and '{"a":1}'
+ ✅ '{"a":{"b":5}}' and '{"a":{"b":5}}'
+ ✅ Map key order should be irrelevant
+ ✅ Set value order should be irrelevant
+✅ oneline strings
+✅ numbers
+✅ -0 and 0
+✅ booleans
+✅ collapses big diffs to patch format
+falls back to not call toJSON if serialization has no differences
+ ✅ but then objects have differences
+ ✅ and then objects have no differences
+falls back to not call toJSON if it throws
+ ✅ and then objects have differences
+ ✅ and then objects have no differences
+multiline strings
+ ✅ (unexpanded)
+ ✅ (expanded)
+objects
+ ✅ (unexpanded)
+ ✅ (expanded)
+multiline string non-snapshot
+ ✅ (unexpanded)
+ ✅ (expanded)
+multiline string snapshot
+ ✅ (unexpanded)
+ ✅ (expanded)
+React elements
+ ✅ (unexpanded)
+ ✅ (expanded)
+multiline string as value of object property (non-snapshot)
+ ✅ (unexpanded)
+ ✅ (expanded)
+multiline string as value of object property (snapshot)
+ ✅ (unexpanded)
+ ✅ (expanded)
+indentation in JavaScript structures from less to more
+ ✅ (unexpanded)
+ ✅ (expanded)
+indentation in JavaScript structures from more to less
+ ✅ (unexpanded)
+ ✅ (expanded)
+color of text
+ ✅ (expanded)
+ ✅ (unexpanded)
+indentation in React elements (non-snapshot) from less to more
+ ✅ (unexpanded)
+ ✅ (expanded)
+indentation in React elements (non-snapshot) from more to less
+ ✅ (unexpanded)
+ ✅ (expanded)
+indentation in React elements (snapshot) from less to more
+ ✅ (unexpanded)
+ ✅ (expanded)
+indentation in React elements (snapshot) from more to less
+ ✅ (unexpanded)
+ ✅ (expanded)
+outer React element (non-snapshot) from less to more
+ ✅ (unexpanded)
+ ✅ (expanded)
+outer React element (non-snapshot) from more to less
+ ✅ (unexpanded)
+ ✅ (expanded)
+trailing newline in multiline string not enclosed in quotes from less to more
+ ✅ (unexpanded)
+ ✅ (expanded)
+trailing newline in multiline string not enclosed in quotes from more to less
+ ✅ (unexpanded)
+ ✅ (expanded)
+context
+ ✅ number of lines: -1 (5 default)
+ ✅ number of lines: 0
+ ✅ number of lines: 1
+ ✅ number of lines: 2
+ ✅ number of lines: 3.1 (5 default)
+ ✅ number of lines: undefined (5 default)
+diffLinesUnified edge cases
+ ✅ a empty string b empty string
+ ✅ a empty string b one line
+ ✅ a multiple lines b empty string
+ ✅ a one line b multiple lines
+diffLinesUnified2 edge cases
+ ✅ a empty string b empty string
+ ✅ a empty string b one line
+ ✅ a multiple lines b empty string
+ ✅ a one line b multiple lines
+diffLinesUnified2 edge cases lengths not equal
+ ✅ a
+ ✅ b
+diffStringsUnified edge cases
+ ✅ empty both a and b
+ ✅ empty only a
+ ✅ empty only b
+ ✅ equal both non-empty
+ ✅ multiline has no common after clean up chaff
+ ✅ one-line has no common after clean up chaff
+options 7980
+ ✅ diff
+ ✅ diffStringsUnified
+options change indicators
+ ✅ diff
+options change color
+ ✅ diffStringsUnified
+ ✅ no diff
+options common
+ ✅ diff
+ ✅ no diff
+options includeChangeCounts false
+ ✅ diffLinesUnified
+ ✅ diffStringsUnified
+options includeChangeCounts true padding
+ ✅ diffLinesUnified a has 2 digits
+ ✅ diffLinesUnified b has 2 digits
+ ✅ diffStringsUnified
+options omitAnnotationLines true
+ ✅ diff
+ ✅ diffStringsUnified and includeChangeCounts true
+ ✅ diffStringsUnified empty strings
+options trailingSpaceFormatter
+ ✅ diffDefault default no color
+ ✅ diffDefault middle dot
+ ✅ diffDefault yellowish common
+options emptyFirstOrLastLinePlaceholder default empty string
+ ✅ diffDefault
+ ✅ diffStringsUnified
+```
+### ✅ packages/jest-diff/src/__tests__/diffStringsRaw.test.ts
+```
+diffStringsRaw
+ ✅ one-line with cleanup
+ ✅ one-line without cleanup
+```
+### ✅ packages/jest-diff/src/__tests__/getAlignedDiffs.test.ts
+```
+getAlignedDiffs lines
+ ✅ change preceding and following common
+ ✅ common preceding and following change
+ ✅ common at end when both current change lines are empty
+ ✅ common between delete and insert
+ ✅ common between insert and delete
+getAlignedDiffs newline
+ ✅ delete only
+ ✅ insert only
+ ✅ delete with adjacent change
+ ✅ insert with adjacent changes
+ ✅ change from space
+ ✅ change to space
+getAlignedDiffs substrings first
+ ✅ common when both current change lines are empty
+ ✅ common when either current change line is non-empty
+ ✅ delete completes the current line
+ ✅ insert completes the current line
+getAlignedDiffs substrings middle
+ ✅ is empty in delete between common
+ ✅ is empty in insert at start
+ ✅ is non-empty in delete at end
+ ✅ is non-empty in insert between common
+getAlignedDiffs substrings last
+ ✅ is empty in delete at end
+ ✅ is empty in insert at end
+ ✅ is non-empty in common not at end
+getAlignedDiffs strings
+ ✅ change at start and delete or insert at end
+ ✅ delete or insert at start and change at end
+```
+### ✅ packages/jest-diff/src/__tests__/joinAlignedDiffs.test.ts
+```
+joinAlignedDiffsExpand
+ ✅ first line is empty common
+joinAlignedDiffsNoExpand
+ ✅ patch 0 with context 1 and change at start and end
+ ✅ patch 0 with context 5 and first line is empty common
+ ✅ patch 1 with context 4 and last line is empty common
+ ✅ patch 2 with context 3
+ ✅ patch 3 with context 2 and omit excess common at start
+```
+### ✅ packages/jest-docblock/src/__tests__/index.test.ts
+```
+docblock
+ ✅ extracts valid docblock with line comment
+ ✅ extracts valid docblock
+ ✅ extracts valid docblock with more comments
+ ✅ extracts from invalid docblock
+ ✅ returns extract and parsedocblock
+ ✅ parses directives out of a docblock
+ ✅ parses multiple of the same directives out of a docblock
+ ✅ parses >=3 of the same directives out of a docblock
+ ✅ parses directives out of a docblock with comments
+ ✅ parses directives out of a docblock with line comments
+ ✅ parses multiline directives
+ ✅ parses multiline directives even if there are linecomments within the docblock
+ ✅ supports slashes in @team directive
+ ✅ extracts comments from docblock
+ ✅ extracts multiline comments from docblock
+ ✅ preserves leading whitespace in multiline comments from docblock
+ ✅ removes leading newlines in multiline comments from docblock
+ ✅ extracts comments from beginning and end of docblock
+ ✅ preserve urls within a pragma's values
+ ✅ strip linecomments from pragmas but preserve for comments
+ ✅ extracts docblock comments as CRLF when docblock contains CRLF
+ ✅ extracts docblock comments as LF when docblock contains LF
+ ✅ strips the docblock out of a file that contains a top docblock
+ ✅ returns a file unchanged if there is no top docblock to strip
+ ✅ prints docblocks with no pragmas as empty string
+ ✅ prints docblocks with one pragma on one line
+ ✅ prints docblocks with multiple pragmas on multiple lines
+ ✅ prints docblocks with multiple of the same pragma
+ ✅ prints docblocks with pragmas
+ ✅ prints docblocks with comments
+ ✅ prints docblocks with comments and no keys
+ ✅ prints docblocks with multiline comments
+ ✅ prints docblocks that are parseable
+ ✅ can augment existing docblocks with comments
+ ✅ prints docblocks using CRLF if comments contains CRLF
+ ✅ prints docblocks using LF if comments contains LF
+```
+### ✅ packages/jest-each/src/__tests__/array.test.ts
+```
+jest-each .test
+ ✅ throws an error when not called with an array
+ ✅ throws an error when called with an empty array
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using printf format
+ ✅ does not call global test with title containing more param values than sprintf placeholders
+ ✅ calls global test title with %p placeholder injected at the correct positions
+ ✅ does not calls global test title with %p placeholder when no data is supplied at given position
+ ✅ calls global with cb function containing all parameters of each test case when given 1d array
+ ✅ calls global with cb function containing all parameters of each test case 2d array
+ ✅ calls global with given timeout
+jest-each .test.concurrent
+ ✅ throws an error when not called with an array
+ ✅ throws an error when called with an empty array
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using printf format
+ ✅ does not call global test with title containing more param values than sprintf placeholders
+ ✅ calls global test title with %p placeholder injected at the correct positions
+ ✅ does not calls global test title with %p placeholder when no data is supplied at given position
+ ✅ calls global with cb function containing all parameters of each test case when given 1d array
+ ✅ calls global with cb function containing all parameters of each test case 2d array
+ ✅ calls global with given timeout
+jest-each .test.concurrent.only
+ ✅ throws an error when not called with an array
+ ✅ throws an error when called with an empty array
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using printf format
+ ✅ does not call global test with title containing more param values than sprintf placeholders
+ ✅ calls global test title with %p placeholder injected at the correct positions
+ ✅ does not calls global test title with %p placeholder when no data is supplied at given position
+ ✅ calls global with cb function containing all parameters of each test case when given 1d array
+ ✅ calls global with cb function containing all parameters of each test case 2d array
+ ✅ calls global with given timeout
+jest-each .test.concurrent.skip
+ ✅ throws an error when not called with an array
+ ✅ throws an error when called with an empty array
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using printf format
+ ✅ does not call global test with title containing more param values than sprintf placeholders
+ ✅ calls global test title with %p placeholder injected at the correct positions
+ ✅ does not calls global test title with %p placeholder when no data is supplied at given position
+ ✅ calls global with cb function containing all parameters of each test case when given 1d array
+ ✅ calls global with cb function containing all parameters of each test case 2d array
+ ✅ calls global with given timeout
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using sprintf format
+ ✅ calls global with title with placeholder values correctly interpolated
+jest-each .test.only
+ ✅ throws an error when not called with an array
+ ✅ throws an error when called with an empty array
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using printf format
+ ✅ does not call global test with title containing more param values than sprintf placeholders
+ ✅ calls global test title with %p placeholder injected at the correct positions
+ ✅ does not calls global test title with %p placeholder when no data is supplied at given position
+ ✅ calls global with cb function containing all parameters of each test case when given 1d array
+ ✅ calls global with cb function containing all parameters of each test case 2d array
+ ✅ calls global with given timeout
+jest-each .it
+ ✅ throws an error when not called with an array
+ ✅ throws an error when called with an empty array
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using printf format
+ ✅ does not call global test with title containing more param values than sprintf placeholders
+ ✅ calls global test title with %p placeholder injected at the correct positions
+ ✅ does not calls global test title with %p placeholder when no data is supplied at given position
+ ✅ calls global with cb function containing all parameters of each test case when given 1d array
+ ✅ calls global with cb function containing all parameters of each test case 2d array
+ ✅ calls global with given timeout
+jest-each .fit
+ ✅ throws an error when not called with an array
+ ✅ throws an error when called with an empty array
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using printf format
+ ✅ does not call global test with title containing more param values than sprintf placeholders
+ ✅ calls global test title with %p placeholder injected at the correct positions
+ ✅ does not calls global test title with %p placeholder when no data is supplied at given position
+ ✅ calls global with cb function containing all parameters of each test case when given 1d array
+ ✅ calls global with cb function containing all parameters of each test case 2d array
+ ✅ calls global with given timeout
+jest-each .it.only
+ ✅ throws an error when not called with an array
+ ✅ throws an error when called with an empty array
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using printf format
+ ✅ does not call global test with title containing more param values than sprintf placeholders
+ ✅ calls global test title with %p placeholder injected at the correct positions
+ ✅ does not calls global test title with %p placeholder when no data is supplied at given position
+ ✅ calls global with cb function containing all parameters of each test case when given 1d array
+ ✅ calls global with cb function containing all parameters of each test case 2d array
+ ✅ calls global with given timeout
+jest-each .describe
+ ✅ throws an error when not called with an array
+ ✅ throws an error when called with an empty array
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using printf format
+ ✅ does not call global test with title containing more param values than sprintf placeholders
+ ✅ calls global test title with %p placeholder injected at the correct positions
+ ✅ does not calls global test title with %p placeholder when no data is supplied at given position
+ ✅ calls global with cb function containing all parameters of each test case when given 1d array
+ ✅ calls global with cb function containing all parameters of each test case 2d array
+ ✅ calls global with given timeout
+jest-each .fdescribe
+ ✅ throws an error when not called with an array
+ ✅ throws an error when called with an empty array
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using printf format
+ ✅ does not call global test with title containing more param values than sprintf placeholders
+ ✅ calls global test title with %p placeholder injected at the correct positions
+ ✅ does not calls global test title with %p placeholder when no data is supplied at given position
+ ✅ calls global with cb function containing all parameters of each test case when given 1d array
+ ✅ calls global with cb function containing all parameters of each test case 2d array
+ ✅ calls global with given timeout
+jest-each .describe.only
+ ✅ throws an error when not called with an array
+ ✅ throws an error when called with an empty array
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using printf format
+ ✅ does not call global test with title containing more param values than sprintf placeholders
+ ✅ calls global test title with %p placeholder injected at the correct positions
+ ✅ does not calls global test title with %p placeholder when no data is supplied at given position
+ ✅ calls global with cb function containing all parameters of each test case when given 1d array
+ ✅ calls global with cb function containing all parameters of each test case 2d array
+ ✅ calls global with given timeout
+jest-each done callback
+ ✅ calls [ 'test' ] with done when cb function has more args than params of given test row
+ ✅ calls [ 'test', 'only' ] with done when cb function has more args than params of given test row
+ ✅ calls [ 'test', 'concurrent' ] with done when cb function has more args than params of given test row
+ ✅ calls [ 'test', 'concurrent', 'only' ] with done when cb function has more args than params of given test row
+ ✅ calls [ 'it' ] with done when cb function has more args than params of given test row
+ ✅ calls [ 'fit' ] with done when cb function has more args than params of given test row
+ ✅ calls [ 'it', 'only' ] with done when cb function has more args than params of given test row
+ ✅ does not call [ 'describe' ] with done when test function has more args than params of given test row
+ ✅ does not call [ 'fdescribe' ] with done when test function has more args than params of given test row
+ ✅ does not call [ 'describe', 'only' ] with done when test function has more args than params of given test row
+jest-each .xtest
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using sprintf format
+ ✅ calls global with title with placeholder values correctly interpolated
+jest-each .test.skip
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using sprintf format
+ ✅ calls global with title with placeholder values correctly interpolated
+jest-each .xit
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using sprintf format
+ ✅ calls global with title with placeholder values correctly interpolated
+jest-each .it.skip
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using sprintf format
+ ✅ calls global with title with placeholder values correctly interpolated
+jest-each .xdescribe
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using sprintf format
+ ✅ calls global with title with placeholder values correctly interpolated
+jest-each .describe.skip
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using sprintf format
+ ✅ calls global with title with placeholder values correctly interpolated
+```
+### ✅ packages/jest-each/src/__tests__/index.test.ts
+```
+array .add
+ ✅ returns the result of adding 0 to 0
+ ✅ returns the result of adding 0 to 1
+ ✅ returns the result of adding 1 to 1
+concurrent .add
+ ✅ returns the result of adding 0 to 0
+ ✅ returns the result of adding 0 to 1
+ ✅ returns the result of adding 1 to 1
+template .add
+ ✅ returns 0 when given 0 and 0
+ ✅ returns 1 when given 0 and 1
+ ✅ returns 2 when given 1 and 1
+✅ throws an error when not called with the right number of arguments
+```
+### ✅ packages/jest-each/src/__tests__/template.test.ts
+```
+jest-each .test
+ ✅ throws error when there are additional words in first column heading
+ ✅ throws error when there are additional words in second column heading
+ ✅ throws error when there are additional words in last column heading
+ ✅ does not throw error when there is additional words in template after heading row
+ ✅ does not throw error when there is only one column
+ ✅ does not throw error when there is only one column with additional words in template after heading
+ ✅ throws error when there are no arguments for given headings
+ ✅ throws error when there are fewer arguments than headings when given one row
+ ✅ throws error when there are fewer arguments than headings over multiple rows
+ ✅ throws an error when called with an empty string
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+ ✅ calls global with title containing $key in multiple positions
+ ✅ calls global with title containing $key.path
+ ✅ calls global with title containing last seen object when $key.path is invalid
+ ✅ calls global with cb function with object built from table headings and values
+ ✅ calls global with given timeout
+ ✅ formats primitive values using .toString()
+jest-each .test.concurrent
+ ✅ throws error when there are additional words in first column heading
+ ✅ throws error when there are additional words in second column heading
+ ✅ throws error when there are additional words in last column heading
+ ✅ does not throw error when there is additional words in template after heading row
+ ✅ does not throw error when there is only one column
+ ✅ does not throw error when there is only one column with additional words in template after heading
+ ✅ throws error when there are no arguments for given headings
+ ✅ throws error when there are fewer arguments than headings when given one row
+ ✅ throws error when there are fewer arguments than headings over multiple rows
+ ✅ throws an error when called with an empty string
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+ ✅ calls global with title containing $key in multiple positions
+ ✅ calls global with title containing $key.path
+ ✅ calls global with title containing last seen object when $key.path is invalid
+ ✅ calls global with cb function with object built from table headings and values
+ ✅ calls global with given timeout
+ ✅ formats primitive values using .toString()
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+jest-each .test.concurrent.only
+ ✅ throws error when there are additional words in first column heading
+ ✅ throws error when there are additional words in second column heading
+ ✅ throws error when there are additional words in last column heading
+ ✅ does not throw error when there is additional words in template after heading row
+ ✅ does not throw error when there is only one column
+ ✅ does not throw error when there is only one column with additional words in template after heading
+ ✅ throws error when there are no arguments for given headings
+ ✅ throws error when there are fewer arguments than headings when given one row
+ ✅ throws error when there are fewer arguments than headings over multiple rows
+ ✅ throws an error when called with an empty string
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+ ✅ calls global with title containing $key in multiple positions
+ ✅ calls global with title containing $key.path
+ ✅ calls global with title containing last seen object when $key.path is invalid
+ ✅ calls global with cb function with object built from table headings and values
+ ✅ calls global with given timeout
+ ✅ formats primitive values using .toString()
+jest-each .test.concurrent.skip
+ ✅ throws error when there are additional words in first column heading
+ ✅ throws error when there are additional words in second column heading
+ ✅ throws error when there are additional words in last column heading
+ ✅ does not throw error when there is additional words in template after heading row
+ ✅ does not throw error when there is only one column
+ ✅ does not throw error when there is only one column with additional words in template after heading
+ ✅ throws error when there are no arguments for given headings
+ ✅ throws error when there are fewer arguments than headings when given one row
+ ✅ throws error when there are fewer arguments than headings over multiple rows
+ ✅ throws an error when called with an empty string
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+ ✅ calls global with title containing $key in multiple positions
+ ✅ calls global with title containing $key.path
+ ✅ calls global with title containing last seen object when $key.path is invalid
+ ✅ calls global with cb function with object built from table headings and values
+ ✅ calls global with given timeout
+ ✅ formats primitive values using .toString()
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+jest-each .test.only
+ ✅ throws error when there are additional words in first column heading
+ ✅ throws error when there are additional words in second column heading
+ ✅ throws error when there are additional words in last column heading
+ ✅ does not throw error when there is additional words in template after heading row
+ ✅ does not throw error when there is only one column
+ ✅ does not throw error when there is only one column with additional words in template after heading
+ ✅ throws error when there are no arguments for given headings
+ ✅ throws error when there are fewer arguments than headings when given one row
+ ✅ throws error when there are fewer arguments than headings over multiple rows
+ ✅ throws an error when called with an empty string
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+ ✅ calls global with title containing $key in multiple positions
+ ✅ calls global with title containing $key.path
+ ✅ calls global with title containing last seen object when $key.path is invalid
+ ✅ calls global with cb function with object built from table headings and values
+ ✅ calls global with given timeout
+ ✅ formats primitive values using .toString()
+jest-each .it
+ ✅ throws error when there are additional words in first column heading
+ ✅ throws error when there are additional words in second column heading
+ ✅ throws error when there are additional words in last column heading
+ ✅ does not throw error when there is additional words in template after heading row
+ ✅ does not throw error when there is only one column
+ ✅ does not throw error when there is only one column with additional words in template after heading
+ ✅ throws error when there are no arguments for given headings
+ ✅ throws error when there are fewer arguments than headings when given one row
+ ✅ throws error when there are fewer arguments than headings over multiple rows
+ ✅ throws an error when called with an empty string
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+ ✅ calls global with title containing $key in multiple positions
+ ✅ calls global with title containing $key.path
+ ✅ calls global with title containing last seen object when $key.path is invalid
+ ✅ calls global with cb function with object built from table headings and values
+ ✅ calls global with given timeout
+ ✅ formats primitive values using .toString()
+jest-each .fit
+ ✅ throws error when there are additional words in first column heading
+ ✅ throws error when there are additional words in second column heading
+ ✅ throws error when there are additional words in last column heading
+ ✅ does not throw error when there is additional words in template after heading row
+ ✅ does not throw error when there is only one column
+ ✅ does not throw error when there is only one column with additional words in template after heading
+ ✅ throws error when there are no arguments for given headings
+ ✅ throws error when there are fewer arguments than headings when given one row
+ ✅ throws error when there are fewer arguments than headings over multiple rows
+ ✅ throws an error when called with an empty string
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+ ✅ calls global with title containing $key in multiple positions
+ ✅ calls global with title containing $key.path
+ ✅ calls global with title containing last seen object when $key.path is invalid
+ ✅ calls global with cb function with object built from table headings and values
+ ✅ calls global with given timeout
+ ✅ formats primitive values using .toString()
+jest-each .it.only
+ ✅ throws error when there are additional words in first column heading
+ ✅ throws error when there are additional words in second column heading
+ ✅ throws error when there are additional words in last column heading
+ ✅ does not throw error when there is additional words in template after heading row
+ ✅ does not throw error when there is only one column
+ ✅ does not throw error when there is only one column with additional words in template after heading
+ ✅ throws error when there are no arguments for given headings
+ ✅ throws error when there are fewer arguments than headings when given one row
+ ✅ throws error when there are fewer arguments than headings over multiple rows
+ ✅ throws an error when called with an empty string
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+ ✅ calls global with title containing $key in multiple positions
+ ✅ calls global with title containing $key.path
+ ✅ calls global with title containing last seen object when $key.path is invalid
+ ✅ calls global with cb function with object built from table headings and values
+ ✅ calls global with given timeout
+ ✅ formats primitive values using .toString()
+jest-each .describe
+ ✅ throws error when there are additional words in first column heading
+ ✅ throws error when there are additional words in second column heading
+ ✅ throws error when there are additional words in last column heading
+ ✅ does not throw error when there is additional words in template after heading row
+ ✅ does not throw error when there is only one column
+ ✅ does not throw error when there is only one column with additional words in template after heading
+ ✅ throws error when there are no arguments for given headings
+ ✅ throws error when there are fewer arguments than headings when given one row
+ ✅ throws error when there are fewer arguments than headings over multiple rows
+ ✅ throws an error when called with an empty string
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+ ✅ calls global with title containing $key in multiple positions
+ ✅ calls global with title containing $key.path
+ ✅ calls global with title containing last seen object when $key.path is invalid
+ ✅ calls global with cb function with object built from table headings and values
+ ✅ calls global with given timeout
+ ✅ formats primitive values using .toString()
+jest-each .fdescribe
+ ✅ throws error when there are additional words in first column heading
+ ✅ throws error when there are additional words in second column heading
+ ✅ throws error when there are additional words in last column heading
+ ✅ does not throw error when there is additional words in template after heading row
+ ✅ does not throw error when there is only one column
+ ✅ does not throw error when there is only one column with additional words in template after heading
+ ✅ throws error when there are no arguments for given headings
+ ✅ throws error when there are fewer arguments than headings when given one row
+ ✅ throws error when there are fewer arguments than headings over multiple rows
+ ✅ throws an error when called with an empty string
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+ ✅ calls global with title containing $key in multiple positions
+ ✅ calls global with title containing $key.path
+ ✅ calls global with title containing last seen object when $key.path is invalid
+ ✅ calls global with cb function with object built from table headings and values
+ ✅ calls global with given timeout
+ ✅ formats primitive values using .toString()
+jest-each .describe.only
+ ✅ throws error when there are additional words in first column heading
+ ✅ throws error when there are additional words in second column heading
+ ✅ throws error when there are additional words in last column heading
+ ✅ does not throw error when there is additional words in template after heading row
+ ✅ does not throw error when there is only one column
+ ✅ does not throw error when there is only one column with additional words in template after heading
+ ✅ throws error when there are no arguments for given headings
+ ✅ throws error when there are fewer arguments than headings when given one row
+ ✅ throws error when there are fewer arguments than headings over multiple rows
+ ✅ throws an error when called with an empty string
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+ ✅ calls global with title containing $key in multiple positions
+ ✅ calls global with title containing $key.path
+ ✅ calls global with title containing last seen object when $key.path is invalid
+ ✅ calls global with cb function with object built from table headings and values
+ ✅ calls global with given timeout
+ ✅ formats primitive values using .toString()
+jest-each done callback
+ ✅ calls [ 'test' ] with done when cb function has more args than params of given test row
+ ✅ calls [ 'test', 'only' ] with done when cb function has more args than params of given test row
+ ✅ calls [ 'test', 'concurrent', 'only' ] with done when cb function has more args than params of given test row
+ ✅ calls [ 'it' ] with done when cb function has more args than params of given test row
+ ✅ calls [ 'fit' ] with done when cb function has more args than params of given test row
+ ✅ calls [ 'it', 'only' ] with done when cb function has more args than params of given test row
+ ✅ does not call [ 'describe' ] with done when test function has more args than params of given test row
+ ✅ does not call [ 'fdescribe' ] with done when test function has more args than params of given test row
+ ✅ does not call [ 'describe', 'only' ] with done when test function has more args than params of given test row
+jest-each .xtest
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+jest-each .test.skip
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+jest-each .xit
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+jest-each .it.skip
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+jest-each .xdescribe
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+jest-each .describe.skip
+ ✅ calls global with given title
+ ✅ calls global with given title when multiple tests cases exist
+ ✅ calls global with title containing param values when using $variable format
+```
+### ✅ packages/jest-environment-jsdom/src/__tests__/jsdom_environment.test.ts
+```
+JSDomEnvironment
+ ✅ should configure setTimeout/setInterval to use the browser api
+ ✅ has modern fake timers implementation
+```
+### ✅ packages/jest-environment-node/src/__tests__/node_environment.test.ts
+```
+NodeEnvironment
+ ✅ uses a copy of the process object
+ ✅ exposes process.on
+ ✅ exposes global.global
+ ✅ should configure setTimeout/setInterval to use the node api
+ ✅ has modern fake timers implementation
+ ✅ TextEncoder references the same global Uint8Array constructor
+```
+### ✅ packages/jest-fake-timers/src/__tests__/legacyFakeTimers.test.ts
+```
+FakeTimers construction
+ ✅ installs setTimeout mock
+ ✅ accepts to promisify setTimeout mock
+ ✅ installs clearTimeout mock
+ ✅ installs setInterval mock
+ ✅ installs clearInterval mock
+ ✅ mocks process.nextTick if it exists on global
+ ✅ mocks setImmediate if it exists on global
+ ✅ mocks clearImmediate if setImmediate is on global
+FakeTimers runAllTicks
+ ✅ runs all ticks, in order
+ ✅ does nothing when no ticks have been scheduled
+ ✅ only runs a scheduled callback once
+ ✅ cancels a callback even from native nextTick
+ ✅ cancels a callback even from native setImmediate
+ ✅ doesnt run a tick callback if native nextTick already did
+ ✅ doesnt run immediate if native setImmediate already did
+ ✅ native doesnt run immediate if fake already did
+ ✅ throws before allowing infinite recursion
+FakeTimers runAllTimers
+ ✅ runs all timers in order
+ ✅ warns when trying to advance timers while real timers are used
+ ✅ does nothing when no timers have been scheduled
+ ✅ only runs a setTimeout callback once (ever)
+ ✅ runs callbacks with arguments after the interval
+ ✅ doesnt pass the callback to native setTimeout
+ ✅ throws before allowing infinite recursion
+ ✅ also clears ticks
+FakeTimers advanceTimersByTime
+ ✅ runs timers in order
+ ✅ does nothing when no timers have been scheduled
+ ✅ throws before allowing infinite recursion
+FakeTimers advanceTimersToNextTimer
+ ✅ runs timers in order
+ ✅ run correct amount of steps
+ ✅ setTimeout inside setTimeout
+ ✅ does nothing when no timers have been scheduled
+FakeTimers reset
+ ✅ resets all pending setTimeouts
+ ✅ resets all pending setIntervals
+ ✅ resets all pending ticks callbacks & immediates
+ ✅ resets current advanceTimersByTime time cursor
+FakeTimers runOnlyPendingTimers
+ ✅ runs all timers in order
+ ✅ does not run timers that were cleared in another timer
+FakeTimers runWithRealTimers
+ ✅ executes callback with native timers
+ ✅ resets mock timers after executing callback
+ ✅ resets mock timer functions even if callback throws
+FakeTimers useRealTimers
+ ✅ resets native timer APIs
+ ✅ resets native process.nextTick when present
+ ✅ resets native setImmediate when present
+FakeTimers useFakeTimers
+ ✅ resets mock timer APIs
+ ✅ resets mock process.nextTick when present
+ ✅ resets mock setImmediate when present
+FakeTimers getTimerCount
+ ✅ returns the correct count
+ ✅ includes immediates and ticks
+ ✅ not includes cancelled immediates
+```
+### ✅ packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts
+```
+FakeTimers construction
+ ✅ installs setTimeout mock
+ ✅ installs clearTimeout mock
+ ✅ installs setInterval mock
+ ✅ installs clearInterval mock
+ ✅ mocks process.nextTick if it exists on global
+ ✅ mocks setImmediate if it exists on global
+ ✅ mocks clearImmediate if setImmediate is on global
+FakeTimers runAllTicks
+ ✅ runs all ticks, in order
+ ✅ does nothing when no ticks have been scheduled
+ ✅ only runs a scheduled callback once
+ ✅ throws before allowing infinite recursion
+FakeTimers runAllTimers
+ ✅ runs all timers in order
+ ✅ warns when trying to advance timers while real timers are used
+ ✅ does nothing when no timers have been scheduled
+ ✅ only runs a setTimeout callback once (ever)
+ ✅ runs callbacks with arguments after the interval
+ ✅ doesn't pass the callback to native setTimeout
+ ✅ throws before allowing infinite recursion
+ ✅ also clears ticks
+FakeTimers advanceTimersByTime
+ ✅ runs timers in order
+ ✅ does nothing when no timers have been scheduled
+FakeTimers advanceTimersToNextTimer
+ ✅ runs timers in order
+ ✅ run correct amount of steps
+ ✅ setTimeout inside setTimeout
+ ✅ does nothing when no timers have been scheduled
+FakeTimers reset
+ ✅ resets all pending setTimeouts
+ ✅ resets all pending setIntervals
+ ✅ resets all pending ticks callbacks
+ ✅ resets current advanceTimersByTime time cursor
+FakeTimers runOnlyPendingTimers
+ ✅ runs all timers in order
+ ✅ does not run timers that were cleared in another timer
+FakeTimers useRealTimers
+ ✅ resets native timer APIs
+ ✅ resets native process.nextTick when present
+ ✅ resets native setImmediate when present
+FakeTimers useFakeTimers
+ ✅ resets mock timer APIs
+ ✅ resets mock process.nextTick when present
+ ✅ resets mock setImmediate when present
+FakeTimers getTimerCount
+ ✅ returns the correct count
+ ✅ includes immediates and ticks
+ ✅ not includes cancelled immediates
+```
+### ✅ packages/jest-get-type/src/__tests__/getType.test.ts
+```
+.getType()
+ ✅ null
+ ✅ undefined
+ ✅ object
+ ✅ array
+ ✅ number
+ ✅ string
+ ✅ function
+ ✅ boolean
+ ✅ symbol
+ ✅ regexp
+ ✅ map
+ ✅ set
+ ✅ date
+ ✅ bigint
+```
+### ✅ packages/jest-get-type/src/__tests__/isPrimitive.test.ts
+```
+.isPrimitive()
+ ✅ returns true when given primitive value of: null
+ ✅ returns true when given primitive value of: undefined
+ ✅ returns true when given primitive value of: 100
+ ✅ returns true when given primitive value of: hello world
+ ✅ returns true when given primitive value of: true
+ ✅ returns true when given primitive value of: Symbol(a)
+ ✅ returns true when given primitive value of: 0
+ ✅ returns true when given primitive value of: NaN
+ ✅ returns true when given primitive value of: Infinity
+ ✅ returns true when given primitive value of: 1n
+ ✅ returns false when given non primitive value of: {}
+ ✅ returns false when given non primitive value of: []
+ ✅ returns false when given non primitive value of: undefined
+ ✅ returns false when given non primitive value of: {}
+ ✅ returns false when given non primitive value of: {}
+ ✅ returns false when given non primitive value of: {}
+ ✅ returns false when given non primitive value of: "2021-01-24T19:22:19.272Z"
+ ✅ returns false when given non primitive value of: {}
+```
+### ✅ packages/jest-globals/src/__tests__/index.ts
+```
+✅ throw when directly imported
+```
+### ✅ packages/jest-haste-map/src/__tests__/get_mock_name.test.js
+```
+getMockName
+ ✅ extracts mock name from file path
+```
+### ✅ packages/jest-haste-map/src/__tests__/includes_dotfiles.test.ts
+```
+✅ watchman crawler and node crawler both include dotfiles
+```
+### ✅ packages/jest-haste-map/src/__tests__/index.test.js
+```
+HasteMap
+ ✅ exports constants
+ ✅ creates valid cache file paths
+ ✅ creates different cache file paths for different roots
+ ✅ creates different cache file paths for different dependency extractor cache keys
+ ✅ creates different cache file paths for different hasteImplModulePath cache keys
+ ✅ creates different cache file paths for different projects
+ ✅ matches files against a pattern
+ ✅ ignores files given a pattern
+ ✅ ignores vcs directories without ignore pattern
+ ✅ ignores vcs directories with ignore pattern regex
+ ✅ warn on ignore pattern except for regex
+ ✅ builds a haste map on a fresh cache
+ ✅ does not crawl native files even if requested to do so
+ ✅ retains all files if `retainAllFiles` is specified
+ ✅ warns on duplicate mock files
+ ✅ warns on duplicate module ids
+ ✅ warns on duplicate module ids only once
+ ✅ throws on duplicate module ids if "throwOnModuleCollision" is set to true
+ ✅ splits up modules by platform
+ ✅ does not access the file system on a warm cache with no changes
+ ✅ only does minimal file system access when files change
+ ✅ correctly handles file deletions
+ ✅ correctly handles platform-specific file additions
+ ✅ correctly handles platform-specific file deletions
+ ✅ correctly handles platform-specific file renames
+ ✅ discards the cache when configuration changes
+ ✅ ignores files that do not exist
+ ✅ distributes work across workers
+ ✅ tries to crawl using node as a fallback
+ ✅ tries to crawl using node as a fallback when promise fails once
+ ✅ stops crawling when both crawlers fail
+HasteMap builds a haste map on a fresh cache with SHA-1s
+ ✅ uses watchman: false
+ ✅ uses watchman: true
+HasteMap duplicate modules
+ ✅ recovers when a duplicate file is deleted
+ ✅ recovers with the correct type when a duplicate file is deleted
+ ✅ recovers when a duplicate module is renamed
+HasteMap file system changes processing
+ ✅ provides a new set of hasteHS and moduleMap
+ ✅ handles several change events at once
+ ✅ does not emit duplicate change events
+ ✅ emits a change even if a file in node_modules has changed
+ ✅ correctly tracks changes to both platform-specific versions of a single module name
+HasteMap file system changes processing recovery from duplicate module IDs
+ ✅ recovers when the oldest version of the duplicates is fixed
+ ✅ recovers when the most recent duplicate is fixed
+ ✅ ignore directories
+```
+### ✅ packages/jest-haste-map/src/__tests__/worker.test.js
+```
+worker
+ ✅ parses JavaScript files and extracts module information
+ ✅ accepts a custom dependency extractor
+ ✅ delegates to hasteImplModulePath for getting the id
+ ✅ parses package.json files as haste packages
+ ✅ returns an error when a file cannot be accessed
+ ✅ simply computes SHA-1s when requested (works well with binary data)
+ ✅ avoids computing dependencies if not requested and Haste does not need it
+```
+### ✅ packages/jest-haste-map/src/crawlers/__tests__/node.test.js
+```
+node crawler
+ ✅ crawls for files based on patterns
+ ✅ updates only changed files
+ ✅ returns removed files
+ ✅ uses node fs APIs with incompatible find binary
+ ✅ uses node fs APIs without find binary
+ ✅ uses node fs APIs if "forceNodeFilesystemAPI" is set to true, regardless of platform
+ ✅ completes with empty roots
+ ✅ completes with fs.readdir throwing an error
+node crawler readdir withFileTypes support
+ ✅ calls lstat for directories and symlinks if readdir withFileTypes is not supported
+ ✅ avoids calling lstat for directories and symlinks if readdir withFileTypes is supported
+```
+### ✅ packages/jest-haste-map/src/crawlers/__tests__/watchman.test.js
+```
+watchman watch
+ ✅ returns a list of all files when there are no clocks
+ ✅ updates file map and removedFiles when the clock is given
+ ✅ resets the file map and tracks removedFiles when watchman is fresh
+ ✅ properly resets the file map when only one watcher is reset
+ ✅ does not add directory filters to query when watching a ROOT
+ ✅ SHA-1 requested and available
+ ✅ SHA-1 requested and NOT available
+ ✅ source control query
+```
+### ✅ packages/jest-haste-map/src/lib/__tests__/dependencyExtractor.test.js
+```
+dependencyExtractor
+ ✅ should not extract dependencies inside comments
+ ✅ should not extract dependencies inside comments (windows line endings)
+ ✅ should not extract dependencies inside comments (unicode line endings)
+ ✅ should extract dependencies from `import` statements
+ ✅ should extract dependencies from side-effect only `import` statements
+ ✅ should not extract dependencies from `import type/typeof` statements
+ ✅ should extract dependencies from `export` statements
+ ✅ should extract dependencies from `export-from` statements
+ ✅ should not extract dependencies from `export type/typeof` statements
+ ✅ should extract dependencies from dynamic `import` calls
+ ✅ should extract dependencies from `require` calls
+ ✅ should extract dependencies from `jest.requireActual` calls
+ ✅ should extract dependencies from `jest.requireMock` calls
+ ✅ should extract dependencies from `jest.genMockFromModule` calls
+ ✅ should extract dependencies from `jest.createMockFromModule` calls
+```
+### ✅ packages/jest-haste-map/src/lib/__tests__/fast_path.test.js
+```
+fastPath.relative
+ ✅ should get relative paths inside the root
+ ✅ should get relative paths outside the root
+ ✅ should get relative paths outside the root when start with same word
+fastPath.resolve
+ ✅ should get the absolute path for paths inside the root
+ ✅ should get the absolute path for paths outside the root
+```
+### ✅ packages/jest-haste-map/src/lib/__tests__/getPlatformExtension.test.js
+```
+getPlatformExtension
+ ✅ should get platform ext
+```
+### ✅ packages/jest-haste-map/src/lib/__tests__/isRegExpSupported.test.js
+```
+isRegExpSupported
+ ✅ should return true when passing valid regular expression
+ ✅ should return false when passing an invalid regular expression
+```
+### ✅ packages/jest-haste-map/src/lib/__tests__/normalizePathSep.test.js
+```
+normalizePathSep
+ ✅ does nothing on posix
+ ✅ replace slashes on windows
+```
+### ✅ packages/jest-jasmine2/src/__tests__/concurrent.test.ts
+```
+concurrent
+ ✅ should add 1 to number
+ ✅ should add 1 to number
+ ✅ should add 1 to number
+```
+### ✅ packages/jest-jasmine2/src/__tests__/expectationResultFactory.test.ts
+```
+expectationResultFactory
+ ✅ returns the result if passed.
+ ✅ returns the result if failed.
+ ✅ returns the result if failed (with `message`).
+ ✅ returns the result if failed (with `error`).
+ ✅ returns the error name if the error message is empty
+ ✅ returns the result if failed (with `error` as a string).
+ ✅ returns the result if failed (with `error.stack` not as a string).
+```
+### ✅ packages/jest-jasmine2/src/__tests__/hooksError.test.ts
+```
+beforeEach hooks error throwing
+ ✅ beforeEach throws an error when "String" is provided as a first argument to it
+ ✅ beforeEach throws an error when 1 is provided as a first argument to it
+ ✅ beforeEach throws an error when [] is provided as a first argument to it
+ ✅ beforeEach throws an error when {} is provided as a first argument to it
+ ✅ beforeEach throws an error when Symbol(hello) is provided as a first argument to it
+ ✅ beforeEach throws an error when true is provided as a first argument to it
+ ✅ beforeEach throws an error when null is provided as a first argument to it
+ ✅ beforeEach throws an error when undefined is provided as a first argument to it
+beforeAll hooks error throwing
+ ✅ beforeAll throws an error when "String" is provided as a first argument to it
+ ✅ beforeAll throws an error when 1 is provided as a first argument to it
+ ✅ beforeAll throws an error when [] is provided as a first argument to it
+ ✅ beforeAll throws an error when {} is provided as a first argument to it
+ ✅ beforeAll throws an error when Symbol(hello) is provided as a first argument to it
+ ✅ beforeAll throws an error when true is provided as a first argument to it
+ ✅ beforeAll throws an error when null is provided as a first argument to it
+ ✅ beforeAll throws an error when undefined is provided as a first argument to it
+afterEach hooks error throwing
+ ✅ afterEach throws an error when "String" is provided as a first argument to it
+ ✅ afterEach throws an error when 1 is provided as a first argument to it
+ ✅ afterEach throws an error when [] is provided as a first argument to it
+ ✅ afterEach throws an error when {} is provided as a first argument to it
+ ✅ afterEach throws an error when Symbol(hello) is provided as a first argument to it
+ ✅ afterEach throws an error when true is provided as a first argument to it
+ ✅ afterEach throws an error when null is provided as a first argument to it
+ ✅ afterEach throws an error when undefined is provided as a first argument to it
+afterAll hooks error throwing
+ ✅ afterAll throws an error when "String" is provided as a first argument to it
+ ✅ afterAll throws an error when 1 is provided as a first argument to it
+ ✅ afterAll throws an error when [] is provided as a first argument to it
+ ✅ afterAll throws an error when {} is provided as a first argument to it
+ ✅ afterAll throws an error when Symbol(hello) is provided as a first argument to it
+ ✅ afterAll throws an error when true is provided as a first argument to it
+ ✅ afterAll throws an error when null is provided as a first argument to it
+ ✅ afterAll throws an error when undefined is provided as a first argument to it
+```
+### ✅ packages/jest-jasmine2/src/__tests__/iterators.test.ts
+```
+iterators
+ ✅ works for arrays
+ ✅ works for custom iterables
+ ✅ works for Sets
+ ✅ works for Maps
+```
+### ✅ packages/jest-jasmine2/src/__tests__/itTestError.test.ts
+```
+test/it error throwing
+ ✅ it throws error with missing callback function
+ ✅ it throws an error when first argument isn't a string
+ ✅ it throws an error when callback function is not a function
+ ✅ test throws error with missing callback function
+ ✅ test throws an error when first argument isn't a string
+ ✅ test throws an error when callback function is not a function
+```
+### ✅ packages/jest-jasmine2/src/__tests__/itToTestAlias.test.ts
+```
+✅ global.test
+```
+### ✅ packages/jest-jasmine2/src/__tests__/pTimeout.test.ts
+```
+pTimeout
+ ✅ calls `clearTimeout` and resolves when `promise` resolves.
+ ✅ calls `clearTimeout` and rejects when `promise` rejects.
+ ✅ calls `onTimeout` on timeout.
+```
+### ✅ packages/jest-jasmine2/src/__tests__/queueRunner.test.ts
+```
+queueRunner
+ ✅ runs every function in the queue.
+ ✅ exposes `fail` to `next`.
+ ✅ passes errors to `onException`.
+ ✅ passes an error to `onException` on timeout.
+ ✅ calls `fail` with arguments
+ ✅ calls `fail` when done(error) is invoked
+```
+### ✅ packages/jest-jasmine2/src/__tests__/reporter.test.ts
+```
+Jasmine2Reporter
+ ✅ reports nested suites
+```
+### ✅ packages/jest-jasmine2/src/__tests__/Suite.test.ts
+```
+Suite
+ ✅ doesn't throw on addExpectationResult when there are no children
+```
+### ✅ packages/jest-jasmine2/src/__tests__/todoError.test.ts
+```
+test/it.todo error throwing
+ ✅ it throws error when given no arguments
+ ✅ it throws error when given more than one argument
+ ✅ it throws error when given none string description
+```
+### ✅ packages/jest-leak-detector/src/__tests__/index.test.ts
+```
+✅ complains if the value is a primitive
+✅ does not show the GC if hidden
+✅ does not hide the GC if visible
+✅ correctly checks simple leaks
+✅ tests different objects
+✅ correctly checks more complex leaks
+```
+### ✅ packages/jest-matcher-utils/src/__tests__/deepCyclicCopyReplaceable.test.ts
+```
+✅ returns the same value for primitive or function values
+✅ convert accessor descriptor into value descriptor
+✅ shuold not skips non-enumerables
+✅ copies symbols
+✅ copies arrays as array objects
+✅ handles cyclic dependencies
+✅ Copy Map
+✅ Copy cyclic Map
+✅ return same value for built-in object type except array, map and object
+✅ should copy object symbol key property
+✅ should set writable, configurable to true
+```
+### ✅ packages/jest-matcher-utils/src/__tests__/deepCyclicCopyReplaceableDom.test.ts
+```
+✅ should copy dom element
+✅ should copy complex element
+```
+### ✅ packages/jest-matcher-utils/src/__tests__/index.test.ts
+```
+stringify()
+ ✅ []
+ ✅ {}
+ ✅ 1
+ ✅ 0
+ ✅ 1.5
+ ✅ null
+ ✅ undefined
+ ✅ "abc"
+ ✅ Symbol(abc)
+ ✅ NaN
+ ✅ Infinity
+ ✅ -Infinity
+ ✅ /ab\.c/gi
+ ✅ 1n
+ ✅ 0n
+ ✅ circular references
+ ✅ toJSON error
+ ✅ toJSON errors when comparing two objects
+ ✅ reduces maxDepth if stringifying very large objects
+ensureNumbers()
+ ✅ dont throw error when variables are numbers
+ ✅ throws error when expected is not a number (backward compatibility)
+ ✅ throws error when received is not a number (backward compatibility)
+ensureNumbers() with options
+ ✅ promise empty isNot false received
+ ✅ promise empty isNot true expected
+ ✅ promise rejects isNot false expected
+ ✅ promise rejects isNot true received
+ ✅ promise resolves isNot false received
+ ✅ promise resolves isNot true expected
+ensureNoExpected()
+ ✅ dont throw error when undefined
+ ✅ throws error when expected is not undefined with matcherName
+ ✅ throws error when expected is not undefined with matcherName and options
+diff
+ ✅ forwards to jest-diff
+ ✅ two booleans
+ ✅ two numbers
+ ✅ two bigints
+pluralize()
+ ✅ one
+ ✅ two
+ ✅ 20
+getLabelPrinter
+ ✅ 0 args
+ ✅ 1 empty string
+ ✅ 1 non-empty string
+ ✅ 2 equal lengths
+ ✅ 2 unequal lengths
+ ✅ returns incorrect padding if inconsistent arg is shorter
+ ✅ throws if inconsistent arg is longer
+matcherHint
+ ✅ expectedColor
+ ✅ receivedColor
+ ✅ secondArgumentColor
+```
+### ✅ packages/jest-matcher-utils/src/__tests__/printDiffOrStringify.test.ts
+```
+printDiffOrStringify
+ ✅ expected is empty and received is single line
+ ✅ expected is multi line and received is empty
+ ✅ expected and received are single line with multiple changes
+ ✅ expected and received are multi line with trailing spaces
+ ✅ has no common after clean up chaff multiline
+ ✅ has no common after clean up chaff one-line
+ ✅ object contain readonly symbol key object
+printDiffOrStringify MAX_DIFF_STRING_LENGTH
+ ✅ both are less
+ ✅ expected is more
+ ✅ received is more
+printDiffOrStringify asymmetricMatcher
+ ✅ minimal test
+ ✅ jest asymmetricMatcher
+ ✅ custom asymmetricMatcher
+ ✅ nested object
+ ✅ array
+ ✅ object in array
+ ✅ map
+ ✅ circular object
+ ✅ transitive circular
+ ✅ circular array
+ ✅ circular map
+```
+### ✅ packages/jest-matcher-utils/src/__tests__/Replaceable.test.ts
+```
+Replaceable constructor
+ ✅ init with object
+ ✅ init with array
+ ✅ init with Map
+ ✅ init with other type should throw error
+Replaceable get
+ ✅ get object item
+ ✅ get array item
+ ✅ get Map item
+Replaceable set
+ ✅ set object item
+ ✅ set array item
+ ✅ set Map item
+Replaceable forEach
+ ✅ object forEach
+ ✅ array forEach
+ ✅ map forEach
+ ✅ forEach should ignore nonenumerable property
+Replaceable isReplaceable
+ ✅ should return true if two object types equal and support
+ ✅ should return false if two object types not equal
+ ✅ should return false if object types not support
+```
+### ✅ packages/jest-message-util/src/__tests__/messages.test.ts
+```
+✅ should exclude jasmine from stack trace for Unix paths.
+✅ .formatExecError()
+✅ formatStackTrace should strip node internals
+✅ should not exclude vendor from stack trace
+✅ retains message in babel code frame error
+✅ codeframe
+✅ no codeframe
+✅ no stack
+formatStackTrace
+ ✅ prints code frame and stacktrace
+ ✅ does not print code frame when noCodeFrame = true
+ ✅ does not print codeframe when noStackTrace = true
+```
+### ✅ packages/jest-mock/src/__tests__/index.test.ts
+```
+moduleMocker getMetadata
+ ✅ returns the function `name` property
+ ✅ mocks constant values
+ ✅ does not retrieve metadata for arrays
+ ✅ does not retrieve metadata for undefined
+ ✅ does not retrieve metadata for null
+ ✅ retrieves metadata for ES6 classes
+ ✅ retrieves synchronous function metadata
+ ✅ retrieves asynchronous function metadata
+ ✅ retrieves metadata for object literals and it's members
+ ✅ retrieves Date object metadata
+moduleMocker generateFromMetadata
+ ✅ forwards the function name property
+ ✅ fixes illegal function name properties
+ ✅ special cases the mockConstructor name
+ ✅ wont interfere with previous mocks on a shared prototype
+ ✅ does not mock non-enumerable getters
+ ✅ mocks getters of ES modules
+ ✅ mocks ES2015 non-enumerable methods
+ ✅ mocks ES2015 non-enumerable static properties and methods
+ ✅ mocks methods in all the prototype chain (null prototype)
+ ✅ does not mock methods from Object.prototype
+ ✅ does not mock methods from Object.prototype (in mock context)
+ ✅ does not mock methods from Function.prototype
+ ✅ does not mock methods from Function.prototype (in mock context)
+ ✅ does not mock methods from RegExp.prototype
+ ✅ does not mock methods from RegExp.prototype (in mock context)
+ ✅ mocks methods that are bound multiple times
+ ✅ mocks methods that are bound after mocking
+ ✅ mocks regexp instances
+ ✅ mocks functions with numeric names
+ ✅ mocks the method in the passed object itself
+ ✅ should delete previously inexistent methods when restoring
+ ✅ supports mock value returning undefined
+ ✅ supports mock value once returning undefined
+ ✅ mockReturnValueOnce mocks value just once
+ ✅ supports mocking resolvable async functions
+ ✅ supports mocking resolvable async functions only once
+ ✅ supports mocking rejectable async functions
+ ✅ supports mocking rejectable async functions only once
+ ✅ tracks thrown errors without interfering with other tracking
+ ✅ a call that throws undefined is tracked properly
+ ✅ results of recursive calls are tracked properly
+ ✅ test results of recursive calls from within the recursive call
+ ✅ call mockClear inside recursive mock
+moduleMocker generateFromMetadata mocked functions
+ ✅ tracks calls to mocks
+ ✅ tracks instances made by mocks
+ ✅ supports clearing mock calls
+ ✅ supports clearing mocks
+ ✅ supports clearing all mocks
+ ✅ supports resetting mock return values
+ ✅ supports resetting single use mock return values
+ ✅ supports resetting mock implementations
+ ✅ supports resetting single use mock implementations
+ ✅ supports resetting all mocks
+ ✅ maintains function arity
+moduleMocker generateFromMetadata return values
+ ✅ tracks return values
+ ✅ tracks mocked return values
+ ✅ supports resetting return values
+moduleMocker generateFromMetadata invocationCallOrder
+ ✅ tracks invocationCallOrder made by mocks
+ ✅ supports clearing mock invocationCallOrder
+ ✅ supports clearing all mocks invocationCallOrder
+ ✅ handles a property called `prototype`
+moduleMocker getMockImplementation
+ ✅ should mock calls to a mock function
+moduleMocker mockImplementationOnce
+ ✅ should mock constructor
+ ✅ should mock single call to a mock function
+ ✅ should fallback to default mock function when no specific mock is available
+moduleMocker
+ ✅ mockReturnValue does not override mockImplementationOnce
+ ✅ mockImplementation resets the mock
+ ✅ should recognize a mocked function
+ ✅ default mockName is jest.fn()
+ ✅ mockName sets the mock name
+ ✅ mockName gets reset by mockReset
+ ✅ mockName gets reset by mockRestore
+ ✅ mockName is not reset by mockClear
+moduleMocker spyOn
+ ✅ should work
+ ✅ should throw on invalid input
+ ✅ supports restoring all spies
+ ✅ should work with getters
+moduleMocker spyOnProperty
+ ✅ should work - getter
+ ✅ should work - setter
+ ✅ should throw on invalid input
+ ✅ supports restoring all spies
+ ✅ should work with getters on the prototype chain
+ ✅ should work with setters on the prototype chain
+ ✅ supports restoring all spies on the prototype chain
+```
+### ✅ packages/jest-regex-util/src/__tests__/index.test.ts
+```
+replacePathSepForRegex() posix
+ ✅ should return the path
+replacePathSepForRegex() win32
+ ✅ should replace POSIX path separators
+ ✅ should escape Windows path separators
+ ✅ should not escape an escaped dot
+ ✅ should not escape an escaped regexp symbol
+ ✅ should escape Windows path separators inside groups
+ ✅ should escape Windows path separator at the beginning
+ ✅ should not escape several already escaped path separators
+```
+### ✅ packages/jest-repl/src/__tests__/jest_repl.test.js
+```
+Repl cli
+ ✅ runs without errors
+```
+### ✅ packages/jest-repl/src/__tests__/runtime_cli.test.js
+```
+Runtime CLI
+ ✅ fails with no path
+ ✅ displays script output
+ ✅ always disables automocking
+ ✅ throws script errors
+```
+### ✅ packages/jest-reporters/src/__tests__/CoverageReporter.test.js
+```
+onRunComplete
+ ✅ getLastError() returns an error when threshold is not met for global
+ ✅ getLastError() returns an error when threshold is not met for file
+ ✅ getLastError() returns `undefined` when threshold is met
+ ✅ getLastError() returns an error when threshold is not met for non-covered file
+ ✅ getLastError() returns an error when threshold is not met for directory
+ ✅ getLastError() returns `undefined` when threshold is met for directory
+ ✅ getLastError() returns an error when there is no coverage data for a threshold
+ ✅ getLastError() returns 'undefined' when global threshold group
+ is empty because PATH and GLOB threshold groups have matched all the
+ files in the coverage data.
+ ✅ getLastError() returns 'undefined' when file and directory path
+ threshold groups overlap
+ ✅ that if globs or paths are specified alongside global, coverage
+ data for matching paths will be subtracted from overall coverage
+ and thresholds will be applied independently
+ ✅ that files are matched by all matching threshold groups
+ ✅ that it passes custom options when creating reporters
+```
+### ✅ packages/jest-reporters/src/__tests__/CoverageWorker.test.js
+```
+✅ resolves to the result of generateEmptyCoverage upon success
+✅ throws errors on invalid JavaScript
+```
+### ✅ packages/jest-reporters/src/__tests__/DefaultReporter.test.js
+```
+✅ normal output, everything goes to stdout
+✅ when using stderr as output, no stdout call is made
+```
+### ✅ packages/jest-reporters/src/__tests__/generateEmptyCoverage.test.js
+```
+generateEmptyCoverage
+ ✅ generates an empty coverage object for a file without running it
+ ✅ generates a null coverage result when using /* istanbul ignore file */
+ ✅ generates a null coverage result when collectCoverage global config is false
+```
+### ✅ packages/jest-reporters/src/__tests__/getResultHeader.test.js
+```
+✅ should call `terminal-link` correctly
+✅ should render the terminal link
+✅ should display test time for slow test
+✅ should not display test time for fast test
+```
+### ✅ packages/jest-reporters/src/__tests__/getSnapshotStatus.test.js
+```
+✅ Retrieves the snapshot status
+✅ Shows no snapshot updates if all snapshots matched
+✅ Retrieves the snapshot status after a snapshot update
+```
+### ✅ packages/jest-reporters/src/__tests__/getSnapshotSummary.test.js
+```
+✅ creates a snapshot summary
+✅ creates a snapshot summary after an update
+✅ creates a snapshot summary with multiple snapshot being written/updated
+✅ returns nothing if there are no updates
+```
+### ✅ packages/jest-reporters/src/__tests__/getWatermarks.test.ts
+```
+getWatermarks
+ ✅ that watermarks use thresholds as upper target
+ ✅ that watermarks are created always created
+```
+### ✅ packages/jest-reporters/src/__tests__/NotifyReporter.test.ts
+```
+✅ test always
+✅ test success
+✅ test change
+✅ test success-change
+✅ test failure-change
+✅ test always with rootDir
+✅ test success with rootDir
+✅ test change with rootDir
+✅ test success-change with rootDir
+✅ test failure-change with rootDir
+✅ test always with moduleName
+✅ test success with moduleName
+✅ test change with moduleName
+✅ test success-change with moduleName
+✅ test failure-change with moduleName
+node-notifier is an optional dependency
+ ✅ without node-notifier uses mock function that throws an error
+ ✅ throws the error when require throws an unexpected error
+ ✅ uses node-notifier when it is available
+```
+### ✅ packages/jest-reporters/src/__tests__/SummaryReporter.test.js
+```
+✅ snapshots needs update with npm test
+✅ snapshots needs update with yarn test
+✅ snapshots all have results (no update)
+✅ snapshots all have results (after update)
+```
+### ✅ packages/jest-reporters/src/__tests__/utils.test.ts
+```
+wrapAnsiString()
+ ✅ wraps a long string containing ansi chars
+ ✅ returns the string unaltered if given a terminal width of zero
+trimAndFormatPath()
+ ✅ trims dirname
+ ✅ trims dirname (longer line width)
+ ✅ trims dirname and basename
+ ✅ does not trim anything
+ ✅ split at the path.sep index
+printDisplayName
+ ✅ should default displayName color to white when displayName is a string
+ ✅ should default displayName color to white when color is not a valid value
+ ✅ should correctly print the displayName when color and name are valid values
+```
+### ✅ packages/jest-reporters/src/__tests__/VerboseReporter.test.js
+```
+groupTestsBySuites
+ ✅ should handle empty results
+ ✅ should group A1 in A
+ ✅ should group A1 in A; B1 in B
+ ✅ should group A1, A2 in A
+ ✅ should group A1, A2 in A; B1, B2 in B
+ ✅ should group AB1 in AB
+ ✅ should group AB1, AB2 in AB
+ ✅ should group A1 in A; AB1 in AB
+ ✅ should group AB1 in AB; A1 in A
+ ✅ should group AB1 in AB; CD1 in CD
+ ✅ should group ABC1 in ABC; BC1 in BC; D1 in D; A1 in A
+```
+### ✅ packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts
+```
+✅ resolves no dependencies for non-existent path
+✅ resolves dependencies for existing path
+✅ includes the mocks of dependencies as dependencies
+✅ resolves dependencies for scoped packages
+✅ resolves no inverse dependencies for empty paths set
+✅ resolves no inverse dependencies for set of non-existent paths
+✅ resolves inverse dependencies for existing path
+✅ resolves inverse dependencies of mock
+✅ resolves inverse dependencies from available snapshot
+✅ resolves dependencies correctly when dependency resolution fails
+✅ resolves dependencies correctly when mock dependency resolution fails
+```
+### ✅ packages/jest-resolve/src/__tests__/isBuiltinModule.test.ts
+```
+isBuiltinModule
+ ✅ should return true for the `path` module
+ ✅ should return false for the `chalk` module
+ ✅ should return true for the `_http_common` module
+ ✅ should return false for any internal node builtins
+```
+### ✅ packages/jest-resolve/src/__tests__/resolve.test.ts
+```
+isCoreModule
+ ✅ returns false if `hasCoreModules` is false.
+ ✅ returns true if `hasCoreModules` is true and `moduleName` is a core module.
+ ✅ returns false if `hasCoreModules` is true and `moduleName` is not a core module.
+ ✅ returns false if `hasCoreModules` is true and `moduleNameMapper` alias a module same name with core module
+findNodeModule
+ ✅ is possible to override the default resolver
+ ✅ passes packageFilter to the resolve module when using the default resolver
+resolveModule
+ ✅ is possible to resolve node modules
+ ✅ is possible to resolve node modules with custom extensions
+ ✅ is possible to resolve node modules with custom extensions and platforms
+ ✅ is possible to resolve node modules by resolving their realpath
+ ✅ is possible to specify custom resolve paths
+ ✅ does not confuse directories with files
+getMockModule
+ ✅ is possible to use custom resolver to resolve deps inside mock modules with moduleNameMapper
+nodeModulesPaths
+ ✅ provides custom module paths after node_modules
+Resolver.getModulePaths() -> nodeModulesPaths()
+ ✅ can resolve node modules relative to absolute paths in "moduleDirectories" on Windows platforms
+ ✅ can resolve node modules relative to absolute paths in "moduleDirectories" on Posix platforms
+```
+### ✅ packages/jest-runner/src/__tests__/testRunner.test.ts
+```
+✅ injects the serializable module map into each worker in watch mode
+✅ assign process.env.JEST_WORKER_ID = 1 when in runInBand mode
+```
+### ✅ packages/jest-runtime/src/__tests__/instrumentation.test.ts
+```
+✅ instruments files
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_create_mock_from_module.test.js
+```
+Runtime createMockFromModule
+ ✅ does not cause side effects in the rest of the module system when generating a mock
+ ✅ resolves mapped modules correctly
+Runtime
+ ✅ creates mock objects in the right environment
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_environment.test.js
+```
+Runtime requireModule
+ ✅ emulates a node stack trace during module load
+ ✅ emulates a node stack trace during function execution
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_internal_module.test.js
+```
+Runtime internalModule
+ ✅ loads modules and applies transforms
+ ✅ loads internal modules without applying transforms
+ ✅ loads JSON modules and applies transforms
+ ✅ loads internal JSON modules without applying transforms
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_jest_fn.js
+```
+Runtime jest.fn
+ ✅ creates mock functions
+ ✅ creates mock functions with mock implementations
+Runtime jest.isMockFunction
+ ✅ recognizes a mocked function
+Runtime jest.clearAllMocks
+ ✅ clears all mocks
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_jest_spy_on.test.js
+```
+Runtime jest.spyOn
+ ✅ calls the original function
+Runtime jest.spyOnProperty
+ ✅ calls the original function
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_mock.test.js
+```
+Runtime jest.mock
+ ✅ uses explicitly set mocks instead of automocking
+ ✅ sets virtual mock for non-existing module required from same directory
+ ✅ sets virtual mock for non-existing module required from different directory
+Runtime jest.setMock
+ ✅ uses explicitly set mocks instead of automocking
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_module_directories.test.js
+```
+Runtime
+ ✅ uses configured moduleDirectories
+ ✅ resolves packages
+ ✅ finds closest module from moduleDirectories
+ ✅ only checks the configured directories
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_node_path.test.js
+```
+Runtime
+ ✅ uses NODE_PATH to find modules
+ ✅ uses modulePaths to find modules
+ ✅ finds modules in NODE_PATH containing multiple paths
+ ✅ does not find modules if NODE_PATH is relative
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_require_actual.test.js
+```
+Runtime requireActual
+ ✅ requires node module when manual mock exists
+ ✅ requireActual with moduleNameMapper
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_require_cache.test.js
+```
+Runtime require.cache
+ ✅ require.cache returns loaded module list as native Nodejs require does
+ ✅ require.cache is tolerant readonly
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_require_mock.test.js
+```
+Runtime requireMock
+ ✅ uses manual mocks before attempting to automock
+ ✅ can resolve modules that are only referenced from mocks
+ ✅ stores and re-uses manual mock exports
+ ✅ automocks haste modules without a manual mock
+ ✅ automocks relative-path modules without a file extension
+ ✅ automocks relative-path modules with a file extension
+ ✅ just falls back when loading a native module
+ ✅ stores and re-uses automocked haste exports
+ ✅ stores and re-uses automocked relative-path modules
+ ✅ multiple node core modules returns correct module
+ ✅ throws on non-existent haste modules
+ ✅ uses manual mocks when using a custom resolver
+ ✅ provides `require.main` in mock
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_require_module_no_ext.test.js
+```
+Runtime requireModule with no extension
+ ✅ throws error pointing out file with extension
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_require_module_or_mock_transitive_deps.test.js
+```
+transitive dependencies
+ ✅ mocks a manually mocked and mapped module
+ ✅ unmocks transitive dependencies in node_modules by default
+ ✅ unmocks transitive dependencies in node_modules when using unmock
+ ✅ unmocks transitive dependencies in node_modules by default when using both patterns and unmock
+ ✅ mocks deep dependencies when using unmock
+ ✅ does not mock deep dependencies when using deepUnmock
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_require_module_or_mock.test.js
+```
+✅ mocks modules by default when using automocking
+✅ doesn't mock modules when explicitly unmocked when using automocking
+✅ doesn't mock modules when explicitly unmocked via a different name
+✅ doesn't mock modules when disableAutomock() has been called
+✅ uses manual mock when automocking on and mock is available
+✅ does not use manual mock when automocking is off and a real module is available
+✅ resolves mapped module names and unmocks them by default
+✅ automocking is disabled by default
+✅ unmocks modules in config.unmockedModulePathPatterns for tests with automock enabled when automock is false
+✅ unmocks virtual mocks after they have been mocked previously
+resetModules
+ ✅ resets all the modules
+isolateModules
+ ✅ keeps it's registry isolated from global one
+ ✅ resets all modules after the block
+ ✅ resets module after failing
+ ✅ cannot nest isolateModules blocks
+ ✅ can call resetModules within a isolateModules block
+isolateModules can use isolateModules from a beforeEach block
+ ✅ can use the required module from beforeEach and re-require it
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_require_module.test.js
+```
+Runtime requireModule
+ ✅ finds haste modules
+ ✅ provides `module` to modules
+ ✅ provides `module.parent` to modules
+ ✅ `module.parent` should be undefined for entrypoints
+ ✅ resolve module.parent.require correctly
+ ✅ resolve module.parent.filename correctly
+ ✅ provides `module.loaded` to modules
+ ✅ provides `module.filename` to modules
+ ✅ provides `module.paths` to modules
+ ✅ provides `require.main` to modules
+ ✅ throws on non-existent haste modules
+ ✅ finds relative-path modules without file extension
+ ✅ finds relative-path modules with file extension
+ ✅ throws on non-existent relative-path modules
+ ✅ finds node core built-in modules
+ ✅ finds and loads JSON files without file extension
+ ✅ finds and loads JSON files with file extension
+ ✅ requires a JSON file twice successfully
+ ✅ provides manual mock when real module doesnt exist
+ ✅ doesn't override real modules with manual mocks when explicitly unmocked
+ ✅ resolves haste packages properly
+ ✅ resolves platform extensions based on the default platform
+ ✅ finds modules encoded in UTF-8 *with BOM*
+ ✅ finds and loads JSON files encoded in UTF-8 *with BOM*
+ ✅ should export a constructable Module class
+ ✅ caches Module correctly
+Runtime requireModule on node >=12.12.0
+ ✅ overrides module.createRequire
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_require_resolve.test.ts
+```
+Runtime require.resolve
+ ✅ resolves a module path
+ ✅ resolves a module path with moduleNameMapper
+Runtime require.resolve with the jest-resolve-outside-vm-option
+ ✅ forwards to the real Node require in an internal context
+ ✅ ignores the option in an external context
+ ✅ does not understand a self-constructed outsideJestVmPath in an external context
+```
+### ✅ packages/jest-runtime/src/__tests__/runtime_wrap.js
+```
+Runtime wrapCodeInModuleWrapper
+ ✅ generates the correct args for the module wrapper
+ ✅ injects "extra globals"
+```
+### ✅ packages/jest-runtime/src/__tests__/Runtime-sourceMaps.test.js
+```
+Runtime requireModule
+ ✅ installs source maps if available
+```
+### ✅ packages/jest-runtime/src/__tests__/Runtime-statics.test.js
+```
+Runtime statics
+ ✅ Runtime.createHasteMap passes correct ignore files to HasteMap
+ ✅ Runtime.createHasteMap passes correct ignore files to HasteMap in watch mode
+```
+### ✅ packages/jest-serializer/src/__tests__/index.test.ts
+```
+Using V8 implementation
+ ✅ throws the error with an invalid serialization
+Using V8 implementation Object 0
+ ✅ serializes/deserializes in memory
+ ✅ serializes/deserializes in disk
+Using V8 implementation Object 1
+ ✅ serializes/deserializes in memory
+ ✅ serializes/deserializes in disk
+Using V8 implementation Object 2
+ ✅ serializes/deserializes in memory
+ ✅ serializes/deserializes in disk
+Using V8 implementation Object 3
+ ✅ serializes/deserializes in memory
+ ✅ serializes/deserializes in disk
+Using V8 implementation Object 4
+ ✅ serializes/deserializes in memory
+ ✅ serializes/deserializes in disk
+Using V8 implementation Object 5
+ ✅ serializes/deserializes in memory
+ ✅ serializes/deserializes in disk
+Using V8 implementation Object 6
+ ✅ serializes/deserializes in memory
+ ✅ serializes/deserializes in disk
+Using V8 implementation Object 7
+ ✅ serializes/deserializes in memory
+ ✅ serializes/deserializes in disk
+```
+### ✅ packages/jest-snapshot/src/__tests__/dedentLines.test.ts
+```
+dedentLines non-null
+ ✅ no lines
+ ✅ one line empty string
+ ✅ one line empty object
+ ✅ one line self-closing element
+ ✅ object value empty string
+ ✅ object value string includes double-quote marks
+ ✅ markup with props and text
+ ✅ markup with components as props
+dedentLines null
+ ✅ object key multi-line
+ ✅ object value multi-line
+ ✅ object key and value multi-line
+ ✅ markup prop multi-line
+ ✅ markup prop component with multi-line text
+ ✅ markup text multi-line
+ ✅ markup text multiple lines
+ ✅ markup unclosed self-closing start tag
+ ✅ markup unclosed because no end tag
+```
+### ✅ packages/jest-snapshot/src/__tests__/InlineSnapshots.test.ts
+```
+✅ saveInlineSnapshots() replaces empty function call with a template literal
+✅ saveInlineSnapshots() without prettier leaves formatting outside of snapshots alone
+✅ saveInlineSnapshots() can handle typescript without prettier
+✅ saveInlineSnapshots() can handle tsx without prettier
+✅ saveInlineSnapshots() can handle flow and jsx without prettier
+✅ saveInlineSnapshots() can use prettier to fix formatting for whole file
+✅ saveInlineSnapshots() replaces existing template literal - babel parser
+✅ saveInlineSnapshots() replaces existing template literal - flow parser
+✅ saveInlineSnapshots() replaces existing template literal - typescript parser
+✅ saveInlineSnapshots() replaces existing template literal with property matchers
+✅ saveInlineSnapshots() creates template literal with property matchers
+✅ saveInlineSnapshots() creates template literal with property matchers
+✅ saveInlineSnapshots() throws if frame does not match
+✅ saveInlineSnapshots() throws if multiple calls to to the same location
+✅ saveInlineSnapshots() uses escaped backticks
+✅ saveInlineSnapshots() works with non-literals in expect call
+✅ saveInlineSnapshots() indents multi-line snapshots with spaces
+✅ saveInlineSnapshots() does not re-indent error snapshots
+✅ saveInlineSnapshots() does not re-indent already indented snapshots
+✅ saveInlineSnapshots() indents multi-line snapshots with tabs
+✅ saveInlineSnapshots() indents snapshots after prettier reformats
+✅ saveInlineSnapshots() does not indent empty lines
+```
+### ✅ packages/jest-snapshot/src/__tests__/matcher.test.ts
+```
+✅ matcher returns matcher name, expected and actual values
+```
+### ✅ packages/jest-snapshot/src/__tests__/mockSerializer.test.ts
+```
+✅ mock with 0 calls and default name
+✅ mock with 2 calls, 1 return, 1 throw
+✅ mock with 0 calls and default name in React element
+✅ mock with 0 calls and non-default name
+✅ mock with 1 calls and non-default name via new in object
+✅ mock with 1 calls in React element
+✅ mock with 2 calls
+✅ indent option
+✅ min option
+✅ maxDepth option
+```
+### ✅ packages/jest-snapshot/src/__tests__/printSnapshot.test.ts
+```
+chalk
+ ✅ level 0
+ ✅ level 1
+ ✅ level 2
+ ✅ level 3
+matcher error toMatchInlineSnapshot
+ ✅ Expected properties must be an object (non-null) without snapshot
+ ✅ Expected properties must be an object (null) with snapshot
+ ✅ Inline snapshot must be a string
+ ✅ Snapshot matchers cannot be used with not
+matcher error toMatchSnapshot
+ ✅ Expected properties must be an object (non-null)
+ ✅ Expected properties must be an object (null) with hint
+ ✅ Expected properties must be an object (null) without hint
+ ✅ Snapshot state must be initialized
+matcher error toMatchSnapshot received value must be an object
+ ✅ (non-null)
+ ✅ (null)
+matcher error toThrowErrorMatchingInlineSnapshot
+ ✅ Inline snapshot must be a string
+ ✅ Snapshot state must be initialized
+matcher error toThrowErrorMatchingSnapshot
+ ✅ Received value must be a function
+ ✅ Snapshot matchers cannot be used with not
+other error toThrowErrorMatchingSnapshot
+ ✅ Received function did not throw
+pass false toMatchInlineSnapshot with properties equals false
+ ✅ with snapshot
+ ✅ without snapshot
+pass false toMatchInlineSnapshot with properties
+ ✅ equals true
+pass false toMatchSnapshot
+ ✅ New snapshot was not written (multi line)
+ ✅ New snapshot was not written (single line)
+pass false toMatchSnapshot with properties equals false
+ ✅ isLineDiffable false
+ ✅ isLineDiffable true
+pass false toMatchSnapshot with properties
+ ✅ equals true
+pass false toThrowErrorMatchingInlineSnapshot
+ ✅ with snapshot
+pass true toMatchSnapshot
+ ✅ without properties
+printPropertiesAndReceived
+ ✅ omit missing properties
+printSnapshotAndReceived backtick
+ ✅ single line expected and received
+printSnapshotAndReceived empty string
+ ✅ expected and received single line
+ ✅ received and expected multi line
+printSnapshotAndReceived escape
+ ✅ double quote marks in string
+ ✅ backslash in multi line string
+ ✅ backslash in single line string
+ ✅ regexp
+printSnapshotAndReceived expand
+ ✅ false
+ ✅ true
+printSnapshotAndReceived
+ ✅ fallback to line diff
+ ✅ multi line small change in one line and other is unchanged
+ ✅ multi line small changes
+ ✅ single line large changes
+printSnapshotAndReceived has no common after clean up chaff
+ ✅ array
+ ✅ string single line
+printSnapshotAndReceived MAX_DIFF_STRING_LENGTH unquoted
+ ✅ both are less
+ ✅ expected is more
+ ✅ received is more
+printSnapshotAndReceived MAX_DIFF_STRING_LENGTH quoted
+ ✅ both are less
+ ✅ expected is more
+ ✅ received is more
+printSnapshotAndReceived isLineDiffable false
+ ✅ asymmetric matcher
+ ✅ boolean
+ ✅ date
+ ✅ error
+ ✅ function
+ ✅ number
+printSnapshotAndReceived isLineDiffable true
+ ✅ array
+ ✅ object
+ ✅ single line expected and received
+ ✅ single line expected and multi line received
+printSnapshotAndReceived ignore indentation
+ ✅ markup delete
+ ✅ markup fall back
+ ✅ markup insert
+printSnapshotAndReceived ignore indentation object
+ ✅ delete
+ ✅ insert
+printSnapshotAndReceived without serialize
+ ✅ backtick single line expected and received
+ ✅ backtick single line expected and multi line received
+ ✅ has no common after clean up chaff multi line
+ ✅ has no common after clean up chaff single line
+ ✅ prettier/pull/5590
+```
+### ✅ packages/jest-snapshot/src/__tests__/SnapshotResolver.test.ts
+```
+defaults
+ ✅ returns cached object if called multiple times
+ ✅ resolveSnapshotPath()
+ ✅ resolveTestPath()
+custom resolver in project config
+ ✅ returns cached object if called multiple times
+ ✅ resolveSnapshotPath()
+ ✅ resolveTestPath()
+malformed custom resolver in project config
+ ✅ missing resolveSnapshotPath throws
+ ✅ missing resolveTestPath throws
+ ✅ missing testPathForConsistencyCheck throws
+ ✅ inconsistent functions throws
+```
+### ✅ packages/jest-snapshot/src/__tests__/throwMatcher.test.ts
+```
+✅ throw matcher can take func
+throw matcher from promise
+ ✅ can take error
+ ✅ can take custom error
+```
+### ✅ packages/jest-snapshot/src/__tests__/utils.test.ts
+```
+✅ keyToTestName()
+✅ testNameToKey
+✅ saveSnapshotFile() works with
+✅ saveSnapshotFile() works with
+✅ getSnapshotData() throws when no snapshot version
+✅ getSnapshotData() throws for older snapshot version
+✅ getSnapshotData() throws for newer snapshot version
+✅ getSnapshotData() does not throw for when updating
+✅ getSnapshotData() marks invalid snapshot dirty when updating
+✅ getSnapshotData() marks valid snapshot not dirty when updating
+✅ escaping
+✅ serialize handles \r\n
+ExtraLineBreaks
+ ✅ 0 empty string
+ ✅ 1 line has double quote marks at edges
+ ✅ 1 line has spaces at edges
+ ✅ 2 lines both are blank
+ ✅ 2 lines have double quote marks at edges
+ ✅ 2 lines first is blank
+ ✅ 2 lines last is blank
+removeLinesBeforeExternalMatcherTrap
+ ✅ contains external matcher trap
+ ✅ doesn't contain external matcher trap
+DeepMerge with property matchers
+ ✅ Correctly merges a nested object
+ ✅ Correctly merges an object with an array of objects
+ ✅ Correctly merges an object with an array of strings
+ ✅ Correctly merges an array of objects
+ ✅ Correctly merges an array of arrays
+```
+### ✅ packages/jest-source-map/src/__tests__/getCallsite.test.ts
+```
+getCallsite
+ ✅ without source map
+ ✅ ignores errors when fs throws
+ ✅ reads source map file to determine line and column
+```
+### ✅ packages/jest-test-result/src/__tests__/formatTestResults.test.ts
+```
+formatTestResults
+ ✅ includes test full name
+```
+### ✅ packages/jest-test-sequencer/src/__tests__/test_sequencer.test.js
+```
+✅ sorts by file size if there is no timing information
+✅ sorts based on timing information
+✅ sorts based on failures and timing information
+✅ sorts based on failures, timing information and file size
+✅ writes the cache based on results without existing cache
+✅ returns failed tests in sorted order
+✅ writes the cache based on the results
+✅ works with multiple contexts
+```
+### ✅ packages/jest-transform/src/__tests__/ScriptTransformer.test.ts
+```
+ScriptTransformer
+ ✅ transforms a file properly
+ ✅ does not transform Node core modules
+ ✅ throws an error if `process` doesn't return a string or an objectcontaining `code` key with processed string
+ ✅ throws an error if `process` doesn't defined
+ ✅ throws an error if createTransformer returns object without `process` method
+ ✅ shouldn't throw error without process method. But with corrent createTransformer method
+ ✅ uses the supplied preprocessor
+ ✅ uses multiple preprocessors
+ ✅ writes source map if preprocessor supplies it
+ ✅ writes source map if preprocessor inlines it
+ ✅ warns of unparseable inlined source maps from the preprocessor
+ ✅ writes source maps if given by the transformer
+ ✅ does not write source map if not given by the transformer
+ ✅ should write a source map for the instrumented file when transformed
+ ✅ should write a source map for the instrumented file when not transformed
+ ✅ passes expected transform options to getCacheKey
+ ✅ creates transformer with config
+ ✅ reads values from the cache
+ ✅ reads values from the cache when the file contains colons
+ ✅ should reuse the value from in-memory cache which is set by custom transformer
+ ✅ does not reuse the in-memory cache between different projects
+ ✅ preload transformer when using `preloadTransformer`
+```
+### ✅ packages/jest-transform/src/__tests__/shouldInstrument.test.ts
+```
+shouldInstrument should return true
+ ✅ when testRegex is provided and file is not a test file
+ ✅ when more than one testRegex is provided and filename is not a test file
+ ✅ when testMatch is provided and file is not a test file
+ ✅ when testPathIgnorePatterns is provided and file is not a test file
+ ✅ when more than one testPathIgnorePatterns is provided and filename is not a test file
+ ✅ when testRegex and testPathIgnorePatterns are provided and file is not a test file
+ ✅ when testMatch and testPathIgnorePatterns are provided and file is not a test file
+ ✅ should return true when file is in collectCoverageOnlyFrom when provided
+ ✅ should return true when filename matches collectCoverageFrom
+ ✅ should return true if the file is not in coveragePathIgnorePatterns
+ ✅ should return true if file is a testfile but forceCoverageMatch is set
+shouldInstrument should return false
+ ✅ if collectCoverage is falsy
+ ✅ when testRegex is provided and filename is a test file
+ ✅ when more than one testRegex is provided and filename matches one of the patterns
+ ✅ when testMatch is provided and file is a test file
+ ✅ when testRegex and testPathIgnorePatterns are provided and filename is a test file
+ ✅ when testMatch and testPathIgnorePatterns are provided and file is a test file
+ ✅ when file is not in collectCoverageOnlyFrom when provided
+ ✅ when filename does not match collectCoverageFrom
+ ✅ if the file is in coveragePathIgnorePatterns
+ ✅ if file is in mock patterns
+ ✅ if file is a globalSetup file
+ ✅ if file is globalTeardown file
+ ✅ if file is in setupFiles
+ ✅ if file is in setupFilesAfterEnv
+```
+### ✅ packages/jest-util/src/__tests__/createProcessObject.test.ts
+```
+✅ creates a process object that looks like the original one
+✅ fakes require("process") so it is equal to "global.process"
+✅ checks that process.env works as expected on Linux platforms
+✅ checks that process.env works as expected in Windows platforms
+```
+### ✅ packages/jest-util/src/__tests__/deepCyclicCopy.test.ts
+```
+✅ returns the same value for primitive or function values
+✅ does not execute getters/setters, but copies them
+✅ copies symbols
+✅ copies arrays as array objects
+✅ handles cyclic dependencies
+✅ uses the blacklist to avoid copying properties on the first level
+✅ does not keep the prototype by default when top level is object
+✅ does not keep the prototype by default when top level is array
+✅ does not keep the prototype of arrays when keepPrototype = false
+✅ keeps the prototype of arrays when keepPrototype = true
+✅ does not keep the prototype for objects when keepPrototype = false
+✅ keeps the prototype for objects when keepPrototype = true
+```
+### ✅ packages/jest-util/src/__tests__/errorWithStack.test.ts
+```
+ErrorWithStack
+ ✅ calls Error.captureStackTrace with given callsite when capture exists
+```
+### ✅ packages/jest-util/src/__tests__/formatTime.test.ts
+```
+✅ defaults to milliseconds
+✅ formats seconds properly
+✅ formats milliseconds properly
+✅ formats microseconds properly
+✅ formats nanoseconds properly
+✅ interprets lower than lowest powers as nanoseconds
+✅ interprets higher than highest powers as seconds
+✅ interprets non-multiple-of-3 powers as next higher prefix
+✅ formats the quantity properly when pad length is lower
+✅ formats the quantity properly when pad length is equal
+✅ left pads the quantity properly when pad length is higher
+```
+### ✅ packages/jest-util/src/__tests__/globsToMatcher.test.ts
+```
+✅ works like micromatch with only positive globs
+✅ works like micromatch with a mix of overlapping positive and negative globs
+✅ works like micromatch with only negative globs
+✅ works like micromatch with empty globs
+```
+### ✅ packages/jest-util/src/__tests__/installCommonGlobals.test.ts
+```
+✅ returns the passed object
+✅ turns a V8 global object into a Node global object
+```
+### ✅ packages/jest-util/src/__tests__/isInteractive.test.ts
+```
+✅ Returns true when running on interactive environment
+✅ Returns false when running on a non-interactive environment
+```
+### ✅ packages/jest-util/src/__tests__/isPromise.test.ts
+```
+not a Promise:
+ ✅ undefined
+ ✅ null
+ ✅ true
+ ✅ 42
+ ✅ "1337"
+ ✅ Symbol()
+ ✅ []
+ ✅ {}
+✅ a resolved Promise
+✅ a rejected Promise
+```
+### ✅ packages/jest-validate/src/__tests__/validate.test.ts
+```
+✅ recursively validates default Jest config
+✅ recursively validates default jest-validate config
+✅ pretty prints valid config for Boolean
+✅ pretty prints valid config for Array
+✅ pretty prints valid config for String
+✅ pretty prints valid config for Object
+✅ pretty prints valid config for Function
+✅ omits null and undefined config values
+✅ recursively omits null and undefined config values
+✅ treat async and non-async functions as equivalent
+✅ treat async and non-async functions as equivalent
+✅ treat async and non-async functions as equivalent
+✅ treat async and non-async functions as equivalent
+✅ respects recursiveDenylist
+✅ displays warning for unknown config options
+✅ displays warning for deprecated config options
+✅ works with custom warnings
+✅ works with custom errors
+✅ works with custom deprecations
+✅ works with multiple valid types
+✅ reports errors nicely when failing with multiple valid options
+✅ Repeated types within multiple valid examples are coalesced in error report
+✅ Comments in config JSON using "//" key are not warned
+```
+### ✅ packages/jest-validate/src/__tests__/validateCLIOptions.test.js
+```
+✅ validates yargs special options
+✅ validates testURL
+✅ fails for unknown option
+✅ fails for multiple unknown options
+✅ does not show suggestion when unrecognized cli param length <= 1
+✅ shows suggestion when unrecognized cli param length > 1
+```
+### ✅ packages/jest-watcher/src/lib/__tests__/formatTestNameByPattern.test.ts
+```
+for multiline test name returns
+ ✅ test name with highlighted pattern and replaced line breaks
+for one line test name with pattern in the head returns
+ ✅ test name with highlighted pattern
+ ✅ test name with cutted tail and highlighted pattern
+ ✅ test name with cutted tail and cutted highlighted pattern
+for one line test name pattern in the middle
+ ✅ test name with highlighted pattern returns
+ ✅ test name with cutted tail and highlighted pattern
+ ✅ test name with cutted tail and cutted highlighted pattern
+ ✅ test name with highlighted cutted
+for one line test name pattern in the tail returns
+ ✅ test name with highlighted pattern
+ ✅ test name with cutted tail and cutted highlighted pattern
+ ✅ test name with highlighted cutted
+```
+### ✅ packages/jest-watcher/src/lib/__tests__/prompt.test.ts
+```
+✅ calls handler on change value
+✅ calls handler on success prompt
+✅ calls handler on cancel prompt
+```
+### ✅ packages/jest-watcher/src/lib/__tests__/scroll.test.ts
+```
+✅ When offset is -1
+✅ When offset is in the first set of items
+✅ When offset is in the middle of the list
+✅ When offset is at the end of the list
+✅ When offset is at the end and size is smaller than max
+```
+### ✅ packages/jest-worker/src/__tests__/Farm.test.js
+```
+Farm
+ ✅ sends a request to one worker
+ ✅ sends four requests to four unique workers
+ ✅ handles null computeWorkerKey, sending to first worker
+ ✅ sends the same worker key to the same worker
+ ✅ returns the result if the call worked
+ ✅ throws if the call failed
+ ✅ checks that once a sticked task finishes, next time is sent to that worker
+ ✅ checks that even before a sticked task finishes, next time is sent to that worker
+ ✅ checks that locking works, and jobs are never lost
+ ✅ can receive custom messages from workers
+```
+### ✅ packages/jest-worker/src/__tests__/FifoQueue.test.js
+```
+✅ returns the shared tasks in FIFO ordering
+✅ returns the worker specific tasks in FIFO ordering
+✅ maintains global FIFO ordering between worker specific and shared tasks
+```
+### ✅ packages/jest-worker/src/__tests__/index.test.js
+```
+✅ exposes the right API using default working
+✅ exposes the right API using passed worker
+✅ breaks if any of the forbidden methods is tried to be exposed
+✅ works with minimal options
+✅ does not let make calls after the farm is ended
+✅ does not let end the farm after it is ended
+✅ calls doWork
+✅ calls getStderr and getStdout from worker
+```
+### ✅ packages/jest-worker/src/__tests__/PriorityQueue.test.js
+```
+✅ returns the tasks in order
+✅ returns the task with the lowest priority value if inserted in reversed order
+✅ returns the task with the lowest priority value if inserted in correct order
+✅ uses different queues for each worker
+✅ process task in the global and shared queue in order
+```
+### ✅ packages/jest-worker/src/__tests__/process-integration.test.js
+```
+Jest Worker Integration
+ ✅ calls a single method from the worker
+ ✅ distributes sequential calls across child processes
+ ✅ schedules the task on the first available child processes if the scheduling policy is in-order
+ ✅ distributes concurrent calls across child processes
+ ✅ sticks parallel calls to children
+```
+### ✅ packages/jest-worker/src/__tests__/thread-integration.test.js
+```
+Jest Worker Process Integration
+ ✅ calls a single method from the worker
+ ✅ distributes sequential calls across child processes
+ ✅ schedules the task on the first available child processes if the scheduling policy is in-order
+ ✅ schedules the task on the first available child processes
+ ✅ distributes concurrent calls across child processes
+ ✅ sticks parallel calls to children
+```
+### ✅ packages/jest-worker/src/__tests__/WorkerPool.test.js
+```
+WorkerPool
+ ✅ should create a ChildProcessWorker and send to it
+ ✅ should create a NodeThreadWorker and send to it
+ ✅ should avoid NodeThreadWorker if not passed enableWorkerThreads
+```
+### ✅ packages/jest-worker/src/base/__tests__/BaseWorkerPool.test.js
+```
+BaseWorkerPool
+ ✅ throws error when createWorker is not defined
+ ✅ creates and exposes n workers
+ ✅ creates and expoeses n workers
+ ✅ creates workers with the right options
+ ✅ makes a non-existing relative worker throw
+ ✅ create multiple workers with unique worker ids
+ ✅ aggregates all stdouts and stderrs from all workers
+ ✅ works when stdout and stderr are not piped to the parent
+BaseWorkerPool end
+ ✅ ends all workers
+ ✅ resolves with forceExited=false if workers exited gracefully
+ ✅ force exits workers that do not exit gracefully and resolves with forceExited=true
+```
+### ✅ packages/jest-worker/src/workers/__tests__/ChildProcessWorker.test.js
+```
+✅ passes fork options down to child_process.fork, adding the defaults
+✅ passes workerId to the child process and assign it to 1-indexed env.JEST_WORKER_ID
+✅ initializes the child process with the given workerPath
+✅ stops initializing the worker after the amount of retries is exceeded
+✅ provides stdout and stderr from the child processes
+✅ sends the task to the child process
+✅ resends the task to the child process after a retry
+✅ calls the onProcessStart method synchronously if the queue is empty
+✅ can send multiple messages to parent
+✅ creates error instances for known errors
+✅ throws when the child process returns a strange message
+✅ does not restart the child if it cleanly exited
+✅ resolves waitForExit() after the child process cleanly exited
+✅ restarts the child when the child process dies
+✅ sends SIGTERM when forceExit() is called
+✅ sends SIGKILL some time after SIGTERM
+✅ does not send SIGKILL if SIGTERM exited the process
+```
+### ✅ packages/jest-worker/src/workers/__tests__/NodeThreadsWorker.test.js
+```
+✅ passes fork options down to child_process.fork, adding the defaults
+✅ passes workerId to the thread and assign it to env.JEST_WORKER_ID
+✅ initializes the thread with the given workerPath
+✅ stops initializing the worker after the amount of retries is exceeded
+✅ provides stdout and stderr from the threads
+✅ sends the task to the thread
+✅ resends the task to the thread after a retry
+✅ calls the onProcessStart method synchronously if the queue is empty
+✅ can send multiple messages to parent
+✅ creates error instances for known errors
+✅ throws when the thread returns a strange message
+✅ does not restart the thread if it cleanly exited
+✅ resolves waitForExit() after the thread cleanly exited
+✅ restarts the thread when the thread dies
+✅ terminates the thread when forceExit() is called
+```
+### ✅ packages/jest-worker/src/workers/__tests__/processChild.test.js
+```
+✅ lazily requires the file
+✅ calls initialize with the correct arguments
+✅ returns results immediately when function is synchronous
+✅ returns results when it gets resolved if function is asynchronous
+✅ calls the main module if the method call is "default"
+✅ calls the main export if the method call is "default" and it is a Babel transpiled one
+✅ removes the message listener on END message
+✅ calls the teardown method
+✅ throws if an invalid message is detected
+✅ throws if child is not forked
+```
+### ✅ packages/jest-worker/src/workers/__tests__/threadChild.test.js
+```
+✅ lazily requires the file
+✅ calls initialize with the correct arguments
+✅ returns results immediately when function is synchronous
+✅ returns results when it gets resolved if function is asynchronous
+✅ calls the main module if the method call is "default"
+✅ calls the main export if the method call is "default" and it is a Babel transpiled one
+✅ removes the message listener on END message
+✅ calls the teardown method
+✅ throws if an invalid message is detected
+✅ throws if child is not forked
+```
+### ✅ packages/pretty-format/src/__tests__/AsymmetricMatcher.test.ts
+```
+✅ supports any(String)
+✅ supports nested any(String)
+✅ supports any(Function)
+✅ supports nested any(Function)
+✅ supports any(Array)
+✅ supports nested any(Array)
+✅ supports any(Object)
+✅ supports nested any(Object)
+✅ supports any(RegExp)
+✅ supports nested any(RegExp)
+✅ supports any(Symbol)
+✅ supports nested any(Symbol)
+✅ supports any(Function)
+✅ supports nested any(Function)
+✅ supports any()
+✅ supports nested any()
+✅ supports any(namedFuntction)
+✅ supports nested any(namedFuntction)
+✅ anything()
+✅ arrayContaining()
+✅ arrayNotContaining()
+✅ objectContaining()
+✅ objectNotContaining()
+✅ stringContaining(string)
+✅ not.stringContaining(string)
+✅ stringMatching(string)
+✅ stringMatching(regexp)
+✅ stringMatching(regexp) {escapeRegex: false}
+✅ stringMatching(regexp) {escapeRegex: true}
+✅ stringNotMatching(string)
+✅ supports multiple nested asymmetric matchers
+✅ min option
+indent option
+ ✅ default implicit: 2 spaces
+ ✅ default explicit: 2 spaces
+ ✅ non-default: 0 spaces
+ ✅ non-default: 4 spaces
+maxDepth option
+ ✅ matchers as leaf nodes
+ ✅ matchers as internal nodes
+```
+### ✅ packages/pretty-format/src/__tests__/ConvertAnsi.test.ts
+```
+ConvertAnsi plugin
+ ✅ supports style.red
+ ✅ supports style.green
+ ✅ supports style.reset
+ ✅ supports style.bold
+ ✅ supports style.dim
+ ✅ does not support other colors
+```
+### ✅ packages/pretty-format/src/__tests__/DOMCollection.test.ts
+```
+DOMCollection plugin for object properties
+ ✅ supports DOMStringMap
+ ✅ supports NamedNodeMap
+ ✅ supports config.min option
+DOMCollection plugin for list items
+ ✅ supports HTMLCollection for getElementsByTagName
+ ✅ supports HTMLCollection for children
+ ✅ supports config.maxDepth option
+ ✅ supports NodeList for querySelectorAll
+ ✅ supports NodeList for childNodes
+ ✅ supports HTMLOptionsCollection for select options
+ ✅ supports HTMLCollection for form elements
+```
+### ✅ packages/pretty-format/src/__tests__/DOMElement.test.ts
+```
+pretty-format
+ ✅ prints global window as constructor name alone
+DOMElement Plugin
+ ✅ supports a single HTML element
+ ✅ supports an HTML element with a class property
+ ✅ supports an HTML element with a title property
+ ✅ escapes double quote in attribute value
+ ✅ supports an HTML element with a single attribute
+ ✅ supports an HTML element with multiple attributes
+ ✅ supports an HTML element with attribute and text content
+ ✅ supports an element with text content
+ ✅ supports nested elements
+ ✅ supports nested elements with attributes
+ ✅ supports nested elements with attribute and text content
+ ✅ supports nested elements with text content
+ ✅ supports siblings
+ ✅ supports multiline text node in pre
+ ✅ supports multiline text node preceding span in pre
+ ✅ supports multiline text node in textarea
+ ✅ supports empty text node
+ ✅ supports non-empty text node
+ ✅ supports comment node
+ ✅ supports fragment node
+ ✅ supports custom elements
+ ✅ supports SVG elements
+ ✅ supports indentation for array of elements
+ ✅ supports maxDepth option
+ ✅ handles `tagName` not being a string
+DOMElement Plugin matches constructor name of SVG elements
+ ✅ jsdom 9 and 10
+ ✅ jsdom 11
+```
+### ✅ packages/pretty-format/src/__tests__/Immutable.test.ts
+```
+✅ does not incorrectly match identity-obj-proxy as Immutable object
+Immutable.OrderedSet
+ ✅ supports an empty collection {min: true}
+ ✅ supports an empty collection {min: false}
+ ✅ supports a single string element
+ ✅ supports a single integer element
+ ✅ supports multiple string elements {min: true}
+ ✅ supports multiple string elements {min: false}
+ ✅ supports multiple integer elements {min: true}
+ ✅ supports multiple integer elements {min: false}
+ ✅ supports object elements {min: true}
+ ✅ supports object elements {min: false}
+ ✅ supports React elements {min: true}
+ ✅ supports React elements {min: false}
+Immutable.List
+ ✅ supports an empty collection {min: true}
+ ✅ supports an empty collection {min: false}
+ ✅ supports a single string element
+ ✅ supports a single integer element
+ ✅ supports multiple string elements {min: true}
+ ✅ supports multiple string elements {min: false}
+ ✅ supports multiple integer elements {min: true}
+ ✅ supports multiple integer elements {min: false}
+ ✅ supports object elements {min: true}
+ ✅ supports object elements {min: false}
+ ✅ supports React elements {min: true}
+ ✅ supports React elements {min: false}
+Immutable.Stack
+ ✅ supports an empty collection {min: true}
+ ✅ supports an empty collection {min: false}
+ ✅ supports a single string element
+ ✅ supports a single integer element
+ ✅ supports multiple string elements {min: true}
+ ✅ supports multiple string elements {min: false}
+ ✅ supports multiple integer elements {min: true}
+ ✅ supports multiple integer elements {min: false}
+ ✅ supports object elements {min: true}
+ ✅ supports object elements {min: false}
+ ✅ supports React elements {min: true}
+ ✅ supports React elements {min: false}
+Immutable.Set
+ ✅ supports an empty collection {min: true}
+ ✅ supports an empty collection {min: false}
+ ✅ supports a single string element
+ ✅ supports a single integer element
+ ✅ supports multiple string elements {min: true}
+ ✅ supports multiple string elements {min: false}
+ ✅ supports multiple integer elements {min: true}
+ ✅ supports multiple integer elements {min: false}
+ ✅ supports object elements {min: true}
+ ✅ supports object elements {min: false}
+ ✅ supports React elements {min: true}
+ ✅ supports React elements {min: false}
+Immutable.Map
+ ✅ supports an empty collection {min: true}
+ ✅ supports an empty collection {min: false}
+ ✅ supports an object with single key
+ ✅ supports an object with multiple keys {min: true}
+ ✅ supports an object with multiple keys {min: false}
+ ✅ supports object elements {min: true}
+ ✅ supports object elements {min: false}
+ ✅ supports React elements {min: true}
+ ✅ supports React elements {min: false}
+Immutable.OrderedMap
+ ✅ supports an empty collection {min: true}
+ ✅ supports an empty collection {min: false}
+ ✅ supports an object with single key
+ ✅ supports an object with multiple keys {min: true}
+ ✅ supports an object with multiple keys {min: false}
+ ✅ supports object elements {min: true}
+ ✅ supports object elements {min: false}
+ ✅ supports React elements {min: true}
+ ✅ supports React elements {min: false}
+ ✅ supports non-string keys
+Immutable.Record
+ ✅ supports an empty record {min: true}
+ ✅ supports an empty record {min: false}
+ ✅ supports a record with descriptive name
+ ✅ supports a record without descriptive name
+ ✅ supports a record with values {min: true}
+ ✅ supports a record with values {min: false}
+ ✅ supports a record with Map value {min: true}
+ ✅ supports a record with Map value {min: false}
+ ✅ supports imbricated Record {min: true}
+ ✅ supports imbricated Record {min: false}
+indentation of heterogeneous collections
+ ✅ empty Immutable.List as child of Object
+ ✅ empty Immutable.Map as child of Array
+ ✅ non-empty Array as child of Immutable.Map
+ ✅ non-empty Object as child of Immutable.List
+indent option
+ ✅ default implicit: 2 spaces
+ ✅ default explicit: 2 spaces
+ ✅ non-default: 0 spaces
+ ✅ non-default: 4 spaces
+maxDepth option
+ ✅ Immutable.List as child of Object
+ ✅ Immutable.Map as child of Array
+ ✅ Immutable.Seq as child of Immutable.Map
+ ✅ Immutable.Map as descendants in immutable collection
+Immutable.Seq
+ ✅ supports an empty sequence from array {min: true}
+ ✅ supports an empty sequence from array {min: false}
+ ✅ supports a non-empty sequence from array {min: true}
+ ✅ supports a non-empty sequence from array {min: false}
+ ✅ supports a non-empty sequence from arguments
+ ✅ supports an empty sequence from object {min: true}
+ ✅ supports an empty sequence from object {min: false}
+ ✅ supports a non-empty sequence from object {min: true}
+ ✅ supports a non-empty sequence from object {min: false}
+ ✅ supports a sequence of entries from Immutable.Map
+ ✅ supports a sequence of values from ECMAScript Set
+ ✅ supports a sequence of values from Immutable.List
+ ✅ supports a sequence of values from Immutable.Set
+ ✅ supports a sequence of values from Immutable.Stack
+Immutable.Seq lazy entries
+ ✅ from object properties
+ ✅ from Immutable.Map entries
+Immutable.Seq lazy values
+ ✅ from Immutable.Range
+ ✅ from iterator
+ ✅ from array items
+ ✅ from Immutable.List values
+ ✅ from ECMAScript Set values
+```
+### ✅ packages/pretty-format/src/__tests__/prettyFormat.test.ts
+```
+prettyFormat()
+ ✅ prints empty arguments
+ ✅ prints arguments
+ ✅ prints an empty array
+ ✅ prints an array with items
+ ✅ prints a empty typed array
+ ✅ prints a typed array with items
+ ✅ prints an array buffer
+ ✅ prints a nested array
+ ✅ prints true
+ ✅ prints false
+ ✅ prints an error
+ ✅ prints a typed error with a message
+ ✅ prints a function constructor
+ ✅ prints an anonymous callback function
+ ✅ prints an anonymous assigned function
+ ✅ prints a named function
+ ✅ prints a named generator function
+ ✅ can customize function names
+ ✅ prints Infinity
+ ✅ prints -Infinity
+ ✅ prints an empty map
+ ✅ prints a map with values
+ ✅ prints a map with non-string keys
+ ✅ prints NaN
+ ✅ prints null
+ ✅ prints a positive number
+ ✅ prints a negative number
+ ✅ prints zero
+ ✅ prints negative zero
+ ✅ prints a positive bigint
+ ✅ prints a negative bigint
+ ✅ prints zero bigint
+ ✅ prints negative zero bigint
+ ✅ prints a date
+ ✅ prints an invalid date
+ ✅ prints an empty object
+ ✅ prints an object with properties
+ ✅ prints an object with properties and symbols
+ ✅ prints an object without non-enumerable properties which have string key
+ ✅ prints an object without non-enumerable properties which have symbol key
+ ✅ prints an object with sorted properties
+ ✅ prints regular expressions from constructors
+ ✅ prints regular expressions from literals
+ ✅ prints regular expressions {escapeRegex: false}
+ ✅ prints regular expressions {escapeRegex: true}
+ ✅ escapes regular expressions nested inside object
+ ✅ prints an empty set
+ ✅ prints a set with values
+ ✅ prints a string
+ ✅ prints and escape a string
+ ✅ doesn't escape string with {excapeString: false}
+ ✅ prints a string with escapes
+ ✅ prints a multiline string
+ ✅ prints a multiline string as value of object property
+ ✅ prints a symbol
+ ✅ prints undefined
+ ✅ prints a WeakMap
+ ✅ prints a WeakSet
+ ✅ prints deeply nested objects
+ ✅ prints circular references
+ ✅ prints parallel references
+ ✅ can customize the max depth
+ ✅ throws on invalid options
+ ✅ supports plugins
+ ✅ supports plugins that return empty string
+ ✅ throws if plugin does not return a string
+ ✅ throws PrettyFormatPluginError if test throws an error
+ ✅ throws PrettyFormatPluginError if print throws an error
+ ✅ throws PrettyFormatPluginError if serialize throws an error
+ ✅ supports plugins with deeply nested arrays (#24)
+ ✅ should call plugins on nested basic values
+ ✅ prints objects with no constructor
+ ✅ prints identity-obj-proxy with string constructor
+ ✅ calls toJSON and prints its return value
+ ✅ calls toJSON and prints an internal representation.
+ ✅ calls toJSON only on functions
+ ✅ does not call toJSON recursively
+ ✅ calls toJSON on Sets
+ ✅ disables toJSON calls through options
+prettyFormat() indent option
+ ✅ default implicit: 2 spaces
+ ✅ default explicit: 2 spaces
+ ✅ non-default: 0 spaces
+ ✅ non-default: 4 spaces
+prettyFormat() min
+ ✅ prints some basic values in min mode
+ ✅ prints some complex values in min mode
+ ✅ does not allow indent !== 0 in min mode
+```
+### ✅ packages/pretty-format/src/__tests__/react.test.tsx
+```
+✅ supports a single element with no props or children
+✅ supports a single element with non-empty string child
+✅ supports a single element with empty string child
+✅ supports a single element with non-zero number child
+✅ supports a single element with zero number child
+✅ supports a single element with mixed children
+✅ supports props with strings
+✅ supports props with multiline strings
+✅ supports props with numbers
+✅ supports a single element with a function prop
+✅ supports a single element with a object prop
+✅ supports an element with and object prop and children
+✅ supports an element with complex props and mixed children
+✅ escapes children properly
+✅ supports everything all together
+✅ sorts props in nested components
+✅ supports a single element with React elements as props
+✅ supports a single element with React elements with props
+✅ supports a single element with custom React elements with props
+✅ supports a single element with custom React elements with props (using displayName)
+✅ supports a single element with custom React elements with props (using anonymous function)
+✅ supports a single element with custom React elements with a child
+✅ supports undefined element type
+✅ supports a fragment with no children
+✅ supports a fragment with string child
+✅ supports a fragment with element child
+✅ supports suspense
+✅ supports a single element with React elements with a child
+✅ supports a single element with React elements with children
+✅ supports a single element with React elements with array children
+✅ supports array of elements
+✅ min option
+✅ ReactElement plugin highlights syntax
+✅ ReactTestComponent plugin highlights syntax
+✅ throws if theme option is null
+✅ throws if theme option is not of type "object"
+✅ throws if theme option has value that is undefined in ansi-styles
+✅ ReactElement plugin highlights syntax with color from theme option
+✅ ReactTestComponent plugin highlights syntax with color from theme option
+✅ supports forwardRef with a child
+✅ supports context Provider with a child
+✅ supports context Consumer with a child
+✅ ReactElement removes undefined props
+✅ ReactTestComponent removes undefined props
+test object for subset match
+ ✅ undefined props
+ ✅ undefined children
+indent option
+ ✅ default implicit: 2 spaces
+ ✅ default explicit: 2 spaces
+ ✅ non-default: 0 spaces
+ ✅ non-default: 4 spaces
+maxDepth option
+ ✅ elements
+ ✅ array of elements
+React.memo without displayName
+ ✅ renders the component name
+React.memo with displayName
+ ✅ renders the displayName of component before memoizing
+ ✅ renders the displayName of memoized component
+```
+### ✅ packages/pretty-format/src/__tests__/ReactElement.test.ts
+```
+ReactElement Plugin
+ ✅ serializes forwardRef without displayName
+ ✅ serializes forwardRef with displayName
+ ✅ serializes forwardRef component with displayName
```
\ No newline at end of file
diff --git a/__tests__/__outputs__/junit-with-message.md b/__tests__/__outputs__/junit-with-message.md
new file mode 100644
index 0000000..634a402
--- /dev/null
+++ b/__tests__/__outputs__/junit-with-message.md
@@ -0,0 +1,15 @@
+
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/junit-with-message.xml](#user-content-r0)||1 ❌||1ms|
+## ❌ fixtures/junit-with-message.xml
+**1** tests were completed in **1ms** with **0** passed, **1** failed and **0** skipped.
+|Test suite|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[Test](#user-content-r0s0)||1 ❌||1ms|
+### ❌ Test
+```
+Fails
+ ❌ Test
+ error.cpp:01
+```
\ No newline at end of file
diff --git a/__tests__/__outputs__/mocha-json.md b/__tests__/__outputs__/mocha-json.md
index e104bc4..875f881 100644
--- a/__tests__/__outputs__/mocha-json.md
+++ b/__tests__/__outputs__/mocha-json.md
@@ -1,11 +1,14 @@

-## ❌ fixtures/mocha-json.json
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/mocha-json.json](#user-content-r0)|1 ✅|4 ❌|1 ⚪|12ms|
+## ❌ fixtures/mocha-json.json
**6** tests were completed in **12ms** with **1** passed, **4** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[test/main.test.js](#r0s0)|1✅|3❌||1ms|
-|[test/second.test.js](#r0s1)||1❌|1⚪|8ms|
-### ❌ test/main.test.js
+|[test/main.test.js](#user-content-r0s0)|1 ✅|3 ❌||1ms|
+|[test/second.test.js](#user-content-r0s1)||1 ❌|1 ⚪|8ms|
+### ❌ test/main.test.js
```
Test 1
✅ Passing test
@@ -21,7 +24,7 @@ Test 2
❌ Exception in test
Some error
```
-### ❌ test/second.test.js
+### ❌ test/second.test.js
```
⚪ Skipped test
❌ Timeout test
diff --git a/__tests__/__outputs__/mocha-test-results.md b/__tests__/__outputs__/mocha-test-results.md
index a1cb89b..4a6e2f6 100644
--- a/__tests__/__outputs__/mocha-test-results.md
+++ b/__tests__/__outputs__/mocha-test-results.md
@@ -1,41 +1,1437 @@

-## ✅ fixtures/external/mocha/mocha-test-results.json
+Expand for details
+
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/external/mocha/mocha-test-results.json](#user-content-r0)|833 ✅||6 ⚪|6s|
+## ✅ fixtures/external/mocha/mocha-test-results.json
**839** tests were completed in **6s** with **833** passed, **0** failed and **6** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|test/node-unit/buffered-worker-pool.spec.js|14✅|||8ms|
-|test/node-unit/cli/config.spec.js|10✅|||8ms|
-|test/node-unit/cli/node-flags.spec.js|105✅|||9ms|
-|test/node-unit/cli/options.spec.js|36✅|||250ms|
-|test/node-unit/cli/run-helpers.spec.js|9✅|||8ms|
-|test/node-unit/cli/run.spec.js|40✅|||4ms|
-|test/node-unit/mocha.spec.js|24✅|||33ms|
-|test/node-unit/parallel-buffered-runner.spec.js|19✅|||23ms|
-|test/node-unit/reporters/parallel-buffered.spec.js|6✅|||16ms|
-|test/node-unit/serializer.spec.js|40✅|||31ms|
-|test/node-unit/stack-trace-filter.spec.js|2✅||4⚪|1ms|
-|test/node-unit/utils.spec.js|5✅|||1ms|
-|test/node-unit/worker.spec.js|15✅|||92ms|
-|test/unit/context.spec.js|8✅|||5ms|
-|test/unit/duration.spec.js|3✅|||166ms|
-|test/unit/errors.spec.js|13✅|||5ms|
-|test/unit/globals.spec.js|4✅|||0ms|
-|test/unit/grep.spec.js|8✅|||2ms|
-|test/unit/hook-async.spec.js|3✅|||1ms|
-|test/unit/hook-sync-nested.spec.js|4✅|||1ms|
-|test/unit/hook-sync.spec.js|3✅|||0ms|
-|test/unit/hook-timeout.spec.js|1✅|||0ms|
-|test/unit/hook.spec.js|4✅|||0ms|
-|test/unit/mocha.spec.js|115✅||1⚪|128ms|
-|test/unit/overspecified-async.spec.js|1✅|||3ms|
-|test/unit/parse-query.spec.js|2✅|||1ms|
-|test/unit/plugin-loader.spec.js|41✅||1⚪|16ms|
-|test/unit/required-tokens.spec.js|1✅|||0ms|
-|test/unit/root.spec.js|1✅|||0ms|
-|test/unit/runnable.spec.js|55✅|||122ms|
-|test/unit/runner.spec.js|77✅|||43ms|
-|test/unit/suite.spec.js|57✅|||14ms|
-|test/unit/test.spec.js|15✅|||0ms|
-|test/unit/throw.spec.js|9✅|||9ms|
-|test/unit/timeout.spec.js|8✅|||109ms|
-|test/unit/utils.spec.js|75✅|||24ms|
\ No newline at end of file
+|[test/node-unit/buffered-worker-pool.spec.js](#user-content-r0s0)|14 ✅|||8ms|
+|[test/node-unit/cli/config.spec.js](#user-content-r0s1)|10 ✅|||8ms|
+|[test/node-unit/cli/node-flags.spec.js](#user-content-r0s2)|105 ✅|||9ms|
+|[test/node-unit/cli/options.spec.js](#user-content-r0s3)|36 ✅|||250ms|
+|[test/node-unit/cli/run-helpers.spec.js](#user-content-r0s4)|9 ✅|||8ms|
+|[test/node-unit/cli/run.spec.js](#user-content-r0s5)|40 ✅|||4ms|
+|[test/node-unit/mocha.spec.js](#user-content-r0s6)|24 ✅|||33ms|
+|[test/node-unit/parallel-buffered-runner.spec.js](#user-content-r0s7)|19 ✅|||23ms|
+|[test/node-unit/reporters/parallel-buffered.spec.js](#user-content-r0s8)|6 ✅|||16ms|
+|[test/node-unit/serializer.spec.js](#user-content-r0s9)|40 ✅|||31ms|
+|[test/node-unit/stack-trace-filter.spec.js](#user-content-r0s10)|2 ✅||4 ⚪|1ms|
+|[test/node-unit/utils.spec.js](#user-content-r0s11)|5 ✅|||1ms|
+|[test/node-unit/worker.spec.js](#user-content-r0s12)|15 ✅|||92ms|
+|[test/unit/context.spec.js](#user-content-r0s13)|8 ✅|||5ms|
+|[test/unit/duration.spec.js](#user-content-r0s14)|3 ✅|||166ms|
+|[test/unit/errors.spec.js](#user-content-r0s15)|13 ✅|||5ms|
+|[test/unit/globals.spec.js](#user-content-r0s16)|4 ✅|||0ms|
+|[test/unit/grep.spec.js](#user-content-r0s17)|8 ✅|||2ms|
+|[test/unit/hook-async.spec.js](#user-content-r0s18)|3 ✅|||1ms|
+|[test/unit/hook-sync-nested.spec.js](#user-content-r0s19)|4 ✅|||1ms|
+|[test/unit/hook-sync.spec.js](#user-content-r0s20)|3 ✅|||0ms|
+|[test/unit/hook-timeout.spec.js](#user-content-r0s21)|1 ✅|||0ms|
+|[test/unit/hook.spec.js](#user-content-r0s22)|4 ✅|||0ms|
+|[test/unit/mocha.spec.js](#user-content-r0s23)|115 ✅||1 ⚪|128ms|
+|[test/unit/overspecified-async.spec.js](#user-content-r0s24)|1 ✅|||3ms|
+|[test/unit/parse-query.spec.js](#user-content-r0s25)|2 ✅|||1ms|
+|[test/unit/plugin-loader.spec.js](#user-content-r0s26)|41 ✅||1 ⚪|16ms|
+|[test/unit/required-tokens.spec.js](#user-content-r0s27)|1 ✅|||0ms|
+|[test/unit/root.spec.js](#user-content-r0s28)|1 ✅|||0ms|
+|[test/unit/runnable.spec.js](#user-content-r0s29)|55 ✅|||122ms|
+|[test/unit/runner.spec.js](#user-content-r0s30)|77 ✅|||43ms|
+|[test/unit/suite.spec.js](#user-content-r0s31)|57 ✅|||14ms|
+|[test/unit/test.spec.js](#user-content-r0s32)|15 ✅|||0ms|
+|[test/unit/throw.spec.js](#user-content-r0s33)|9 ✅|||9ms|
+|[test/unit/timeout.spec.js](#user-content-r0s34)|8 ✅|||109ms|
+|[test/unit/utils.spec.js](#user-content-r0s35)|75 ✅|||24ms|
+### ✅ test/node-unit/buffered-worker-pool.spec.js
+```
+class BufferedWorkerPool constructor
+ ✅ should apply defaults
+class BufferedWorkerPool instance method run()
+ ✅ should deserialize the result
+ ✅ should serialize the options object
+class BufferedWorkerPool instance method run() when passed a non-string filepath
+ ✅ should reject
+class BufferedWorkerPool instance method run() when passed no arguments
+ ✅ should reject
+class BufferedWorkerPool instance method stats()
+ ✅ should return the object returned by `workerpool.Pool#stats`
+class BufferedWorkerPool instance method terminate() when called with `force`
+ ✅ should delegate to the underlying pool w/ "force" behavior
+class BufferedWorkerPool instance method terminate() when called without `force`
+ ✅ should delegate to the underlying pool w/o "force" behavior
+class BufferedWorkerPool static method create()
+ ✅ should return a BufferedWorkerPool instance
+class BufferedWorkerPool static method create() when passed no arguments
+ ✅ should not throw
+class BufferedWorkerPool static method serializeOptions()
+ ✅ should return a serialized string
+class BufferedWorkerPool static method serializeOptions() when called multiple times with the same object
+ ✅ should not perform serialization twice
+ ✅ should return the same value
+class BufferedWorkerPool static method serializeOptions() when passed no arguments
+ ✅ should not throw
+```
+### ✅ test/node-unit/cli/config.spec.js
+```
+cli/config findConfig()
+ ✅ should look for one of the config files using findup-sync
+ ✅ should support an explicit `cwd`
+cli/config loadConfig() when config file parsing fails
+ ✅ should throw
+cli/config loadConfig() when parsing succeeds when supplied a filepath with ".cjs" extension
+ ✅ should use the JS parser
+cli/config loadConfig() when parsing succeeds when supplied a filepath with ".js" extension
+ ✅ should use the JS parser
+cli/config loadConfig() when parsing succeeds when supplied a filepath with ".json" extension
+ ✅ should use the JSON parser
+cli/config loadConfig() when parsing succeeds when supplied a filepath with ".jsonc" extension
+ ✅ should use the JSON parser
+cli/config loadConfig() when parsing succeeds when supplied a filepath with ".yaml" extension
+ ✅ should use the YAML parser
+cli/config loadConfig() when parsing succeeds when supplied a filepath with ".yml" extension
+ ✅ should use the YAML parser
+cli/config loadConfig() when supplied a filepath with unsupported extension
+ ✅ should use the JSON parser
+```
+### ✅ test/node-unit/cli/node-flags.spec.js
+```
+node-flags impliesNoTimeouts()
+ ✅ should return true for inspect flags
+node-flags isNodeFlag() for all allowed node env flags which conflict with mocha flags
+ ✅ --require should return false
+ ✅ -r should return false
+node-flags isNodeFlag() for all allowed node environment flags
+ ✅ --abort-on-uncaught-exception should return true
+ ✅ --conditions should return true
+ ✅ --debug-arraybuffer-allocations should return true
+ ✅ --debug-port should return true
+ ✅ --diagnostic-dir should return true
+ ✅ --disable-proto should return true
+ ✅ --disallow-code-generation-from-strings should return true
+ ✅ --enable-source-maps should return true
+ ✅ --es-module-specifier-resolution should return true
+ ✅ --experimental-import-meta-resolve should return true
+ ✅ --experimental-json-modules should return true
+ ✅ --experimental-loader should return true
+ ✅ --experimental-modules should return true
+ ✅ --experimental-policy should return true
+ ✅ --experimental-repl-await should return true
+ ✅ --experimental-report should return true
+ ✅ --experimental-specifier-resolution should return true
+ ✅ --experimental-vm-modules should return true
+ ✅ --experimental-wasi-unstable-preview1 should return true
+ ✅ --experimental-wasm-modules should return true
+ ✅ --experimental-worker should return true
+ ✅ --force-context-aware should return true
+ ✅ --frozen-intrinsics should return true
+ ✅ --heapsnapshot-signal should return true
+ ✅ --http-parser should return true
+ ✅ --http-server-default-timeout should return true
+ ✅ --huge-max-old-generation-size should return true
+ ✅ --icu-data-dir should return true
+ ✅ --input-type should return true
+ ✅ --insecure-http-parser should return true
+ ✅ --inspect should return true
+ ✅ --inspect-brk should return true
+ ✅ --inspect-port should return true
+ ✅ --inspect-publish-uid should return true
+ ✅ --interpreted-frames-native-stack should return true
+ ✅ --jitless should return true
+ ✅ --loader should return true
+ ✅ --max-http-header-size should return true
+ ✅ --max-old-space-size should return true
+ ✅ --napi-modules should return true
+ ✅ --no-deprecation should return true
+ ✅ --no-force-async-hooks-checks should return true
+ ✅ --no-node-snapshot should return true
+ ✅ --no-warnings should return true
+ ✅ --openssl-config should return true
+ ✅ --pending-deprecation should return true
+ ✅ --perf-basic-prof should return true
+ ✅ --perf-basic-prof-only-functions should return true
+ ✅ --perf-prof should return true
+ ✅ --perf-prof-unwinding-info should return true
+ ✅ --policy-integrity should return true
+ ✅ --preserve-symlinks should return true
+ ✅ --preserve-symlinks-main should return true
+ ✅ --prof-process should return true
+ ✅ --redirect-warnings should return true
+ ✅ --report-compact should return true
+ ✅ --report-dir should return true
+ ✅ --report-directory should return true
+ ✅ --report-filename should return true
+ ✅ --report-on-fatalerror should return true
+ ✅ --report-on-signal should return true
+ ✅ --report-signal should return true
+ ✅ --report-uncaught-exception should return true
+ ✅ --stack-trace-limit should return true
+ ✅ --throw-deprecation should return true
+ ✅ --title should return true
+ ✅ --tls-cipher-list should return true
+ ✅ --tls-keylog should return true
+ ✅ --tls-max-v1.2 should return true
+ ✅ --tls-max-v1.3 should return true
+ ✅ --tls-min-v1.0 should return true
+ ✅ --tls-min-v1.1 should return true
+ ✅ --tls-min-v1.2 should return true
+ ✅ --tls-min-v1.3 should return true
+ ✅ --trace-deprecation should return true
+ ✅ --trace-event-categories should return true
+ ✅ --trace-event-file-pattern should return true
+ ✅ --trace-events-enabled should return true
+ ✅ --trace-exit should return true
+ ✅ --trace-sigint should return true
+ ✅ --trace-sync-io should return true
+ ✅ --trace-tls should return true
+ ✅ --trace-uncaught should return true
+ ✅ --trace-warnings should return true
+ ✅ --track-heap-objects should return true
+ ✅ --unhandled-rejections should return true
+ ✅ --use-bundled-ca should return true
+ ✅ --use-largepages should return true
+ ✅ --use-openssl-ca should return true
+ ✅ --v8-pool-size should return true
+ ✅ --zero-fill-buffers should return true
+node-flags isNodeFlag() special cases
+ ✅ should return true for "es-staging"
+ ✅ should return true for "gc-global"
+ ✅ should return true for "harmony" itself
+ ✅ should return true for "use-strict"
+ ✅ should return true for flags starting with "--v8-"
+ ✅ should return true for flags starting with "harmony-" or "harmony_"
+ ✅ should return true for flags starting with "preserve-symlinks"
+ ✅ should return true for flags starting with "trace-" or "trace_"
+node-flags isNodeFlag() when expecting leading dashes
+ ✅ should require leading dashes
+node-flags unparseNodeFlags()
+ ✅ should handle multiple v8 flags
+ ✅ should handle single v8 flags
+```
+### ✅ test/node-unit/cli/options.spec.js
+```
+options loadOptions() "extension" handling when user does not supply "extension" option
+ ✅ should retain the default
+options loadOptions() "extension" handling when user supplies "extension" option
+ ✅ should not concatenate the default value
+options loadOptions() "ignore" handling
+ ✅ should not split option values by comma
+options loadOptions() "spec" handling when user supplies "spec" in config and positional arguments
+ ✅ should place both - unsplitted - into the positional arguments array
+options loadOptions() config priority
+ ✅ should prioritize args over rc file
+ ✅ should prioritize package.json over defaults
+ ✅ should prioritize rc file over package.json
+options loadOptions() when called with a one-and-done arg "h"
+ ✅ should return basic parsed arguments and flag
+options loadOptions() when called with a one-and-done arg "help"
+ ✅ should return basic parsed arguments and flag
+options loadOptions() when called with a one-and-done arg "list-interfaces"
+ ✅ should return basic parsed arguments and flag
+options loadOptions() when called with a one-and-done arg "list-reporters"
+ ✅ should return basic parsed arguments and flag
+options loadOptions() when called with a one-and-done arg "V"
+ ✅ should return basic parsed arguments and flag
+options loadOptions() when called with a one-and-done arg "version"
+ ✅ should return basic parsed arguments and flag
+options loadOptions() when no parameter provided
+ ✅ should return an object containing positional args, defaults, and anti-reloading flags
+options loadOptions() when parameter provided package.json when called with package = false (`--no-package`)
+ ✅ should not look for package.json
+ ✅ should return parsed args and default config
+ ✅ should set package = false
+options loadOptions() when parameter provided package.json when path to package.json (`--package `) is invalid
+ ✅ should throw
+options loadOptions() when parameter provided package.json when path to package.json (`--package `) is valid
+ ✅ should not try to find a package.json
+ ✅ should return merged options incl. package.json opts
+ ✅ should set package = false
+options loadOptions() when parameter provided package.json when path to package.json unspecified
+ ✅ should return merged options incl. found package.json
+ ✅ should set package = false
+options loadOptions() when parameter provided rc file when called with config = false (`--no-config`)
+ ✅ should not attempt to find a config file
+ ✅ should not attempt to load a config file
+ ✅ should return parsed args, default config and package.json
+ ✅ should set config = false
+options loadOptions() when parameter provided rc file when called with unspecified config when an rc file would be found
+ ✅ should attempt to load file at found path
+ ✅ should look for a config
+ ✅ should set config = false
+options loadOptions() when parameter provided rc file when called with unspecified config when an rc file would not be found
+ ✅ should look for a config
+ ✅ should not attempt to load a config file
+ ✅ should set config = false
+options loadOptions() when parameter provided rc file when path to config (`--config `) is invalid
+ ✅ should attempt to load file at path
+ ✅ should not look for a config
+ ✅ should throw to warn the user
+```
+### ✅ test/node-unit/cli/run-helpers.spec.js
+```
+helpers list() when given a comma-delimited string
+ ✅ should return a flat array
+helpers list() when provided a flat array
+ ✅ should return a flat array
+helpers list() when provided a nested array
+ ✅ should return a flat array
+helpers validateLegacyPlugin() when a plugin throws an exception upon load
+ ✅ should fail and report the original error
+helpers validateLegacyPlugin() when used with "reporter" key
+ ✅ should disallow an array of names
+ ✅ should fail to recognize an unknown reporter
+helpers validateLegacyPlugin() when used with an "interfaces" key
+ ✅ should disallow an array of names
+ ✅ should fail to recognize an unknown interface
+helpers validateLegacyPlugin() when used with an unknown plugin type
+ ✅ should fail
+```
+### ✅ test/node-unit/cli/run.spec.js
+```
+command run builder array type
+ ✅ should include option extension
+ ✅ should include option file
+ ✅ should include option global
+ ✅ should include option ignore
+ ✅ should include option reporter-option
+ ✅ should include option require
+ ✅ should include option spec
+ ✅ should include option watch-files
+ ✅ should include option watch-ignore
+command run builder boolean type
+ ✅ should include option allow-uncaught
+ ✅ should include option async-only
+ ✅ should include option bail
+ ✅ should include option check-leaks
+ ✅ should include option color
+ ✅ should include option delay
+ ✅ should include option diff
+ ✅ should include option exit
+ ✅ should include option forbid-only
+ ✅ should include option forbid-pending
+ ✅ should include option full-trace
+ ✅ should include option growl
+ ✅ should include option inline-diffs
+ ✅ should include option invert
+ ✅ should include option list-interfaces
+ ✅ should include option list-reporters
+ ✅ should include option no-colors
+ ✅ should include option parallel
+ ✅ should include option recursive
+ ✅ should include option sort
+ ✅ should include option watch
+command run builder number type
+ ✅ should include option jobs
+ ✅ should include option retries
+command run builder string type
+ ✅ should include option config
+ ✅ should include option fgrep
+ ✅ should include option grep
+ ✅ should include option package
+ ✅ should include option reporter
+ ✅ should include option slow
+ ✅ should include option timeout
+ ✅ should include option ui
+```
+### ✅ test/node-unit/mocha.spec.js
+```
+Mocha instance method addFile()
+ ✅ should add the given file to the files array
+ ✅ should be chainable
+Mocha instance method lazyLoadFiles()
+ ✅ should return the `Mocha` instance
+Mocha instance method lazyLoadFiles() when passed `true`
+ ✅ should enable lazy loading
+Mocha instance method lazyLoadFiles() when passed a non-`true` value
+ ✅ should enable eager loading
+Mocha instance method loadFiles()
+ ✅ should execute the optional callback if given
+ ✅ should load all files from the files array
+Mocha instance method parallelMode() when `Mocha` is running in Node.js
+ ✅ should return the Mocha instance
+Mocha instance method parallelMode() when `Mocha` is running in Node.js when `Mocha` instance in serial mode when passed `true` value when `Mocha` instance is in `INIT` state
+ ✅ should enable parallel mode
+Mocha instance method parallelMode() when `Mocha` is running in Node.js when `Mocha` instance in serial mode when passed `true` value when `Mocha` instance is not in `INIT` state
+ ✅ should throw
+Mocha instance method parallelMode() when `Mocha` is running in Node.js when `Mocha` instance in serial mode when passed non-`true` value when `Mocha` instance is in `INIT` state
+ ✅ should enable serial mode
+Mocha instance method parallelMode() when `Mocha` is running in Node.js when parallel mode is already disabled
+ ✅ should not swap the Runner, nor change lazy loading setting
+Mocha instance method parallelMode() when `Mocha` is running in Node.js when parallel mode is already enabled
+ ✅ should not swap the Runner, nor change lazy loading setting
+Mocha instance method reporter() when a reporter exists relative to the "mocha" module path
+ ✅ should load from module path
+Mocha instance method reporter() when a reporter exists relative to the "mocha" module path when the reporter throws upon load
+ ✅ should throw "invalid reporter" exception
+ ✅ should warn about the error before throwing
+Mocha instance method reporter() when a reporter exists relative to the cwd
+ ✅ should load from current working directory
+Mocha instance method reporter() when a reporter exists relative to the cwd when the reporter throws upon load
+ ✅ should throw "invalid reporter" exception
+ ✅ should warn about the error before throwing
+Mocha instance method unloadFiles()
+ ✅ should be chainable
+ ✅ should delegate Mocha.unloadFile() for each item in its list of files
+ ✅ should not be allowed when the current instance is already disposed
+ ✅ should reset referencesCleaned and allow for next run
+Mocha static method unloadFile()
+ ✅ should unload a specific file from cache
+```
+### ✅ test/node-unit/parallel-buffered-runner.spec.js
+```
+parallel-buffered-runner ParallelBufferedRunner constructor
+ ✅ should start in "IDLE" state
+parallel-buffered-runner ParallelBufferedRunner event EVENT_RUN_END
+ ✅ should change the state to COMPLETE
+parallel-buffered-runner ParallelBufferedRunner instance method isParallelMode()
+ ✅ should return true
+parallel-buffered-runner ParallelBufferedRunner instance method linkPartialObjects()
+ ✅ should return the runner
+parallel-buffered-runner ParallelBufferedRunner instance method run()
+ ✅ should be chainable
+ ✅ should emit `EVENT_RUN_BEGIN`
+parallel-buffered-runner ParallelBufferedRunner instance method run() when a suite has a bail flag when an event contains an error and has positive failures when subsequent files already started running
+ ✅ should cleanly terminate the thread pool
+parallel-buffered-runner ParallelBufferedRunner instance method run() when a suite has a bail flag when an event contains an error and has positive failures when subsequent files have not yet been run
+ ✅ should cleanly terminate the thread pool
+ ✅ should cleanly terminate the thread pool
+parallel-buffered-runner ParallelBufferedRunner instance method run() when a suite has a bail flag when no event contains an error
+ ✅ should not force-terminate
+parallel-buffered-runner ParallelBufferedRunner instance method run() when a worker fails
+ ✅ should delegate to Runner#uncaught
+ ✅ should recover
+parallel-buffered-runner ParallelBufferedRunner instance method run() when instructed to link objects
+ ✅ should create object references
+parallel-buffered-runner ParallelBufferedRunner instance method run() when instructed to link objects when event data object is missing an ID
+ ✅ should result in an uncaught exception
+parallel-buffered-runner ParallelBufferedRunner instance method run() when suite should bail when an event contains an error and has positive failures when subsequent files already started running
+ ✅ should cleanly terminate the thread pool
+parallel-buffered-runner ParallelBufferedRunner instance method run() when suite should bail when an event contains an error and has positive failures when subsequent files have not yet been run
+ ✅ should cleanly terminate the thread pool
+parallel-buffered-runner ParallelBufferedRunner instance method run() when suite should bail when no event contains an error
+ ✅ should not force-terminate
+parallel-buffered-runner ParallelBufferedRunner instance method workerReporter()
+ ✅ should return its context
+parallel-buffered-runner ParallelBufferedRunner instance property _state
+ ✅ should disallow an invalid state transition
+```
+### ✅ test/node-unit/reporters/parallel-buffered.spec.js
+```
+ParallelBuffered constructor
+ ✅ should listen for Runner events
+ ✅ should listen for Runner events expecting to occur once
+ParallelBuffered event on any other event listened for
+ ✅ should populate its `events` array with SerializableEvents
+ParallelBuffered event on EVENT_RUN_END
+ ✅ should remove all listeners
+ParallelBuffered instance method done
+ ✅ should execute its callback with a SerializableWorkerResult
+ ✅ should reset its `events` prop
+```
+### ✅ test/node-unit/serializer.spec.js
+```
+serializer function deserialize when passed a non-object value
+ ✅ should return the value
+serializer function deserialize when passed a SerializedWorkerResult object
+ ✅ should return the result of `SerializableWorkerResult.deserialize` called on the value
+serializer function deserialize when passed an object value which is not a SerializedWorkerResult
+ ✅ should return the value
+serializer function deserialize when passed nothing
+ ✅ should return `undefined`
+serializer function serialize when not passed anything
+ ✅ should return `undefined`
+serializer function serialize when passed a non-object value
+ ✅ should return the value
+serializer function serialize when passed an object value having a `serialize` method
+ ✅ should return the result of the `serialize` method
+serializer function serialize when passed an object value w/o a `serialize` method
+ ✅ should return the value
+serializer SerializableEvent constructor when called with a non-object `rawObject`
+ ✅ should throw "invalid arg type" error
+serializer SerializableEvent constructor when called without `eventName`
+ ✅ should throw "invalid arg value" error
+serializer SerializableEvent instance method serialize
+ ✅ should freeze the instance
+ ✅ should mutate the instance in-place
+serializer SerializableEvent instance method serialize when passed an error
+ ✅ should not retain not-own props
+ ✅ should retain own props
+ ✅ should serialize the error
+serializer SerializableEvent instance method serialize when passed an object containing a nested prop with an Error value
+ ✅ should serialize the Error
+serializer SerializableEvent instance method serialize when passed an object containing a non-`serialize` method
+ ✅ should remove the method
+serializer SerializableEvent instance method serialize when passed an object containing a top-level prop with an Error value
+ ✅ should serialize the Error
+serializer SerializableEvent instance method serialize when passed an object containing an array
+ ✅ should serialize the array
+serializer SerializableEvent instance method serialize when passed an object containing an object with a `serialize` method
+ ✅ should call the `serialize` method
+serializer SerializableEvent instance method serialize when passed an object with a `serialize` method
+ ✅ should call the `serialize` method
+serializer SerializableEvent static method create
+ ✅ should instantiate a SerializableEvent
+serializer SerializableEvent static method deserialize
+ ✅ should return a new object w/ null prototype
+serializer SerializableEvent static method deserialize when passed a falsy parameter
+ ✅ should throw "invalid arg type" error
+serializer SerializableEvent static method deserialize when passed value contains `data` prop
+ ✅ should ignore __proto__
+serializer SerializableEvent static method deserialize when passed value contains `data` prop when `data` prop contains a nested serialized Error prop
+ ✅ should create an Error instance from the nested serialized Error prop
+serializer SerializableEvent static method deserialize when passed value contains an `error` prop
+ ✅ should create an Error instance from the prop
+serializer SerializableEvent static method deserialize when passed value data contains a prop beginning with "$$"
+ ✅ should create a new prop having a function value
+ ✅ should create a new prop returning the original value
+ ✅ should remove the prop with the "$$" prefix
+serializer SerializableEvent static method deserialize when the value data contains a prop with an array value
+ ✅ should deserialize each prop
+serializer SerializableWorkerResult constructor
+ ✅ should add a readonly `__type` prop
+serializer SerializableWorkerResult instance method serialize
+ ✅ should call `SerializableEvent#serialize` of each of its events
+ ✅ should return a read-only value
+serializer SerializableWorkerResult static method create
+ ✅ should return a new SerializableWorkerResult instance
+serializer SerializableWorkerResult static method deserialize
+ ✅ should call SerializableEvent#deserialize on each item in its `events` prop
+ ✅ should return the deserialized value
+serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an instance
+ ✅ should return `true`
+serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an object with an appropriate `__type` prop
+ ✅ should return `true`
+serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an object without an appropriate `__type` prop
+ ✅ should return `false`
+```
+### ✅ test/node-unit/stack-trace-filter.spec.js
+```
+stackTraceFilter() on browser
+ ✅ does not strip out other bower_components
+stackTraceFilter() on node on POSIX OS
+ ⚪ does not ignore other bower_components and components
+ ⚪ should get a stack-trace as a string and prettify it
+ ⚪ should not replace absolute path which has cwd as infix
+ ⚪ should replace absolute with relative paths
+stackTraceFilter() on node on Windows
+ ✅ should work on Windows
+```
+### ✅ test/node-unit/utils.spec.js
+```
+utils function canonicalType()
+ ✅ should return "asyncfunction" if the parameter is an async function
+ ✅ should return "buffer" if the parameter is a Buffer
+utils function cwd()
+ ✅ should return the current working directory
+utils function type()
+ ✅ should return "error" if the parameter is an Error
+ ✅ should return "function" if the parameter is an async function
+```
+### ✅ test/node-unit/worker.spec.js
+```
+worker when run as main process
+ ✅ should throw
+worker when run as worker process
+ ✅ should register itself with workerpool
+worker when run as worker process function run() when called with empty "filepath" argument
+ ✅ should reject
+worker when run as worker process function run() when called without arguments
+ ✅ should reject
+worker when run as worker process function run() when passed a non-string `options` value
+ ✅ should reject
+worker when run as worker process function run() when passed an invalid string `options` value
+ ✅ should reject
+worker when run as worker process function run() when the file at "filepath" argument is unloadable
+ ✅ should reject
+worker when run as worker process function run() when the file at "filepath" is loadable
+ ✅ should call Mocha#run
+ ✅ should handle "--require"
+ ✅ should handle "--ui"
+ ✅ should remove all uncaughtException listeners
+ ✅ should remove all unhandledRejection listeners
+worker when run as worker process function run() when the file at "filepath" is loadable when run twice
+ ✅ should initialize only once
+worker when run as worker process function run() when the file at "filepath" is loadable when serialization fails
+ ✅ should reject
+worker when run as worker process function run() when the file at "filepath" is loadable when serialization succeeds
+ ✅ should resolve with a SerializedWorkerResult
+```
+### ✅ test/unit/context.spec.js
+```
+Context nested
+ ✅ should work
+Context Siblings sequestered sibling
+ ✅ should work
+Context Siblings sibling verifiction
+ ✅ should allow test siblings to modify shared context
+ ✅ should have reset this.calls before describe
+ ✅ should not have value set within a sibling describe
+methods retries
+ ✅ should return the number of retries
+methods slow()
+ ✅ should return the slow
+methods timeout()
+ ✅ should return the timeout
+```
+### ✅ test/unit/duration.spec.js
+```
+durations when fast
+ ✅ should not highlight
+durations when reasonable
+ ✅ should highlight in yellow
+durations when slow
+ ✅ should highlight in red
+```
+### ✅ test/unit/errors.spec.js
+```
+Errors createForbiddenExclusivityError() when Mocha instance is not running in a worker process
+ ✅ should output a message regarding --forbid-only
+Errors createForbiddenExclusivityError() when Mocha instance is running in a worker process
+ ✅ should output a message regarding incompatibility
+Errors createInvalidInterfaceError()
+ ✅ should include expected code in thrown interface errors
+Errors createInvalidReporterError()
+ ✅ should include expected code in thrown reporter errors
+Errors deprecate()
+ ✅ should cache the message
+ ✅ should coerce its parameter to a string
+ ✅ should ignore falsy messages
+Errors isMochaError() when provided a non-error
+ ✅ should return false
+Errors isMochaError() when provided an Error object having a known Mocha error code
+ ✅ should return true
+Errors isMochaError() when provided an Error object with a non-Mocha error code
+ ✅ should return false
+Errors warn()
+ ✅ should call process.emitWarning
+ ✅ should ignore falsy messages
+ ✅ should not cache messages
+```
+### ✅ test/unit/globals.spec.js
+```
+global leaks
+ ✅ should cause tests to fail
+ ✅ should pass when accepted
+ ✅ should pass when prefixed "mocha-"
+ ✅ should pass with wildcard
+```
+### ✅ test/unit/grep.spec.js
+```
+Mocha .grep()
+ ✅ should add a RegExp to the mocha.options object
+ ✅ should convert grep string to a RegExp
+ ✅ should covert grep regex-like string to a RegExp
+ ✅ should return its parent Mocha object for chainability
+Mocha "fgrep" option
+ ✅ should escape and convert string to a RegExp
+Mocha "grep" option
+ ✅ should add a RegExp to the mocha.options object
+ ✅ should convert string to a RegExp
+Mocha "invert" option
+ ✅ should add a Boolean to the mocha.options object
+```
+### ✅ test/unit/hook-async.spec.js
+```
+async hooks
+ ✅ one
+ ✅ three
+ ✅ two
+```
+### ✅ test/unit/hook-sync-nested.spec.js
+```
+serial nested
+ ✅ bar
+ ✅ foo
+serial nested hooks
+ ✅ one
+ ✅ two
+```
+### ✅ test/unit/hook-sync.spec.js
+```
+serial hooks
+ ✅ one
+ ✅ three
+ ✅ two
+```
+### ✅ test/unit/hook-timeout.spec.js
+```
+hook timeout
+ ✅ should work
+```
+### ✅ test/unit/hook.spec.js
+```
+Hook error
+ ✅ should get the hook._error when called without arguments
+ ✅ should set the hook._error
+Hook reset
+ ✅ should call Runnable.reset
+ ✅ should reset the error state
+```
+### ✅ test/unit/mocha.spec.js
+```
+Mocha constructor
+ ✅ should set _cleanReferencesAfterRun to true
+Mocha constructor when `global` option is an `Array`
+ ✅ should attempt to set globals
+Mocha constructor when `parallel` option is true and `jobs` option <= 1
+ ✅ should not enable parallel mode
+Mocha constructor when `parallel` option is true and `jobs` option > 1
+ ✅ should enable parallel mode
+Mocha constructor when `parallel` option is true when `enableGlobalSetup` option is present
+ ✅ should toggle global setup fixtures
+Mocha constructor when `parallel` option is true when `enableGlobalTeardown` option is present
+ ✅ should configure global teardown fixtures
+Mocha constructor when `parallel` option is true when `globalSetup` option is present
+ ✅ should configure global setup fixtures
+Mocha constructor when `parallel` option is true when `globalTeardown` option is present
+ ✅ should configure global teardown fixtures
+Mocha constructor when `retries` option is not present
+ ✅ should not attempt to set retries
+Mocha constructor when `retries` option is present
+ ✅ should attempt to set retries`
+Mocha constructor when `rootHooks` option is truthy
+ ✅ shouid attempt to set root hooks
+Mocha constructor when `timeout` option is `false`
+ ✅ should attempt to set timeout
+Mocha constructor when `timeout` option is `undefined`
+ ✅ should not attempt to set timeout
+Mocha instance method _runGlobalFixtures()
+ ✅ should execute multiple fixtures in order
+Mocha instance method allowUncaught()
+ ✅ should be chainable
+ ✅ should set the allowUncaught option to false
+ ✅ should set the allowUncaught option to true
+Mocha instance method asyncOnly()
+ ✅ should be chainable
+ ✅ should set the asyncOnly option to false
+ ✅ should set the asyncOnly option to true
+Mocha instance method bail()
+ ✅ should be chainable
+Mocha instance method bail() when provided a falsy argument
+ ✅ should unset the "bail" flag on the root suite
+Mocha instance method bail() when provided no arguments
+ ✅ should set the "bail" flag on the root suite
+Mocha instance method checkLeaks()
+ ✅ should set the checkLeaks option to true
+Mocha instance method cleanReferencesAfterRun()
+ ✅ should be chainable
+ ✅ should set the _cleanReferencesAfterRun attribute
+ ✅ should set the _cleanReferencesAfterRun attribute to false
+Mocha instance method color()
+ ✅ should be chainable
+ ✅ should set the color option to false
+ ✅ should set the color option to true
+Mocha instance method delay()
+ ✅ should be chainable
+ ✅ should set the delay option to true
+Mocha instance method diff()
+ ✅ should set the diff option to true
+Mocha instance method diff() when provided `false` argument
+ ✅ should set the diff option to false
+Mocha instance method dispose()
+ ✅ should dispose previous test runner
+ ✅ should dispose the root suite
+ ✅ should unload the files
+Mocha instance method forbidOnly()
+ ✅ should be chainable
+ ✅ should set the forbidOnly option to false
+ ✅ should set the forbidOnly option to true
+Mocha instance method forbidPending()
+ ✅ should be chainable
+ ✅ should set the forbidPending option to false
+ ✅ should set the forbidPending option to true
+Mocha instance method fullTrace()
+ ✅ should be chainable
+ ✅ should set the fullTrace option to false
+ ✅ should set the fullTrace option to true
+Mocha instance method global()
+ ✅ should be an empty array initially
+ ✅ should be chainable
+Mocha instance method global() when argument is invalid
+ ✅ should not modify the whitelist when given empty array
+ ✅ should not modify the whitelist when given empty string
+Mocha instance method global() when argument is valid
+ ✅ should add contents of string array to the whitelist
+ ✅ should add string to the whitelist
+ ✅ should not have duplicates
+Mocha instance method growl()
+ ✅ should be chainable
+Mocha instance method growl() if capable of notifications
+ ✅ should set the growl option to true
+Mocha instance method growl() if not capable of notifications
+ ✅ should set the growl option to false
+Mocha instance method hasGlobalSetupFixtures() when no global setup fixtures are present
+ ✅ should return `false`
+Mocha instance method hasGlobalSetupFixtures() when one or more global setup fixtures are present
+ ✅ should return `true`
+Mocha instance method hasGlobalTeardownFixtures() when no global teardown fixtures are present
+ ✅ should return `false`
+Mocha instance method hasGlobalTeardownFixtures() when one or more global teardown fixtures are present
+ ✅ should return `true`
+Mocha instance method inlineDiffs()
+ ✅ should be chainable
+ ✅ should set the inlineDiffs option to false
+ ✅ should set the inlineDiffs option to true
+Mocha instance method invert()
+ ✅ should be chainable
+ ✅ should set the invert option to true
+Mocha instance method noHighlighting()
+ ✅ should be chainable
+ ✅ should set the noHighlighting option to true
+Mocha instance method parallelMode() when `Mocha` is running in a browser
+ ✅ should throw
+Mocha instance method reporter()
+ ✅ should be chainable
+ ✅ should keep reporterOption on options
+ ✅ should support legacy reporterOptions
+Mocha instance method rootHooks()
+ ✅ should be chainable
+Mocha instance method rootHooks() when provided a single "after all" hook
+ ✅ should attach it to the root suite
+Mocha instance method rootHooks() when provided a single "after each" hook
+ ✅ should attach it to the root suite
+Mocha instance method rootHooks() when provided a single "before all" hook
+ ✅ should attach it to the root suite
+Mocha instance method rootHooks() when provided a single "before each" hook
+ ✅ should attach it to the root suite
+Mocha instance method rootHooks() when provided multiple "after all" hooks
+ ✅ should attach each to the root suite
+Mocha instance method rootHooks() when provided multiple "after each" hooks
+ ✅ should attach each to the root suite
+Mocha instance method rootHooks() when provided multiple "before all" hooks
+ ✅ should attach each to the root suite
+Mocha instance method rootHooks() when provided multiple "before each" hooks
+ ✅ should attach each to the root suite
+Mocha instance method run()
+ ✅ should execute the callback when complete
+ ⚪ should initialize the stats collector
+ ✅ should instantiate a reporter
+Mocha instance method run() Base reporter initialization
+ ✅ should configure the Base reporter
+Mocha instance method run() Base reporter initialization when "color" options is set
+ ✅ should configure the Base reporter
+Mocha instance method run() Runner initialization
+ ✅ should instantiate a Runner
+Mocha instance method run() Runner initialization when "global" option is present
+ ✅ should configure global vars
+Mocha instance method run() Runner initialization when "grep" option is present
+ ✅ should configure "grep"
+Mocha instance method run() when "growl" option is present
+ ✅ should initialize growl support
+Mocha instance method run() when a reporter instance has a "done" method
+ ✅ should call the reporter "done" method
+Mocha instance method run() when a run has finished and is called again
+ ✅ should not call `Runner#runAsync()`
+ ✅ should throw
+Mocha instance method run() when a run is in progress
+ ✅ should not call `Runner#runAsync`
+ ✅ should throw
+Mocha instance method run() when files have been added to the Mocha instance when Mocha is set to eagerly load files
+ ✅ should eagerly load files
+Mocha instance method run() when files have been added to the Mocha instance when Mocha is set to lazily load files
+ ✅ should not eagerly load files
+Mocha instance method run() when global setup fixtures disabled when global setup fixtures are present
+ ✅ should not run global setup fixtures
+Mocha instance method run() when global setup fixtures disabled when global setup fixtures not present
+ ✅ should not run global setup fixtures
+Mocha instance method run() when global setup fixtures enabled when global setup fixtures are present
+ ✅ should run global setup fixtures
+Mocha instance method run() when global setup fixtures enabled when global setup fixtures not present
+ ✅ should not run global setup fixtures
+Mocha instance method run() when global teardown fixtures disabled when global teardown fixtures are present
+ ✅ should not run global teardown fixtures
+Mocha instance method run() when global teardown fixtures disabled when global teardown fixtures not present
+ ✅ should not run global teardown fixtures
+Mocha instance method run() when global teardown fixtures enabled when global teardown fixtures are present
+ ✅ should run global teardown fixtures
+Mocha instance method run() when global teardown fixtures enabled when global teardown fixtures are present when global setup fixtures are present and enabled
+ ✅ should use the same context as returned by `runGlobalSetup`
+Mocha instance method run() when global teardown fixtures enabled when global teardown fixtures not present
+ ✅ should not run global teardown fixtures
+Mocha instance method run() when Mocha configured for multiple runs and multiple runs are attempted
+ ✅ should call `Runner#runAsync` for each call
+ ✅ should dispose the previous runner
+ ✅ should not throw
+ ✅ should reset the root Suite between runs
+Mocha instance method run() when the `Mocha` instance is already disposed
+ ✅ should not call `Runner#runAsync`
+ ✅ should throw
+Mocha instance method runGlobalSetup() when a fixture is not present
+ ✅ should not attempt to run fixtures
+Mocha instance method runGlobalSetup() when fixture(s) are present
+ ✅ should attempt run the fixtures
+Mocha instance method runGlobalTeardown() when a fixture is not present
+ ✅ not attempt to run the fixtures
+Mocha instance method runGlobalTeardown() when fixture(s) are present
+ ✅ should attempt to run the fixtures
+Mocha instance method unloadFile() when run in a browser
+ ✅ should throw
+```
+### ✅ test/unit/overspecified-async.spec.js
+```
+overspecified asynchronous resolution method
+ ✅ should fail when multiple methods are used
+```
+### ✅ test/unit/parse-query.spec.js
+```
+parseQuery()
+ ✅ should get queryString and return key-value object
+ ✅ should parse "+" as a space
+```
+### ✅ test/unit/plugin-loader.spec.js
+```
+plugin module class PluginLoader constructor when passed custom plugins
+ ✅ should register the custom plugins
+plugin module class PluginLoader constructor when passed ignored plugins
+ ✅ should retain a list of ignored plugins
+plugin module class PluginLoader constructor when passed no options
+ ✅ should populate a registry of built-in plugins
+plugin module class PluginLoader instance method finalize() when a plugin has no "finalize" function
+ ✅ should return an array of raw implementations
+plugin module class PluginLoader instance method finalize() when a plugin has one or more implementations
+ ✅ should omit unused plugins
+ ✅ should return an object map using `optionName` key for each registered plugin
+plugin module class PluginLoader instance method finalize() when no plugins have been loaded
+ ✅ should return an empty map
+plugin module class PluginLoader instance method load() when called with a falsy value
+ ✅ should return false
+plugin module class PluginLoader instance method load() when called with an object containing a recognized plugin
+ ✅ should call the associated validator, if present
+ ✅ should retain the value of any matching property in its mapping
+ ✅ should return true
+plugin module class PluginLoader instance method load() when called with an object containing no recognized plugin
+ ✅ should return false
+plugin module class PluginLoader instance method load() when passed a falsy or non-object value
+ ✅ should not call a validator
+ ✅ should return false
+plugin module class PluginLoader instance method load() when passed an object value when a key matches a known named export
+ ✅ should call the associated validator
+ ✅ should not call validators whose keys were not found
+plugin module class PluginLoader instance method load() when passed an object value when a key matches a known named export when the value does not pass the associated validator
+ ✅ should throw
+plugin module class PluginLoader instance method load() when passed an object value when a key matches a known named export when the value passes the associated validator
+ ✅ should add the implementation to the internal mapping
+ ✅ should not add an implementation of plugins not present
+ ✅ should return true
+plugin module class PluginLoader instance method load() when passed an object value when no keys match any known named exports
+ ✅ should return false
+plugin module class PluginLoader instance method register() when passed a definition w/o an exportName
+ ✅ should throw
+plugin module class PluginLoader instance method register() when passed a falsy parameter
+ ✅ should throw
+plugin module class PluginLoader instance method register() when passed a non-object parameter
+ ✅ should throw
+plugin module class PluginLoader instance method register() when the plugin export name is already in use
+ ✅ should throw
+plugin module class PluginLoader instance method register() when the plugin export name is ignored
+ ✅ should not register the plugin
+ ✅ should not throw
+plugin module class PluginLoader instance method register() when the plugin export name is not in use
+ ✅ should not throw
+plugin module class PluginLoader static method create()
+ ✅ should return a PluginLoader instance
+plugin module global fixtures plugin global setup when an implementation is a function
+ ✅ should pass validation
+plugin module global fixtures plugin global setup when an implementation is a primitive
+ ✅ should fail validation
+plugin module global fixtures plugin global setup when an implementation is an array of functions
+ ✅ should pass validation
+plugin module global fixtures plugin global setup when an implementation is an array of primitives
+ ✅ should fail validation
+plugin module global fixtures plugin global teardown when an implementation is a function
+ ✅ should pass validation
+plugin module global fixtures plugin global teardown when an implementation is a primitive
+ ✅ should fail validation
+plugin module global fixtures plugin global teardown when an implementation is an array of functions
+ ✅ should pass validation
+plugin module global fixtures plugin global teardown when an implementation is an array of primitives
+ ✅ should fail validation
+plugin module root hooks plugin 🎣 when a loaded impl is finalized
+ ✅ should flatten the implementations
+plugin module root hooks plugin 🎣 when impl is a function
+ ✅ should pass validation
+plugin module root hooks plugin 🎣 when impl is a primitive
+ ✅ should fail validation
+plugin module root hooks plugin 🎣 when impl is an array
+ ✅ should fail validation
+plugin module root hooks plugin 🎣 when impl is an object of functions
+ ⚪ should pass validation
+```
+### ✅ test/unit/required-tokens.spec.js
+```
+using imported describe
+ ✅ using imported it
+```
+### ✅ test/unit/root.spec.js
+```
+root
+ ✅ should be a valid suite
+```
+### ✅ test/unit/runnable.spec.js
+```
+Runnable(title, fn) .run(fn) if async
+ ✅ this.skip() should halt synchronous execution
+ ✅ this.skip() should set runnable to pending
+Runnable(title, fn) .run(fn) if timed-out
+ ✅ should ignore call to `done` and not execute callback again
+Runnable(title, fn) .run(fn) when .pending
+ ✅ should not invoke the callback
+Runnable(title, fn) .run(fn) when async
+ ✅ should allow a timeout of 0
+ ✅ should allow updating the timeout
+Runnable(title, fn) .run(fn) when async when an error is passed
+ ✅ should invoke the callback
+Runnable(title, fn) .run(fn) when async when an exception is thrown
+ ✅ should invoke the callback
+ ✅ should not throw its own exception if passed a non-object
+Runnable(title, fn) .run(fn) when async when an exception is thrown and is allowed to remain uncaught
+ ✅ throws an error when it is allowed
+Runnable(title, fn) .run(fn) when async when done() is invoked with a non-Error object
+ ✅ should invoke the callback
+Runnable(title, fn) .run(fn) when async when done() is invoked with a string
+ ✅ should invoke the callback
+Runnable(title, fn) .run(fn) when async when the callback is invoked several times with an error
+ ✅ should emit a single "error" event
+Runnable(title, fn) .run(fn) when async when the callback is invoked several times without an error
+ ✅ should emit a single "error" event
+Runnable(title, fn) .run(fn) when async without error
+ ✅ should invoke the callback
+Runnable(title, fn) .run(fn) when fn is not a function
+ ✅ should throw an error
+Runnable(title, fn) .run(fn) when fn returns a non-promise
+ ✅ should invoke the callback
+Runnable(title, fn) .run(fn) when fn returns a promise when the promise is fulfilled with a value
+ ✅ should invoke the callback
+Runnable(title, fn) .run(fn) when fn returns a promise when the promise is fulfilled with no value
+ ✅ should invoke the callback
+Runnable(title, fn) .run(fn) when fn returns a promise when the promise is rejected
+ ✅ should invoke the callback
+Runnable(title, fn) .run(fn) when fn returns a promise when the promise is rejected without a reason
+ ✅ should invoke the callback
+Runnable(title, fn) .run(fn) when fn returns a promise when the promise takes too long to settle
+ ✅ should throw the timeout error
+Runnable(title, fn) .run(fn) when sync when an exception is thrown
+ ✅ should invoke the callback with error
+Runnable(title, fn) .run(fn) when sync when an exception is thrown and is allowed to remain uncaught
+ ✅ throws an error when it is allowed
+Runnable(title, fn) .run(fn) when sync without error
+ ✅ should invoke the callback
+Runnable(title, fn) .run(fn) when timeouts are disabled
+ ✅ should not error with timeout
+Runnable(title, fn) .title
+ ✅ should be present
+Runnable(title, fn) .titlePath()
+ ✅ returns the concatenation of the parent's title path and runnable's title
+Runnable(title, fn) #globals
+ ✅ should allow for whitelisting globals
+Runnable(title, fn) #isFailed()
+ ✅ should return `false` if test is pending
+ ✅ should return `true` if test has failed
+ ✅ should return `true` if test has not failed
+Runnable(title, fn) #reset
+ ✅ should reset current run state
+Runnable(title, fn) #resetTimeout()
+ ✅ should not time out if timeouts disabled after reset
+Runnable(title, fn) #retries(n)
+ ✅ should set the number of retries
+Runnable(title, fn) #slow(ms)
+ ✅ should not set the slow threshold if the parameter is not passed
+ ✅ should not set the slow threshold if the parameter is undefined
+ ✅ should set the slow threshold
+Runnable(title, fn) #slow(ms) when passed a time-formatted string
+ ✅ should convert to ms
+Runnable(title, fn) #timeout(ms) when value is equal to lower bound given numeric value
+ ✅ should set the timeout value to disabled
+Runnable(title, fn) #timeout(ms) when value is equal to lower bound given string timestamp
+ ✅ should set the timeout value to disabled
+Runnable(title, fn) #timeout(ms) when value is equal to upper bound given numeric value
+ ✅ should set the disabled timeout value
+Runnable(title, fn) #timeout(ms) when value is less than lower bound
+ ✅ should clamp to lower bound given numeric
+ ✅ should clamp to lower bound given timestamp
+Runnable(title, fn) #timeout(ms) when value is out-of-bounds given numeric value
+ ✅ should set the disabled timeout value
+Runnable(title, fn) #timeout(ms) when value is within `setTimeout` bounds given numeric value
+ ✅ should set the timeout value
+Runnable(title, fn) #timeout(ms) when value is within `setTimeout` bounds given string timestamp
+ ✅ should set the timeout value
+Runnable(title, fn) interesting property id
+ ✅ should have a permanent identifier
+ ✅ should have a unique identifier
+Runnable(title, fn) static method toValueOrError
+ ✅ should return an Error if parameter is falsy
+ ✅ should return identity if parameter is truthy
+Runnable(title, fn) when arity == 0
+ ✅ should be .sync
+ ✅ should not be .async
+Runnable(title, fn) when arity >= 1
+ ✅ should be .async
+ ✅ should not be .sync
+```
+### ✅ test/unit/runner.spec.js
+```
+Runner instance method _uncaught() when called with a non-Runner context
+ ✅ should throw
+Runner instance method abort()
+ ✅ should return the Runner
+ ✅ should set _abort property to true
+Runner instance method allowUncaught()
+ ✅ async - should allow unhandled errors in hooks to propagate through
+ ✅ should allow unhandled errors in sync hooks to propagate through
+ ✅ should allow unhandled errors to propagate through
+ ✅ should not allow unhandled errors in sync hooks to propagate through
+Runner instance method checkGlobals(test)
+ ✅ should allow variables that match a wildcard
+ ✅ should emit "fail" when a global beginning with "d" is introduced
+ ✅ should emit "fail" when a new global is introduced
+ ✅ should emit "fail" when a single new disallowed global is introduced after a single extra global is allowed
+ ✅ should not fail when a new common global is introduced
+ ✅ should pluralize the error message when several are introduced
+ ✅ should respect per test whitelisted globals
+ ✅ should respect per test whitelisted globals but still detect other leaks
+Runner instance method dispose()
+ ✅ should remove "error" listeners from a test
+ ✅ should remove "uncaughtException" listeners from the process
+ ✅ should remove all listeners from itself
+Runner instance method fail()
+ ✅ should emit "fail"
+ ✅ should emit "fail"
+ ✅ should emit a helpful message when failed with a string
+ ✅ should emit a helpful message when failed with an Array
+ ✅ should emit a helpful message when failed with an Object
+ ✅ should emit a the error when failed with an Error instance
+ ✅ should emit the error when failed with an Error-like object
+ ✅ should increment .failures
+ ✅ should increment `Runner#failures`
+ ✅ should not emit "end" if suite bail is not true
+ ✅ should recover if the error stack is not writable
+ ✅ should return and not increment failures when test is pending
+ ✅ should set `Test#state` to "failed"
+Runner instance method fail() when Runner has stopped when test is not pending when error is not of the "multiple done" variety
+ ✅ should throw a "fatal" error
+Runner instance method fail() when Runner has stopped when test is not pending when error is the "multiple done" variety
+ ✅ should throw the "multiple done" error
+Runner instance method globalProps()
+ ✅ should include common non enumerable globals
+Runner instance method globals()
+ ✅ should default to the known globals
+ ✅ should white-list globals
+Runner instance method grep()
+ ✅ should update the runner.total with number of matched tests
+ ✅ should update the runner.total with number of matched tests when inverted
+Runner instance method grepTotal()
+ ✅ should return the total number of matched tests
+ ✅ should return the total number of matched tests when inverted
+Runner instance method hook()
+ ✅ should augment hook title with current test title
+ ✅ should execute hooks after failed test if suite bail is true
+Runner instance method isParallelMode()
+ ✅ should return false
+Runner instance method linkPartialObjects()
+ ✅ should return the Runner
+Runner instance method run()
+ ✅ should clean references after a run
+ ✅ should emit "retry" when a retryable test fails
+ ✅ should not clean references after a run when `cleanReferencesAfterRun` is `false`
+ ✅ should not leak `Process.uncaughtException` listeners
+ ✅ should not throw an exception if something emits EVENT_TEST_END with a non-Test object
+Runner instance method run() stack traces ginormous
+ ✅ should not hang if overlong error message is multiple lines
+ ✅ should not hang if overlong error message is single line
+Runner instance method run() stack traces long
+ ✅ should display the full stack-trace
+Runner instance method run() stack traces short
+ ✅ should prettify the stack-trace
+Runner instance method runAsync()
+ ✅ should pass through options to Runner#run
+ ✅ should return a Promise with a failure count
+Runner instance method runTest()
+ ✅ should return when no tests to run
+Runner instance method uncaught() when allow-uncaught is set to true
+ ✅ should propagate error and throw
+Runner instance method uncaught() when provided an object argument when argument is a Pending
+ ✅ should ignore argument and return
+Runner instance method uncaught() when provided an object argument when argument is an Error
+ ✅ should add the "uncaught" property to the Error
+Runner instance method uncaught() when provided an object argument when argument is an Error when a Runnable is running or has run
+ ✅ should clear any pending timeouts
+Runner instance method uncaught() when provided an object argument when argument is an Error when a Runnable is running or has run when current Runnable has already failed
+ ✅ should not attempt to fail again
+Runner instance method uncaught() when provided an object argument when argument is an Error when a Runnable is running or has run when current Runnable has been marked pending
+ ✅ should attempt to fail
+Runner instance method uncaught() when provided an object argument when argument is an Error when a Runnable is running or has run when the current Runnable has already passed
+ ✅ should abort the runner without emitting end event
+ ✅ should fail with the current Runnable and the error
+Runner instance method uncaught() when provided an object argument when argument is an Error when a Runnable is running or has run when the current Runnable is still running when the current Runnable is a Hook
+ ✅ should not notify run has ended
+ ✅ should not notify test has ended
+ ✅ should run callback(err) to handle failing hook pattern
+Runner instance method uncaught() when provided an object argument when argument is an Error when a Runnable is running or has run when the current Runnable is still running when the current Runnable is a Test
+ ✅ should not notify run has ended
+ ✅ should not notify test has ended
+ ✅ should run callback(err) to handle failing and hooks
+Runner instance method uncaught() when provided an object argument when argument is an Error when no Runnables are running
+ ✅ should fail with a transient Runnable and the error
+Runner instance method uncaught() when provided an object argument when argument is an Error when no Runnables are running when Runner is IDLE
+ ✅ should emit start/end events for the benefit of reporters
+Runner instance method uncaught() when provided an object argument when argument is an Error when no Runnables are running when Runner is RUNNING
+ ✅ should not emit start/end events
+Runner instance method uncaught() when provided an object argument when argument is an Error when no Runnables are running when Runner is STOPPED
+ ✅ should not emit start/end events, since this presumably would have already happened
+ ✅ should throw
+Runner instance method uncaught() when provided an object argument when argument is not an Error
+ ✅ should fail with a transient Runnable and a new Error coerced from the object
+Runner instance method workerReporter()
+ ✅ should throw
+```
+### ✅ test/unit/suite.spec.js
+```
+Suite instance method addSuite()
+ ✅ adds the suite to the suites collection
+ ✅ copies the slow value
+ ✅ copies the timeout value
+ ✅ sets the parent on the added Suite
+ ✅ treats suite as pending if its parent is pending
+Suite instance method addTest()
+ ✅ adds the test to the tests collection
+ ✅ copies the timeout value
+ ✅ sets the parent on the added test
+Suite instance method afterAll() wraps the passed in function in a Hook
+ ✅ adds it to _afterAll
+ ✅ appends title to hook
+ ✅ uses function name if available
+Suite instance method afterEach() wraps the passed in function in a Hook
+ ✅ adds it to _afterEach
+ ✅ appends title to hook
+ ✅ uses function name if available
+Suite instance method bail() when argument is passed
+ ✅ should return the Suite object
+Suite instance method bail() when no argument is passed
+ ✅ should return the bail value
+Suite instance method beforeAll() wraps the passed in function in a Hook
+ ✅ adds it to _beforeAll
+ ✅ appends title to hook
+ ✅ uses function name if available
+Suite instance method beforeEach() when the suite is pending
+ ✅ should not create a hook
+Suite instance method beforeEach() wraps the passed in function in a Hook
+ ✅ adds it to _beforeEach
+ ✅ appends title to hook
+ ✅ uses function name if available
+Suite instance method clone()
+ ✅ should clone the Suite, omitting children
+Suite instance method constructor
+ ✅ should not throw if the title is a string
+ ✅ should report listened-for deprecated events as deprecated
+ ✅ should throw an error if the title isn't a string
+Suite instance method create()
+ ✅ does not create a second root suite
+ ✅ does not denote the root suite by being titleless
+Suite instance method eachTest(fn) when there are no nested suites or tests
+ ✅ should return 0
+Suite instance method eachTest(fn) when there are several levels of nested suites
+ ✅ should return the number
+Suite instance method eachTest(fn) when there are several tests in the suite
+ ✅ should return the number
+Suite instance method filterOnly()
+ ✅ should filter out all other tests and suites if a suite has `only`
+ ✅ should filter out all other tests and suites if a test has `only`
+Suite instance method fullTitle() when there is a parent
+ ✅ returns the combination of parent's and suite's title
+Suite instance method fullTitle() when there is no parent
+ ✅ returns the suite title
+Suite instance method hasOnly()
+ ✅ should return false if no suite or test is marked `only`
+ ✅ should return true if a suite has `only`
+ ✅ should return true if a test has `only`
+ ✅ should return true if nested suite has `only`
+Suite instance method markOnly()
+ ✅ should call appendOnlySuite on parent
+Suite instance method reset()
+ ✅ should forward reset to all hooks
+ ✅ should forward reset to suites and tests
+ ✅ should reset the `delayed` state
+Suite instance method slow() when argument is passed
+ ✅ should return the Suite object
+Suite instance method slow() when given a string
+ ✅ should parse it
+Suite instance method slow() when no argument is passed
+ ✅ should return the slow value
+Suite instance method timeout()
+ ✅ should convert a string to milliseconds
+Suite instance method timeout() when argument is passed
+ ✅ should return the Suite object
+Suite instance method timeout() when no argument is passed
+ ✅ should return the timeout value
+Suite instance method titlePath() when there is a parent the parent is not the root suite
+ ✅ returns the concatenation of parent's and suite's title
+Suite instance method titlePath() when there is a parent the parent is the root suite
+ ✅ returns the suite title
+Suite instance method titlePath() when there is no parent
+ ✅ returns the suite title
+Suite instance method total() when there are no nested suites or tests
+ ✅ should return 0
+Suite instance method total() when there are several tests in the suite
+ ✅ should return the number
+Test initialization
+ ✅ should not throw if the title is a string
+ ✅ should throw an error if the title isn't a string
+```
+### ✅ test/unit/test.spec.js
+```
+Test .clone()
+ ✅ should add/keep the retriedTest value
+ ✅ should copy the currentRetry value
+ ✅ should copy the file value
+ ✅ should copy the globals value
+ ✅ should copy the parent value
+ ✅ should copy the retries value
+ ✅ should copy the slow value
+ ✅ should copy the timeout value
+ ✅ should copy the title
+Test .isPending()
+ ✅ should be pending when its parent is pending
+ ✅ should be pending when marked as such
+ ✅ should not be pending by default
+Test .markOnly()
+ ✅ should call appendOnlyTest on parent
+Test .reset()
+ ✅ should call Runnable.reset
+ ✅ should reset the run state
+```
+### ✅ test/unit/throw.spec.js
+```
+a test that throws non-extensible
+ ✅ should not pass if throwing async and test is async
+ ✅ should not pass if throwing sync and test is async
+ ✅ should not pass if throwing sync and test is sync
+a test that throws null
+ ✅ should not pass if throwing async and test is async
+ ✅ should not pass if throwing sync and test is async
+ ✅ should not pass if throwing sync and test is sync
+a test that throws undefined
+ ✅ should not pass if throwing async and test is async
+ ✅ should not pass if throwing sync and test is async
+ ✅ should not pass if throwing sync and test is sync
+```
+### ✅ test/unit/timeout.spec.js
+```
+timeouts
+ ✅ should allow overriding per-test
+ ✅ should error on timeout
+timeouts disabling
+ ✅ should work with timeout(0)
+timeouts disabling suite-level
+ ✅ should work with timeout(0)
+timeouts disabling suite-level nested suite
+ ✅ should work with timeout(0)
+timeouts disabling using before
+ ✅ should work with timeout(0)
+timeouts disabling using beforeEach
+ ✅ should work with timeout(0)
+timeouts disabling using timeout(0)
+ ✅ should suppress timeout(4)
+```
+### ✅ test/unit/utils.spec.js
+```
+lib/utils canonicalType()
+ ✅ should recognize various types
+lib/utils canonicalType() when toString on null or undefined stringifies window
+ ✅ should recognize null and undefined
+lib/utils castArray() when provided a primitive value
+ ✅ should return an array containing the primitive value only
+lib/utils castArray() when provided an "arguments" value
+ ✅ should return an array containing the arguments
+lib/utils castArray() when provided an array value
+ ✅ should return a copy of the array
+lib/utils castArray() when provided an object
+ ✅ should return an array containing the object only
+lib/utils castArray() when provided no parameters
+ ✅ should return an empty array
+lib/utils castArray() when provided null
+ ✅ should return an array containing a null value only
+lib/utils clean()
+ ✅ should format a multi line test indented with spaces
+ ✅ should format a multi line test indented with tabs
+ ✅ should format a single line test function
+ ✅ should format es6 arrow functions
+ ✅ should format es6 arrow functions with implicit return
+ ✅ should format functions saved in windows style - spaces
+ ✅ should format functions saved in windows style - tabs
+ ✅ should handle empty functions
+ ✅ should handle functions with no space between the end and the closing brace
+ ✅ should handle functions with parentheses in the same line
+ ✅ should handle functions with tabs in their declarations
+ ✅ should handle named functions with space after name
+ ✅ should handle named functions without space after name
+ ✅ should handle newlines in the function declaration
+ ✅ should remove space character indentation from the function body
+ ✅ should remove tab character indentation from the function body
+ ✅ should remove the wrapping function declaration
+lib/utils createMap()
+ ✅ should add props from all object parameters to the object
+ ✅ should add props to the object
+ ✅ should return an object with a null prototype
+lib/utils dQuote()
+ ✅ should return its input as string wrapped in double quotes
+lib/utils escape()
+ ✅ replaces invalid xml characters
+ ✅ replaces the usual xml suspects
+lib/utils isPromise()
+ ✅ should return false if the object is null
+ ✅ should return false if the value is an object w/o a "then" function
+ ✅ should return false if the value is not an object
+ ✅ should return true if the value is Promise-ish
+lib/utils lookupFiles() when run in browser
+ ✅ should throw
+lib/utils lookupFiles() when run in Node.js
+ ✅ should delegate to new location of lookupFiles()
+ ✅ should print a deprecation message
+lib/utils slug()
+ ✅ should convert the string to lowercase
+ ✅ should convert whitespace to dashes
+ ✅ should disallow consecutive dashes
+ ✅ should strip non-alphanumeric and non-dash characters
+lib/utils sQuote()
+ ✅ should return its input as string wrapped in single quotes
+lib/utils stringify()
+ ✅ might get confusing
+ ✅ should canonicalize the object
+ ✅ should handle arrays
+ ✅ should handle circular structures in arrays
+ ✅ should handle circular structures in functions
+ ✅ should handle circular structures in objects
+ ✅ should handle empty arrays
+ ✅ should handle empty functions (with no properties)
+ ✅ should handle empty objects
+ ✅ should handle functions
+ ✅ should handle functions w/ properties
+ ✅ should handle length properties that cannot be coerced to a number
+ ✅ should handle non-empty arrays
+ ✅ should handle object without an Object prototype
+ ✅ should handle Symbol
+ ✅ should handle undefined values
+ ✅ should handle various non-undefined, non-null, non-object, non-array, non-date, and non-function values
+ ✅ should not freak out if it sees a primitive twice
+ ✅ should recurse
+ ✅ should return an object representation of a string created with a String constructor
+ ✅ should return Buffer with .toJSON representation
+ ✅ should return Date object with .toISOString() + string prefix
+ ✅ should return invalid Date object with .toString() + string prefix
+ ✅ should stringify dates
+lib/utils stringify() #Number
+ ✅ floats and ints
+ ✅ should show the handle -0 situations
+ ✅ should work well with `NaN` and `Infinity`
+ ✅ should work with bigints when possible
+lib/utils stringify() canonicalize example
+ ✅ should represent the actual full result
+lib/utils type()
+ ✅ should recognize various types
+lib/utils type() when toString on null or undefined stringifies window
+ ✅ should recognize null and undefined
+lib/utils uniqueID()
+ ✅ should return a non-empty string
+```
+
\ No newline at end of file
diff --git a/__tests__/__outputs__/provider-test-results.md b/__tests__/__outputs__/provider-test-results.md
index 2cfa0ba..172f070 100644
--- a/__tests__/__outputs__/provider-test-results.md
+++ b/__tests__/__outputs__/provider-test-results.md
@@ -1,25 +1,28 @@

-## ❌ fixtures/external/flutter/provider-test-results.json
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/external/flutter/provider-test-results.json](#user-content-r0)|268 ✅|1 ❌||0ms|
+## ❌ fixtures/external/flutter/provider-test-results.json
**269** tests were completed in **0ms** with **268** passed, **1** failed and **0** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[test/builder_test.dart](#r0s0)|24✅|||402ms|
-|[test/change_notifier_provider_test.dart](#r0s1)|10✅|||306ms|
-|[test/consumer_test.dart](#r0s2)|18✅|||340ms|
-|[test/context_test.dart](#r0s3)|31✅|||698ms|
-|[test/future_provider_test.dart](#r0s4)|10✅|||305ms|
-|[test/inherited_provider_test.dart](#r0s5)|81✅|||1s|
-|[test/listenable_provider_test.dart](#r0s6)|16✅|||353ms|
-|[test/listenable_proxy_provider_test.dart](#r0s7)|12✅|||373ms|
-|[test/multi_provider_test.dart](#r0s8)|3✅|||198ms|
-|[test/provider_test.dart](#r0s9)|11✅|||306ms|
-|[test/proxy_provider_test.dart](#r0s10)|16✅|||438ms|
-|[test/reassemble_test.dart](#r0s11)|3✅|||221ms|
-|[test/selector_test.dart](#r0s12)|17✅|||364ms|
-|[test/stateful_provider_test.dart](#r0s13)|4✅|||254ms|
-|[test/stream_provider_test.dart](#r0s14)|8✅|||282ms|
-|[test/value_listenable_provider_test.dart](#r0s15)|4✅|1❌||327ms|
-### ✅ test/builder_test.dart
+|[test/builder_test.dart](#user-content-r0s0)|24 ✅|||402ms|
+|[test/change_notifier_provider_test.dart](#user-content-r0s1)|10 ✅|||306ms|
+|[test/consumer_test.dart](#user-content-r0s2)|18 ✅|||340ms|
+|[test/context_test.dart](#user-content-r0s3)|31 ✅|||698ms|
+|[test/future_provider_test.dart](#user-content-r0s4)|10 ✅|||305ms|
+|[test/inherited_provider_test.dart](#user-content-r0s5)|81 ✅|||1s|
+|[test/listenable_provider_test.dart](#user-content-r0s6)|16 ✅|||353ms|
+|[test/listenable_proxy_provider_test.dart](#user-content-r0s7)|12 ✅|||373ms|
+|[test/multi_provider_test.dart](#user-content-r0s8)|3 ✅|||198ms|
+|[test/provider_test.dart](#user-content-r0s9)|11 ✅|||306ms|
+|[test/proxy_provider_test.dart](#user-content-r0s10)|16 ✅|||438ms|
+|[test/reassemble_test.dart](#user-content-r0s11)|3 ✅|||221ms|
+|[test/selector_test.dart](#user-content-r0s12)|17 ✅|||364ms|
+|[test/stateful_provider_test.dart](#user-content-r0s13)|4 ✅|||254ms|
+|[test/stream_provider_test.dart](#user-content-r0s14)|8 ✅|||282ms|
+|[test/value_listenable_provider_test.dart](#user-content-r0s15)|4 ✅|1 ❌||327ms|
+### ✅ test/builder_test.dart
```
ChangeNotifierProvider
✅ default
@@ -51,7 +54,7 @@ MultiProvider
✅ with ProxyProvider5
✅ with ProxyProvider6
```
-### ✅ test/change_notifier_provider_test.dart
+### ✅ test/change_notifier_provider_test.dart
```
✅ Use builder property, not child
ChangeNotifierProvider
@@ -65,7 +68,7 @@ ChangeNotifierProvider
✅ builder6
✅ builder0
```
-### ✅ test/consumer_test.dart
+### ✅ test/consumer_test.dart
```
consumer
✅ obtains value from Provider
@@ -92,7 +95,7 @@ consumer6
✅ crashed with no builder
✅ can be used inside MultiProvider
```
-### ✅ test/context_test.dart
+### ✅ test/context_test.dart
```
✅ watch in layoutbuilder
✅ select in layoutbuilder
@@ -127,7 +130,7 @@ BuildContext
✅ context.select deeply compares sets
✅ context.watch listens to value changes
```
-### ✅ test/future_provider_test.dart
+### ✅ test/future_provider_test.dart
```
✅ works with MultiProvider
✅ (catchError) previous future completes after transition is no-op
@@ -141,7 +144,7 @@ BuildContext
FutureProvider()
✅ crashes if builder is null
```
-### ✅ test/inherited_provider_test.dart
+### ✅ test/inherited_provider_test.dart
```
✅ regression test #377
✅ rebuild on dependency flags update
@@ -230,7 +233,7 @@ DeferredInheritedProvider()
✅ dispose
✅ dispose no-op if never built
```
-### ✅ test/listenable_provider_test.dart
+### ✅ test/listenable_provider_test.dart
```
ListenableProvider
✅ works with MultiProvider
@@ -252,7 +255,7 @@ ListenableProvider stateful constructor
✅ pass down key
✅ throws if create is null
```
-### ✅ test/listenable_proxy_provider_test.dart
+### ✅ test/listenable_proxy_provider_test.dart
```
ListenableProxyProvider
✅ throws if update is missing
@@ -269,14 +272,14 @@ ListenableProxyProvider variants
✅ ListenableProxyProvider5
✅ ListenableProxyProvider6
```
-### ✅ test/multi_provider_test.dart
+### ✅ test/multi_provider_test.dart
```
MultiProvider
✅ throw if providers is null
✅ MultiProvider children can only access parent providers
✅ MultiProvider.providers with ignored child
```
-### ✅ test/provider_test.dart
+### ✅ test/provider_test.dart
```
✅ works with MultiProvider
Provider.of
@@ -292,7 +295,7 @@ Provider
✅ throws an error if no provider found
✅ update should notify
```
-### ✅ test/proxy_provider_test.dart
+### ✅ test/proxy_provider_test.dart
```
ProxyProvider
✅ throws if the provided value is a Listenable/Stream
@@ -313,13 +316,13 @@ ProxyProvider variants
✅ ProxyProvider5
✅ ProxyProvider6
```
-### ✅ test/reassemble_test.dart
+### ✅ test/reassemble_test.dart
```
✅ ReassembleHandler
✅ unevaluated create
✅ unevaluated create
```
-### ✅ test/selector_test.dart
+### ✅ test/selector_test.dart
```
✅ asserts that builder/selector are not null
✅ Deep compare maps by default
@@ -339,14 +342,14 @@ ProxyProvider variants
✅ Selector5
✅ Selector6
```
-### ✅ test/stateful_provider_test.dart
+### ✅ test/stateful_provider_test.dart
```
✅ asserts
✅ works with MultiProvider
✅ calls create only once
✅ dispose
```
-### ✅ test/stream_provider_test.dart
+### ✅ test/stream_provider_test.dart
```
✅ works with MultiProvider
✅ transition from stream to stream preserve state
@@ -358,7 +361,7 @@ StreamProvider()
✅ create and dispose stream with builder
✅ crashes if builder is null
```
-### ❌ test/value_listenable_provider_test.dart
+### ❌ test/value_listenable_provider_test.dart
```
valueListenableProvider
✅ rebuilds when value change
diff --git a/__tests__/__outputs__/pulsar-test-results-no-merge.md b/__tests__/__outputs__/pulsar-test-results-no-merge.md
index cc873e0..de5a9b6 100644
--- a/__tests__/__outputs__/pulsar-test-results-no-merge.md
+++ b/__tests__/__outputs__/pulsar-test-results-no-merge.md
@@ -1,10 +1,13 @@

-## ❌ fixtures/external/java/TEST-org.apache.pulsar.AddMissingPatchVersionTest.xml
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/external/java/TEST-org.apache.pulsar.AddMissingPatchVersionTest.xml](#user-content-r0)||1 ❌|1 ⚪|116ms|
+## ❌ fixtures/external/java/TEST-org.apache.pulsar.AddMissingPatchVersionTest.xml
**2** tests were completed in **116ms** with **0** passed, **1** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[org.apache.pulsar.AddMissingPatchVersionTest](#r0s0)||1❌|1⚪|116ms|
-### ❌ org.apache.pulsar.AddMissingPatchVersionTest
+|[org.apache.pulsar.AddMissingPatchVersionTest](#user-content-r0s0)||1 ❌|1 ⚪|116ms|
+### ❌ org.apache.pulsar.AddMissingPatchVersionTest
```
⚪ testVersionStrings
❌ testVersionStrings
diff --git a/__tests__/__outputs__/pulsar-test-results.md b/__tests__/__outputs__/pulsar-test-results.md
index 058f71b..aaaa82e 100644
--- a/__tests__/__outputs__/pulsar-test-results.md
+++ b/__tests__/__outputs__/pulsar-test-results.md
@@ -1,191 +1,194 @@

-## ❌ fixtures/external/java/pulsar-test-report.xml
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/external/java/pulsar-test-report.xml](#user-content-r0)|793 ✅|1 ❌|14 ⚪|2127s|
+## ❌ fixtures/external/java/pulsar-test-report.xml
**808** tests were completed in **2127s** with **793** passed, **1** failed and **14** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[org.apache.pulsar.AddMissingPatchVersionTest](#r0s0)||1❌|1⚪|116ms|
-|[org.apache.pulsar.broker.admin.AdminApiOffloadTest](#r0s1)|7✅|||19s|
-|[org.apache.pulsar.broker.auth.AuthenticationServiceTest](#r0s2)|2✅|||185ms|
-|[org.apache.pulsar.broker.auth.AuthLogsTest](#r0s3)|2✅|||1s|
-|[org.apache.pulsar.broker.auth.AuthorizationTest](#r0s4)|1✅|||2s|
-|[org.apache.pulsar.broker.lookup.http.HttpTopicLookupv2Test](#r0s5)|4✅|||2s|
-|[org.apache.pulsar.broker.namespace.NamespaceCreateBundlesTest](#r0s6)|2✅|||33s|
-|[org.apache.pulsar.broker.namespace.NamespaceOwnershipListenerTests](#r0s7)|2✅|||32s|
-|[org.apache.pulsar.broker.namespace.NamespaceServiceTest](#r0s8)|10✅|||75s|
-|[org.apache.pulsar.broker.namespace.NamespaceUnloadingTest](#r0s9)|2✅|||14s|
-|[org.apache.pulsar.broker.namespace.OwnerShipCacheForCurrentServerTest](#r0s10)|1✅|||16s|
-|[org.apache.pulsar.broker.namespace.OwnershipCacheTest](#r0s11)|8✅|||16s|
-|[org.apache.pulsar.broker.protocol.ProtocolHandlersTest](#r0s12)|6✅|||946ms|
-|[org.apache.pulsar.broker.protocol.ProtocolHandlerUtilsTest](#r0s13)|3✅|||7s|
-|[org.apache.pulsar.broker.protocol.ProtocolHandlerWithClassLoaderTest](#r0s14)|1✅|||15ms|
-|[org.apache.pulsar.broker.PulsarServiceTest](#r0s15)|2✅|||96ms|
-|[org.apache.pulsar.broker.service.MessagePublishBufferThrottleTest](#r0s16)|3✅|||14s|
-|[org.apache.pulsar.broker.service.ReplicatorTest](#r0s17)|22✅|||40s|
-|[org.apache.pulsar.broker.service.TopicOwnerTest](#r0s18)|8✅|||114s|
-|[org.apache.pulsar.broker.SLAMonitoringTest](#r0s19)|4✅|||9s|
-|[org.apache.pulsar.broker.stats.BookieClientsStatsGeneratorTest](#r0s20)|2✅|||49ms|
-|[org.apache.pulsar.broker.stats.ConsumerStatsTest](#r0s21)|3✅|||21s|
-|[org.apache.pulsar.broker.stats.ManagedCursorMetricsTest](#r0s22)|1✅|||281ms|
-|[org.apache.pulsar.broker.stats.ManagedLedgerMetricsTest](#r0s23)|1✅|||285ms|
-|[org.apache.pulsar.broker.stats.prometheus.AggregatedNamespaceStatsTest](#r0s24)|1✅|||40ms|
-|[org.apache.pulsar.broker.stats.PrometheusMetricsTest](#r0s25)|15✅|||83s|
-|[org.apache.pulsar.broker.stats.SubscriptionStatsTest](#r0s26)|2✅|||2s|
-|[org.apache.pulsar.broker.systopic.NamespaceEventsSystemTopicServiceTest](#r0s27)|1✅|||1s|
-|[org.apache.pulsar.broker.transaction.buffer.InMemTransactionBufferReaderTest](#r0s28)|3✅|||28ms|
-|[org.apache.pulsar.broker.transaction.buffer.TransactionBufferClientTest](#r0s29)|4✅|||93ms|
-|[org.apache.pulsar.broker.transaction.buffer.TransactionBufferTest](#r0s30)|7✅|||81ms|
-|[org.apache.pulsar.broker.transaction.buffer.TransactionEntryImplTest](#r0s31)|1✅|||14ms|
-|[org.apache.pulsar.broker.transaction.buffer.TransactionLowWaterMarkTest](#r0s32)|2✅|||38s|
-|[org.apache.pulsar.broker.transaction.buffer.TransactionStablePositionTest](#r0s33)|2✅||1⚪|49s|
-|[org.apache.pulsar.broker.transaction.coordinator.TransactionCoordinatorClientTest](#r0s34)|3✅|||95ms|
-|[org.apache.pulsar.broker.transaction.coordinator.TransactionMetaStoreAssignmentTest](#r0s35)|1✅|||1s|
-|[org.apache.pulsar.broker.transaction.pendingack.PendingAckInMemoryDeleteTest](#r0s36)|2✅||1⚪|57s|
-|[org.apache.pulsar.broker.transaction.TransactionConsumeTest](#r0s37)|2✅|||30s|
-|[org.apache.pulsar.broker.web.RestExceptionTest](#r0s38)|3✅|||37ms|
-|[org.apache.pulsar.broker.web.WebServiceTest](#r0s39)|9✅|||27s|
-|[org.apache.pulsar.client.impl.AdminApiKeyStoreTlsAuthTest](#r0s40)|4✅|||8s|
-|[org.apache.pulsar.client.impl.BatchMessageIdImplSerializationTest](#r0s41)|4✅|||30ms|
-|[org.apache.pulsar.client.impl.BatchMessageIndexAckDisableTest](#r0s42)|4✅|||14s|
-|[org.apache.pulsar.client.impl.BatchMessageIndexAckTest](#r0s43)|5✅|||44s|
-|[org.apache.pulsar.client.impl.BrokerClientIntegrationTest](#r0s44)|15✅|||148s|
-|[org.apache.pulsar.client.impl.CompactedOutBatchMessageTest](#r0s45)|1✅|||1s|
-|[org.apache.pulsar.client.impl.ConsumerAckResponseTest](#r0s46)|1✅|||549ms|
-|[org.apache.pulsar.client.impl.ConsumerConfigurationTest](#r0s47)|4✅|||12s|
-|[org.apache.pulsar.client.impl.ConsumerDedupPermitsUpdate](#r0s48)|7✅|||4s|
-|[org.apache.pulsar.client.impl.ConsumerUnsubscribeTest](#r0s49)|1✅|||129ms|
-|[org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithAuth](#r0s50)|3✅|||23s|
-|[org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithoutAuth](#r0s51)|3✅|||8s|
-|[org.apache.pulsar.client.impl.KeyStoreTlsTest](#r0s52)|1✅|||183ms|
-|[org.apache.pulsar.client.impl.MessageChecksumTest](#r0s53)|3✅|||47s|
-|[org.apache.pulsar.client.impl.MessageChunkingTest](#r0s54)|8✅||1⚪|73s|
-|[org.apache.pulsar.client.impl.MessageParserTest](#r0s55)|2✅|||5s|
-|[org.apache.pulsar.client.impl.MultiTopicsReaderTest](#r0s56)|8✅|||35s|
-|[org.apache.pulsar.client.impl.NegativeAcksTest](#r0s57)|32✅|||11s|
-|[org.apache.pulsar.client.impl.PatternTopicsConsumerImplTest](#r0s58)|11✅|||63s|
-|[org.apache.pulsar.client.impl.PerMessageUnAcknowledgedRedeliveryTest](#r0s59)|5✅|||34s|
-|[org.apache.pulsar.client.impl.PulsarMultiHostClientTest](#r0s60)|3✅|||15s|
-|[org.apache.pulsar.client.impl.RawMessageSerDeserTest](#r0s61)|1✅|||10ms|
-|[org.apache.pulsar.client.impl.SchemaDeleteTest](#r0s62)|1✅|||2s|
-|[org.apache.pulsar.client.impl.SequenceIdWithErrorTest](#r0s63)|3✅||2⚪|18s|
-|[org.apache.pulsar.client.impl.TopicDoesNotExistsTest](#r0s64)|2✅|||4s|
-|[org.apache.pulsar.client.impl.TopicFromMessageTest](#r0s65)|5✅|||14s|
-|[org.apache.pulsar.client.impl.TopicsConsumerImplTest](#r0s66)|17✅|||133s|
-|[org.apache.pulsar.client.impl.UnAcknowledgedMessagesTimeoutTest](#r0s67)|7✅|||44s|
-|[org.apache.pulsar.client.impl.ZeroQueueSizeTest](#r0s68)|14✅|||16s|
-|[org.apache.pulsar.common.api.raw.RawMessageImplTest](#r0s69)|1✅|||316ms|
-|[org.apache.pulsar.common.compression.CommandsTest](#r0s70)|1✅|||30ms|
-|[org.apache.pulsar.common.compression.CompressorCodecBackwardCompatTest](#r0s71)|6✅|||223ms|
-|[org.apache.pulsar.common.compression.CompressorCodecTest](#r0s72)|45✅|||737ms|
-|[org.apache.pulsar.common.compression.Crc32cChecksumTest](#r0s73)|6✅|||5s|
-|[org.apache.pulsar.common.lookup.data.LookupDataTest](#r0s74)|4✅|||2s|
-|[org.apache.pulsar.common.naming.MetadataTests](#r0s75)|2✅|||161ms|
-|[org.apache.pulsar.common.naming.NamespaceBundlesTest](#r0s76)|5✅|||99ms|
-|[org.apache.pulsar.common.naming.NamespaceBundleTest](#r0s77)|6✅|||64ms|
-|[org.apache.pulsar.common.naming.NamespaceNameTest](#r0s78)|2✅|||207ms|
-|[org.apache.pulsar.common.naming.ServiceConfigurationTest](#r0s79)|4✅|||48ms|
-|[org.apache.pulsar.common.naming.TopicNameTest](#r0s80)|4✅|||529ms|
-|[org.apache.pulsar.common.net.ServiceURITest](#r0s81)|21✅|||237ms|
-|[org.apache.pulsar.common.policies.data.AutoFailoverPolicyDataTest](#r0s82)|1✅|||15ms|
-|[org.apache.pulsar.common.policies.data.AutoFailoverPolicyTypeTest](#r0s83)|1✅|||19ms|
-|[org.apache.pulsar.common.policies.data.AutoTopicCreationOverrideTest](#r0s84)|6✅|||64ms|
-|[org.apache.pulsar.common.policies.data.BacklogQuotaTest](#r0s85)|1✅|||12ms|
-|[org.apache.pulsar.common.policies.data.ClusterDataTest](#r0s86)|1✅|||9ms|
-|[org.apache.pulsar.common.policies.data.ConsumerStatsTest](#r0s87)|1✅|||8ms|
-|[org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfigTest](#r0s88)|2✅|||948ms|
-|[org.apache.pulsar.common.policies.data.LocalPolicesTest](#r0s89)|1✅|||48ms|
-|[org.apache.pulsar.common.policies.data.NamespaceIsolationDataTest](#r0s90)|1✅|||76ms|
-|[org.apache.pulsar.common.policies.data.NamespaceOwnershipStatusTest](#r0s91)|1✅|||45ms|
-|[org.apache.pulsar.common.policies.data.OffloadPoliciesTest](#r0s92)|6✅|||216ms|
-|[org.apache.pulsar.common.policies.data.PartitionedTopicStatsTest](#r0s93)|1✅|||12ms|
-|[org.apache.pulsar.common.policies.data.PersistencePoliciesTest](#r0s94)|1✅|||19ms|
-|[org.apache.pulsar.common.policies.data.PersistentOfflineTopicStatsTest](#r0s95)|1✅|||29ms|
-|[org.apache.pulsar.common.policies.data.PersistentTopicStatsTest](#r0s96)|2✅|||51ms|
-|[org.apache.pulsar.common.policies.data.PoliciesDataTest](#r0s97)|4✅|||1s|
-|[org.apache.pulsar.common.policies.data.PublisherStatsTest](#r0s98)|2✅|||37ms|
-|[org.apache.pulsar.common.policies.data.ReplicatorStatsTest](#r0s99)|2✅|||30ms|
-|[org.apache.pulsar.common.policies.data.ResourceQuotaTest](#r0s100)|2✅|||45ms|
-|[org.apache.pulsar.common.policies.data.RetentionPolicesTest](#r0s101)|1✅|||8ms|
-|[org.apache.pulsar.common.policies.impl.AutoFailoverPolicyFactoryTest](#r0s102)|1✅|||22ms|
-|[org.apache.pulsar.common.policies.impl.MinAvailablePolicyTest](#r0s103)|1✅|||1ms|
-|[org.apache.pulsar.common.policies.impl.NamespaceIsolationPoliciesTest](#r0s104)|7✅|||265ms|
-|[org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicyImplTest](#r0s105)|7✅|||309ms|
-|[org.apache.pulsar.common.protocol.ByteBufPairTest](#r0s106)|2✅|||5s|
-|[org.apache.pulsar.common.protocol.CommandUtilsTests](#r0s107)|7✅|||3s|
-|[org.apache.pulsar.common.protocol.MarkersTest](#r0s108)|6✅|||3s|
-|[org.apache.pulsar.common.protocol.PulsarDecoderTest](#r0s109)|1✅|||4s|
-|[org.apache.pulsar.common.stats.JvmDefaultGCMetricsLoggerTest](#r0s110)|1✅|||82ms|
-|[org.apache.pulsar.common.util.collections.BitSetRecyclableRecyclableTest](#r0s111)|2✅|||13ms|
-|[org.apache.pulsar.common.util.collections.ConcurrentBitSetRecyclableTest](#r0s112)|2✅|||63ms|
-|[org.apache.pulsar.common.util.collections.ConcurrentLongHashMapTest](#r0s113)|13✅|||28s|
-|[org.apache.pulsar.common.util.collections.ConcurrentLongPairSetTest](#r0s114)|15✅|||2s|
-|[org.apache.pulsar.common.util.collections.ConcurrentOpenHashMapTest](#r0s115)|12✅|||9s|
-|[org.apache.pulsar.common.util.collections.ConcurrentOpenHashSetTest](#r0s116)|11✅|||7s|
-|[org.apache.pulsar.common.util.collections.ConcurrentOpenLongPairRangeSetTest](#r0s117)|13✅|||1s|
-|[org.apache.pulsar.common.util.collections.ConcurrentSortedLongPairSetTest](#r0s118)|9✅|||342ms|
-|[org.apache.pulsar.common.util.collections.FieldParserTest](#r0s119)|2✅|||64ms|
-|[org.apache.pulsar.common.util.collections.GrowableArrayBlockingQueueTest](#r0s120)|6✅|||350ms|
-|[org.apache.pulsar.common.util.collections.GrowablePriorityLongPairQueueTest](#r0s121)|15✅|||3s|
-|[org.apache.pulsar.common.util.collections.TripleLongPriorityQueueTest](#r0s122)|3✅|||238ms|
-|[org.apache.pulsar.common.util.FieldParserTest](#r0s123)|1✅|||242ms|
-|[org.apache.pulsar.common.util.FileModifiedTimeUpdaterTest](#r0s124)|6✅|||6s|
-|[org.apache.pulsar.common.util.netty.ChannelFuturesTest](#r0s125)|5✅|||2s|
-|[org.apache.pulsar.common.util.RateLimiterTest](#r0s126)|11✅|||7s|
-|[org.apache.pulsar.common.util.ReflectionsTest](#r0s127)|12✅|||172ms|
-|[org.apache.pulsar.common.util.RelativeTimeUtilTest](#r0s128)|1✅|||39ms|
-|[org.apache.pulsar.discovery.service.web.DiscoveryServiceWebTest](#r0s129)|1✅|||5s|
-|[org.apache.pulsar.functions.worker.PulsarFunctionE2ESecurityTest](#r0s130)|2✅|||28s|
-|[org.apache.pulsar.functions.worker.PulsarFunctionPublishTest](#r0s131)|3✅|||42s|
-|[org.apache.pulsar.functions.worker.PulsarFunctionTlsTest](#r0s132)|1✅|||12s|
-|[org.apache.pulsar.io.PulsarFunctionTlsTest](#r0s133)|1✅|||30s|
-|[org.apache.pulsar.proxy.server.AdminProxyHandlerTest](#r0s134)|1✅|||474ms|
-|[org.apache.pulsar.proxy.server.AuthedAdminProxyHandlerTest](#r0s135)|1✅|||2s|
-|[org.apache.pulsar.proxy.server.FunctionWorkerRoutingTest](#r0s136)|1✅|||10ms|
-|[org.apache.pulsar.proxy.server.ProxyAdditionalServletTest](#r0s137)|1✅|||125ms|
-|[org.apache.pulsar.proxy.server.ProxyAuthenticatedProducerConsumerTest](#r0s138)|1✅|||2s|
-|[org.apache.pulsar.proxy.server.ProxyAuthenticationTest](#r0s139)|1✅|||17s|
-|[org.apache.pulsar.proxy.server.ProxyConnectionThrottlingTest](#r0s140)|1✅|||2s|
-|[org.apache.pulsar.proxy.server.ProxyEnableHAProxyProtocolTest](#r0s141)|1✅|||511ms|
-|[org.apache.pulsar.proxy.server.ProxyForwardAuthDataTest](#r0s142)|1✅|||32s|
-|[org.apache.pulsar.proxy.server.ProxyIsAHttpProxyTest](#r0s143)|10✅|||2s|
-|[org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithAuth](#r0s144)|3✅|||7s|
-|[org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithoutAuth](#r0s145)|3✅|||7s|
-|[org.apache.pulsar.proxy.server.ProxyLookupThrottlingTest](#r0s146)|1✅|||3s|
-|[org.apache.pulsar.proxy.server.ProxyParserTest](#r0s147)|5✅|||1s|
-|[org.apache.pulsar.proxy.server.ProxyRolesEnforcementTest](#r0s148)|1✅|||10s|
-|[org.apache.pulsar.proxy.server.ProxyStatsTest](#r0s149)|3✅|||533ms|
-|[org.apache.pulsar.proxy.server.ProxyTest](#r0s150)|6✅|||3s|
-|[org.apache.pulsar.proxy.server.ProxyTlsTest](#r0s151)|2✅|||414ms|
-|[org.apache.pulsar.proxy.server.ProxyTlsTestWithAuth](#r0s152)|1✅|||4ms|
-|[org.apache.pulsar.proxy.server.ProxyWithAuthorizationNegTest](#r0s153)|1✅|||2s|
-|[org.apache.pulsar.proxy.server.ProxyWithAuthorizationTest](#r0s154)|13✅|||33s|
-|[org.apache.pulsar.proxy.server.ProxyWithoutServiceDiscoveryTest](#r0s155)|1✅|||2s|
-|[org.apache.pulsar.proxy.server.SuperUserAuthedAdminProxyHandlerTest](#r0s156)|3✅|||8s|
-|[org.apache.pulsar.proxy.server.UnauthedAdminProxyHandlerTest](#r0s157)|2✅|||114ms|
-|[org.apache.pulsar.PulsarBrokerStarterTest](#r0s158)|9✅|||591ms|
-|[org.apache.pulsar.schema.compatibility.SchemaCompatibilityCheckTest](#r0s159)|23✅|||107s|
-|[org.apache.pulsar.schema.PartitionedTopicSchemaTest](#r0s160)|1✅|||29s|
-|[org.apache.pulsar.schema.SchemaTest](#r0s161)|3✅|||31s|
-|[org.apache.pulsar.stats.client.PulsarBrokerStatsClientTest](#r0s162)|2✅|||41s|
-|[org.apache.pulsar.tests.EnumValuesDataProviderTest](#r0s163)|6✅|||23ms|
-|[org.apache.pulsar.tests.TestRetrySupportBeforeMethodRetryTest](#r0s164)|1✅||4⚪|36ms|
-|[org.apache.pulsar.tests.TestRetrySupportRetryTest](#r0s165)|1✅||4⚪|27ms|
-|[org.apache.pulsar.tests.TestRetrySupportSuccessTest](#r0s166)|3✅|||1ms|
-|[org.apache.pulsar.tests.ThreadDumpUtilTest](#r0s167)|2✅|||17ms|
-|[org.apache.pulsar.utils.SimpleTextOutputStreamTest](#r0s168)|4✅|||50ms|
-|[org.apache.pulsar.utils.StatsOutputStreamTest](#r0s169)|6✅|||59ms|
-|[org.apache.pulsar.websocket.proxy.ProxyAuthenticationTest](#r0s170)|4✅|||29s|
-|[org.apache.pulsar.websocket.proxy.ProxyAuthorizationTest](#r0s171)|1✅|||1s|
-|[org.apache.pulsar.websocket.proxy.ProxyConfigurationTest](#r0s172)|2✅|||9s|
-|[org.apache.pulsar.websocket.proxy.ProxyPublishConsumeTlsTest](#r0s173)|1✅|||11s|
-|[org.apache.pulsar.websocket.proxy.ProxyPublishConsumeWithoutZKTest](#r0s174)|1✅|||7s|
-|[org.apache.pulsar.websocket.proxy.v1.V1_ProxyAuthenticationTest](#r0s175)|4✅|||30s|
-### ❌ org.apache.pulsar.AddMissingPatchVersionTest
+|[org.apache.pulsar.AddMissingPatchVersionTest](#user-content-r0s0)||1 ❌|1 ⚪|116ms|
+|[org.apache.pulsar.broker.admin.AdminApiOffloadTest](#user-content-r0s1)|7 ✅|||19s|
+|[org.apache.pulsar.broker.auth.AuthenticationServiceTest](#user-content-r0s2)|2 ✅|||185ms|
+|[org.apache.pulsar.broker.auth.AuthLogsTest](#user-content-r0s3)|2 ✅|||1s|
+|[org.apache.pulsar.broker.auth.AuthorizationTest](#user-content-r0s4)|1 ✅|||2s|
+|[org.apache.pulsar.broker.lookup.http.HttpTopicLookupv2Test](#user-content-r0s5)|4 ✅|||2s|
+|[org.apache.pulsar.broker.namespace.NamespaceCreateBundlesTest](#user-content-r0s6)|2 ✅|||33s|
+|[org.apache.pulsar.broker.namespace.NamespaceOwnershipListenerTests](#user-content-r0s7)|2 ✅|||32s|
+|[org.apache.pulsar.broker.namespace.NamespaceServiceTest](#user-content-r0s8)|10 ✅|||75s|
+|[org.apache.pulsar.broker.namespace.NamespaceUnloadingTest](#user-content-r0s9)|2 ✅|||14s|
+|[org.apache.pulsar.broker.namespace.OwnerShipCacheForCurrentServerTest](#user-content-r0s10)|1 ✅|||16s|
+|[org.apache.pulsar.broker.namespace.OwnershipCacheTest](#user-content-r0s11)|8 ✅|||16s|
+|[org.apache.pulsar.broker.protocol.ProtocolHandlersTest](#user-content-r0s12)|6 ✅|||946ms|
+|[org.apache.pulsar.broker.protocol.ProtocolHandlerUtilsTest](#user-content-r0s13)|3 ✅|||7s|
+|[org.apache.pulsar.broker.protocol.ProtocolHandlerWithClassLoaderTest](#user-content-r0s14)|1 ✅|||15ms|
+|[org.apache.pulsar.broker.PulsarServiceTest](#user-content-r0s15)|2 ✅|||96ms|
+|[org.apache.pulsar.broker.service.MessagePublishBufferThrottleTest](#user-content-r0s16)|3 ✅|||14s|
+|[org.apache.pulsar.broker.service.ReplicatorTest](#user-content-r0s17)|22 ✅|||40s|
+|[org.apache.pulsar.broker.service.TopicOwnerTest](#user-content-r0s18)|8 ✅|||114s|
+|[org.apache.pulsar.broker.SLAMonitoringTest](#user-content-r0s19)|4 ✅|||9s|
+|[org.apache.pulsar.broker.stats.BookieClientsStatsGeneratorTest](#user-content-r0s20)|2 ✅|||49ms|
+|[org.apache.pulsar.broker.stats.ConsumerStatsTest](#user-content-r0s21)|3 ✅|||21s|
+|[org.apache.pulsar.broker.stats.ManagedCursorMetricsTest](#user-content-r0s22)|1 ✅|||281ms|
+|[org.apache.pulsar.broker.stats.ManagedLedgerMetricsTest](#user-content-r0s23)|1 ✅|||285ms|
+|[org.apache.pulsar.broker.stats.prometheus.AggregatedNamespaceStatsTest](#user-content-r0s24)|1 ✅|||40ms|
+|[org.apache.pulsar.broker.stats.PrometheusMetricsTest](#user-content-r0s25)|15 ✅|||83s|
+|[org.apache.pulsar.broker.stats.SubscriptionStatsTest](#user-content-r0s26)|2 ✅|||2s|
+|[org.apache.pulsar.broker.systopic.NamespaceEventsSystemTopicServiceTest](#user-content-r0s27)|1 ✅|||1s|
+|[org.apache.pulsar.broker.transaction.buffer.InMemTransactionBufferReaderTest](#user-content-r0s28)|3 ✅|||28ms|
+|[org.apache.pulsar.broker.transaction.buffer.TransactionBufferClientTest](#user-content-r0s29)|4 ✅|||93ms|
+|[org.apache.pulsar.broker.transaction.buffer.TransactionBufferTest](#user-content-r0s30)|7 ✅|||81ms|
+|[org.apache.pulsar.broker.transaction.buffer.TransactionEntryImplTest](#user-content-r0s31)|1 ✅|||14ms|
+|[org.apache.pulsar.broker.transaction.buffer.TransactionLowWaterMarkTest](#user-content-r0s32)|2 ✅|||38s|
+|[org.apache.pulsar.broker.transaction.buffer.TransactionStablePositionTest](#user-content-r0s33)|2 ✅||1 ⚪|49s|
+|[org.apache.pulsar.broker.transaction.coordinator.TransactionCoordinatorClientTest](#user-content-r0s34)|3 ✅|||95ms|
+|[org.apache.pulsar.broker.transaction.coordinator.TransactionMetaStoreAssignmentTest](#user-content-r0s35)|1 ✅|||1s|
+|[org.apache.pulsar.broker.transaction.pendingack.PendingAckInMemoryDeleteTest](#user-content-r0s36)|2 ✅||1 ⚪|57s|
+|[org.apache.pulsar.broker.transaction.TransactionConsumeTest](#user-content-r0s37)|2 ✅|||30s|
+|[org.apache.pulsar.broker.web.RestExceptionTest](#user-content-r0s38)|3 ✅|||37ms|
+|[org.apache.pulsar.broker.web.WebServiceTest](#user-content-r0s39)|9 ✅|||27s|
+|[org.apache.pulsar.client.impl.AdminApiKeyStoreTlsAuthTest](#user-content-r0s40)|4 ✅|||8s|
+|[org.apache.pulsar.client.impl.BatchMessageIdImplSerializationTest](#user-content-r0s41)|4 ✅|||30ms|
+|[org.apache.pulsar.client.impl.BatchMessageIndexAckDisableTest](#user-content-r0s42)|4 ✅|||14s|
+|[org.apache.pulsar.client.impl.BatchMessageIndexAckTest](#user-content-r0s43)|5 ✅|||44s|
+|[org.apache.pulsar.client.impl.BrokerClientIntegrationTest](#user-content-r0s44)|15 ✅|||148s|
+|[org.apache.pulsar.client.impl.CompactedOutBatchMessageTest](#user-content-r0s45)|1 ✅|||1s|
+|[org.apache.pulsar.client.impl.ConsumerAckResponseTest](#user-content-r0s46)|1 ✅|||549ms|
+|[org.apache.pulsar.client.impl.ConsumerConfigurationTest](#user-content-r0s47)|4 ✅|||12s|
+|[org.apache.pulsar.client.impl.ConsumerDedupPermitsUpdate](#user-content-r0s48)|7 ✅|||4s|
+|[org.apache.pulsar.client.impl.ConsumerUnsubscribeTest](#user-content-r0s49)|1 ✅|||129ms|
+|[org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithAuth](#user-content-r0s50)|3 ✅|||23s|
+|[org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithoutAuth](#user-content-r0s51)|3 ✅|||8s|
+|[org.apache.pulsar.client.impl.KeyStoreTlsTest](#user-content-r0s52)|1 ✅|||183ms|
+|[org.apache.pulsar.client.impl.MessageChecksumTest](#user-content-r0s53)|3 ✅|||47s|
+|[org.apache.pulsar.client.impl.MessageChunkingTest](#user-content-r0s54)|8 ✅||1 ⚪|73s|
+|[org.apache.pulsar.client.impl.MessageParserTest](#user-content-r0s55)|2 ✅|||5s|
+|[org.apache.pulsar.client.impl.MultiTopicsReaderTest](#user-content-r0s56)|8 ✅|||35s|
+|[org.apache.pulsar.client.impl.NegativeAcksTest](#user-content-r0s57)|32 ✅|||11s|
+|[org.apache.pulsar.client.impl.PatternTopicsConsumerImplTest](#user-content-r0s58)|11 ✅|||63s|
+|[org.apache.pulsar.client.impl.PerMessageUnAcknowledgedRedeliveryTest](#user-content-r0s59)|5 ✅|||34s|
+|[org.apache.pulsar.client.impl.PulsarMultiHostClientTest](#user-content-r0s60)|3 ✅|||15s|
+|[org.apache.pulsar.client.impl.RawMessageSerDeserTest](#user-content-r0s61)|1 ✅|||10ms|
+|[org.apache.pulsar.client.impl.SchemaDeleteTest](#user-content-r0s62)|1 ✅|||2s|
+|[org.apache.pulsar.client.impl.SequenceIdWithErrorTest](#user-content-r0s63)|3 ✅||2 ⚪|18s|
+|[org.apache.pulsar.client.impl.TopicDoesNotExistsTest](#user-content-r0s64)|2 ✅|||4s|
+|[org.apache.pulsar.client.impl.TopicFromMessageTest](#user-content-r0s65)|5 ✅|||14s|
+|[org.apache.pulsar.client.impl.TopicsConsumerImplTest](#user-content-r0s66)|17 ✅|||133s|
+|[org.apache.pulsar.client.impl.UnAcknowledgedMessagesTimeoutTest](#user-content-r0s67)|7 ✅|||44s|
+|[org.apache.pulsar.client.impl.ZeroQueueSizeTest](#user-content-r0s68)|14 ✅|||16s|
+|[org.apache.pulsar.common.api.raw.RawMessageImplTest](#user-content-r0s69)|1 ✅|||316ms|
+|[org.apache.pulsar.common.compression.CommandsTest](#user-content-r0s70)|1 ✅|||30ms|
+|[org.apache.pulsar.common.compression.CompressorCodecBackwardCompatTest](#user-content-r0s71)|6 ✅|||223ms|
+|[org.apache.pulsar.common.compression.CompressorCodecTest](#user-content-r0s72)|45 ✅|||737ms|
+|[org.apache.pulsar.common.compression.Crc32cChecksumTest](#user-content-r0s73)|6 ✅|||5s|
+|[org.apache.pulsar.common.lookup.data.LookupDataTest](#user-content-r0s74)|4 ✅|||2s|
+|[org.apache.pulsar.common.naming.MetadataTests](#user-content-r0s75)|2 ✅|||161ms|
+|[org.apache.pulsar.common.naming.NamespaceBundlesTest](#user-content-r0s76)|5 ✅|||99ms|
+|[org.apache.pulsar.common.naming.NamespaceBundleTest](#user-content-r0s77)|6 ✅|||64ms|
+|[org.apache.pulsar.common.naming.NamespaceNameTest](#user-content-r0s78)|2 ✅|||207ms|
+|[org.apache.pulsar.common.naming.ServiceConfigurationTest](#user-content-r0s79)|4 ✅|||48ms|
+|[org.apache.pulsar.common.naming.TopicNameTest](#user-content-r0s80)|4 ✅|||529ms|
+|[org.apache.pulsar.common.net.ServiceURITest](#user-content-r0s81)|21 ✅|||237ms|
+|[org.apache.pulsar.common.policies.data.AutoFailoverPolicyDataTest](#user-content-r0s82)|1 ✅|||15ms|
+|[org.apache.pulsar.common.policies.data.AutoFailoverPolicyTypeTest](#user-content-r0s83)|1 ✅|||19ms|
+|[org.apache.pulsar.common.policies.data.AutoTopicCreationOverrideTest](#user-content-r0s84)|6 ✅|||64ms|
+|[org.apache.pulsar.common.policies.data.BacklogQuotaTest](#user-content-r0s85)|1 ✅|||12ms|
+|[org.apache.pulsar.common.policies.data.ClusterDataTest](#user-content-r0s86)|1 ✅|||9ms|
+|[org.apache.pulsar.common.policies.data.ConsumerStatsTest](#user-content-r0s87)|1 ✅|||8ms|
+|[org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfigTest](#user-content-r0s88)|2 ✅|||948ms|
+|[org.apache.pulsar.common.policies.data.LocalPolicesTest](#user-content-r0s89)|1 ✅|||48ms|
+|[org.apache.pulsar.common.policies.data.NamespaceIsolationDataTest](#user-content-r0s90)|1 ✅|||76ms|
+|[org.apache.pulsar.common.policies.data.NamespaceOwnershipStatusTest](#user-content-r0s91)|1 ✅|||45ms|
+|[org.apache.pulsar.common.policies.data.OffloadPoliciesTest](#user-content-r0s92)|6 ✅|||216ms|
+|[org.apache.pulsar.common.policies.data.PartitionedTopicStatsTest](#user-content-r0s93)|1 ✅|||12ms|
+|[org.apache.pulsar.common.policies.data.PersistencePoliciesTest](#user-content-r0s94)|1 ✅|||19ms|
+|[org.apache.pulsar.common.policies.data.PersistentOfflineTopicStatsTest](#user-content-r0s95)|1 ✅|||29ms|
+|[org.apache.pulsar.common.policies.data.PersistentTopicStatsTest](#user-content-r0s96)|2 ✅|||51ms|
+|[org.apache.pulsar.common.policies.data.PoliciesDataTest](#user-content-r0s97)|4 ✅|||1s|
+|[org.apache.pulsar.common.policies.data.PublisherStatsTest](#user-content-r0s98)|2 ✅|||37ms|
+|[org.apache.pulsar.common.policies.data.ReplicatorStatsTest](#user-content-r0s99)|2 ✅|||30ms|
+|[org.apache.pulsar.common.policies.data.ResourceQuotaTest](#user-content-r0s100)|2 ✅|||45ms|
+|[org.apache.pulsar.common.policies.data.RetentionPolicesTest](#user-content-r0s101)|1 ✅|||8ms|
+|[org.apache.pulsar.common.policies.impl.AutoFailoverPolicyFactoryTest](#user-content-r0s102)|1 ✅|||22ms|
+|[org.apache.pulsar.common.policies.impl.MinAvailablePolicyTest](#user-content-r0s103)|1 ✅|||1ms|
+|[org.apache.pulsar.common.policies.impl.NamespaceIsolationPoliciesTest](#user-content-r0s104)|7 ✅|||265ms|
+|[org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicyImplTest](#user-content-r0s105)|7 ✅|||309ms|
+|[org.apache.pulsar.common.protocol.ByteBufPairTest](#user-content-r0s106)|2 ✅|||5s|
+|[org.apache.pulsar.common.protocol.CommandUtilsTests](#user-content-r0s107)|7 ✅|||3s|
+|[org.apache.pulsar.common.protocol.MarkersTest](#user-content-r0s108)|6 ✅|||3s|
+|[org.apache.pulsar.common.protocol.PulsarDecoderTest](#user-content-r0s109)|1 ✅|||4s|
+|[org.apache.pulsar.common.stats.JvmDefaultGCMetricsLoggerTest](#user-content-r0s110)|1 ✅|||82ms|
+|[org.apache.pulsar.common.util.collections.BitSetRecyclableRecyclableTest](#user-content-r0s111)|2 ✅|||13ms|
+|[org.apache.pulsar.common.util.collections.ConcurrentBitSetRecyclableTest](#user-content-r0s112)|2 ✅|||63ms|
+|[org.apache.pulsar.common.util.collections.ConcurrentLongHashMapTest](#user-content-r0s113)|13 ✅|||28s|
+|[org.apache.pulsar.common.util.collections.ConcurrentLongPairSetTest](#user-content-r0s114)|15 ✅|||2s|
+|[org.apache.pulsar.common.util.collections.ConcurrentOpenHashMapTest](#user-content-r0s115)|12 ✅|||9s|
+|[org.apache.pulsar.common.util.collections.ConcurrentOpenHashSetTest](#user-content-r0s116)|11 ✅|||7s|
+|[org.apache.pulsar.common.util.collections.ConcurrentOpenLongPairRangeSetTest](#user-content-r0s117)|13 ✅|||1s|
+|[org.apache.pulsar.common.util.collections.ConcurrentSortedLongPairSetTest](#user-content-r0s118)|9 ✅|||342ms|
+|[org.apache.pulsar.common.util.collections.FieldParserTest](#user-content-r0s119)|2 ✅|||64ms|
+|[org.apache.pulsar.common.util.collections.GrowableArrayBlockingQueueTest](#user-content-r0s120)|6 ✅|||350ms|
+|[org.apache.pulsar.common.util.collections.GrowablePriorityLongPairQueueTest](#user-content-r0s121)|15 ✅|||3s|
+|[org.apache.pulsar.common.util.collections.TripleLongPriorityQueueTest](#user-content-r0s122)|3 ✅|||238ms|
+|[org.apache.pulsar.common.util.FieldParserTest](#user-content-r0s123)|1 ✅|||242ms|
+|[org.apache.pulsar.common.util.FileModifiedTimeUpdaterTest](#user-content-r0s124)|6 ✅|||6s|
+|[org.apache.pulsar.common.util.netty.ChannelFuturesTest](#user-content-r0s125)|5 ✅|||2s|
+|[org.apache.pulsar.common.util.RateLimiterTest](#user-content-r0s126)|11 ✅|||7s|
+|[org.apache.pulsar.common.util.ReflectionsTest](#user-content-r0s127)|12 ✅|||172ms|
+|[org.apache.pulsar.common.util.RelativeTimeUtilTest](#user-content-r0s128)|1 ✅|||39ms|
+|[org.apache.pulsar.discovery.service.web.DiscoveryServiceWebTest](#user-content-r0s129)|1 ✅|||5s|
+|[org.apache.pulsar.functions.worker.PulsarFunctionE2ESecurityTest](#user-content-r0s130)|2 ✅|||28s|
+|[org.apache.pulsar.functions.worker.PulsarFunctionPublishTest](#user-content-r0s131)|3 ✅|||42s|
+|[org.apache.pulsar.functions.worker.PulsarFunctionTlsTest](#user-content-r0s132)|1 ✅|||12s|
+|[org.apache.pulsar.io.PulsarFunctionTlsTest](#user-content-r0s133)|1 ✅|||30s|
+|[org.apache.pulsar.proxy.server.AdminProxyHandlerTest](#user-content-r0s134)|1 ✅|||474ms|
+|[org.apache.pulsar.proxy.server.AuthedAdminProxyHandlerTest](#user-content-r0s135)|1 ✅|||2s|
+|[org.apache.pulsar.proxy.server.FunctionWorkerRoutingTest](#user-content-r0s136)|1 ✅|||10ms|
+|[org.apache.pulsar.proxy.server.ProxyAdditionalServletTest](#user-content-r0s137)|1 ✅|||125ms|
+|[org.apache.pulsar.proxy.server.ProxyAuthenticatedProducerConsumerTest](#user-content-r0s138)|1 ✅|||2s|
+|[org.apache.pulsar.proxy.server.ProxyAuthenticationTest](#user-content-r0s139)|1 ✅|||17s|
+|[org.apache.pulsar.proxy.server.ProxyConnectionThrottlingTest](#user-content-r0s140)|1 ✅|||2s|
+|[org.apache.pulsar.proxy.server.ProxyEnableHAProxyProtocolTest](#user-content-r0s141)|1 ✅|||511ms|
+|[org.apache.pulsar.proxy.server.ProxyForwardAuthDataTest](#user-content-r0s142)|1 ✅|||32s|
+|[org.apache.pulsar.proxy.server.ProxyIsAHttpProxyTest](#user-content-r0s143)|10 ✅|||2s|
+|[org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithAuth](#user-content-r0s144)|3 ✅|||7s|
+|[org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithoutAuth](#user-content-r0s145)|3 ✅|||7s|
+|[org.apache.pulsar.proxy.server.ProxyLookupThrottlingTest](#user-content-r0s146)|1 ✅|||3s|
+|[org.apache.pulsar.proxy.server.ProxyParserTest](#user-content-r0s147)|5 ✅|||1s|
+|[org.apache.pulsar.proxy.server.ProxyRolesEnforcementTest](#user-content-r0s148)|1 ✅|||10s|
+|[org.apache.pulsar.proxy.server.ProxyStatsTest](#user-content-r0s149)|3 ✅|||533ms|
+|[org.apache.pulsar.proxy.server.ProxyTest](#user-content-r0s150)|6 ✅|||3s|
+|[org.apache.pulsar.proxy.server.ProxyTlsTest](#user-content-r0s151)|2 ✅|||414ms|
+|[org.apache.pulsar.proxy.server.ProxyTlsTestWithAuth](#user-content-r0s152)|1 ✅|||4ms|
+|[org.apache.pulsar.proxy.server.ProxyWithAuthorizationNegTest](#user-content-r0s153)|1 ✅|||2s|
+|[org.apache.pulsar.proxy.server.ProxyWithAuthorizationTest](#user-content-r0s154)|13 ✅|||33s|
+|[org.apache.pulsar.proxy.server.ProxyWithoutServiceDiscoveryTest](#user-content-r0s155)|1 ✅|||2s|
+|[org.apache.pulsar.proxy.server.SuperUserAuthedAdminProxyHandlerTest](#user-content-r0s156)|3 ✅|||8s|
+|[org.apache.pulsar.proxy.server.UnauthedAdminProxyHandlerTest](#user-content-r0s157)|2 ✅|||114ms|
+|[org.apache.pulsar.PulsarBrokerStarterTest](#user-content-r0s158)|9 ✅|||591ms|
+|[org.apache.pulsar.schema.compatibility.SchemaCompatibilityCheckTest](#user-content-r0s159)|23 ✅|||107s|
+|[org.apache.pulsar.schema.PartitionedTopicSchemaTest](#user-content-r0s160)|1 ✅|||29s|
+|[org.apache.pulsar.schema.SchemaTest](#user-content-r0s161)|3 ✅|||31s|
+|[org.apache.pulsar.stats.client.PulsarBrokerStatsClientTest](#user-content-r0s162)|2 ✅|||41s|
+|[org.apache.pulsar.tests.EnumValuesDataProviderTest](#user-content-r0s163)|6 ✅|||23ms|
+|[org.apache.pulsar.tests.TestRetrySupportBeforeMethodRetryTest](#user-content-r0s164)|1 ✅||4 ⚪|36ms|
+|[org.apache.pulsar.tests.TestRetrySupportRetryTest](#user-content-r0s165)|1 ✅||4 ⚪|27ms|
+|[org.apache.pulsar.tests.TestRetrySupportSuccessTest](#user-content-r0s166)|3 ✅|||1ms|
+|[org.apache.pulsar.tests.ThreadDumpUtilTest](#user-content-r0s167)|2 ✅|||17ms|
+|[org.apache.pulsar.utils.SimpleTextOutputStreamTest](#user-content-r0s168)|4 ✅|||50ms|
+|[org.apache.pulsar.utils.StatsOutputStreamTest](#user-content-r0s169)|6 ✅|||59ms|
+|[org.apache.pulsar.websocket.proxy.ProxyAuthenticationTest](#user-content-r0s170)|4 ✅|||29s|
+|[org.apache.pulsar.websocket.proxy.ProxyAuthorizationTest](#user-content-r0s171)|1 ✅|||1s|
+|[org.apache.pulsar.websocket.proxy.ProxyConfigurationTest](#user-content-r0s172)|2 ✅|||9s|
+|[org.apache.pulsar.websocket.proxy.ProxyPublishConsumeTlsTest](#user-content-r0s173)|1 ✅|||11s|
+|[org.apache.pulsar.websocket.proxy.ProxyPublishConsumeWithoutZKTest](#user-content-r0s174)|1 ✅|||7s|
+|[org.apache.pulsar.websocket.proxy.v1.V1_ProxyAuthenticationTest](#user-content-r0s175)|4 ✅|||30s|
+### ❌ org.apache.pulsar.AddMissingPatchVersionTest
```
⚪ testVersionStrings
❌ testVersionStrings
java.lang.AssertionError: expected [1.2.1] but found [1.2.0]
```
-### ✅ org.apache.pulsar.broker.admin.AdminApiOffloadTest
+### ✅ org.apache.pulsar.broker.admin.AdminApiOffloadTest
```
✅ testOffloadPoliciesAppliedApi
✅ testOffloadV2
@@ -195,38 +198,38 @@
✅ testOffloadPolicies
✅ testOffloadPoliciesApi
```
-### ✅ org.apache.pulsar.broker.auth.AuthenticationServiceTest
+### ✅ org.apache.pulsar.broker.auth.AuthenticationServiceTest
```
✅ testAuthentication
✅ testAuthenticationHttp
```
-### ✅ org.apache.pulsar.broker.auth.AuthLogsTest
+### ✅ org.apache.pulsar.broker.auth.AuthLogsTest
```
✅ httpEndpoint
✅ binaryEndpoint
```
-### ✅ org.apache.pulsar.broker.auth.AuthorizationTest
+### ✅ org.apache.pulsar.broker.auth.AuthorizationTest
```
✅ simple
```
-### ✅ org.apache.pulsar.broker.lookup.http.HttpTopicLookupv2Test
+### ✅ org.apache.pulsar.broker.lookup.http.HttpTopicLookupv2Test
```
✅ crossColoLookup
✅ testNotEnoughLookupPermits
✅ testValidateReplicationSettingsOnNamespace
✅ testDataPojo
```
-### ✅ org.apache.pulsar.broker.namespace.NamespaceCreateBundlesTest
+### ✅ org.apache.pulsar.broker.namespace.NamespaceCreateBundlesTest
```
✅ testCreateNamespaceWithDefaultBundles
✅ testSplitBundleUpdatesLocalPoliciesWithoutOverwriting
```
-### ✅ org.apache.pulsar.broker.namespace.NamespaceOwnershipListenerTests
+### ✅ org.apache.pulsar.broker.namespace.NamespaceOwnershipListenerTests
```
✅ testGetAllPartitions
✅ testNamespaceBundleOwnershipListener
```
-### ✅ org.apache.pulsar.broker.namespace.NamespaceServiceTest
+### ✅ org.apache.pulsar.broker.namespace.NamespaceServiceTest
```
✅ testSplitMapWithRefreshedStatMap
✅ testRemoveOwnershipNamespaceBundle
@@ -239,16 +242,16 @@
✅ testCreateNamespaceWithDefaultNumberOfBundles
✅ testRemoveOwnershipAndSplitBundle
```
-### ✅ org.apache.pulsar.broker.namespace.NamespaceUnloadingTest
+### ✅ org.apache.pulsar.broker.namespace.NamespaceUnloadingTest
```
✅ testUnloadNotLoadedNamespace
✅ testUnloadPartiallyLoadedNamespace
```
-### ✅ org.apache.pulsar.broker.namespace.OwnerShipCacheForCurrentServerTest
+### ✅ org.apache.pulsar.broker.namespace.OwnerShipCacheForCurrentServerTest
```
✅ testOwnershipForCurrentServer
```
-### ✅ org.apache.pulsar.broker.namespace.OwnershipCacheTest
+### ✅ org.apache.pulsar.broker.namespace.OwnershipCacheTest
```
✅ testGetOwnedServiceUnits
✅ testRemoveOwnership
@@ -259,7 +262,7 @@
✅ testDisableOwnership
✅ testReestablishOwnership
```
-### ✅ org.apache.pulsar.broker.protocol.ProtocolHandlersTest
+### ✅ org.apache.pulsar.broker.protocol.ProtocolHandlersTest
```
✅ testStart
✅ testGetProtocol
@@ -268,28 +271,28 @@
✅ testNewChannelInitializersOverlapped
✅ testGetProtocolDataToAdvertise
```
-### ✅ org.apache.pulsar.broker.protocol.ProtocolHandlerUtilsTest
+### ✅ org.apache.pulsar.broker.protocol.ProtocolHandlerUtilsTest
```
✅ testLoadProtocolHandler
✅ testLoadProtocolHandlerBlankHandlerClass
✅ testLoadProtocolHandlerWrongHandlerClass
```
-### ✅ org.apache.pulsar.broker.protocol.ProtocolHandlerWithClassLoaderTest
+### ✅ org.apache.pulsar.broker.protocol.ProtocolHandlerWithClassLoaderTest
```
✅ testWrapper
```
-### ✅ org.apache.pulsar.broker.PulsarServiceTest
+### ✅ org.apache.pulsar.broker.PulsarServiceTest
```
✅ testGetWorkerService
✅ testGetWorkerServiceException
```
-### ✅ org.apache.pulsar.broker.service.MessagePublishBufferThrottleTest
+### ✅ org.apache.pulsar.broker.service.MessagePublishBufferThrottleTest
```
✅ testMessagePublishBufferThrottleEnable
✅ testBlockByPublishRateLimiting
✅ testMessagePublishBufferThrottleDisabled
```
-### ✅ org.apache.pulsar.broker.service.ReplicatorTest
+### ✅ org.apache.pulsar.broker.service.ReplicatorTest
```
✅ testResumptionAfterBacklogRelaxed
✅ testReplicationOverrides
@@ -314,7 +317,7 @@
✅ testFailures
✅ testReplicatorProducerClosing
```
-### ✅ org.apache.pulsar.broker.service.TopicOwnerTest
+### ✅ org.apache.pulsar.broker.service.TopicOwnerTest
```
✅ testReleaseOwnershipWithZookeeperDisconnectedBeforeOwnershipNodeDeleted
✅ testAcquireOwnershipWithZookeeperDisconnectedAfterOwnershipNodeCreated
@@ -325,37 +328,37 @@
✅ testReleaseOwnershipWithZookeeperDisconnectedAfterOwnershipNodeDeleted
✅ testReestablishOwnershipAfterInvalidateCache
```
-### ✅ org.apache.pulsar.broker.SLAMonitoringTest
+### ✅ org.apache.pulsar.broker.SLAMonitoringTest
```
✅ testOwnedNamespaces
✅ testOwnershipAfterSetup
✅ testUnloadIfBrokerCrashes
✅ testOwnershipViaAdminAfterSetup
```
-### ✅ org.apache.pulsar.broker.stats.BookieClientsStatsGeneratorTest
+### ✅ org.apache.pulsar.broker.stats.BookieClientsStatsGeneratorTest
```
✅ testJvmDirectMemoryUsedMetric
✅ testBookieClientStatsGenerator
```
-### ✅ org.apache.pulsar.broker.stats.ConsumerStatsTest
+### ✅ org.apache.pulsar.broker.stats.ConsumerStatsTest
```
✅ testAckStatsOnPartitionedTopicForExclusiveSubscription
✅ testConsumerStatsOnZeroMaxUnackedMessagesPerConsumer
✅ testUpdateStatsForActiveConsumerAndSubscription
```
-### ✅ org.apache.pulsar.broker.stats.ManagedCursorMetricsTest
+### ✅ org.apache.pulsar.broker.stats.ManagedCursorMetricsTest
```
✅ testManagedCursorMetrics
```
-### ✅ org.apache.pulsar.broker.stats.ManagedLedgerMetricsTest
+### ✅ org.apache.pulsar.broker.stats.ManagedLedgerMetricsTest
```
✅ testManagedLedgerMetrics
```
-### ✅ org.apache.pulsar.broker.stats.prometheus.AggregatedNamespaceStatsTest
+### ✅ org.apache.pulsar.broker.stats.prometheus.AggregatedNamespaceStatsTest
```
✅ testSimpleAggregation
```
-### ✅ org.apache.pulsar.broker.stats.PrometheusMetricsTest
+### ✅ org.apache.pulsar.broker.stats.PrometheusMetricsTest
```
✅ testPerTopicStats
✅ testAuthMetrics
@@ -373,29 +376,29 @@
✅ testManagedLedgerCacheStats
✅ testManagedLedgerStats
```
-### ✅ org.apache.pulsar.broker.stats.SubscriptionStatsTest
+### ✅ org.apache.pulsar.broker.stats.SubscriptionStatsTest
```
✅ testConsumersAfterMarkDelete
✅ testNonContiguousDeletedMessagesRanges
```
-### ✅ org.apache.pulsar.broker.systopic.NamespaceEventsSystemTopicServiceTest
+### ✅ org.apache.pulsar.broker.systopic.NamespaceEventsSystemTopicServiceTest
```
✅ testSendAndReceiveNamespaceEvents
```
-### ✅ org.apache.pulsar.broker.transaction.buffer.InMemTransactionBufferReaderTest
+### ✅ org.apache.pulsar.broker.transaction.buffer.InMemTransactionBufferReaderTest
```
✅ testCloseReleaseAllEntries
✅ testInvalidNumEntriesArgument
✅ testEndOfTransactionException
```
-### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionBufferClientTest
+### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionBufferClientTest
```
✅ testAbortOnTopic
✅ testAbortOnSubscription
✅ testCommitOnTopic
✅ testCommitOnSubscription
```
-### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionBufferTest
+### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionBufferTest
```
✅ testOpenReaderOnNonExistentTxn
✅ testAbortCommittedTxn
@@ -405,49 +408,49 @@
✅ testCommitTxn
✅ testOpenReaderOnAnOpenTxn
```
-### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionEntryImplTest
+### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionEntryImplTest
```
✅ testCloseShouldReleaseBuffer
```
-### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionLowWaterMarkTest
+### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionLowWaterMarkTest
```
✅ testTransactionBufferLowWaterMark
✅ testPendingAckLowWaterMark
```
-### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionStablePositionTest
+### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionStablePositionTest
```
✅ commitTxnTest
✅ abortTxnTest
⚪ commitTxnTest
```
-### ✅ org.apache.pulsar.broker.transaction.coordinator.TransactionCoordinatorClientTest
+### ✅ org.apache.pulsar.broker.transaction.coordinator.TransactionCoordinatorClientTest
```
✅ testClientStart
✅ testCommitAndAbort
✅ testNewTxn
```
-### ✅ org.apache.pulsar.broker.transaction.coordinator.TransactionMetaStoreAssignmentTest
+### ✅ org.apache.pulsar.broker.transaction.coordinator.TransactionMetaStoreAssignmentTest
```
✅ testTransactionMetaStoreAssignAndFailover
```
-### ✅ org.apache.pulsar.broker.transaction.pendingack.PendingAckInMemoryDeleteTest
+### ✅ org.apache.pulsar.broker.transaction.pendingack.PendingAckInMemoryDeleteTest
```
⚪ txnAckTestNoBatchAndSharedSubMemoryDeleteTest
✅ txnAckTestNoBatchAndSharedSubMemoryDeleteTest
✅ txnAckTestBatchAndSharedSubMemoryDeleteTest
```
-### ✅ org.apache.pulsar.broker.transaction.TransactionConsumeTest
+### ✅ org.apache.pulsar.broker.transaction.TransactionConsumeTest
```
✅ noSortedTest
✅ sortedTest
```
-### ✅ org.apache.pulsar.broker.web.RestExceptionTest
+### ✅ org.apache.pulsar.broker.web.RestExceptionTest
```
✅ testRestException
✅ testWebApplicationException
✅ testOtherException
```
-### ✅ org.apache.pulsar.broker.web.WebServiceTest
+### ✅ org.apache.pulsar.broker.web.WebServiceTest
```
✅ testTlsAuthDisallowInsecure
✅ testBrokerReady
@@ -459,28 +462,28 @@
✅ testTlsDisabled
✅ testRateLimiting
```
-### ✅ org.apache.pulsar.client.impl.AdminApiKeyStoreTlsAuthTest
+### ✅ org.apache.pulsar.client.impl.AdminApiKeyStoreTlsAuthTest
```
✅ testAuthorizedUserAsOriginalPrincipal
✅ testSuperUserCantListNamespaces
✅ testPersistentList
✅ testSuperUserCanListTenants
```
-### ✅ org.apache.pulsar.client.impl.BatchMessageIdImplSerializationTest
+### ✅ org.apache.pulsar.client.impl.BatchMessageIdImplSerializationTest
```
✅ testSerializationEmpty
✅ testSerialization1
✅ testSerializationNull
✅ testSerialization2
```
-### ✅ org.apache.pulsar.client.impl.BatchMessageIndexAckDisableTest
+### ✅ org.apache.pulsar.client.impl.BatchMessageIndexAckDisableTest
```
✅ testBatchMessageIndexAckForExclusiveSubscription
✅ testBatchMessageIndexAckForSharedSubscription
✅ testBatchMessageIndexAckForExclusiveSubscription
✅ testBatchMessageIndexAckForSharedSubscription
```
-### ✅ org.apache.pulsar.client.impl.BatchMessageIndexAckTest
+### ✅ org.apache.pulsar.client.impl.BatchMessageIndexAckTest
```
✅ testBatchMessageIndexAckForSharedSubscription
✅ testBatchMessageIndexAckForSharedSubscription
@@ -488,7 +491,7 @@
✅ testBatchMessageIndexAckForExclusiveSubscription
✅ testBatchMessageIndexAckForExclusiveSubscription
```
-### ✅ org.apache.pulsar.client.impl.BrokerClientIntegrationTest
+### ✅ org.apache.pulsar.client.impl.BrokerClientIntegrationTest
```
✅ testDisconnectClientWithoutClosingConnection
✅ testResetCursor
@@ -506,22 +509,22 @@
✅ testMaxConcurrentTopicLoading
✅ testCloseConnectionOnInternalServerError
```
-### ✅ org.apache.pulsar.client.impl.CompactedOutBatchMessageTest
+### ✅ org.apache.pulsar.client.impl.CompactedOutBatchMessageTest
```
✅ testCompactedOutMessages
```
-### ✅ org.apache.pulsar.client.impl.ConsumerAckResponseTest
+### ✅ org.apache.pulsar.client.impl.ConsumerAckResponseTest
```
✅ testAckResponse
```
-### ✅ org.apache.pulsar.client.impl.ConsumerConfigurationTest
+### ✅ org.apache.pulsar.client.impl.ConsumerConfigurationTest
```
✅ testReadCompactNonPersistentExclusive
✅ testReadCompactPersistentExclusive
✅ testReadCompactPersistentFailover
✅ testReadCompactPersistentShared
```
-### ✅ org.apache.pulsar.client.impl.ConsumerDedupPermitsUpdate
+### ✅ org.apache.pulsar.client.impl.ConsumerDedupPermitsUpdate
```
✅ testConsumerDedup
✅ testConsumerDedup
@@ -531,33 +534,33 @@
✅ testConsumerDedup
✅ testConsumerDedup
```
-### ✅ org.apache.pulsar.client.impl.ConsumerUnsubscribeTest
+### ✅ org.apache.pulsar.client.impl.ConsumerUnsubscribeTest
```
✅ testConsumerUnsubscribeReference
```
-### ✅ org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithAuth
+### ✅ org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithAuth
```
✅ testTlsClientAuthOverHTTPProtocol
✅ testTlsClientAuthOverBinaryProtocol
✅ testTlsLargeSizeMessage
```
-### ✅ org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithoutAuth
+### ✅ org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithoutAuth
```
✅ testTlsClientAuthOverHTTPProtocol
✅ testTlsClientAuthOverBinaryProtocol
✅ testTlsLargeSizeMessage
```
-### ✅ org.apache.pulsar.client.impl.KeyStoreTlsTest
+### ✅ org.apache.pulsar.client.impl.KeyStoreTlsTest
```
✅ testValidate
```
-### ✅ org.apache.pulsar.client.impl.MessageChecksumTest
+### ✅ org.apache.pulsar.client.impl.MessageChecksumTest
```
✅ testChecksumCompatibilityInMixedVersionBrokerCluster
✅ testTamperingMessageIsDetected
✅ testChecksumCompatibilityInMixedVersionBrokerCluster
```
-### ✅ org.apache.pulsar.client.impl.MessageChunkingTest
+### ✅ org.apache.pulsar.client.impl.MessageChunkingTest
```
✅ testPublishWithFailure
✅ testInvalidUseCaseForChunking
@@ -569,12 +572,12 @@
✅ testLargeMessage
⚪ testMaxPendingChunkMessages
```
-### ✅ org.apache.pulsar.client.impl.MessageParserTest
+### ✅ org.apache.pulsar.client.impl.MessageParserTest
```
✅ testWithoutBatches
✅ testWithBatches
```
-### ✅ org.apache.pulsar.client.impl.MultiTopicsReaderTest
+### ✅ org.apache.pulsar.client.impl.MultiTopicsReaderTest
```
✅ testReadMessageWithBatchingWithMessageInclusive
✅ testKeyHashRangeReader
@@ -585,7 +588,7 @@
✅ testReadMessageWithoutBatching
✅ testReaderWithTimeLong
```
-### ✅ org.apache.pulsar.client.impl.NegativeAcksTest
+### ✅ org.apache.pulsar.client.impl.NegativeAcksTest
```
✅ testNegativeAcks
✅ testNegativeAcks
@@ -620,7 +623,7 @@
✅ testNegativeAcks
✅ testNegativeAcks
```
-### ✅ org.apache.pulsar.client.impl.PatternTopicsConsumerImplTest
+### ✅ org.apache.pulsar.client.impl.PatternTopicsConsumerImplTest
```
✅ testStartEmptyPatternConsumer
✅ testBinaryProtoToGetTopicsOfNamespaceAll
@@ -634,7 +637,7 @@
✅ testTopicsListMinus
✅ testAutoSubscribePatternConsumer
```
-### ✅ org.apache.pulsar.client.impl.PerMessageUnAcknowledgedRedeliveryTest
+### ✅ org.apache.pulsar.client.impl.PerMessageUnAcknowledgedRedeliveryTest
```
✅ testSharedAckedNormalTopic
✅ testUnAckedMessageTrackerSize
@@ -642,21 +645,21 @@
✅ testExclusiveAckedNormalTopic
✅ testFailoverAckedNormalTopic
```
-### ✅ org.apache.pulsar.client.impl.PulsarMultiHostClientTest
+### ✅ org.apache.pulsar.client.impl.PulsarMultiHostClientTest
```
✅ testMultiHostUrlRetrySuccess
✅ testGetPartitionedTopicDataTimeout
✅ testGetPartitionedTopicMetaData
```
-### ✅ org.apache.pulsar.client.impl.RawMessageSerDeserTest
+### ✅ org.apache.pulsar.client.impl.RawMessageSerDeserTest
```
✅ testSerializationAndDeserialization
```
-### ✅ org.apache.pulsar.client.impl.SchemaDeleteTest
+### ✅ org.apache.pulsar.client.impl.SchemaDeleteTest
```
✅ createTopicDeleteTopicCreateTopic
```
-### ✅ org.apache.pulsar.client.impl.SequenceIdWithErrorTest
+### ✅ org.apache.pulsar.client.impl.SequenceIdWithErrorTest
```
✅ testCheckSequenceId
✅ testDeleteTopicWithMissingData
@@ -664,12 +667,12 @@
⚪ testCrashBrokerWithoutCursorLedgerLeak
⚪ testSkipCorruptDataLedger
```
-### ✅ org.apache.pulsar.client.impl.TopicDoesNotExistsTest
+### ✅ org.apache.pulsar.client.impl.TopicDoesNotExistsTest
```
✅ testCreateConsumerOnNotExistsTopic
✅ testCreateProducerOnNotExistsTopic
```
-### ✅ org.apache.pulsar.client.impl.TopicFromMessageTest
+### ✅ org.apache.pulsar.client.impl.TopicFromMessageTest
```
✅ testSingleTopicConsumerNoBatchFullName
✅ testMultiTopicConsumerBatchShortName
@@ -677,7 +680,7 @@
✅ testMultiTopicConsumerNoBatchShortName
✅ testSingleTopicConsumerBatchShortName
```
-### ✅ org.apache.pulsar.client.impl.TopicsConsumerImplTest
+### ✅ org.apache.pulsar.client.impl.TopicsConsumerImplTest
```
✅ testTopicAutoUpdatePartitions
✅ testDifferentTopicsNameSubscribe
@@ -697,7 +700,7 @@
✅ testTopicNameValid
✅ testAsyncConsumer
```
-### ✅ org.apache.pulsar.client.impl.UnAcknowledgedMessagesTimeoutTest
+### ✅ org.apache.pulsar.client.impl.UnAcknowledgedMessagesTimeoutTest
```
✅ testCheckUnAcknowledgedMessageTimer
✅ testExclusiveSingleAckedNormalTopic
@@ -707,7 +710,7 @@
✅ testExclusiveCumulativeAckedNormalTopic
✅ testSingleMessageBatch
```
-### ✅ org.apache.pulsar.client.impl.ZeroQueueSizeTest
+### ✅ org.apache.pulsar.client.impl.ZeroQueueSizeTest
```
✅ zeroQueueSizeSharedSubscription
✅ testPauseAndResume
@@ -724,15 +727,15 @@
✅ testFailedZeroQueueSizeBatchMessage
✅ testPauseAndResumeWithUnloading
```
-### ✅ org.apache.pulsar.common.api.raw.RawMessageImplTest
+### ✅ org.apache.pulsar.common.api.raw.RawMessageImplTest
```
✅ testGetProperties
```
-### ✅ org.apache.pulsar.common.compression.CommandsTest
+### ✅ org.apache.pulsar.common.compression.CommandsTest
```
✅ testChecksumSendCommand
```
-### ✅ org.apache.pulsar.common.compression.CompressorCodecBackwardCompatTest
+### ✅ org.apache.pulsar.common.compression.CompressorCodecBackwardCompatTest
```
✅ testCompressDecompress
✅ testCompressDecompress
@@ -741,7 +744,7 @@
✅ testCompressDecompress
✅ testCompressDecompress
```
-### ✅ org.apache.pulsar.common.compression.CompressorCodecTest
+### ✅ org.apache.pulsar.common.compression.CompressorCodecTest
```
✅ testCompressDecompress
✅ testMultpileUsages
@@ -789,7 +792,7 @@
✅ testDecompressReadonlyByteBuf
✅ testMultpileUsages
```
-### ✅ org.apache.pulsar.common.compression.Crc32cChecksumTest
+### ✅ org.apache.pulsar.common.compression.Crc32cChecksumTest
```
✅ testCrc32cHardware
✅ testCrc32cDirectMemoryHardware
@@ -798,19 +801,19 @@
✅ testCrc32cIncremental
✅ testCrc32cIncrementalUsingProvider
```
-### ✅ org.apache.pulsar.common.lookup.data.LookupDataTest
+### ✅ org.apache.pulsar.common.lookup.data.LookupDataTest
```
✅ testLoadReportSerialization
✅ testUrlEncoder
✅ serializeToJsonTest
✅ withConstructor
```
-### ✅ org.apache.pulsar.common.naming.MetadataTests
+### ✅ org.apache.pulsar.common.naming.MetadataTests
```
✅ testInvalidMetadata
✅ testValidMetadata
```
-### ✅ org.apache.pulsar.common.naming.NamespaceBundlesTest
+### ✅ org.apache.pulsar.common.naming.NamespaceBundlesTest
```
✅ testConstructor
✅ testSplitBundleInTwo
@@ -818,7 +821,7 @@
✅ testFindBundle
✅ testSplitBundleByFixBoundary
```
-### ✅ org.apache.pulsar.common.naming.NamespaceBundleTest
+### ✅ org.apache.pulsar.common.naming.NamespaceBundleTest
```
✅ testIncludes
✅ testGetBundle
@@ -827,26 +830,26 @@
✅ testToString
✅ testEquals
```
-### ✅ org.apache.pulsar.common.naming.NamespaceNameTest
+### ✅ org.apache.pulsar.common.naming.NamespaceNameTest
```
✅ namespace
✅ testNewScheme
```
-### ✅ org.apache.pulsar.common.naming.ServiceConfigurationTest
+### ✅ org.apache.pulsar.common.naming.ServiceConfigurationTest
```
✅ testOptionalSettingPresent
✅ testOptionalSettingEmpty
✅ testInit
✅ testInitFailure
```
-### ✅ org.apache.pulsar.common.naming.TopicNameTest
+### ✅ org.apache.pulsar.common.naming.TopicNameTest
```
✅ testShortTopicName
✅ topic
✅ testTopicNameWithoutCluster
✅ testDecodeEncode
```
-### ✅ org.apache.pulsar.common.net.ServiceURITest
+### ✅ org.apache.pulsar.common.net.ServiceURITest
```
✅ testEmptyServiceUriString
✅ testMultipleHostsSemiColon
@@ -870,15 +873,15 @@
✅ testMultipleHostsWithoutPulsarPorts
✅ testIpv6Uri
```
-### ✅ org.apache.pulsar.common.policies.data.AutoFailoverPolicyDataTest
+### ✅ org.apache.pulsar.common.policies.data.AutoFailoverPolicyDataTest
```
✅ testAutoFailoverPolicyData
```
-### ✅ org.apache.pulsar.common.policies.data.AutoFailoverPolicyTypeTest
+### ✅ org.apache.pulsar.common.policies.data.AutoFailoverPolicyTypeTest
```
✅ testAutoFailoverPolicyType
```
-### ✅ org.apache.pulsar.common.policies.data.AutoTopicCreationOverrideTest
+### ✅ org.apache.pulsar.common.policies.data.AutoTopicCreationOverrideTest
```
✅ testInvalidTopicType
✅ testNumPartitionsTooLow
@@ -887,36 +890,36 @@
✅ testNumPartitionsOnNonPartitioned
✅ testValidOverridePartitioned
```
-### ✅ org.apache.pulsar.common.policies.data.BacklogQuotaTest
+### ✅ org.apache.pulsar.common.policies.data.BacklogQuotaTest
```
✅ testBacklogQuotaIdentity
```
-### ✅ org.apache.pulsar.common.policies.data.ClusterDataTest
+### ✅ org.apache.pulsar.common.policies.data.ClusterDataTest
```
✅ simple
```
-### ✅ org.apache.pulsar.common.policies.data.ConsumerStatsTest
+### ✅ org.apache.pulsar.common.policies.data.ConsumerStatsTest
```
✅ testConsumerStats
```
-### ✅ org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfigTest
+### ✅ org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfigTest
```
✅ testDecodeFailed
✅ testEncodeDecodeSuccessfully
```
-### ✅ org.apache.pulsar.common.policies.data.LocalPolicesTest
+### ✅ org.apache.pulsar.common.policies.data.LocalPolicesTest
```
✅ testLocalPolices
```
-### ✅ org.apache.pulsar.common.policies.data.NamespaceIsolationDataTest
+### ✅ org.apache.pulsar.common.policies.data.NamespaceIsolationDataTest
```
✅ testNamespaceIsolationData
```
-### ✅ org.apache.pulsar.common.policies.data.NamespaceOwnershipStatusTest
+### ✅ org.apache.pulsar.common.policies.data.NamespaceOwnershipStatusTest
```
✅ testSerialization
```
-### ✅ org.apache.pulsar.common.policies.data.OffloadPoliciesTest
+### ✅ org.apache.pulsar.common.policies.data.OffloadPoliciesTest
```
✅ testGcsConfiguration
✅ mergeTest
@@ -925,58 +928,58 @@
✅ testS3Configuration
✅ oldPoliciesCompatibleTest
```
-### ✅ org.apache.pulsar.common.policies.data.PartitionedTopicStatsTest
+### ✅ org.apache.pulsar.common.policies.data.PartitionedTopicStatsTest
```
✅ testPartitionedTopicStats
```
-### ✅ org.apache.pulsar.common.policies.data.PersistencePoliciesTest
+### ✅ org.apache.pulsar.common.policies.data.PersistencePoliciesTest
```
✅ testPersistencePolicies
```
-### ✅ org.apache.pulsar.common.policies.data.PersistentOfflineTopicStatsTest
+### ✅ org.apache.pulsar.common.policies.data.PersistentOfflineTopicStatsTest
```
✅ testPersistentOfflineTopicStats
```
-### ✅ org.apache.pulsar.common.policies.data.PersistentTopicStatsTest
+### ✅ org.apache.pulsar.common.policies.data.PersistentTopicStatsTest
```
✅ testPersistentTopicStatsAggregation
✅ testPersistentTopicStats
```
-### ✅ org.apache.pulsar.common.policies.data.PoliciesDataTest
+### ✅ org.apache.pulsar.common.policies.data.PoliciesDataTest
```
✅ propertyAdmin
✅ policies
✅ bundlesData
✅ bundlesPolicies
```
-### ✅ org.apache.pulsar.common.policies.data.PublisherStatsTest
+### ✅ org.apache.pulsar.common.policies.data.PublisherStatsTest
```
✅ testPublisherStats
✅ testPublisherStatsAggregation
```
-### ✅ org.apache.pulsar.common.policies.data.ReplicatorStatsTest
+### ✅ org.apache.pulsar.common.policies.data.ReplicatorStatsTest
```
✅ testReplicatorStatsAdd
✅ testReplicatorStatsNull
```
-### ✅ org.apache.pulsar.common.policies.data.ResourceQuotaTest
+### ✅ org.apache.pulsar.common.policies.data.ResourceQuotaTest
```
✅ testResourceQuotaDefault
✅ testResourceQuotaEqual
```
-### ✅ org.apache.pulsar.common.policies.data.RetentionPolicesTest
+### ✅ org.apache.pulsar.common.policies.data.RetentionPolicesTest
```
✅ testRetentionPolices
```
-### ✅ org.apache.pulsar.common.policies.impl.AutoFailoverPolicyFactoryTest
+### ✅ org.apache.pulsar.common.policies.impl.AutoFailoverPolicyFactoryTest
```
✅ testAutoFailoverPolicyFactory
```
-### ✅ org.apache.pulsar.common.policies.impl.MinAvailablePolicyTest
+### ✅ org.apache.pulsar.common.policies.impl.MinAvailablePolicyTest
```
✅ testMinAvailablePolicty
```
-### ✅ org.apache.pulsar.common.policies.impl.NamespaceIsolationPoliciesTest
+### ✅ org.apache.pulsar.common.policies.impl.NamespaceIsolationPoliciesTest
```
✅ testBrokerAssignment
✅ testGetNamespaceIsolationPolicyByName
@@ -986,7 +989,7 @@
✅ testDefaultConstructor
✅ testGetNamespaceIsolationPolicyByNamespace
```
-### ✅ org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicyImplTest
+### ✅ org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicyImplTest
```
✅ testFindBrokers
✅ testGetSecondaryBrokers
@@ -996,12 +999,12 @@
✅ testConstructor
✅ testIsPrimaryOrSecondaryBroker
```
-### ✅ org.apache.pulsar.common.protocol.ByteBufPairTest
+### ✅ org.apache.pulsar.common.protocol.ByteBufPairTest
```
✅ testEncoder
✅ testDoubleByteBuf
```
-### ✅ org.apache.pulsar.common.protocol.CommandUtilsTests
+### ✅ org.apache.pulsar.common.protocol.CommandUtilsTests
```
✅ testSkipBrokerEntryMetadata
✅ testPeekBrokerEntryMetadata
@@ -1011,7 +1014,7 @@
✅ testAddBrokerEntryMetadata
✅ testByteBufComposite
```
-### ✅ org.apache.pulsar.common.protocol.MarkersTest
+### ✅ org.apache.pulsar.common.protocol.MarkersTest
```
✅ testSnapshot
✅ testTxnAbortMarker
@@ -1020,25 +1023,25 @@
✅ testSnapshotRequest
✅ testSnapshotResponse
```
-### ✅ org.apache.pulsar.common.protocol.PulsarDecoderTest
+### ✅ org.apache.pulsar.common.protocol.PulsarDecoderTest
```
✅ testChannelRead
```
-### ✅ org.apache.pulsar.common.stats.JvmDefaultGCMetricsLoggerTest
+### ✅ org.apache.pulsar.common.stats.JvmDefaultGCMetricsLoggerTest
```
✅ testInvokeJVMInternals
```
-### ✅ org.apache.pulsar.common.util.collections.BitSetRecyclableRecyclableTest
+### ✅ org.apache.pulsar.common.util.collections.BitSetRecyclableRecyclableTest
```
✅ testResetWords
✅ testRecycle
```
-### ✅ org.apache.pulsar.common.util.collections.ConcurrentBitSetRecyclableTest
+### ✅ org.apache.pulsar.common.util.collections.ConcurrentBitSetRecyclableTest
```
✅ testRecycle
✅ testGenerateByBitSet
```
-### ✅ org.apache.pulsar.common.util.collections.ConcurrentLongHashMapTest
+### ✅ org.apache.pulsar.common.util.collections.ConcurrentLongHashMapTest
```
✅ testRehashingWithDeletes
✅ concurrentInsertionsAndReads
@@ -1054,7 +1057,7 @@
✅ stressConcurrentInsertionsAndReads
✅ testNegativeUsedBucketCount
```
-### ✅ org.apache.pulsar.common.util.collections.ConcurrentLongPairSetTest
+### ✅ org.apache.pulsar.common.util.collections.ConcurrentLongPairSetTest
```
✅ concurrentInsertionsAndReads
✅ testEqualsObjects
@@ -1072,7 +1075,7 @@
✅ testConstructor
✅ concurrentInsertions
```
-### ✅ org.apache.pulsar.common.util.collections.ConcurrentOpenHashMapTest
+### ✅ org.apache.pulsar.common.util.collections.ConcurrentOpenHashMapTest
```
✅ testRemove
✅ simpleInsertions
@@ -1087,7 +1090,7 @@
✅ concurrentInsertionsAndReads
✅ testConstructor
```
-### ✅ org.apache.pulsar.common.util.collections.ConcurrentOpenHashSetTest
+### ✅ org.apache.pulsar.common.util.collections.ConcurrentOpenHashSetTest
```
✅ concurrentInsertions
✅ testRehashing
@@ -1101,7 +1104,7 @@
✅ testRehashingWithDeletes
✅ testRemove
```
-### ✅ org.apache.pulsar.common.util.collections.ConcurrentOpenLongPairRangeSetTest
+### ✅ org.apache.pulsar.common.util.collections.ConcurrentOpenLongPairRangeSetTest
```
✅ testAddForDifferentKey
✅ testToString
@@ -1117,7 +1120,7 @@
✅ testDeleteWithAtMost
✅ testRangeContaining
```
-### ✅ org.apache.pulsar.common.util.collections.ConcurrentSortedLongPairSetTest
+### ✅ org.apache.pulsar.common.util.collections.ConcurrentSortedLongPairSetTest
```
✅ concurrentInsertions
✅ testIfRemoval
@@ -1129,12 +1132,12 @@
✅ testIteration
✅ testToString
```
-### ✅ org.apache.pulsar.common.util.collections.FieldParserTest
+### ✅ org.apache.pulsar.common.util.collections.FieldParserTest
```
✅ testUpdateObject
✅ testConversion
```
-### ✅ org.apache.pulsar.common.util.collections.GrowableArrayBlockingQueueTest
+### ✅ org.apache.pulsar.common.util.collections.GrowableArrayBlockingQueueTest
```
✅ removeTest
✅ growArray
@@ -1143,7 +1146,7 @@
✅ pollTimeout2
✅ blockingTake
```
-### ✅ org.apache.pulsar.common.util.collections.GrowablePriorityLongPairQueueTest
+### ✅ org.apache.pulsar.common.util.collections.GrowablePriorityLongPairQueueTest
```
✅ testItems
✅ testRemove
@@ -1161,17 +1164,17 @@
✅ testRemoval
✅ testIfRemoval
```
-### ✅ org.apache.pulsar.common.util.collections.TripleLongPriorityQueueTest
+### ✅ org.apache.pulsar.common.util.collections.TripleLongPriorityQueueTest
```
✅ testQueue
✅ testCheckForEmpty
✅ testCompareWithSamePrefix
```
-### ✅ org.apache.pulsar.common.util.FieldParserTest
+### ✅ org.apache.pulsar.common.util.FieldParserTest
```
✅ testMap
```
-### ✅ org.apache.pulsar.common.util.FileModifiedTimeUpdaterTest
+### ✅ org.apache.pulsar.common.util.FileModifiedTimeUpdaterTest
```
✅ testFileNotModified
✅ testFileModified
@@ -1180,7 +1183,7 @@
✅ testFileModified
✅ testFileNotModified
```
-### ✅ org.apache.pulsar.common.util.netty.ChannelFuturesTest
+### ✅ org.apache.pulsar.common.util.netty.ChannelFuturesTest
```
✅ toCompletableFuture_shouldCompleteExceptionally_channelFutureCompletedAfter
✅ toCompletableFuture_shouldCompleteSuccessfully_channelFutureCompletedAfter
@@ -1188,7 +1191,7 @@
✅ toCompletableFuture_shouldCompleteExceptionally_channelFutureCompletedBefore
✅ toCompletableFuture_shouldRequireNonNullArgument
```
-### ✅ org.apache.pulsar.common.util.RateLimiterTest
+### ✅ org.apache.pulsar.common.util.RateLimiterTest
```
✅ testMultipleTryAcquire
✅ testRateLimiterWithPermitUpdater
@@ -1202,7 +1205,7 @@
✅ testRateLimiterWithFunction
✅ testAcquireBlock
```
-### ✅ org.apache.pulsar.common.util.ReflectionsTest
+### ✅ org.apache.pulsar.common.util.ReflectionsTest
```
✅ testCreateInstanceNoNoArgConstructor
✅ testCreateInstanceConstructorThrowsException
@@ -1217,70 +1220,70 @@
✅ testLoadClass
✅ testClassInJarImplementsIface
```
-### ✅ org.apache.pulsar.common.util.RelativeTimeUtilTest
+### ✅ org.apache.pulsar.common.util.RelativeTimeUtilTest
```
✅ testParseRelativeTime
```
-### ✅ org.apache.pulsar.discovery.service.web.DiscoveryServiceWebTest
+### ✅ org.apache.pulsar.discovery.service.web.DiscoveryServiceWebTest
```
✅ testRedirectUrlWithServerStarted
```
-### ✅ org.apache.pulsar.functions.worker.PulsarFunctionE2ESecurityTest
+### ✅ org.apache.pulsar.functions.worker.PulsarFunctionE2ESecurityTest
```
✅ testAuthorizationWithAnonymousUser
✅ testAuthorization
```
-### ✅ org.apache.pulsar.functions.worker.PulsarFunctionPublishTest
+### ✅ org.apache.pulsar.functions.worker.PulsarFunctionPublishTest
```
✅ testPulsarFunctionState
✅ testMultipleAddress
✅ testPulsarFunctionBKCleanup
```
-### ✅ org.apache.pulsar.functions.worker.PulsarFunctionTlsTest
+### ✅ org.apache.pulsar.functions.worker.PulsarFunctionTlsTest
```
✅ testFunctionsCreation
```
-### ✅ org.apache.pulsar.io.PulsarFunctionTlsTest
+### ✅ org.apache.pulsar.io.PulsarFunctionTlsTest
```
✅ testAuthorization
```
-### ✅ org.apache.pulsar.proxy.server.AdminProxyHandlerTest
+### ✅ org.apache.pulsar.proxy.server.AdminProxyHandlerTest
```
✅ replayableProxyContentProviderTest
```
-### ✅ org.apache.pulsar.proxy.server.AuthedAdminProxyHandlerTest
+### ✅ org.apache.pulsar.proxy.server.AuthedAdminProxyHandlerTest
```
✅ testAuthenticatedProxyAsNonAdmin
```
-### ✅ org.apache.pulsar.proxy.server.FunctionWorkerRoutingTest
+### ✅ org.apache.pulsar.proxy.server.FunctionWorkerRoutingTest
```
✅ testFunctionWorkerRedirect
```
-### ✅ org.apache.pulsar.proxy.server.ProxyAdditionalServletTest
+### ✅ org.apache.pulsar.proxy.server.ProxyAdditionalServletTest
```
✅ test
```
-### ✅ org.apache.pulsar.proxy.server.ProxyAuthenticatedProducerConsumerTest
+### ✅ org.apache.pulsar.proxy.server.ProxyAuthenticatedProducerConsumerTest
```
✅ testTlsSyncProducerAndConsumer
```
-### ✅ org.apache.pulsar.proxy.server.ProxyAuthenticationTest
+### ✅ org.apache.pulsar.proxy.server.ProxyAuthenticationTest
```
✅ testAuthentication
```
-### ✅ org.apache.pulsar.proxy.server.ProxyConnectionThrottlingTest
+### ✅ org.apache.pulsar.proxy.server.ProxyConnectionThrottlingTest
```
✅ testInboundConnection
```
-### ✅ org.apache.pulsar.proxy.server.ProxyEnableHAProxyProtocolTest
+### ✅ org.apache.pulsar.proxy.server.ProxyEnableHAProxyProtocolTest
```
✅ testSimpleProduceAndConsume
```
-### ✅ org.apache.pulsar.proxy.server.ProxyForwardAuthDataTest
+### ✅ org.apache.pulsar.proxy.server.ProxyForwardAuthDataTest
```
✅ testForwardAuthData
```
-### ✅ org.apache.pulsar.proxy.server.ProxyIsAHttpProxyTest
+### ✅ org.apache.pulsar.proxy.server.ProxyIsAHttpProxyTest
```
✅ testProxyToEndsInSlash
✅ testStreaming
@@ -1293,23 +1296,23 @@
✅ testSingleRedirect
✅ testRedirectNotSpecified
```
-### ✅ org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithAuth
+### ✅ org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithAuth
```
✅ testProducerFailed
✅ testPartitions
✅ testProducer
```
-### ✅ org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithoutAuth
+### ✅ org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithoutAuth
```
✅ testPartitions
✅ testProducerFailed
✅ testProducer
```
-### ✅ org.apache.pulsar.proxy.server.ProxyLookupThrottlingTest
+### ✅ org.apache.pulsar.proxy.server.ProxyLookupThrottlingTest
```
✅ testLookup
```
-### ✅ org.apache.pulsar.proxy.server.ProxyParserTest
+### ✅ org.apache.pulsar.proxy.server.ProxyParserTest
```
✅ testRegexSubscription
✅ testProducerConsumer
@@ -1317,17 +1320,17 @@
✅ testPartitions
✅ testProtocolVersionAdvertisement
```
-### ✅ org.apache.pulsar.proxy.server.ProxyRolesEnforcementTest
+### ✅ org.apache.pulsar.proxy.server.ProxyRolesEnforcementTest
```
✅ testIncorrectRoles
```
-### ✅ org.apache.pulsar.proxy.server.ProxyStatsTest
+### ✅ org.apache.pulsar.proxy.server.ProxyStatsTest
```
✅ testChangeLogLevel
✅ testConnectionsStats
✅ testTopicStats
```
-### ✅ org.apache.pulsar.proxy.server.ProxyTest
+### ✅ org.apache.pulsar.proxy.server.ProxyTest
```
✅ testPartitions
✅ testRegexSubscription
@@ -1336,20 +1339,20 @@
✅ testProducer
✅ testProducerConsumer
```
-### ✅ org.apache.pulsar.proxy.server.ProxyTlsTest
+### ✅ org.apache.pulsar.proxy.server.ProxyTlsTest
```
✅ testProducer
✅ testPartitions
```
-### ✅ org.apache.pulsar.proxy.server.ProxyTlsTestWithAuth
+### ✅ org.apache.pulsar.proxy.server.ProxyTlsTestWithAuth
```
✅ testServiceStartup
```
-### ✅ org.apache.pulsar.proxy.server.ProxyWithAuthorizationNegTest
+### ✅ org.apache.pulsar.proxy.server.ProxyWithAuthorizationNegTest
```
✅ testProxyAuthorization
```
-### ✅ org.apache.pulsar.proxy.server.ProxyWithAuthorizationTest
+### ✅ org.apache.pulsar.proxy.server.ProxyWithAuthorizationTest
```
✅ tlsCiphersAndProtocols
✅ testTlsHostVerificationProxyToClient
@@ -1365,22 +1368,22 @@
✅ testTlsHostVerificationProxyToClient
✅ tlsCiphersAndProtocols
```
-### ✅ org.apache.pulsar.proxy.server.ProxyWithoutServiceDiscoveryTest
+### ✅ org.apache.pulsar.proxy.server.ProxyWithoutServiceDiscoveryTest
```
✅ testDiscoveryService
```
-### ✅ org.apache.pulsar.proxy.server.SuperUserAuthedAdminProxyHandlerTest
+### ✅ org.apache.pulsar.proxy.server.SuperUserAuthedAdminProxyHandlerTest
```
✅ testAuthWithRandoCert
✅ testAuthenticatedProxyAsAdmin
✅ testAuthenticatedProxyAsNonAdmin
```
-### ✅ org.apache.pulsar.proxy.server.UnauthedAdminProxyHandlerTest
+### ✅ org.apache.pulsar.proxy.server.UnauthedAdminProxyHandlerTest
```
✅ testUnauthenticatedProxy
✅ testVipStatus
```
-### ✅ org.apache.pulsar.PulsarBrokerStarterTest
+### ✅ org.apache.pulsar.PulsarBrokerStarterTest
```
✅ testMainRunBookieNoConfig
✅ testLoadConfigWithException
@@ -1392,7 +1395,7 @@
✅ testMainEnableRunBookieThroughBrokerConfig
✅ testMainRunBookieAndAutoRecoveryNoConfig
```
-### ✅ org.apache.pulsar.schema.compatibility.SchemaCompatibilityCheckTest
+### ✅ org.apache.pulsar.schema.compatibility.SchemaCompatibilityCheckTest
```
✅ testConsumerCompatibilityCheckCanReadLastTest
✅ testConsumerWithNotCompatibilitySchema
@@ -1418,22 +1421,22 @@
✅ testConsumerCompatibilityCheckCanReadLastTest
✅ testIsAutoUpdateSchema
```
-### ✅ org.apache.pulsar.schema.PartitionedTopicSchemaTest
+### ✅ org.apache.pulsar.schema.PartitionedTopicSchemaTest
```
✅ test
```
-### ✅ org.apache.pulsar.schema.SchemaTest
+### ✅ org.apache.pulsar.schema.SchemaTest
```
✅ testIsUsingAvroSchemaParser
✅ testBytesSchemaDeserialize
✅ testMultiTopicSetSchemaProvider
```
-### ✅ org.apache.pulsar.stats.client.PulsarBrokerStatsClientTest
+### ✅ org.apache.pulsar.stats.client.PulsarBrokerStatsClientTest
```
✅ testServiceException
✅ testTopicInternalStats
```
-### ✅ org.apache.pulsar.tests.EnumValuesDataProviderTest
+### ✅ org.apache.pulsar.tests.EnumValuesDataProviderTest
```
✅ shouldFailIfEnumParameterIsMissing
✅ testEnumValuesProvider
@@ -1442,7 +1445,7 @@
✅ shouldContainAllEnumValues
✅ testEnumValuesProvider
```
-### ✅ org.apache.pulsar.tests.TestRetrySupportBeforeMethodRetryTest
+### ✅ org.apache.pulsar.tests.TestRetrySupportBeforeMethodRetryTest
```
✅ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod
⚪ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod
@@ -1450,7 +1453,7 @@
⚪ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod
⚪ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod
```
-### ✅ org.apache.pulsar.tests.TestRetrySupportRetryTest
+### ✅ org.apache.pulsar.tests.TestRetrySupportRetryTest
```
⚪ shouldCallSetupBeforeRetrying
✅ shouldCallSetupBeforeRetrying
@@ -1458,25 +1461,25 @@
⚪ shouldCallSetupBeforeRetrying
⚪ shouldCallSetupBeforeRetrying
```
-### ✅ org.apache.pulsar.tests.TestRetrySupportSuccessTest
+### ✅ org.apache.pulsar.tests.TestRetrySupportSuccessTest
```
✅ shouldCallSetupOnce1
✅ shouldCallSetupOnce3
✅ shouldCallSetupOnce2
```
-### ✅ org.apache.pulsar.tests.ThreadDumpUtilTest
+### ✅ org.apache.pulsar.tests.ThreadDumpUtilTest
```
✅ testHelp
✅ testThreadDump
```
-### ✅ org.apache.pulsar.utils.SimpleTextOutputStreamTest
+### ✅ org.apache.pulsar.utils.SimpleTextOutputStreamTest
```
✅ testBooleanFormat
✅ testDoubleFormat
✅ testLongFormat
✅ testString
```
-### ✅ org.apache.pulsar.utils.StatsOutputStreamTest
+### ✅ org.apache.pulsar.utils.StatsOutputStreamTest
```
✅ testLists
✅ testNamedObjects
@@ -1485,31 +1488,31 @@
✅ testPairs
✅ testObjects
```
-### ✅ org.apache.pulsar.websocket.proxy.ProxyAuthenticationTest
+### ✅ org.apache.pulsar.websocket.proxy.ProxyAuthenticationTest
```
✅ unauthenticatedSocketTest
✅ authenticatedSocketTest
✅ statsTest
✅ anonymousSocketTest
```
-### ✅ org.apache.pulsar.websocket.proxy.ProxyAuthorizationTest
+### ✅ org.apache.pulsar.websocket.proxy.ProxyAuthorizationTest
```
✅ test
```
-### ✅ org.apache.pulsar.websocket.proxy.ProxyConfigurationTest
+### ✅ org.apache.pulsar.websocket.proxy.ProxyConfigurationTest
```
✅ configTest
✅ configTest
```
-### ✅ org.apache.pulsar.websocket.proxy.ProxyPublishConsumeTlsTest
+### ✅ org.apache.pulsar.websocket.proxy.ProxyPublishConsumeTlsTest
```
✅ socketTest
```
-### ✅ org.apache.pulsar.websocket.proxy.ProxyPublishConsumeWithoutZKTest
+### ✅ org.apache.pulsar.websocket.proxy.ProxyPublishConsumeWithoutZKTest
```
✅ socketTest
```
-### ✅ org.apache.pulsar.websocket.proxy.v1.V1_ProxyAuthenticationTest
+### ✅ org.apache.pulsar.websocket.proxy.v1.V1_ProxyAuthenticationTest
```
✅ anonymousSocketTest
✅ authenticatedSocketTest
diff --git a/__tests__/__outputs__/python-xunit-pytest.md b/__tests__/__outputs__/python-xunit-pytest.md
new file mode 100644
index 0000000..7b13e28
--- /dev/null
+++ b/__tests__/__outputs__/python-xunit-pytest.md
@@ -0,0 +1,26 @@
+
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/python-xunit-pytest.xml](#user-content-r0)|6 ✅|2 ❌|2 ⚪|19ms|
+## ❌ fixtures/python-xunit-pytest.xml
+**10** tests were completed in **19ms** with **6** passed, **2** failed and **2** skipped.
+|Test suite|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[pytest](#user-content-r0s0)|6 ✅|2 ❌|2 ⚪|19ms|
+### ❌ pytest
+```
+tests.test_lib
+ ✅ test_always_pass
+ ✅ test_with_subtests
+ ✅ test_parameterized[param1]
+ ✅ test_parameterized[param2]
+ ⚪ test_always_skip
+ ❌ test_always_fail
+ assert False
+ ⚪ test_expected_failure
+ ❌ test_error
+ Exception: error
+ ✅ test_with_record_property
+custom_classname
+ ✅ test_with_record_xml_attribute
+```
\ No newline at end of file
diff --git a/__tests__/__outputs__/python-xunit-unittest.md b/__tests__/__outputs__/python-xunit-unittest.md
new file mode 100644
index 0000000..230d186
--- /dev/null
+++ b/__tests__/__outputs__/python-xunit-unittest.md
@@ -0,0 +1,23 @@
+
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/python-xunit-unittest.xml](#user-content-r0)|4 ✅|2 ❌|2 ⚪|1ms|
+## ❌ fixtures/python-xunit-unittest.xml
+**8** tests were completed in **1ms** with **4** passed, **2** failed and **2** skipped.
+|Test suite|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[TestAcme-20251114214921](#user-content-r0s0)|4 ✅|2 ❌|2 ⚪|1ms|
+### ❌ TestAcme-20251114214921
+```
+TestAcme
+ ✅ test_always_pass
+ ✅ test_parameterized_0_param1
+ ✅ test_parameterized_1_param2
+ ✅ test_with_subtests
+ ❌ test_always_fail
+ AssertionError: failed
+ ❌ test_error
+ Exception: error
+ ⚪ test_always_skip
+ ⚪ test_expected_failure
+```
\ No newline at end of file
diff --git a/__tests__/__outputs__/rspec-json.md b/__tests__/__outputs__/rspec-json.md
index 04bae8a..d64cf44 100644
--- a/__tests__/__outputs__/rspec-json.md
+++ b/__tests__/__outputs__/rspec-json.md
@@ -1,10 +1,13 @@

-## ❌ fixtures/rspec-json.json
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/rspec-json.json](#user-content-r0)|1 ✅|1 ❌|1 ⚪|0ms|
+## ❌ fixtures/rspec-json.json
**3** tests were completed in **0ms** with **1** passed, **1** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[./spec/config/check_env_vars_spec.rb](#r0s0)|1✅|1❌|1⚪|0ms|
-### ❌ ./spec/config/check_env_vars_spec.rb
+|[./spec/config/check_env_vars_spec.rb](#user-content-r0s0)|1 ✅|1 ❌|1 ⚪|0ms|
+### ❌ ./spec/config/check_env_vars_spec.rb
```
CheckEnvVars#call when all env vars are defined behaves like success load
❌ CheckEnvVars#call when all env vars are defined behaves like success load fails in assertion
diff --git a/__tests__/__outputs__/silent-notes-test-results.md b/__tests__/__outputs__/silent-notes-test-results.md
index 7d4d4ac..e3abc49 100644
--- a/__tests__/__outputs__/silent-notes-test-results.md
+++ b/__tests__/__outputs__/silent-notes-test-results.md
@@ -1,22 +1,27 @@

-## ✅ fixtures/external/SilentNotes.trx
+Expand for details
+
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/external/SilentNotes.trx](#user-content-r0)|67 ✅||12 ⚪|1s|
+## ✅ fixtures/external/SilentNotes.trx
**79** tests were completed in **1s** with **67** passed, **0** failed and **12** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[VanillaCloudStorageClientTest.CloudStorageCredentialsTest](#r0s0)|6✅|||30ms|
-|[VanillaCloudStorageClientTest.CloudStorageProviders.DropboxCloudStorageClientTest](#r0s1)|2✅||3⚪|101ms|
-|[VanillaCloudStorageClientTest.CloudStorageProviders.FtpCloudStorageClientTest](#r0s2)|4✅||3⚪|166ms|
-|[VanillaCloudStorageClientTest.CloudStorageProviders.GmxCloudStorageClientTest](#r0s3)|2✅|||7ms|
-|[VanillaCloudStorageClientTest.CloudStorageProviders.GoogleCloudStorageClientTest](#r0s4)|1✅||3⚪|40ms|
-|[VanillaCloudStorageClientTest.CloudStorageProviders.OnedriveCloudStorageClientTest](#r0s5)|1✅||3⚪|15ms|
-|[VanillaCloudStorageClientTest.CloudStorageProviders.WebdavCloudStorageClientTest](#r0s6)|5✅|||16ms|
-|[VanillaCloudStorageClientTest.CloudStorageTokenTest](#r0s7)|9✅|||0ms|
-|[VanillaCloudStorageClientTest.OAuth2.AuthorizationResponseErrorTest](#r0s8)|3✅|||3ms|
-|[VanillaCloudStorageClientTest.OAuth2.OAuth2UtilsTest](#r0s9)|9✅|||12ms|
-|[VanillaCloudStorageClientTest.OAuth2CloudStorageClientTest](#r0s10)|5✅|||13ms|
-|[VanillaCloudStorageClientTest.SecureStringExtensionsTest](#r0s11)|7✅|||0ms|
-|[VanillaCloudStorageClientTest.SerializeableCloudStorageCredentialsTest](#r0s12)|13✅|||43ms|
-### ✅ VanillaCloudStorageClientTest.CloudStorageCredentialsTest
+|[VanillaCloudStorageClientTest.CloudStorageCredentialsTest](#user-content-r0s0)|6 ✅|||30ms|
+|[VanillaCloudStorageClientTest.CloudStorageProviders.DropboxCloudStorageClientTest](#user-content-r0s1)|2 ✅||3 ⚪|101ms|
+|[VanillaCloudStorageClientTest.CloudStorageProviders.FtpCloudStorageClientTest](#user-content-r0s2)|4 ✅||3 ⚪|166ms|
+|[VanillaCloudStorageClientTest.CloudStorageProviders.GmxCloudStorageClientTest](#user-content-r0s3)|2 ✅|||7ms|
+|[VanillaCloudStorageClientTest.CloudStorageProviders.GoogleCloudStorageClientTest](#user-content-r0s4)|1 ✅||3 ⚪|40ms|
+|[VanillaCloudStorageClientTest.CloudStorageProviders.OnedriveCloudStorageClientTest](#user-content-r0s5)|1 ✅||3 ⚪|15ms|
+|[VanillaCloudStorageClientTest.CloudStorageProviders.WebdavCloudStorageClientTest](#user-content-r0s6)|5 ✅|||16ms|
+|[VanillaCloudStorageClientTest.CloudStorageTokenTest](#user-content-r0s7)|9 ✅|||0ms|
+|[VanillaCloudStorageClientTest.OAuth2.AuthorizationResponseErrorTest](#user-content-r0s8)|3 ✅|||3ms|
+|[VanillaCloudStorageClientTest.OAuth2.OAuth2UtilsTest](#user-content-r0s9)|9 ✅|||12ms|
+|[VanillaCloudStorageClientTest.OAuth2CloudStorageClientTest](#user-content-r0s10)|5 ✅|||13ms|
+|[VanillaCloudStorageClientTest.SecureStringExtensionsTest](#user-content-r0s11)|7 ✅|||0ms|
+|[VanillaCloudStorageClientTest.SerializeableCloudStorageCredentialsTest](#user-content-r0s12)|13 ✅|||43ms|
+### ✅ VanillaCloudStorageClientTest.CloudStorageCredentialsTest
```
✅ AreEqualWorksWithDifferentPassword
✅ AreEqualWorksWithSameContent
@@ -25,7 +30,7 @@
✅ ValidateAcceptsValidCredentials
✅ ValidateRejectsInvalidCredentials
```
-### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.DropboxCloudStorageClientTest
+### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.DropboxCloudStorageClientTest
```
✅ FileLifecycleWorks
⚪ ReallyDoFetchToken
@@ -33,7 +38,7 @@
⚪ ReallyDoRefreshToken
✅ ThrowsAccessDeniedExceptionWithInvalidToken
```
-### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.FtpCloudStorageClientTest
+### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.FtpCloudStorageClientTest
```
✅ FileLifecycleWorks
✅ SanitizeCredentials_ChangesInvalidPrefix
@@ -43,26 +48,26 @@
⚪ ThrowsWithInvalidUrl
⚪ ThrowsWithInvalidUsername
```
-### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.GmxCloudStorageClientTest
+### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.GmxCloudStorageClientTest
```
✅ ChoosesCorrectUrlForGmxComEmail
✅ ChoosesCorrectUrlForGmxNetEmail
```
-### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.GoogleCloudStorageClientTest
+### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.GoogleCloudStorageClientTest
```
✅ FileLifecycleWorks
⚪ ReallyDoFetchToken
⚪ ReallyDoOpenAuthorizationPageInBrowser
⚪ ReallyDoRefreshToken
```
-### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.OnedriveCloudStorageClientTest
+### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.OnedriveCloudStorageClientTest
```
✅ FileLifecycleWorks
⚪ ReallyDoFetchToken
⚪ ReallyDoOpenAuthorizationPageInBrowser
⚪ ReallyDoRefreshToken
```
-### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.WebdavCloudStorageClientTest
+### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.WebdavCloudStorageClientTest
```
✅ FileLifecycleWorks
✅ ParseGmxWebdavResponseCorrectly
@@ -70,7 +75,7 @@
✅ ThrowsWithInvalidPath
✅ ThrowsWithInvalidUsername
```
-### ✅ VanillaCloudStorageClientTest.CloudStorageTokenTest
+### ✅ VanillaCloudStorageClientTest.CloudStorageTokenTest
```
✅ AreEqualWorksWithNullDate
✅ AreEqualWorksWithSameContent
@@ -82,13 +87,13 @@
✅ SetExpiryDateBySecondsWorksWithNull
✅ SetExpiryDateBySecondsWorksWithVeryShortPeriod
```
-### ✅ VanillaCloudStorageClientTest.OAuth2.AuthorizationResponseErrorTest
+### ✅ VanillaCloudStorageClientTest.OAuth2.AuthorizationResponseErrorTest
```
✅ ParsesAllErrorCodesCorrectly
✅ ParsesNullErrorCodeCorrectly
✅ ParsesUnknownErrorCodeCorrectly
```
-### ✅ VanillaCloudStorageClientTest.OAuth2.OAuth2UtilsTest
+### ✅ VanillaCloudStorageClientTest.OAuth2.OAuth2UtilsTest
```
✅ BuildAuthorizationRequestUrlEscapesParameters
✅ BuildAuthorizationRequestUrlLeavesOutOptionalParameters
@@ -100,7 +105,7 @@
✅ ParseRealWorldGoogleRejectResponse
✅ ParseRealWorldGoogleSuccessResponse
```
-### ✅ VanillaCloudStorageClientTest.OAuth2CloudStorageClientTest
+### ✅ VanillaCloudStorageClientTest.OAuth2CloudStorageClientTest
```
✅ BuildOAuth2AuthorizationRequestUrlWorks
✅ FetchTokenCanInterpretGoogleResponse
@@ -108,7 +113,7 @@
✅ FetchTokenThrowsWithWrongState
✅ RefreshTokenCanInterpretGoogleResponse
```
-### ✅ VanillaCloudStorageClientTest.SecureStringExtensionsTest
+### ✅ VanillaCloudStorageClientTest.SecureStringExtensionsTest
```
✅ AreEqualsWorksCorrectly
✅ CorrectlyConvertsSecureStringToString
@@ -118,7 +123,7 @@
✅ CorrectlyConvertsUnicodeBytesToSecureString
✅ CorrectlyConvertsUtf8BytesToSecureString
```
-### ✅ VanillaCloudStorageClientTest.SerializeableCloudStorageCredentialsTest
+### ✅ VanillaCloudStorageClientTest.SerializeableCloudStorageCredentialsTest
```
✅ DecryptAfterDesrializationCanReadAllPropertiesBack
✅ DecryptAfterDesrializationRespectsNullProperties
@@ -133,4 +138,5 @@
✅ SerializedXmlCanBeReadBack
✅ SerializedXmlDoesNotContainNullProperties
✅ SerializedXmlDoesNotContainPlaintextData
-```
\ No newline at end of file
+```
+
\ No newline at end of file
diff --git a/__tests__/__outputs__/swift-xunit.md b/__tests__/__outputs__/swift-xunit.md
index ecafaf9..b001151 100644
--- a/__tests__/__outputs__/swift-xunit.md
+++ b/__tests__/__outputs__/swift-xunit.md
@@ -1,13 +1,17 @@

-## ❌ fixtures/swift-xunit.xml
+|Report|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[fixtures/swift-xunit.xml](#user-content-r0)|2 ✅|1 ❌||220ms|
+## ❌ fixtures/swift-xunit.xml
**3** tests were completed in **220ms** with **2** passed, **1** failed and **0** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[TestResults](#r0s0)|2✅|1❌||220ms|
-### ❌ TestResults
+|[TestResults](#user-content-r0s0)|2 ✅|1 ❌||220ms|
+### ❌ TestResults
```
AcmeLibTests.AcmeLibTests
✅ test_always_pass
✅ test_always_skip
❌ test_always_fail
+ failed
```
\ No newline at end of file
diff --git a/__tests__/__snapshots__/dart-json.test.ts.snap b/__tests__/__snapshots__/dart-json.test.ts.snap
index a499822..88a7349 100644
--- a/__tests__/__snapshots__/dart-json.test.ts.snap
+++ b/__tests__/__snapshots__/dart-json.test.ts.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`dart-json tests matches report snapshot 1`] = `
TestRunResult {
diff --git a/__tests__/__snapshots__/dotnet-nunit.test.ts.snap b/__tests__/__snapshots__/dotnet-nunit.test.ts.snap
new file mode 100644
index 0000000..529f702
--- /dev/null
+++ b/__tests__/__snapshots__/dotnet-nunit.test.ts.snap
@@ -0,0 +1,107 @@
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
+
+exports[`dotnet-nunit tests report from ./reports/dotnet test results matches snapshot 1`] = `
+TestRunResult {
+ "path": "fixtures/dotnet-nunit.xml",
+ "suites": [
+ TestSuiteResult {
+ "groups": [
+ TestGroupResult {
+ "name": "CalculatorTests",
+ "tests": [
+ TestCaseResult {
+ "error": undefined,
+ "name": "Is_Even_Number(2)",
+ "result": "success",
+ "time": 0.622,
+ },
+ TestCaseResult {
+ "error": {
+ "details": " at DotnetTests.XUnitTests.CalculatorTests.Is_Even_Number(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.NUnitV3Tests\\CalculatorTests.cs:line 61
+",
+ "line": undefined,
+ "message": " Expected: True
+ But was: False
+",
+ "path": undefined,
+ },
+ "name": "Is_Even_Number(3)",
+ "result": "failed",
+ "time": 1.098,
+ },
+ TestCaseResult {
+ "error": {
+ "details": " at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.Unit\\Calculator.cs:line 9
+ at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.NUnitV3Tests\\CalculatorTests.cs:line 33",
+ "line": undefined,
+ "message": "System.DivideByZeroException : Attempted to divide by zero.",
+ "path": undefined,
+ },
+ "name": "Exception_In_TargetTest",
+ "result": "failed",
+ "time": 22.805,
+ },
+ TestCaseResult {
+ "error": {
+ "details": " at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.NUnitV3Tests\\CalculatorTests.cs:line 39",
+ "line": undefined,
+ "message": "System.Exception : Test",
+ "path": undefined,
+ },
+ "name": "Exception_In_Test",
+ "result": "failed",
+ "time": 0.528,
+ },
+ TestCaseResult {
+ "error": {
+ "details": " at DotnetTests.XUnitTests.CalculatorTests.Failing_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.NUnitV3Tests\\CalculatorTests.cs:line 27
+",
+ "line": undefined,
+ "message": " Expected: 3
+ But was: 2
+",
+ "path": undefined,
+ },
+ "name": "Failing_Test",
+ "result": "failed",
+ "time": 28.162,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "Passing_Test",
+ "result": "success",
+ "time": 0.23800000000000002,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "Passing_Test_With_Description",
+ "result": "success",
+ "time": 0.135,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "Skipped_Test",
+ "result": "skipped",
+ "time": 0.398,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "",
+ "line": undefined,
+ "message": "",
+ "path": undefined,
+ },
+ "name": "Timeout_Test",
+ "result": "failed",
+ "time": 14.949,
+ },
+ ],
+ },
+ ],
+ "name": "DotnetTests.NUnitV3Tests.dll.DotnetTests.XUnitTests",
+ "totalTime": undefined,
+ },
+ ],
+ "totalTime": 230.30800000000002,
+}
+`;
diff --git a/__tests__/__snapshots__/dotnet-trx.test.ts.snap b/__tests__/__snapshots__/dotnet-trx.test.ts.snap
index 1ca07eb..b9d272d 100644
--- a/__tests__/__snapshots__/dotnet-trx.test.ts.snap
+++ b/__tests__/__snapshots__/dotnet-trx.test.ts.snap
@@ -1,6 +1,6 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
-exports[`dotnet-trx tests matches report snapshot 1`] = `
+exports[`dotnet-trx tests matches dotnet-trx report snapshot 1`] = `
TestRunResult {
"path": "fixtures/dotnet-trx.trx",
"suites": [
@@ -21,7 +21,9 @@ TestRunResult {
at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.Unit\\Calculator.cs:line 9
at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 33",
"line": 9,
- "message": "System.DivideByZeroException : Attempted to divide by zero.",
+ "message": "System.DivideByZeroException : Attempted to divide by zero.
+ at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.Unit\\Calculator.cs:line 9
+ at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 33",
"path": "DotnetTests.Unit/Calculator.cs",
},
"name": "Exception_In_TargetTest",
@@ -33,7 +35,8 @@ TestRunResult {
"details": "System.Exception : Test
at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 39",
"line": 39,
- "message": "System.Exception : Test",
+ "message": "System.Exception : Test
+ at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 39",
"path": "DotnetTests.XUnitTests/CalculatorTests.cs",
},
"name": "Exception_In_Test",
@@ -49,7 +52,8 @@ Actual: 2
"line": 27,
"message": "Assert.Equal() Failure
Expected: 3
-Actual: 2",
+Actual: 2
+ at DotnetTests.XUnitTests.CalculatorTests.Failing_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 27",
"path": "DotnetTests.XUnitTests/CalculatorTests.cs",
},
"name": "Failing_Test",
@@ -71,7 +75,8 @@ Actual: False
"line": 59,
"message": "Assert.True() Failure
Expected: True
-Actual: False",
+Actual: False
+ at DotnetTests.XUnitTests.CalculatorTests.Is_Even_Number(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 59",
"path": "DotnetTests.XUnitTests/CalculatorTests.cs",
},
"name": "Is_Even_Number(i: 3)",
@@ -99,7 +104,213 @@ Actual: False
"line": 67,
"message": "Assert.True() Failure
Expected: True
-Actual: False",
+Actual: False
+ at DotnetTests.XUnitTests.CalculatorTests.Theory_With_Custom_Name(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 67",
+ "path": "DotnetTests.XUnitTests/CalculatorTests.cs",
+ },
+ "name": "Should be even number(i: 3)",
+ "result": "failed",
+ "time": 0.6537000000000001,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "Skipped_Test",
+ "result": "skipped",
+ "time": 1,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "Timeout_Test",
+ "result": "success",
+ "time": 108.42580000000001,
+ },
+ ],
+ },
+ ],
+ "name": "DotnetTests.XUnitTests.CalculatorTests",
+ "totalTime": undefined,
+ },
+ ],
+ "totalTime": 1116,
+}
+`;
+
+exports[`dotnet-trx tests matches dotnet-xunitv3 report snapshot 1`] = `
+TestRunResult {
+ "path": "fixtures/dotnet-xunitv3.trx",
+ "suites": [
+ TestSuiteResult {
+ "groups": [
+ TestGroupResult {
+ "name": null,
+ "tests": [
+ TestCaseResult {
+ "error": {
+ "details": "Assert.Null() Failure: Value is not null
+Expected: null
+Actual: Fixture { }
+ at DotnetTests.XUnitV3Tests.FixtureTests.Failing_Test() in /_/reports/dotnet/DotnetTests.XUnitV3Tests/FixtureTests.cs:line 25
+ at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
+ at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)",
+ "line": 25,
+ "message": "Assert.Null() Failure: Value is not null
+Expected: null
+Actual: Fixture { }
+ at DotnetTests.XUnitV3Tests.FixtureTests.Failing_Test() in /_/reports/dotnet/DotnetTests.XUnitV3Tests/FixtureTests.cs:line 25
+ at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
+ at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)",
+ "path": "DotnetTests.XUnitV3Tests/FixtureTests.cs",
+ },
+ "name": "Failing_Test",
+ "result": "failed",
+ "time": 17.0545,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "Passing_Test",
+ "result": "success",
+ "time": 0.8786,
+ },
+ ],
+ },
+ ],
+ "name": "DotnetTests.XUnitV3Tests.FixtureTests",
+ "totalTime": undefined,
+ },
+ TestSuiteResult {
+ "groups": [
+ TestGroupResult {
+ "name": null,
+ "tests": [
+ TestCaseResult {
+ "error": undefined,
+ "name": "[Test Class Cleanup Failure (DotnetTests.XUnitV3Tests.FixtureTests.Failing_Test)]",
+ "result": "failed",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "[Test Class Cleanup Failure (DotnetTests.XUnitV3Tests.FixtureTests.Passing_Test)]",
+ "result": "failed",
+ "time": 0,
+ },
+ ],
+ },
+ ],
+ "name": "Unclassified",
+ "totalTime": undefined,
+ },
+ ],
+ "totalTime": 267,
+}
+`;
+
+exports[`dotnet-trx tests matches report snapshot (only failed tests) 1`] = `
+TestRunResult {
+ "path": "fixtures/dotnet-trx.trx",
+ "suites": [
+ TestSuiteResult {
+ "groups": [
+ TestGroupResult {
+ "name": null,
+ "tests": [
+ TestCaseResult {
+ "error": undefined,
+ "name": "Custom Name",
+ "result": "success",
+ "time": 0.1371,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "System.DivideByZeroException : Attempted to divide by zero.
+ at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.Unit\\Calculator.cs:line 9
+ at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 33",
+ "line": 9,
+ "message": "System.DivideByZeroException : Attempted to divide by zero.
+ at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.Unit\\Calculator.cs:line 9
+ at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 33",
+ "path": "DotnetTests.Unit/Calculator.cs",
+ },
+ "name": "Exception_In_TargetTest",
+ "result": "failed",
+ "time": 0.8377,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "System.Exception : Test
+ at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 39",
+ "line": 39,
+ "message": "System.Exception : Test
+ at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 39",
+ "path": "DotnetTests.XUnitTests/CalculatorTests.cs",
+ },
+ "name": "Exception_In_Test",
+ "result": "failed",
+ "time": 2.5175,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "Assert.Equal() Failure
+Expected: 3
+Actual: 2
+ at DotnetTests.XUnitTests.CalculatorTests.Failing_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 27",
+ "line": 27,
+ "message": "Assert.Equal() Failure
+Expected: 3
+Actual: 2
+ at DotnetTests.XUnitTests.CalculatorTests.Failing_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 27",
+ "path": "DotnetTests.XUnitTests/CalculatorTests.cs",
+ },
+ "name": "Failing_Test",
+ "result": "failed",
+ "time": 3.8697,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "Is_Even_Number(i: 2)",
+ "result": "success",
+ "time": 0.0078,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "Assert.True() Failure
+Expected: True
+Actual: False
+ at DotnetTests.XUnitTests.CalculatorTests.Is_Even_Number(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 59",
+ "line": 59,
+ "message": "Assert.True() Failure
+Expected: True
+Actual: False
+ at DotnetTests.XUnitTests.CalculatorTests.Is_Even_Number(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 59",
+ "path": "DotnetTests.XUnitTests/CalculatorTests.cs",
+ },
+ "name": "Is_Even_Number(i: 3)",
+ "result": "failed",
+ "time": 0.41409999999999997,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "Passing_Test",
+ "result": "success",
+ "time": 0.1365,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "Should be even number(i: 2)",
+ "result": "success",
+ "time": 0.0097,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "Assert.True() Failure
+Expected: True
+Actual: False
+ at DotnetTests.XUnitTests.CalculatorTests.Theory_With_Custom_Name(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 67",
+ "line": 67,
+ "message": "Assert.True() Failure
+Expected: True
+Actual: False
+ at DotnetTests.XUnitTests.CalculatorTests.Theory_With_Custom_Name(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 67",
"path": "DotnetTests.XUnitTests/CalculatorTests.cs",
},
"name": "Should be even number(i: 3)",
diff --git a/__tests__/__snapshots__/golang-json.test.ts.snap b/__tests__/__snapshots__/golang-json.test.ts.snap
new file mode 100644
index 0000000..bd28d4a
--- /dev/null
+++ b/__tests__/__snapshots__/golang-json.test.ts.snap
@@ -0,0 +1,131 @@
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
+
+exports[`golang-json tests report from ./reports/dotnet test results matches snapshot 1`] = `
+TestRunResult {
+ "path": "fixtures/golang-json.json",
+ "suites": [
+ TestSuiteResult {
+ "groups": [
+ TestGroupResult {
+ "name": null,
+ "tests": [
+ TestCaseResult {
+ "error": undefined,
+ "name": "TestPassing",
+ "result": "success",
+ "time": 60,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "calculator_test.go:19: expected 1+1 = 3, got 2
+",
+ "message": "calculator_test.go:19: expected 1+1 = 3, got 2
+",
+ },
+ "name": "TestFailing",
+ "result": "failed",
+ "time": 890,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "calculator_test.go:76: caught panic: runtime error: integer divide by zero
+",
+ "message": "calculator_test.go:76: caught panic: runtime error: integer divide by zero
+",
+ },
+ "name": "TestPanicInsideFunction",
+ "result": "failed",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "calculator_test.go:76: caught panic: bad stuff
+",
+ "message": "calculator_test.go:76: caught panic: bad stuff
+",
+ },
+ "name": "TestPanicInsideTest",
+ "result": "failed",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "calculator_test.go:45: skipping test
+",
+ "message": "calculator_test.go:45: skipping test
+",
+ },
+ "name": "TestSkipped",
+ "result": "skipped",
+ "time": 940,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "",
+ "message": "",
+ },
+ "name": "TestCases",
+ "result": "failed",
+ "time": 2250,
+ },
+ ],
+ },
+ TestGroupResult {
+ "name": "TestCases",
+ "tests": [
+ TestCaseResult {
+ "error": undefined,
+ "name": "1_+_2_=_3",
+ "result": "success",
+ "time": 400,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "4_+_7_=_11",
+ "result": "success",
+ "time": 460,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "calculator_test.go:67: expected 2 + 3 = 4, got 5
+",
+ "message": "calculator_test.go:67: expected 2 + 3 = 4, got 5
+",
+ },
+ "name": "2_+_3_=_4",
+ "result": "failed",
+ "time": 90,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "calculator_test.go:67: expected 1 / 2 = 1, got 0
+",
+ "message": "calculator_test.go:67: expected 1 / 2 = 1, got 0
+",
+ },
+ "name": "1_/_2_=_1",
+ "result": "failed",
+ "time": 920,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "9_/_3_=_3",
+ "result": "success",
+ "time": 340,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "14_/_7_=_2",
+ "result": "success",
+ "time": 40,
+ },
+ ],
+ },
+ ],
+ "name": "_/home/james_t/git/test-reporter/reports/go",
+ "totalTime": undefined,
+ },
+ ],
+ "totalTime": undefined,
+}
+`;
diff --git a/__tests__/__snapshots__/java-junit.test.ts.snap b/__tests__/__snapshots__/java-junit.test.ts.snap
index 041f380..38daca9 100644
--- a/__tests__/__snapshots__/java-junit.test.ts.snap
+++ b/__tests__/__snapshots__/java-junit.test.ts.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`java-junit tests report from apache/pulsar single suite test results matches snapshot 1`] = `
TestRunResult {
@@ -41,7 +41,7 @@ at java.lang.Thread.run(Thread.java:748)
",
"line": 29,
- "message": undefined,
+ "message": "java.lang.AssertionError: expected [1.2.1] but found [1.2.0]",
"path": "pulsar-common/src/test/java/org/apache/pulsar/AddMissingPatchVersionTest.java",
},
"name": "testVersionStrings",
@@ -100,7 +100,7 @@ at java.lang.Thread.run(Thread.java:748)
",
"line": 29,
- "message": undefined,
+ "message": "java.lang.AssertionError: expected [1.2.1] but found [1.2.0]",
"path": "pulsar-common/src/test/java/org/apache/pulsar/AddMissingPatchVersionTest.java",
},
"name": "testVersionStrings",
diff --git a/__tests__/__snapshots__/jest-junit.test.ts.snap b/__tests__/__snapshots__/jest-junit.test.ts.snap
index f29b5c8..eca0092 100644
--- a/__tests__/__snapshots__/jest-junit.test.ts.snap
+++ b/__tests__/__snapshots__/jest-junit.test.ts.snap
@@ -1,4 +1,62 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
+
+exports[`jest-junit tests parsing ESLint report without timing information works - PR #134 1`] = `
+TestRunResult {
+ "path": "fixtures/jest-junit-eslint.xml",
+ "suites": [
+ TestSuiteResult {
+ "groups": [
+ TestGroupResult {
+ "name": "test",
+ "tests": [
+ TestCaseResult {
+ "error": undefined,
+ "name": "test.jsx",
+ "result": "success",
+ "time": 0,
+ },
+ ],
+ },
+ ],
+ "name": "test.jsx",
+ "totalTime": 0,
+ },
+ ],
+ "totalTime": undefined,
+}
+`;
+
+exports[`jest-junit tests parsing junit report with message succeeds 1`] = `
+TestRunResult {
+ "path": "fixtures/junit-with-message.xml",
+ "suites": [
+ TestSuiteResult {
+ "groups": [
+ TestGroupResult {
+ "name": "Fails",
+ "tests": [
+ TestCaseResult {
+ "error": {
+ "details": "error.cpp:01
+ Expected: true
+ Which is: false >",
+ "line": undefined,
+ "path": undefined,
+ },
+ "name": "Test",
+ "result": "failed",
+ "time": 0,
+ },
+ ],
+ },
+ ],
+ "name": "Test",
+ "totalTime": 1,
+ },
+ ],
+ "totalTime": 1,
+}
+`;
exports[`jest-junit tests report from #235 testing react components named 1`] = `
TestRunResult {
diff --git a/__tests__/__snapshots__/mocha-json.test.ts.snap b/__tests__/__snapshots__/mocha-json.test.ts.snap
index 7038239..4a1448c 100644
--- a/__tests__/__snapshots__/mocha-json.test.ts.snap
+++ b/__tests__/__snapshots__/mocha-json.test.ts.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`mocha-json tests report from ./reports/mocha-json test results matches snapshot 1`] = `
TestRunResult {
diff --git a/__tests__/__snapshots__/python-xunit.test.ts.snap b/__tests__/__snapshots__/python-xunit.test.ts.snap
new file mode 100644
index 0000000..f325c84
--- /dev/null
+++ b/__tests__/__snapshots__/python-xunit.test.ts.snap
@@ -0,0 +1,192 @@
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
+
+exports[`python-xunit pytest report report from python test results matches snapshot 1`] = `
+TestRunResult {
+ "path": "fixtures/python-xunit-pytest.xml",
+ "suites": [
+ TestSuiteResult {
+ "groups": [
+ TestGroupResult {
+ "name": "tests.test_lib",
+ "tests": [
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_always_pass",
+ "result": "success",
+ "time": 2,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_with_subtests",
+ "result": "success",
+ "time": 5,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_parameterized[param1]",
+ "result": "success",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_parameterized[param2]",
+ "result": "success",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_always_skip",
+ "result": "skipped",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "def test_always_fail():
+ > assert False
+ E assert False
+
+ tests/test_lib.py:25: AssertionError
+ ",
+ "line": undefined,
+ "message": "assert False",
+ "path": undefined,
+ },
+ "name": "test_always_fail",
+ "result": "failed",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_expected_failure",
+ "result": "skipped",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "def test_error():
+ > raise Exception("error")
+ E Exception: error
+
+ tests/test_lib.py:32: Exception
+ ",
+ "line": undefined,
+ "message": "Exception: error",
+ "path": undefined,
+ },
+ "name": "test_error",
+ "result": "failed",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_with_record_property",
+ "result": "success",
+ "time": 0,
+ },
+ ],
+ },
+ TestGroupResult {
+ "name": "custom_classname",
+ "tests": [
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_with_record_xml_attribute",
+ "result": "success",
+ "time": 0,
+ },
+ ],
+ },
+ ],
+ "name": "pytest",
+ "totalTime": 19,
+ },
+ ],
+ "totalTime": undefined,
+}
+`;
+
+exports[`python-xunit unittest report report from python test results matches snapshot 1`] = `
+TestRunResult {
+ "path": "fixtures/python-xunit-unittest.xml",
+ "suites": [
+ TestSuiteResult {
+ "groups": [
+ TestGroupResult {
+ "name": "TestAcme",
+ "tests": [
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_always_pass",
+ "result": "success",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_parameterized_0_param1",
+ "result": "success",
+ "time": 1,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_parameterized_1_param2",
+ "result": "success",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_with_subtests",
+ "result": "success",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "Traceback (most recent call last):
+ File "/Users/foo/Projects/python-test/tests/test_lib.py", line 24, in test_always_fail
+ self.fail("failed")
+AssertionError: failed
+",
+ "line": undefined,
+ "message": "AssertionError: failed",
+ "path": undefined,
+ },
+ "name": "test_always_fail",
+ "result": "failed",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": {
+ "details": "Traceback (most recent call last):
+ File "/Users/foo/Projects/python-test/tests/test_lib.py", line 31, in test_error
+ raise Exception("error")
+Exception: error
+",
+ "line": undefined,
+ "message": "Exception: error",
+ "path": undefined,
+ },
+ "name": "test_error",
+ "result": "failed",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_always_skip",
+ "result": "skipped",
+ "time": 0,
+ },
+ TestCaseResult {
+ "error": undefined,
+ "name": "test_expected_failure",
+ "result": "skipped",
+ "time": 0,
+ },
+ ],
+ },
+ ],
+ "name": "TestAcme-20251114214921",
+ "totalTime": 1,
+ },
+ ],
+ "totalTime": 1,
+}
+`;
diff --git a/__tests__/__snapshots__/rspec-json.test.ts.snap b/__tests__/__snapshots__/rspec-json.test.ts.snap
index cc14bfb..51c1943 100644
--- a/__tests__/__snapshots__/rspec-json.test.ts.snap
+++ b/__tests__/__snapshots__/rspec-json.test.ts.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`rspec-json tests report from ./reports/rspec-json test results matches snapshot 1`] = `
TestRunResult {
diff --git a/__tests__/__snapshots__/swift-xunit.test.ts.snap b/__tests__/__snapshots__/swift-xunit.test.ts.snap
index 01aa7d9..bddc6ea 100644
--- a/__tests__/__snapshots__/swift-xunit.test.ts.snap
+++ b/__tests__/__snapshots__/swift-xunit.test.ts.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`swift-xunit tests report from swift test results matches snapshot 1`] = `
TestRunResult {
@@ -25,7 +25,7 @@ TestRunResult {
"error": {
"details": undefined,
"line": undefined,
- "message": undefined,
+ "message": "failed",
"path": undefined,
},
"name": "test_always_fail",
diff --git a/__tests__/dart-json.test.ts b/__tests__/dart-json.test.ts
index a2b959c..12b664b 100644
--- a/__tests__/dart-json.test.ts
+++ b/__tests__/dart-json.test.ts
@@ -3,7 +3,7 @@ import * as path from 'path'
import {DartJsonParser} from '../src/parsers/dart-json/dart-json-parser'
import {ParseOptions} from '../src/test-parser'
-import {getReport} from '../src/report/get-report'
+import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report'
import {normalizeFilePath} from '../src/utils/path-utils'
describe('dart-json tests', () => {
@@ -66,4 +66,66 @@ describe('dart-json tests', () => {
fs.mkdirSync(path.dirname(outputPath), {recursive: true})
fs.writeFileSync(outputPath, report)
})
+
+ it('report does not include a title by default', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'dart-json.json')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new DartJsonParser(opts, 'dart')
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result])
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it.each([
+ ['empty string', ''],
+ ['space', ' '],
+ ['tab', '\t'],
+ ['newline', '\n']
+ ])('report does not include a title when configured value is %s', async (_, reportTitle) => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'dart-json.json')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new DartJsonParser(opts, 'dart')
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle
+ })
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it('report includes a custom report title', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'dart-json.json')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new DartJsonParser(opts, 'dart')
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle: 'My Custom Title'
+ })
+ // Report should have the title as the first line
+ expect(report).toMatch(/^# My Custom Title\n/)
+ })
})
diff --git a/__tests__/dotnet-nunit.test.ts b/__tests__/dotnet-nunit.test.ts
new file mode 100644
index 0000000..6903c5a
--- /dev/null
+++ b/__tests__/dotnet-nunit.test.ts
@@ -0,0 +1,91 @@
+import * as fs from 'fs'
+import * as path from 'path'
+
+import {DotnetNunitParser} from '../src/parsers/dotnet-nunit/dotnet-nunit-parser'
+import {ParseOptions} from '../src/test-parser'
+import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report'
+import {normalizeFilePath} from '../src/utils/path-utils'
+
+describe('dotnet-nunit tests', () => {
+ it('report from ./reports/dotnet test results matches snapshot', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-nunit.xml')
+ const outputPath = path.join(__dirname, '__outputs__', 'dotnet-nunit.md')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: ['DotnetTests.Unit/Calculator.cs', 'DotnetTests.NUnitV3Tests/CalculatorTests.cs']
+ }
+
+ const parser = new DotnetNunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ expect(result).toMatchSnapshot()
+
+ const report = getReport([result])
+ fs.mkdirSync(path.dirname(outputPath), {recursive: true})
+ fs.writeFileSync(outputPath, report)
+ })
+
+ it('report does not include a title by default', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-nunit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new DotnetNunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result])
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it.each([
+ ['empty string', ''],
+ ['space', ' '],
+ ['tab', '\t'],
+ ['newline', '\n']
+ ])('report does not include a title when configured value is %s', async (_, reportTitle) => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-nunit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new DotnetNunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle
+ })
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it('report includes a custom report title', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-nunit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new DotnetNunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle: 'My Custom Title'
+ })
+ // Report should have the title as the first line
+ expect(report).toMatch(/^# My Custom Title\n/)
+ })
+})
diff --git a/__tests__/dotnet-trx.test.ts b/__tests__/dotnet-trx.test.ts
index d4d5dac..a7aead6 100644
--- a/__tests__/dotnet-trx.test.ts
+++ b/__tests__/dotnet-trx.test.ts
@@ -3,7 +3,7 @@ import * as path from 'path'
import {DotnetTrxParser} from '../src/parsers/dotnet-trx/dotnet-trx-parser'
import {ParseOptions} from '../src/test-parser'
-import {getReport} from '../src/report/get-report'
+import {DEFAULT_OPTIONS, getReport, ReportOptions} from '../src/report/get-report'
import {normalizeFilePath} from '../src/utils/path-utils'
describe('dotnet-trx tests', () => {
@@ -23,9 +23,50 @@ describe('dotnet-trx tests', () => {
expect(result.result).toBe('success')
})
- it('matches report snapshot', async () => {
+ it('produces empty test run result when TestDefinitions is empty', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'empty', 'dotnet-trx-empty-test-definitions.trx')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new DotnetTrxParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ expect(result.tests).toBe(0)
+ expect(result.result).toBe('success')
+ })
+
+ it.each([['dotnet-trx'], ['dotnet-xunitv3']])('matches %s report snapshot', async reportName => {
+ const fixturePath = path.join(__dirname, 'fixtures', `${reportName}.trx`)
+ const outputPath = path.join(__dirname, '__outputs__', `${reportName}.md`)
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: [
+ 'DotnetTests.Unit/Calculator.cs',
+ 'DotnetTests.XUnitTests/CalculatorTests.cs',
+ 'DotnetTests.XUnitV3Tests/FixtureTests.cs'
+ ]
+ //workDir: 'C:/Users/Michal/Workspace/dorny/test-check/reports/dotnet/'
+ }
+
+ const parser = new DotnetTrxParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ expect(result).toMatchSnapshot()
+
+ const report = getReport([result])
+ fs.mkdirSync(path.dirname(outputPath), {recursive: true})
+ fs.writeFileSync(outputPath, report)
+ })
+
+ it('matches report snapshot (only failed tests)', async () => {
const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-trx.trx')
- const outputPath = path.join(__dirname, '__outputs__', 'dotnet-trx.md')
+ const outputPath = path.join(__dirname, '__outputs__', 'dotnet-trx-only-failed.md')
const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
@@ -39,7 +80,12 @@ describe('dotnet-trx tests', () => {
const result = await parser.parse(filePath, fileContent)
expect(result).toMatchSnapshot()
- const report = getReport([result])
+ const reportOptions: ReportOptions = {
+ ...DEFAULT_OPTIONS,
+ listSuites: 'all',
+ listTests: 'failed'
+ }
+ const report = getReport([result], reportOptions)
fs.mkdirSync(path.dirname(outputPath), {recursive: true})
fs.writeFileSync(outputPath, report)
})
@@ -83,4 +129,66 @@ describe('dotnet-trx tests', () => {
fs.mkdirSync(path.dirname(outputPath), {recursive: true})
fs.writeFileSync(outputPath, report)
})
+
+ it('report does not include a title by default', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-trx.trx')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new DotnetTrxParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result])
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it.each([
+ ['empty string', ''],
+ ['space', ' '],
+ ['tab', '\t'],
+ ['newline', '\n']
+ ])('report does not include a title when configured value is %s', async (_, reportTitle) => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-trx.trx')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new DotnetTrxParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle
+ })
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it('report includes a custom report title', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-trx.trx')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new DotnetTrxParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle: 'My Custom Title'
+ })
+ // Report should have the title as the first line
+ expect(report).toMatch(/^# My Custom Title\n/)
+ })
})
diff --git a/__tests__/fixtures/dotnet-nunit.xml b/__tests__/fixtures/dotnet-nunit.xml
new file mode 100644
index 0000000..e08a9f3
--- /dev/null
+++ b/__tests__/fixtures/dotnet-nunit.xml
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/__tests__/fixtures/dotnet-xunitv3.trx b/__tests__/fixtures/dotnet-xunitv3.trx
new file mode 100644
index 0000000..6bd9c25
--- /dev/null
+++ b/__tests__/fixtures/dotnet-xunitv3.trx
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Exit code indicates failure: '2'. Please refer to https://aka.ms/testingplatform/exitcodes for more information.
+
+
+
+
\ No newline at end of file
diff --git a/__tests__/fixtures/empty/dart-json.json b/__tests__/fixtures/empty/dart-json.json
index 4f3a23e..e47cf11 100644
--- a/__tests__/fixtures/empty/dart-json.json
+++ b/__tests__/fixtures/empty/dart-json.json
@@ -1,9 +1,15 @@
-{"protocolVersion":"0.1.1","runnerVersion":"1.15.4","pid":21320,"type":"start","time":0}
-{"suite":{"id":0,"platform":"vm","path":"test\\main_test.dart"},"type":"suite","time":0}
-{"test":{"id":1,"name":"loading test\\main_test.dart","suiteID":0,"groupIDs":[],"metadata":{"skip":false,"skipReason":null},"line":null,"column":null,"url":null},"type":"testStart","time":1}
-{"suite":{"id":2,"platform":"vm","path":"test\\second_test.dart"},"type":"suite","time":11}
-{"test":{"id":3,"name":"loading test\\second_test.dart","suiteID":2,"groupIDs":[],"metadata":{"skip":false,"skipReason":null},"line":null,"column":null,"url":null},"type":"testStart","time":11}
-{"count":2,"type":"allSuites","time":11}
-{"testID":1,"result":"success","skipped":false,"hidden":true,"type":"testDone","time":4018}
-{"testID":3,"result":"success","skipped":false,"hidden":true,"type":"testDone","time":4025}
-{"success":true,"type":"done","time":4029}
+{"protocolVersion":"0.1.1","runnerVersion":"1.25.3","pid":7103,"type":"start","time":0}
+{"suite":{"id":0,"platform":"vm","path":"test/second_test.dart"},"type":"suite","time":0}
+{"test":{"id":1,"name":"loading test/second_test.dart","suiteID":0,"groupIDs":[],"metadata":{"skip":false,"skipReason":null},"line":null,"column":null,"url":null},"type":"testStart","time":0}
+{"suite":{"id":2,"platform":"vm","path":"test/main_test.dart"},"type":"suite","time":4}
+{"test":{"id":3,"name":"loading test/main_test.dart","suiteID":2,"groupIDs":[],"metadata":{"skip":false,"skipReason":null},"line":null,"column":null,"url":null},"type":"testStart","time":4}
+{"count":2,"time":5,"type":"allSuites"}
+{"testID":1,"result":"success","skipped":false,"hidden":true,"type":"testDone","time":294}
+{"testID":3,"messageType":"print","message":"Hello from the test","type":"print","time":297}
+{"testID":3,"result":"success","skipped":false,"hidden":true,"type":"testDone","time":321}
+{"group":{"id":4,"suiteID":2,"parentID":null,"name":"","metadata":{"skip":false,"skipReason":null},"testCount":0,"line":null,"column":null,"url":null},"type":"group","time":322}
+{"test":{"id":5,"name":"(setUpAll)","suiteID":2,"groupIDs":[4],"metadata":{"skip":false,"skipReason":null},"line":6,"column":3,"url":"file:///Users/domu/Downloads/test-reporter/reports/dart/test/main_test.dart"},"type":"testStart","time":322}
+{"testID":5,"result":"success","skipped":false,"hidden":true,"type":"testDone","time":330}
+{"test":{"id":6,"name":"(tearDownAll)","suiteID":2,"groupIDs":[4],"metadata":{"skip":false,"skipReason":null},"line":7,"column":3,"url":"file:///Users/domu/Downloads/test-reporter/reports/dart/test/main_test.dart"},"type":"testStart","time":330}
+{"testID":6,"result":"success","skipped":false,"hidden":true,"type":"testDone","time":331}
+{"success":true,"type":"done","time":333}
diff --git a/__tests__/fixtures/empty/dotnet-trx-empty-test-definitions.trx b/__tests__/fixtures/empty/dotnet-trx-empty-test-definitions.trx
new file mode 100644
index 0000000..7066144
--- /dev/null
+++ b/__tests__/fixtures/empty/dotnet-trx-empty-test-definitions.trx
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No test is available in (...). Make sure that test discoverer & executors are registered and platform & framework version settings are appropriate and try again.
+
+
+
+
diff --git a/__tests__/fixtures/external/nunit-sample.xml b/__tests__/fixtures/external/nunit-sample.xml
new file mode 100644
index 0000000..b261560
--- /dev/null
+++ b/__tests__/fixtures/external/nunit-sample.xml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/__tests__/fixtures/golang-json.json b/__tests__/fixtures/golang-json.json
new file mode 100644
index 0000000..421a707
--- /dev/null
+++ b/__tests__/fixtures/golang-json.json
@@ -0,0 +1,59 @@
+{"Time":"2025-04-22T08:59:55.364618802-05:00","Action":"start","Package":"_/home/james_t/git/test-reporter/reports/go"}
+{"Time":"2025-04-22T08:59:55.371779289-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPassing"}
+{"Time":"2025-04-22T08:59:55.371805677-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPassing","Output":"=== RUN TestPassing\n"}
+{"Time":"2025-04-22T08:59:55.428201983-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPassing","Output":" calculator_test.go:11: pass!\n"}
+{"Time":"2025-04-22T08:59:55.428265529-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPassing","Output":"--- PASS: TestPassing (0.06s)\n"}
+{"Time":"2025-04-22T08:59:55.428285649-05:00","Action":"pass","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPassing","Elapsed":0.06}
+{"Time":"2025-04-22T08:59:55.428299886-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestFailing"}
+{"Time":"2025-04-22T08:59:55.428309029-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestFailing","Output":"=== RUN TestFailing\n"}
+{"Time":"2025-04-22T08:59:56.317425091-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestFailing","Output":" calculator_test.go:19: expected 1+1 = 3, got 2\n"}
+{"Time":"2025-04-22T08:59:56.31748077-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestFailing","Output":"--- FAIL: TestFailing (0.89s)\n"}
+{"Time":"2025-04-22T08:59:56.317493452-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestFailing","Elapsed":0.89}
+{"Time":"2025-04-22T08:59:56.317506107-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideFunction"}
+{"Time":"2025-04-22T08:59:56.317514487-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideFunction","Output":"=== RUN TestPanicInsideFunction\n"}
+{"Time":"2025-04-22T08:59:56.317530448-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideFunction","Output":" calculator_test.go:76: caught panic: runtime error: integer divide by zero\n"}
+{"Time":"2025-04-22T08:59:56.317541866-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideFunction","Output":"--- FAIL: TestPanicInsideFunction (0.00s)\n"}
+{"Time":"2025-04-22T08:59:56.317552981-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideFunction","Elapsed":0}
+{"Time":"2025-04-22T08:59:56.317561057-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideTest"}
+{"Time":"2025-04-22T08:59:56.317568742-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideTest","Output":"=== RUN TestPanicInsideTest\n"}
+{"Time":"2025-04-22T08:59:56.317584113-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideTest","Output":" calculator_test.go:76: caught panic: bad stuff\n"}
+{"Time":"2025-04-22T08:59:56.317598524-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideTest","Output":"--- FAIL: TestPanicInsideTest (0.00s)\n"}
+{"Time":"2025-04-22T08:59:56.317608268-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideTest","Elapsed":0}
+{"Time":"2025-04-22T08:59:56.317615472-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestSkipped"}
+{"Time":"2025-04-22T08:59:56.317623959-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestSkipped","Output":"=== RUN TestSkipped\n"}
+{"Time":"2025-04-22T08:59:57.256475698-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestSkipped","Output":" calculator_test.go:45: skipping test\n"}
+{"Time":"2025-04-22T08:59:57.256536372-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestSkipped","Output":"--- SKIP: TestSkipped (0.94s)\n"}
+{"Time":"2025-04-22T08:59:57.256549142-05:00","Action":"skip","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestSkipped","Elapsed":0.94}
+{"Time":"2025-04-22T08:59:57.256562053-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases"}
+{"Time":"2025-04-22T08:59:57.256569388-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases","Output":"=== RUN TestCases\n"}
+{"Time":"2025-04-22T08:59:57.256580104-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_+_2_=_3"}
+{"Time":"2025-04-22T08:59:57.256587408-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_+_2_=_3","Output":"=== RUN TestCases/1_+_2_=_3\n"}
+{"Time":"2025-04-22T08:59:57.653005399-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/4_+_7_=_11"}
+{"Time":"2025-04-22T08:59:57.653036336-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/4_+_7_=_11","Output":"=== RUN TestCases/4_+_7_=_11\n"}
+{"Time":"2025-04-22T08:59:58.112825221-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/2_+_3_=_4"}
+{"Time":"2025-04-22T08:59:58.112858016-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/2_+_3_=_4","Output":"=== RUN TestCases/2_+_3_=_4\n"}
+{"Time":"2025-04-22T08:59:58.201204209-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/2_+_3_=_4","Output":" calculator_test.go:67: expected 2 + 3 = 4, got 5\n"}
+{"Time":"2025-04-22T08:59:58.201245827-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_/_2_=_1"}
+{"Time":"2025-04-22T08:59:58.201255566-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_/_2_=_1","Output":"=== RUN TestCases/1_/_2_=_1\n"}
+{"Time":"2025-04-22T08:59:59.119852965-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_/_2_=_1","Output":" calculator_test.go:67: expected 1 / 2 = 1, got 0\n"}
+{"Time":"2025-04-22T08:59:59.119877603-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/9_/_3_=_3"}
+{"Time":"2025-04-22T08:59:59.119879955-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/9_/_3_=_3","Output":"=== RUN TestCases/9_/_3_=_3\n"}
+{"Time":"2025-04-22T08:59:59.460576385-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/14_/_7_=_2"}
+{"Time":"2025-04-22T08:59:59.460607599-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/14_/_7_=_2","Output":"=== RUN TestCases/14_/_7_=_2\n"}
+{"Time":"2025-04-22T08:59:59.504952672-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases","Output":"--- FAIL: TestCases (2.25s)\n"}
+{"Time":"2025-04-22T08:59:59.504995938-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_+_2_=_3","Output":" --- PASS: TestCases/1_+_2_=_3 (0.40s)\n"}
+{"Time":"2025-04-22T08:59:59.505006062-05:00","Action":"pass","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_+_2_=_3","Elapsed":0.4}
+{"Time":"2025-04-22T08:59:59.505017551-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/4_+_7_=_11","Output":" --- PASS: TestCases/4_+_7_=_11 (0.46s)\n"}
+{"Time":"2025-04-22T08:59:59.505026099-05:00","Action":"pass","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/4_+_7_=_11","Elapsed":0.46}
+{"Time":"2025-04-22T08:59:59.505033963-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/2_+_3_=_4","Output":" --- FAIL: TestCases/2_+_3_=_4 (0.09s)\n"}
+{"Time":"2025-04-22T08:59:59.505042238-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/2_+_3_=_4","Elapsed":0.09}
+{"Time":"2025-04-22T08:59:59.505050917-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_/_2_=_1","Output":" --- FAIL: TestCases/1_/_2_=_1 (0.92s)\n"}
+{"Time":"2025-04-22T08:59:59.505059901-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_/_2_=_1","Elapsed":0.92}
+{"Time":"2025-04-22T08:59:59.505068125-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/9_/_3_=_3","Output":" --- PASS: TestCases/9_/_3_=_3 (0.34s)\n"}
+{"Time":"2025-04-22T08:59:59.505076976-05:00","Action":"pass","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/9_/_3_=_3","Elapsed":0.34}
+{"Time":"2025-04-22T08:59:59.5050845-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/14_/_7_=_2","Output":" --- PASS: TestCases/14_/_7_=_2 (0.04s)\n"}
+{"Time":"2025-04-22T08:59:59.505091554-05:00","Action":"pass","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/14_/_7_=_2","Elapsed":0.04}
+{"Time":"2025-04-22T08:59:59.505098998-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases","Elapsed":2.25}
+{"Time":"2025-04-22T08:59:59.505107502-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Output":"FAIL\n"}
+{"Time":"2025-04-22T08:59:59.505552861-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Output":"FAIL\t_/home/james_t/git/test-reporter/reports/go\t4.141s\n"}
+{"Time":"2025-04-22T08:59:59.505584529-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Elapsed":4.141}
diff --git a/__tests__/fixtures/jest-junit-eslint.xml b/__tests__/fixtures/jest-junit-eslint.xml
new file mode 100644
index 0000000..ceac3c6
--- /dev/null
+++ b/__tests__/fixtures/jest-junit-eslint.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/__tests__/fixtures/junit-with-message.xml b/__tests__/fixtures/junit-with-message.xml
new file mode 100644
index 0000000..2e3d584
--- /dev/null
+++ b/__tests__/fixtures/junit-with-message.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ ]]>
+
+
+
diff --git a/__tests__/fixtures/python-xunit-pytest.xml b/__tests__/fixtures/python-xunit-pytest.xml
new file mode 100644
index 0000000..fcb044a
--- /dev/null
+++ b/__tests__/fixtures/python-xunit-pytest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+ /Users/mike/Projects/python-test/tests/test_lib.py:20: skipped
+
+
+
+ def test_always_fail():
+ > assert False
+ E assert False
+
+ tests/test_lib.py:25: AssertionError
+
+
+
+
+
+
+ def test_error():
+ > raise Exception("error")
+ E Exception: error
+
+ tests/test_lib.py:32: Exception
+
+
+
+
+
+
+
+
+
+
diff --git a/__tests__/fixtures/python-xunit-unittest.xml b/__tests__/fixtures/python-xunit-unittest.xml
new file mode 100644
index 0000000..ecc67d4
--- /dev/null
+++ b/__tests__/fixtures/python-xunit-unittest.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/__tests__/golang-json.test.ts b/__tests__/golang-json.test.ts
new file mode 100644
index 0000000..0bfdd86
--- /dev/null
+++ b/__tests__/golang-json.test.ts
@@ -0,0 +1,29 @@
+import * as fs from 'fs'
+import * as path from 'path'
+
+import {GolangJsonParser} from '../src/parsers/golang-json/golang-json-parser'
+import {ParseOptions} from '../src/test-parser'
+import {getReport} from '../src/report/get-report'
+import {normalizeFilePath} from '../src/utils/path-utils'
+
+describe('golang-json tests', () => {
+ it('report from ./reports/dotnet test results matches snapshot', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'golang-json.json')
+ const outputPath = path.join(__dirname, '__outputs__', 'golang-json.md')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: ['calculator.go', 'calculator_test.go']
+ }
+
+ const parser = new GolangJsonParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ expect(result).toMatchSnapshot()
+
+ const report = getReport([result])
+ fs.mkdirSync(path.dirname(outputPath), {recursive: true})
+ fs.writeFileSync(outputPath, report)
+ })
+})
diff --git a/__tests__/java-junit.test.ts b/__tests__/java-junit.test.ts
index e8111d4..83a7dec 100644
--- a/__tests__/java-junit.test.ts
+++ b/__tests__/java-junit.test.ts
@@ -3,7 +3,7 @@ import * as path from 'path'
import {JavaJunitParser} from '../src/parsers/java-junit/java-junit-parser'
import {ParseOptions} from '../src/test-parser'
-import {getReport} from '../src/report/get-report'
+import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report'
import {normalizeFilePath} from '../src/utils/path-utils'
describe('java-junit tests', () => {
@@ -90,4 +90,66 @@ describe('java-junit tests', () => {
expect(result.result === 'failed')
expect(result.failed === 1)
})
+
+ it('report does not include a title by default', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'junit-with-message.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new JavaJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result])
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it.each([
+ ['empty string', ''],
+ ['space', ' '],
+ ['tab', '\t'],
+ ['newline', '\n']
+ ])('report does not include a title when configured value is %s', async (_, reportTitle) => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'junit-with-message.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new JavaJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle
+ })
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it('report includes a custom report title', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'empty', 'java-junit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new JavaJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle: 'My Custom Title'
+ })
+ // Report should have the title as the first line
+ expect(report).toMatch(/^# My Custom Title\n/)
+ })
})
diff --git a/__tests__/jest-junit.test.ts b/__tests__/jest-junit.test.ts
index d42405c..912ebde 100644
--- a/__tests__/jest-junit.test.ts
+++ b/__tests__/jest-junit.test.ts
@@ -3,7 +3,7 @@ import * as path from 'path'
import {JestJunitParser} from '../src/parsers/jest-junit/jest-junit-parser'
import {ParseOptions} from '../src/test-parser'
-import {getReport} from '../src/report/get-report'
+import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report'
import {normalizeFilePath} from '../src/utils/path-utils'
describe('jest-junit tests', () => {
@@ -105,4 +105,245 @@ describe('jest-junit tests', () => {
fs.mkdirSync(path.dirname(outputPath), {recursive: true})
fs.writeFileSync(outputPath, report)
})
+
+ it('parsing ESLint report without timing information works - PR #134', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit-eslint.xml')
+ const outputPath = path.join(__dirname, '__outputs__', 'jest-junit-eslint.md')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: ['test.js']
+ }
+
+ const parser = new JestJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ expect(result).toMatchSnapshot()
+
+ const report = getReport([result])
+ fs.mkdirSync(path.dirname(outputPath), {recursive: true})
+ fs.writeFileSync(outputPath, report)
+ })
+
+ it('parsing junit report with message succeeds', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'junit-with-message.xml')
+ const outputPath = path.join(__dirname, '__outputs__', 'junit-with-message.md')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: ['test.js']
+ }
+
+ const parser = new JestJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ expect(result).toMatchSnapshot()
+
+ const report = getReport([result])
+ fs.mkdirSync(path.dirname(outputPath), {recursive: true})
+ fs.writeFileSync(outputPath, report)
+ })
+
+ it('report does not include a title by default', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new JestJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result])
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it.each([
+ ['empty string', ''],
+ ['space', ' '],
+ ['tab', '\t'],
+ ['newline', '\n']
+ ])('report does not include a title when configured value is %s', async (_, reportTitle) => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new JestJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle
+ })
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it('report includes a custom report title', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new JestJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle: 'My Custom Title'
+ })
+ // Report should have the title as the first line
+ expect(report).toMatch(/^# My Custom Title\n/)
+ })
+
+ it('report can be collapsed when configured', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new JestJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ collapsed: 'always'
+ })
+ // Report should include collapsible details
+ expect(report).toContain('Expand for details
')
+ expect(report).toContain(' ')
+ })
+
+ it('report is not collapsed when configured to never', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new JestJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ collapsed: 'never'
+ })
+ // Report should not include collapsible details
+ expect(report).not.toContain('Expand for details
')
+ expect(report).not.toContain(' ')
+ })
+
+ it('report auto-collapses when all tests pass', async () => {
+ // Test with a fixture that has all passing tests (no failures)
+ const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit-eslint.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new JestJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+
+ // Verify this fixture has no failures
+ expect(result.failed).toBe(0)
+
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ collapsed: 'auto'
+ })
+
+ // Should collapse when all tests pass
+ expect(report).toContain('Expand for details
')
+ expect(report).toContain(' ')
+ })
+
+ it('report does not auto-collapse when tests fail', async () => {
+ // Test with a fixture that has failing tests
+ const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new JestJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+
+ // Verify this fixture has failures
+ expect(result.failed).toBeGreaterThan(0)
+
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ collapsed: 'auto'
+ })
+
+ // Should not collapse when there are failures
+ expect(report).not.toContain('Expand for details
')
+ expect(report).not.toContain(' ')
+ })
+
+ it('report includes the short summary', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new JestJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const shortSummary = '1 passed, 4 failed and 1 skipped'
+ const report = getReport([result], DEFAULT_OPTIONS, shortSummary)
+ // Report should have the title as the first line
+ expect(report).toMatch(/^## 1 passed, 4 failed and 1 skipped\n/)
+ })
+
+ it('report includes a custom report title and short summary', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new JestJunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const shortSummary = '1 passed, 4 failed and 1 skipped'
+ const report = getReport(
+ [result],
+ {
+ ...DEFAULT_OPTIONS,
+ reportTitle: 'My Custom Title'
+ },
+ shortSummary
+ )
+ // Report should have the title as the first line
+ expect(report).toMatch(/^# My Custom Title\n## 1 passed, 4 failed and 1 skipped\n/)
+ })
})
diff --git a/__tests__/mocha-json.test.ts b/__tests__/mocha-json.test.ts
index 05393fa..1272962 100644
--- a/__tests__/mocha-json.test.ts
+++ b/__tests__/mocha-json.test.ts
@@ -3,7 +3,7 @@ import * as path from 'path'
import {MochaJsonParser} from '../src/parsers/mocha-json/mocha-json-parser'
import {ParseOptions} from '../src/test-parser'
-import {getReport} from '../src/report/get-report'
+import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report'
import {normalizeFilePath} from '../src/utils/path-utils'
describe('mocha-json tests', () => {
@@ -64,4 +64,66 @@ describe('mocha-json tests', () => {
fs.mkdirSync(path.dirname(outputPath), {recursive: true})
fs.writeFileSync(outputPath, report)
})
+
+ it('report does not include a title by default', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'mocha-json.json')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new MochaJsonParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result])
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it.each([
+ ['empty string', ''],
+ ['space', ' '],
+ ['tab', '\t'],
+ ['newline', '\n']
+ ])('report does not include a title when configured value is %s', async (_, reportTitle) => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'mocha-json.json')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new MochaJsonParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle
+ })
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it('report includes a custom report title', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'mocha-json.json')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new MochaJsonParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle: 'My Custom Title'
+ })
+ // Report should have the title as the first line
+ expect(report).toMatch(/^# My Custom Title\n/)
+ })
})
diff --git a/__tests__/python-xunit.test.ts b/__tests__/python-xunit.test.ts
new file mode 100644
index 0000000..c1550a4
--- /dev/null
+++ b/__tests__/python-xunit.test.ts
@@ -0,0 +1,93 @@
+import * as fs from 'fs'
+import * as path from 'path'
+
+import {PythonXunitParser} from '../src/parsers/python-xunit/python-xunit-parser'
+import {ParseOptions} from '../src/test-parser'
+import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report'
+import {normalizeFilePath} from '../src/utils/path-utils'
+
+const defaultOpts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+}
+
+describe('python-xunit unittest report', () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'python-xunit-unittest.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+ const outputPath = path.join(__dirname, '__outputs__', 'python-xunit-unittest.md')
+
+ it('report from python test results matches snapshot', async () => {
+ const trackedFiles = ['tests/test_lib.py']
+ const opts: ParseOptions = {
+ ...defaultOpts,
+ trackedFiles
+ }
+
+ const parser = new PythonXunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ expect(result).toMatchSnapshot()
+
+ const report = getReport([result])
+ fs.mkdirSync(path.dirname(outputPath), {recursive: true})
+ fs.writeFileSync(outputPath, report)
+ })
+
+ it('report does not include a title by default', async () => {
+ const parser = new PythonXunitParser(defaultOpts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result])
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it.each([
+ ['empty string', ''],
+ ['space', ' '],
+ ['tab', '\t'],
+ ['newline', '\n']
+ ])('report does not include a title when configured value is %s', async (_, reportTitle) => {
+ const parser = new PythonXunitParser(defaultOpts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle
+ })
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it('report includes a custom report title', async () => {
+ const parser = new PythonXunitParser(defaultOpts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle: 'My Custom Title'
+ })
+ // Report should have the title as the first line
+ expect(report).toMatch(/^# My Custom Title\n/)
+ })
+})
+
+describe('python-xunit pytest report', () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'python-xunit-pytest.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+ const outputPath = path.join(__dirname, '__outputs__', 'python-xunit-pytest.md')
+
+ it('report from python test results matches snapshot', async () => {
+ const trackedFiles = ['tests/test_lib.py']
+ const opts: ParseOptions = {
+ ...defaultOpts,
+ trackedFiles
+ }
+
+ const parser = new PythonXunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ expect(result).toMatchSnapshot()
+
+ const report = getReport([result])
+ fs.mkdirSync(path.dirname(outputPath), {recursive: true})
+ fs.writeFileSync(outputPath, report)
+ })
+})
diff --git a/__tests__/report/get-report.test.ts b/__tests__/report/get-report.test.ts
new file mode 100644
index 0000000..670b0ad
--- /dev/null
+++ b/__tests__/report/get-report.test.ts
@@ -0,0 +1,120 @@
+import {getBadge, DEFAULT_OPTIONS, ReportOptions} from '../../src/report/get-report'
+
+describe('getBadge', () => {
+ describe('URI encoding with special characters', () => {
+ it('generates correct URI with simple badge title', () => {
+ const options: ReportOptions = {
+ ...DEFAULT_OPTIONS,
+ badgeTitle: 'tests'
+ }
+ const badge = getBadge(5, 0, 1, options)
+ expect(badge).toBe('')
+ })
+
+ it('handles badge title with single hyphen', () => {
+ const options: ReportOptions = {
+ ...DEFAULT_OPTIONS,
+ badgeTitle: 'unit-tests'
+ }
+ const badge = getBadge(3, 0, 0, options)
+ // The hyphen in the badge title should be encoded as --
+ expect(badge).toBe('')
+ })
+
+ it('handles badge title with multiple hyphens', () => {
+ const options: ReportOptions = {
+ ...DEFAULT_OPTIONS,
+ badgeTitle: 'integration-api-tests'
+ }
+ const badge = getBadge(10, 0, 0, options)
+ // All hyphens in the title should be encoded as --
+ expect(badge).toBe('')
+ })
+
+ it('handles badge title with multiple underscores', () => {
+ const options: ReportOptions = {
+ ...DEFAULT_OPTIONS,
+ badgeTitle: 'my_integration_test'
+ }
+ const badge = getBadge(10, 0, 0, options)
+ // All underscores in the title should be encoded as __
+ expect(badge).toBe('')
+ })
+
+ it('handles badge title with version format containing hyphen', () => {
+ const options: ReportOptions = {
+ ...DEFAULT_OPTIONS,
+ badgeTitle: 'MariaDb 12.0-ubi database tests'
+ }
+ const badge = getBadge(1, 0, 0, options)
+ // The hyphen in "12.0-ubi" should be encoded as --
+ expect(badge).toBe('')
+ })
+
+ it('handles badge title with dots and hyphens', () => {
+ const options: ReportOptions = {
+ ...DEFAULT_OPTIONS,
+ badgeTitle: 'v1.2.3-beta-test'
+ }
+ const badge = getBadge(4, 1, 0, options)
+ expect(badge).toBe('')
+ })
+
+ it('preserves structural hyphens between label and message', () => {
+ const options: ReportOptions = {
+ ...DEFAULT_OPTIONS,
+ badgeTitle: 'test-suite'
+ }
+ const badge = getBadge(2, 3, 1, options)
+ // The URI should have literal hyphens separating title-message-color
+ expect(badge).toBe('')
+ })
+ })
+
+ describe('generates test outcome as color name for imgshields', () => {
+ it('uses success color when all tests pass', () => {
+ const options: ReportOptions = {...DEFAULT_OPTIONS}
+ const badge = getBadge(5, 0, 0, options)
+ expect(badge).toContain('-success)')
+ })
+
+ it('uses critical color when tests fail', () => {
+ const options: ReportOptions = {...DEFAULT_OPTIONS}
+ const badge = getBadge(5, 2, 0, options)
+ expect(badge).toContain('-critical)')
+ })
+
+ it('uses yellow color when no tests found', () => {
+ const options: ReportOptions = {...DEFAULT_OPTIONS}
+ const badge = getBadge(0, 0, 0, options)
+ expect(badge).toContain('-yellow)')
+ })
+ })
+
+ describe('badge message composition', () => {
+ it('includes only passed count when no failures or skips', () => {
+ const options: ReportOptions = {...DEFAULT_OPTIONS}
+ const badge = getBadge(5, 0, 0, options)
+ expect(badge).toBe('')
+ })
+
+ it('includes passed and failed counts', () => {
+ const options: ReportOptions = {...DEFAULT_OPTIONS}
+ const badge = getBadge(5, 2, 0, options)
+ expect(badge).toBe('')
+ })
+
+ it('includes passed, failed and skipped counts', () => {
+ const options: ReportOptions = {...DEFAULT_OPTIONS}
+ const badge = getBadge(5, 2, 1, options)
+ expect(badge).toBe('')
+ })
+
+ it('uses "none" message when no tests', () => {
+ const options: ReportOptions = {...DEFAULT_OPTIONS}
+ const badge = getBadge(0, 0, 0, options)
+ expect(badge).toBe('')
+ })
+ })
+})
+
diff --git a/__tests__/rspec-json.test.ts b/__tests__/rspec-json.test.ts
index f77475a..787420b 100644
--- a/__tests__/rspec-json.test.ts
+++ b/__tests__/rspec-json.test.ts
@@ -3,7 +3,7 @@ import * as path from 'path'
import {RspecJsonParser} from '../src/parsers/rspec-json/rspec-json-parser'
import {ParseOptions} from '../src/test-parser'
-import {getReport} from '../src/report/get-report'
+import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report'
import {normalizeFilePath} from '../src/utils/path-utils'
describe('rspec-json tests', () => {
@@ -42,4 +42,66 @@ describe('rspec-json tests', () => {
fs.mkdirSync(path.dirname(outputPath), {recursive: true})
fs.writeFileSync(outputPath, report)
})
+
+ it('report does not include a title by default', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'rspec-json.json')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new RspecJsonParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result])
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it.each([
+ ['empty string', ''],
+ ['space', ' '],
+ ['tab', '\t'],
+ ['newline', '\n']
+ ])('report does not include a title when configured value is %s', async (_, reportTitle) => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'rspec-json.json')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new RspecJsonParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle
+ })
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it('report includes a custom report title', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'rspec-json.json')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new RspecJsonParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle: 'My Custom Title'
+ })
+ // Report should have the title as the first line
+ expect(report).toMatch(/^# My Custom Title\n/)
+ })
})
diff --git a/__tests__/swift-xunit.test.ts b/__tests__/swift-xunit.test.ts
index 474c868..9f063ee 100644
--- a/__tests__/swift-xunit.test.ts
+++ b/__tests__/swift-xunit.test.ts
@@ -3,7 +3,7 @@ import * as path from 'path'
import {SwiftXunitParser} from '../src/parsers/swift-xunit/swift-xunit-parser'
import {ParseOptions} from '../src/test-parser'
-import {getReport} from '../src/report/get-report'
+import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report'
import {normalizeFilePath} from '../src/utils/path-utils'
describe('swift-xunit tests', () => {
@@ -27,4 +27,66 @@ describe('swift-xunit tests', () => {
fs.mkdirSync(path.dirname(outputPath), {recursive: true})
fs.writeFileSync(outputPath, report)
})
+
+ it('report does not include a title by default', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'swift-xunit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new SwiftXunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result])
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it.each([
+ ['empty string', ''],
+ ['space', ' '],
+ ['tab', '\t'],
+ ['newline', '\n']
+ ])('report does not include a title when configured value is %s', async (_, reportTitle) => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'swift-xunit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new SwiftXunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle
+ })
+ // Report should have the badge as the first line
+ expect(report).toMatch(/^!\[Tests failed]/)
+ })
+
+ it('report includes a custom report title', async () => {
+ const fixturePath = path.join(__dirname, 'fixtures', 'swift-xunit.xml')
+ const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))
+ const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'})
+
+ const opts: ParseOptions = {
+ parseErrors: true,
+ trackedFiles: []
+ }
+
+ const parser = new SwiftXunitParser(opts)
+ const result = await parser.parse(filePath, fileContent)
+ const report = getReport([result], {
+ ...DEFAULT_OPTIONS,
+ reportTitle: 'My Custom Title'
+ })
+ // Report should have the title as the first line
+ expect(report).toMatch(/^# My Custom Title\n/)
+ })
})
diff --git a/__tests__/utils/parse-utils.test.ts b/__tests__/utils/parse-utils.test.ts
index 83689ef..0f02867 100644
--- a/__tests__/utils/parse-utils.test.ts
+++ b/__tests__/utils/parse-utils.test.ts
@@ -32,6 +32,6 @@ describe('parseNetDuration', () => {
})
it('throws when string has invalid format', () => {
- expect(() => parseNetDuration('12:34:56 not a duration')).toThrowError(/^Invalid format/)
+ expect(() => parseNetDuration('12:34:56 not a duration')).toThrow(/^Invalid format/)
})
})
diff --git a/action.yml b/action.yml
index 8d9d728..530435c 100644
--- a/action.yml
+++ b/action.yml
@@ -1,6 +1,5 @@
name: Test Reporter
-description: |
- Shows test results in GitHub UI: .NET (xUnit, NUnit, MSTest), Dart, Flutter, Java (JUnit), JavaScript (JEST, Mocha)
+description: Displays test results from popular testing frameworks directly in GitHub
author: Michal Dorner
inputs:
artifact:
@@ -26,11 +25,14 @@ inputs:
description: |
Format of test results. Supported options:
- dart-json
+ - dotnet-nunit
- dotnet-trx
- flutter-json
+ - golang-json
- java-junit
- jest-junit
- mocha-json
+ - python-xunit
- rspec-json
- swift-xunit
required: true
@@ -38,14 +40,15 @@ inputs:
description: |
Limits which test suites are listed. Supported options:
- all
- - only-failed
+ - failed
+ - none
required: false
default: 'all'
list-tests:
description: |
Limits which test cases are listed. Supported options:
- all
- - only-failed
+ - failed
- none
required: false
default: 'all'
@@ -66,6 +69,10 @@ inputs:
working-directory:
description: Relative path under $GITHUB_WORKSPACE where the repository was checked out
required: false
+ report-title:
+ description: Title for the test report summary
+ required: false
+ default: ''
only-summary:
description: |
Allows you to generate only the summary.
@@ -73,6 +80,24 @@ inputs:
Detailed listing of test suites and test cases will be skipped.
default: 'false'
required: false
+ use-actions-summary:
+ description: |
+ Allows you to generate reports for Actions Summary
+ https://github.com/orgs/github/teams/engineering/discussions/871
+ default: 'true'
+ required: false
+ badge-title:
+ description: Customize badge title
+ required: false
+ default: 'tests'
+ collapsed:
+ description: |
+ Controls whether test report details are collapsed or expanded. Supported options:
+ - auto: Collapse only if all tests pass (default behavior)
+ - always: Always collapse the report details
+ - never: Always expand the report details
+ required: false
+ default: 'auto'
token:
description: GitHub Access Token
required: false
diff --git a/dist/index.js b/dist/index.js
index dee4468..42cb52e 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -1,7 +1,7 @@
/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
-/***/ 7171:
+/***/ 4548:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -22,33 +22,44 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
}) : function(o, v) {
o["default"] = v;
});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
+var __importStar = (this && this.__importStar) || (function () {
+ var ownKeys = function(o) {
+ ownKeys = Object.getOwnPropertyNames || function (o) {
+ var ar = [];
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+ return ar;
+ };
+ return ownKeys(o);
+ };
+ return function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+ __setModuleDefault(result, mod);
+ return result;
+ };
+})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.ArtifactProvider = void 0;
-const core = __importStar(__nccwpck_require__(2186));
-const github = __importStar(__nccwpck_require__(5438));
-const adm_zip_1 = __importDefault(__nccwpck_require__(6761));
-const picomatch_1 = __importDefault(__nccwpck_require__(8569));
-const github_utils_1 = __nccwpck_require__(3522);
+const core = __importStar(__nccwpck_require__(7484));
+const github = __importStar(__nccwpck_require__(3228));
+const adm_zip_1 = __importDefault(__nccwpck_require__(1316));
+const picomatch_1 = __importDefault(__nccwpck_require__(4006));
+const github_utils_1 = __nccwpck_require__(6667);
class ArtifactProvider {
+ octokit;
+ artifact;
+ name;
+ pattern;
+ sha;
+ runId;
+ token;
+ artifactNameMatch;
+ fileNameMatch;
+ getReportName;
constructor(octokit, artifact, name, pattern, sha, runId, token) {
this.octokit = octokit;
this.artifact = artifact;
@@ -81,60 +92,59 @@ class ArtifactProvider {
}
this.fileNameMatch = (0, picomatch_1.default)(pattern);
}
- load() {
- return __awaiter(this, void 0, void 0, function* () {
- const result = {};
- const resp = yield this.octokit.rest.actions.listWorkflowRunArtifacts(Object.assign(Object.assign({}, github.context.repo), { run_id: this.runId }));
- if (resp.data.artifacts.length === 0) {
- core.warning(`No artifacts found in run ${this.runId}`);
- return {};
- }
- const artifacts = resp.data.artifacts.filter(a => this.artifactNameMatch(a.name));
- if (artifacts.length === 0) {
- core.warning(`No artifact matches ${this.artifact}`);
- return {};
- }
- for (const art of artifacts) {
- const fileName = `${art.name}.zip`;
- yield (0, github_utils_1.downloadArtifact)(this.octokit, art.id, fileName, this.token);
- core.startGroup(`Reading archive ${fileName}`);
- try {
- const reportName = this.getReportName(art.name);
- core.info(`Report name: ${reportName}`);
- const files = [];
- const zip = new adm_zip_1.default(fileName);
- for (const entry of zip.getEntries()) {
- const file = entry.entryName;
- if (entry.isDirectory) {
- core.info(`Skipping ${file}: entry is a directory`);
- continue;
- }
- if (!this.fileNameMatch(file)) {
- core.info(`Skipping ${file}: filename does not match pattern`);
- continue;
- }
- const content = zip.readAsText(entry);
- files.push({ file, content });
- core.info(`Read ${file}: ${content.length} chars`);
- }
- if (result[reportName]) {
- result[reportName].push(...files);
- }
- else {
- result[reportName] = files;
- }
- }
- finally {
- core.endGroup();
- }
- }
- return result;
+ async load() {
+ const result = {};
+ const resp = await this.octokit.rest.actions.listWorkflowRunArtifacts({
+ ...github.context.repo,
+ run_id: this.runId
});
+ if (resp.data.artifacts.length === 0) {
+ core.warning(`No artifacts found in run ${this.runId}`);
+ return {};
+ }
+ const artifacts = resp.data.artifacts.filter(a => this.artifactNameMatch(a.name));
+ if (artifacts.length === 0) {
+ core.warning(`No artifact matches ${this.artifact}`);
+ return {};
+ }
+ for (const art of artifacts) {
+ const fileName = `${art.name}.zip`;
+ await (0, github_utils_1.downloadArtifact)(this.octokit, art.id, fileName, this.token);
+ core.startGroup(`Reading archive ${fileName}`);
+ try {
+ const reportName = this.getReportName(art.name);
+ core.info(`Report name: ${reportName}`);
+ const files = [];
+ const zip = new adm_zip_1.default(fileName);
+ for (const entry of zip.getEntries()) {
+ const file = entry.entryName;
+ if (entry.isDirectory) {
+ core.info(`Skipping ${file}: entry is a directory`);
+ continue;
+ }
+ if (!this.fileNameMatch(file)) {
+ core.info(`Skipping ${file}: filename does not match pattern`);
+ continue;
+ }
+ const content = zip.readAsText(entry);
+ files.push({ file, content });
+ core.info(`Read ${file}: ${content.length} chars`);
+ }
+ if (result[reportName]) {
+ result[reportName].push(...files);
+ }
+ else {
+ result[reportName] = files;
+ }
+ }
+ finally {
+ core.endGroup();
+ }
+ }
+ return result;
}
- listTrackedFiles() {
- return __awaiter(this, void 0, void 0, function* () {
- return (0, github_utils_1.listFiles)(this.octokit, this.sha);
- });
+ async listTrackedFiles() {
+ return (0, github_utils_1.listFiles)(this.octokit, this.sha);
}
}
exports.ArtifactProvider = ArtifactProvider;
@@ -142,7 +152,7 @@ exports.ArtifactProvider = ArtifactProvider;
/***/ }),
-/***/ 9399:
+/***/ 922:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -163,52 +173,51 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
}) : function(o, v) {
o["default"] = v;
});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
+var __importStar = (this && this.__importStar) || (function () {
+ var ownKeys = function(o) {
+ ownKeys = Object.getOwnPropertyNames || function (o) {
+ var ar = [];
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+ return ar;
+ };
+ return ownKeys(o);
+ };
+ return function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+ __setModuleDefault(result, mod);
+ return result;
+ };
+})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.LocalFileProvider = void 0;
-const fs = __importStar(__nccwpck_require__(7147));
-const fast_glob_1 = __importDefault(__nccwpck_require__(3664));
-const git_1 = __nccwpck_require__(9844);
+const fs = __importStar(__nccwpck_require__(9896));
+const fast_glob_1 = __importDefault(__nccwpck_require__(5648));
+const git_1 = __nccwpck_require__(5454);
class LocalFileProvider {
+ name;
+ pattern;
constructor(name, pattern) {
this.name = name;
this.pattern = pattern;
}
- load() {
- return __awaiter(this, void 0, void 0, function* () {
- const result = [];
- for (const pat of this.pattern) {
- const paths = yield (0, fast_glob_1.default)(pat, { dot: true });
- for (const file of paths) {
- const content = yield fs.promises.readFile(file, { encoding: 'utf8' });
- result.push({ file, content });
- }
+ async load() {
+ const result = [];
+ for (const pat of this.pattern) {
+ const paths = await (0, fast_glob_1.default)(pat, { dot: true });
+ for (const file of paths) {
+ const content = await fs.promises.readFile(file, { encoding: 'utf8' });
+ result.push({ file, content });
}
- return { [this.name]: result };
- });
+ }
+ return { [this.name]: result };
}
- listTrackedFiles() {
- return __awaiter(this, void 0, void 0, function* () {
- return (0, git_1.listFiles)();
- });
+ async listTrackedFiles() {
+ return (0, git_1.listFiles)();
}
}
exports.LocalFileProvider = LocalFileProvider;
@@ -216,7 +225,7 @@ exports.LocalFileProvider = LocalFileProvider;
/***/ }),
-/***/ 3109:
+/***/ 5915:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -237,70 +246,77 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
}) : function(o, v) {
o["default"] = v;
});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
+var __importStar = (this && this.__importStar) || (function () {
+ var ownKeys = function(o) {
+ ownKeys = Object.getOwnPropertyNames || function (o) {
+ var ar = [];
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+ return ar;
+ };
+ return ownKeys(o);
+ };
+ return function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+ __setModuleDefault(result, mod);
+ return result;
+ };
+})();
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const core = __importStar(__nccwpck_require__(2186));
-const github = __importStar(__nccwpck_require__(5438));
-const artifact_provider_1 = __nccwpck_require__(7171);
-const local_file_provider_1 = __nccwpck_require__(9399);
-const get_annotations_1 = __nccwpck_require__(5867);
-const get_report_1 = __nccwpck_require__(3737);
-const dart_json_parser_1 = __nccwpck_require__(4528);
-const dotnet_trx_parser_1 = __nccwpck_require__(2664);
-const java_junit_parser_1 = __nccwpck_require__(676);
-const jest_junit_parser_1 = __nccwpck_require__(1113);
-const mocha_json_parser_1 = __nccwpck_require__(6043);
-const rspec_json_parser_1 = __nccwpck_require__(406);
-const swift_xunit_parser_1 = __nccwpck_require__(5366);
-const path_utils_1 = __nccwpck_require__(4070);
-const github_utils_1 = __nccwpck_require__(3522);
-function main() {
- return __awaiter(this, void 0, void 0, function* () {
- try {
- const testReporter = new TestReporter();
- yield testReporter.run();
- }
- catch (error) {
- if (error instanceof Error)
- core.setFailed(error);
- else
- core.setFailed(JSON.stringify(error));
- }
- });
+const core = __importStar(__nccwpck_require__(7484));
+const github = __importStar(__nccwpck_require__(3228));
+const artifact_provider_1 = __nccwpck_require__(4548);
+const local_file_provider_1 = __nccwpck_require__(922);
+const get_annotations_1 = __nccwpck_require__(4400);
+const get_report_1 = __nccwpck_require__(7070);
+const dart_json_parser_1 = __nccwpck_require__(1254);
+const dotnet_nunit_parser_1 = __nccwpck_require__(6394);
+const dotnet_trx_parser_1 = __nccwpck_require__(1658);
+const golang_json_parser_1 = __nccwpck_require__(5162);
+const java_junit_parser_1 = __nccwpck_require__(8342);
+const jest_junit_parser_1 = __nccwpck_require__(1042);
+const mocha_json_parser_1 = __nccwpck_require__(5402);
+const python_xunit_parser_1 = __nccwpck_require__(6578);
+const rspec_json_parser_1 = __nccwpck_require__(9768);
+const swift_xunit_parser_1 = __nccwpck_require__(7330);
+const path_utils_1 = __nccwpck_require__(9132);
+const github_utils_1 = __nccwpck_require__(6667);
+async function main() {
+ try {
+ const testReporter = new TestReporter();
+ await testReporter.run();
+ }
+ catch (error) {
+ if (error instanceof Error)
+ core.setFailed(error);
+ else
+ core.setFailed(JSON.stringify(error));
+ }
}
class TestReporter {
+ artifact = core.getInput('artifact', { required: false });
+ name = core.getInput('name', { required: true });
+ path = core.getInput('path', { required: true });
+ pathReplaceBackslashes = core.getInput('path-replace-backslashes', { required: false }) === 'true';
+ reporter = core.getInput('reporter', { required: true });
+ listSuites = core.getInput('list-suites', { required: true });
+ listTests = core.getInput('list-tests', { required: true });
+ maxAnnotations = parseInt(core.getInput('max-annotations', { required: true }));
+ failOnError = core.getInput('fail-on-error', { required: true }) === 'true';
+ failOnEmpty = core.getInput('fail-on-empty', { required: true }) === 'true';
+ workDirInput = core.getInput('working-directory', { required: false });
+ onlySummary = core.getInput('only-summary', { required: false }) === 'true';
+ useActionsSummary = core.getInput('use-actions-summary', { required: false }) === 'true';
+ badgeTitle = core.getInput('badge-title', { required: false });
+ reportTitle = core.getInput('report-title', { required: false });
+ collapsed = core.getInput('collapsed', { required: false });
+ token = core.getInput('token', { required: true });
+ octokit;
+ context = (0, github_utils_1.getCheckRunContext)();
constructor() {
- this.artifact = core.getInput('artifact', { required: false });
- this.name = core.getInput('name', { required: true });
- this.path = core.getInput('path', { required: true });
- this.pathReplaceBackslashes = core.getInput('path-replace-backslashes', { required: false }) === 'true';
- this.reporter = core.getInput('reporter', { required: true });
- this.listSuites = core.getInput('list-suites', { required: true });
- this.listTests = core.getInput('list-tests', { required: true });
- this.maxAnnotations = parseInt(core.getInput('max-annotations', { required: true }));
- this.failOnError = core.getInput('fail-on-error', { required: true }) === 'true';
- this.failOnEmpty = core.getInput('fail-on-empty', { required: true }) === 'true';
- this.workDirInput = core.getInput('working-directory', { required: false });
- this.onlySummary = core.getInput('only-summary', { required: false }) === 'true';
- this.token = core.getInput('token', { required: true });
- this.context = (0, github_utils_1.getCheckRunContext)();
this.octokit = github.getOctokit(this.token);
- if (this.listSuites !== 'all' && this.listSuites !== 'failed') {
+ if (this.listSuites !== 'all' && this.listSuites !== 'failed' && this.listSuites !== 'none') {
core.setFailed(`Input parameter 'list-suites' has invalid value`);
return;
}
@@ -308,125 +324,168 @@ class TestReporter {
core.setFailed(`Input parameter 'list-tests' has invalid value`);
return;
}
+ if (this.collapsed !== 'auto' && this.collapsed !== 'always' && this.collapsed !== 'never') {
+ core.setFailed(`Input parameter 'collapsed' has invalid value`);
+ return;
+ }
if (isNaN(this.maxAnnotations) || this.maxAnnotations < 0 || this.maxAnnotations > 50) {
core.setFailed(`Input parameter 'max-annotations' has invalid value`);
return;
}
}
- run() {
- return __awaiter(this, void 0, void 0, function* () {
- if (this.workDirInput) {
- core.info(`Changing directory to '${this.workDirInput}'`);
- process.chdir(this.workDirInput);
+ async run() {
+ if (this.workDirInput) {
+ core.info(`Changing directory to '${this.workDirInput}'`);
+ process.chdir(this.workDirInput);
+ }
+ core.info(`Check runs will be created with SHA=${this.context.sha}`);
+ // Split path pattern by ',' and optionally convert all backslashes to forward slashes
+ // fast-glob (micromatch) always interprets backslashes as escape characters instead of directory separators
+ const pathsList = this.path.split(',');
+ const pattern = this.pathReplaceBackslashes ? pathsList.map(path_utils_1.normalizeFilePath) : pathsList;
+ const inputProvider = this.artifact
+ ? new artifact_provider_1.ArtifactProvider(this.octokit, this.artifact, this.name, pattern, this.context.sha, this.context.runId, this.token)
+ : new local_file_provider_1.LocalFileProvider(this.name, pattern);
+ const parseErrors = this.maxAnnotations > 0;
+ const trackedFiles = parseErrors ? await inputProvider.listTrackedFiles() : [];
+ const workDir = this.artifact ? undefined : (0, path_utils_1.normalizeDirPath)(process.cwd(), true);
+ if (parseErrors)
+ core.info(`Found ${trackedFiles.length} files tracked by GitHub`);
+ const options = {
+ workDir,
+ trackedFiles,
+ parseErrors
+ };
+ core.info(`Using test report parser '${this.reporter}'`);
+ const parser = this.getParser(this.reporter, options);
+ const results = [];
+ const input = await inputProvider.load();
+ for (const [reportName, files] of Object.entries(input)) {
+ try {
+ core.startGroup(`Creating test report ${reportName}`);
+ const tr = await this.createReport(parser, reportName, files);
+ results.push(...tr);
}
- core.info(`Check runs will be created with SHA=${this.context.sha}`);
- // Split path pattern by ',' and optionally convert all backslashes to forward slashes
- // fast-glob (micromatch) always interprets backslashes as escape characters instead of directory separators
- const pathsList = this.path.split(',');
- const pattern = this.pathReplaceBackslashes ? pathsList.map(path_utils_1.normalizeFilePath) : pathsList;
- const inputProvider = this.artifact
- ? new artifact_provider_1.ArtifactProvider(this.octokit, this.artifact, this.name, pattern, this.context.sha, this.context.runId, this.token)
- : new local_file_provider_1.LocalFileProvider(this.name, pattern);
- const parseErrors = this.maxAnnotations > 0;
- const trackedFiles = parseErrors ? yield inputProvider.listTrackedFiles() : [];
- const workDir = this.artifact ? undefined : (0, path_utils_1.normalizeDirPath)(process.cwd(), true);
- if (parseErrors)
- core.info(`Found ${trackedFiles.length} files tracked by GitHub`);
- const options = {
- workDir,
- trackedFiles,
- parseErrors
- };
- core.info(`Using test report parser '${this.reporter}'`);
- const parser = this.getParser(this.reporter, options);
- const results = [];
- const input = yield inputProvider.load();
- for (const [reportName, files] of Object.entries(input)) {
- try {
- core.startGroup(`Creating test report ${reportName}`);
- const tr = yield this.createReport(parser, reportName, files);
- results.push(...tr);
- }
- finally {
- core.endGroup();
- }
+ finally {
+ core.endGroup();
}
- const isFailed = results.some(tr => tr.result === 'failed');
- const conclusion = isFailed ? 'failure' : 'success';
- 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);
- const time = results.reduce((sum, tr) => sum + tr.time, 0);
- core.setOutput('conclusion', conclusion);
- core.setOutput('passed', passed);
- core.setOutput('failed', failed);
- core.setOutput('skipped', skipped);
- core.setOutput('time', time);
- if (this.failOnError && isFailed) {
- core.setFailed(`Failed test were found and 'fail-on-error' option is set to ${this.failOnError}`);
- return;
- }
- if (results.length === 0 && this.failOnEmpty) {
- core.setFailed(`No test report files were found`);
- return;
- }
- });
+ }
+ const isFailed = results.some(tr => tr.result === 'failed');
+ const conclusion = isFailed ? 'failure' : 'success';
+ 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);
+ const time = results.reduce((sum, tr) => sum + tr.time, 0);
+ core.setOutput('conclusion', conclusion);
+ core.setOutput('passed', passed);
+ core.setOutput('failed', failed);
+ core.setOutput('skipped', skipped);
+ core.setOutput('time', time);
+ if (this.failOnError && isFailed) {
+ core.setFailed(`Failed test were found and 'fail-on-error' option is set to ${this.failOnError}`);
+ return;
+ }
+ if (results.length === 0 && this.failOnEmpty) {
+ core.setFailed(`No test report files were found`);
+ return;
+ }
}
- createReport(parser, name, files) {
- return __awaiter(this, void 0, void 0, function* () {
- if (files.length === 0) {
- core.warning(`No file matches path ${this.path}`);
- return [];
+ async createReport(parser, name, files) {
+ if (files.length === 0) {
+ core.warning(`No file matches path ${this.path}`);
+ return [];
+ }
+ core.info(`Processing test results for check run ${name}`);
+ const results = [];
+ for (const { file, content } of files) {
+ try {
+ const tr = await parser.parse(file, content);
+ results.push(tr);
}
- core.info(`Processing test results for check run ${name}`);
- const results = [];
- for (const { file, content } of files) {
- try {
- const tr = yield parser.parse(file, content);
- results.push(tr);
- }
- catch (error) {
- core.error(`Processing test results from ${file} failed`);
- throw error;
- }
+ catch (error) {
+ core.error(`Processing test results from ${file} failed`);
+ throw error;
}
+ }
+ const { listSuites, listTests, 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);
+ const shortSummary = `${passed} passed, ${failed} failed and ${skipped} skipped `;
+ let baseUrl = '';
+ if (this.useActionsSummary) {
+ const summary = (0, get_report_1.getReport)(results, {
+ listSuites,
+ listTests,
+ baseUrl,
+ onlySummary,
+ useActionsSummary,
+ badgeTitle,
+ reportTitle,
+ collapsed
+ }, shortSummary);
+ core.info('Summary content:');
+ core.info(summary);
+ await core.summary.addRaw(summary).write();
+ }
+ else {
core.info(`Creating check run ${name}`);
- const createResp = yield this.octokit.rest.checks.create(Object.assign({ head_sha: this.context.sha, name, status: 'in_progress', output: {
+ const createResp = await this.octokit.rest.checks.create({
+ head_sha: this.context.sha,
+ name,
+ status: 'in_progress',
+ output: {
title: name,
summary: ''
- } }, github.context.repo));
+ },
+ ...github.context.repo
+ });
core.info('Creating report summary');
- const { listSuites, listTests, onlySummary } = this;
- const baseUrl = createResp.data.html_url;
- const summary = (0, get_report_1.getReport)(results, { listSuites, listTests, baseUrl, onlySummary });
+ baseUrl = createResp.data.html_url;
+ const summary = (0, get_report_1.getReport)(results, {
+ listSuites,
+ listTests,
+ baseUrl,
+ onlySummary,
+ useActionsSummary,
+ badgeTitle,
+ reportTitle,
+ collapsed
+ });
core.info('Creating annotations');
const annotations = (0, get_annotations_1.getAnnotations)(results, this.maxAnnotations);
const isFailed = this.failOnError && results.some(tr => tr.result === 'failed');
const conclusion = isFailed ? 'failure' : 'success';
- 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);
- const shortSummary = `${passed} passed, ${failed} failed and ${skipped} skipped `;
core.info(`Updating check run conclusion (${conclusion}) and output`);
- const resp = yield this.octokit.rest.checks.update(Object.assign({ check_run_id: createResp.data.id, conclusion, status: 'completed', output: {
+ const resp = await this.octokit.rest.checks.update({
+ check_run_id: createResp.data.id,
+ conclusion,
+ status: 'completed',
+ output: {
title: shortSummary,
summary,
annotations
- } }, github.context.repo));
+ },
+ ...github.context.repo
+ });
core.info(`Check run create response: ${resp.status}`);
core.info(`Check run URL: ${resp.data.url}`);
core.info(`Check run HTML: ${resp.data.html_url}`);
core.setOutput('url', resp.data.url);
core.setOutput('url_html', resp.data.html_url);
- return results;
- });
+ }
+ return results;
}
getParser(reporter, options) {
switch (reporter) {
case 'dart-json':
return new dart_json_parser_1.DartJsonParser(options, 'dart');
+ case 'dotnet-nunit':
+ return new dotnet_nunit_parser_1.DotnetNunitParser(options);
case 'dotnet-trx':
return new dotnet_trx_parser_1.DotnetTrxParser(options);
+ case 'golang-json':
+ return new golang_json_parser_1.GolangJsonParser(options);
case 'flutter-json':
return new dart_json_parser_1.DartJsonParser(options, 'flutter');
case 'java-junit':
@@ -435,6 +494,8 @@ class TestReporter {
return new jest_junit_parser_1.JestJunitParser(options);
case 'mocha-json':
return new mocha_json_parser_1.MochaJsonParser(options);
+ case 'python-xunit':
+ return new python_xunit_parser_1.PythonXunitParser(options);
case 'rspec-json':
return new rspec_json_parser_1.RspecJsonParser(options);
case 'swift-xunit':
@@ -449,26 +510,21 @@ main();
/***/ }),
-/***/ 4528:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+/***/ 1254:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.DartJsonParser = void 0;
-const path_utils_1 = __nccwpck_require__(4070);
-const dart_json_types_1 = __nccwpck_require__(7887);
-const test_results_1 = __nccwpck_require__(2768);
+const path_utils_1 = __nccwpck_require__(9132);
+const dart_json_types_1 = __nccwpck_require__(7064);
+const test_results_1 = __nccwpck_require__(613);
class TestRun {
+ path;
+ suites;
+ success;
+ time;
constructor(path, suites, success, time) {
this.path = path;
this.suites = suites;
@@ -477,32 +533,37 @@ class TestRun {
}
}
class TestSuite {
+ suite;
constructor(suite) {
this.suite = suite;
- this.groups = {};
}
+ groups = {};
}
class TestGroup {
+ group;
constructor(group) {
this.group = group;
- this.tests = [];
}
+ tests = [];
}
class TestCase {
+ testStart;
constructor(testStart) {
this.testStart = testStart;
- this.print = [];
this.groupId = testStart.test.groupIDs[testStart.test.groupIDs.length - 1];
}
+ groupId;
+ print = [];
+ testDone;
+ error;
get result() {
- var _a, _b, _c, _d;
- if ((_a = this.testDone) === null || _a === void 0 ? void 0 : _a.skipped) {
+ if (this.testDone?.skipped) {
return 'skipped';
}
- if (((_b = this.testDone) === null || _b === void 0 ? void 0 : _b.result) === 'success') {
+ if (this.testDone?.result === 'success') {
return 'success';
}
- if (((_c = this.testDone) === null || _c === void 0 ? void 0 : _c.result) === 'error' || ((_d = this.testDone) === null || _d === void 0 ? void 0 : _d.result) === 'failure') {
+ if (this.testDone?.result === 'error' || this.testDone?.result === 'failure') {
return 'failed';
}
return undefined;
@@ -512,16 +573,17 @@ class TestCase {
}
}
class DartJsonParser {
+ options;
+ sdk;
+ assumedWorkDir;
constructor(options, sdk) {
this.options = options;
this.sdk = sdk;
}
- parse(path, content) {
- return __awaiter(this, void 0, void 0, function* () {
- const tr = this.getTestRun(path, content);
- const result = this.getTestRunResult(tr);
- return Promise.resolve(result);
- });
+ async parse(path, content) {
+ const tr = this.getTestRun(path, content);
+ const result = this.getTestRunResult(tr);
+ return Promise.resolve(result);
}
getTestRun(path, content) {
const lines = content.split(/\n\r?/g);
@@ -558,7 +620,7 @@ class DartJsonParser {
group.tests.push(test);
tests[evt.test.id] = test;
}
- else if ((0, dart_json_types_1.isTestDoneEvent)(evt) && !evt.hidden && tests[evt.testID]) {
+ else if ((0, dart_json_types_1.isTestDoneEvent)(evt) && tests[evt.testID]) {
tests[evt.testID].testDone = evt;
}
else if ((0, dart_json_types_1.isErrorEvent)(evt) && tests[evt.testID]) {
@@ -582,10 +644,12 @@ class DartJsonParser {
}
getGroups(suite) {
const groups = Object.values(suite.groups).filter(grp => grp.tests.length > 0);
- groups.sort((a, b) => { var _a, _b; return ((_a = a.group.line) !== null && _a !== void 0 ? _a : 0) - ((_b = b.group.line) !== null && _b !== void 0 ? _b : 0); });
+ groups.sort((a, b) => (a.group.line ?? 0) - (b.group.line ?? 0));
return groups.map(group => {
- group.tests.sort((a, b) => { var _a, _b; return ((_a = a.testStart.test.line) !== null && _a !== void 0 ? _a : 0) - ((_b = b.testStart.test.line) !== null && _b !== void 0 ? _b : 0); });
- const tests = group.tests.map(tc => {
+ group.tests.sort((a, b) => (a.testStart.test.line ?? 0) - (b.testStart.test.line ?? 0));
+ const tests = group.tests
+ .filter(tc => !tc.testDone?.hidden)
+ .map(tc => {
const error = this.getError(suite, tc);
const testName = group.group.name !== undefined && tc.testStart.test.name.startsWith(group.group.name)
? tc.testStart.test.name.slice(group.group.name.length).trim()
@@ -596,19 +660,18 @@ class DartJsonParser {
});
}
getError(testSuite, test) {
- var _a, _b, _c, _d, _e, _f;
if (!this.options.parseErrors || !test.error) {
return undefined;
}
const { trackedFiles } = this.options;
- const stackTrace = (_b = (_a = test.error) === null || _a === void 0 ? void 0 : _a.stackTrace) !== null && _b !== void 0 ? _b : '';
+ const stackTrace = test.error?.stackTrace ?? '';
const print = test.print
.filter(p => p.messageType === 'print')
.map(p => p.message)
.join('\n');
const details = [print, stackTrace].filter(str => str !== '').join('\n');
const src = this.exceptionThrowSource(details, trackedFiles);
- const message = this.getErrorMessage((_d = (_c = test.error) === null || _c === void 0 ? void 0 : _c.error) !== null && _d !== void 0 ? _d : '', print);
+ const message = this.getErrorMessage(test.error?.error ?? '', print);
let path;
let line;
if (src !== undefined) {
@@ -619,7 +682,7 @@ class DartJsonParser {
const testStartPath = this.getRelativePath(testSuite.suite.path);
if (trackedFiles.includes(testStartPath)) {
path = testStartPath;
- line = (_f = (_e = test.testStart.test.root_line) !== null && _e !== void 0 ? _e : test.testStart.test.line) !== null && _f !== void 0 ? _f : undefined;
+ line = test.testStart.test.root_line ?? test.testStart.test.line ?? undefined;
}
}
return {
@@ -673,8 +736,9 @@ class DartJsonParser {
return path;
}
getWorkDir(path) {
- var _a, _b;
- return ((_b = (_a = this.options.workDir) !== null && _a !== void 0 ? _a : this.assumedWorkDir) !== null && _b !== void 0 ? _b : (this.assumedWorkDir = (0, path_utils_1.getBasePath)(path, this.options.trackedFiles)));
+ return (this.options.workDir ??
+ this.assumedWorkDir ??
+ (this.assumedWorkDir = (0, path_utils_1.getBasePath)(path, this.options.trackedFiles)));
}
}
exports.DartJsonParser = DartJsonParser;
@@ -682,73 +746,188 @@ exports.DartJsonParser = DartJsonParser;
/***/ }),
-/***/ 7887:
+/***/ 7064:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
/// reflects documentation at https://github.com/dart-lang/test/blob/master/pkgs/test/doc/json_reporter.md
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.isMessageEvent = exports.isDoneEvent = exports.isErrorEvent = exports.isTestDoneEvent = exports.isTestStartEvent = exports.isGroupEvent = exports.isSuiteEvent = void 0;
+exports.isSuiteEvent = isSuiteEvent;
+exports.isGroupEvent = isGroupEvent;
+exports.isTestStartEvent = isTestStartEvent;
+exports.isTestDoneEvent = isTestDoneEvent;
+exports.isErrorEvent = isErrorEvent;
+exports.isDoneEvent = isDoneEvent;
+exports.isMessageEvent = isMessageEvent;
function isSuiteEvent(event) {
return event.type === 'suite';
}
-exports.isSuiteEvent = isSuiteEvent;
function isGroupEvent(event) {
return event.type === 'group';
}
-exports.isGroupEvent = isGroupEvent;
function isTestStartEvent(event) {
return event.type === 'testStart';
}
-exports.isTestStartEvent = isTestStartEvent;
function isTestDoneEvent(event) {
return event.type === 'testDone';
}
-exports.isTestDoneEvent = isTestDoneEvent;
function isErrorEvent(event) {
return event.type === 'error';
}
-exports.isErrorEvent = isErrorEvent;
function isDoneEvent(event) {
return event.type === 'done';
}
-exports.isDoneEvent = isDoneEvent;
function isMessageEvent(event) {
return event.type === 'print';
}
-exports.isMessageEvent = isMessageEvent;
/***/ }),
-/***/ 2664:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+/***/ 6394:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.DotnetTrxParser = void 0;
-const xml2js_1 = __nccwpck_require__(6189);
-const path_utils_1 = __nccwpck_require__(4070);
-const parse_utils_1 = __nccwpck_require__(7811);
-const test_results_1 = __nccwpck_require__(2768);
-class TestClass {
- constructor(name) {
- this.name = name;
- this.tests = [];
+exports.DotnetNunitParser = void 0;
+const xml2js_1 = __nccwpck_require__(758);
+const node_utils_1 = __nccwpck_require__(5384);
+const path_utils_1 = __nccwpck_require__(9132);
+const test_results_1 = __nccwpck_require__(613);
+class DotnetNunitParser {
+ options;
+ assumedWorkDir;
+ constructor(options) {
+ this.options = options;
+ }
+ async parse(path, content) {
+ const ju = await this.getNunitReport(path, content);
+ return this.getTestRunResult(path, ju);
+ }
+ async getNunitReport(path, content) {
+ try {
+ return (await (0, xml2js_1.parseStringPromise)(content));
+ }
+ catch (e) {
+ throw new Error(`Invalid XML at ${path}\n\n${e}`);
+ }
+ }
+ getTestRunResult(path, nunit) {
+ const suites = [];
+ const time = parseFloat(nunit['test-run'].$.duration) * 1000;
+ this.populateTestCasesRecursive(suites, [], nunit['test-run']['test-suite']);
+ return new test_results_1.TestRunResult(path, suites, time);
+ }
+ populateTestCasesRecursive(result, suitePath, testSuites) {
+ if (testSuites === undefined) {
+ return;
+ }
+ for (const suite of testSuites) {
+ suitePath.push(suite);
+ this.populateTestCasesRecursive(result, suitePath, suite['test-suite']);
+ const testcases = suite['test-case'];
+ if (testcases !== undefined) {
+ for (const testcase of testcases) {
+ this.addTestCase(result, suitePath, testcase);
+ }
+ }
+ suitePath.pop();
+ }
+ }
+ addTestCase(result, suitePath, testCase) {
+ // The last suite in the suite path is the "group".
+ // The rest are concatenated together to form the "suite".
+ // But ignore "Theory" suites.
+ const suitesWithoutTheories = suitePath.filter(suite => suite.$.type !== 'Theory');
+ const suiteName = suitesWithoutTheories
+ .slice(0, suitesWithoutTheories.length - 1)
+ .map(suite => suite.$.name)
+ .join('.');
+ const groupName = suitesWithoutTheories[suitesWithoutTheories.length - 1].$.name;
+ let existingSuite = result.find(suite => suite.name === suiteName);
+ if (existingSuite === undefined) {
+ existingSuite = new test_results_1.TestSuiteResult(suiteName, []);
+ result.push(existingSuite);
+ }
+ let existingGroup = existingSuite.groups.find(group => group.name === groupName);
+ if (existingGroup === undefined) {
+ existingGroup = new test_results_1.TestGroupResult(groupName, []);
+ existingSuite.groups.push(existingGroup);
+ }
+ existingGroup.tests.push(new test_results_1.TestCaseResult(testCase.$.name, this.getTestExecutionResult(testCase), parseFloat(testCase.$.duration) * 1000, this.getTestCaseError(testCase)));
+ }
+ getTestExecutionResult(test) {
+ if (test.$.result === 'Failed' || test.failure)
+ return 'failed';
+ if (test.$.result === 'Skipped')
+ return 'skipped';
+ return 'success';
+ }
+ getTestCaseError(tc) {
+ if (!this.options.parseErrors || !tc.failure || tc.failure.length === 0) {
+ return undefined;
+ }
+ const details = tc.failure[0];
+ let path;
+ let line;
+ if (details['stack-trace'] !== undefined && details['stack-trace'].length > 0) {
+ const src = (0, node_utils_1.getExceptionSource)(details['stack-trace'][0], this.options.trackedFiles, file => this.getRelativePath(file));
+ if (src) {
+ path = src.path;
+ line = src.line;
+ }
+ }
+ return {
+ path,
+ line,
+ message: details.message && details.message.length > 0 ? details.message[0] : '',
+ details: details['stack-trace'] && details['stack-trace'].length > 0 ? details['stack-trace'][0] : ''
+ };
+ }
+ getRelativePath(path) {
+ path = (0, path_utils_1.normalizeFilePath)(path);
+ const workDir = this.getWorkDir(path);
+ if (workDir !== undefined && path.startsWith(workDir)) {
+ path = path.substr(workDir.length);
+ }
+ return path;
+ }
+ getWorkDir(path) {
+ return (this.options.workDir ??
+ this.assumedWorkDir ??
+ (this.assumedWorkDir = (0, path_utils_1.getBasePath)(path, this.options.trackedFiles)));
}
}
+exports.DotnetNunitParser = DotnetNunitParser;
+
+
+/***/ }),
+
+/***/ 1658:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.DotnetTrxParser = void 0;
+const xml2js_1 = __nccwpck_require__(758);
+const path_utils_1 = __nccwpck_require__(9132);
+const parse_utils_1 = __nccwpck_require__(9633);
+const test_results_1 = __nccwpck_require__(613);
+class TestClass {
+ name;
+ constructor(name) {
+ this.name = name;
+ }
+ tests = [];
+}
class Test {
+ name;
+ outcome;
+ duration;
+ error;
constructor(name, outcome, duration, error) {
this.name = name;
this.outcome = outcome;
@@ -767,30 +946,29 @@ class Test {
}
}
class DotnetTrxParser {
+ options;
+ assumedWorkDir;
constructor(options) {
this.options = options;
}
- parse(path, content) {
- return __awaiter(this, void 0, void 0, function* () {
- const trx = yield this.getTrxReport(path, content);
- const tc = this.getTestClasses(trx);
- const tr = this.getTestRunResult(path, trx, tc);
- tr.sort(true);
- return tr;
- });
+ async parse(path, content) {
+ const trx = await this.getTrxReport(path, content);
+ const tc = this.getTestClasses(trx);
+ const tr = this.getTestRunResult(path, trx, tc);
+ tr.sort(true);
+ return tr;
}
- getTrxReport(path, content) {
- return __awaiter(this, void 0, void 0, function* () {
- try {
- return (yield (0, xml2js_1.parseStringPromise)(content));
- }
- catch (e) {
- throw new Error(`Invalid XML at ${path}\n\n${e}`);
- }
- });
+ async getTrxReport(path, content) {
+ try {
+ return (await (0, xml2js_1.parseStringPromise)(content));
+ }
+ catch (e) {
+ throw new Error(`Invalid XML at ${path}\n\n${e}`);
+ }
}
getTestClasses(trx) {
- if (trx.TestRun.TestDefinitions === undefined || trx.TestRun.Results === undefined) {
+ if (trx.TestRun.TestDefinitions === undefined || trx.TestRun.Results === undefined ||
+ !trx.TestRun.TestDefinitions.some(td => td.UnitTest && Array.isArray(td.UnitTest))) {
return [];
}
const unitTests = {};
@@ -805,7 +983,7 @@ class DotnetTrxParser {
}));
const testClasses = {};
for (const r of unitTestsResults) {
- const className = r.test.TestMethod[0].$.className;
+ const className = r.test.TestMethod[0].$.className ?? "Unclassified";
let tc = testClasses[className];
if (tc === undefined) {
tc = new TestClass(className);
@@ -838,12 +1016,11 @@ class DotnetTrxParser {
return new test_results_1.TestRunResult(path, suites, totalTime);
}
getErrorInfo(testResult) {
- var _a;
if (testResult.$.outcome !== 'Failed') {
return undefined;
}
const output = testResult.Output;
- const error = (output === null || output === void 0 ? void 0 : output.length) > 0 && ((_a = output[0].ErrorInfo) === null || _a === void 0 ? void 0 : _a.length) > 0 ? output[0].ErrorInfo[0] : undefined;
+ const error = output?.length > 0 && output[0].ErrorInfo?.length > 0 ? output[0].ErrorInfo[0] : undefined;
return error;
}
getError(test) {
@@ -857,8 +1034,8 @@ class DotnetTrxParser {
error.StackTrace.length === 0) {
return undefined;
}
- const message = test.error.Message[0];
const stackTrace = test.error.StackTrace[0];
+ const message = `${test.error.Message[0]}\n${stackTrace}`;
let path;
let line;
const src = this.exceptionThrowSource(stackTrace);
@@ -870,7 +1047,7 @@ class DotnetTrxParser {
path,
line,
message,
- details: `${message}\n${stackTrace}`
+ details: `${message}`
};
}
exceptionThrowSource(stackTrace) {
@@ -894,8 +1071,9 @@ class DotnetTrxParser {
}
}
getWorkDir(path) {
- var _a, _b;
- return ((_b = (_a = this.options.workDir) !== null && _a !== void 0 ? _a : this.assumedWorkDir) !== null && _b !== void 0 ? _b : (this.assumedWorkDir = (0, path_utils_1.getBasePath)(path, this.options.trackedFiles)));
+ return (this.options.workDir ??
+ this.assumedWorkDir ??
+ (this.assumedWorkDir = (0, path_utils_1.getBasePath)(path, this.options.trackedFiles)));
}
}
exports.DotnetTrxParser = DotnetTrxParser;
@@ -903,7 +1081,107 @@ exports.DotnetTrxParser = DotnetTrxParser;
/***/ }),
-/***/ 676:
+/***/ 5162:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.GolangJsonParser = void 0;
+const test_results_1 = __nccwpck_require__(613);
+class GolangJsonParser {
+ options;
+ assumedWorkDir;
+ constructor(options) {
+ this.options = options;
+ }
+ async parse(path, content) {
+ const events = await this.getGolangTestEvents(path, content);
+ return this.getTestRunResult(path, events);
+ }
+ async getGolangTestEvents(path, content) {
+ return content.trim().split('\n').map((line, index) => {
+ try {
+ return JSON.parse(line);
+ }
+ catch (e) {
+ throw new Error(`Invalid JSON at ${path} line ${index + 1}\n\n${e}`);
+ }
+ });
+ }
+ getTestRunResult(path, events) {
+ const eventGroups = new Map();
+ for (const event of events) {
+ if (!event.Test) {
+ continue;
+ }
+ const k = `${event.Package}/${event.Test}`;
+ let g = eventGroups.get(k);
+ if (!g) {
+ g = [];
+ eventGroups.set(k, g);
+ }
+ g.push(event);
+ }
+ const suites = [];
+ for (const eventGroup of eventGroups.values()) {
+ const event = eventGroup[0];
+ let suite = suites.find(s => s.name === event.Package);
+ if (!suite) {
+ suite = new test_results_1.TestSuiteResult(event.Package, []);
+ suites.push(suite);
+ }
+ if (!event.Test) {
+ continue;
+ }
+ let groupName;
+ let rest;
+ [groupName, ...rest] = event.Test.split('/');
+ let testName = rest.join('/');
+ if (!testName) {
+ testName = groupName;
+ groupName = null;
+ }
+ let group = suite.groups.find(g => g.name === groupName);
+ if (!group) {
+ group = new test_results_1.TestGroupResult(groupName, []);
+ suite.groups.push(group);
+ }
+ const lastEvent = eventGroup.at(-1);
+ const result = lastEvent.Action === 'pass' ? 'success'
+ : lastEvent.Action === 'skip' ? 'skipped'
+ : 'failed';
+ if (lastEvent.Elapsed === undefined) {
+ throw new Error('missing elapsed on final test event');
+ }
+ const time = lastEvent.Elapsed * 1000;
+ let error = undefined;
+ if (result !== 'success') {
+ const outputEvents = eventGroup
+ .filter(e => e.Action === 'output')
+ .map(e => e.Output ?? '')
+ // Go output prepends indentation to help group tests - remove it
+ .map(o => o.replace(/^ /, ''));
+ // First and last lines will be generic "test started" and "test finished" lines - remove them
+ outputEvents.splice(0, 1);
+ outputEvents.splice(-1, 1);
+ const details = outputEvents.join('');
+ error = {
+ message: details,
+ details: details
+ };
+ }
+ group.tests.push(new test_results_1.TestCaseResult(testName, result, time, error));
+ }
+ return new test_results_1.TestRunResult(path, suites);
+ }
+}
+exports.GolangJsonParser = GolangJsonParser;
+
+
+/***/ }),
+
+/***/ 8342:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -924,77 +1202,74 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
}) : function(o, v) {
o["default"] = v;
});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
+var __importStar = (this && this.__importStar) || (function () {
+ var ownKeys = function(o) {
+ ownKeys = Object.getOwnPropertyNames || function (o) {
+ var ar = [];
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+ return ar;
+ };
+ return ownKeys(o);
+ };
+ return function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+ __setModuleDefault(result, mod);
+ return result;
+ };
+})();
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.JavaJunitParser = void 0;
-const path = __importStar(__nccwpck_require__(1017));
-const xml2js_1 = __nccwpck_require__(6189);
-const java_stack_trace_element_parser_1 = __nccwpck_require__(5775);
-const path_utils_1 = __nccwpck_require__(4070);
-const test_results_1 = __nccwpck_require__(2768);
+const path = __importStar(__nccwpck_require__(6928));
+const xml2js_1 = __nccwpck_require__(758);
+const java_stack_trace_element_parser_1 = __nccwpck_require__(8105);
+const path_utils_1 = __nccwpck_require__(9132);
+const test_results_1 = __nccwpck_require__(613);
class JavaJunitParser {
+ options;
+ trackedFiles;
constructor(options) {
- var _a;
this.options = options;
// Map to efficient lookup of all paths with given file name
this.trackedFiles = {};
for (const filePath of options.trackedFiles) {
const fileName = path.basename(filePath);
- const files = (_a = this.trackedFiles[fileName]) !== null && _a !== void 0 ? _a : (this.trackedFiles[fileName] = []);
+ const files = this.trackedFiles[fileName] ?? (this.trackedFiles[fileName] = []);
files.push((0, path_utils_1.normalizeFilePath)(filePath));
}
}
- parse(filePath, content) {
- return __awaiter(this, void 0, void 0, function* () {
- const reportOrSuite = yield this.getJunitReport(filePath, content);
- const isReport = reportOrSuite.testsuites !== undefined;
- // XML might contain:
- // - multiple suites under root node
- // - single as root node
- let ju;
- if (isReport) {
- ju = reportOrSuite;
- }
- else {
- // Make it behave the same way as if suite was inside root node
- const suite = reportOrSuite.testsuite;
- ju = {
- testsuites: {
- $: { time: suite.$.time },
- testsuite: [suite]
- }
- };
- }
- return this.getTestRunResult(filePath, ju);
- });
+ async parse(filePath, content) {
+ const reportOrSuite = await this.getJunitReport(filePath, content);
+ const isReport = reportOrSuite.testsuites !== undefined;
+ // XML might contain:
+ // - multiple suites under root node
+ // - single as root node
+ let ju;
+ if (isReport) {
+ ju = reportOrSuite;
+ }
+ else {
+ // Make it behave the same way as if suite was inside root node
+ const suite = reportOrSuite.testsuite;
+ ju = {
+ testsuites: {
+ $: { time: suite.$.time },
+ testsuite: [suite]
+ }
+ };
+ }
+ return this.getTestRunResult(filePath, ju);
}
- getJunitReport(filePath, content) {
- return __awaiter(this, void 0, void 0, function* () {
- try {
- return yield (0, xml2js_1.parseStringPromise)(content);
- }
- catch (e) {
- throw new Error(`Invalid XML at ${filePath}\n\n${e}`);
- }
- });
+ async getJunitReport(filePath, content) {
+ try {
+ return await (0, xml2js_1.parseStringPromise)(content);
+ }
+ catch (e) {
+ throw new Error(`Invalid XML at ${filePath}\n\n${e}`);
+ }
}
getTestRunResult(filePath, junit) {
- var _a;
const suites = junit.testsuites.testsuite === undefined
? []
: junit.testsuites.testsuite.map(ts => {
@@ -1003,7 +1278,7 @@ class JavaJunitParser {
const sr = new test_results_1.TestSuiteResult(name, this.getGroups(ts), time);
return sr;
});
- const seconds = parseFloat((_a = junit.testsuites.$) === null || _a === void 0 ? void 0 : _a.time);
+ const seconds = parseFloat(junit.testsuites.$?.time);
const time = isNaN(seconds) ? undefined : seconds * 1000;
return new test_results_1.TestRunResult(filePath, suites, time);
}
@@ -1043,12 +1318,11 @@ class JavaJunitParser {
return 'success';
}
getTestCaseError(tc) {
- var _a;
if (!this.options.parseErrors) {
return undefined;
}
// We process and the same way
- const failures = (_a = tc.failure) !== null && _a !== void 0 ? _a : tc.error;
+ const failures = tc.failure ?? tc.error;
if (!failures) {
return undefined;
}
@@ -1063,11 +1337,18 @@ class JavaJunitParser {
line = src.line;
}
}
+ let message;
+ if (typeof failure === 'object') {
+ message = failure.$.message;
+ if (failure.$?.type) {
+ message = failure.$.type + ': ' + message;
+ }
+ }
return {
path: filePath,
line,
details,
- message: typeof failure === 'object' ? failure.message : undefined
+ message
};
}
exceptionThrowSource(stackTrace) {
@@ -1130,13 +1411,13 @@ exports.JavaJunitParser = JavaJunitParser;
/***/ }),
-/***/ 5775:
+/***/ 8105:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.parseStackTraceElement = void 0;
+exports.parseStackTraceElement = parseStackTraceElement;
// classloader and module name are optional:
// at //(:)
// https://github.com/eclipse-openj9/openj9/issues/11452#issuecomment-754946992
@@ -1156,7 +1437,6 @@ function parseStackTraceElement(stackTraceLine) {
}
return undefined;
}
-exports.parseStackTraceElement = parseStackTraceElement;
function parseClassLoaderAndModule(maybeClassLoaderAndModuleNameAndVersion) {
if (maybeClassLoaderAndModuleNameAndVersion) {
const res = maybeClassLoaderAndModuleNameAndVersion.split('/');
@@ -1173,45 +1453,34 @@ function parseClassLoaderAndModule(maybeClassLoaderAndModuleNameAndVersion) {
/***/ }),
-/***/ 1113:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+/***/ 1042:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.JestJunitParser = void 0;
-const xml2js_1 = __nccwpck_require__(6189);
-const node_utils_1 = __nccwpck_require__(5824);
-const path_utils_1 = __nccwpck_require__(4070);
-const test_results_1 = __nccwpck_require__(2768);
+const xml2js_1 = __nccwpck_require__(758);
+const node_utils_1 = __nccwpck_require__(5384);
+const path_utils_1 = __nccwpck_require__(9132);
+const test_results_1 = __nccwpck_require__(613);
class JestJunitParser {
+ options;
+ assumedWorkDir;
constructor(options) {
this.options = options;
}
- parse(path, content) {
- return __awaiter(this, void 0, void 0, function* () {
- const ju = yield this.getJunitReport(path, content);
- return this.getTestRunResult(path, ju);
- });
+ async parse(path, content) {
+ const ju = await this.getJunitReport(path, content);
+ return this.getTestRunResult(path, ju);
}
- getJunitReport(path, content) {
- return __awaiter(this, void 0, void 0, function* () {
- try {
- return (yield (0, xml2js_1.parseStringPromise)(content));
- }
- catch (e) {
- throw new Error(`Invalid XML at ${path}\n\n${e}`);
- }
- });
+ async getJunitReport(path, content) {
+ try {
+ return (await (0, xml2js_1.parseStringPromise)(content));
+ }
+ catch (e) {
+ throw new Error(`Invalid XML at ${path}\n\n${e}`);
+ }
}
getTestRunResult(path, junit) {
const suites = junit.testsuites.testsuite === undefined
@@ -1222,7 +1491,7 @@ class JestJunitParser {
const sr = new test_results_1.TestSuiteResult(name, this.getGroups(ts), time);
return sr;
});
- const time = parseFloat(junit.testsuites.$.time) * 1000;
+ const time = junit.testsuites.$ && parseFloat(junit.testsuites.$.time) * 1000;
return new test_results_1.TestRunResult(path, suites, time);
}
getGroups(suite) {
@@ -1260,7 +1529,7 @@ class JestJunitParser {
if (!this.options.parseErrors || !tc.failure) {
return undefined;
}
- const details = tc.failure[0];
+ const details = typeof tc.failure[0] === 'string' ? tc.failure[0] : tc.failure[0]['_'];
let path;
let line;
const src = (0, node_utils_1.getExceptionSource)(details, this.options.trackedFiles, file => this.getRelativePath(file));
@@ -1283,8 +1552,9 @@ class JestJunitParser {
return path;
}
getWorkDir(path) {
- var _a, _b;
- return ((_b = (_a = this.options.workDir) !== null && _a !== void 0 ? _a : this.assumedWorkDir) !== null && _b !== void 0 ? _b : (this.assumedWorkDir = (0, path_utils_1.getBasePath)(path, this.options.trackedFiles)));
+ return (this.options.workDir ??
+ this.assumedWorkDir ??
+ (this.assumedWorkDir = (0, path_utils_1.getBasePath)(path, this.options.trackedFiles)));
}
escapeCharacters(s) {
return s.replace(/([<>])/g, '\\$1');
@@ -1295,36 +1565,27 @@ exports.JestJunitParser = JestJunitParser;
/***/ }),
-/***/ 6043:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+/***/ 5402:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.MochaJsonParser = void 0;
-const test_results_1 = __nccwpck_require__(2768);
-const node_utils_1 = __nccwpck_require__(5824);
-const path_utils_1 = __nccwpck_require__(4070);
+const test_results_1 = __nccwpck_require__(613);
+const node_utils_1 = __nccwpck_require__(5384);
+const path_utils_1 = __nccwpck_require__(9132);
class MochaJsonParser {
+ options;
+ assumedWorkDir;
constructor(options) {
this.options = options;
}
- parse(path, content) {
- return __awaiter(this, void 0, void 0, function* () {
- const mocha = this.getMochaJson(path, content);
- const result = this.getTestRunResult(path, mocha);
- result.sort(true);
- return Promise.resolve(result);
- });
+ async parse(path, content) {
+ const mocha = this.getMochaJson(path, content);
+ const result = this.getTestRunResult(path, mocha);
+ result.sort(true);
+ return Promise.resolve(result);
}
getMochaJson(path, content) {
try {
@@ -1337,9 +1598,8 @@ class MochaJsonParser {
getTestRunResult(resultsPath, mocha) {
const suitesMap = {};
const getSuite = (test) => {
- var _a;
const path = this.getRelativePath(test.file);
- return (_a = suitesMap[path]) !== null && _a !== void 0 ? _a : (suitesMap[path] = new test_results_1.TestSuiteResult(path, []));
+ return suitesMap[path] ?? (suitesMap[path] = new test_results_1.TestSuiteResult(path, []));
};
for (const test of mocha.passes) {
const suite = getSuite(test);
@@ -1357,7 +1617,6 @@ class MochaJsonParser {
return new test_results_1.TestRunResult(resultsPath, suites, mocha.stats.duration);
}
processTest(suite, test, result) {
- var _a;
const groupName = test.fullTitle !== test.title
? test.fullTitle.substr(0, test.fullTitle.length - test.title.length).trimEnd()
: null;
@@ -1367,7 +1626,7 @@ class MochaJsonParser {
suite.groups.push(group);
}
const error = this.getTestCaseError(test);
- const testCase = new test_results_1.TestCaseResult(test.title, result, (_a = test.duration) !== null && _a !== void 0 ? _a : 0, error);
+ const testCase = new test_results_1.TestCaseResult(test.title, result, test.duration ?? 0, error);
group.tests.push(testCase);
}
getTestCaseError(test) {
@@ -1399,8 +1658,9 @@ class MochaJsonParser {
return path;
}
getWorkDir(path) {
- var _a, _b;
- return ((_b = (_a = this.options.workDir) !== null && _a !== void 0 ? _a : this.assumedWorkDir) !== null && _b !== void 0 ? _b : (this.assumedWorkDir = (0, path_utils_1.getBasePath)(path, this.options.trackedFiles)));
+ return (this.options.workDir ??
+ this.assumedWorkDir ??
+ (this.assumedWorkDir = (0, path_utils_1.getBasePath)(path, this.options.trackedFiles)));
}
}
exports.MochaJsonParser = MochaJsonParser;
@@ -1408,34 +1668,45 @@ exports.MochaJsonParser = MochaJsonParser;
/***/ }),
-/***/ 406:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+/***/ 6578:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.PythonXunitParser = void 0;
+const java_junit_parser_1 = __nccwpck_require__(8342);
+class PythonXunitParser extends java_junit_parser_1.JavaJunitParser {
+ options;
+ constructor(options) {
+ super(options);
+ this.options = options;
+ }
+}
+exports.PythonXunitParser = PythonXunitParser;
+
+
+/***/ }),
+
+/***/ 9768:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.RspecJsonParser = void 0;
-const test_results_1 = __nccwpck_require__(2768);
+const test_results_1 = __nccwpck_require__(613);
class RspecJsonParser {
+ options;
+ assumedWorkDir;
constructor(options) {
this.options = options;
}
- parse(path, content) {
- return __awaiter(this, void 0, void 0, function* () {
- const mocha = this.getRspecJson(path, content);
- const result = this.getTestRunResult(path, mocha);
- result.sort(true);
- return Promise.resolve(result);
- });
+ async parse(path, content) {
+ const mocha = this.getRspecJson(path, content);
+ const result = this.getTestRunResult(path, mocha);
+ result.sort(true);
+ return Promise.resolve(result);
}
getRspecJson(path, content) {
try {
@@ -1448,9 +1719,8 @@ class RspecJsonParser {
getTestRunResult(resultsPath, rspec) {
const suitesMap = {};
const getSuite = (test) => {
- var _a;
const path = test.file_path;
- return (_a = suitesMap[path]) !== null && _a !== void 0 ? _a : (suitesMap[path] = new test_results_1.TestSuiteResult(path, []));
+ return suitesMap[path] ?? (suitesMap[path] = new test_results_1.TestSuiteResult(path, []));
};
for (const test of rspec.examples) {
const suite = getSuite(test);
@@ -1468,7 +1738,6 @@ class RspecJsonParser {
return new test_results_1.TestRunResult(resultsPath, suites, rspec.summary.duration);
}
processTest(suite, test, result) {
- var _a;
const groupName = test.full_description !== test.description
? test.full_description.substr(0, test.full_description.length - test.description.length).trimEnd()
: null;
@@ -1478,13 +1747,12 @@ class RspecJsonParser {
suite.groups.push(group);
}
const error = this.getTestCaseError(test);
- const testCase = new test_results_1.TestCaseResult(test.full_description, result, (_a = test.run_time) !== null && _a !== void 0 ? _a : 0, error);
+ const testCase = new test_results_1.TestCaseResult(test.full_description, result, test.run_time ?? 0, error);
group.tests.push(testCase);
}
getTestCaseError(test) {
- var _a, _b;
- const backtrace = (_a = test.exception) === null || _a === void 0 ? void 0 : _a.backtrace;
- const message = (_b = test.exception) === null || _b === void 0 ? void 0 : _b.message;
+ const backtrace = test.exception?.backtrace;
+ const message = test.exception?.message;
if (backtrace === undefined) {
return undefined;
}
@@ -1523,15 +1791,16 @@ exports.RspecJsonParser = RspecJsonParser;
/***/ }),
-/***/ 5366:
+/***/ 7330:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.SwiftXunitParser = void 0;
-const java_junit_parser_1 = __nccwpck_require__(676);
+const java_junit_parser_1 = __nccwpck_require__(8342);
class SwiftXunitParser extends java_junit_parser_1.JavaJunitParser {
+ options;
constructor(options) {
super(options);
this.options = options;
@@ -1542,17 +1811,16 @@ exports.SwiftXunitParser = SwiftXunitParser;
/***/ }),
-/***/ 5867:
+/***/ 4400:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getAnnotations = void 0;
-const markdown_utils_1 = __nccwpck_require__(6482);
-const parse_utils_1 = __nccwpck_require__(7811);
+exports.getAnnotations = getAnnotations;
+const markdown_utils_1 = __nccwpck_require__(5129);
+const parse_utils_1 = __nccwpck_require__(9633);
function getAnnotations(results, maxCount) {
- var _a, _b, _c, _d;
if (maxCount === 0) {
return [];
}
@@ -1568,8 +1836,8 @@ function getAnnotations(results, maxCount) {
if (err === undefined) {
continue;
}
- const path = (_a = err.path) !== null && _a !== void 0 ? _a : tr.path;
- const line = (_b = err.line) !== null && _b !== void 0 ? _b : 0;
+ const path = err.path ?? tr.path;
+ const line = err.line ?? 0;
if (mergeDup) {
const dup = errors.find(e => path === e.path && line === e.line && err.details === e.details);
if (dup !== undefined) {
@@ -1582,7 +1850,7 @@ function getAnnotations(results, maxCount) {
suiteName: ts.name,
testName: tg.name ? `${tg.name} ► ${tc.name}` : tc.name,
details: err.details,
- message: (_d = (_c = err.message) !== null && _c !== void 0 ? _c : (0, parse_utils_1.getFirstNonEmptyLine)(err.details)) !== null && _d !== void 0 ? _d : 'Test failed',
+ message: err.message ?? (0, parse_utils_1.getFirstNonEmptyLine)(err.details) ?? 'Test failed',
path,
line
});
@@ -1611,7 +1879,6 @@ function getAnnotations(results, maxCount) {
});
return annotations;
}
-exports.getAnnotations = getAnnotations;
function enforceCheckRunLimits(err) {
err.title = (0, markdown_utils_1.ellipsis)(err.title || '', 255);
err.message = (0, markdown_utils_1.ellipsis)(err.message, 65535);
@@ -1630,7 +1897,7 @@ function ident(text, prefix) {
/***/ }),
-/***/ 3737:
+/***/ 7070:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -1651,54 +1918,72 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
}) : function(o, v) {
o["default"] = v;
});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
+var __importStar = (this && this.__importStar) || (function () {
+ var ownKeys = function(o) {
+ ownKeys = Object.getOwnPropertyNames || function (o) {
+ var ar = [];
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+ return ar;
+ };
+ return ownKeys(o);
+ };
+ return function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+ __setModuleDefault(result, mod);
+ return result;
+ };
+})();
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getReport = void 0;
-const core = __importStar(__nccwpck_require__(2186));
-const markdown_utils_1 = __nccwpck_require__(6482);
-const node_utils_1 = __nccwpck_require__(5824);
-const parse_utils_1 = __nccwpck_require__(7811);
-const slugger_1 = __nccwpck_require__(3328);
+exports.DEFAULT_OPTIONS = void 0;
+exports.getReport = getReport;
+exports.getBadge = getBadge;
+const core = __importStar(__nccwpck_require__(7484));
+const markdown_utils_1 = __nccwpck_require__(5129);
+const node_utils_1 = __nccwpck_require__(5384);
+const parse_utils_1 = __nccwpck_require__(9633);
+const slugger_1 = __nccwpck_require__(9537);
const MAX_REPORT_LENGTH = 65535;
-const defaultOptions = {
+const MAX_ACTIONS_SUMMARY_LENGTH = 1048576;
+exports.DEFAULT_OPTIONS = {
listSuites: 'all',
listTests: 'all',
baseUrl: '',
- onlySummary: false
+ onlySummary: false,
+ useActionsSummary: true,
+ badgeTitle: 'tests',
+ reportTitle: '',
+ collapsed: 'auto'
};
-function getReport(results, options = defaultOptions) {
- core.info('Generating check run summary');
+function getReport(results, options = exports.DEFAULT_OPTIONS, shortSummary = '') {
applySort(results);
- const opts = Object.assign({}, options);
- let lines = renderReport(results, opts);
+ const opts = { ...options };
+ let lines = renderReport(results, opts, shortSummary);
let report = lines.join('\n');
- if (getByteLength(report) <= MAX_REPORT_LENGTH) {
+ if (getByteLength(report) <= getMaxReportLength(options)) {
return report;
}
if (opts.listTests === 'all') {
core.info("Test report summary is too big - setting 'listTests' to 'failed'");
opts.listTests = 'failed';
- lines = renderReport(results, opts);
+ lines = renderReport(results, opts, shortSummary);
report = lines.join('\n');
- if (getByteLength(report) <= MAX_REPORT_LENGTH) {
+ if (getByteLength(report) <= getMaxReportLength(options)) {
return report;
}
}
- core.warning(`Test report summary exceeded limit of ${MAX_REPORT_LENGTH} bytes and will be trimmed`);
- return trimReport(lines);
+ core.warning(`Test report summary exceeded limit of ${getMaxReportLength(options)} bytes and will be trimmed`);
+ return trimReport(lines, options);
}
-exports.getReport = getReport;
-function trimReport(lines) {
+function getMaxReportLength(options = exports.DEFAULT_OPTIONS) {
+ return options.useActionsSummary ? MAX_ACTIONS_SUMMARY_LENGTH : MAX_REPORT_LENGTH;
+}
+function trimReport(lines, options) {
const closingBlock = '```';
- const errorMsg = `**Report exceeded GitHub limit of ${MAX_REPORT_LENGTH} bytes and has been trimmed**`;
+ const errorMsg = `**Report exceeded GitHub limit of ${getMaxReportLength(options)} bytes and has been trimmed**`;
const maxErrorMsgLength = closingBlock.length + errorMsg.length + 2;
- const maxReportLength = MAX_REPORT_LENGTH - maxErrorMsgLength;
+ const maxReportLength = getMaxReportLength(options) - maxErrorMsgLength;
let reportLength = 0;
let codeBlock = false;
let endLineIndex = 0;
@@ -1729,21 +2014,28 @@ function applySort(results) {
function getByteLength(text) {
return Buffer.byteLength(text, 'utf8');
}
-function renderReport(results, options) {
+function renderReport(results, options, shortSummary) {
const sections = [];
- const badge = getReportBadge(results);
+ const reportTitle = options.reportTitle.trim();
+ if (reportTitle) {
+ sections.push(`# ${reportTitle}`);
+ }
+ if (shortSummary) {
+ sections.push(`## ${shortSummary}`);
+ }
+ const badge = getReportBadge(results, options);
sections.push(badge);
const runs = getTestRunsReport(results, options);
sections.push(...runs);
return sections;
}
-function getReportBadge(results) {
+function getReportBadge(results, options) {
const passed = results.reduce((sum, tr) => sum + tr.passed, 0);
const skipped = results.reduce((sum, tr) => sum + tr.skipped, 0);
const failed = results.reduce((sum, tr) => sum + tr.failed, 0);
- return getBadge(passed, failed, skipped);
+ return getBadge(passed, failed, skipped, options);
}
-function getBadge(passed, failed, skipped) {
+function getBadge(passed, failed, skipped, options) {
const text = [];
if (passed > 0) {
text.push(`${passed} passed`);
@@ -1763,20 +2055,32 @@ function getBadge(passed, failed, skipped) {
color = 'yellow';
}
const hint = failed > 0 ? 'Tests failed' : 'Tests passed successfully';
- const uri = encodeURIComponent(`tests-${message}-${color}`);
- return ``;
+ const encodedBadgeTitle = encodeImgShieldsURIComponent(options.badgeTitle);
+ const encodedMessage = encodeImgShieldsURIComponent(message);
+ const encodedColor = encodeImgShieldsURIComponent(color);
+ return ``;
}
function getTestRunsReport(testRuns, options) {
const sections = [];
- if (testRuns.length > 1 || options.onlySummary) {
- const tableData = testRuns.map((tr, runIndex) => {
+ const totalFailed = testRuns.reduce((sum, tr) => sum + tr.failed, 0);
+ // Determine if report should be collapsed based on collapsed option
+ const shouldCollapse = options.collapsed === 'always' || (options.collapsed === 'auto' && totalFailed === 0);
+ if (shouldCollapse) {
+ sections.push(`Expand for details
`);
+ sections.push(` `);
+ }
+ if (testRuns.length > 0 || options.onlySummary) {
+ const tableData = testRuns
+ .map((tr, originalIndex) => ({ tr, originalIndex }))
+ .filter(({ tr }) => tr.passed > 0 || tr.failed > 0 || tr.skipped > 0)
+ .map(({ tr, originalIndex }) => {
const time = (0, markdown_utils_1.formatTime)(tr.time);
const name = tr.path;
- const addr = options.baseUrl + makeRunSlug(runIndex).link;
+ const addr = options.baseUrl + makeRunSlug(originalIndex, options).link;
const nameLink = (0, markdown_utils_1.link)(name, addr);
- const passed = tr.passed > 0 ? `${tr.passed}${markdown_utils_1.Icon.success}` : '';
- const failed = tr.failed > 0 ? `${tr.failed}${markdown_utils_1.Icon.fail}` : '';
- const skipped = tr.skipped > 0 ? `${tr.skipped}${markdown_utils_1.Icon.skip}` : '';
+ const passed = tr.passed > 0 ? `${tr.passed} ${markdown_utils_1.Icon.success}` : '';
+ const failed = tr.failed > 0 ? `${tr.failed} ${markdown_utils_1.Icon.fail}` : '';
+ const skipped = tr.skipped > 0 ? `${tr.skipped} ${markdown_utils_1.Icon.skip}` : '';
return [nameLink, passed, failed, skipped, time];
});
const resultsTable = (0, markdown_utils_1.table)(['Report', 'Passed', 'Failed', 'Skipped', 'Time'], [markdown_utils_1.Align.Left, markdown_utils_1.Align.Right, markdown_utils_1.Align.Right, markdown_utils_1.Align.Right, markdown_utils_1.Align.Right], ...tableData);
@@ -1786,33 +2090,38 @@ function getTestRunsReport(testRuns, options) {
const suitesReports = testRuns.map((tr, i) => getSuitesReport(tr, i, options)).flat();
sections.push(...suitesReports);
}
+ if (shouldCollapse) {
+ sections.push(` `);
+ }
return sections;
}
function getSuitesReport(tr, runIndex, options) {
const sections = [];
- const trSlug = makeRunSlug(runIndex);
- const nameLink = `${tr.path}`;
- const icon = getResultIcon(tr.result);
- sections.push(`## ${icon}\xa0${nameLink}`);
- const time = (0, markdown_utils_1.formatTime)(tr.time);
- const headingLine2 = tr.tests > 0
- ? `**${tr.tests}** tests were completed in **${time}** with **${tr.passed}** passed, **${tr.failed}** failed and **${tr.skipped}** skipped.`
- : 'No tests found';
- sections.push(headingLine2);
const suites = options.listSuites === 'failed' ? tr.failedSuites : tr.suites;
- if (suites.length > 0) {
- const suitesTable = (0, markdown_utils_1.table)(['Test suite', 'Passed', 'Failed', 'Skipped', 'Time'], [markdown_utils_1.Align.Left, markdown_utils_1.Align.Right, markdown_utils_1.Align.Right, markdown_utils_1.Align.Right, markdown_utils_1.Align.Right], ...suites.map((s, suiteIndex) => {
- const tsTime = (0, markdown_utils_1.formatTime)(s.time);
- const tsName = s.name;
- const skipLink = options.listTests === 'none' || (options.listTests === 'failed' && s.result !== 'failed');
- const tsAddr = options.baseUrl + makeSuiteSlug(runIndex, suiteIndex).link;
- const tsNameLink = skipLink ? tsName : (0, markdown_utils_1.link)(tsName, tsAddr);
- const passed = s.passed > 0 ? `${s.passed}${markdown_utils_1.Icon.success}` : '';
- const failed = s.failed > 0 ? `${s.failed}${markdown_utils_1.Icon.fail}` : '';
- const skipped = s.skipped > 0 ? `${s.skipped}${markdown_utils_1.Icon.skip}` : '';
- return [tsNameLink, passed, failed, skipped, tsTime];
- }));
- sections.push(suitesTable);
+ if (options.listSuites !== 'none') {
+ const trSlug = makeRunSlug(runIndex, options);
+ const nameLink = `${tr.path}`;
+ const icon = getResultIcon(tr.result);
+ sections.push(`## ${icon}\xa0${nameLink}`);
+ const time = (0, markdown_utils_1.formatTime)(tr.time);
+ const headingLine2 = tr.tests > 0
+ ? `**${tr.tests}** tests were completed in **${time}** with **${tr.passed}** passed, **${tr.failed}** failed and **${tr.skipped}** skipped.`
+ : 'No tests found';
+ sections.push(headingLine2);
+ if (suites.length > 0) {
+ const suitesTable = (0, markdown_utils_1.table)(['Test suite', 'Passed', 'Failed', 'Skipped', 'Time'], [markdown_utils_1.Align.Left, markdown_utils_1.Align.Right, markdown_utils_1.Align.Right, markdown_utils_1.Align.Right, markdown_utils_1.Align.Right], ...suites.map((s, suiteIndex) => {
+ const tsTime = (0, markdown_utils_1.formatTime)(s.time);
+ const tsName = s.name;
+ const skipLink = options.listTests === 'none' || (options.listTests === 'failed' && s.result !== 'failed');
+ const tsAddr = options.baseUrl + makeSuiteSlug(runIndex, suiteIndex, options).link;
+ const tsNameLink = skipLink ? tsName : (0, markdown_utils_1.link)(tsName, tsAddr);
+ const passed = s.passed > 0 ? `${s.passed} ${markdown_utils_1.Icon.success}` : '';
+ const failed = s.failed > 0 ? `${s.failed} ${markdown_utils_1.Icon.fail}` : '';
+ const skipped = s.skipped > 0 ? `${s.skipped} ${markdown_utils_1.Icon.skip}` : '';
+ return [tsNameLink, passed, failed, skipped, tsTime];
+ }));
+ sections.push(suitesTable);
+ }
}
if (options.listTests !== 'none') {
const tests = suites.map((ts, suiteIndex) => getTestsReport(ts, runIndex, suiteIndex, options)).flat();
@@ -1823,7 +2132,6 @@ function getSuitesReport(tr, runIndex, options) {
return sections;
}
function getTestsReport(ts, runIndex, suiteIndex, options) {
- var _a, _b, _c;
if (options.listTests === 'failed' && ts.result !== 'failed') {
return [];
}
@@ -1833,7 +2141,7 @@ function getTestsReport(ts, runIndex, suiteIndex, options) {
}
const sections = [];
const tsName = ts.name;
- const tsSlug = makeSuiteSlug(runIndex, suiteIndex);
+ const tsSlug = makeSuiteSlug(runIndex, suiteIndex, options);
const tsNameLink = `${tsName}`;
const icon = getResultIcon(ts.result);
sections.push(`### ${icon}\xa0${tsNameLink}`);
@@ -1844,10 +2152,15 @@ function getTestsReport(ts, runIndex, suiteIndex, options) {
}
const space = grp.name ? ' ' : '';
for (const tc of grp.tests) {
+ if (options.listTests === 'failed' && tc.result !== 'failed') {
+ continue;
+ }
const result = getResultIcon(tc.result);
sections.push(`${space}${result} ${tc.name}`);
if (tc.error) {
- const lines = (_c = ((_a = tc.error.message) !== null && _a !== void 0 ? _a : (_b = (0, parse_utils_1.getFirstNonEmptyLine)(tc.error.details)) === null || _b === void 0 ? void 0 : _b.trim())) === null || _c === void 0 ? void 0 : _c.split(/\r?\n/g).map(l => '\t' + l);
+ const lines = (tc.error.message ?? (0, parse_utils_1.getFirstNonEmptyLine)(tc.error.details)?.trim())
+ ?.split(/\r?\n/g)
+ .map(l => '\t' + l);
if (lines) {
sections.push(...lines);
}
@@ -1857,13 +2170,13 @@ function getTestsReport(ts, runIndex, suiteIndex, options) {
sections.push('```');
return sections;
}
-function makeRunSlug(runIndex) {
+function makeRunSlug(runIndex, options) {
// use prefix to avoid slug conflicts after escaping the paths
- return (0, slugger_1.slug)(`r${runIndex}`);
+ return (0, slugger_1.slug)(`r${runIndex}`, options);
}
-function makeSuiteSlug(runIndex, suiteIndex) {
+function makeSuiteSlug(runIndex, suiteIndex, options) {
// use prefix to avoid slug conflicts after escaping the paths
- return (0, slugger_1.slug)(`r${runIndex}s${suiteIndex}`);
+ return (0, slugger_1.slug)(`r${runIndex}s${suiteIndex}`, options);
}
function getResultIcon(result) {
switch (result) {
@@ -1877,19 +2190,25 @@ function getResultIcon(result) {
return '';
}
}
+function encodeImgShieldsURIComponent(component) {
+ return encodeURIComponent(component).replace(/-/g, '--').replace(/_/g, '__');
+}
/***/ }),
-/***/ 2768:
+/***/ 613:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.TestCaseResult = exports.TestGroupResult = exports.TestSuiteResult = exports.TestRunResult = void 0;
-const node_utils_1 = __nccwpck_require__(5824);
+const node_utils_1 = __nccwpck_require__(5384);
class TestRunResult {
+ path;
+ suites;
+ totalTime;
constructor(path, suites, totalTime) {
this.path = path;
this.suites = suites;
@@ -1908,8 +2227,7 @@ class TestRunResult {
return this.suites.reduce((sum, g) => sum + g.skipped, 0);
}
get time() {
- var _a;
- return (_a = this.totalTime) !== null && _a !== void 0 ? _a : this.suites.reduce((sum, g) => sum + g.time, 0);
+ return this.totalTime ?? this.suites.reduce((sum, g) => sum + g.time, 0);
}
get result() {
return this.suites.some(t => t.result === 'failed') ? 'failed' : 'success';
@@ -1928,6 +2246,9 @@ class TestRunResult {
}
exports.TestRunResult = TestRunResult;
class TestSuiteResult {
+ name;
+ groups;
+ totalTime;
constructor(name, groups, totalTime) {
this.name = name;
this.groups = groups;
@@ -1946,8 +2267,7 @@ class TestSuiteResult {
return this.groups.reduce((sum, g) => sum + g.skipped, 0);
}
get time() {
- var _a;
- return (_a = this.totalTime) !== null && _a !== void 0 ? _a : this.groups.reduce((sum, g) => sum + g.time, 0);
+ return this.totalTime ?? this.groups.reduce((sum, g) => sum + g.time, 0);
}
get result() {
return this.groups.some(t => t.result === 'failed') ? 'failed' : 'success';
@@ -1956,7 +2276,7 @@ class TestSuiteResult {
return this.groups.filter(grp => grp.result === 'failed');
}
sort(deep) {
- this.groups.sort((a, b) => { var _a, _b; return ((_a = a.name) !== null && _a !== void 0 ? _a : '').localeCompare((_b = b.name) !== null && _b !== void 0 ? _b : '', node_utils_1.DEFAULT_LOCALE); });
+ this.groups.sort((a, b) => (a.name ?? '').localeCompare(b.name ?? '', node_utils_1.DEFAULT_LOCALE));
if (deep) {
for (const grp of this.groups) {
grp.sort();
@@ -1966,6 +2286,8 @@ class TestSuiteResult {
}
exports.TestSuiteResult = TestSuiteResult;
class TestGroupResult {
+ name;
+ tests;
constructor(name, tests) {
this.name = name;
this.tests = tests;
@@ -1994,6 +2316,10 @@ class TestGroupResult {
}
exports.TestGroupResult = TestGroupResult;
class TestCaseResult {
+ name;
+ result;
+ time;
+ error;
constructor(name, result, time, error) {
this.name = name;
this.result = result;
@@ -2006,7 +2332,7 @@ exports.TestCaseResult = TestCaseResult;
/***/ }),
-/***/ 9844:
+/***/ 5454:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -2027,41 +2353,39 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
}) : function(o, v) {
o["default"] = v;
});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
+var __importStar = (this && this.__importStar) || (function () {
+ var ownKeys = function(o) {
+ ownKeys = Object.getOwnPropertyNames || function (o) {
+ var ar = [];
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+ return ar;
+ };
+ return ownKeys(o);
+ };
+ return function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+ __setModuleDefault(result, mod);
+ return result;
+ };
+})();
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.listFiles = void 0;
-const core = __importStar(__nccwpck_require__(2186));
-const exec_1 = __nccwpck_require__(1514);
-function listFiles() {
- return __awaiter(this, void 0, void 0, function* () {
- core.startGroup('Listing all files tracked by git');
- let output = '';
- try {
- output = (yield (0, exec_1.getExecOutput)('git', ['ls-files', '-z'])).stdout;
- }
- finally {
- fixStdOutNullTermination();
- core.endGroup();
- }
- return output.split('\u0000').filter(s => s.length > 0);
- });
-}
exports.listFiles = listFiles;
+const core = __importStar(__nccwpck_require__(7484));
+const exec_1 = __nccwpck_require__(5236);
+async function listFiles() {
+ core.startGroup('Listing all files tracked by git');
+ let output = '';
+ try {
+ output = (await (0, exec_1.getExecOutput)('git', ['ls-files', '-z'])).stdout;
+ }
+ finally {
+ fixStdOutNullTermination();
+ core.endGroup();
+ }
+ return output.split('\u0000').filter(s => s.length > 0);
+}
function fixStdOutNullTermination() {
// Previous command uses NULL as delimiters and output is printed to stdout.
// We have to make sure next thing written to stdout will start on new line.
@@ -2072,7 +2396,7 @@ function fixStdOutNullTermination() {
/***/ }),
-/***/ 3522:
+/***/ 6667:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -2093,33 +2417,36 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
}) : function(o, v) {
o["default"] = v;
});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
+var __importStar = (this && this.__importStar) || (function () {
+ var ownKeys = function(o) {
+ ownKeys = Object.getOwnPropertyNames || function (o) {
+ var ar = [];
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+ return ar;
+ };
+ return ownKeys(o);
+ };
+ return function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+ __setModuleDefault(result, mod);
+ return result;
+ };
+})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.listFiles = exports.downloadArtifact = exports.getCheckRunContext = void 0;
-const fs_1 = __nccwpck_require__(7147);
-const core = __importStar(__nccwpck_require__(2186));
-const github = __importStar(__nccwpck_require__(5438));
-const stream = __importStar(__nccwpck_require__(2781));
-const util_1 = __nccwpck_require__(3837);
-const got_1 = __importDefault(__nccwpck_require__(3061));
+exports.getCheckRunContext = getCheckRunContext;
+exports.downloadArtifact = downloadArtifact;
+exports.listFiles = listFiles;
+const fs_1 = __nccwpck_require__(9896);
+const core = __importStar(__nccwpck_require__(7484));
+const github = __importStar(__nccwpck_require__(3228));
+const stream = __importStar(__nccwpck_require__(2203));
+const util_1 = __nccwpck_require__(9023);
+const got_1 = __importDefault(__nccwpck_require__(6757));
const asyncStream = (0, util_1.promisify)(stream.pipeline);
function getCheckRunContext() {
if (github.context.eventName === 'workflow_run') {
@@ -2141,96 +2468,92 @@ function getCheckRunContext() {
}
return { sha: github.context.sha, runId };
}
-exports.getCheckRunContext = getCheckRunContext;
-function downloadArtifact(octokit, artifactId, fileName, token) {
- return __awaiter(this, void 0, void 0, function* () {
- core.startGroup(`Downloading artifact ${fileName}`);
- try {
- core.info(`Artifact ID: ${artifactId}`);
- const req = octokit.rest.actions.downloadArtifact.endpoint(Object.assign(Object.assign({}, github.context.repo), { artifact_id: artifactId, archive_format: 'zip' }));
- const headers = {
- Authorization: `Bearer ${token}`
- };
- const resp = yield (0, got_1.default)(req.url, {
- headers,
- followRedirect: false
- });
- core.info(`Fetch artifact URL: ${resp.statusCode} ${resp.statusMessage}`);
- if (resp.statusCode !== 302) {
- throw new Error('Fetch artifact URL failed: received unexpected status code');
- }
- const url = resp.headers.location;
- if (url === undefined) {
- const receivedHeaders = Object.keys(resp.headers);
- core.info(`Received headers: ${receivedHeaders.join(', ')}`);
- throw new Error('Location header was not found in API response');
- }
- if (typeof url !== 'string') {
- throw new Error(`Location header has unexpected value: ${url}`);
- }
- const downloadStream = got_1.default.stream(url, { headers });
- const fileWriterStream = (0, fs_1.createWriteStream)(fileName);
- core.info(`Downloading ${url}`);
- downloadStream.on('downloadProgress', ({ transferred }) => {
- core.info(`Progress: ${transferred} B`);
- });
- yield asyncStream(downloadStream, fileWriterStream);
- }
- finally {
- core.endGroup();
- }
- });
+async function downloadArtifact(octokit, artifactId, fileName, token) {
+ core.startGroup(`Downloading artifact ${fileName}`);
+ try {
+ core.info(`Artifact ID: ${artifactId}`);
+ const req = octokit.rest.actions.downloadArtifact.endpoint({
+ ...github.context.repo,
+ artifact_id: artifactId,
+ archive_format: 'zip'
+ });
+ const headers = {
+ Authorization: `Bearer ${token}`
+ };
+ const downloadStream = got_1.default.stream(req.url, { headers });
+ const fileWriterStream = (0, fs_1.createWriteStream)(fileName);
+ downloadStream.on('redirect', (response) => {
+ core.info(`Downloading ${response.headers.location}`);
+ });
+ downloadStream.on('downloadProgress', (progress) => {
+ core.info(`Progress: ${progress.transferred} B`);
+ });
+ await asyncStream(downloadStream, fileWriterStream);
+ }
+ finally {
+ core.endGroup();
+ }
}
-exports.downloadArtifact = downloadArtifact;
-function listFiles(octokit, sha) {
- return __awaiter(this, void 0, void 0, function* () {
- core.startGroup('Fetching list of tracked files from GitHub');
- try {
- const commit = yield octokit.rest.git.getCommit(Object.assign({ commit_sha: sha }, github.context.repo));
- const files = yield listGitTree(octokit, commit.data.tree.sha, '');
- return files;
- }
- finally {
- core.endGroup();
- }
- });
+async function listFiles(octokit, sha) {
+ core.startGroup('Fetching list of tracked files from GitHub');
+ try {
+ const commit = await octokit.rest.git.getCommit({
+ commit_sha: sha,
+ ...github.context.repo
+ });
+ const files = await listGitTree(octokit, commit.data.tree.sha, '');
+ return files;
+ }
+ finally {
+ core.endGroup();
+ }
}
-exports.listFiles = listFiles;
-function listGitTree(octokit, sha, path) {
- return __awaiter(this, void 0, void 0, function* () {
- const pathLog = path ? ` at ${path}` : '';
- core.info(`Fetching tree ${sha}${pathLog}`);
- let truncated = false;
- let tree = yield octokit.rest.git.getTree(Object.assign({ recursive: 'true', tree_sha: sha }, github.context.repo));
- if (tree.data.truncated) {
- truncated = true;
- tree = yield octokit.rest.git.getTree(Object.assign({ tree_sha: sha }, github.context.repo));
- }
- const result = [];
- for (const tr of tree.data.tree) {
- const file = `${path}${tr.path}`;
- if (tr.type === 'blob') {
- result.push(file);
- }
- else if (tr.type === 'tree' && truncated) {
- const files = yield listGitTree(octokit, tr.sha, `${file}/`);
- result.push(...files);
- }
- }
- return result;
+async function listGitTree(octokit, sha, path) {
+ const pathLog = path ? ` at ${path}` : '';
+ core.info(`Fetching tree ${sha}${pathLog}`);
+ let truncated = false;
+ let tree = await octokit.rest.git.getTree({
+ recursive: 'true',
+ tree_sha: sha,
+ ...github.context.repo
});
+ if (tree.data.truncated) {
+ truncated = true;
+ tree = await octokit.rest.git.getTree({
+ tree_sha: sha,
+ ...github.context.repo
+ });
+ }
+ const result = [];
+ for (const tr of tree.data.tree) {
+ const file = `${path}${tr.path}`;
+ if (tr.type === 'blob') {
+ result.push(file);
+ }
+ else if (tr.type === 'tree' && truncated) {
+ const files = await listGitTree(octokit, tr.sha, `${file}/`);
+ result.push(...files);
+ }
+ }
+ return result;
}
/***/ }),
-/***/ 6482:
+/***/ 5129:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.formatTime = exports.ellipsis = exports.fixEol = exports.tableEscape = exports.table = exports.link = exports.Icon = exports.Align = void 0;
+exports.Icon = exports.Align = void 0;
+exports.link = link;
+exports.table = table;
+exports.tableEscape = tableEscape;
+exports.fixEol = fixEol;
+exports.ellipsis = ellipsis;
+exports.formatTime = formatTime;
var Align;
(function (Align) {
Align["Left"] = ":---";
@@ -2246,49 +2569,43 @@ exports.Icon = {
function link(title, address) {
return `[${title}](${address})`;
}
-exports.link = link;
function table(headers, align, ...rows) {
const headerRow = `|${headers.map(tableEscape).join('|')}|`;
const alignRow = `|${align.join('|')}|`;
const contentRows = rows.map(row => `|${row.map(tableEscape).join('|')}|`).join('\n');
return [headerRow, alignRow, contentRows].join('\n');
}
-exports.table = table;
function tableEscape(content) {
return content.toString().replace('|', '\\|');
}
-exports.tableEscape = tableEscape;
function fixEol(text) {
- var _a;
- return (_a = text === null || text === void 0 ? void 0 : text.replace(/\r/g, '')) !== null && _a !== void 0 ? _a : '';
+ return text?.replace(/\r/g, '') ?? '';
}
-exports.fixEol = fixEol;
function ellipsis(text, maxLength) {
if (text.length <= maxLength) {
return text;
}
return text.substr(0, maxLength - 3) + '...';
}
-exports.ellipsis = ellipsis;
function formatTime(ms) {
if (ms > 1000) {
return `${Math.round(ms / 1000)}s`;
}
return `${Math.round(ms)}ms`;
}
-exports.formatTime = formatTime;
/***/ }),
-/***/ 5824:
+/***/ 5384:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getExceptionSource = exports.DEFAULT_LOCALE = void 0;
-const path_utils_1 = __nccwpck_require__(4070);
+exports.DEFAULT_LOCALE = void 0;
+exports.getExceptionSource = getExceptionSource;
+const path_utils_1 = __nccwpck_require__(9132);
exports.DEFAULT_LOCALE = 'en-US';
function getExceptionSource(stackTrace, trackedFiles, getRelativePath) {
const lines = stackTrace.split(/\r?\n/);
@@ -2312,18 +2629,19 @@ function getExceptionSource(stackTrace, trackedFiles, getRelativePath) {
}
}
}
-exports.getExceptionSource = getExceptionSource;
/***/ }),
-/***/ 7811:
+/***/ 9633:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getFirstNonEmptyLine = exports.parseIsoDate = exports.parseNetDuration = void 0;
+exports.parseNetDuration = parseNetDuration;
+exports.parseIsoDate = parseIsoDate;
+exports.getFirstNonEmptyLine = getFirstNonEmptyLine;
function parseNetDuration(str) {
const durationRe = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)$/;
const durationMatch = str.match(durationRe);
@@ -2333,7 +2651,6 @@ function parseNetDuration(str) {
const [_, hourStr, minStr, secStr] = durationMatch;
return (parseInt(hourStr) * 3600 + parseInt(minStr) * 60 + parseFloat(secStr)) * 1000;
}
-exports.parseNetDuration = parseNetDuration;
function parseIsoDate(str) {
const isoDateRe = /^\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)$/;
if (str === undefined || !isoDateRe.test(str)) {
@@ -2341,23 +2658,23 @@ function parseIsoDate(str) {
}
return new Date(str);
}
-exports.parseIsoDate = parseIsoDate;
function getFirstNonEmptyLine(stackTrace) {
- const lines = stackTrace === null || stackTrace === void 0 ? void 0 : stackTrace.split(/\r?\n/g);
- return lines === null || lines === void 0 ? void 0 : lines.find(str => !/^\s*$/.test(str));
+ const lines = stackTrace?.split(/\r?\n/g);
+ return lines?.find(str => !/^\s*$/.test(str));
}
-exports.getFirstNonEmptyLine = getFirstNonEmptyLine;
/***/ }),
-/***/ 4070:
+/***/ 9132:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getBasePath = exports.normalizeFilePath = exports.normalizeDirPath = void 0;
+exports.normalizeDirPath = normalizeDirPath;
+exports.normalizeFilePath = normalizeFilePath;
+exports.getBasePath = getBasePath;
function normalizeDirPath(path, addTrailingSlash) {
if (!path) {
return path;
@@ -2368,14 +2685,12 @@ function normalizeDirPath(path, addTrailingSlash) {
}
return path;
}
-exports.normalizeDirPath = normalizeDirPath;
function normalizeFilePath(path) {
if (!path) {
return path;
}
return path.trim().replace(/\\/g, '/');
}
-exports.normalizeFilePath = normalizeFilePath;
function getBasePath(path, trackedFiles) {
if (trackedFiles.includes(path)) {
return '';
@@ -2392,44 +2707,44 @@ function getBasePath(path, trackedFiles) {
const base = path.substr(0, path.length - max.length);
return base;
}
-exports.getBasePath = getBasePath;
/***/ }),
-/***/ 3328:
+/***/ 9537:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.slug = void 0;
-// Returns HTML element id and href link usable as manual anchor links
-// This is needed because Github in check run summary doesn't automatically
-// create links out of headings as it normally does for other markdown content
-function slug(name) {
+exports.slug = slug;
+function slug(name, options) {
const slugId = name
.trim()
.replace(/_/g, '')
.replace(/[./\\]/g, '-')
.replace(/[^\w-]/g, '');
const id = `user-content-${slugId}`;
- const link = `#${slugId}`;
+ // When using the Action Summary for display, links must include the "user-content-" prefix.
+ const link = options.useActionsSummary ? `#${id}` : `#${slugId}`;
return { id, link };
}
-exports.slug = slug;
/***/ }),
-/***/ 7351:
+/***/ 4914:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
@@ -2442,14 +2757,14 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.issue = exports.issueCommand = void 0;
-const os = __importStar(__nccwpck_require__(2037));
-const utils_1 = __nccwpck_require__(5278);
+const os = __importStar(__nccwpck_require__(857));
+const utils_1 = __nccwpck_require__(302);
/**
* Commands
*
@@ -2504,13 +2819,13 @@ class Command {
}
}
function escapeData(s) {
- return utils_1.toCommandValue(s)
+ return (0, utils_1.toCommandValue)(s)
.replace(/%/g, '%25')
.replace(/\r/g, '%0D')
.replace(/\n/g, '%0A');
}
function escapeProperty(s) {
- return utils_1.toCommandValue(s)
+ return (0, utils_1.toCommandValue)(s)
.replace(/%/g, '%25')
.replace(/\r/g, '%0D')
.replace(/\n/g, '%0A')
@@ -2521,14 +2836,18 @@ function escapeProperty(s) {
/***/ }),
-/***/ 2186:
+/***/ 7484:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
@@ -2541,7 +2860,7 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
@@ -2555,13 +2874,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
});
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0;
-const command_1 = __nccwpck_require__(7351);
-const file_command_1 = __nccwpck_require__(717);
-const utils_1 = __nccwpck_require__(5278);
-const os = __importStar(__nccwpck_require__(2037));
-const path = __importStar(__nccwpck_require__(1017));
-const oidc_utils_1 = __nccwpck_require__(8041);
+exports.platform = exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = exports.markdownSummary = exports.summary = exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0;
+const command_1 = __nccwpck_require__(4914);
+const file_command_1 = __nccwpck_require__(4753);
+const utils_1 = __nccwpck_require__(302);
+const os = __importStar(__nccwpck_require__(857));
+const path = __importStar(__nccwpck_require__(6928));
+const oidc_utils_1 = __nccwpck_require__(5306);
/**
* The code to exit an action
*/
@@ -2575,7 +2894,7 @@ var ExitCode;
* A code indicating that the action was a failure
*/
ExitCode[ExitCode["Failure"] = 1] = "Failure";
-})(ExitCode = exports.ExitCode || (exports.ExitCode = {}));
+})(ExitCode || (exports.ExitCode = ExitCode = {}));
//-----------------------------------------------------------------------
// Variables
//-----------------------------------------------------------------------
@@ -2586,13 +2905,13 @@ var ExitCode;
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function exportVariable(name, val) {
- const convertedVal = utils_1.toCommandValue(val);
+ const convertedVal = (0, utils_1.toCommandValue)(val);
process.env[name] = convertedVal;
const filePath = process.env['GITHUB_ENV'] || '';
if (filePath) {
- return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
+ return (0, file_command_1.issueFileCommand)('ENV', (0, file_command_1.prepareKeyValueMessage)(name, val));
}
- command_1.issueCommand('set-env', { name }, convertedVal);
+ (0, command_1.issueCommand)('set-env', { name }, convertedVal);
}
exports.exportVariable = exportVariable;
/**
@@ -2600,7 +2919,7 @@ exports.exportVariable = exportVariable;
* @param secret value of the secret
*/
function setSecret(secret) {
- command_1.issueCommand('add-mask', {}, secret);
+ (0, command_1.issueCommand)('add-mask', {}, secret);
}
exports.setSecret = setSecret;
/**
@@ -2610,10 +2929,10 @@ exports.setSecret = setSecret;
function addPath(inputPath) {
const filePath = process.env['GITHUB_PATH'] || '';
if (filePath) {
- file_command_1.issueFileCommand('PATH', inputPath);
+ (0, file_command_1.issueFileCommand)('PATH', inputPath);
}
else {
- command_1.issueCommand('add-path', {}, inputPath);
+ (0, command_1.issueCommand)('add-path', {}, inputPath);
}
process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;
}
@@ -2688,10 +3007,10 @@ exports.getBooleanInput = getBooleanInput;
function setOutput(name, value) {
const filePath = process.env['GITHUB_OUTPUT'] || '';
if (filePath) {
- return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+ return (0, file_command_1.issueFileCommand)('OUTPUT', (0, file_command_1.prepareKeyValueMessage)(name, value));
}
process.stdout.write(os.EOL);
- command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
+ (0, command_1.issueCommand)('set-output', { name }, (0, utils_1.toCommandValue)(value));
}
exports.setOutput = setOutput;
/**
@@ -2700,7 +3019,7 @@ exports.setOutput = setOutput;
*
*/
function setCommandEcho(enabled) {
- command_1.issue('echo', enabled ? 'on' : 'off');
+ (0, command_1.issue)('echo', enabled ? 'on' : 'off');
}
exports.setCommandEcho = setCommandEcho;
//-----------------------------------------------------------------------
@@ -2731,7 +3050,7 @@ exports.isDebug = isDebug;
* @param message debug message
*/
function debug(message) {
- command_1.issueCommand('debug', {}, message);
+ (0, command_1.issueCommand)('debug', {}, message);
}
exports.debug = debug;
/**
@@ -2740,7 +3059,7 @@ exports.debug = debug;
* @param properties optional properties to add to the annotation.
*/
function error(message, properties = {}) {
- command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);
+ (0, command_1.issueCommand)('error', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);
}
exports.error = error;
/**
@@ -2749,7 +3068,7 @@ exports.error = error;
* @param properties optional properties to add to the annotation.
*/
function warning(message, properties = {}) {
- command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);
+ (0, command_1.issueCommand)('warning', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);
}
exports.warning = warning;
/**
@@ -2758,7 +3077,7 @@ exports.warning = warning;
* @param properties optional properties to add to the annotation.
*/
function notice(message, properties = {}) {
- command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);
+ (0, command_1.issueCommand)('notice', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);
}
exports.notice = notice;
/**
@@ -2777,14 +3096,14 @@ exports.info = info;
* @param name The name of the output group
*/
function startGroup(name) {
- command_1.issue('group', name);
+ (0, command_1.issue)('group', name);
}
exports.startGroup = startGroup;
/**
* End an output group.
*/
function endGroup() {
- command_1.issue('endgroup');
+ (0, command_1.issue)('endgroup');
}
exports.endGroup = endGroup;
/**
@@ -2822,9 +3141,9 @@ exports.group = group;
function saveState(name, value) {
const filePath = process.env['GITHUB_STATE'] || '';
if (filePath) {
- return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+ return (0, file_command_1.issueFileCommand)('STATE', (0, file_command_1.prepareKeyValueMessage)(name, value));
}
- command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
+ (0, command_1.issueCommand)('save-state', { name }, (0, utils_1.toCommandValue)(value));
}
exports.saveState = saveState;
/**
@@ -2846,25 +3165,29 @@ exports.getIDToken = getIDToken;
/**
* Summary exports
*/
-var summary_1 = __nccwpck_require__(1327);
+var summary_1 = __nccwpck_require__(1847);
Object.defineProperty(exports, "summary", ({ enumerable: true, get: function () { return summary_1.summary; } }));
/**
* @deprecated use core.summary
*/
-var summary_2 = __nccwpck_require__(1327);
+var summary_2 = __nccwpck_require__(1847);
Object.defineProperty(exports, "markdownSummary", ({ enumerable: true, get: function () { return summary_2.markdownSummary; } }));
/**
* Path exports
*/
-var path_utils_1 = __nccwpck_require__(2981);
+var path_utils_1 = __nccwpck_require__(1976);
Object.defineProperty(exports, "toPosixPath", ({ enumerable: true, get: function () { return path_utils_1.toPosixPath; } }));
Object.defineProperty(exports, "toWin32Path", ({ enumerable: true, get: function () { return path_utils_1.toWin32Path; } }));
Object.defineProperty(exports, "toPlatformPath", ({ enumerable: true, get: function () { return path_utils_1.toPlatformPath; } }));
+/**
+ * Platform utilities exports
+ */
+exports.platform = __importStar(__nccwpck_require__(8968));
//# sourceMappingURL=core.js.map
/***/ }),
-/***/ 717:
+/***/ 4753:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -2872,7 +3195,11 @@ Object.defineProperty(exports, "toPlatformPath", ({ enumerable: true, get: funct
// For internal use, subject to change.
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
@@ -2885,7 +3212,7 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
@@ -2893,10 +3220,10 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
// We use any as a valid input type
/* eslint-disable @typescript-eslint/no-explicit-any */
-const fs = __importStar(__nccwpck_require__(7147));
-const os = __importStar(__nccwpck_require__(2037));
-const uuid_1 = __nccwpck_require__(5840);
-const utils_1 = __nccwpck_require__(5278);
+const crypto = __importStar(__nccwpck_require__(6982));
+const fs = __importStar(__nccwpck_require__(9896));
+const os = __importStar(__nccwpck_require__(857));
+const utils_1 = __nccwpck_require__(302);
function issueFileCommand(command, message) {
const filePath = process.env[`GITHUB_${command}`];
if (!filePath) {
@@ -2905,14 +3232,14 @@ function issueFileCommand(command, message) {
if (!fs.existsSync(filePath)) {
throw new Error(`Missing file at path: ${filePath}`);
}
- fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, {
+ fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os.EOL}`, {
encoding: 'utf8'
});
}
exports.issueFileCommand = issueFileCommand;
function prepareKeyValueMessage(key, value) {
- const delimiter = `ghadelimiter_${uuid_1.v4()}`;
- const convertedValue = utils_1.toCommandValue(value);
+ const delimiter = `ghadelimiter_${crypto.randomUUID()}`;
+ const convertedValue = (0, utils_1.toCommandValue)(value);
// These should realistically never happen, but just in case someone finds a
// way to exploit uuid generation let's not allow keys or values that contain
// the delimiter.
@@ -2929,7 +3256,7 @@ exports.prepareKeyValueMessage = prepareKeyValueMessage;
/***/ }),
-/***/ 8041:
+/***/ 5306:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -2945,9 +3272,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.OidcClient = void 0;
-const http_client_1 = __nccwpck_require__(6255);
-const auth_1 = __nccwpck_require__(5526);
-const core_1 = __nccwpck_require__(2186);
+const http_client_1 = __nccwpck_require__(4844);
+const auth_1 = __nccwpck_require__(4552);
+const core_1 = __nccwpck_require__(7484);
class OidcClient {
static createHttpClient(allowRetry = true, maxRetry = 10) {
const requestOptions = {
@@ -2997,9 +3324,9 @@ class OidcClient {
const encodedAudience = encodeURIComponent(audience);
id_token_url = `${id_token_url}&audience=${encodedAudience}`;
}
- core_1.debug(`ID token url is ${id_token_url}`);
+ (0, core_1.debug)(`ID token url is ${id_token_url}`);
const id_token = yield OidcClient.getCall(id_token_url);
- core_1.setSecret(id_token);
+ (0, core_1.setSecret)(id_token);
return id_token;
}
catch (error) {
@@ -3013,14 +3340,18 @@ exports.OidcClient = OidcClient;
/***/ }),
-/***/ 2981:
+/***/ 1976:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
@@ -3033,13 +3364,13 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0;
-const path = __importStar(__nccwpck_require__(1017));
+const path = __importStar(__nccwpck_require__(6928));
/**
* toPosixPath converts the given path to the posix form. On Windows, \\ will be
* replaced with /.
@@ -3078,7 +3409,108 @@ exports.toPlatformPath = toPlatformPath;
/***/ }),
-/***/ 1327:
+/***/ 8968:
+/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+
+"use strict";
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.getDetails = exports.isLinux = exports.isMacOS = exports.isWindows = exports.arch = exports.platform = void 0;
+const os_1 = __importDefault(__nccwpck_require__(857));
+const exec = __importStar(__nccwpck_require__(5236));
+const getWindowsInfo = () => __awaiter(void 0, void 0, void 0, function* () {
+ const { stdout: version } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"', undefined, {
+ silent: true
+ });
+ const { stdout: name } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"', undefined, {
+ silent: true
+ });
+ return {
+ name: name.trim(),
+ version: version.trim()
+ };
+});
+const getMacOsInfo = () => __awaiter(void 0, void 0, void 0, function* () {
+ var _a, _b, _c, _d;
+ const { stdout } = yield exec.getExecOutput('sw_vers', undefined, {
+ silent: true
+ });
+ const version = (_b = (_a = stdout.match(/ProductVersion:\s*(.+)/)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : '';
+ const name = (_d = (_c = stdout.match(/ProductName:\s*(.+)/)) === null || _c === void 0 ? void 0 : _c[1]) !== null && _d !== void 0 ? _d : '';
+ return {
+ name,
+ version
+ };
+});
+const getLinuxInfo = () => __awaiter(void 0, void 0, void 0, function* () {
+ const { stdout } = yield exec.getExecOutput('lsb_release', ['-i', '-r', '-s'], {
+ silent: true
+ });
+ const [name, version] = stdout.trim().split('\n');
+ return {
+ name,
+ version
+ };
+});
+exports.platform = os_1.default.platform();
+exports.arch = os_1.default.arch();
+exports.isWindows = exports.platform === 'win32';
+exports.isMacOS = exports.platform === 'darwin';
+exports.isLinux = exports.platform === 'linux';
+function getDetails() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return Object.assign(Object.assign({}, (yield (exports.isWindows
+ ? getWindowsInfo()
+ : exports.isMacOS
+ ? getMacOsInfo()
+ : getLinuxInfo()))), { platform: exports.platform,
+ arch: exports.arch,
+ isWindows: exports.isWindows,
+ isMacOS: exports.isMacOS,
+ isLinux: exports.isLinux });
+ });
+}
+exports.getDetails = getDetails;
+//# sourceMappingURL=platform.js.map
+
+/***/ }),
+
+/***/ 1847:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -3094,8 +3526,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0;
-const os_1 = __nccwpck_require__(2037);
-const fs_1 = __nccwpck_require__(7147);
+const os_1 = __nccwpck_require__(857);
+const fs_1 = __nccwpck_require__(9896);
const { access, appendFile, writeFile } = fs_1.promises;
exports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY';
exports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary';
@@ -3368,7 +3800,7 @@ exports.summary = _summary;
/***/ }),
-/***/ 5278:
+/***/ 302:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -3415,7 +3847,7 @@ exports.toCommandProperties = toCommandProperties;
/***/ }),
-/***/ 1514:
+/***/ 5236:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -3450,8 +3882,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getExecOutput = exports.exec = void 0;
-const string_decoder_1 = __nccwpck_require__(1576);
-const tr = __importStar(__nccwpck_require__(8159));
+const string_decoder_1 = __nccwpck_require__(3193);
+const tr = __importStar(__nccwpck_require__(6665));
/**
* Exec a command.
* Output will be streamed to the live console.
@@ -3525,7 +3957,7 @@ exports.getExecOutput = getExecOutput;
/***/ }),
-/***/ 8159:
+/***/ 6665:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -3560,13 +3992,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.argStringToArray = exports.ToolRunner = void 0;
-const os = __importStar(__nccwpck_require__(2037));
-const events = __importStar(__nccwpck_require__(2361));
-const child = __importStar(__nccwpck_require__(2081));
-const path = __importStar(__nccwpck_require__(1017));
-const io = __importStar(__nccwpck_require__(7436));
-const ioUtil = __importStar(__nccwpck_require__(1962));
-const timers_1 = __nccwpck_require__(9512);
+const os = __importStar(__nccwpck_require__(857));
+const events = __importStar(__nccwpck_require__(4434));
+const child = __importStar(__nccwpck_require__(5317));
+const path = __importStar(__nccwpck_require__(6928));
+const io = __importStar(__nccwpck_require__(4994));
+const ioUtil = __importStar(__nccwpck_require__(5207));
+const timers_1 = __nccwpck_require__(3557);
/* eslint-disable @typescript-eslint/unbound-method */
const IS_WINDOWS = process.platform === 'win32';
/*
@@ -4150,15 +4582,15 @@ class ExecState extends events.EventEmitter {
/***/ }),
-/***/ 4087:
+/***/ 1648:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.Context = void 0;
-const fs_1 = __nccwpck_require__(7147);
-const os_1 = __nccwpck_require__(2037);
+const fs_1 = __nccwpck_require__(9896);
+const os_1 = __nccwpck_require__(857);
class Context {
/**
* Hydrate the context from the environment
@@ -4182,6 +4614,7 @@ class Context {
this.action = process.env.GITHUB_ACTION;
this.actor = process.env.GITHUB_ACTOR;
this.job = process.env.GITHUB_JOB;
+ this.runAttempt = parseInt(process.env.GITHUB_RUN_ATTEMPT, 10);
this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10);
this.runId = parseInt(process.env.GITHUB_RUN_ID, 10);
this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`;
@@ -4212,7 +4645,7 @@ exports.Context = Context;
/***/ }),
-/***/ 5438:
+/***/ 3228:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -4242,8 +4675,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getOctokit = exports.context = void 0;
-const Context = __importStar(__nccwpck_require__(4087));
-const utils_1 = __nccwpck_require__(3030);
+const Context = __importStar(__nccwpck_require__(1648));
+const utils_1 = __nccwpck_require__(8006);
exports.context = new Context.Context();
/**
* Returns a hydrated octokit ready to use for GitHub Actions
@@ -4260,7 +4693,7 @@ exports.getOctokit = getOctokit;
/***/ }),
-/***/ 7914:
+/***/ 5156:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -4299,8 +4732,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getApiBaseUrl = exports.getProxyFetch = exports.getProxyAgentDispatcher = exports.getProxyAgent = exports.getAuthString = void 0;
-const httpClient = __importStar(__nccwpck_require__(6255));
-const undici_1 = __nccwpck_require__(1773);
+const httpClient = __importStar(__nccwpck_require__(4844));
+const undici_1 = __nccwpck_require__(6752);
function getAuthString(token, options) {
if (!token && !options.auth) {
throw new Error('Parameter token or opts.auth is required');
@@ -4337,7 +4770,7 @@ exports.getApiBaseUrl = getApiBaseUrl;
/***/ }),
-/***/ 3030:
+/***/ 8006:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -4367,12 +4800,12 @@ var __importStar = (this && this.__importStar) || function (mod) {
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
-const Context = __importStar(__nccwpck_require__(4087));
-const Utils = __importStar(__nccwpck_require__(7914));
+const Context = __importStar(__nccwpck_require__(1648));
+const Utils = __importStar(__nccwpck_require__(5156));
// octokit + plugins
-const core_1 = __nccwpck_require__(6762);
-const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
-const plugin_paginate_rest_1 = __nccwpck_require__(4193);
+const core_1 = __nccwpck_require__(1897);
+const plugin_rest_endpoint_methods_1 = __nccwpck_require__(4935);
+const plugin_paginate_rest_1 = __nccwpck_require__(8082);
exports.context = new Context.Context();
const baseUrl = Utils.getApiBaseUrl();
exports.defaults = {
@@ -4403,7 +4836,7 @@ exports.getOctokitOptions = getOctokitOptions;
/***/ }),
-/***/ 5526:
+/***/ 4552:
/***/ (function(__unused_webpack_module, exports) {
"use strict";
@@ -4491,7 +4924,7 @@ exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHand
/***/ }),
-/***/ 6255:
+/***/ 4844:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -4531,11 +4964,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0;
-const http = __importStar(__nccwpck_require__(3685));
-const https = __importStar(__nccwpck_require__(5687));
-const pm = __importStar(__nccwpck_require__(9835));
-const tunnel = __importStar(__nccwpck_require__(4294));
-const undici_1 = __nccwpck_require__(1773);
+const http = __importStar(__nccwpck_require__(8611));
+const https = __importStar(__nccwpck_require__(5692));
+const pm = __importStar(__nccwpck_require__(4988));
+const tunnel = __importStar(__nccwpck_require__(770));
+const undici_1 = __nccwpck_require__(6752);
var HttpCodes;
(function (HttpCodes) {
HttpCodes[HttpCodes["OK"] = 200] = "OK";
@@ -5154,7 +5587,7 @@ const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCa
/***/ }),
-/***/ 9835:
+/***/ 4988:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -5243,7 +5676,7 @@ function isLoopbackAddress(host) {
/***/ }),
-/***/ 1962:
+/***/ 5207:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -5279,8 +5712,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
var _a;
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getCmdPath = exports.tryGetExecutablePath = exports.isRooted = exports.isDirectory = exports.exists = exports.READONLY = exports.UV_FS_O_EXLOCK = exports.IS_WINDOWS = exports.unlink = exports.symlink = exports.stat = exports.rmdir = exports.rm = exports.rename = exports.readlink = exports.readdir = exports.open = exports.mkdir = exports.lstat = exports.copyFile = exports.chmod = void 0;
-const fs = __importStar(__nccwpck_require__(7147));
-const path = __importStar(__nccwpck_require__(1017));
+const fs = __importStar(__nccwpck_require__(9896));
+const path = __importStar(__nccwpck_require__(6928));
_a = fs.promises
// export const {open} = 'fs'
, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.open = _a.open, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rm = _a.rm, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink;
@@ -5433,7 +5866,7 @@ exports.getCmdPath = getCmdPath;
/***/ }),
-/***/ 7436:
+/***/ 4994:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -5468,9 +5901,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.findInPath = exports.which = exports.mkdirP = exports.rmRF = exports.mv = exports.cp = void 0;
-const assert_1 = __nccwpck_require__(9491);
-const path = __importStar(__nccwpck_require__(1017));
-const ioUtil = __importStar(__nccwpck_require__(1962));
+const assert_1 = __nccwpck_require__(2613);
+const path = __importStar(__nccwpck_require__(6928));
+const ioUtil = __importStar(__nccwpck_require__(5207));
/**
* Copies a file or folder.
* Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js
@@ -5739,14 +6172,14 @@ function copyFile(srcFile, destFile, force) {
/***/ }),
-/***/ 3803:
+/***/ 2400:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;
-const fs = __nccwpck_require__(7147);
+const fs = __nccwpck_require__(9896);
exports.FILE_SYSTEM_ADAPTER = {
lstat: fs.lstat,
stat: fs.stat,
@@ -5766,7 +6199,7 @@ exports.createFileSystemAdapter = createFileSystemAdapter;
/***/ }),
-/***/ 8838:
+/***/ 2479:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -5791,16 +6224,16 @@ exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_B
/***/ }),
-/***/ 5667:
+/***/ 7198:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"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);
+const async = __nccwpck_require__(7299);
+const sync = __nccwpck_require__(7200);
+const settings_1 = __nccwpck_require__(2501);
exports.Settings = settings_1.default;
function scandir(path, optionsOrSettingsOrCallback, callback) {
if (typeof optionsOrSettingsOrCallback === 'function') {
@@ -5825,18 +6258,18 @@ function getSettings(settingsOrOptions = {}) {
/***/ }),
-/***/ 4507:
+/***/ 7299:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"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);
+const fsStat = __nccwpck_require__(1470);
+const rpl = __nccwpck_require__(2743);
+const constants_1 = __nccwpck_require__(2479);
+const utils = __nccwpck_require__(1144);
+const common = __nccwpck_require__(8389);
function read(directory, settings, callback) {
if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {
readdirWithFileTypes(directory, settings, callback);
@@ -5937,7 +6370,7 @@ function callSuccessCallback(callback, result) {
/***/ }),
-/***/ 3847:
+/***/ 8389:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -5958,17 +6391,17 @@ exports.joinPathSegments = joinPathSegments;
/***/ }),
-/***/ 9560:
+/***/ 7200:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"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);
+const fsStat = __nccwpck_require__(1470);
+const constants_1 = __nccwpck_require__(2479);
+const utils = __nccwpck_require__(1144);
+const common = __nccwpck_require__(8389);
function read(directory, settings) {
if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {
return readdirWithFileTypes(directory, settings);
@@ -6020,15 +6453,15 @@ exports.readdir = readdir;
/***/ }),
-/***/ 8662:
+/***/ 2501:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const path = __nccwpck_require__(1017);
-const fsStat = __nccwpck_require__(109);
-const fs = __nccwpck_require__(3803);
+const path = __nccwpck_require__(6928);
+const fsStat = __nccwpck_require__(1470);
+const fs = __nccwpck_require__(2400);
class Settings {
constructor(_options = {}) {
this._options = _options;
@@ -6052,7 +6485,7 @@ exports["default"] = Settings;
/***/ }),
-/***/ 883:
+/***/ 5497:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -6079,27 +6512,27 @@ exports.createDirentFromStats = createDirentFromStats;
/***/ }),
-/***/ 6297:
+/***/ 1144:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.fs = void 0;
-const fs = __nccwpck_require__(883);
+const fs = __nccwpck_require__(5497);
exports.fs = fs;
/***/ }),
-/***/ 2987:
+/***/ 4368:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;
-const fs = __nccwpck_require__(7147);
+const fs = __nccwpck_require__(9896);
exports.FILE_SYSTEM_ADAPTER = {
lstat: fs.lstat,
stat: fs.stat,
@@ -6117,16 +6550,16 @@ exports.createFileSystemAdapter = createFileSystemAdapter;
/***/ }),
-/***/ 109:
+/***/ 1470:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"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);
+const async = __nccwpck_require__(1539);
+const sync = __nccwpck_require__(6544);
+const settings_1 = __nccwpck_require__(4853);
exports.Settings = settings_1.default;
function stat(path, optionsOrSettingsOrCallback, callback) {
if (typeof optionsOrSettingsOrCallback === 'function') {
@@ -6151,7 +6584,7 @@ function getSettings(settingsOrOptions = {}) {
/***/ }),
-/***/ 4147:
+/***/ 1539:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -6195,7 +6628,7 @@ function callSuccessCallback(callback, result) {
/***/ }),
-/***/ 4527:
+/***/ 6544:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -6226,13 +6659,13 @@ exports.read = read;
/***/ }),
-/***/ 2410:
+/***/ 4853:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const fs = __nccwpck_require__(2987);
+const fs = __nccwpck_require__(4368);
class Settings {
constructor(_options = {}) {
this._options = _options;
@@ -6250,17 +6683,17 @@ exports["default"] = Settings;
/***/ }),
-/***/ 6026:
+/***/ 9337:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"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);
-const settings_1 = __nccwpck_require__(141);
+const async_1 = __nccwpck_require__(1936);
+const stream_1 = __nccwpck_require__(8986);
+const sync_1 = __nccwpck_require__(8769);
+const settings_1 = __nccwpck_require__(244);
exports.Settings = settings_1.default;
function walk(directory, optionsOrSettingsOrCallback, callback) {
if (typeof optionsOrSettingsOrCallback === 'function') {
@@ -6292,13 +6725,13 @@ function getSettings(settingsOrOptions = {}) {
/***/ }),
-/***/ 7523:
+/***/ 1936:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const async_1 = __nccwpck_require__(5732);
+const async_1 = __nccwpck_require__(1906);
class AsyncProvider {
constructor(_root, _settings) {
this._root = _root;
@@ -6330,14 +6763,14 @@ function callSuccessCallback(callback, entries) {
/***/ }),
-/***/ 6737:
+/***/ 8986:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const stream_1 = __nccwpck_require__(2781);
-const async_1 = __nccwpck_require__(5732);
+const stream_1 = __nccwpck_require__(2203);
+const async_1 = __nccwpck_require__(1906);
class StreamProvider {
constructor(_root, _settings) {
this._root = _root;
@@ -6372,13 +6805,13 @@ exports["default"] = StreamProvider;
/***/ }),
-/***/ 3068:
+/***/ 8769:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const sync_1 = __nccwpck_require__(3595);
+const sync_1 = __nccwpck_require__(3431);
class SyncProvider {
constructor(_root, _settings) {
this._root = _root;
@@ -6394,17 +6827,17 @@ exports["default"] = SyncProvider;
/***/ }),
-/***/ 5732:
+/***/ 1906:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const events_1 = __nccwpck_require__(2361);
-const fsScandir = __nccwpck_require__(5667);
-const fastq = __nccwpck_require__(7340);
-const common = __nccwpck_require__(7988);
-const reader_1 = __nccwpck_require__(8311);
+const events_1 = __nccwpck_require__(4434);
+const fsScandir = __nccwpck_require__(7198);
+const fastq = __nccwpck_require__(8230);
+const common = __nccwpck_require__(4449);
+const reader_1 = __nccwpck_require__(5903);
class AsyncReader extends reader_1.default {
constructor(_root, _settings) {
super(_root, _settings);
@@ -6499,7 +6932,7 @@ exports["default"] = AsyncReader;
/***/ }),
-/***/ 7988:
+/***/ 4449:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -6538,13 +6971,13 @@ exports.joinPathSegments = joinPathSegments;
/***/ }),
-/***/ 8311:
+/***/ 5903:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const common = __nccwpck_require__(7988);
+const common = __nccwpck_require__(4449);
class Reader {
constructor(_root, _settings) {
this._root = _root;
@@ -6557,15 +6990,15 @@ exports["default"] = Reader;
/***/ }),
-/***/ 3595:
+/***/ 3431:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const fsScandir = __nccwpck_require__(5667);
-const common = __nccwpck_require__(7988);
-const reader_1 = __nccwpck_require__(8311);
+const fsScandir = __nccwpck_require__(7198);
+const common = __nccwpck_require__(4449);
+const reader_1 = __nccwpck_require__(5903);
class SyncReader extends reader_1.default {
constructor() {
super(...arguments);
@@ -6624,14 +7057,14 @@ exports["default"] = SyncReader;
/***/ }),
-/***/ 141:
+/***/ 244:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const path = __nccwpck_require__(1017);
-const fsScandir = __nccwpck_require__(5667);
+const path = __nccwpck_require__(6928);
+const fsScandir = __nccwpck_require__(7198);
class Settings {
constructor(_options = {}) {
this._options = _options;
@@ -6658,7 +7091,7 @@ exports["default"] = Settings;
/***/ }),
-/***/ 334:
+/***/ 7864:
/***/ ((module) => {
"use strict";
@@ -6743,7 +7176,7 @@ var createTokenAuth = function createTokenAuth2(token) {
/***/ }),
-/***/ 6762:
+/***/ 1897:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
@@ -6767,19 +7200,19 @@ var __copyProps = (to, from, except, desc) => {
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// pkg/dist-src/index.js
-var dist_src_exports = {};
-__export(dist_src_exports, {
+var index_exports = {};
+__export(index_exports, {
Octokit: () => Octokit
});
-module.exports = __toCommonJS(dist_src_exports);
-var import_universal_user_agent = __nccwpck_require__(5030);
-var import_before_after_hook = __nccwpck_require__(3682);
-var import_request = __nccwpck_require__(6234);
-var import_graphql = __nccwpck_require__(8467);
-var import_auth_token = __nccwpck_require__(334);
+module.exports = __toCommonJS(index_exports);
+var import_universal_user_agent = __nccwpck_require__(3843);
+var import_before_after_hook = __nccwpck_require__(2732);
+var import_request = __nccwpck_require__(8636);
+var import_graphql = __nccwpck_require__(7);
+var import_auth_token = __nccwpck_require__(7864);
// pkg/dist-src/version.js
-var VERSION = "5.0.2";
+var VERSION = "5.2.1";
// pkg/dist-src/index.js
var noop = () => {
@@ -6912,7 +7345,7 @@ var Octokit = class {
/***/ }),
-/***/ 9440:
+/***/ 4471:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
@@ -6943,10 +7376,10 @@ __export(dist_src_exports, {
module.exports = __toCommonJS(dist_src_exports);
// pkg/dist-src/defaults.js
-var import_universal_user_agent = __nccwpck_require__(5030);
+var import_universal_user_agent = __nccwpck_require__(3843);
// pkg/dist-src/version.js
-var VERSION = "9.0.4";
+var VERSION = "9.0.6";
// pkg/dist-src/defaults.js
var userAgent = `octokit-endpoint.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`;
@@ -7051,9 +7484,9 @@ function addQueryParameters(url, parameters) {
}
// pkg/dist-src/util/extract-url-variable-names.js
-var urlVariableRegex = /\{[^}]+\}/g;
+var urlVariableRegex = /\{[^{}}]+\}/g;
function removeNonChars(variableName) {
- return variableName.replace(/^\W+|\W+$/g, "").split(/,/);
+ return variableName.replace(/(?:^\W+)|(?:(? {
const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json";
return `application/vnd.github.${preview}-preview${format}`;
@@ -7296,7 +7729,7 @@ var endpoint = withDefaults(null, DEFAULTS);
/***/ }),
-/***/ 8467:
+/***/ 7:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
@@ -7320,24 +7753,24 @@ var __copyProps = (to, from, except, desc) => {
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// pkg/dist-src/index.js
-var dist_src_exports = {};
-__export(dist_src_exports, {
+var index_exports = {};
+__export(index_exports, {
GraphqlResponseError: () => GraphqlResponseError,
graphql: () => graphql2,
withCustomRequest: () => withCustomRequest
});
-module.exports = __toCommonJS(dist_src_exports);
-var import_request3 = __nccwpck_require__(6234);
-var import_universal_user_agent = __nccwpck_require__(5030);
+module.exports = __toCommonJS(index_exports);
+var import_request3 = __nccwpck_require__(8636);
+var import_universal_user_agent = __nccwpck_require__(3843);
// pkg/dist-src/version.js
-var VERSION = "7.0.2";
+var VERSION = "7.1.1";
// pkg/dist-src/with-defaults.js
-var import_request2 = __nccwpck_require__(6234);
+var import_request2 = __nccwpck_require__(8636);
// pkg/dist-src/graphql.js
-var import_request = __nccwpck_require__(6234);
+var import_request = __nccwpck_require__(8636);
// pkg/dist-src/error.js
function _buildMessageForResponseErrors(data) {
@@ -7379,8 +7812,7 @@ function graphql(request2, query, options) {
);
}
for (const key in options) {
- if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key))
- continue;
+ if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue;
return Promise.reject(
new Error(
`[@octokit/graphql] "${key}" cannot be used as variable name`
@@ -7454,7 +7886,7 @@ function withCustomRequest(customRequest) {
/***/ }),
-/***/ 4193:
+/***/ 8082:
/***/ ((module) => {
"use strict";
@@ -7488,7 +7920,7 @@ __export(dist_src_exports, {
module.exports = __toCommonJS(dist_src_exports);
// pkg/dist-src/version.js
-var VERSION = "9.1.5";
+var VERSION = "9.2.2";
// pkg/dist-src/normalize-paginated-list-response.js
function normalizePaginatedListResponse(response) {
@@ -7536,7 +7968,7 @@ function iterator(octokit, route, parameters) {
const response = await requestMethod({ method, url, headers });
const normalizedResponse = normalizePaginatedListResponse(response);
url = ((normalizedResponse.headers.link || "").match(
- /<([^>]+)>;\s*rel="next"/
+ /<([^<>]+)>;\s*rel="next"/
) || [])[1];
return { value: normalizedResponse };
} catch (error) {
@@ -7649,6 +8081,8 @@ var paginatingEndpoints = [
"GET /orgs/{org}/members/{username}/codespaces",
"GET /orgs/{org}/migrations",
"GET /orgs/{org}/migrations/{migration_id}/repositories",
+ "GET /orgs/{org}/organization-roles/{role_id}/teams",
+ "GET /orgs/{org}/organization-roles/{role_id}/users",
"GET /orgs/{org}/outside_collaborators",
"GET /orgs/{org}/packages",
"GET /orgs/{org}/packages/{package_type}/{package_name}/versions",
@@ -7853,7 +8287,7 @@ paginateRest.VERSION = VERSION;
/***/ }),
-/***/ 3044:
+/***/ 4935:
/***/ ((module) => {
"use strict";
@@ -7885,7 +8319,7 @@ __export(dist_src_exports, {
module.exports = __toCommonJS(dist_src_exports);
// pkg/dist-src/version.js
-var VERSION = "10.2.0";
+var VERSION = "10.4.1";
// pkg/dist-src/generated/endpoints.js
var Endpoints = {
@@ -8012,6 +8446,9 @@ var Endpoints = {
"GET /repos/{owner}/{repo}/actions/permissions/selected-actions"
],
getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],
+ getCustomOidcSubClaimForRepo: [
+ "GET /repos/{owner}/{repo}/actions/oidc/customization/sub"
+ ],
getEnvironmentPublicKey: [
"GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key"
],
@@ -8164,6 +8601,9 @@ var Endpoints = {
setCustomLabelsForSelfHostedRunnerForRepo: [
"PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"
],
+ setCustomOidcSubClaimForRepo: [
+ "PUT /repos/{owner}/{repo}/actions/oidc/customization/sub"
+ ],
setGithubActionsDefaultWorkflowPermissionsOrganization: [
"PUT /orgs/{org}/actions/permissions/workflow"
],
@@ -8233,6 +8673,7 @@ var Endpoints = {
listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"],
markNotificationsAsRead: ["PUT /notifications"],
markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"],
+ markThreadAsDone: ["DELETE /notifications/threads/{thread_id}"],
markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"],
setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"],
setThreadSubscription: [
@@ -8509,10 +8950,10 @@ var Endpoints = {
updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"]
},
copilot: {
- addCopilotForBusinessSeatsForTeams: [
+ addCopilotSeatsForTeams: [
"POST /orgs/{org}/copilot/billing/selected_teams"
],
- addCopilotForBusinessSeatsForUsers: [
+ addCopilotSeatsForUsers: [
"POST /orgs/{org}/copilot/billing/selected_users"
],
cancelCopilotSeatAssignmentForTeams: [
@@ -8825,10 +9266,24 @@ var Endpoints = {
}
]
},
+ oidc: {
+ getOidcCustomSubTemplateForOrg: [
+ "GET /orgs/{org}/actions/oidc/customization/sub"
+ ],
+ updateOidcCustomSubTemplateForOrg: [
+ "PUT /orgs/{org}/actions/oidc/customization/sub"
+ ]
+ },
orgs: {
addSecurityManagerTeam: [
"PUT /orgs/{org}/security-managers/teams/{team_slug}"
],
+ assignTeamToOrgRole: [
+ "PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"
+ ],
+ assignUserToOrgRole: [
+ "PUT /orgs/{org}/organization-roles/users/{username}/{role_id}"
+ ],
blockUser: ["PUT /orgs/{org}/blocks/{username}"],
cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"],
checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"],
@@ -8837,6 +9292,7 @@ var Endpoints = {
convertMemberToOutsideCollaborator: [
"PUT /orgs/{org}/outside_collaborators/{username}"
],
+ createCustomOrganizationRole: ["POST /orgs/{org}/organization-roles"],
createInvitation: ["POST /orgs/{org}/invitations"],
createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"],
createOrUpdateCustomPropertiesValuesForRepos: [
@@ -8847,6 +9303,9 @@ var Endpoints = {
],
createWebhook: ["POST /orgs/{org}/hooks"],
delete: ["DELETE /orgs/{org}"],
+ deleteCustomOrganizationRole: [
+ "DELETE /orgs/{org}/organization-roles/{role_id}"
+ ],
deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"],
enableOrDisableSecurityProductOnAllOrgRepos: [
"POST /orgs/{org}/{security_product}/{enablement}"
@@ -8858,6 +9317,7 @@ var Endpoints = {
],
getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"],
getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"],
+ getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"],
getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"],
getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"],
getWebhookDelivery: [
@@ -8873,6 +9333,12 @@ var Endpoints = {
listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"],
listMembers: ["GET /orgs/{org}/members"],
listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"],
+ listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"],
+ listOrgRoleUsers: ["GET /orgs/{org}/organization-roles/{role_id}/users"],
+ listOrgRoles: ["GET /orgs/{org}/organization-roles"],
+ listOrganizationFineGrainedPermissions: [
+ "GET /orgs/{org}/organization-fine-grained-permissions"
+ ],
listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"],
listPatGrantRepositories: [
"GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories"
@@ -8887,6 +9353,9 @@ var Endpoints = {
listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"],
listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"],
listWebhooks: ["GET /orgs/{org}/hooks"],
+ patchCustomOrganizationRole: [
+ "PATCH /orgs/{org}/organization-roles/{role_id}"
+ ],
pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"],
redeliverWebhookDelivery: [
"POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"
@@ -8911,6 +9380,18 @@ var Endpoints = {
reviewPatGrantRequestsInBulk: [
"POST /orgs/{org}/personal-access-token-requests"
],
+ revokeAllOrgRolesTeam: [
+ "DELETE /orgs/{org}/organization-roles/teams/{team_slug}"
+ ],
+ revokeAllOrgRolesUser: [
+ "DELETE /orgs/{org}/organization-roles/users/{username}"
+ ],
+ revokeOrgRoleTeam: [
+ "DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"
+ ],
+ revokeOrgRoleUser: [
+ "DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}"
+ ],
setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"],
setPublicMembershipForAuthenticatedUser: [
"PUT /orgs/{org}/public_members/{username}"
@@ -9201,6 +9682,9 @@ var Endpoints = {
{},
{ mapToData: "users" }
],
+ cancelPagesDeployment: [
+ "POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel"
+ ],
checkAutomatedSecurityFixes: [
"GET /repos/{owner}/{repo}/automated-security-fixes"
],
@@ -9236,12 +9720,15 @@ var Endpoints = {
createForAuthenticatedUser: ["POST /user/repos"],
createFork: ["POST /repos/{owner}/{repo}/forks"],
createInOrg: ["POST /orgs/{org}/repos"],
+ createOrUpdateCustomPropertiesValues: [
+ "PATCH /repos/{owner}/{repo}/properties/values"
+ ],
createOrUpdateEnvironment: [
"PUT /repos/{owner}/{repo}/environments/{environment_name}"
],
createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"],
createOrgRuleset: ["POST /orgs/{org}/rulesets"],
- createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployment"],
+ createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployments"],
createPagesSite: ["POST /repos/{owner}/{repo}/pages"],
createRelease: ["POST /repos/{owner}/{repo}/releases"],
createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"],
@@ -9394,6 +9881,9 @@ var Endpoints = {
getOrgRulesets: ["GET /orgs/{org}/rulesets"],
getPages: ["GET /repos/{owner}/{repo}/pages"],
getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"],
+ getPagesDeployment: [
+ "GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}"
+ ],
getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"],
getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"],
getPullRequestReviewProtection: [
@@ -9604,6 +10094,9 @@ var Endpoints = {
]
},
securityAdvisories: {
+ createFork: [
+ "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks"
+ ],
createPrivateVulnerabilityReport: [
"POST /repos/{owner}/{repo}/security-advisories/reports"
],
@@ -9964,7 +10457,7 @@ legacyRestEndpointMethods.VERSION = VERSION;
/***/ }),
-/***/ 537:
+/***/ 3708:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
@@ -10003,8 +10496,8 @@ __export(dist_src_exports, {
RequestError: () => RequestError
});
module.exports = __toCommonJS(dist_src_exports);
-var import_deprecation = __nccwpck_require__(8932);
-var import_once = __toESM(__nccwpck_require__(1223));
+var import_deprecation = __nccwpck_require__(4150);
+var import_once = __toESM(__nccwpck_require__(5560));
var logOnceCode = (0, import_once.default)((deprecation) => console.warn(deprecation));
var logOnceHeaders = (0, import_once.default)((deprecation) => console.warn(deprecation));
var RequestError = class extends Error {
@@ -10027,7 +10520,7 @@ var RequestError = class extends Error {
if (options.request.headers.authorization) {
requestCopy.headers = Object.assign({}, options.request.headers, {
authorization: options.request.headers.authorization.replace(
- / .*$/,
+ /(? {
"use strict";
@@ -10091,11 +10584,11 @@ __export(dist_src_exports, {
request: () => request
});
module.exports = __toCommonJS(dist_src_exports);
-var import_endpoint = __nccwpck_require__(9440);
-var import_universal_user_agent = __nccwpck_require__(5030);
+var import_endpoint = __nccwpck_require__(4471);
+var import_universal_user_agent = __nccwpck_require__(3843);
// pkg/dist-src/version.js
-var VERSION = "8.1.6";
+var VERSION = "8.4.1";
// pkg/dist-src/is-plain-object.js
function isPlainObject(value) {
@@ -10111,7 +10604,7 @@ function isPlainObject(value) {
}
// pkg/dist-src/fetch-wrapper.js
-var import_request_error = __nccwpck_require__(537);
+var import_request_error = __nccwpck_require__(3708);
// pkg/dist-src/get-buffer-response.js
function getBufferResponse(response) {
@@ -10120,7 +10613,7 @@ function getBufferResponse(response) {
// pkg/dist-src/fetch-wrapper.js
function fetchWrapper(requestOptions) {
- var _a, _b, _c;
+ var _a, _b, _c, _d;
const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console;
const parseSuccessResponseBody = ((_a = requestOptions.request) == null ? void 0 : _a.parseSuccessResponseBody) !== false;
if (isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) {
@@ -10141,8 +10634,9 @@ function fetchWrapper(requestOptions) {
return fetch(requestOptions.url, {
method: requestOptions.method,
body: requestOptions.body,
+ redirect: (_c = requestOptions.request) == null ? void 0 : _c.redirect,
headers: requestOptions.headers,
- signal: (_c = requestOptions.request) == null ? void 0 : _c.signal,
+ signal: (_d = requestOptions.request) == null ? void 0 : _d.signal,
// duplex must be set if request.body is ReadableStream or Async Iterables.
// See https://fetch.spec.whatwg.org/#dom-requestinit-duplex.
...requestOptions.body && { duplex: "half" }
@@ -10153,7 +10647,7 @@ function fetchWrapper(requestOptions) {
headers[keyAndValue[0]] = keyAndValue[1];
}
if ("deprecation" in headers) {
- const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/);
+ const matches = headers.link && headers.link.match(/<([^<>]+)>; rel="deprecation"/);
const deprecationLink = matches && matches.pop();
log.warn(
`[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`
@@ -10239,11 +10733,17 @@ async function getResponseData(response) {
function toErrorMessage(data) {
if (typeof data === "string")
return data;
+ let suffix;
+ if ("documentation_url" in data) {
+ suffix = ` - ${data.documentation_url}`;
+ } else {
+ suffix = "";
+ }
if ("message" in data) {
if (Array.isArray(data.errors)) {
- return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`;
+ return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}${suffix}`;
}
- return data.message;
+ return `${data.message}${suffix}`;
}
return `Unknown error: ${JSON.stringify(data)}`;
}
@@ -10285,7 +10785,7 @@ var request = withDefaults(import_endpoint.endpoint, {
/***/ }),
-/***/ 7678:
+/***/ 4001:
/***/ ((module, exports) => {
"use strict";
@@ -10727,14 +11227,14 @@ module.exports.assert = exports.assert;
/***/ }),
-/***/ 8097:
+/***/ 4480:
/***/ ((module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const defer_to_connect_1 = __nccwpck_require__(6214);
-const util_1 = __nccwpck_require__(3837);
+const defer_to_connect_1 = __nccwpck_require__(2114);
+const util_1 = __nccwpck_require__(9023);
const nodejsMajorVersion = Number(process.versions.node.split('.')[0]);
const timer = (request) => {
if (request.timings) {
@@ -10861,16 +11361,17 @@ module.exports["default"] = timer;
/***/ }),
-/***/ 6761:
+/***/ 1316:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-const Utils = __nccwpck_require__(5182);
-const pth = __nccwpck_require__(1017);
-const ZipEntry = __nccwpck_require__(4057);
-const ZipFile = __nccwpck_require__(7744);
+const Utils = __nccwpck_require__(5391);
+const pth = __nccwpck_require__(6928);
+const ZipEntry = __nccwpck_require__(2609);
+const ZipFile = __nccwpck_require__(6991);
-const get_Bool = (val, def) => (typeof val === "boolean" ? val : def);
-const get_Str = (val, def) => (typeof val === "string" ? val : def);
+const get_Bool = (...val) => Utils.findLast(val, (c) => typeof c === "boolean");
+const get_Str = (...val) => Utils.findLast(val, (c) => typeof c === "string");
+const get_Fun = (...val) => Utils.findLast(val, (c) => typeof c === "function");
const defaultOptions = {
// option "noSort" : if true it disables files sorting
@@ -10912,6 +11413,10 @@ module.exports = function (/**String*/ input, /** object */ options) {
// instanciate utils filesystem
const filetools = new Utils(opts);
+ if (typeof opts.decoder !== "object" || typeof opts.decoder.encode !== "function" || typeof opts.decoder.decode !== "function") {
+ opts.decoder = Utils.decoder;
+ }
+
// if input is file name we retrieve its content
if (input && "string" === typeof input) {
// load zip file
@@ -10920,20 +11425,20 @@ module.exports = function (/**String*/ input, /** object */ options) {
opts.filename = input;
inBuffer = filetools.fs.readFileSync(input);
} else {
- throw new Error(Utils.Errors.INVALID_FILENAME);
+ throw Utils.Errors.INVALID_FILENAME();
}
}
// create variable
const _zip = new ZipFile(inBuffer, opts);
- const { canonical, sanitize } = Utils;
+ const { canonical, sanitize, zipnamefix } = Utils;
function getEntry(/**Object*/ entry) {
if (entry && _zip) {
var item;
// If entry was given as a file name
- if (typeof entry === "string") item = _zip.getEntry(entry);
+ if (typeof entry === "string") item = _zip.getEntry(pth.posix.normalize(entry));
// if entry was given as a ZipEntry object
if (typeof entry === "object" && typeof entry.entryName !== "undefined" && typeof entry.header !== "undefined") item = _zip.getEntry(entry.entryName);
@@ -10950,26 +11455,60 @@ module.exports = function (/**String*/ input, /** object */ options) {
return join(".", normalize(sep + zipPath.split("\\").join(sep) + sep));
}
+ function filenameFilter(filterfn) {
+ if (filterfn instanceof RegExp) {
+ // if filter is RegExp wrap it
+ return (function (rx) {
+ return function (filename) {
+ return rx.test(filename);
+ };
+ })(filterfn);
+ } else if ("function" !== typeof filterfn) {
+ // if filter is not function we will replace it
+ return () => true;
+ }
+ return filterfn;
+ }
+
+ // keep last character on folders
+ const relativePath = (local, entry) => {
+ let lastChar = entry.slice(-1);
+ lastChar = lastChar === filetools.sep ? filetools.sep : "";
+ return pth.relative(local, entry) + lastChar;
+ };
+
return {
/**
* Extracts the given entry from the archive and returns the content as a Buffer object
- * @param entry ZipEntry object or String with the full path of the entry
- *
+ * @param {ZipEntry|string} entry ZipEntry object or String with the full path of the entry
+ * @param {Buffer|string} [pass] - password
* @return Buffer or Null in case of error
*/
- readFile: function (/**Object*/ entry, /*String, Buffer*/ pass) {
+ readFile: function (entry, pass) {
var item = getEntry(entry);
return (item && item.getData(pass)) || null;
},
+ /**
+ * Returns how many child elements has on entry (directories) on files it is always 0
+ * @param {ZipEntry|string} entry ZipEntry object or String with the full path of the entry
+ * @returns {integer}
+ */
+ childCount: function (entry) {
+ const item = getEntry(entry);
+ if (item) {
+ return _zip.getChildCount(item);
+ }
+ },
+
/**
* Asynchronous readFile
- * @param entry ZipEntry object or String with the full path of the entry
- * @param callback
+ * @param {ZipEntry|string} entry ZipEntry object or String with the full path of the entry
+ * @param {callback} callback
*
* @return Buffer or Null in case of error
*/
- readFileAsync: function (/**Object*/ entry, /**Function*/ callback) {
+ readFileAsync: function (entry, callback) {
var item = getEntry(entry);
if (item) {
item.getDataAsync(callback);
@@ -10980,12 +11519,12 @@ module.exports = function (/**String*/ input, /** object */ options) {
/**
* Extracts the given entry from the archive and returns the content as plain text in the given encoding
- * @param entry ZipEntry object or String with the full path of the entry
- * @param encoding Optional. If no encoding is specified utf8 is used
+ * @param {ZipEntry|string} entry - ZipEntry object or String with the full path of the entry
+ * @param {string} encoding - Optional. If no encoding is specified utf8 is used
*
* @return String
*/
- readAsText: function (/**Object*/ entry, /**String=*/ encoding) {
+ readAsText: function (entry, encoding) {
var item = getEntry(entry);
if (item) {
var data = item.getData();
@@ -10998,13 +11537,13 @@ module.exports = function (/**String*/ input, /** object */ options) {
/**
* Asynchronous readAsText
- * @param entry ZipEntry object or String with the full path of the entry
- * @param callback
- * @param encoding Optional. If no encoding is specified utf8 is used
+ * @param {ZipEntry|string} entry ZipEntry object or String with the full path of the entry
+ * @param {callback} callback
+ * @param {string} [encoding] - Optional. If no encoding is specified utf8 is used
*
* @return String
*/
- readAsTextAsync: function (/**Object*/ entry, /**Function*/ callback, /**String=*/ encoding) {
+ readAsTextAsync: function (entry, callback, encoding) {
var item = getEntry(entry);
if (item) {
item.getDataAsync(function (data, err) {
@@ -11027,11 +11566,26 @@ module.exports = function (/**String*/ input, /** object */ options) {
/**
* Remove the entry from the file or the entry and all it's nested directories and files if the given entry is a directory
*
- * @param entry
+ * @param {ZipEntry|string} entry
+ * @returns {void}
*/
- deleteFile: function (/**Object*/ entry) {
+ deleteFile: function (entry, withsubfolders = true) {
// @TODO: test deleteFile
var item = getEntry(entry);
+ if (item) {
+ _zip.deleteFile(item.entryName, withsubfolders);
+ }
+ },
+
+ /**
+ * Remove the entry from the file or directory without affecting any nested entries
+ *
+ * @param {ZipEntry|string} entry
+ * @returns {void}
+ */
+ deleteEntry: function (entry) {
+ // @TODO: test deleteEntry
+ var item = getEntry(entry);
if (item) {
_zip.deleteEntry(item.entryName);
}
@@ -11040,9 +11594,9 @@ module.exports = function (/**String*/ input, /** object */ options) {
/**
* Adds a comment to the zip. The zip must be rewritten after adding the comment.
*
- * @param comment
+ * @param {string} comment
*/
- addZipComment: function (/**String*/ comment) {
+ addZipComment: function (comment) {
// @TODO: test addZipComment
_zip.comment = comment;
},
@@ -11060,10 +11614,10 @@ module.exports = function (/**String*/ input, /** object */ options) {
* Adds a comment to a specified zipEntry. The zip must be rewritten after adding the comment
* The comment cannot exceed 65535 characters in length
*
- * @param entry
- * @param comment
+ * @param {ZipEntry} entry
+ * @param {string} comment
*/
- addZipEntryComment: function (/**Object*/ entry, /**String*/ comment) {
+ addZipEntryComment: function (entry, comment) {
var item = getEntry(entry);
if (item) {
item.comment = comment;
@@ -11073,10 +11627,10 @@ module.exports = function (/**String*/ input, /** object */ options) {
/**
* Returns the comment of the specified entry
*
- * @param entry
+ * @param {ZipEntry} entry
* @return String
*/
- getZipEntryComment: function (/**Object*/ entry) {
+ getZipEntryComment: function (entry) {
var item = getEntry(entry);
if (item) {
return item.comment || "";
@@ -11087,10 +11641,10 @@ module.exports = function (/**String*/ input, /** object */ options) {
/**
* Updates the content of an existing entry inside the archive. The zip must be rewritten after updating the content
*
- * @param entry
- * @param content
+ * @param {ZipEntry} entry
+ * @param {Buffer} content
*/
- updateFile: function (/**Object*/ entry, /**Buffer*/ content) {
+ updateFile: function (entry, content) {
var item = getEntry(entry);
if (item) {
item.setData(content);
@@ -11100,17 +11654,18 @@ module.exports = function (/**String*/ input, /** object */ options) {
/**
* Adds a file from the disk to the archive
*
- * @param localPath File to add to zip
- * @param zipPath Optional path inside the zip
- * @param zipName Optional name for the file
+ * @param {string} localPath File to add to zip
+ * @param {string} [zipPath] Optional path inside the zip
+ * @param {string} [zipName] Optional name for the file
+ * @param {string} [comment] Optional file comment
*/
- addLocalFile: function (/**String*/ localPath, /**String=*/ zipPath, /**String=*/ zipName, /**String*/ comment) {
+ addLocalFile: function (localPath, zipPath, zipName, comment) {
if (filetools.fs.existsSync(localPath)) {
// fix ZipPath
zipPath = zipPath ? fixPath(zipPath) : "";
// p - local file name
- var p = localPath.split("\\").join("/").split("/").pop();
+ const p = pth.win32.basename(pth.win32.normalize(localPath));
// add file name into zippath
zipPath += zipName ? zipName : p;
@@ -11118,37 +11673,77 @@ module.exports = function (/**String*/ input, /** object */ options) {
// read file attributes
const _attr = filetools.fs.statSync(localPath);
+ // get file content
+ const data = _attr.isFile() ? filetools.fs.readFileSync(localPath) : Buffer.alloc(0);
+
+ // if folder
+ if (_attr.isDirectory()) zipPath += filetools.sep;
+
// add file into zip file
- this.addFile(zipPath, filetools.fs.readFileSync(localPath), comment, _attr);
+ this.addFile(zipPath, data, comment, _attr);
} else {
- throw new Error(Utils.Errors.FILE_NOT_FOUND.replace("%s", localPath));
+ throw Utils.Errors.FILE_NOT_FOUND(localPath);
}
},
+ /**
+ * Callback for showing if everything was done.
+ *
+ * @callback doneCallback
+ * @param {Error} err - Error object
+ * @param {boolean} done - was request fully completed
+ */
+
+ /**
+ * Adds a file from the disk to the archive
+ *
+ * @param {(object|string)} options - options object, if it is string it us used as localPath.
+ * @param {string} options.localPath - Local path to the file.
+ * @param {string} [options.comment] - Optional file comment.
+ * @param {string} [options.zipPath] - Optional path inside the zip
+ * @param {string} [options.zipName] - Optional name for the file
+ * @param {doneCallback} callback - The callback that handles the response.
+ */
+ addLocalFileAsync: function (options, callback) {
+ options = typeof options === "object" ? options : { localPath: options };
+ const localPath = pth.resolve(options.localPath);
+ const { comment } = options;
+ let { zipPath, zipName } = options;
+ const self = this;
+
+ filetools.fs.stat(localPath, function (err, stats) {
+ if (err) return callback(err, false);
+ // fix ZipPath
+ zipPath = zipPath ? fixPath(zipPath) : "";
+ // p - local file name
+ const p = pth.win32.basename(pth.win32.normalize(localPath));
+ // add file name into zippath
+ zipPath += zipName ? zipName : p;
+
+ if (stats.isFile()) {
+ filetools.fs.readFile(localPath, function (err, data) {
+ if (err) return callback(err, false);
+ self.addFile(zipPath, data, comment, stats);
+ return setImmediate(callback, undefined, true);
+ });
+ } else if (stats.isDirectory()) {
+ zipPath += filetools.sep;
+ self.addFile(zipPath, Buffer.alloc(0), comment, stats);
+ return setImmediate(callback, undefined, true);
+ }
+ });
+ },
+
/**
* Adds a local directory and all its nested files and directories to the archive
*
- * @param localPath
- * @param zipPath optional path inside zip
- * @param filter optional RegExp or Function if files match will
- * be included.
- * @param {number | object} attr - number as unix file permissions, object as filesystem Stats object
+ * @param {string} localPath - local path to the folder
+ * @param {string} [zipPath] - optional path inside zip
+ * @param {(RegExp|function)} [filter] - optional RegExp or Function if files match will be included.
*/
- addLocalFolder: function (/**String*/ localPath, /**String=*/ zipPath, /**=RegExp|Function*/ filter, /**=number|object*/ attr) {
+ addLocalFolder: function (localPath, zipPath, filter) {
// Prepare filter
- if (filter instanceof RegExp) {
- // if filter is RegExp wrap it
- filter = (function (rx) {
- return function (filename) {
- return rx.test(filename);
- };
- })(filter);
- } else if ("function" !== typeof filter) {
- // if filter is not function we will replace it
- filter = function () {
- return true;
- };
- }
+ filter = filenameFilter(filter);
// fix ZipPath
zipPath = zipPath ? fixPath(zipPath) : "";
@@ -11161,43 +11756,29 @@ module.exports = function (/**String*/ input, /** object */ options) {
const self = this;
if (items.length) {
- items.forEach(function (filepath) {
- var p = pth.relative(localPath, filepath).split("\\").join("/"); //windows fix
+ for (const filepath of items) {
+ const p = pth.join(zipPath, relativePath(localPath, filepath));
if (filter(p)) {
- var stats = filetools.fs.statSync(filepath);
- if (stats.isFile()) {
- self.addFile(zipPath + p, filetools.fs.readFileSync(filepath), "", attr ? attr : stats);
- } else {
- self.addFile(zipPath + p + "/", Buffer.alloc(0), "", attr ? attr : stats);
- }
+ self.addLocalFile(filepath, pth.dirname(p));
}
- });
+ }
}
} else {
- throw new Error(Utils.Errors.FILE_NOT_FOUND.replace("%s", localPath));
+ throw Utils.Errors.FILE_NOT_FOUND(localPath);
}
},
/**
- * Asynchronous addLocalFile
- * @param localPath
- * @param callback
- * @param zipPath optional path inside zip
- * @param filter optional RegExp or Function if files match will
+ * Asynchronous addLocalFolder
+ * @param {string} localPath
+ * @param {callback} callback
+ * @param {string} [zipPath] optional path inside zip
+ * @param {RegExp|function} [filter] optional RegExp or Function if files match will
* be included.
*/
- addLocalFolderAsync: function (/*String*/ localPath, /*Function*/ callback, /*String*/ zipPath, /*RegExp|Function*/ filter) {
- if (filter instanceof RegExp) {
- filter = (function (rx) {
- return function (filename) {
- return rx.test(filename);
- };
- })(filter);
- } else if ("function" !== typeof filter) {
- filter = function () {
- return true;
- };
- }
+ addLocalFolderAsync: function (localPath, callback, zipPath, filter) {
+ // Prepare filter
+ filter = filenameFilter(filter);
// fix ZipPath
zipPath = zipPath ? fixPath(zipPath) : "";
@@ -11208,7 +11789,7 @@ module.exports = function (/**String*/ input, /** object */ options) {
var self = this;
filetools.fs.open(localPath, "r", function (err) {
if (err && err.code === "ENOENT") {
- callback(undefined, Utils.Errors.FILE_NOT_FOUND.replace("%s", localPath));
+ callback(undefined, Utils.Errors.FILE_NOT_FOUND(localPath));
} else if (err) {
callback(undefined, err);
} else {
@@ -11219,7 +11800,7 @@ module.exports = function (/**String*/ input, /** object */ options) {
i += 1;
if (i < items.length) {
var filepath = items[i];
- var p = pth.relative(localPath, filepath).split("\\").join("/"); //windows fix
+ var p = relativePath(localPath, filepath).split("\\").join("/"); //windows fix
p = p
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
@@ -11257,24 +11838,99 @@ module.exports = function (/**String*/ input, /** object */ options) {
},
/**
+ * Adds a local directory and all its nested files and directories to the archive
+ *
+ * @param {object | string} options - options object, if it is string it us used as localPath.
+ * @param {string} options.localPath - Local path to the folder.
+ * @param {string} [options.zipPath] - optional path inside zip.
+ * @param {RegExp|function} [options.filter] - optional RegExp or Function if files match will be included.
+ * @param {function|string} [options.namefix] - optional function to help fix filename
+ * @param {doneCallback} callback - The callback that handles the response.
+ *
+ */
+ addLocalFolderAsync2: function (options, callback) {
+ const self = this;
+ options = typeof options === "object" ? options : { localPath: options };
+ localPath = pth.resolve(fixPath(options.localPath));
+ let { zipPath, filter, namefix } = options;
+
+ if (filter instanceof RegExp) {
+ filter = (function (rx) {
+ return function (filename) {
+ return rx.test(filename);
+ };
+ })(filter);
+ } else if ("function" !== typeof filter) {
+ filter = function () {
+ return true;
+ };
+ }
+
+ // fix ZipPath
+ zipPath = zipPath ? fixPath(zipPath) : "";
+
+ // Check Namefix function
+ if (namefix == "latin1") {
+ namefix = (str) =>
+ str
+ .normalize("NFD")
+ .replace(/[\u0300-\u036f]/g, "")
+ .replace(/[^\x20-\x7E]/g, ""); // accent fix (latin1 characers only)
+ }
+
+ if (typeof namefix !== "function") namefix = (str) => str;
+
+ // internal, create relative path + fix the name
+ const relPathFix = (entry) => pth.join(zipPath, namefix(relativePath(localPath, entry)));
+ const fileNameFix = (entry) => pth.win32.basename(pth.win32.normalize(namefix(entry)));
+
+ filetools.fs.open(localPath, "r", function (err) {
+ if (err && err.code === "ENOENT") {
+ callback(undefined, Utils.Errors.FILE_NOT_FOUND(localPath));
+ } else if (err) {
+ callback(undefined, err);
+ } else {
+ filetools.findFilesAsync(localPath, function (err, fileEntries) {
+ if (err) return callback(err);
+ fileEntries = fileEntries.filter((dir) => filter(relPathFix(dir)));
+ if (!fileEntries.length) callback(undefined, false);
+
+ setImmediate(
+ fileEntries.reverse().reduce(function (next, entry) {
+ return function (err, done) {
+ if (err || done === false) return setImmediate(next, err, false);
+
+ self.addLocalFileAsync(
+ {
+ localPath: entry,
+ zipPath: pth.dirname(relPathFix(entry)),
+ zipName: fileNameFix(entry)
+ },
+ next
+ );
+ };
+ }, callback)
+ );
+ });
+ }
+ });
+ },
+
+ /**
+ * Adds a local directory and all its nested files and directories to the archive
*
* @param {string} localPath - path where files will be extracted
* @param {object} props - optional properties
- * @param {string} props.zipPath - optional path inside zip
- * @param {regexp, function} props.filter - RegExp or Function if files match will be included.
+ * @param {string} [props.zipPath] - optional path inside zip
+ * @param {RegExp|function} [props.filter] - optional RegExp or Function if files match will be included.
+ * @param {function|string} [props.namefix] - optional function to help fix filename
*/
- addLocalFolderPromise: function (/*String*/ localPath, /* object */ props) {
+ addLocalFolderPromise: function (localPath, props) {
return new Promise((resolve, reject) => {
- const { filter, zipPath } = Object.assign({}, props);
- this.addLocalFolderAsync(
- localPath,
- (done, err) => {
- if (err) reject(err);
- if (done) resolve(this);
- },
- zipPath,
- filter
- );
+ this.addLocalFolderAsync2(Object.assign({ localPath }, props), (err, done) => {
+ if (err) reject(err);
+ if (done) resolve(this);
+ });
});
},
@@ -11285,16 +11941,17 @@ module.exports = function (/**String*/ input, /** object */ options) {
*
* @param {string} entryName
* @param {Buffer | string} content - file content as buffer or utf8 coded string
- * @param {string} comment - file comment
- * @param {number | object} attr - number as unix file permissions, object as filesystem Stats object
+ * @param {string} [comment] - file comment
+ * @param {number | object} [attr] - number as unix file permissions, object as filesystem Stats object
*/
- addFile: function (/**String*/ entryName, /**Buffer*/ content, /**String*/ comment, /**Number*/ attr) {
+ addFile: function (entryName, content, comment, attr) {
+ entryName = zipnamefix(entryName);
let entry = getEntry(entryName);
const update = entry != null;
// prepare new entry
if (!update) {
- entry = new ZipEntry();
+ entry = new ZipEntry(opts);
entry.entryName = entryName;
}
entry.comment = comment || "";
@@ -11330,22 +11987,25 @@ module.exports = function (/**String*/ input, /** object */ options) {
entry.setData(content);
if (!update) _zip.setEntry(entry);
+
+ return entry;
},
/**
* Returns an array of ZipEntry objects representing the files and folders inside the archive
*
- * @return Array
+ * @param {string} [password]
+ * @returns Array
*/
- getEntries: function (/**String*/ password) {
- _zip.password=password;
+ getEntries: function (password) {
+ _zip.password = password;
return _zip ? _zip.entries : [];
},
/**
* Returns a ZipEntry object representing the file or folder specified by ``name``.
*
- * @param name
+ * @param {string} name
* @return ZipEntry
*/
getEntry: function (/**String*/ name) {
@@ -11364,34 +12024,24 @@ module.exports = function (/**String*/ input, /** object */ options) {
* Extracts the given entry to the given targetPath
* If the entry is a directory inside the archive, the entire directory and it's subdirectories will be extracted
*
- * @param entry ZipEntry object or String with the full path of the entry
- * @param targetPath Target folder where to write the file
- * @param maintainEntryPath If maintainEntryPath is true and the entry is inside a folder, the entry folder
- * will be created in targetPath as well. Default is TRUE
- * @param overwrite If the file already exists at the target path, the file will be overwriten if this is true.
- * Default is FALSE
- * @param keepOriginalPermission The file will be set as the permission from the entry if this is true.
- * Default is FALSE
- * @param outFileName String If set will override the filename of the extracted file (Only works if the entry is a file)
+ * @param {string|ZipEntry} entry - ZipEntry object or String with the full path of the entry
+ * @param {string} targetPath - Target folder where to write the file
+ * @param {boolean} [maintainEntryPath=true] - If maintainEntryPath is true and the entry is inside a folder, the entry folder will be created in targetPath as well. Default is TRUE
+ * @param {boolean} [overwrite=false] - If the file already exists at the target path, the file will be overwriten if this is true.
+ * @param {boolean} [keepOriginalPermission=false] - The file will be set as the permission from the entry if this is true.
+ * @param {string} [outFileName] - String If set will override the filename of the extracted file (Only works if the entry is a file)
*
* @return Boolean
*/
- extractEntryTo: function (
- /**Object*/ entry,
- /**String*/ targetPath,
- /**Boolean*/ maintainEntryPath,
- /**Boolean*/ overwrite,
- /**Boolean*/ keepOriginalPermission,
- /**String**/ outFileName
- ) {
- overwrite = get_Bool(overwrite, false);
- keepOriginalPermission = get_Bool(keepOriginalPermission, false);
- maintainEntryPath = get_Bool(maintainEntryPath, true);
- outFileName = get_Str(outFileName, get_Str(keepOriginalPermission, undefined));
+ extractEntryTo: function (entry, targetPath, maintainEntryPath, overwrite, keepOriginalPermission, outFileName) {
+ overwrite = get_Bool(false, overwrite);
+ keepOriginalPermission = get_Bool(false, keepOriginalPermission);
+ maintainEntryPath = get_Bool(true, maintainEntryPath);
+ outFileName = get_Str(keepOriginalPermission, outFileName);
var item = getEntry(entry);
if (!item) {
- throw new Error(Utils.Errors.NO_ENTRY);
+ throw Utils.Errors.NO_ENTRY();
}
var entryName = canonical(item.entryName);
@@ -11404,7 +12054,7 @@ module.exports = function (/**String*/ input, /** object */ options) {
if (child.isDirectory) return;
var content = child.getData();
if (!content) {
- throw new Error(Utils.Errors.CANT_EXTRACT_FILE);
+ throw Utils.Errors.CANT_EXTRACT_FILE();
}
var name = canonical(child.entryName);
var childName = sanitize(targetPath, maintainEntryPath ? name : pth.basename(name));
@@ -11416,10 +12066,10 @@ module.exports = function (/**String*/ input, /** object */ options) {
}
var content = item.getData(_zip.password);
- if (!content) throw new Error(Utils.Errors.CANT_EXTRACT_FILE);
+ if (!content) throw Utils.Errors.CANT_EXTRACT_FILE();
if (filetools.fs.existsSync(target) && !overwrite) {
- throw new Error(Utils.Errors.CANT_OVERRIDE);
+ throw Utils.Errors.CANT_OVERRIDE();
}
// The reverse operation for attr depend on method addFile()
const fileAttr = keepOriginalPermission ? entry.header.fileAttr : undefined;
@@ -11430,7 +12080,7 @@ module.exports = function (/**String*/ input, /** object */ options) {
/**
* Test the archive
- *
+ * @param {string} [pass]
*/
test: function (pass) {
if (!_zip) {
@@ -11456,28 +12106,28 @@ module.exports = function (/**String*/ input, /** object */ options) {
/**
* Extracts the entire archive to the given location
*
- * @param targetPath Target location
- * @param overwrite If the file already exists at the target path, the file will be overwriten if this is true.
+ * @param {string} targetPath Target location
+ * @param {boolean} [overwrite=false] If the file already exists at the target path, the file will be overwriten if this is true.
* Default is FALSE
- * @param keepOriginalPermission The file will be set as the permission from the entry if this is true.
+ * @param {boolean} [keepOriginalPermission=false] The file will be set as the permission from the entry if this is true.
* Default is FALSE
+ * @param {string|Buffer} [pass] password
*/
- extractAllTo: function (/**String*/ targetPath, /**Boolean*/ overwrite, /**Boolean*/ keepOriginalPermission, /*String, Buffer*/ pass) {
- overwrite = get_Bool(overwrite, false);
+ extractAllTo: function (targetPath, overwrite, keepOriginalPermission, pass) {
+ keepOriginalPermission = get_Bool(false, keepOriginalPermission);
pass = get_Str(keepOriginalPermission, pass);
- keepOriginalPermission = get_Bool(keepOriginalPermission, false);
- if (!_zip) {
- throw new Error(Utils.Errors.NO_ZIP);
- }
+ overwrite = get_Bool(false, overwrite);
+ if (!_zip) throw Utils.Errors.NO_ZIP();
+
_zip.entries.forEach(function (entry) {
- var entryName = sanitize(targetPath, canonical(entry.entryName.toString()));
+ var entryName = sanitize(targetPath, canonical(entry.entryName));
if (entry.isDirectory) {
filetools.makeDir(entryName);
return;
}
var content = entry.getData(pass);
if (!content) {
- throw new Error(Utils.Errors.CANT_EXTRACT_FILE);
+ throw Utils.Errors.CANT_EXTRACT_FILE();
}
// The reverse operation for attr depend on method addFile()
const fileAttr = keepOriginalPermission ? entry.header.fileAttr : undefined;
@@ -11485,7 +12135,7 @@ module.exports = function (/**String*/ input, /** object */ options) {
try {
filetools.fs.utimesSync(entryName, entry.header.time, entry.header.time);
} catch (err) {
- throw new Error(Utils.Errors.CANT_EXTRACT_FILE);
+ throw Utils.Errors.CANT_EXTRACT_FILE();
}
});
},
@@ -11493,40 +12143,46 @@ module.exports = function (/**String*/ input, /** object */ options) {
/**
* Asynchronous extractAllTo
*
- * @param targetPath Target location
- * @param overwrite If the file already exists at the target path, the file will be overwriten if this is true.
+ * @param {string} targetPath Target location
+ * @param {boolean} [overwrite=false] If the file already exists at the target path, the file will be overwriten if this is true.
* Default is FALSE
- * @param keepOriginalPermission The file will be set as the permission from the entry if this is true.
+ * @param {boolean} [keepOriginalPermission=false] The file will be set as the permission from the entry if this is true.
* Default is FALSE
- * @param callback The callback will be executed when all entries are extracted successfully or any error is thrown.
+ * @param {function} callback The callback will be executed when all entries are extracted successfully or any error is thrown.
*/
- extractAllToAsync: function (/**String*/ targetPath, /**Boolean*/ overwrite, /**Boolean*/ keepOriginalPermission, /**Function*/ callback) {
- overwrite = get_Bool(overwrite, false);
- if (typeof keepOriginalPermission === "function" && !callback) callback = keepOriginalPermission;
- keepOriginalPermission = get_Bool(keepOriginalPermission, false);
+ extractAllToAsync: function (targetPath, overwrite, keepOriginalPermission, callback) {
+ callback = get_Fun(overwrite, keepOriginalPermission, callback);
+ keepOriginalPermission = get_Bool(false, keepOriginalPermission);
+ overwrite = get_Bool(false, overwrite);
if (!callback) {
- callback = function (err) {
- throw new Error(err);
- };
+ return new Promise((resolve, reject) => {
+ this.extractAllToAsync(targetPath, overwrite, keepOriginalPermission, function (err) {
+ if (err) {
+ reject(err);
+ } else {
+ resolve(this);
+ }
+ });
+ });
}
if (!_zip) {
- callback(new Error(Utils.Errors.NO_ZIP));
+ callback(Utils.Errors.NO_ZIP());
return;
}
targetPath = pth.resolve(targetPath);
// convert entryName to
- const getPath = (entry) => sanitize(targetPath, pth.normalize(canonical(entry.entryName.toString())));
+ const getPath = (entry) => sanitize(targetPath, pth.normalize(canonical(entry.entryName)));
const getError = (msg, file) => new Error(msg + ': "' + file + '"');
// separate directories from files
const dirEntries = [];
- const fileEntries = new Set();
+ const fileEntries = [];
_zip.entries.forEach((e) => {
if (e.isDirectory) {
dirEntries.push(e);
} else {
- fileEntries.add(e);
+ fileEntries.push(e);
}
});
@@ -11546,56 +12202,47 @@ module.exports = function (/**String*/ input, /** object */ options) {
}
}
- // callback wrapper, for some house keeping
- const done = () => {
- if (fileEntries.size === 0) {
- callback();
- }
- };
-
- // Extract file entries asynchronously
- for (const entry of fileEntries.values()) {
- const entryName = pth.normalize(canonical(entry.entryName.toString()));
- const filePath = sanitize(targetPath, entryName);
- entry.getDataAsync(function (content, err_1) {
- if (err_1) {
- callback(new Error(err_1));
- return;
- }
- if (!content) {
- callback(new Error(Utils.Errors.CANT_EXTRACT_FILE));
+ fileEntries.reverse().reduce(function (next, entry) {
+ return function (err) {
+ if (err) {
+ next(err);
} else {
- // The reverse operation for attr depend on method addFile()
- const fileAttr = keepOriginalPermission ? entry.header.fileAttr : undefined;
- filetools.writeFileToAsync(filePath, content, overwrite, fileAttr, function (succ) {
- if (!succ) {
- callback(getError("Unable to write file", filePath));
- return;
+ const entryName = pth.normalize(canonical(entry.entryName));
+ const filePath = sanitize(targetPath, entryName);
+ entry.getDataAsync(function (content, err_1) {
+ if (err_1) {
+ next(err_1);
+ } else if (!content) {
+ next(Utils.Errors.CANT_EXTRACT_FILE());
+ } else {
+ // The reverse operation for attr depend on method addFile()
+ const fileAttr = keepOriginalPermission ? entry.header.fileAttr : undefined;
+ filetools.writeFileToAsync(filePath, content, overwrite, fileAttr, function (succ) {
+ if (!succ) {
+ next(getError("Unable to write file", filePath));
+ }
+ filetools.fs.utimes(filePath, entry.header.time, entry.header.time, function (err_2) {
+ if (err_2) {
+ next(getError("Unable to set times", filePath));
+ } else {
+ next();
+ }
+ });
+ });
}
- filetools.fs.utimes(filePath, entry.header.time, entry.header.time, function (err_2) {
- if (err_2) {
- callback(getError("Unable to set times", filePath));
- return;
- }
- // call the callback if it was last entry
- done();
- fileEntries.delete(entry);
- });
});
}
- });
- }
- // call the callback if fileEntries was empty
- done();
+ };
+ }, callback)();
},
/**
* Writes the newly created zip file to disk at the specified location or if a zip was opened and no ``targetFileName`` is provided, it will overwrite the opened zip
*
- * @param targetFileName
- * @param callback
+ * @param {string} targetFileName
+ * @param {function} callback
*/
- writeZip: function (/**String*/ targetFileName, /**Function*/ callback) {
+ writeZip: function (targetFileName, callback) {
if (arguments.length === 1) {
if (typeof targetFileName === "function") {
callback = targetFileName;
@@ -11615,6 +12262,15 @@ module.exports = function (/**String*/ input, /** object */ options) {
}
},
+ /**
+ *
+ * @param {string} targetFileName
+ * @param {object} [props]
+ * @param {boolean} [props.overwrite=true] If the file already exists at the target path, the file will be overwriten if this is true.
+ * @param {boolean} [props.perm] The file will be set as the permission from the entry if this is true.
+
+ * @returns {Promise}
+ */
writeZipPromise: function (/**String*/ targetFileName, /* object */ props) {
const { overwrite, perm } = Object.assign({ overwrite: true }, props);
@@ -11630,6 +12286,9 @@ module.exports = function (/**String*/ input, /** object */ options) {
});
},
+ /**
+ * @returns {Promise} A promise to the Buffer.
+ */
toBufferPromise: function () {
return new Promise((resolve, reject) => {
_zip.toAsyncBuffer(resolve, reject);
@@ -11639,10 +12298,13 @@ module.exports = function (/**String*/ input, /** object */ options) {
/**
* Returns the content of the entire zip file as a Buffer object
*
- * @return Buffer
+ * @prop {function} [onSuccess]
+ * @prop {function} [onFail]
+ * @prop {function} [onItemStart]
+ * @prop {function} [onItemEnd]
+ * @returns {Buffer}
*/
- toBuffer: function (/**Function=*/ onSuccess, /**Function=*/ onFail, /**Function=*/ onItemStart, /**Function=*/ onItemEnd) {
- this.valueOf = 2;
+ toBuffer: function (onSuccess, onFail, onItemStart, onItemEnd) {
if (typeof onSuccess === "function") {
_zip.toAsyncBuffer(onSuccess, onFail, onItemStart, onItemEnd);
return null;
@@ -11655,10 +12317,10 @@ module.exports = function (/**String*/ input, /** object */ options) {
/***/ }),
-/***/ 9032:
+/***/ 3746:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-var Utils = __nccwpck_require__(5182),
+var Utils = __nccwpck_require__(5391),
Constants = Utils.Constants;
/* The central directory file header */
@@ -11685,21 +12347,16 @@ module.exports = function () {
// Without it file names may be corrupted for other apps when file names use unicode chars
_flags |= Constants.FLG_EFS;
- var _dataHeader = {};
+ const _localHeader = {
+ extraLen: 0
+ };
- function setTime(val) {
- val = new Date(val);
- _time =
- (((val.getFullYear() - 1980) & 0x7f) << 25) | // b09-16 years from 1980
- ((val.getMonth() + 1) << 21) | // b05-08 month
- (val.getDate() << 16) | // b00-04 hour
- // 2 bytes time
- (val.getHours() << 11) | // b11-15 hour
- (val.getMinutes() << 5) | // b05-10 minute
- (val.getSeconds() >> 1); // b00-04 seconds divided by 2
- }
+ // casting
+ const uint32 = (val) => Math.max(0, val) >>> 0;
+ const uint16 = (val) => Math.max(0, val) & 0xffff;
+ const uint8 = (val) => Math.max(0, val) & 0xff;
- setTime(+new Date());
+ _time = Utils.fromDate2DOS(new Date());
return {
get made() {
@@ -11723,6 +12380,28 @@ module.exports = function () {
_flags = val;
},
+ get flags_efs() {
+ return (_flags & Constants.FLG_EFS) > 0;
+ },
+ set flags_efs(val) {
+ if (val) {
+ _flags |= Constants.FLG_EFS;
+ } else {
+ _flags &= ~Constants.FLG_EFS;
+ }
+ },
+
+ get flags_desc() {
+ return (_flags & Constants.FLG_DESC) > 0;
+ },
+ set flags_desc(val) {
+ if (val) {
+ _flags |= Constants.FLG_DESC;
+ } else {
+ _flags &= ~Constants.FLG_DESC;
+ }
+ },
+
get method() {
return _method;
},
@@ -11738,33 +12417,41 @@ module.exports = function () {
},
get time() {
- return new Date(((_time >> 25) & 0x7f) + 1980, ((_time >> 21) & 0x0f) - 1, (_time >> 16) & 0x1f, (_time >> 11) & 0x1f, (_time >> 5) & 0x3f, (_time & 0x1f) << 1);
+ return Utils.fromDOS2Date(this.timeval);
},
set time(val) {
- setTime(val);
+ this.timeval = Utils.fromDate2DOS(val);
},
+
+ get timeval() {
+ return _time;
+ },
+ set timeval(val) {
+ _time = uint32(val);
+ },
+
get timeHighByte() {
- return (_time >>> 8) & 0xff;
+ return uint8(_time >>> 8);
},
get crc() {
return _crc;
},
set crc(val) {
- _crc = Math.max(0, val) >>> 0;
+ _crc = uint32(val);
},
get compressedSize() {
return _compressedSize;
},
set compressedSize(val) {
- _compressedSize = Math.max(0, val) >>> 0;
+ _compressedSize = uint32(val);
},
get size() {
return _size;
},
set size(val) {
- _size = Math.max(0, val) >>> 0;
+ _size = uint32(val);
},
get fileNameLength() {
@@ -11781,6 +12468,13 @@ module.exports = function () {
_extraLen = val;
},
+ get extraLocalLength() {
+ return _localHeader.extraLen;
+ },
+ set extraLocalLength(val) {
+ _localHeader.extraLen = val;
+ },
+
get commentLength() {
return _comLen;
},
@@ -11792,83 +12486,87 @@ module.exports = function () {
return _diskStart;
},
set diskNumStart(val) {
- _diskStart = Math.max(0, val) >>> 0;
+ _diskStart = uint32(val);
},
get inAttr() {
return _inattr;
},
set inAttr(val) {
- _inattr = Math.max(0, val) >>> 0;
+ _inattr = uint32(val);
},
get attr() {
return _attr;
},
set attr(val) {
- _attr = Math.max(0, val) >>> 0;
+ _attr = uint32(val);
},
// get Unix file permissions
get fileAttr() {
- return _attr ? (((_attr >>> 0) | 0) >> 16) & 0xfff : 0;
+ return (_attr || 0) >> 16 & 0xfff;
},
get offset() {
return _offset;
},
set offset(val) {
- _offset = Math.max(0, val) >>> 0;
+ _offset = uint32(val);
},
- get encripted() {
- return (_flags & 1) === 1;
+ get encrypted() {
+ return (_flags & Constants.FLG_ENC) === Constants.FLG_ENC;
},
- get entryHeaderSize() {
+ get centralHeaderSize() {
return Constants.CENHDR + _fnameLen + _extraLen + _comLen;
},
get realDataOffset() {
- return _offset + Constants.LOCHDR + _dataHeader.fnameLen + _dataHeader.extraLen;
+ return _offset + Constants.LOCHDR + _localHeader.fnameLen + _localHeader.extraLen;
},
- get dataHeader() {
- return _dataHeader;
+ get localHeader() {
+ return _localHeader;
},
- loadDataHeaderFromBinary: function (/*Buffer*/ input) {
+ loadLocalHeaderFromBinary: function (/*Buffer*/ input) {
var data = input.slice(_offset, _offset + Constants.LOCHDR);
// 30 bytes and should start with "PK\003\004"
if (data.readUInt32LE(0) !== Constants.LOCSIG) {
- throw new Error(Utils.Errors.INVALID_LOC);
+ throw Utils.Errors.INVALID_LOC();
}
- _dataHeader = {
- // version needed to extract
- version: data.readUInt16LE(Constants.LOCVER),
- // general purpose bit flag
- flags: data.readUInt16LE(Constants.LOCFLG),
- // compression method
- method: data.readUInt16LE(Constants.LOCHOW),
- // modification time (2 bytes time, 2 bytes date)
- time: data.readUInt32LE(Constants.LOCTIM),
- // uncompressed file crc-32 value
- crc: data.readUInt32LE(Constants.LOCCRC),
- // compressed size
- compressedSize: data.readUInt32LE(Constants.LOCSIZ),
- // uncompressed size
- size: data.readUInt32LE(Constants.LOCLEN),
- // filename length
- fnameLen: data.readUInt16LE(Constants.LOCNAM),
- // extra field length
- extraLen: data.readUInt16LE(Constants.LOCEXT)
- };
+
+ // version needed to extract
+ _localHeader.version = data.readUInt16LE(Constants.LOCVER);
+ // general purpose bit flag
+ _localHeader.flags = data.readUInt16LE(Constants.LOCFLG);
+ // compression method
+ _localHeader.method = data.readUInt16LE(Constants.LOCHOW);
+ // modification time (2 bytes time, 2 bytes date)
+ _localHeader.time = data.readUInt32LE(Constants.LOCTIM);
+ // uncompressed file crc-32 valu
+ _localHeader.crc = data.readUInt32LE(Constants.LOCCRC);
+ // compressed size
+ _localHeader.compressedSize = data.readUInt32LE(Constants.LOCSIZ);
+ // uncompressed size
+ _localHeader.size = data.readUInt32LE(Constants.LOCLEN);
+ // filename length
+ _localHeader.fnameLen = data.readUInt16LE(Constants.LOCNAM);
+ // extra field length
+ _localHeader.extraLen = data.readUInt16LE(Constants.LOCEXT);
+
+ // read extra data
+ const extraStart = _offset + Constants.LOCHDR + _localHeader.fnameLen;
+ const extraEnd = extraStart + _localHeader.extraLen;
+ return input.slice(extraStart, extraEnd);
},
loadFromBinary: function (/*Buffer*/ data) {
// data should be 46 bytes and start with "PK 01 02"
if (data.length !== Constants.CENHDR || data.readUInt32LE(0) !== Constants.CENSIG) {
- throw new Error(Utils.Errors.INVALID_CEN);
+ throw Utils.Errors.INVALID_CEN();
}
// version made by
_verMade = data.readUInt16LE(Constants.CENVEM);
@@ -11902,7 +12600,7 @@ module.exports = function () {
_offset = data.readUInt32LE(Constants.CENOFF);
},
- dataHeaderToBinary: function () {
+ localHeaderToBinary: function () {
// LOC header size (30 bytes)
var data = Buffer.alloc(Constants.LOCHDR);
// "PK\003\004"
@@ -11924,11 +12622,11 @@ module.exports = function () {
// filename length
data.writeUInt16LE(_fnameLen, Constants.LOCNAM);
// extra field length
- data.writeUInt16LE(_extraLen, Constants.LOCEXT);
+ data.writeUInt16LE(_localHeader.extraLen, Constants.LOCEXT);
return data;
},
- entryHeaderToBinary: function () {
+ centralHeaderToBinary: function () {
// CEN header size (46 bytes)
var data = Buffer.alloc(Constants.CENHDR + _fnameLen + _extraLen + _comLen);
// "PK\001\002"
@@ -11963,8 +12661,6 @@ module.exports = function () {
data.writeUInt32LE(_attr, Constants.CENATX);
// LOC header offset
data.writeUInt32LE(_offset, Constants.CENOFF);
- // fill all with
- data.fill(0x00, Constants.CENHDR);
return data;
},
@@ -11989,7 +12685,7 @@ module.exports = function () {
inAttr: _inattr,
attr: _attr,
offset: _offset,
- entryHeaderSize: bytes(Constants.CENHDR + _fnameLen + _extraLen + _comLen)
+ centralHeaderSize: bytes(Constants.CENHDR + _fnameLen + _extraLen + _comLen)
};
},
@@ -12002,19 +12698,19 @@ module.exports = function () {
/***/ }),
-/***/ 4958:
+/***/ 1907:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
-exports.EntryHeader = __nccwpck_require__(9032);
-exports.MainHeader = __nccwpck_require__(8952);
+exports.EntryHeader = __nccwpck_require__(3746);
+exports.MainHeader = __nccwpck_require__(9311);
/***/ }),
-/***/ 8952:
+/***/ 9311:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-var Utils = __nccwpck_require__(5182),
+var Utils = __nccwpck_require__(5391),
Constants = Utils.Constants;
/* The entries in the end of central directory */
@@ -12072,7 +12768,7 @@ module.exports = function () {
(data.length !== Constants.ENDHDR || data.readUInt32LE(0) !== Constants.ENDSIG) &&
(data.length < Constants.ZIP64HDR || data.readUInt32LE(0) !== Constants.ZIP64SIG)
) {
- throw new Error(Utils.Errors.INVALID_END);
+ throw Utils.Errors.INVALID_END();
}
if (data.readUInt32LE(0) === Constants.ENDSIG) {
@@ -12143,15 +12839,16 @@ module.exports = function () {
}
};
};
- // Misspelled
+// Misspelled
+
/***/ }),
-/***/ 7686:
+/***/ 5120:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
module.exports = function (/*Buffer*/ inbuf) {
- var zlib = __nccwpck_require__(9796);
+ var zlib = __nccwpck_require__(3106);
var opts = { chunkSize: (parseInt(inbuf.length / 1024) + 1) * 1024 };
@@ -12187,29 +12884,32 @@ module.exports = function (/*Buffer*/ inbuf) {
/***/ }),
-/***/ 3928:
+/***/ 3667:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
-exports.Deflater = __nccwpck_require__(7686);
-exports.Inflater = __nccwpck_require__(2153);
-exports.ZipCrypto = __nccwpck_require__(3228);
+exports.Deflater = __nccwpck_require__(5120);
+exports.Inflater = __nccwpck_require__(9540);
+exports.ZipCrypto = __nccwpck_require__(2689);
/***/ }),
-/***/ 2153:
+/***/ 9540:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-module.exports = function (/*Buffer*/ inbuf) {
- var zlib = __nccwpck_require__(9796);
+const version = +(process.versions ? process.versions.node : "").split(".")[0] || 0;
+
+module.exports = function (/*Buffer*/ inbuf, /*number*/ expectedLength) {
+ var zlib = __nccwpck_require__(3106);
+ const option = version >= 15 && expectedLength > 0 ? { maxOutputLength: expectedLength } : {};
return {
inflate: function () {
- return zlib.inflateRawSync(inbuf);
+ return zlib.inflateRawSync(inbuf, option);
},
inflateAsync: function (/*Function*/ callback) {
- var tmp = zlib.createInflateRaw(),
+ var tmp = zlib.createInflateRaw(option),
parts = [],
total = 0;
tmp.on("data", function (data) {
@@ -12235,7 +12935,7 @@ module.exports = function (/*Buffer*/ inbuf) {
/***/ }),
-/***/ 3228:
+/***/ 2689:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
@@ -12243,7 +12943,8 @@ module.exports = function (/*Buffer*/ inbuf) {
// node crypt, we use it for generate salt
// eslint-disable-next-line node/no-unsupported-features/node-builtins
-const { randomFillSync } = __nccwpck_require__(6113);
+const { randomFillSync } = __nccwpck_require__(6982);
+const Errors = __nccwpck_require__(6232);
// generate CRC32 lookup table
const crctable = new Uint32Array(256).map((t, crc) => {
@@ -12361,11 +13062,11 @@ function decrypt(/*Buffer*/ data, /*Object*/ header, /*String, Buffer*/ pwd) {
// if bit 3 (0x08) of the general-purpose flags field is set, check salt[11] with the high byte of the header time
// 2 byte data block (as per Info-Zip spec), otherwise check with the high byte of the header entry
- const verifyByte = ((header.flags & 0x8) === 0x8) ? header.timeHighByte : header.crc >>> 24;
+ const verifyByte = (header.flags & 0x8) === 0x8 ? header.timeHighByte : header.crc >>> 24;
//3. does password meet expectations
if (salt[11] !== verifyByte) {
- throw "ADM-ZIP: Wrong Password";
+ throw Errors.WRONG_PASSWORD();
}
// 4. decode content
@@ -12417,7 +13118,7 @@ module.exports = { decrypt, encrypt, _salter };
/***/ }),
-/***/ 4522:
+/***/ 2834:
/***/ ((module) => {
module.exports = {
@@ -12566,19 +13267,36 @@ module.exports = {
/***/ }),
-/***/ 1255:
+/***/ 1579:
/***/ ((module) => {
module.exports = {
+ efs: true,
+ encode: (data) => Buffer.from(data, "utf8"),
+ decode: (data) => data.toString("utf8")
+};
+
+
+/***/ }),
+
+/***/ 6232:
+/***/ ((__unused_webpack_module, exports) => {
+
+const errors = {
/* Header error messages */
INVALID_LOC: "Invalid LOC header (bad signature)",
INVALID_CEN: "Invalid CEN header (bad signature)",
INVALID_END: "Invalid END header (bad signature)",
+ /* Descriptor */
+ DESCRIPTOR_NOT_EXIST: "No descriptor present",
+ DESCRIPTOR_UNKNOWN: "Unknown descriptor format",
+ DESCRIPTOR_FAULTY: "Descriptor data is malformed",
+
/* ZipEntry error messages*/
NO_DATA: "Nothing to decompress",
- BAD_CRC: "CRC32 checksum failed",
- FILE_IN_THE_WAY: "There is a file in the way: %s",
+ BAD_CRC: "CRC32 checksum failed {0}",
+ FILE_IN_THE_WAY: "There is a file in the way: {0}",
UNKNOWN_METHOD: "Invalid/unsupported compression method",
/* Inflater error messages */
@@ -12596,27 +13314,47 @@ module.exports = {
/* ADM-ZIP error messages */
CANT_EXTRACT_FILE: "Could not extract the file",
CANT_OVERRIDE: "Target file already exists",
+ DISK_ENTRY_TOO_LARGE: "Number of disk entries is too large",
NO_ZIP: "No zip file was loaded",
NO_ENTRY: "Entry doesn't exist",
DIRECTORY_CONTENT_ERROR: "A directory cannot have content",
- FILE_NOT_FOUND: "File not found: %s",
+ FILE_NOT_FOUND: 'File not found: "{0}"',
NOT_IMPLEMENTED: "Not implemented",
INVALID_FILENAME: "Invalid filename",
- INVALID_FORMAT: "Invalid or unsupported zip format. No END header found"
+ INVALID_FORMAT: "Invalid or unsupported zip format. No END header found",
+ INVALID_PASS_PARAM: "Incompatible password parameter",
+ WRONG_PASSWORD: "Wrong Password",
+
+ /* ADM-ZIP */
+ COMMENT_TOO_LONG: "Comment is too long", // Comment can be max 65535 bytes long (NOTE: some non-US characters may take more space)
+ EXTRA_FIELD_PARSE_ERROR: "Extra field parsing error"
};
+// template
+function E(message) {
+ return function (...args) {
+ if (args.length) { // Allow {0} .. {9} arguments in error message, based on argument number
+ message = message.replace(/\{(\d)\}/g, (_, n) => args[n] || '');
+ }
+
+ return new Error('ADM-ZIP: ' + message);
+ };
+}
+
+// Init errors with template
+for (const msg of Object.keys(errors)) {
+ exports[msg] = E(errors[msg]);
+}
+
/***/ }),
-/***/ 8321:
+/***/ 38:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-const fs = (__nccwpck_require__(2895).require)();
-const pth = __nccwpck_require__(1017);
+const pth = __nccwpck_require__(6928);
-fs.existsSync = fs.existsSync || pth.existsSync;
-
-module.exports = function (/*String*/ path) {
+module.exports = function (/*String*/ path, /*Utils object*/ { fs }) {
var _path = path || "",
_obj = newAttr(),
_stat = null;
@@ -12694,45 +13432,28 @@ module.exports = function (/*String*/ path) {
/***/ }),
-/***/ 2895:
-/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+/***/ 5391:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-exports.require = function () {
- if (typeof process === "object" && process.versions && process.versions["electron"]) {
- try {
- const originalFs = __nccwpck_require__(2941);
- if (Object.keys(originalFs).length > 0) {
- return originalFs;
- }
- } catch (e) {}
- }
- return __nccwpck_require__(7147);
-};
+module.exports = __nccwpck_require__(9066);
+module.exports.Constants = __nccwpck_require__(2834);
+module.exports.Errors = __nccwpck_require__(6232);
+module.exports.FileAttr = __nccwpck_require__(38);
+module.exports.decoder = __nccwpck_require__(1579);
/***/ }),
-/***/ 5182:
+/***/ 9066:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-module.exports = __nccwpck_require__(1291);
-module.exports.Constants = __nccwpck_require__(4522);
-module.exports.Errors = __nccwpck_require__(1255);
-module.exports.FileAttr = __nccwpck_require__(8321);
-
-
-/***/ }),
-
-/***/ 1291:
-/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-
-const fsystem = (__nccwpck_require__(2895).require)();
-const pth = __nccwpck_require__(1017);
-const Constants = __nccwpck_require__(4522);
-const Errors = __nccwpck_require__(1255);
+const fsystem = __nccwpck_require__(9896);
+const pth = __nccwpck_require__(6928);
+const Constants = __nccwpck_require__(2834);
+const Errors = __nccwpck_require__(6232);
const isWin = typeof process === "object" && "win32" === process.platform;
-const is_Obj = (obj) => obj && typeof obj === "object";
+const is_Obj = (obj) => typeof obj === "object" && obj !== null;
// generate CRC32 lookup table
const crcTable = new Uint32Array(256).map((t, c) => {
@@ -12762,7 +13483,7 @@ function Utils(opts) {
module.exports = Utils;
-// INSTANCED functions
+// INSTANTIABLE functions
Utils.prototype.makeDir = function (/*String*/ folder) {
const self = this;
@@ -12779,7 +13500,7 @@ Utils.prototype.makeDir = function (/*String*/ folder) {
} catch (e) {
self.fs.mkdirSync(resolvedPath);
}
- if (stat && stat.isFile()) throw Errors.FILE_IN_THE_WAY.replace("%s", resolvedPath);
+ if (stat && stat.isFile()) throw Errors.FILE_IN_THE_WAY(`"${resolvedPath}"`);
});
}
@@ -12803,10 +13524,10 @@ Utils.prototype.writeFileTo = function (/*String*/ path, /*Buffer*/ content, /*B
var fd;
try {
- fd = self.fs.openSync(path, "w", 438); // 0666
+ fd = self.fs.openSync(path, "w", 0o666); // 0666
} catch (e) {
- self.fs.chmodSync(path, 438);
- fd = self.fs.openSync(path, "w", 438);
+ self.fs.chmodSync(path, 0o666);
+ fd = self.fs.openSync(path, "w", 0o666);
}
if (fd) {
try {
@@ -12815,7 +13536,7 @@ Utils.prototype.writeFileTo = function (/*String*/ path, /*Buffer*/ content, /*B
self.fs.closeSync(fd);
}
}
- self.fs.chmodSync(path, attr || 438);
+ self.fs.chmodSync(path, attr || 0o666);
return true;
};
@@ -12839,13 +13560,13 @@ Utils.prototype.writeFileToAsync = function (/*String*/ path, /*Buffer*/ content
self.fs.exists(folder, function (exists) {
if (!exists) self.makeDir(folder);
- self.fs.open(path, "w", 438, function (err, fd) {
+ self.fs.open(path, "w", 0o666, function (err, fd) {
if (err) {
- self.fs.chmod(path, 438, function () {
- self.fs.open(path, "w", 438, function (err, fd) {
+ self.fs.chmod(path, 0o666, function () {
+ self.fs.open(path, "w", 0o666, function (err, fd) {
self.fs.write(fd, content, 0, content.length, 0, function () {
self.fs.close(fd, function () {
- self.fs.chmod(path, attr || 438, function () {
+ self.fs.chmod(path, attr || 0o666, function () {
callback(true);
});
});
@@ -12855,13 +13576,13 @@ Utils.prototype.writeFileToAsync = function (/*String*/ path, /*Buffer*/ content
} else if (fd) {
self.fs.write(fd, content, 0, content.length, 0, function () {
self.fs.close(fd, function () {
- self.fs.chmod(path, attr || 438, function () {
+ self.fs.chmod(path, attr || 0o666, function () {
callback(true);
});
});
});
} else {
- self.fs.chmod(path, attr || 438, function () {
+ self.fs.chmod(path, attr || 0o666, function () {
callback(true);
});
}
@@ -12881,13 +13602,14 @@ Utils.prototype.findFiles = function (/*String*/ path) {
}
let files = [];
self.fs.readdirSync(dir).forEach(function (file) {
- var path = pth.join(dir, file);
-
- if (self.fs.statSync(path).isDirectory() && recursive) files = files.concat(findSync(path, pattern, recursive));
+ const path = pth.join(dir, file);
+ const stat = self.fs.statSync(path);
if (!pattern || pattern.test(path)) {
- files.push(pth.normalize(path) + (self.fs.statSync(path).isDirectory() ? self.sep : ""));
+ files.push(pth.normalize(path) + (stat.isDirectory() ? self.sep : ""));
}
+
+ if (stat.isDirectory() && recursive) files = files.concat(findSync(path, pattern, recursive));
});
return files;
}
@@ -12895,6 +13617,47 @@ Utils.prototype.findFiles = function (/*String*/ path) {
return findSync(path, undefined, true);
};
+/**
+ * Callback for showing if everything was done.
+ *
+ * @callback filelistCallback
+ * @param {Error} err - Error object
+ * @param {string[]} list - was request fully completed
+ */
+
+/**
+ *
+ * @param {string} dir
+ * @param {filelistCallback} cb
+ */
+Utils.prototype.findFilesAsync = function (dir, cb) {
+ const self = this;
+ let results = [];
+ self.fs.readdir(dir, function (err, list) {
+ if (err) return cb(err);
+ let list_length = list.length;
+ if (!list_length) return cb(null, results);
+ list.forEach(function (file) {
+ file = pth.join(dir, file);
+ self.fs.stat(file, function (err, stat) {
+ if (err) return cb(err);
+ if (stat) {
+ results.push(pth.normalize(file) + (stat.isDirectory() ? self.sep : ""));
+ if (stat.isDirectory()) {
+ self.findFilesAsync(file, function (err, res) {
+ if (err) return cb(err);
+ results = results.concat(res);
+ if (!--list_length) cb(null, results);
+ });
+ } else {
+ if (!--list_length) cb(null, results);
+ }
+ }
+ });
+ });
+ });
+};
+
Utils.prototype.getAttributes = function () {};
Utils.prototype.setAttributes = function () {};
@@ -12910,8 +13673,6 @@ Utils.crc32 = function (buf) {
if (typeof buf === "string") {
buf = Buffer.from(buf, "utf8");
}
- // Generate crcTable
- if (!crcTable.length) genCRCTable();
let len = buf.length;
let crc = ~0;
@@ -12931,14 +13692,49 @@ Utils.methodToString = function (/*Number*/ method) {
}
};
-// removes ".." style path elements
+/**
+ * removes ".." style path elements
+ * @param {string} path - fixable path
+ * @returns string - fixed filepath
+ */
Utils.canonical = function (/*string*/ path) {
if (!path) return "";
// trick normalize think path is absolute
- var safeSuffix = pth.posix.normalize("/" + path.split("\\").join("/"));
+ const safeSuffix = pth.posix.normalize("/" + path.split("\\").join("/"));
return pth.join(".", safeSuffix);
};
+/**
+ * fix file names in achive
+ * @param {string} path - fixable path
+ * @returns string - fixed filepath
+ */
+
+Utils.zipnamefix = function (path) {
+ if (!path) return "";
+ // trick normalize think path is absolute
+ const safeSuffix = pth.posix.normalize("/" + path.split("\\").join("/"));
+ return pth.posix.join(".", safeSuffix);
+};
+
+/**
+ *
+ * @param {Array} arr
+ * @param {function} callback
+ * @returns
+ */
+Utils.findLast = function (arr, callback) {
+ if (!Array.isArray(arr)) throw new TypeError("arr is not array");
+
+ const len = arr.length >>> 0;
+ for (let i = len - 1; i >= 0; i--) {
+ if (callback(arr[i], i, arr)) {
+ return arr[i];
+ }
+ }
+ return void 0;
+};
+
// make abolute paths taking prefix as root folder
Utils.sanitize = function (/*string*/ prefix, /*string*/ name) {
prefix = pth.resolve(pth.normalize(prefix));
@@ -12953,14 +13749,14 @@ Utils.sanitize = function (/*string*/ prefix, /*string*/ name) {
};
// converts buffer, Uint8Array, string types to buffer
-Utils.toBuffer = function toBuffer(/*buffer, Uint8Array, string*/ input) {
+Utils.toBuffer = function toBuffer(/*buffer, Uint8Array, string*/ input, /* function */ encoder) {
if (Buffer.isBuffer(input)) {
return input;
} else if (input instanceof Uint8Array) {
return Buffer.from(input);
} else {
// expect string all other values are invalid and return empty buffer
- return typeof input === "string" ? Buffer.from(input, "utf8") : Buffer.alloc(0);
+ return typeof input === "string" ? encoder(input) : Buffer.alloc(0);
}
};
@@ -12971,46 +13767,100 @@ Utils.readBigUInt64LE = function (/*Buffer*/ buffer, /*int*/ index) {
return parseInt(`0x${slice.toString("hex")}`);
};
+Utils.fromDOS2Date = function (val) {
+ return new Date(((val >> 25) & 0x7f) + 1980, Math.max(((val >> 21) & 0x0f) - 1, 0), Math.max((val >> 16) & 0x1f, 1), (val >> 11) & 0x1f, (val >> 5) & 0x3f, (val & 0x1f) << 1);
+};
+
+Utils.fromDate2DOS = function (val) {
+ let date = 0;
+ let time = 0;
+ if (val.getFullYear() > 1979) {
+ date = (((val.getFullYear() - 1980) & 0x7f) << 9) | ((val.getMonth() + 1) << 5) | val.getDate();
+ time = (val.getHours() << 11) | (val.getMinutes() << 5) | (val.getSeconds() >> 1);
+ }
+ return (date << 16) | time;
+};
+
Utils.isWin = isWin; // Do we have windows system
Utils.crcTable = crcTable;
/***/ }),
-/***/ 4057:
+/***/ 2609:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-var Utils = __nccwpck_require__(5182),
- Headers = __nccwpck_require__(4958),
+var Utils = __nccwpck_require__(5391),
+ Headers = __nccwpck_require__(1907),
Constants = Utils.Constants,
- Methods = __nccwpck_require__(3928);
+ Methods = __nccwpck_require__(3667);
-module.exports = function (/*Buffer*/ input) {
- var _entryHeader = new Headers.EntryHeader(),
+module.exports = function (/** object */ options, /*Buffer*/ input) {
+ var _centralHeader = new Headers.EntryHeader(),
_entryName = Buffer.alloc(0),
_comment = Buffer.alloc(0),
_isDirectory = false,
uncompressedData = null,
- _extra = Buffer.alloc(0);
+ _extra = Buffer.alloc(0),
+ _extralocal = Buffer.alloc(0),
+ _efs = true;
+
+ // assign options
+ const opts = options;
+
+ const decoder = typeof opts.decoder === "object" ? opts.decoder : Utils.decoder;
+ _efs = decoder.hasOwnProperty("efs") ? decoder.efs : false;
function getCompressedDataFromZip() {
- if (!input || !Buffer.isBuffer(input)) {
+ //if (!input || !Buffer.isBuffer(input)) {
+ if (!input || !(input instanceof Uint8Array)) {
return Buffer.alloc(0);
}
- _entryHeader.loadDataHeaderFromBinary(input);
- return input.slice(_entryHeader.realDataOffset, _entryHeader.realDataOffset + _entryHeader.compressedSize);
+ _extralocal = _centralHeader.loadLocalHeaderFromBinary(input);
+ return input.slice(_centralHeader.realDataOffset, _centralHeader.realDataOffset + _centralHeader.compressedSize);
}
function crc32OK(data) {
- // if bit 3 (0x08) of the general-purpose flags field is set, then the CRC-32 and file sizes are not known when the header is written
- if ((_entryHeader.flags & 0x8) !== 0x8) {
- if (Utils.crc32(data) !== _entryHeader.dataHeader.crc) {
+ // if bit 3 (0x08) of the general-purpose flags field is set, then the CRC-32 and file sizes are not known when the local header is written
+ if (!_centralHeader.flags_desc) {
+ if (Utils.crc32(data) !== _centralHeader.localHeader.crc) {
return false;
}
} else {
- // @TODO: load and check data descriptor header
- // The fields in the local header are filled with zero, and the CRC-32 and size are appended in a 12-byte structure
- // (optionally preceded by a 4-byte signature) immediately after the compressed data:
+ const descriptor = {};
+ const dataEndOffset = _centralHeader.realDataOffset + _centralHeader.compressedSize;
+ // no descriptor after compressed data, instead new local header
+ if (input.readUInt32LE(dataEndOffset) == Constants.LOCSIG || input.readUInt32LE(dataEndOffset) == Constants.CENSIG) {
+ throw Utils.Errors.DESCRIPTOR_NOT_EXIST();
+ }
+
+ // get decriptor data
+ if (input.readUInt32LE(dataEndOffset) == Constants.EXTSIG) {
+ // descriptor with signature
+ descriptor.crc = input.readUInt32LE(dataEndOffset + Constants.EXTCRC);
+ descriptor.compressedSize = input.readUInt32LE(dataEndOffset + Constants.EXTSIZ);
+ descriptor.size = input.readUInt32LE(dataEndOffset + Constants.EXTLEN);
+ } else if (input.readUInt16LE(dataEndOffset + 12) === 0x4b50) {
+ // descriptor without signature (we check is new header starting where we expect)
+ descriptor.crc = input.readUInt32LE(dataEndOffset + Constants.EXTCRC - 4);
+ descriptor.compressedSize = input.readUInt32LE(dataEndOffset + Constants.EXTSIZ - 4);
+ descriptor.size = input.readUInt32LE(dataEndOffset + Constants.EXTLEN - 4);
+ } else {
+ throw Utils.Errors.DESCRIPTOR_UNKNOWN();
+ }
+
+ // check data integrity
+ if (descriptor.compressedSize !== _centralHeader.compressedSize || descriptor.size !== _centralHeader.size || descriptor.crc !== _centralHeader.crc) {
+ throw Utils.Errors.DESCRIPTOR_FAULTY();
+ }
+ if (Utils.crc32(data) !== descriptor.crc) {
+ return false;
+ }
+
+ // @TODO: zip64 bit descriptor fields
+ // if bit 3 is set and any value in local header "zip64 Extended information" extra field are set 0 (place holder)
+ // then 64-bit descriptor format is used instead of 32-bit
+ // central header - "zip64 Extended information" extra field should store real values and not place holders
}
return true;
}
@@ -13022,7 +13872,7 @@ module.exports = function (/*Buffer*/ input) {
}
if (_isDirectory) {
if (async && callback) {
- callback(Buffer.alloc(0), Utils.Errors.DIRECTORY_CONTENT_ERROR); //si added error.
+ callback(Buffer.alloc(0), Utils.Errors.DIRECTORY_CONTENT_ERROR()); //si added error.
}
return Buffer.alloc(0);
}
@@ -13035,33 +13885,33 @@ module.exports = function (/*Buffer*/ input) {
return compressedData;
}
- if (_entryHeader.encripted) {
+ if (_centralHeader.encrypted) {
if ("string" !== typeof pass && !Buffer.isBuffer(pass)) {
- throw new Error("ADM-ZIP: Incompatible password parameter");
+ throw Utils.Errors.INVALID_PASS_PARAM();
}
- compressedData = Methods.ZipCrypto.decrypt(compressedData, _entryHeader, pass);
+ compressedData = Methods.ZipCrypto.decrypt(compressedData, _centralHeader, pass);
}
- var data = Buffer.alloc(_entryHeader.size);
+ var data = Buffer.alloc(_centralHeader.size);
- switch (_entryHeader.method) {
+ switch (_centralHeader.method) {
case Utils.Constants.STORED:
compressedData.copy(data);
if (!crc32OK(data)) {
- if (async && callback) callback(data, Utils.Errors.BAD_CRC); //si added error
- throw new Error(Utils.Errors.BAD_CRC);
+ if (async && callback) callback(data, Utils.Errors.BAD_CRC()); //si added error
+ throw Utils.Errors.BAD_CRC();
} else {
//si added otherwise did not seem to return data.
if (async && callback) callback(data);
return data;
}
case Utils.Constants.DEFLATED:
- var inflater = new Methods.Inflater(compressedData);
+ var inflater = new Methods.Inflater(compressedData, _centralHeader.size);
if (!async) {
const result = inflater.inflate(data);
result.copy(data, 0);
if (!crc32OK(data)) {
- throw new Error(Utils.Errors.BAD_CRC + " " + _entryName.toString());
+ throw Utils.Errors.BAD_CRC(`"${decoder.decode(_entryName)}"`);
}
return data;
} else {
@@ -13069,7 +13919,7 @@ module.exports = function (/*Buffer*/ input) {
result.copy(result, 0);
if (callback) {
if (!crc32OK(result)) {
- callback(result, Utils.Errors.BAD_CRC); //si added error
+ callback(result, Utils.Errors.BAD_CRC()); //si added error
} else {
callback(result);
}
@@ -13078,8 +13928,8 @@ module.exports = function (/*Buffer*/ input) {
}
break;
default:
- if (async && callback) callback(Buffer.alloc(0), Utils.Errors.UNKNOWN_METHOD);
- throw new Error(Utils.Errors.UNKNOWN_METHOD);
+ if (async && callback) callback(Buffer.alloc(0), Utils.Errors.UNKNOWN_METHOD());
+ throw Utils.Errors.UNKNOWN_METHOD();
}
}
@@ -13093,9 +13943,9 @@ module.exports = function (/*Buffer*/ input) {
if (uncompressedData.length && !_isDirectory) {
var compressedData;
// Local file header
- switch (_entryHeader.method) {
+ switch (_centralHeader.method) {
case Utils.Constants.STORED:
- _entryHeader.compressedSize = _entryHeader.size;
+ _centralHeader.compressedSize = _centralHeader.size;
compressedData = Buffer.alloc(uncompressedData.length);
uncompressedData.copy(compressedData);
@@ -13107,12 +13957,12 @@ module.exports = function (/*Buffer*/ input) {
var deflater = new Methods.Deflater(uncompressedData);
if (!async) {
var deflated = deflater.deflate();
- _entryHeader.compressedSize = deflated.length;
+ _centralHeader.compressedSize = deflated.length;
return deflated;
} else {
deflater.deflateAsync(function (data) {
compressedData = Buffer.alloc(data.length);
- _entryHeader.compressedSize = data.length;
+ _centralHeader.compressedSize = data.length;
data.copy(compressedData);
callback && callback(compressedData);
});
@@ -13132,18 +13982,22 @@ module.exports = function (/*Buffer*/ input) {
}
function parseExtra(data) {
- var offset = 0;
- var signature, size, part;
- while (offset < data.length) {
- signature = data.readUInt16LE(offset);
- offset += 2;
- size = data.readUInt16LE(offset);
- offset += 2;
- part = data.slice(offset, offset + size);
- offset += size;
- if (Constants.ID_ZIP64 === signature) {
- parseZip64ExtendedInformation(part);
+ try {
+ var offset = 0;
+ var signature, size, part;
+ while (offset + 4 < data.length) {
+ signature = data.readUInt16LE(offset);
+ offset += 2;
+ size = data.readUInt16LE(offset);
+ offset += 2;
+ part = data.slice(offset, offset + size);
+ offset += size;
+ if (Constants.ID_ZIP64 === signature) {
+ parseZip64ExtendedInformation(part);
+ }
}
+ } catch (error) {
+ throw Utils.Errors.EXTRA_FIELD_PARSE_ERROR();
}
}
@@ -13153,42 +14007,50 @@ module.exports = function (/*Buffer*/ input) {
if (data.length >= Constants.EF_ZIP64_SCOMP) {
size = readUInt64LE(data, Constants.EF_ZIP64_SUNCOMP);
- if (_entryHeader.size === Constants.EF_ZIP64_OR_32) {
- _entryHeader.size = size;
+ if (_centralHeader.size === Constants.EF_ZIP64_OR_32) {
+ _centralHeader.size = size;
}
}
if (data.length >= Constants.EF_ZIP64_RHO) {
compressedSize = readUInt64LE(data, Constants.EF_ZIP64_SCOMP);
- if (_entryHeader.compressedSize === Constants.EF_ZIP64_OR_32) {
- _entryHeader.compressedSize = compressedSize;
+ if (_centralHeader.compressedSize === Constants.EF_ZIP64_OR_32) {
+ _centralHeader.compressedSize = compressedSize;
}
}
if (data.length >= Constants.EF_ZIP64_DSN) {
offset = readUInt64LE(data, Constants.EF_ZIP64_RHO);
- if (_entryHeader.offset === Constants.EF_ZIP64_OR_32) {
- _entryHeader.offset = offset;
+ if (_centralHeader.offset === Constants.EF_ZIP64_OR_32) {
+ _centralHeader.offset = offset;
}
}
if (data.length >= Constants.EF_ZIP64_DSN + 4) {
diskNumStart = data.readUInt32LE(Constants.EF_ZIP64_DSN);
- if (_entryHeader.diskNumStart === Constants.EF_ZIP64_OR_16) {
- _entryHeader.diskNumStart = diskNumStart;
+ if (_centralHeader.diskNumStart === Constants.EF_ZIP64_OR_16) {
+ _centralHeader.diskNumStart = diskNumStart;
}
}
}
return {
get entryName() {
- return _entryName.toString();
+ return decoder.decode(_entryName);
},
get rawEntryName() {
return _entryName;
},
set entryName(val) {
- _entryName = Utils.toBuffer(val);
+ _entryName = Utils.toBuffer(val, decoder.encode);
var lastChar = _entryName[_entryName.length - 1];
_isDirectory = lastChar === 47 || lastChar === 92;
- _entryHeader.fileNameLength = _entryName.length;
+ _centralHeader.fileNameLength = _entryName.length;
+ },
+
+ get efs() {
+ if (typeof _efs === "function") {
+ return _efs(this.entryName);
+ } else {
+ return _efs;
+ }
},
get extra() {
@@ -13196,20 +14058,21 @@ module.exports = function (/*Buffer*/ input) {
},
set extra(val) {
_extra = val;
- _entryHeader.extraLength = val.length;
+ _centralHeader.extraLength = val.length;
parseExtra(val);
},
get comment() {
- return _comment.toString();
+ return decoder.decode(_comment);
},
set comment(val) {
- _comment = Utils.toBuffer(val);
- _entryHeader.commentLength = _comment.length;
+ _comment = Utils.toBuffer(val, decoder.encode);
+ _centralHeader.commentLength = _comment.length;
+ if (_comment.length > 0xffff) throw Utils.Errors.COMMENT_TOO_LONG();
},
get name() {
- var n = _entryName.toString();
+ var n = decoder.decode(_entryName);
return _isDirectory
? n
.substr(n.length - 1)
@@ -13230,20 +14093,20 @@ module.exports = function (/*Buffer*/ input) {
},
setData: function (value) {
- uncompressedData = Utils.toBuffer(value);
+ uncompressedData = Utils.toBuffer(value, Utils.decoder.encode);
if (!_isDirectory && uncompressedData.length) {
- _entryHeader.size = uncompressedData.length;
- _entryHeader.method = Utils.Constants.DEFLATED;
- _entryHeader.crc = Utils.crc32(value);
- _entryHeader.changed = true;
+ _centralHeader.size = uncompressedData.length;
+ _centralHeader.method = Utils.Constants.DEFLATED;
+ _centralHeader.crc = Utils.crc32(value);
+ _centralHeader.changed = true;
} else {
// folders and blank files should be stored
- _entryHeader.method = Utils.Constants.STORED;
+ _centralHeader.method = Utils.Constants.STORED;
}
},
getData: function (pass) {
- if (_entryHeader.changed) {
+ if (_centralHeader.changed) {
return uncompressedData;
} else {
return decompress(false, null, pass);
@@ -13251,7 +14114,7 @@ module.exports = function (/*Buffer*/ input) {
},
getDataAsync: function (/*Function*/ callback, pass) {
- if (_entryHeader.changed) {
+ if (_centralHeader.changed) {
callback(uncompressedData);
} else {
decompress(true, callback, pass);
@@ -13259,39 +14122,58 @@ module.exports = function (/*Buffer*/ input) {
},
set attr(attr) {
- _entryHeader.attr = attr;
+ _centralHeader.attr = attr;
},
get attr() {
- return _entryHeader.attr;
+ return _centralHeader.attr;
},
set header(/*Buffer*/ data) {
- _entryHeader.loadFromBinary(data);
+ _centralHeader.loadFromBinary(data);
},
get header() {
- return _entryHeader;
+ return _centralHeader;
},
- packHeader: function () {
+ packCentralHeader: function () {
+ _centralHeader.flags_efs = this.efs;
+ _centralHeader.extraLength = _extra.length;
// 1. create header (buffer)
- var header = _entryHeader.entryHeaderToBinary();
+ var header = _centralHeader.centralHeaderToBinary();
var addpos = Utils.Constants.CENHDR;
// 2. add file name
_entryName.copy(header, addpos);
addpos += _entryName.length;
// 3. add extra data
- if (_entryHeader.extraLength) {
- _extra.copy(header, addpos);
- addpos += _entryHeader.extraLength;
- }
+ _extra.copy(header, addpos);
+ addpos += _centralHeader.extraLength;
// 4. add file comment
- if (_entryHeader.commentLength) {
- _comment.copy(header, addpos);
- }
+ _comment.copy(header, addpos);
return header;
},
+ packLocalHeader: function () {
+ let addpos = 0;
+ _centralHeader.flags_efs = this.efs;
+ _centralHeader.extraLocalLength = _extralocal.length;
+ // 1. construct local header Buffer
+ const localHeaderBuf = _centralHeader.localHeaderToBinary();
+ // 2. localHeader - crate header buffer
+ const localHeader = Buffer.alloc(localHeaderBuf.length + _entryName.length + _centralHeader.extraLocalLength);
+ // 2.1 add localheader
+ localHeaderBuf.copy(localHeader, addpos);
+ addpos += localHeaderBuf.length;
+ // 2.2 add file name
+ _entryName.copy(localHeader, addpos);
+ addpos += _entryName.length;
+ // 2.3 add extra field
+ _extralocal.copy(localHeader, addpos);
+ addpos += _extralocal.length;
+
+ return localHeader;
+ },
+
toJSON: function () {
const bytes = function (nr) {
return "<" + ((nr && nr.length + " bytes buffer") || "null") + ">";
@@ -13302,7 +14184,7 @@ module.exports = function (/*Buffer*/ input) {
name: this.name,
comment: this.comment,
isDirectory: this.isDirectory,
- header: _entryHeader.toJSON(),
+ header: _centralHeader.toJSON(),
compressedData: bytes(input),
data: bytes(uncompressedData)
};
@@ -13317,12 +14199,12 @@ module.exports = function (/*Buffer*/ input) {
/***/ }),
-/***/ 7744:
+/***/ 6991:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-const ZipEntry = __nccwpck_require__(4057);
-const Headers = __nccwpck_require__(4958);
-const Utils = __nccwpck_require__(5182);
+const ZipEntry = __nccwpck_require__(2609);
+const Headers = __nccwpck_require__(1907);
+const Utils = __nccwpck_require__(5391);
module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
var entryList = [],
@@ -13331,11 +14213,12 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
mainHeader = new Headers.MainHeader(),
loadedEntries = false;
var password = null;
+ const temporary = new Set();
// assign options
- const opts = Object.assign(Object.create(null), options);
+ const opts = options;
- const { noSort } = opts;
+ const { noSort, decoder } = opts;
if (inBuffer) {
// is a memory buffer
@@ -13345,31 +14228,45 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
loadedEntries = true;
}
- function iterateEntries(callback) {
- const totalEntries = mainHeader.diskEntries; // total number of entries
- let index = mainHeader.offset; // offset of first CEN header
+ function makeTemporaryFolders() {
+ const foldersList = new Set();
- for (let i = 0; i < totalEntries; i++) {
- let tmp = index;
- const entry = new ZipEntry(inBuffer);
+ // Make list of all folders in file
+ for (const elem of Object.keys(entryTable)) {
+ const elements = elem.split("/");
+ elements.pop(); // filename
+ if (!elements.length) continue; // no folders
+ for (let i = 0; i < elements.length; i++) {
+ const sub = elements.slice(0, i + 1).join("/") + "/";
+ foldersList.add(sub);
+ }
+ }
- entry.header = inBuffer.slice(tmp, (tmp += Utils.Constants.CENHDR));
- entry.entryName = inBuffer.slice(tmp, (tmp += entry.header.fileNameLength));
-
- index += entry.header.entryHeaderSize;
-
- callback(entry);
+ // create missing folders as temporary
+ for (const elem of foldersList) {
+ if (!(elem in entryTable)) {
+ const tempfolder = new ZipEntry(opts);
+ tempfolder.entryName = elem;
+ tempfolder.attr = 0x10;
+ tempfolder.temporary = true;
+ entryList.push(tempfolder);
+ entryTable[tempfolder.entryName] = tempfolder;
+ temporary.add(tempfolder);
+ }
}
}
function readEntries() {
loadedEntries = true;
entryTable = {};
+ if (mainHeader.diskEntries > (inBuffer.length - mainHeader.offset) / Utils.Constants.CENHDR) {
+ throw Utils.Errors.DISK_ENTRY_TOO_LARGE();
+ }
entryList = new Array(mainHeader.diskEntries); // total number of entries
var index = mainHeader.offset; // offset of first CEN header
for (var i = 0; i < entryList.length; i++) {
var tmp = index,
- entry = new ZipEntry(inBuffer);
+ entry = new ZipEntry(opts, inBuffer);
entry.header = inBuffer.slice(tmp, (tmp += Utils.Constants.CENHDR));
entry.entryName = inBuffer.slice(tmp, (tmp += entry.header.fileNameLength));
@@ -13380,11 +14277,13 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
if (entry.header.commentLength) entry.comment = inBuffer.slice(tmp, tmp + entry.header.commentLength);
- index += entry.header.entryHeaderSize;
+ index += entry.header.centralHeaderSize;
entryList[i] = entry;
entryTable[entry.entryName] = entry;
}
+ temporary.clear();
+ makeTemporaryFolders();
}
function readMainHeader(/*Boolean*/ readNow) {
@@ -13395,6 +14294,10 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
endOffset = -1, // Start offset of the END header
commentEnd = 0;
+ // option to search header form entire file
+ const trailingSpace = typeof opts.trailingSpace === "boolean" ? opts.trailingSpace : false;
+ if (trailingSpace) max = 0;
+
for (i; i >= n; i--) {
if (inBuffer[i] !== 0x50) continue; // quick check that the byte is 'P'
if (inBuffer.readUInt32LE(i) === Utils.Constants.ENDSIG) {
@@ -13421,7 +14324,7 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
}
}
- if (!~endOffset) throw new Error(Utils.Errors.INVALID_FORMAT);
+ if (endOffset == -1) throw Utils.Errors.INVALID_FORMAT();
mainHeader.loadFromBinary(inBuffer.slice(endOffset, endStart));
if (mainHeader.commentLength) {
@@ -13445,7 +14348,7 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
if (!loadedEntries) {
readEntries();
}
- return entryList;
+ return entryList.filter((e) => !temporary.has(e));
},
/**
@@ -13453,10 +14356,10 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
* @return {String}
*/
get comment() {
- return _comment.toString();
+ return decoder.decode(_comment);
},
set comment(val) {
- _comment = Utils.toBuffer(val);
+ _comment = Utils.toBuffer(val, decoder.encode);
mainHeader.commentLength = _comment.length;
},
@@ -13469,12 +14372,7 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
},
forEach: function (callback) {
- if (!loadedEntries) {
- iterateEntries(callback);
- return;
- }
-
- entryList.forEach(callback);
+ this.entries.forEach(callback);
},
/**
@@ -13505,27 +14403,39 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
},
/**
- * Removes the entry with the given name from the entry list.
+ * Removes the file with the given name from the entry list.
*
* If the entry is a directory, then all nested files and directories will be removed
* @param entryName
+ * @returns {void}
+ */
+ deleteFile: function (/*String*/ entryName, withsubfolders = true) {
+ if (!loadedEntries) {
+ readEntries();
+ }
+ const entry = entryTable[entryName];
+ const list = this.getEntryChildren(entry, withsubfolders).map((child) => child.entryName);
+
+ list.forEach(this.deleteEntry);
+ },
+
+ /**
+ * Removes the entry with the given name from the entry list.
+ *
+ * @param {string} entryName
+ * @returns {void}
*/
deleteEntry: function (/*String*/ entryName) {
if (!loadedEntries) {
readEntries();
}
- var entry = entryTable[entryName];
- if (entry && entry.isDirectory) {
- var _self = this;
- this.getEntryChildren(entry).forEach(function (child) {
- if (child.entryName !== entryName) {
- _self.deleteEntry(child.entryName);
- }
- });
+ const entry = entryTable[entryName];
+ const index = entryList.indexOf(entry);
+ if (index >= 0) {
+ entryList.splice(index, 1);
+ delete entryTable[entryName];
+ mainHeader.totalEntries = entryList.length;
}
- entryList.splice(entryList.indexOf(entry), 1);
- delete entryTable[entryName];
- mainHeader.totalEntries = entryList.length;
},
/**
@@ -13534,25 +14444,42 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
* @param entry
* @return Array
*/
- getEntryChildren: function (/*ZipEntry*/ entry) {
+ getEntryChildren: function (/*ZipEntry*/ entry, subfolders = true) {
if (!loadedEntries) {
readEntries();
}
- if (entry && entry.isDirectory) {
- const list = [];
- const name = entry.entryName;
- const len = name.length;
+ if (typeof entry === "object") {
+ if (entry.isDirectory && subfolders) {
+ const list = [];
+ const name = entry.entryName;
- entryList.forEach(function (zipEntry) {
- if (zipEntry.entryName.substr(0, len) === name) {
- list.push(zipEntry);
+ for (const zipEntry of entryList) {
+ if (zipEntry.entryName.startsWith(name)) {
+ list.push(zipEntry);
+ }
}
- });
- return list;
+ return list;
+ } else {
+ return [entry];
+ }
}
return [];
},
+ /**
+ * How many child elements entry has
+ *
+ * @param {ZipEntry} entry
+ * @return {integer}
+ */
+ getChildCount: function (entry) {
+ if (entry && entry.isDirectory) {
+ const list = this.getEntryChildren(entry);
+ return list.includes(entry) ? list.length - 1 : list.length;
+ }
+ return 0;
+ },
+
/**
* Returns the zip file
*
@@ -13565,45 +14492,43 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
sortEntries();
const dataBlock = [];
- const entryHeaders = [];
+ const headerBlocks = [];
let totalSize = 0;
let dindex = 0;
mainHeader.size = 0;
mainHeader.offset = 0;
+ let totalEntries = 0;
- for (const entry of entryList) {
+ for (const entry of this.entries) {
// compress data and set local and entry header accordingly. Reason why is called first
const compressedData = entry.getCompressedData();
- // 1. construct data header
entry.header.offset = dindex;
- const dataHeader = entry.header.dataHeaderToBinary();
- const entryNameLen = entry.rawEntryName.length;
- // 1.2. postheader - data after data header
- const postHeader = Buffer.alloc(entryNameLen + entry.extra.length);
- entry.rawEntryName.copy(postHeader, 0);
- entry.extra.copy(postHeader, entryNameLen);
+
+ // 1. construct local header
+ const localHeader = entry.packLocalHeader();
// 2. offsets
- const dataLength = dataHeader.length + postHeader.length + compressedData.length;
+ const dataLength = localHeader.length + compressedData.length;
dindex += dataLength;
// 3. store values in sequence
- dataBlock.push(dataHeader);
- dataBlock.push(postHeader);
+ dataBlock.push(localHeader);
dataBlock.push(compressedData);
- // 4. construct entry header
- const entryHeader = entry.packHeader();
- entryHeaders.push(entryHeader);
+ // 4. construct central header
+ const centralHeader = entry.packCentralHeader();
+ headerBlocks.push(centralHeader);
// 5. update main header
- mainHeader.size += entryHeader.length;
- totalSize += dataLength + entryHeader.length;
+ mainHeader.size += centralHeader.length;
+ totalSize += dataLength + centralHeader.length;
+ totalEntries++;
}
totalSize += mainHeader.mainHeaderSize; // also includes zip file comment length
// point to end of data and beginning of central directory first record
mainHeader.offset = dindex;
+ mainHeader.totalEntries = totalEntries;
dindex = 0;
const outBuffer = Buffer.alloc(totalSize);
@@ -13614,7 +14539,7 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
}
// write central directory entries
- for (const content of entryHeaders) {
+ for (const content of headerBlocks) {
content.copy(outBuffer, dindex);
dindex += content.length;
}
@@ -13626,6 +14551,13 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
}
mh.copy(outBuffer, dindex);
+ // Since we update entry and main header offsets,
+ // they are no longer valid and we have to reset content
+ // (Issue 64)
+
+ inBuffer = outBuffer;
+ loadedEntries = false;
+
return outBuffer;
},
@@ -13637,37 +14569,40 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
sortEntries();
const dataBlock = [];
- const entryHeaders = [];
+ const centralHeaders = [];
let totalSize = 0;
let dindex = 0;
+ let totalEntries = 0;
mainHeader.size = 0;
mainHeader.offset = 0;
const compress2Buffer = function (entryLists) {
- if (entryLists.length) {
- const entry = entryLists.pop();
+ if (entryLists.length > 0) {
+ const entry = entryLists.shift();
const name = entry.entryName + entry.extra.toString();
if (onItemStart) onItemStart(name);
entry.getCompressedDataAsync(function (compressedData) {
if (onItemEnd) onItemEnd(name);
-
entry.header.offset = dindex;
- // data header
- const dataHeader = entry.header.dataHeaderToBinary();
- const postHeader = Buffer.alloc(name.length, name);
- const dataLength = dataHeader.length + postHeader.length + compressedData.length;
+ // 1. construct local header
+ const localHeader = entry.packLocalHeader();
+
+ // 2. offsets
+ const dataLength = localHeader.length + compressedData.length;
dindex += dataLength;
- dataBlock.push(dataHeader);
- dataBlock.push(postHeader);
+ // 3. store values in sequence
+ dataBlock.push(localHeader);
dataBlock.push(compressedData);
- const entryHeader = entry.packHeader();
- entryHeaders.push(entryHeader);
- mainHeader.size += entryHeader.length;
- totalSize += dataLength + entryHeader.length;
+ // central header
+ const centalHeader = entry.packCentralHeader();
+ centralHeaders.push(centalHeader);
+ mainHeader.size += centalHeader.length;
+ totalSize += dataLength + centalHeader.length;
+ totalEntries++;
compress2Buffer(entryLists);
});
@@ -13675,6 +14610,7 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
totalSize += mainHeader.mainHeaderSize; // also includes zip file comment length
// point to end of data and beginning of central directory first record
mainHeader.offset = dindex;
+ mainHeader.totalEntries = totalEntries;
dindex = 0;
const outBuffer = Buffer.alloc(totalSize);
@@ -13682,7 +14618,7 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
content.copy(outBuffer, dindex); // write data blocks
dindex += content.length;
});
- entryHeaders.forEach(function (content) {
+ centralHeaders.forEach(function (content) {
content.copy(outBuffer, dindex); // write central directory entries
dindex += content.length;
});
@@ -13694,11 +14630,18 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
mh.copy(outBuffer, dindex); // write main header
+ // Since we update entry and main header offsets, they are no
+ // longer valid and we have to reset content using our new buffer
+ // (Issue 64)
+
+ inBuffer = outBuffer;
+ loadedEntries = false;
+
onSuccess(outBuffer);
}
};
- compress2Buffer(entryList);
+ compress2Buffer(Array.from(this.entries));
} catch (e) {
onFail(e);
}
@@ -13709,12 +14652,12 @@ module.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {
/***/ }),
-/***/ 3682:
+/***/ 2732:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-var register = __nccwpck_require__(4670);
-var addHook = __nccwpck_require__(5549);
-var removeHook = __nccwpck_require__(6819);
+var register = __nccwpck_require__(1063);
+var addHook = __nccwpck_require__(2027);
+var removeHook = __nccwpck_require__(9934);
// bind with array of arguments: https://stackoverflow.com/a/21792913
var bind = Function.bind;
@@ -13777,7 +14720,7 @@ module.exports.Collection = Hook.Collection;
/***/ }),
-/***/ 5549:
+/***/ 2027:
/***/ ((module) => {
module.exports = addHook;
@@ -13830,7 +14773,7 @@ function addHook(state, kind, name, hook) {
/***/ }),
-/***/ 4670:
+/***/ 1063:
/***/ ((module) => {
module.exports = register;
@@ -13864,7 +14807,7 @@ function register(state, name, method, options) {
/***/ }),
-/***/ 6819:
+/***/ 9934:
/***/ ((module) => {
module.exports = removeHook;
@@ -13890,16 +14833,16 @@ function removeHook(state, name, method) {
/***/ }),
-/***/ 610:
+/***/ 748:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const stringify = __nccwpck_require__(8750);
-const compile = __nccwpck_require__(9434);
-const expand = __nccwpck_require__(5873);
-const parse = __nccwpck_require__(6477);
+const stringify = __nccwpck_require__(3317);
+const compile = __nccwpck_require__(1113);
+const expand = __nccwpck_require__(5290);
+const parse = __nccwpck_require__(507);
/**
* Expand the given pattern or create a regex-compatible string.
@@ -13919,8 +14862,8 @@ const braces = (input, options = {}) => {
let output = [];
if (Array.isArray(input)) {
- for (let pattern of input) {
- let result = braces.create(pattern, options);
+ for (const pattern of input) {
+ const result = braces.create(pattern, options);
if (Array.isArray(result)) {
output.push(...result);
} else {
@@ -14054,7 +14997,7 @@ braces.create = (input, options = {}) => {
return [input];
}
- return options.expand !== true
+ return options.expand !== true
? braces.compile(input, options)
: braces.expand(input, options);
};
@@ -14068,40 +15011,42 @@ module.exports = braces;
/***/ }),
-/***/ 9434:
+/***/ 1113:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const fill = __nccwpck_require__(6330);
-const utils = __nccwpck_require__(5207);
+const fill = __nccwpck_require__(877);
+const utils = __nccwpck_require__(2257);
const compile = (ast, options = {}) => {
- let walk = (node, parent = {}) => {
- let invalidBlock = utils.isInvalidBrace(parent);
- let invalidNode = node.invalid === true && options.escapeInvalid === true;
- let invalid = invalidBlock === true || invalidNode === true;
- let prefix = options.escapeInvalid === true ? '\\' : '';
+ const walk = (node, parent = {}) => {
+ const invalidBlock = utils.isInvalidBrace(parent);
+ const invalidNode = node.invalid === true && options.escapeInvalid === true;
+ const invalid = invalidBlock === true || invalidNode === true;
+ const prefix = options.escapeInvalid === true ? '\\' : '';
let output = '';
if (node.isOpen === true) {
return prefix + node.value;
}
+
if (node.isClose === true) {
+ console.log('node.isClose', prefix, node.value);
return prefix + node.value;
}
if (node.type === 'open') {
- return invalid ? (prefix + node.value) : '(';
+ return invalid ? prefix + node.value : '(';
}
if (node.type === 'close') {
- return invalid ? (prefix + node.value) : ')';
+ return invalid ? prefix + node.value : ')';
}
if (node.type === 'comma') {
- return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|');
+ return node.prev.type === 'comma' ? '' : invalid ? node.value : '|';
}
if (node.value) {
@@ -14109,8 +15054,8 @@ const compile = (ast, options = {}) => {
}
if (node.nodes && node.ranges > 0) {
- let args = utils.reduce(node.nodes);
- let range = fill(...args, { ...options, wrap: false, toRegex: true });
+ const args = utils.reduce(node.nodes);
+ const range = fill(...args, { ...options, wrap: false, toRegex: true, strictZeros: true });
if (range.length !== 0) {
return args.length > 1 && range.length > 1 ? `(${range})` : range;
@@ -14118,10 +15063,11 @@ const compile = (ast, options = {}) => {
}
if (node.nodes) {
- for (let child of node.nodes) {
+ for (const child of node.nodes) {
output += walk(child, node);
}
}
+
return output;
};
@@ -14133,14 +15079,14 @@ module.exports = compile;
/***/ }),
-/***/ 8774:
+/***/ 2477:
/***/ ((module) => {
"use strict";
module.exports = {
- MAX_LENGTH: 1024 * 64,
+ MAX_LENGTH: 10000,
// Digits
CHAR_0: '0', /* 0 */
@@ -14198,18 +15144,18 @@ module.exports = {
/***/ }),
-/***/ 5873:
+/***/ 5290:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const fill = __nccwpck_require__(6330);
-const stringify = __nccwpck_require__(8750);
-const utils = __nccwpck_require__(5207);
+const fill = __nccwpck_require__(877);
+const stringify = __nccwpck_require__(3317);
+const utils = __nccwpck_require__(2257);
const append = (queue = '', stash = '', enclose = false) => {
- let result = [];
+ const result = [];
queue = [].concat(queue);
stash = [].concat(stash);
@@ -14219,15 +15165,15 @@ const append = (queue = '', stash = '', enclose = false) => {
return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash;
}
- for (let item of queue) {
+ for (const item of queue) {
if (Array.isArray(item)) {
- for (let value of item) {
+ for (const value of item) {
result.push(append(value, stash, enclose));
}
} else {
for (let ele of stash) {
if (enclose === true && typeof ele === 'string') ele = `{${ele}}`;
- result.push(Array.isArray(ele) ? append(item, ele, enclose) : (item + ele));
+ result.push(Array.isArray(ele) ? append(item, ele, enclose) : item + ele);
}
}
}
@@ -14235,9 +15181,9 @@ const append = (queue = '', stash = '', enclose = false) => {
};
const expand = (ast, options = {}) => {
- let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit;
+ const rangeLimit = options.rangeLimit === undefined ? 1000 : options.rangeLimit;
- let walk = (node, parent = {}) => {
+ const walk = (node, parent = {}) => {
node.queue = [];
let p = parent;
@@ -14259,7 +15205,7 @@ const expand = (ast, options = {}) => {
}
if (node.nodes && node.ranges > 0) {
- let args = utils.reduce(node.nodes);
+ const args = utils.reduce(node.nodes);
if (utils.exceedsLimit(...args, options.step, rangeLimit)) {
throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');
@@ -14275,7 +15221,7 @@ const expand = (ast, options = {}) => {
return;
}
- let enclose = utils.encloseBrace(node);
+ const enclose = utils.encloseBrace(node);
let queue = node.queue;
let block = node;
@@ -14285,7 +15231,7 @@ const expand = (ast, options = {}) => {
}
for (let i = 0; i < node.nodes.length; i++) {
- let child = node.nodes[i];
+ const child = node.nodes[i];
if (child.type === 'comma' && node.type === 'brace') {
if (i === 1) queue.push('');
@@ -14319,13 +15265,13 @@ module.exports = expand;
/***/ }),
-/***/ 6477:
+/***/ 507:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const stringify = __nccwpck_require__(8750);
+const stringify = __nccwpck_require__(3317);
/**
* Constants
@@ -14347,7 +15293,7 @@ const {
CHAR_SINGLE_QUOTE, /* ' */
CHAR_NO_BREAK_SPACE,
CHAR_ZERO_WIDTH_NOBREAK_SPACE
-} = __nccwpck_require__(8774);
+} = __nccwpck_require__(2477);
/**
* parse
@@ -14358,22 +15304,21 @@ const parse = (input, options = {}) => {
throw new TypeError('Expected a string');
}
- let opts = options || {};
- let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;
+ const opts = options || {};
+ const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;
if (input.length > max) {
throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`);
}
- let ast = { type: 'root', input, nodes: [] };
- let stack = [ast];
+ const ast = { type: 'root', input, nodes: [] };
+ const stack = [ast];
let block = ast;
let prev = ast;
let brackets = 0;
- let length = input.length;
+ const length = input.length;
let index = 0;
let depth = 0;
let value;
- let memo = {};
/**
* Helpers
@@ -14436,7 +15381,6 @@ const parse = (input, options = {}) => {
if (value === CHAR_LEFT_SQUARE_BRACKET) {
brackets++;
- let closed = true;
let next;
while (index < length && (next = advance())) {
@@ -14492,7 +15436,7 @@ const parse = (input, options = {}) => {
*/
if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) {
- let open = value;
+ const open = value;
let next;
if (options.keepQuotes !== true) {
@@ -14524,8 +15468,8 @@ const parse = (input, options = {}) => {
if (value === CHAR_LEFT_CURLY_BRACE) {
depth++;
- let dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true;
- let brace = {
+ const dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true;
+ const brace = {
type: 'brace',
open: true,
close: false,
@@ -14552,7 +15496,7 @@ const parse = (input, options = {}) => {
continue;
}
- let type = 'close';
+ const type = 'close';
block = stack.pop();
block.close = true;
@@ -14570,7 +15514,7 @@ const parse = (input, options = {}) => {
if (value === CHAR_COMMA && depth > 0) {
if (block.ranges > 0) {
block.ranges = 0;
- let open = block.nodes.shift();
+ const open = block.nodes.shift();
block.nodes = [open, { type: 'text', value: stringify(block) }];
}
@@ -14584,7 +15528,7 @@ const parse = (input, options = {}) => {
*/
if (value === CHAR_DOT && depth > 0 && block.commas === 0) {
- let siblings = block.nodes;
+ const siblings = block.nodes;
if (depth === 0 || siblings.length === 0) {
push({ type: 'text', value });
@@ -14611,7 +15555,7 @@ const parse = (input, options = {}) => {
if (prev.type === 'range') {
siblings.pop();
- let before = siblings[siblings.length - 1];
+ const before = siblings[siblings.length - 1];
before.value += prev.value + value;
prev = before;
block.ranges--;
@@ -14644,8 +15588,8 @@ const parse = (input, options = {}) => {
});
// get the location of the block on parent.nodes (block's siblings)
- let parent = stack[stack.length - 1];
- let index = parent.nodes.indexOf(block);
+ const parent = stack[stack.length - 1];
+ const index = parent.nodes.indexOf(block);
// replace the (invalid) block with it's nodes
parent.nodes.splice(index, 1, ...block.nodes);
}
@@ -14660,18 +15604,18 @@ module.exports = parse;
/***/ }),
-/***/ 8750:
+/***/ 3317:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const utils = __nccwpck_require__(5207);
+const utils = __nccwpck_require__(2257);
module.exports = (ast, options = {}) => {
- let stringify = (node, parent = {}) => {
- let invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent);
- let invalidNode = node.invalid === true && options.escapeInvalid === true;
+ const stringify = (node, parent = {}) => {
+ const invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent);
+ const invalidNode = node.invalid === true && options.escapeInvalid === true;
let output = '';
if (node.value) {
@@ -14686,7 +15630,7 @@ module.exports = (ast, options = {}) => {
}
if (node.nodes) {
- for (let child of node.nodes) {
+ for (const child of node.nodes) {
output += stringify(child);
}
}
@@ -14700,7 +15644,7 @@ module.exports = (ast, options = {}) => {
/***/ }),
-/***/ 5207:
+/***/ 2257:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -14737,7 +15681,7 @@ exports.exceedsLimit = (min, max, step = 1, limit) => {
*/
exports.escapeNode = (block, n = 0, type) => {
- let node = block.nodes[n];
+ const node = block.nodes[n];
if (!node) return;
if ((type && node.type === type) || node.type === 'open' || node.type === 'close') {
@@ -14806,13 +15750,23 @@ exports.reduce = nodes => nodes.reduce((acc, node) => {
exports.flatten = (...args) => {
const result = [];
+
const flat = arr => {
for (let i = 0; i < arr.length; i++) {
- let ele = arr[i];
- Array.isArray(ele) ? flat(ele, result) : ele !== void 0 && result.push(ele);
+ const ele = arr[i];
+
+ if (Array.isArray(ele)) {
+ flat(ele);
+ continue;
+ }
+
+ if (ele !== undefined) {
+ result.push(ele);
+ }
}
return result;
};
+
flat(args);
return result;
};
@@ -14820,7 +15774,7 @@ exports.flatten = (...args) => {
/***/ }),
-/***/ 8367:
+/***/ 2417:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
@@ -14833,9 +15787,9 @@ const {
Resolver: AsyncResolver
},
lookup: dnsLookup
-} = __nccwpck_require__(9523);
-const {promisify} = __nccwpck_require__(3837);
-const os = __nccwpck_require__(2037);
+} = __nccwpck_require__(2250);
+const {promisify} = __nccwpck_require__(9023);
+const os = __nccwpck_require__(857);
const kCacheableLookupCreateConnection = Symbol('cacheableLookupCreateConnection');
const kCacheableLookupInstance = Symbol('cacheableLookupInstance');
@@ -15264,12 +16218,12 @@ module.exports["default"] = CacheableLookup;
/***/ }),
-/***/ 4340:
+/***/ 6176:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const {PassThrough: PassThroughStream} = __nccwpck_require__(2781);
+const {PassThrough: PassThroughStream} = __nccwpck_require__(2203);
module.exports = options => {
options = {...options};
@@ -15324,14 +16278,14 @@ module.exports = options => {
/***/ }),
-/***/ 7040:
+/***/ 4921:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const {constants: BufferConstants} = __nccwpck_require__(4300);
-const pump = __nccwpck_require__(8341);
-const bufferStream = __nccwpck_require__(4340);
+const {constants: BufferConstants} = __nccwpck_require__(181);
+const pump = __nccwpck_require__(7898);
+const bufferStream = __nccwpck_require__(6176);
class MaxBufferError extends Error {
constructor() {
@@ -15392,21 +16346,21 @@ module.exports.MaxBufferError = MaxBufferError;
/***/ }),
-/***/ 8116:
+/***/ 1487:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const EventEmitter = __nccwpck_require__(2361);
-const urlLib = __nccwpck_require__(7310);
-const normalizeUrl = __nccwpck_require__(7952);
-const getStream = __nccwpck_require__(7040);
-const CachePolicy = __nccwpck_require__(1002);
-const Response = __nccwpck_require__(9004);
-const lowercaseKeys = __nccwpck_require__(9662);
-const cloneResponse = __nccwpck_require__(1312);
-const Keyv = __nccwpck_require__(1531);
+const EventEmitter = __nccwpck_require__(4434);
+const urlLib = __nccwpck_require__(7016);
+const normalizeUrl = __nccwpck_require__(7827);
+const getStream = __nccwpck_require__(4921);
+const CachePolicy = __nccwpck_require__(4584);
+const Response = __nccwpck_require__(4145);
+const lowercaseKeys = __nccwpck_require__(1364);
+const cloneResponse = __nccwpck_require__(6358);
+const Keyv = __nccwpck_require__(6018);
class CacheableRequest {
constructor(request, cacheAdapter) {
@@ -15651,14 +16605,14 @@ module.exports = CacheableRequest;
/***/ }),
-/***/ 1312:
+/***/ 6358:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const PassThrough = (__nccwpck_require__(2781).PassThrough);
-const mimicResponse = __nccwpck_require__(2610);
+const PassThrough = (__nccwpck_require__(2203).PassThrough);
+const mimicResponse = __nccwpck_require__(9991);
const cloneResponse = response => {
if (!(response && response.pipe)) {
@@ -15676,14 +16630,14 @@ module.exports = cloneResponse;
/***/ }),
-/***/ 2391:
+/***/ 1373:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const {Transform, PassThrough} = __nccwpck_require__(2781);
-const zlib = __nccwpck_require__(9796);
-const mimicResponse = __nccwpck_require__(3877);
+const {Transform, PassThrough} = __nccwpck_require__(2203);
+const zlib = __nccwpck_require__(3106);
+const mimicResponse = __nccwpck_require__(9382);
module.exports = response => {
const contentEncoding = (response.headers['content-encoding'] || '').toLowerCase();
@@ -15742,7 +16696,7 @@ module.exports = response => {
/***/ }),
-/***/ 3877:
+/***/ 9382:
/***/ ((module) => {
"use strict";
@@ -15827,7 +16781,7 @@ module.exports = (fromStream, toStream) => {
/***/ }),
-/***/ 6214:
+/***/ 2114:
/***/ ((module, exports) => {
"use strict";
@@ -15882,7 +16836,7 @@ module.exports["default"] = deferToConnect;
/***/ }),
-/***/ 8932:
+/***/ 4150:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -15910,10 +16864,10 @@ exports.Deprecation = Deprecation;
/***/ }),
-/***/ 1205:
+/***/ 1424:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-var once = __nccwpck_require__(1223);
+var once = __nccwpck_require__(5560);
var noop = function() {};
@@ -16011,15 +16965,15 @@ module.exports = eos;
/***/ }),
-/***/ 4460:
+/***/ 8188:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-var isGlob = __nccwpck_require__(4466);
-var pathPosixDirname = (__nccwpck_require__(1017).posix.dirname);
-var isWin32 = (__nccwpck_require__(2037).platform)() === 'win32';
+var isGlob = __nccwpck_require__(1925);
+var pathPosixDirname = (__nccwpck_require__(6928).posix).dirname;
+var isWin32 = (__nccwpck_require__(857).platform)() === 'win32';
var slash = '/';
var backslash = /\\/g;
@@ -16061,17 +17015,17 @@ module.exports = function globParent(str, opts) {
/***/ }),
-/***/ 3664:
+/***/ 5648:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const taskManager = __nccwpck_require__(2708);
-const async_1 = __nccwpck_require__(5679);
-const stream_1 = __nccwpck_require__(4630);
-const sync_1 = __nccwpck_require__(2405);
-const settings_1 = __nccwpck_require__(952);
-const utils = __nccwpck_require__(8223);
+const taskManager = __nccwpck_require__(6599);
+const async_1 = __nccwpck_require__(645);
+const stream_1 = __nccwpck_require__(1969);
+const sync_1 = __nccwpck_require__(5894);
+const settings_1 = __nccwpck_require__(879);
+const utils = __nccwpck_require__(6002);
async function FastGlob(source, options) {
assertPatternsInput(source);
const works = getWorks(source, async_1.default, options);
@@ -16171,14 +17125,14 @@ module.exports = FastGlob;
/***/ }),
-/***/ 2708:
+/***/ 6599:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0;
-const utils = __nccwpck_require__(8223);
+const utils = __nccwpck_require__(6002);
function generate(input, settings) {
const patterns = processPatterns(input, settings);
const ignore = processPatterns(settings.ignore, settings);
@@ -16289,14 +17243,14 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask;
/***/ }),
-/***/ 5679:
+/***/ 645:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const async_1 = __nccwpck_require__(7747);
-const provider_1 = __nccwpck_require__(257);
+const async_1 = __nccwpck_require__(2907);
+const provider_1 = __nccwpck_require__(7792);
class ProviderAsync extends provider_1.default {
constructor() {
super(...arguments);
@@ -16320,14 +17274,14 @@ exports["default"] = ProviderAsync;
/***/ }),
-/***/ 6983:
+/***/ 3591:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const utils = __nccwpck_require__(8223);
-const partial_1 = __nccwpck_require__(5295);
+const utils = __nccwpck_require__(6002);
+const partial_1 = __nccwpck_require__(5740);
class DeepFilter {
constructor(_settings, _micromatchOptions) {
this._settings = _settings;
@@ -16390,13 +17344,13 @@ exports["default"] = DeepFilter;
/***/ }),
-/***/ 1343:
+/***/ 4285:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const utils = __nccwpck_require__(8223);
+const utils = __nccwpck_require__(6002);
class EntryFilter {
constructor(_settings, _micromatchOptions) {
this._settings = _settings;
@@ -16404,11 +17358,19 @@ class EntryFilter {
this.index = new Map();
}
getFilter(positive, negative) {
- const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions);
- const negativeRe = utils.pattern.convertPatternsToRe(negative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true }));
- return (entry) => this._filter(entry, positiveRe, negativeRe);
+ const [absoluteNegative, relativeNegative] = utils.pattern.partitionAbsoluteAndRelative(negative);
+ const patterns = {
+ positive: {
+ all: utils.pattern.convertPatternsToRe(positive, this._micromatchOptions)
+ },
+ negative: {
+ absolute: utils.pattern.convertPatternsToRe(absoluteNegative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true })),
+ relative: utils.pattern.convertPatternsToRe(relativeNegative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true }))
+ }
+ };
+ return (entry) => this._filter(entry, patterns);
}
- _filter(entry, positiveRe, negativeRe) {
+ _filter(entry, patterns) {
const filepath = utils.path.removeLeadingDotSegment(entry.path);
if (this._settings.unique && this._isDuplicateEntry(filepath)) {
return false;
@@ -16416,11 +17378,7 @@ class EntryFilter {
if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) {
return false;
}
- if (this._isSkippedByAbsoluteNegativePatterns(filepath, negativeRe)) {
- return false;
- }
- const isDirectory = entry.dirent.isDirectory();
- const isMatched = this._isMatchToPatterns(filepath, positiveRe, isDirectory) && !this._isMatchToPatterns(filepath, negativeRe, isDirectory);
+ const isMatched = this._isMatchToPatternsSet(filepath, patterns, entry.dirent.isDirectory());
if (this._settings.unique && isMatched) {
this._createIndexRecord(filepath);
}
@@ -16438,14 +17396,32 @@ class EntryFilter {
_onlyDirectoryFilter(entry) {
return this._settings.onlyDirectories && !entry.dirent.isDirectory();
}
- _isSkippedByAbsoluteNegativePatterns(entryPath, patternsRe) {
- if (!this._settings.absolute) {
+ _isMatchToPatternsSet(filepath, patterns, isDirectory) {
+ const isMatched = this._isMatchToPatterns(filepath, patterns.positive.all, isDirectory);
+ if (!isMatched) {
return false;
}
- const fullpath = utils.path.makeAbsolute(this._settings.cwd, entryPath);
- return utils.pattern.matchAny(fullpath, patternsRe);
+ const isMatchedByRelativeNegative = this._isMatchToPatterns(filepath, patterns.negative.relative, isDirectory);
+ if (isMatchedByRelativeNegative) {
+ return false;
+ }
+ const isMatchedByAbsoluteNegative = this._isMatchToAbsoluteNegative(filepath, patterns.negative.absolute, isDirectory);
+ if (isMatchedByAbsoluteNegative) {
+ return false;
+ }
+ return true;
+ }
+ _isMatchToAbsoluteNegative(filepath, patternsRe, isDirectory) {
+ if (patternsRe.length === 0) {
+ return false;
+ }
+ const fullpath = utils.path.makeAbsolute(this._settings.cwd, filepath);
+ return this._isMatchToPatterns(fullpath, patternsRe, isDirectory);
}
_isMatchToPatterns(filepath, patternsRe, isDirectory) {
+ if (patternsRe.length === 0) {
+ return false;
+ }
// Trying to match files and directories by patterns.
const isMatched = utils.pattern.matchAny(filepath, patternsRe);
// A pattern with a trailling slash can be used for directory matching.
@@ -16461,13 +17437,13 @@ exports["default"] = EntryFilter;
/***/ }),
-/***/ 6654:
+/***/ 1587:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const utils = __nccwpck_require__(8223);
+const utils = __nccwpck_require__(6002);
class ErrorFilter {
constructor(_settings) {
this._settings = _settings;
@@ -16484,13 +17460,13 @@ exports["default"] = ErrorFilter;
/***/ }),
-/***/ 2576:
+/***/ 208:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const utils = __nccwpck_require__(8223);
+const utils = __nccwpck_require__(6002);
class Matcher {
constructor(_patterns, _settings, _micromatchOptions) {
this._patterns = _patterns;
@@ -16537,13 +17513,13 @@ exports["default"] = Matcher;
/***/ }),
-/***/ 5295:
+/***/ 5740:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const matcher_1 = __nccwpck_require__(2576);
+const matcher_1 = __nccwpck_require__(208);
class PartialMatcher extends matcher_1.default {
match(filepath) {
const parts = filepath.split('/');
@@ -16583,17 +17559,17 @@ exports["default"] = PartialMatcher;
/***/ }),
-/***/ 257:
+/***/ 7792:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const path = __nccwpck_require__(1017);
-const deep_1 = __nccwpck_require__(6983);
-const entry_1 = __nccwpck_require__(1343);
-const error_1 = __nccwpck_require__(6654);
-const entry_2 = __nccwpck_require__(4029);
+const path = __nccwpck_require__(6928);
+const deep_1 = __nccwpck_require__(3591);
+const entry_1 = __nccwpck_require__(4285);
+const error_1 = __nccwpck_require__(1587);
+const entry_2 = __nccwpck_require__(7094);
class Provider {
constructor(_settings) {
this._settings = _settings;
@@ -16639,15 +17615,15 @@ exports["default"] = Provider;
/***/ }),
-/***/ 4630:
+/***/ 1969:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const stream_1 = __nccwpck_require__(2781);
-const stream_2 = __nccwpck_require__(2083);
-const provider_1 = __nccwpck_require__(257);
+const stream_1 = __nccwpck_require__(2203);
+const stream_2 = __nccwpck_require__(87);
+const provider_1 = __nccwpck_require__(7792);
class ProviderStream extends provider_1.default {
constructor() {
super(...arguments);
@@ -16678,14 +17654,14 @@ exports["default"] = ProviderStream;
/***/ }),
-/***/ 2405:
+/***/ 5894:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const sync_1 = __nccwpck_require__(8821);
-const provider_1 = __nccwpck_require__(257);
+const sync_1 = __nccwpck_require__(264);
+const provider_1 = __nccwpck_require__(7792);
class ProviderSync extends provider_1.default {
constructor() {
super(...arguments);
@@ -16709,13 +17685,13 @@ exports["default"] = ProviderSync;
/***/ }),
-/***/ 4029:
+/***/ 7094:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const utils = __nccwpck_require__(8223);
+const utils = __nccwpck_require__(6002);
class EntryTransformer {
constructor(_settings) {
this._settings = _settings;
@@ -16743,15 +17719,15 @@ exports["default"] = EntryTransformer;
/***/ }),
-/***/ 7747:
+/***/ 2907:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const fsWalk = __nccwpck_require__(6026);
-const reader_1 = __nccwpck_require__(5582);
-const stream_1 = __nccwpck_require__(2083);
+const fsWalk = __nccwpck_require__(9337);
+const reader_1 = __nccwpck_require__(1824);
+const stream_1 = __nccwpck_require__(87);
class ReaderAsync extends reader_1.default {
constructor() {
super(...arguments);
@@ -16786,15 +17762,15 @@ exports["default"] = ReaderAsync;
/***/ }),
-/***/ 5582:
+/***/ 1824:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const path = __nccwpck_require__(1017);
-const fsStat = __nccwpck_require__(109);
-const utils = __nccwpck_require__(8223);
+const path = __nccwpck_require__(6928);
+const fsStat = __nccwpck_require__(1470);
+const utils = __nccwpck_require__(6002);
class Reader {
constructor(_settings) {
this._settings = _settings;
@@ -16827,16 +17803,16 @@ exports["default"] = Reader;
/***/ }),
-/***/ 2083:
+/***/ 87:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const stream_1 = __nccwpck_require__(2781);
-const fsStat = __nccwpck_require__(109);
-const fsWalk = __nccwpck_require__(6026);
-const reader_1 = __nccwpck_require__(5582);
+const stream_1 = __nccwpck_require__(2203);
+const fsStat = __nccwpck_require__(1470);
+const fsWalk = __nccwpck_require__(9337);
+const reader_1 = __nccwpck_require__(1824);
class ReaderStream extends reader_1.default {
constructor() {
super(...arguments);
@@ -16890,15 +17866,15 @@ exports["default"] = ReaderStream;
/***/ }),
-/***/ 8821:
+/***/ 264:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const fsStat = __nccwpck_require__(109);
-const fsWalk = __nccwpck_require__(6026);
-const reader_1 = __nccwpck_require__(5582);
+const fsStat = __nccwpck_require__(1470);
+const fsWalk = __nccwpck_require__(9337);
+const reader_1 = __nccwpck_require__(1824);
class ReaderSync extends reader_1.default {
constructor() {
super(...arguments);
@@ -16941,15 +17917,15 @@ exports["default"] = ReaderSync;
/***/ }),
-/***/ 952:
+/***/ 879:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0;
-const fs = __nccwpck_require__(7147);
-const os = __nccwpck_require__(2037);
+const fs = __nccwpck_require__(9896);
+const os = __nccwpck_require__(857);
/**
* 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
@@ -17008,7 +17984,7 @@ exports["default"] = Settings;
/***/ }),
-/***/ 5325:
+/***/ 5711:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -17038,7 +18014,7 @@ exports.splitWhen = splitWhen;
/***/ }),
-/***/ 1230:
+/***/ 9718:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -17053,7 +18029,7 @@ exports.isEnoentCodeError = isEnoentCodeError;
/***/ }),
-/***/ 7543:
+/***/ 6979:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -17080,40 +18056,40 @@ exports.createDirentFromStats = createDirentFromStats;
/***/ }),
-/***/ 8223:
+/***/ 6002:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.string = exports.stream = exports.pattern = exports.path = exports.fs = exports.errno = exports.array = void 0;
-const array = __nccwpck_require__(5325);
+const array = __nccwpck_require__(5711);
exports.array = array;
-const errno = __nccwpck_require__(1230);
+const errno = __nccwpck_require__(9718);
exports.errno = errno;
-const fs = __nccwpck_require__(7543);
+const fs = __nccwpck_require__(6979);
exports.fs = fs;
-const path = __nccwpck_require__(3873);
+const path = __nccwpck_require__(9283);
exports.path = path;
-const pattern = __nccwpck_require__(1221);
+const pattern = __nccwpck_require__(1304);
exports.pattern = pattern;
-const stream = __nccwpck_require__(8382);
+const stream = __nccwpck_require__(536);
exports.stream = stream;
-const string = __nccwpck_require__(2203);
+const string = __nccwpck_require__(7641);
exports.string = string;
/***/ }),
-/***/ 3873:
+/***/ 9283:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.convertPosixPathToPattern = exports.convertWindowsPathToPattern = exports.convertPathToPattern = exports.escapePosixPath = exports.escapeWindowsPath = exports.escape = exports.removeLeadingDotSegment = exports.makeAbsolute = exports.unixify = void 0;
-const os = __nccwpck_require__(2037);
-const path = __nccwpck_require__(1017);
+const os = __nccwpck_require__(857);
+const path = __nccwpck_require__(6928);
const IS_WINDOWS_PLATFORM = os.platform() === 'win32';
const LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\
/**
@@ -17181,16 +18157,16 @@ exports.convertPosixPathToPattern = convertPosixPathToPattern;
/***/ }),
-/***/ 1221:
+/***/ 1304:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.removeDuplicateSlashes = exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0;
-const path = __nccwpck_require__(1017);
-const globParent = __nccwpck_require__(4460);
-const micromatch = __nccwpck_require__(6228);
+exports.isAbsolute = exports.partitionAbsoluteAndRelative = exports.removeDuplicateSlashes = exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0;
+const path = __nccwpck_require__(6928);
+const globParent = __nccwpck_require__(8188);
+const micromatch = __nccwpck_require__(8785);
const GLOBSTAR = '**';
const ESCAPE_SYMBOL = '\\';
const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/;
@@ -17373,18 +18349,36 @@ function removeDuplicateSlashes(pattern) {
return pattern.replace(DOUBLE_SLASH_RE, '/');
}
exports.removeDuplicateSlashes = removeDuplicateSlashes;
+function partitionAbsoluteAndRelative(patterns) {
+ const absolute = [];
+ const relative = [];
+ for (const pattern of patterns) {
+ if (isAbsolute(pattern)) {
+ absolute.push(pattern);
+ }
+ else {
+ relative.push(pattern);
+ }
+ }
+ return [absolute, relative];
+}
+exports.partitionAbsoluteAndRelative = partitionAbsoluteAndRelative;
+function isAbsolute(pattern) {
+ return path.isAbsolute(pattern);
+}
+exports.isAbsolute = isAbsolute;
/***/ }),
-/***/ 8382:
+/***/ 536:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.merge = void 0;
-const merge2 = __nccwpck_require__(2578);
+const merge2 = __nccwpck_require__(754);
function merge(streams) {
const mergedStream = merge2(streams);
streams.forEach((stream) => {
@@ -17402,7 +18396,7 @@ function propagateCloseEventToSources(streams) {
/***/ }),
-/***/ 2203:
+/***/ 7641:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -17421,7 +18415,7 @@ exports.isEmpty = isEmpty;
/***/ }),
-/***/ 7340:
+/***/ 8230:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
@@ -17429,7 +18423,7 @@ exports.isEmpty = isEmpty;
/* eslint-disable no-var */
-var reusify = __nccwpck_require__(2113)
+var reusify = __nccwpck_require__(844)
function fastqueue (context, worker, concurrency) {
if (typeof context === 'function') {
@@ -17718,7 +18712,7 @@ module.exports.promise = queueAsPromised
/***/ }),
-/***/ 6330:
+/***/ 877:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
@@ -17731,8 +18725,8 @@ module.exports.promise = queueAsPromised
-const util = __nccwpck_require__(3837);
-const toRegexRange = __nccwpck_require__(1861);
+const util = __nccwpck_require__(9023);
+const toRegexRange = __nccwpck_require__(7551);
const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
@@ -17784,7 +18778,7 @@ const toMaxLen = (input, maxLength) => {
return negative ? ('-' + input) : input;
};
-const toSequence = (parts, options) => {
+const toSequence = (parts, options, maxLen) => {
parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
@@ -17794,11 +18788,11 @@ const toSequence = (parts, options) => {
let result;
if (parts.positives.length) {
- positives = parts.positives.join('|');
+ positives = parts.positives.map(v => toMaxLen(String(v), maxLen)).join('|');
}
if (parts.negatives.length) {
- negatives = `-(${prefix}${parts.negatives.join('|')})`;
+ negatives = `-(${prefix}${parts.negatives.map(v => toMaxLen(String(v), maxLen)).join('|')})`;
}
if (positives && negatives) {
@@ -17896,7 +18890,7 @@ const fillNumbers = (start, end, step = 1, options = {}) => {
if (options.toRegex === true) {
return step > 1
- ? toSequence(parts, options)
+ ? toSequence(parts, options, maxLen)
: toRegex(range, null, { wrap: false, ...options });
}
@@ -17908,7 +18902,6 @@ const fillLetters = (start, end, step = 1, options = {}) => {
return invalidRange(start, end, options);
}
-
let format = options.transform || (val => String.fromCharCode(val));
let a = `${start}`.charCodeAt(0);
let b = `${end}`.charCodeAt(0);
@@ -17975,13 +18968,13 @@ module.exports = fill;
/***/ }),
-/***/ 6457:
+/***/ 7814:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const types_1 = __nccwpck_require__(4597);
+const types_1 = __nccwpck_require__(4707);
function createRejection(error, ...beforeErrorGroups) {
const promise = (async () => {
if (error instanceof types_1.RequestError) {
@@ -18013,7 +19006,7 @@ exports["default"] = createRejection;
/***/ }),
-/***/ 6056:
+/***/ 2126:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -18029,15 +19022,15 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const events_1 = __nccwpck_require__(2361);
-const is_1 = __nccwpck_require__(7678);
-const PCancelable = __nccwpck_require__(9072);
-const types_1 = __nccwpck_require__(4597);
-const parse_body_1 = __nccwpck_require__(8220);
-const core_1 = __nccwpck_require__(94);
-const proxy_events_1 = __nccwpck_require__(3021);
-const get_buffer_1 = __nccwpck_require__(4500);
-const is_response_ok_1 = __nccwpck_require__(9298);
+const events_1 = __nccwpck_require__(4434);
+const is_1 = __nccwpck_require__(4001);
+const PCancelable = __nccwpck_require__(4533);
+const types_1 = __nccwpck_require__(4707);
+const parse_body_1 = __nccwpck_require__(5494);
+const core_1 = __nccwpck_require__(6825);
+const proxy_events_1 = __nccwpck_require__(7813);
+const get_buffer_1 = __nccwpck_require__(4858);
+const is_response_ok_1 = __nccwpck_require__(4350);
const proxiedRequestEvents = [
'request',
'response',
@@ -18192,18 +19185,18 @@ function asPromise(normalizedOptions) {
return promise;
}
exports["default"] = asPromise;
-__exportStar(__nccwpck_require__(4597), exports);
+__exportStar(__nccwpck_require__(4707), exports);
/***/ }),
-/***/ 1048:
+/***/ 6364:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const is_1 = __nccwpck_require__(7678);
+const is_1 = __nccwpck_require__(4001);
const normalizeArguments = (options, defaults) => {
if (is_1.default.null_(options.encoding)) {
throw new TypeError('To get a Buffer, set `options.responseType` to `buffer` instead');
@@ -18283,13 +19276,13 @@ exports["default"] = normalizeArguments;
/***/ }),
-/***/ 8220:
+/***/ 5494:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const types_1 = __nccwpck_require__(4597);
+const types_1 = __nccwpck_require__(4707);
const parseBody = (response, responseType, parseJson, encoding) => {
const { rawBody } = response;
try {
@@ -18316,7 +19309,7 @@ exports["default"] = parseBody;
/***/ }),
-/***/ 4597:
+/***/ 4707:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -18333,7 +19326,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.CancelError = exports.ParseError = void 0;
-const core_1 = __nccwpck_require__(94);
+const core_1 = __nccwpck_require__(6825);
/**
An error to be thrown when server response code is 2xx, and parsing body fails.
Includes a `response` property.
@@ -18361,12 +19354,12 @@ class CancelError extends core_1.RequestError {
}
}
exports.CancelError = CancelError;
-__exportStar(__nccwpck_require__(94), exports);
+__exportStar(__nccwpck_require__(6825), exports);
/***/ }),
-/***/ 3462:
+/***/ 3024:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -18403,41 +19396,41 @@ exports["default"] = calculateRetryDelay;
/***/ }),
-/***/ 94:
+/***/ 6825:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.UnsupportedProtocolError = exports.ReadError = exports.TimeoutError = exports.UploadError = exports.CacheError = exports.HTTPError = exports.MaxRedirectsError = exports.RequestError = exports.setNonEnumerableProperties = exports.knownHookEvents = exports.withoutBody = exports.kIsNormalizedAlready = void 0;
-const util_1 = __nccwpck_require__(3837);
-const stream_1 = __nccwpck_require__(2781);
-const fs_1 = __nccwpck_require__(7147);
-const url_1 = __nccwpck_require__(7310);
-const http = __nccwpck_require__(3685);
-const http_1 = __nccwpck_require__(3685);
-const https = __nccwpck_require__(5687);
-const http_timer_1 = __nccwpck_require__(8097);
-const cacheable_lookup_1 = __nccwpck_require__(8367);
-const CacheableRequest = __nccwpck_require__(8116);
-const decompressResponse = __nccwpck_require__(2391);
+const util_1 = __nccwpck_require__(9023);
+const stream_1 = __nccwpck_require__(2203);
+const fs_1 = __nccwpck_require__(9896);
+const url_1 = __nccwpck_require__(7016);
+const http = __nccwpck_require__(8611);
+const http_1 = __nccwpck_require__(8611);
+const https = __nccwpck_require__(5692);
+const http_timer_1 = __nccwpck_require__(4480);
+const cacheable_lookup_1 = __nccwpck_require__(2417);
+const CacheableRequest = __nccwpck_require__(1487);
+const decompressResponse = __nccwpck_require__(1373);
// @ts-expect-error Missing types
-const http2wrapper = __nccwpck_require__(4645);
-const lowercaseKeys = __nccwpck_require__(9662);
-const is_1 = __nccwpck_require__(7678);
-const get_body_size_1 = __nccwpck_require__(4564);
-const is_form_data_1 = __nccwpck_require__(40);
-const proxy_events_1 = __nccwpck_require__(3021);
-const timed_out_1 = __nccwpck_require__(2454);
-const url_to_options_1 = __nccwpck_require__(8026);
-const options_to_url_1 = __nccwpck_require__(9219);
-const weakable_map_1 = __nccwpck_require__(7288);
-const get_buffer_1 = __nccwpck_require__(4500);
-const dns_ip_version_1 = __nccwpck_require__(4993);
-const is_response_ok_1 = __nccwpck_require__(9298);
-const deprecation_warning_1 = __nccwpck_require__(397);
-const normalize_arguments_1 = __nccwpck_require__(1048);
-const calculate_retry_delay_1 = __nccwpck_require__(3462);
+const http2wrapper = __nccwpck_require__(4956);
+const lowercaseKeys = __nccwpck_require__(1364);
+const is_1 = __nccwpck_require__(4001);
+const get_body_size_1 = __nccwpck_require__(9296);
+const is_form_data_1 = __nccwpck_require__(6751);
+const proxy_events_1 = __nccwpck_require__(7813);
+const timed_out_1 = __nccwpck_require__(4501);
+const url_to_options_1 = __nccwpck_require__(3873);
+const options_to_url_1 = __nccwpck_require__(5743);
+const weakable_map_1 = __nccwpck_require__(7791);
+const get_buffer_1 = __nccwpck_require__(4858);
+const dns_ip_version_1 = __nccwpck_require__(1037);
+const is_response_ok_1 = __nccwpck_require__(4350);
+const deprecation_warning_1 = __nccwpck_require__(9796);
+const normalize_arguments_1 = __nccwpck_require__(6364);
+const calculate_retry_delay_1 = __nccwpck_require__(3024);
let globalDnsCache;
const kRequest = Symbol('request');
const kResponse = Symbol('response');
@@ -19916,7 +20909,7 @@ exports["default"] = Request;
/***/ }),
-/***/ 4993:
+/***/ 1037:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -19941,16 +20934,16 @@ exports.dnsLookupIpVersionToFamily = (dnsLookupIpVersion) => {
/***/ }),
-/***/ 4564:
+/***/ 9296:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const fs_1 = __nccwpck_require__(7147);
-const util_1 = __nccwpck_require__(3837);
-const is_1 = __nccwpck_require__(7678);
-const is_form_data_1 = __nccwpck_require__(40);
+const fs_1 = __nccwpck_require__(9896);
+const util_1 = __nccwpck_require__(9023);
+const is_1 = __nccwpck_require__(4001);
+const is_form_data_1 = __nccwpck_require__(6751);
const statAsync = util_1.promisify(fs_1.stat);
exports["default"] = async (body, headers) => {
if (headers && 'content-length' in headers) {
@@ -19981,7 +20974,7 @@ exports["default"] = async (body, headers) => {
/***/ }),
-/***/ 4500:
+/***/ 4858:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -20005,19 +20998,19 @@ exports["default"] = getBuffer;
/***/ }),
-/***/ 40:
+/***/ 6751:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const is_1 = __nccwpck_require__(7678);
+const is_1 = __nccwpck_require__(4001);
exports["default"] = (body) => is_1.default.nodeStream(body) && is_1.default.function_(body.getBoundary);
/***/ }),
-/***/ 9298:
+/***/ 4350:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -20033,14 +21026,14 @@ exports.isResponseOk = (response) => {
/***/ }),
-/***/ 9219:
+/***/ 5743:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
/* istanbul ignore file: deprecated */
-const url_1 = __nccwpck_require__(7310);
+const url_1 = __nccwpck_require__(7016);
const keys = [
'protocol',
'host',
@@ -20094,7 +21087,7 @@ exports["default"] = (origin, options) => {
/***/ }),
-/***/ 3021:
+/***/ 7813:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -20119,15 +21112,15 @@ exports["default"] = default_1;
/***/ }),
-/***/ 2454:
+/***/ 4501:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.TimeoutError = void 0;
-const net = __nccwpck_require__(1808);
-const unhandle_1 = __nccwpck_require__(1593);
+const net = __nccwpck_require__(9278);
+const unhandle_1 = __nccwpck_require__(9246);
const reentry = Symbol('reentry');
const noop = () => { };
class TimeoutError extends Error {
@@ -20248,7 +21241,7 @@ exports["default"] = (request, delays, options) => {
/***/ }),
-/***/ 1593:
+/***/ 9246:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -20278,13 +21271,13 @@ exports["default"] = () => {
/***/ }),
-/***/ 8026:
+/***/ 3873:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const is_1 = __nccwpck_require__(7678);
+const is_1 = __nccwpck_require__(4001);
exports["default"] = (url) => {
// Cast to URL
url = url;
@@ -20310,7 +21303,7 @@ exports["default"] = (url) => {
/***/ }),
-/***/ 7288:
+/***/ 7791:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -20347,7 +21340,7 @@ exports["default"] = WeakableMap;
/***/ }),
-/***/ 4337:
+/***/ 9941:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -20364,11 +21357,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.defaultHandler = void 0;
-const is_1 = __nccwpck_require__(7678);
-const as_promise_1 = __nccwpck_require__(6056);
-const create_rejection_1 = __nccwpck_require__(6457);
-const core_1 = __nccwpck_require__(94);
-const deep_freeze_1 = __nccwpck_require__(285);
+const is_1 = __nccwpck_require__(4001);
+const as_promise_1 = __nccwpck_require__(2126);
+const create_rejection_1 = __nccwpck_require__(7814);
+const core_1 = __nccwpck_require__(6825);
+const deep_freeze_1 = __nccwpck_require__(2949);
const errors = {
RequestError: as_promise_1.RequestError,
CacheError: as_promise_1.CacheError,
@@ -20590,12 +21583,12 @@ const create = (defaults) => {
return got;
};
exports["default"] = create;
-__exportStar(__nccwpck_require__(2613), exports);
+__exportStar(__nccwpck_require__(9612), exports);
/***/ }),
-/***/ 3061:
+/***/ 6757:
/***/ (function(module, exports, __nccwpck_require__) {
"use strict";
@@ -20611,8 +21604,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const url_1 = __nccwpck_require__(7310);
-const create_1 = __nccwpck_require__(4337);
+const url_1 = __nccwpck_require__(7016);
+const create_1 = __nccwpck_require__(9941);
const defaults = {
options: {
method: 'GET',
@@ -20729,13 +21722,13 @@ exports["default"] = got;
module.exports = got;
module.exports["default"] = got;
module.exports.__esModule = true; // Workaround for TS issue: https://github.com/sindresorhus/got/pull/1267
-__exportStar(__nccwpck_require__(4337), exports);
-__exportStar(__nccwpck_require__(6056), exports);
+__exportStar(__nccwpck_require__(9941), exports);
+__exportStar(__nccwpck_require__(2126), exports);
/***/ }),
-/***/ 2613:
+/***/ 9612:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -20745,13 +21738,13 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
/***/ }),
-/***/ 285:
+/***/ 2949:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const is_1 = __nccwpck_require__(7678);
+const is_1 = __nccwpck_require__(4001);
function deepFreeze(object) {
for (const value of Object.values(object)) {
if (is_1.default.plainObject(value) || is_1.default.array(value)) {
@@ -20765,7 +21758,7 @@ exports["default"] = deepFreeze;
/***/ }),
-/***/ 397:
+/***/ 9796:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -20786,7 +21779,7 @@ exports["default"] = (message) => {
/***/ }),
-/***/ 1002:
+/***/ 4584:
/***/ ((module) => {
"use strict";
@@ -21468,15 +22461,15 @@ module.exports = class CachePolicy {
/***/ }),
-/***/ 9898:
+/***/ 685:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const EventEmitter = __nccwpck_require__(2361);
-const tls = __nccwpck_require__(4404);
-const http2 = __nccwpck_require__(5158);
-const QuickLRU = __nccwpck_require__(9273);
+const EventEmitter = __nccwpck_require__(4434);
+const tls = __nccwpck_require__(4756);
+const http2 = __nccwpck_require__(5675);
+const QuickLRU = __nccwpck_require__(5475);
const kCurrentStreamsCount = Symbol('currentStreamsCount');
const kRequest = Symbol('request');
@@ -22146,18 +23139,18 @@ module.exports = {
/***/ }),
-/***/ 7167:
+/***/ 9213:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const http = __nccwpck_require__(3685);
-const https = __nccwpck_require__(5687);
-const resolveALPN = __nccwpck_require__(6624);
-const QuickLRU = __nccwpck_require__(9273);
-const Http2ClientRequest = __nccwpck_require__(9632);
-const calculateServerName = __nccwpck_require__(1982);
-const urlToOptions = __nccwpck_require__(2686);
+const http = __nccwpck_require__(8611);
+const https = __nccwpck_require__(5692);
+const resolveALPN = __nccwpck_require__(8824);
+const QuickLRU = __nccwpck_require__(5475);
+const Http2ClientRequest = __nccwpck_require__(7605);
+const calculateServerName = __nccwpck_require__(2850);
+const urlToOptions = __nccwpck_require__(4734);
const cache = new QuickLRU({maxSize: 100});
const queue = new Map();
@@ -22303,18 +23296,18 @@ module.exports.protocolCache = cache;
/***/ }),
-/***/ 9632:
+/***/ 7605:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const http2 = __nccwpck_require__(5158);
-const {Writable} = __nccwpck_require__(2781);
-const {Agent, globalAgent} = __nccwpck_require__(9898);
-const IncomingMessage = __nccwpck_require__(2575);
-const urlToOptions = __nccwpck_require__(2686);
-const proxyEvents = __nccwpck_require__(1818);
-const isRequestPseudoHeader = __nccwpck_require__(1199);
+const http2 = __nccwpck_require__(5675);
+const {Writable} = __nccwpck_require__(2203);
+const {Agent, globalAgent} = __nccwpck_require__(685);
+const IncomingMessage = __nccwpck_require__(2156);
+const urlToOptions = __nccwpck_require__(4734);
+const proxyEvents = __nccwpck_require__(118);
+const isRequestPseudoHeader = __nccwpck_require__(6365);
const {
ERR_INVALID_ARG_TYPE,
ERR_INVALID_PROTOCOL,
@@ -22322,7 +23315,7 @@ const {
ERR_INVALID_HTTP_TOKEN,
ERR_HTTP_INVALID_HEADER_VALUE,
ERR_INVALID_CHAR
-} = __nccwpck_require__(7087);
+} = __nccwpck_require__(9731);
const {
HTTP2_HEADER_STATUS,
@@ -22756,12 +23749,12 @@ module.exports = ClientRequest;
/***/ }),
-/***/ 2575:
+/***/ 2156:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const {Readable} = __nccwpck_require__(2781);
+const {Readable} = __nccwpck_require__(2203);
class IncomingMessage extends Readable {
constructor(socket, highWaterMark) {
@@ -22822,16 +23815,16 @@ module.exports = IncomingMessage;
/***/ }),
-/***/ 4645:
+/***/ 4956:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const http2 = __nccwpck_require__(5158);
-const agent = __nccwpck_require__(9898);
-const ClientRequest = __nccwpck_require__(9632);
-const IncomingMessage = __nccwpck_require__(2575);
-const auto = __nccwpck_require__(7167);
+const http2 = __nccwpck_require__(5675);
+const agent = __nccwpck_require__(685);
+const ClientRequest = __nccwpck_require__(7605);
+const IncomingMessage = __nccwpck_require__(2156);
+const auto = __nccwpck_require__(9213);
const request = (url, options, callback) => {
return new ClientRequest(url, options, callback);
@@ -22858,12 +23851,12 @@ module.exports = {
/***/ }),
-/***/ 1982:
+/***/ 2850:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const net = __nccwpck_require__(1808);
+const net = __nccwpck_require__(9278);
/* istanbul ignore file: https://github.com/nodejs/node/blob/v13.0.1/lib/_http_agent.js */
module.exports = options => {
@@ -22893,7 +23886,7 @@ module.exports = options => {
/***/ }),
-/***/ 7087:
+/***/ 9731:
/***/ ((module) => {
"use strict";
@@ -22946,7 +23939,7 @@ makeError(TypeError, 'ERR_INVALID_CHAR', args => {
/***/ }),
-/***/ 1199:
+/***/ 6365:
/***/ ((module) => {
"use strict";
@@ -22967,7 +23960,7 @@ module.exports = header => {
/***/ }),
-/***/ 1818:
+/***/ 118:
/***/ ((module) => {
"use strict";
@@ -22982,7 +23975,7 @@ module.exports = (from, to, events) => {
/***/ }),
-/***/ 2686:
+/***/ 4734:
/***/ ((module) => {
"use strict";
@@ -23015,7 +24008,7 @@ module.exports = url => {
/***/ }),
-/***/ 6435:
+/***/ 5540:
/***/ ((module) => {
/*!
@@ -23042,7 +24035,7 @@ module.exports = function isExtglob(str) {
/***/ }),
-/***/ 4466:
+/***/ 1925:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
/*!
@@ -23052,7 +24045,7 @@ module.exports = function isExtglob(str) {
* Released under the MIT License.
*/
-var isExtglob = __nccwpck_require__(6435);
+var isExtglob = __nccwpck_require__(5540);
var chars = { '{': '}', '(': ')', '[': ']'};
var strictCheck = function(str) {
if (str[0] === '!') {
@@ -23199,7 +24192,7 @@ module.exports = function isGlob(str, options) {
/***/ }),
-/***/ 5680:
+/***/ 3102:
/***/ ((module) => {
"use strict";
@@ -23225,7 +24218,7 @@ module.exports = function(num) {
/***/ }),
-/***/ 2820:
+/***/ 5563:
/***/ ((__unused_webpack_module, exports) => {
//TODO: handle reviver/dehydrate function like normal
@@ -23290,14 +24283,14 @@ exports.parse = function (s) {
/***/ }),
-/***/ 1531:
+/***/ 6018:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const EventEmitter = __nccwpck_require__(2361);
-const JSONB = __nccwpck_require__(2820);
+const EventEmitter = __nccwpck_require__(4434);
+const JSONB = __nccwpck_require__(5563);
const loadStore = options => {
const adapters = {
@@ -23562,7 +24555,7 @@ module.exports = Keyv;
/***/ }),
-/***/ 9662:
+/***/ 1364:
/***/ ((module) => {
"use strict";
@@ -23580,7 +24573,7 @@ module.exports = object => {
/***/ }),
-/***/ 2578:
+/***/ 754:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
@@ -23592,7 +24585,7 @@ module.exports = object => {
* Copyright (c) 2014-2020 Teambition
* Licensed under the MIT license.
*/
-const Stream = __nccwpck_require__(2781)
+const Stream = __nccwpck_require__(2203)
const PassThrough = Stream.PassThrough
const slice = Array.prototype.slice
@@ -23732,17 +24725,22 @@ function pauseStreams (streams, options) {
/***/ }),
-/***/ 6228:
+/***/ 8785:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const util = __nccwpck_require__(3837);
-const braces = __nccwpck_require__(610);
-const picomatch = __nccwpck_require__(2864);
-const utils = __nccwpck_require__(7426);
-const isEmptyString = val => val === '' || val === './';
+const util = __nccwpck_require__(9023);
+const braces = __nccwpck_require__(748);
+const picomatch = __nccwpck_require__(6377);
+const utils = __nccwpck_require__(8604);
+
+const isEmptyString = v => v === '' || v === './';
+const hasBraces = v => {
+ const index = v.indexOf('{');
+ return index > -1 && v.indexOf('}', index) > -1;
+};
/**
* Returns an array of strings that match one or more glob patterns.
@@ -24183,7 +25181,7 @@ micromatch.parse = (patterns, options) => {
micromatch.braces = (pattern, options) => {
if (typeof pattern !== 'string') throw new TypeError('Expected a string');
- if ((options && options.nobrace === true) || !/\{.*\}/.test(pattern)) {
+ if ((options && options.nobrace === true) || !hasBraces(pattern)) {
return [pattern];
}
return braces(pattern, options);
@@ -24202,29 +25200,31 @@ micromatch.braceExpand = (pattern, options) => {
* Expose micromatch
*/
+// exposed for tests
+micromatch.hasBraces = hasBraces;
module.exports = micromatch;
/***/ }),
-/***/ 2864:
+/***/ 6377:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-module.exports = __nccwpck_require__(555);
+module.exports = __nccwpck_require__(9639);
/***/ }),
-/***/ 6476:
+/***/ 9560:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const path = __nccwpck_require__(1017);
+const path = __nccwpck_require__(6928);
const WIN_SLASH = '\\\\/';
const WIN_NO_SLASH = `[^${WIN_SLASH}]`;
@@ -24405,14 +25405,14 @@ module.exports = {
/***/ }),
-/***/ 5961:
+/***/ 7430:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const constants = __nccwpck_require__(6476);
-const utils = __nccwpck_require__(7426);
+const constants = __nccwpck_require__(9560);
+const utils = __nccwpck_require__(8604);
/**
* Constants
@@ -25504,17 +26504,17 @@ module.exports = parse;
/***/ }),
-/***/ 555:
+/***/ 9639:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const path = __nccwpck_require__(1017);
-const scan = __nccwpck_require__(7751);
-const parse = __nccwpck_require__(5961);
-const utils = __nccwpck_require__(7426);
-const constants = __nccwpck_require__(6476);
+const path = __nccwpck_require__(6928);
+const scan = __nccwpck_require__(6028);
+const parse = __nccwpck_require__(7430);
+const utils = __nccwpck_require__(8604);
+const constants = __nccwpck_require__(9560);
const isObject = val => val && typeof val === 'object' && !Array.isArray(val);
/**
@@ -25854,13 +26854,13 @@ module.exports = picomatch;
/***/ }),
-/***/ 7751:
+/***/ 6028:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const utils = __nccwpck_require__(7426);
+const utils = __nccwpck_require__(8604);
const {
CHAR_ASTERISK, /* * */
CHAR_AT, /* @ */
@@ -25877,7 +26877,7 @@ const {
CHAR_RIGHT_CURLY_BRACE, /* } */
CHAR_RIGHT_PARENTHESES, /* ) */
CHAR_RIGHT_SQUARE_BRACKET /* ] */
-} = __nccwpck_require__(6476);
+} = __nccwpck_require__(9560);
const isPathSeparator = code => {
return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
@@ -26253,20 +27253,20 @@ module.exports = scan;
/***/ }),
-/***/ 7426:
+/***/ 8604:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
-const path = __nccwpck_require__(1017);
+const path = __nccwpck_require__(6928);
const win32 = process.platform === 'win32';
const {
REGEX_BACKSLASH,
REGEX_REMOVE_BACKSLASH,
REGEX_SPECIAL_CHARS,
REGEX_SPECIAL_CHARS_GLOBAL
-} = __nccwpck_require__(6476);
+} = __nccwpck_require__(9560);
exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);
@@ -26325,7 +27325,7 @@ exports.wrapOutput = (input, state = {}, options = {}) => {
/***/ }),
-/***/ 2610:
+/***/ 9991:
/***/ ((module) => {
"use strict";
@@ -26365,7 +27365,7 @@ module.exports = (fromStream, toStream) => {
/***/ }),
-/***/ 7952:
+/***/ 7827:
/***/ ((module) => {
"use strict";
@@ -26589,10 +27589,10 @@ module.exports = normalizeUrl;
/***/ }),
-/***/ 1223:
+/***/ 5560:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-var wrappy = __nccwpck_require__(2940)
+var wrappy = __nccwpck_require__(8264)
module.exports = wrappy(once)
module.exports.strict = wrappy(onceStrict)
@@ -26638,7 +27638,7 @@ function onceStrict (fn) {
/***/ }),
-/***/ 9072:
+/***/ 4533:
/***/ ((module) => {
"use strict";
@@ -26757,14 +27757,14 @@ module.exports.CancelError = CancelError;
/***/ }),
-/***/ 8569:
+/***/ 4006:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const pico = __nccwpck_require__(3322);
-const utils = __nccwpck_require__(479);
+const pico = __nccwpck_require__(8016);
+const utils = __nccwpck_require__(4059);
function picomatch(glob, options, returnState = false) {
// default to os.platform()
@@ -26782,7 +27782,7 @@ module.exports = picomatch;
/***/ }),
-/***/ 6099:
+/***/ 5595:
/***/ ((module) => {
"use strict";
@@ -26887,6 +27887,7 @@ module.exports = {
// Replace globs with equivalent patterns to reduce parsing time.
REPLACEMENTS: {
+ __proto__: null,
'***': '*',
'**/**': '**',
'**/**/**': '**'
@@ -26969,14 +27970,14 @@ module.exports = {
/***/ }),
-/***/ 2139:
+/***/ 8265:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const constants = __nccwpck_require__(6099);
-const utils = __nccwpck_require__(479);
+const constants = __nccwpck_require__(5595);
+const utils = __nccwpck_require__(4059);
/**
* Constants
@@ -28062,16 +29063,16 @@ module.exports = parse;
/***/ }),
-/***/ 3322:
+/***/ 8016:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const scan = __nccwpck_require__(2429);
-const parse = __nccwpck_require__(2139);
-const utils = __nccwpck_require__(479);
-const constants = __nccwpck_require__(6099);
+const scan = __nccwpck_require__(1781);
+const parse = __nccwpck_require__(8265);
+const utils = __nccwpck_require__(4059);
+const constants = __nccwpck_require__(5595);
const isObject = val => val && typeof val === 'object' && !Array.isArray(val);
/**
@@ -28411,13 +29412,13 @@ module.exports = picomatch;
/***/ }),
-/***/ 2429:
+/***/ 1781:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const utils = __nccwpck_require__(479);
+const utils = __nccwpck_require__(4059);
const {
CHAR_ASTERISK, /* * */
CHAR_AT, /* @ */
@@ -28434,7 +29435,7 @@ const {
CHAR_RIGHT_CURLY_BRACE, /* } */
CHAR_RIGHT_PARENTHESES, /* ) */
CHAR_RIGHT_SQUARE_BRACKET /* ] */
-} = __nccwpck_require__(6099);
+} = __nccwpck_require__(5595);
const isPathSeparator = code => {
return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
@@ -28810,7 +29811,7 @@ module.exports = scan;
/***/ }),
-/***/ 479:
+/***/ 4059:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
@@ -28822,7 +29823,7 @@ const {
REGEX_REMOVE_BACKSLASH,
REGEX_SPECIAL_CHARS,
REGEX_SPECIAL_CHARS_GLOBAL
-} = __nccwpck_require__(6099);
+} = __nccwpck_require__(5595);
exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);
@@ -28890,12 +29891,12 @@ exports.basename = (path, { windows } = {}) => {
/***/ }),
-/***/ 8341:
+/***/ 7898:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-var once = __nccwpck_require__(1223)
-var eos = __nccwpck_require__(1205)
-var fs = __nccwpck_require__(7147) // we only need fs to get the ReadStream and WriteStream prototypes
+var once = __nccwpck_require__(5560)
+var eos = __nccwpck_require__(1424)
+var fs = __nccwpck_require__(9896) // we only need fs to get the ReadStream and WriteStream prototypes
var noop = function () {}
var ancient = /^v?\.0/.test(process.version)
@@ -28979,7 +29980,7 @@ module.exports = pump
/***/ }),
-/***/ 9795:
+/***/ 4351:
/***/ ((module) => {
/*! queue-microtask. MIT License. Feross Aboukhadijeh */
@@ -28995,7 +29996,7 @@ module.exports = typeof queueMicrotask === 'function'
/***/ }),
-/***/ 9273:
+/***/ 5475:
/***/ ((module) => {
"use strict";
@@ -29126,12 +30127,12 @@ module.exports = QuickLRU;
/***/ }),
-/***/ 6624:
+/***/ 8824:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const tls = __nccwpck_require__(4404);
+const tls = __nccwpck_require__(4756);
module.exports = (options = {}, connect = tls.connect) => new Promise((resolve, reject) => {
let timeout = false;
@@ -29177,14 +30178,14 @@ module.exports = (options = {}, connect = tls.connect) => new Promise((resolve,
/***/ }),
-/***/ 9004:
+/***/ 4145:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
-const Readable = (__nccwpck_require__(2781).Readable);
-const lowercaseKeys = __nccwpck_require__(9662);
+const Readable = (__nccwpck_require__(2203).Readable);
+const lowercaseKeys = __nccwpck_require__(1364);
class Response extends Readable {
constructor(statusCode, headers, body, url) {
@@ -29219,7 +30220,7 @@ module.exports = Response;
/***/ }),
-/***/ 2113:
+/***/ 844:
/***/ ((module) => {
"use strict";
@@ -29260,13 +30261,13 @@ module.exports = reusify
/***/ }),
-/***/ 5288:
+/***/ 2743:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
/*! run-parallel. MIT License. Feross Aboukhadijeh */
module.exports = runParallel
-const queueMicrotask = __nccwpck_require__(9795)
+const queueMicrotask = __nccwpck_require__(4351)
function runParallel (tasks, cb) {
let results, pending, keys
@@ -29318,11 +30319,14 @@ function runParallel (tasks, cb) {
/***/ }),
-/***/ 2043:
+/***/ 2560:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
-;(function (sax) { // wrapper for non-node envs
- sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
+;(function (sax) {
+ // wrapper for non-node envs
+ sax.parser = function (strict, opt) {
+ return new SAXParser(strict, opt)
+ }
sax.SAXParser = SAXParser
sax.SAXStream = SAXStream
sax.createStream = createStream
@@ -29339,9 +30343,18 @@ function runParallel (tasks, cb) {
sax.MAX_BUFFER_LENGTH = 64 * 1024
var buffers = [
- 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',
- 'procInstName', 'procInstBody', 'entity', 'attribName',
- 'attribValue', 'cdata', 'script'
+ 'comment',
+ 'sgmlDecl',
+ 'textNode',
+ 'tagName',
+ 'doctype',
+ 'procInstName',
+ 'procInstBody',
+ 'entity',
+ 'attribName',
+ 'attribValue',
+ 'cdata',
+ 'script',
]
sax.EVENTS = [
@@ -29362,10 +30375,10 @@ function runParallel (tasks, cb) {
'ready',
'script',
'opennamespace',
- 'closenamespace'
+ 'closenamespace',
]
- function SAXParser (strict, opt) {
+ function SAXParser(strict, opt) {
if (!(this instanceof SAXParser)) {
return new SAXParser(strict, opt)
}
@@ -29384,7 +30397,10 @@ function runParallel (tasks, cb) {
parser.noscript = !!(strict || parser.opt.noscript)
parser.state = S.BEGIN
parser.strictEntities = parser.opt.strictEntities
- parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
+ parser.ENTITIES =
+ parser.strictEntities ?
+ Object.create(sax.XML_ENTITIES)
+ : Object.create(sax.ENTITIES)
parser.attribList = []
// namespaces form a prototype chain.
@@ -29394,6 +30410,12 @@ function runParallel (tasks, cb) {
parser.ns = Object.create(rootNS)
}
+ // disallow unquoted attribute values if not otherwise configured
+ // and strict mode is true
+ if (parser.opt.unquotedAttributeValues === undefined) {
+ parser.opt.unquotedAttributeValues = !strict
+ }
+
// mostly just for error reporting
parser.trackPosition = parser.opt.position !== false
if (parser.trackPosition) {
@@ -29404,7 +30426,7 @@ function runParallel (tasks, cb) {
if (!Object.create) {
Object.create = function (o) {
- function F () {}
+ function F() {}
F.prototype = o
var newf = new F()
return newf
@@ -29419,7 +30441,7 @@ function runParallel (tasks, cb) {
}
}
- function checkBufferLength (parser) {
+ function checkBufferLength(parser) {
var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
var maxActual = 0
for (var i = 0, l = buffers.length; i < l; i++) {
@@ -29455,13 +30477,13 @@ function runParallel (tasks, cb) {
parser.bufferCheckPosition = m + parser.position
}
- function clearBuffers (parser) {
+ function clearBuffers(parser) {
for (var i = 0, l = buffers.length; i < l; i++) {
parser[buffers[i]] = ''
}
}
- function flushBuffers (parser) {
+ function flushBuffers(parser) {
closeText(parser)
if (parser.cdata !== '') {
emitNode(parser, 'oncdata', parser.cdata)
@@ -29474,29 +30496,39 @@ function runParallel (tasks, cb) {
}
SAXParser.prototype = {
- end: function () { end(this) },
+ end: function () {
+ end(this)
+ },
write: write,
- resume: function () { this.error = null; return this },
- close: function () { return this.write(null) },
- flush: function () { flushBuffers(this) }
+ resume: function () {
+ this.error = null
+ return this
+ },
+ close: function () {
+ return this.write(null)
+ },
+ flush: function () {
+ flushBuffers(this)
+ },
}
var Stream
try {
- Stream = (__nccwpck_require__(2781).Stream)
+ Stream = (__nccwpck_require__(2203).Stream)
} catch (ex) {
Stream = function () {}
}
+ if (!Stream) Stream = function () {}
var streamWraps = sax.EVENTS.filter(function (ev) {
return ev !== 'error' && ev !== 'end'
})
- function createStream (strict, opt) {
+ function createStream(strict, opt) {
return new SAXStream(strict, opt)
}
- function SAXStream (strict, opt) {
+ function SAXStream(strict, opt) {
if (!(this instanceof SAXStream)) {
return new SAXStream(strict, opt)
}
@@ -29537,23 +30569,25 @@ function runParallel (tasks, cb) {
me.on(ev, h)
},
enumerable: true,
- configurable: false
+ configurable: false,
})
})
}
SAXStream.prototype = Object.create(Stream.prototype, {
constructor: {
- value: SAXStream
- }
+ value: SAXStream,
+ },
})
SAXStream.prototype.write = function (data) {
- if (typeof Buffer === 'function' &&
+ if (
+ typeof Buffer === 'function' &&
typeof Buffer.isBuffer === 'function' &&
- Buffer.isBuffer(data)) {
+ Buffer.isBuffer(data)
+ ) {
if (!this._decoder) {
- var SD = (__nccwpck_require__(1576).StringDecoder)
+ var SD = (__nccwpck_require__(3193).StringDecoder)
this._decoder = new SD('utf8')
}
data = this._decoder.write(data)
@@ -29576,7 +30610,10 @@ function runParallel (tasks, cb) {
var me = this
if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {
me._parser['on' + ev] = function () {
- var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)
+ var args =
+ arguments.length === 1 ?
+ [arguments[0]]
+ : Array.apply(null, arguments)
args.splice(0, 0, ev)
me.emit.apply(me, args)
}
@@ -29599,30 +30636,34 @@ function runParallel (tasks, cb) {
// without a significant breaking change to either this parser, or the
// JavaScript language. Implementation of an emoji-capable xml parser
// is left as an exercise for the reader.
- var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
+ var nameStart =
+ /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
- var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/
+ var nameBody =
+ /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/
- var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
- var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/
+ var entityStart =
+ /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
+ var entityBody =
+ /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/
- function isWhitespace (c) {
+ function isWhitespace(c) {
return c === ' ' || c === '\n' || c === '\r' || c === '\t'
}
- function isQuote (c) {
- return c === '"' || c === '\''
+ function isQuote(c) {
+ return c === '"' || c === "'"
}
- function isAttribEnd (c) {
+ function isAttribEnd(c) {
return c === '>' || isWhitespace(c)
}
- function isMatch (regex, c) {
+ function isMatch(regex, c) {
return regex.test(c)
}
- function notMatch (regex, c) {
+ function notMatch(regex, c) {
return !isMatch(regex, c)
}
@@ -29663,271 +30704,271 @@ function runParallel (tasks, cb) {
CLOSE_TAG: S++, //
SCRIPT: S++, //