diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6dc576ee..57144fc0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,7 @@ jobs: - run: npm test - name: Upload test results + if: success() || failure() uses: actions/upload-artifact@v2 with: name: test-results diff --git a/CHANGELOG.md b/CHANGELOG.md index d9ca7f68..4591ba49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v1.4.0 +- [Add support for mocha-json](https://github.com/dorny/test-reporter/pull/90) +- [Use full URL to fix navigation from summary to suite details](https://github.com/dorny/test-reporter/pull/89) +- [New report rendering with code blocks instead of tables](https://github.com/dorny/test-reporter/pull/88) +- [Improve test error messages from flutter](https://github.com/dorny/test-reporter/pull/87) + ## v1.3.1 - [Fix: parsing of .NET duration string without milliseconds](https://github.com/dorny/test-reporter/pull/84) - [Fix: dart-json - remove group name from test case names](https://github.com/dorny/test-reporter/pull/85) diff --git a/README.md b/README.md index 848d05d2..92e2d982 100644 --- a/README.md +++ b/README.md @@ -9,15 +9,15 @@ This [Github Action](https://github.com/features/actions) displays test results ✔️ Provides final `conclusion` and counts of `passed`, `failed` and `skipped` tests as output parameters **How it looks:** -|![](assets/fluent-validation-report.png)|![](assets/provider-error-summary.png)|![](assets/provider-error-details.png)|![](assets/provider-groups.png)| +|![](assets/fluent-validation-report.png)|![](assets/provider-error-summary.png)|![](assets/provider-error-details.png)|![](assets/mocha-groups.png)| |:--:|:--:|:--:|:--:| **Supported languages / frameworks:** - .NET / [xUnit](https://xunit.net/) / [NUnit](https://nunit.org/) / [MSTest](https://github.com/Microsoft/testfx-docs) - Dart / [test](https://pub.dev/packages/test) - Flutter / [test](https://pub.dev/packages/test) -- JavaScript / [JEST](https://jestjs.io/) - Java / [JUnit](https://junit.org/) +- JavaScript / [JEST](https://jestjs.io/) / [Mocha](https://mochajs.org/) For more information see [Supported formats](#supported-formats) section. @@ -54,9 +54,9 @@ jobs: ## Recommended setup for public repositories Workflows triggered by pull requests from forked repositories are executed with read-only token and therefore can't create check runs. -To workaround this security restriction it's required to use two separate workflows: -1. `CI` runs in the context of PR head branch with read-only token. It executes the tests and uploads test results as build artifact -2. `Test Report` runs in the context of repository main branch with read/write token. It will download test results and create reports +To workaround this security restriction, it's required to use two separate workflows: +1. `CI` runs in the context of the PR head branch with the read-only token. It executes the tests and uploads test results as a build artifact +2. `Test Report` runs in the context of the repository main branch with read/write token. It will download test results and create reports **PR head branch:** *.github/workflows/ci.yml* ```yaml @@ -116,7 +116,7 @@ jobs: # Coma separated list of paths to test results # Supports wildcards via [fast-glob](https://github.com/mrmlnc/fast-glob) - # All matched result files must be of same format + # All matched result files must be of the same format path: '' # Format of test results. Supported options: @@ -125,6 +125,7 @@ jobs: # flutter-json # java-junit # jest-junit + # mocha-json reporter: '' # Limits which test suites are listed: @@ -142,7 +143,7 @@ jobs: # Must be less or equal to 50. max-annotations: '10' - # Set action as failed if test report contain any failed test + # Set action as failed if test report contains any failed test fail-on-error: 'true' # Relative path under $GITHUB_WORKSPACE where the repository was checked out. @@ -224,8 +225,8 @@ Or with (undocumented) CLI argument: According to documentation `dart_test.yaml` should be at the root of the package, next to the package's pubspec. -On current `stable` and `beta` channels it doesn't work and you have to put `dart_test.yaml` inside your `test` folder. -On `dev` channel it's already fixed. +On current `stable` and `beta` channels it doesn't work, and you have to put `dart_test.yaml` inside your `test` folder. +On `dev` channel, it's already fixed. For more information see: - [test package](https://pub.dev/packages/test) @@ -239,17 +240,17 @@ For more information see: java-junit (Experimental) Support for [JUnit](https://Junit.org/) XML is experimental - should work but it was not extensively tested. -To have code annotations working properly it's required your directory structure matches package name. -This is due to the fact Java stacktraces doesn't contains full path to the source file. -Some heuristic was necessary to figure out mapping between line in stack trace and actual source file. +To have code annotations working properly, it's required your directory structure matches the package name. +This is due to the fact Java stack traces don't contain a full path to the source file. +Some heuristic was necessary to figure out the mapping between the line in the stack trace and an actual source file.
jest-Junit -[JEST](https://jestjs.io/) testing framework support requires usage of [jest-Junit](https://github.com/jest-community/jest-Junit) reporter. +[JEST](https://jestjs.io/) testing framework support requires the usage of [jest-Junit](https://github.com/jest-community/jest-Junit) reporter. It will create test results in Junit XML format which can be then processed by this action. -You can use following example configuration in `package.json`: +You can use the following example configuration in `package.json`: ```json "scripts": { "test": "jest --ci --reporters=default --reporters=jest-Junit" @@ -272,19 +273,38 @@ You can use following example configuration in `package.json`: Configuration of `uniqueOutputName`, `suiteNameTemplate`, `classNameTemplate`, `titleTemplate` is important for proper visualization of test results.
+
+ mocha-json + +[Mocha](https://mochajs.org/) testing framework support requires: +- 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`: +```json +"scripts": { + "test": "mocha --reporter json > test-results.json" +} +``` + +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) +
+ ## GitHub limitations -Unfortunately there are some known issues and limitations caused by GitHub API: +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. - 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@v2` to upload them and inspect manually. -- Check Runs are created for specific commit SHA. it's not possible to specify under which workflow test report should belong if there are more - workflows running for same SHA. Thanks to this GitHub "feature" it's possible your test report will appear in unexpected place in GitHub UI. - For more information see [#67](https://github.com/dorny/test-reporter/issues/67). +- Test report can't reference any additional files (e.g. screenshots). You can use `actions/upload-artifact@v2` 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). ## See also -- [paths-filter](https://github.com/dorny/paths-filter) - Conditionally run actions based on files modified by PR, feature branch or pushed commits +- [paths-filter](https://github.com/dorny/paths-filter) - Conditionally run actions based on files modified by PR, feature branch, or pushed commits ## License diff --git a/__tests__/__outputs__/dart-json.md b/__tests__/__outputs__/dart-json.md index 1aef4e24..80a28461 100644 --- a/__tests__/__outputs__/dart-json.md +++ b/__tests__/__outputs__/dart-json.md @@ -1,32 +1,28 @@ ![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical) -## fixtures/dart-json.json ❌ -**6** tests were completed in **3.760s** with **1** passed, **4** failed and **1** skipped. +## ❌ 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 ❌ -**4** tests were completed in **74ms** with **1** passed, **3** failed and **0** skipped. - -**Test 1** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|Passing test|36ms| - -**Test 1 Test 1.1** -|Result|Test|Time| -|:---:|:---|---:| -|❌|Failing test|20ms| -|❌|Exception in target unit|6ms| - -**Test 2** -|Result|Test|Time| -|:---:|:---|---:| -|❌|Exception in test|12ms| -### test/second_test.dart ❌ -**2** tests were completed in **51ms** with **0** passed, **1** failed and **1** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|❌|Timeout test|37ms| -|✖️|Skipped test|14ms| \ No newline at end of file +### ❌ test/main_test.dart +``` +Test 1 + ✔️ Passing test +Test 1 Test 1.1 + ❌ Failing test + Expected: <2> + Actual: <1> + + ❌ Exception in target unit + Exception: Some error +Test 2 + ❌ Exception in test + Exception: Some error +``` +### ❌ test/second_test.dart +``` +❌ Timeout test + TimeoutException after 0:00:00.000001: Test timed out after 0 seconds. +✖️ Skipped test +``` \ No newline at end of file diff --git a/__tests__/__outputs__/dotnet-trx.md b/__tests__/__outputs__/dotnet-trx.md index 60920684..2b9da8d7 100644 --- a/__tests__/__outputs__/dotnet-trx.md +++ b/__tests__/__outputs__/dotnet-trx.md @@ -1,18 +1,21 @@ ![Tests failed](https://img.shields.io/badge/tests-3%20passed%2C%203%20failed%2C%201%20skipped-critical) -## fixtures/dotnet-trx.trx ❌ -**7** tests were completed in **1.061s** with **3** passed, **3** failed and **1** skipped. +## ❌ fixtures/dotnet-trx.trx +**7** tests were completed in **1s** with **3** passed, **3** failed and **1** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| |[DotnetTests.XUnitTests.CalculatorTests](#r0s0)|3✔️|3❌|1✖️|110ms| -### DotnetTests.XUnitTests.CalculatorTests ❌ -**7** tests were completed in **110ms** with **3** passed, **3** failed and **1** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|❌|Exception_In_TargetTest|0ms| -|❌|Exception_In_Test|2ms| -|❌|Failing_Test|3ms| -|✔️|Passing_Test|0ms| -|✔️|Passing_Test_With_Name|0ms| -|✖️|Skipped_Test|1ms| -|✔️|Timeout_Test|102ms| \ No newline at end of file +### ❌ DotnetTests.XUnitTests.CalculatorTests +``` +❌ Exception_In_TargetTest + System.DivideByZeroException : Attempted to divide by zero. +❌ Exception_In_Test + System.Exception : Test +❌ Failing_Test + Assert.Equal() Failure + Expected: 3 + Actual: 2 +✔️ Passing_Test +✔️ Passing_Test_With_Name +✖️ Skipped_Test +✔️ Timeout_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 565f5147..929e12f2 100644 --- a/__tests__/__outputs__/fluent-validation-test-results.md +++ b/__tests__/__outputs__/fluent-validation-test-results.md @@ -1,67 +1,1057 @@ ![Tests passed successfully](https://img.shields.io/badge/tests-803%20passed%2C%201%20skipped-success) -## fixtures/external/FluentValidation.Tests.trx ✔️ -**804** tests were completed in **4.480s** with **803** passed, **0** failed and **1** skipped. +## ✔️ 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|35✔️|||12ms| -|FluentValidation.Tests.AccessorCacheTests|4✔️||1✖️|4ms| -|FluentValidation.Tests.AssemblyScannerTester|2✔️|||2ms| -|FluentValidation.Tests.CascadingFailuresTester|38✔️|||23ms| -|FluentValidation.Tests.ChainedValidationTester|13✔️|||6ms| -|FluentValidation.Tests.ChainingValidatorsTester|3✔️|||1ms| -|FluentValidation.Tests.ChildRulesTests|2✔️|||7ms| -|FluentValidation.Tests.CollectionValidatorWithParentTests|16✔️|||13ms| -|FluentValidation.Tests.ComplexValidationTester|17✔️|||26ms| -|FluentValidation.Tests.ConditionTests|18✔️|||9ms| -|FluentValidation.Tests.CreditCardValidatorTests|2✔️|||2ms| -|FluentValidation.Tests.CustomFailureActionTester|3✔️|||1ms| -|FluentValidation.Tests.CustomMessageFormatTester|6✔️|||3ms| -|FluentValidation.Tests.CustomValidatorTester|10✔️|||6ms| -|FluentValidation.Tests.DefaultValidatorExtensionTester|30✔️|||38ms| -|FluentValidation.Tests.EmailValidatorTests|36✔️|||18ms| -|FluentValidation.Tests.EmptyTester|9✔️|||5ms| -|FluentValidation.Tests.EnumValidatorTests|12✔️|||24ms| -|FluentValidation.Tests.EqualValidatorTests|10✔️|||3ms| -|FluentValidation.Tests.ExactLengthValidatorTester|6✔️|||2ms| -|FluentValidation.Tests.ExclusiveBetweenValidatorTests|19✔️|||6ms| -|FluentValidation.Tests.ExtensionTester|4✔️|||1ms| -|FluentValidation.Tests.ForEachRuleTests|34✔️|||47ms| -|FluentValidation.Tests.GreaterThanOrEqualToValidatorTester|14✔️|||5ms| -|FluentValidation.Tests.GreaterThanValidatorTester|13✔️|||4ms| -|FluentValidation.Tests.InclusiveBetweenValidatorTests|18✔️|||4ms| -|FluentValidation.Tests.InheritanceValidatorTest|11✔️|||18ms| -|FluentValidation.Tests.InlineValidatorTester|1✔️|||2ms| -|FluentValidation.Tests.LanguageManagerTests|21✔️|||28ms| -|FluentValidation.Tests.LengthValidatorTests|16✔️|||17ms| -|FluentValidation.Tests.LessThanOrEqualToValidatorTester|13✔️|||4ms| -|FluentValidation.Tests.LessThanValidatorTester|16✔️|||6ms| -|FluentValidation.Tests.LocalisedMessagesTester|6✔️|||3ms| -|FluentValidation.Tests.LocalisedNameTester|2✔️|||1ms| -|FluentValidation.Tests.MemberAccessorTests|9✔️|||5ms| -|FluentValidation.Tests.MessageFormatterTests|10✔️|||2ms| -|FluentValidation.Tests.ModelLevelValidatorTests|2✔️|||1ms| -|FluentValidation.Tests.NameResolutionPluggabilityTester|3✔️|||2ms| -|FluentValidation.Tests.NotEmptyTester|10✔️|||7ms| -|FluentValidation.Tests.NotEqualValidatorTests|11✔️|||7ms| -|FluentValidation.Tests.NotNullTester|5✔️|||1ms| -|FluentValidation.Tests.NullTester|5✔️|||2ms| -|FluentValidation.Tests.OnFailureTests|10✔️|||8ms| -|FluentValidation.Tests.PredicateValidatorTester|5✔️|||2ms| -|FluentValidation.Tests.PropertyChainTests|7✔️|||1ms| -|FluentValidation.Tests.RegularExpressionValidatorTests|15✔️|||6ms| -|FluentValidation.Tests.RuleBuilderTests|29✔️|||96ms| -|FluentValidation.Tests.RuleDependencyTests|14✔️|||2.511s| -|FluentValidation.Tests.RulesetTests|21✔️|||14ms| -|FluentValidation.Tests.ScalePrecisionValidatorTests|6✔️|||4ms| -|FluentValidation.Tests.SharedConditionTests|42✔️|||42ms| -|FluentValidation.Tests.StandalonePropertyValidationTester|1✔️|||0ms| -|FluentValidation.Tests.StringEnumValidatorTests|10✔️|||5ms| -|FluentValidation.Tests.TrackingCollectionTests|3✔️|||2ms| -|FluentValidation.Tests.TransformTests|4✔️|||3ms| -|FluentValidation.Tests.UserSeverityTester|7✔️|||3ms| -|FluentValidation.Tests.UserStateTester|4✔️|||3ms| -|FluentValidation.Tests.ValidateAndThrowTester|14✔️|||25ms| -|FluentValidation.Tests.ValidationResultTests|8✔️|||8ms| -|FluentValidation.Tests.ValidatorDescriptorTester|5✔️|||1ms| -|FluentValidation.Tests.ValidatorSelectorTests|10✔️|||9ms| -|FluentValidation.Tests.ValidatorTesterTester|73✔️|||74ms| \ No newline at end of file +|[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 +``` +✔️ Can_replace_default_errorcode_resolver +✔️ CanValidateInstancesOfType_returns_false_when_comparing_against_some_other_type +✔️ CanValidateInstancesOfType_returns_true_when_comparing_against_same_type +✔️ CanValidateInstancesOfType_returns_true_when_comparing_against_subclass +✔️ Default_error_code_should_be_class_name +✔️ OverridePropertyName_should_override_property_name +✔️ OverridePropertyName_with_lambda_should_override_property_name +✔️ PreValidate_bypasses_nullcheck_on_instance +✔️ RuleForeach_with_null_instances +✔️ Should_be_valid_when_there_are_no_failures_for_single_property +✔️ Should_not_main_state +✔️ Should_throw_for_non_member_expression_when_validating_single_property +✔️ Should_throw_when_rule_is_null +✔️ Should_validate_public_Field +✔️ Should_validate_single_Field +✔️ Should_validate_single_property +✔️ Should_validate_single_property_where_invalid_property_as_string +✔️ Should_validate_single_property_where_property_as_string +✔️ Uses_named_parameters_to_validate_ruleset +✔️ Validates_single_property_by_path +✔️ Validates_type_when_using_non_generic_validate_overload +✔️ When_the_validators_fail_then_the_errors_Should_be_accessible_via_the_errors_property +✔️ When_the_validators_fail_then_validatorrunner_should_return_false +✔️ When_the_Validators_pass_then_the_validatorRunner_should_return_true +✔️ WhenPreValidationReturnsFalse_ResultReturnToUserImmediatly_Validate +✔️ WhenPreValidationReturnsFalse_ResultReturnToUserImmediatly_Validate +✔️ WhenPreValidationReturnsFalse_ResultReturnToUserImmediatly_ValidateAsync +✔️ WhenPreValidationReturnsFalse_ResultReturnToUserImmediatly_ValidateAsync +✔️ WhenPreValidationReturnsTrue_ValidatorsGetHit_Validate +✔️ WhenPreValidationReturnsTrue_ValidatorsGetHit_ValidateAsync +✔️ WithErrorCode_should_override_error_code +✔️ WithMessage_and_WithErrorCode_should_override_error_message_and_error_code +✔️ WithMessage_should_override_error_message +✔️ WithName_should_override_field_name +✔️ WithName_should_override_field_name_with_value_from_other_property +``` +### ✔️ FluentValidation.Tests.AccessorCacheTests +``` +✖️ Benchmark +✔️ Equality_comparison_check +✔️ Gets_accessor +✔️ Gets_member_for_nested_property +✔️ Identifies_if_memberexp_acts_on_model_instance +``` +### ✔️ FluentValidation.Tests.AssemblyScannerTester +``` +✔️ Finds_validators_for_types +✔️ ForEach_iterates_over_types +``` +### ✔️ FluentValidation.Tests.CascadingFailuresTester +``` +✔️ Cascade_mode_can_be_set_after_validator_instantiated +✔️ Cascade_mode_can_be_set_after_validator_instantiated_async +✔️ Cascade_mode_can_be_set_after_validator_instantiated_async_legacy +✔️ Cascade_mode_can_be_set_after_validator_instantiated_legacy +✔️ Validation_continues_on_failure +✔️ Validation_continues_on_failure_async +✔️ Validation_continues_on_failure_when_set_to_Stop_globally_and_overriden_at_rule_level +✔️ Validation_continues_on_failure_when_set_to_Stop_globally_and_overriden_at_rule_level_async +✔️ Validation_continues_on_failure_when_set_to_Stop_globally_and_overriden_at_rule_level_async_legacy +✔️ Validation_continues_on_failure_when_set_to_Stop_globally_and_overriden_at_rule_level_legacy +✔️ Validation_continues_on_failure_when_set_to_StopOnFirstFailure_at_validator_level_and_overriden_at_rule_level +✔️ Validation_continues_on_failure_when_set_to_StopOnFirstFailure_at_validator_level_and_overriden_at_rule_level_async +✔️ Validation_continues_on_failure_when_set_to_StopOnFirstFailure_at_validator_level_and_overriden_at_rule_level_async_legacy +✔️ Validation_continues_on_failure_when_set_to_StopOnFirstFailure_at_validator_level_and_overriden_at_rule_level_legacy +✔️ Validation_continues_to_second_validator_when_first_validator_succeeds_and_cascade_set_to_stop +✔️ Validation_continues_to_second_validator_when_first_validator_succeeds_and_cascade_set_to_stop_async +✔️ Validation_continues_to_second_validator_when_first_validator_succeeds_and_cascade_set_to_stop_async_legacy +✔️ Validation_continues_to_second_validator_when_first_validator_succeeds_and_cascade_set_to_stop_legacy +✔️ Validation_continues_when_set_to_Continue_at_validator_level +✔️ Validation_continues_when_set_to_Continue_at_validator_level_async +✔️ Validation_stops_on_failure_when_set_to_Continue_and_overriden_at_rule_level +✔️ Validation_stops_on_failure_when_set_to_Continue_and_overriden_at_rule_level_async +✔️ Validation_stops_on_failure_when_set_to_Continue_and_overriden_at_rule_level_async_legacy +✔️ Validation_stops_on_failure_when_set_to_Continue_and_overriden_at_rule_level_legacy +✔️ Validation_stops_on_first_failure +✔️ Validation_stops_on_first_failure_async +✔️ Validation_stops_on_first_failure_async_legacy +✔️ Validation_stops_on_first_failure_legacy +✔️ Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level +✔️ Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_and_async_validator_is_invoked_synchronously +✔️ Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_and_async_validator_is_invoked_synchronously_legacy +✔️ Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_async +✔️ Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_async_legacy +✔️ Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_legacy +✔️ Validation_stops_on_first_failure_when_set_to_StopOnFirstFailure_at_validator_level +✔️ Validation_stops_on_first_failure_when_set_to_StopOnFirstFailure_at_validator_level_async +✔️ 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 +``` +✔️ Can_validate_using_validator_for_base_type +✔️ Chained_property_should_be_excluded +✔️ Chained_validator_descriptor +✔️ Chained_validator_should_not_be_invoked_on_null_property +✔️ Condition_should_work_with_chained_property +✔️ Explicitly_included_properties_should_be_propagated_to_nested_validators +✔️ Explicitly_included_properties_should_be_propagated_to_nested_validators_using_strings +✔️ Separate_validation_on_chained_property +✔️ Separate_validation_on_chained_property_conditional +✔️ Separate_validation_on_chained_property_valid +✔️ Should_allow_normal_rules_and_chained_property_on_same_property +✔️ Uses_explicit_ruleset +✔️ Validates_chained_property +``` +### ✔️ FluentValidation.Tests.ChainingValidatorsTester +``` +✔️ Options_should_only_apply_to_current_validator +✔️ Should_create_multiple_validators +✔️ Should_execute_multiple_validators +``` +### ✔️ FluentValidation.Tests.ChildRulesTests +``` +✔️ Can_define_nested_rules_for_collection +✔️ ChildRules_works_with_RuleSet +``` +### ✔️ FluentValidation.Tests.CollectionValidatorWithParentTests +``` +✔️ Async_condition_should_work_with_child_collection +✔️ Can_specify_condition_for_individual_collection_elements +✔️ Can_validate_collection_using_validator_for_base_type +✔️ Collection_should_be_excluded +✔️ Collection_should_be_explicitly_included_with_expression +✔️ Collection_should_be_explicitly_included_with_string +✔️ Condition_should_work_with_child_collection +✔️ Creates_validator_using_context_from_property_value +✔️ Should_override_property_name +✔️ Should_work_with_top_level_collection_validator +✔️ Should_work_with_top_level_collection_validator_and_overriden_name +✔️ Skips_null_items +✔️ Validates_collection +✔️ Validates_collection_asynchronously +✔️ Validates_collection_several_levels_deep +✔️ Validates_collection_several_levels_deep_async +``` +### ✔️ FluentValidation.Tests.ComplexValidationTester +``` +✔️ Async_condition_should_work_with_complex_property +✔️ Async_condition_should_work_with_complex_property_when_validator_invoked_synchronously +✔️ Can_directly_validate_multiple_fields_of_same_type +✔️ Can_validate_using_validator_for_base_type +✔️ Complex_property_should_be_excluded +✔️ Complex_validator_should_not_be_invoked_on_null_property +✔️ Condition_should_work_with_complex_property +✔️ Condition_should_work_with_complex_property_when_invoked_async +✔️ Explicitly_included_properties_should_be_propagated_to_nested_validators +✔️ Explicitly_included_properties_should_be_propagated_to_nested_validators_using_strings +✔️ Multiple_rules_in_chain_with_childvalidator_shouldnt_reuse_accessor +✔️ Multiple_rules_in_chain_with_childvalidator_shouldnt_reuse_accessor_async +✔️ Should_allow_normal_rules_and_complex_property_on_same_property +✔️ Should_override_propertyName +✔️ Validates_child_validator_asynchronously +✔️ Validates_child_validator_synchronously +✔️ Validates_complex_property +``` +### ✔️ FluentValidation.Tests.ConditionTests +``` +✔️ Async_condition_executed_synchronosuly_with_asynchronous_collection_rule +✔️ Async_condition_executed_synchronosuly_with_asynchronous_rule +✔️ Async_condition_executed_synchronosuly_with_synchronous_collection_role +✔️ Async_condition_executed_synchronosuly_with_synchronous_role +✔️ Async_condition_is_applied_to_all_validators_in_the_chain +✔️ Async_condition_is_applied_to_all_validators_in_the_chain_when_executed_synchronously +✔️ Async_condition_is_applied_to_single_validator_in_the_chain_when_ApplyConditionTo_set_to_CurrentValidator +✔️ Condition_is_applied_to_all_validators_in_the_chain +✔️ Condition_is_applied_to_single_validator_in_the_chain_when_ApplyConditionTo_set_to_CurrentValidator +✔️ Sync_condition_is_applied_to_async_validators +✔️ Validation_should_fail_when_async_condition_does_not_match +✔️ Validation_should_fail_when_async_condition_matches +✔️ Validation_should_fail_when_condition_does_not_match +✔️ Validation_should_fail_when_condition_matches +✔️ Validation_should_succeed_when_async_condition_does_not_match +✔️ Validation_should_succeed_when_async_condition_matches +✔️ Validation_should_succeed_when_condition_does_not_match +✔️ Validation_should_succeed_when_condition_matches +``` +### ✔️ FluentValidation.Tests.CreditCardValidatorTests +``` +✔️ IsValidTests +✔️ When_validation_fails_the_default_error_should_be_set +``` +### ✔️ FluentValidation.Tests.CustomFailureActionTester +``` +✔️ Does_not_invoke_action_if_validation_success +✔️ Invokes_custom_action_on_failure +✔️ Passes_object_being_validated_to_action +``` +### ✔️ FluentValidation.Tests.CustomMessageFormatTester +``` +✔️ Replaces_propertyvalue_placeholder +✔️ Replaces_propertyvalue_with_empty_string_when_null +✔️ Should_format_custom_message +✔️ Uses_custom_delegate_for_building_message +✔️ Uses_custom_delegate_for_building_message_only_for_specific_validator +✔️ Uses_property_value_in_message +``` +### ✔️ FluentValidation.Tests.CustomValidatorTester +``` +✔️ New_Custom_Returns_single_failure +✔️ New_Custom_Returns_single_failure_async +✔️ New_custom_uses_empty_property_name_for_model_level_rule +✔️ New_Custom_When_property_name_omitted_infers_property_name +✔️ New_Custom_When_property_name_omitted_infers_property_name_nested +✔️ New_Custom_within_ruleset +✔️ New_CustomAsync_within_ruleset +✔️ Perserves_property_chain_using_custom +✔️ Runs_async_rule_synchronously_when_validator_invoked_synchronously +✔️ Runs_sync_rule_asynchronously_when_validator_invoked_asynchronously +``` +### ✔️ FluentValidation.Tests.DefaultValidatorExtensionTester +``` +✔️ Empty_should_create_EmptyValidator +✔️ Equal_should_create_EqualValidator_with_explicit_value +✔️ Equal_should_create_EqualValidator_with_lambda +✔️ GreaterThan_should_create_GreaterThanValidator_with_explicit_value +✔️ GreaterThan_should_create_GreaterThanValidator_with_lambda +✔️ GreaterThanOrEqual_should_create_GreaterThanOrEqualValidator_with_explicit_value +✔️ GreaterThanOrEqual_should_create_GreaterThanOrEqualValidator_with_lambda +✔️ GreaterThanOrEqual_should_create_GreaterThanOrEqualValidator_with_lambda_with_other_Nullable +✔️ Length_should_create_ExactLengthValidator +✔️ Length_should_create_LengthValidator +✔️ Length_should_create_MaximumLengthValidator +✔️ Length_should_create_MinimumLengthValidator +✔️ LessThan_should_create_LessThanValidator_with_explicit_value +✔️ LessThan_should_create_LessThanValidator_with_lambda +✔️ LessThanOrEqual_should_create_LessThanOrEqualValidator_with_explicit_value +✔️ LessThanOrEqual_should_create_LessThanOrEqualValidator_with_lambda +✔️ LessThanOrEqual_should_create_LessThanOrEqualValidator_with_lambda_with_other_Nullable +✔️ Must_should_create_PredicateValidator_with_context +✔️ Must_should_create_PredicateValidator_with_PropertyValidatorContext +✔️ Must_should_create_PredicteValidator +✔️ MustAsync_should_create_AsyncPredicateValidator_with_context +✔️ MustAsync_should_create_AsyncPredicateValidator_with_PropertyValidatorContext +✔️ MustAsync_should_create_AsyncPredicteValidator +✔️ MustAsync_should_not_throw_InvalidCastException +✔️ NotEmpty_should_create_NotEmptyValidator +✔️ NotEqual_should_create_NotEqualValidator_with_explicit_value +✔️ NotEqual_should_create_NotEqualValidator_with_lambda +✔️ NotNull_should_create_NotNullValidator +✔️ ScalePrecision_should_create_ScalePrecisionValidator +✔️ ScalePrecision_should_create_ScalePrecisionValidator_with_ignore_trailing_zeros +``` +### ✔️ FluentValidation.Tests.EmailValidatorTests +``` +✔️ Fails_email_validation_aspnetcore_compatible +✔️ Fails_email_validation_aspnetcore_compatible +✔️ Fails_email_validation_aspnetcore_compatible +✔️ Fails_email_validation_aspnetcore_compatible +✔️ Fails_email_validation_aspnetcore_compatible +✔️ Fails_email_validation_aspnetcore_compatible +✔️ Fails_email_validation_aspnetcore_compatible +✔️ Fails_email_validation_aspnetcore_compatible +✔️ Invalid_email_addressex_regex +✔️ Invalid_email_addressex_regex +✔️ Invalid_email_addressex_regex +✔️ Invalid_email_addressex_regex +✔️ Valid_email_addresses_aspnetcore_compatible +✔️ Valid_email_addresses_aspnetcore_compatible +✔️ Valid_email_addresses_aspnetcore_compatible +✔️ Valid_email_addresses_aspnetcore_compatible +✔️ Valid_email_addresses_aspnetcore_compatible +✔️ Valid_email_addresses_aspnetcore_compatible +✔️ Valid_email_addresses_aspnetcore_compatible +✔️ Valid_email_addresses_aspnetcore_compatible +✔️ Valid_email_addresses_aspnetcore_compatible +✔️ Valid_email_addresses_aspnetcore_compatible +✔️ Valid_email_addresses_aspnetcore_compatible +✔️ Valid_email_addresses_regex +✔️ Valid_email_addresses_regex +✔️ Valid_email_addresses_regex +✔️ Valid_email_addresses_regex +✔️ Valid_email_addresses_regex +✔️ Valid_email_addresses_regex +✔️ Valid_email_addresses_regex +✔️ Valid_email_addresses_regex +✔️ Valid_email_addresses_regex +✔️ Valid_email_addresses_regex +✔️ Valid_email_addresses_regex +✔️ Valid_email_addresses_regex +✔️ Valid_email_addresses_regex +``` +### ✔️ FluentValidation.Tests.EmptyTester +``` +✔️ Passes_for_ienumerable_that_doesnt_implement_ICollection +✔️ Passes_when_collection_empty +✔️ When_there_is_a_value_then_the_validator_should_fail +✔️ When_validation_fails_error_should_be_set +✔️ When_value_is_Default_for_type_validator_should_pass_datetime +✔️ When_value_is_Default_for_type_validator_should_pass_int +✔️ When_value_is_empty_string_validator_should_pass +✔️ When_value_is_null_validator_should_pass +✔️ When_value_is_whitespace_validation_should_pass +``` +### ✔️ FluentValidation.Tests.EnumValidatorTests +``` +✔️ Flags_enum_invalid_when_using_outofrange_negative_value +✔️ Flags_enum_invalid_when_using_outofrange_positive_value +✔️ Flags_enum_valid_when_using_bitwise_value +✔️ Flags_enum_validates_correctly_when_using_zero_value +✔️ Flags_enum_with_overlapping_flags_valid_when_using_bitwise_value +✔️ IsValidTests +✔️ Nullable_enum_invalid_when_bad_value_specified +✔️ Nullable_enum_valid_when_property_value_is_null +✔️ Nullable_enum_valid_when_value_specified +✔️ When_the_enum_is_initialized_with_invalid_value_then_the_validator_should_fail +✔️ 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 +``` +✔️ Comparison_property_uses_custom_resolver +✔️ Should_store_comparison_type +✔️ Should_store_property_to_compare +✔️ Should_succeed_on_case_insensitive_comparison +✔️ Should_succeed_on_case_insensitive_comparison_using_expression +✔️ Should_use_ordinal_comparison_by_default +✔️ Validates_against_property +✔️ When_the_objects_are_equal_validation_should_succeed +✔️ When_the_objects_are_not_equal_validation_should_fail +✔️ When_validation_fails_the_error_should_be_set +``` +### ✔️ FluentValidation.Tests.ExactLengthValidatorTester +``` +✔️ Min_and_max_properties_should_be_set +✔️ When_exact_length_rule_failes_error_should_have_exact_length_error_errorcode +✔️ When_the_text_is_an_exact_length_the_validator_should_pass +✔️ When_the_text_length_is_larger_the_validator_should_fail +✔️ When_the_text_length_is_smaller_the_validator_should_fail +✔️ When_the_validator_fails_the_error_message_should_be_set +``` +### ✔️ FluentValidation.Tests.ExclusiveBetweenValidatorTests +``` +✔️ To_and_from_properties_should_be_set +✔️ To_and_from_properties_should_be_set_for_dates +✔️ To_and_from_properties_should_be_set_for_strings +✔️ Validates_with_nullable_when_property_is_null +✔️ Validates_with_nullable_when_property_not_null +✔️ When_the_text_is_larger_than_the_range_then_the_validator_should_fail +✔️ When_the_text_is_larger_than_the_range_then_the_validator_should_fail_for_strings +✔️ When_the_to_is_smaller_than_the_from_then_the_validator_should_throw +✔️ When_the_to_is_smaller_than_the_from_then_the_validator_should_throw_for_strings +✔️ When_the_validator_fails_the_error_message_should_be_set +✔️ When_the_validator_fails_the_error_message_should_be_set_for_strings +✔️ When_the_value_is_between_the_range_specified_then_the_validator_should_pass +✔️ When_the_value_is_between_the_range_specified_then_the_validator_should_pass_for_strings +✔️ When_the_value_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_fail +✔️ When_the_value_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_fail_for_strings +✔️ When_the_value_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_fail +✔️ When_the_value_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_fail_for_strings +✔️ 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 +``` +✔️ 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 +``` +✔️ Async_condition_should_work_with_child_collection +✔️ Can_access_colletion_index +✔️ Can_access_colletion_index_async +✔️ Can_access_parent_index +✔️ Can_access_parent_index_async +✔️ Can_specify_condition_for_individual_collection_elements +✔️ Can_use_cascade_with_RuleForEach +✔️ Can_validate_collection_using_validator_for_base_type +✔️ Collection_should_be_excluded +✔️ Collection_should_be_explicitly_included_with_expression +✔️ Collection_should_be_explicitly_included_with_string +✔️ Condition_should_work_with_child_collection +✔️ Correctly_gets_collection_indices +✔️ Correctly_gets_collection_indices_async +✔️ Executes_rule_for_each_item_in_collection +✔️ Executes_rule_for_each_item_in_collection_async +✔️ Nested_collection_for_null_property_should_not_throw_null_reference +✔️ Nested_conditions_Rule_For +✔️ Nested_conditions_Rule_For_Each +✔️ Overrides_indexer +✔️ Overrides_indexer_async +✔️ Regular_rules_can_drop_into_RuleForEach +✔️ RuleForEach_async_RunsTasksSynchronously +✔️ Should_not_scramble_property_name_when_using_collection_validators_several_levels_deep +✔️ Should_not_scramble_property_name_when_using_collection_validators_several_levels_deep_with_ValidateAsync +✔️ Should_override_property_name +✔️ Skips_null_items +✔️ Top_level_collection +✔️ Uses_useful_error_message_when_used_on_non_property +✔️ Validates_child_validator_asynchronously +✔️ Validates_child_validator_synchronously +✔️ Validates_collection +✔️ When_runs_outside_RuleForEach_loop +✔️ When_runs_outside_RuleForEach_loop_async +``` +### ✔️ FluentValidation.Tests.GreaterThanOrEqualToValidatorTester +``` +✔️ Comparison_property_uses_custom_resolver +✔️ Comparison_type +✔️ Should_fail_when_less_than_input +✔️ Should_localize_value +✔️ Should_set_default_error_when_validation_fails +✔️ Should_succeed_when_equal_to_input +✔️ Should_succeed_when_greater_than_input +✔️ Validates_nullable_with_nullable_property +✔️ Validates_with_nullable_property +✔️ Validates_with_nullable_when_property_is_null +✔️ Validates_with_nullable_when_property_is_null_cross_property +✔️ Validates_with_nullable_when_property_not_null +✔️ Validates_with_nullable_when_property_not_null_cross_property +✔️ Validates_with_property +``` +### ✔️ FluentValidation.Tests.GreaterThanValidatorTester +``` +✔️ Comparison_property_uses_custom_resolver +✔️ Comparison_Type +✔️ Should_fail_when_equal_to_input +✔️ Should_fail_when_less_than_input +✔️ Should_set_default_error_when_validation_fails +✔️ Should_succeed_when_greater_than_input +✔️ Validates_nullable_with_nullable_property +✔️ Validates_with_nullable_property +✔️ Validates_with_nullable_when_property_is_null +✔️ Validates_with_nullable_when_property_is_null_cross_property +✔️ Validates_with_nullable_when_property_not_null +✔️ Validates_with_nullable_when_property_not_null_cross_property +✔️ Validates_with_property +``` +### ✔️ FluentValidation.Tests.InclusiveBetweenValidatorTests +``` +✔️ To_and_from_properties_should_be_set +✔️ To_and_from_properties_should_be_set_for_strings +✔️ Validates_with_nullable_when_property_is_null +✔️ Validates_with_nullable_when_property_not_null +✔️ When_the_text_is_larger_than_the_range_then_the_validator_should_fail +✔️ When_the_text_is_larger_than_the_range_then_the_validator_should_fail_for_strings +✔️ When_the_to_is_smaller_than_the_from_then_the_validator_should_throw +✔️ When_the_to_is_smaller_than_the_from_then_the_validator_should_throw_for_strings +✔️ When_the_validator_fails_the_error_message_should_be_set +✔️ When_the_validator_fails_the_error_message_should_be_set_for_strings +✔️ When_the_value_is_between_the_range_specified_then_the_validator_should_pass +✔️ When_the_value_is_between_the_range_specified_then_the_validator_should_pass_for_strings +✔️ When_the_value_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_pass +✔️ When_the_value_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_pass_for_strings +✔️ When_the_value_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_pass +✔️ When_the_value_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_pass_for_strings +✔️ 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 +``` +✔️ Can_use_custom_subclass_with_nongeneric_overload +✔️ Validates_collection +✔️ Validates_collection_async +✔️ Validates_inheritance_async +✔️ Validates_inheritance_hierarchy +✔️ Validates_ruleset +✔️ Validates_ruleset_async +✔️ Validates_with_callback +✔️ Validates_with_callback_accepting_derived +✔️ Validates_with_callback_accepting_derived_async +✔️ Validates_with_callback_async +``` +### ✔️ FluentValidation.Tests.InlineValidatorTester +``` +✔️ Uses_inline_validator_to_build_rules +``` +### ✔️ FluentValidation.Tests.LanguageManagerTests +``` +✔️ All_languages_should_be_loaded +✔️ All_localizations_have_same_parameters_as_English +✔️ Always_use_specific_language +✔️ Always_use_specific_language_with_string_source +✔️ Can_replace_message +✔️ Can_replace_message_without_overriding_all_languages +✔️ Disables_localization +✔️ Falls_back_to_default_localization_key_when_error_code_key_not_found +✔️ Falls_back_to_english_when_culture_not_registered +✔️ Falls_back_to_english_when_translation_missing +✔️ Falls_back_to_parent_culture +✔️ Gets_translation_for_bosnian_latin_culture +✔️ Gets_translation_for_bosnian_latin_culture +✔️ Gets_translation_for_bosnian_latin_culture +✔️ Gets_translation_for_croatian_culture +✔️ Gets_translation_for_culture +✔️ Gets_translation_for_serbian_culture +✔️ Gets_translation_for_serbian_culture +✔️ Gets_translation_for_serbian_culture +✔️ Gets_translation_for_specific_culture +✔️ Uses_error_code_as_localization_key +``` +### ✔️ FluentValidation.Tests.LengthValidatorTests +``` +✔️ Min_and_max_properties_should_be_set +✔️ When_input_is_null_then_the_validator_should_pass +✔️ When_the_max_is_smaller_than_the_min_then_the_validator_should_throw +✔️ When_the_maxlength_validator_fails_the_error_message_should_be_set +✔️ When_the_minlength_validator_fails_the_error_message_should_be_set +✔️ When_the_text_is_between_the_lambda_range_specified_then_the_validator_should_pass +✔️ When_the_text_is_between_the_range_specified_then_the_validator_should_pass +✔️ When_the_text_is_exactly_the_size_of_the_lambda_lower_bound_then_the_validator_should_pass +✔️ When_the_text_is_exactly_the_size_of_the_lambda_upper_bound_then_the_validator_should_pass +✔️ When_the_text_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_pass +✔️ When_the_text_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_pass +✔️ When_the_text_is_larger_than_the_lambda_range_then_the_validator_should_fail +✔️ When_the_text_is_larger_than_the_range_then_the_validator_should_fail +✔️ When_the_text_is_smaller_than_the_lambda_range_then_the_validator_should_fail +✔️ 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 +``` +✔️ Comparison_property_uses_custom_resolver +✔️ Comparison_type +✔️ Should_fail_when_greater_than_input +✔️ Should_set_default_error_when_validation_fails +✔️ Should_succeed_when_equal_to_input +✔️ Should_succeed_when_less_than_input +✔️ Validates_nullable_with_nullable_property +✔️ Validates_with_nullable_property +✔️ Validates_with_nullable_when_property_is_null +✔️ Validates_with_nullable_when_property_is_null_cross_property +✔️ Validates_with_nullable_when_property_not_null +✔️ Validates_with_nullable_when_property_not_null_cross_property +✔️ Validates_with_property +``` +### ✔️ FluentValidation.Tests.LessThanValidatorTester +``` +✔️ Comparison_property_uses_custom_resolver +✔️ Comparison_type +✔️ Extracts_property_from_constant_using_expression +✔️ Extracts_property_from_expression +✔️ Should_fail_when_equal_to_input +✔️ Should_fail_when_greater_than_input +✔️ Should_set_default_validation_message_when_validation_fails +✔️ Should_succeed_when_less_than_input +✔️ Should_throw_when_value_to_compare_is_null +✔️ Validates_against_property +✔️ Validates_nullable_with_nullable_property +✔️ Validates_with_nullable_property +✔️ Validates_with_nullable_when_property_is_null +✔️ Validates_with_nullable_when_property_not_null +✔️ Validates_with_nullable_when_property_not_null_cross_property +✔️ Validates_with_nullable_when_property_null_cross_property +``` +### ✔️ FluentValidation.Tests.LocalisedMessagesTester +``` +✔️ Correctly_assigns_default_localized_error_message +✔️ Does_not_throw_InvalidCastException_when_using_RuleForEach +✔️ Formats_string_with_placeholders +✔️ Formats_string_with_placeholders_when_you_cant_edit_the_string +✔️ Uses_func_to_get_message +✔️ Uses_string_format_with_property_value +``` +### ✔️ FluentValidation.Tests.LocalisedNameTester +``` +✔️ Uses_localized_name +✔️ Uses_localized_name_expression +``` +### ✔️ FluentValidation.Tests.MemberAccessorTests +``` +✔️ ComplexPropertyGet +✔️ ComplexPropertySet +✔️ Equality +✔️ ImplicitCast +✔️ Name +✔️ SimpleFieldGet +✔️ SimpleFieldSet +✔️ SimplePropertyGet +✔️ SimplePropertySet +``` +### ✔️ FluentValidation.Tests.MessageFormatterTests +``` +✔️ Adds_argument_and_custom_arguments +✔️ Adds_formatted_argument_and_custom_arguments +✔️ Adds_formatted_argument_and_formatted_custom_arguments +✔️ Adds_PropertyName_to_message +✔️ Adds_value_to_message +✔️ Format_property_value +✔️ Should_ignore_unknown_numbered_parameters +✔️ Should_ignore_unknown_parameters +✔️ Understands_date_formats +✔️ Understands_numeric_formats +``` +### ✔️ FluentValidation.Tests.ModelLevelValidatorTests +``` +✔️ Can_use_child_validator_at_model_level +✔️ Validates_at_model_level +``` +### ✔️ FluentValidation.Tests.NameResolutionPluggabilityTester +``` +✔️ Resolves_nested_properties +✔️ ShouldHaveValidationError_Should_support_custom_propertynameresolver +✔️ Uses_custom_property_name +``` +### ✔️ FluentValidation.Tests.NotEmptyTester +``` +✔️ Fails_for_array +✔️ Fails_for_ienumerable_that_doesnt_implement_ICollection +✔️ Fails_when_collection_empty +✔️ When_there_is_a_value_then_the_validator_should_pass +✔️ When_validation_fails_error_should_be_set +✔️ When_value_is_Default_for_type_validator_should_fail_datetime +✔️ When_value_is_Default_for_type_validator_should_fail_int +✔️ When_value_is_empty_string_validator_should_fail +✔️ When_value_is_null_validator_should_fail +✔️ When_value_is_whitespace_validation_should_fail +``` +### ✔️ FluentValidation.Tests.NotEqualValidatorTests +``` +✔️ Comparison_property_uses_custom_resolver +✔️ Should_handle_custom_value_types_correctly +✔️ Should_not_be_valid_for_case_insensitve_comparison +✔️ Should_not_be_valid_for_case_insensitve_comparison_with_expression +✔️ Should_store_comparison_type +✔️ Should_store_property_to_compare +✔️ Should_use_ordinal_comparison_by_default +✔️ Validates_across_properties +✔️ When_the_objects_are_equal_then_the_validator_should_fail +✔️ When_the_objects_are_not_equal_then_the_validator_should_pass +✔️ When_the_validator_fails_the_error_message_should_be_set +``` +### ✔️ FluentValidation.Tests.NotNullTester +``` +✔️ Fails_when_nullable_value_type_is_null +✔️ Not_null_validator_should_not_crash_with_non_nullable_value_type +✔️ NotNullValidator_should_fail_if_value_is_null +✔️ NotNullValidator_should_pass_if_value_has_value +✔️ When_the_validator_fails_the_error_message_should_be_set +``` +### ✔️ FluentValidation.Tests.NullTester +``` +✔️ Not_null_validator_should_not_crash_with_non_nullable_value_type +✔️ NullValidator_should_fail_if_value_has_value +✔️ NullValidator_should_pass_if_value_is_null +✔️ Passes_when_nullable_value_type_is_null +✔️ When_the_validator_passes_the_error_message_should_be_set +``` +### ✔️ FluentValidation.Tests.OnFailureTests +``` +✔️ OnFailure_called_for_each_failed_rule +✔️ OnFailure_called_for_each_failed_rule_asyncAsync +✔️ Should_be_able_to_access_error_message_in_OnFailure +✔️ ShouldHaveChildValidator_should_be_true +✔️ ShouldHaveChildValidator_works_with_Include +✔️ WhenAsyncWithOnFailure_should_invoke_condition_on_async_inner_validator +✔️ WhenAsyncWithOnFailure_should_invoke_condition_on_inner_validator +✔️ WhenAsyncWithOnFailure_should_invoke_condition_on_inner_validator_invoked_synchronously +✔️ WhenWithOnFailure_should_invoke_condition_on_async_inner_validator +✔️ WhenWithOnFailure_should_invoke_condition_on_inner_validator +``` +### ✔️ FluentValidation.Tests.PredicateValidatorTester +``` +✔️ Should_fail_when_predicate_returns_false +✔️ Should_succeed_when_predicate_returns_true +✔️ Should_throw_when_predicate_is_null +✔️ When_validation_fails_metadata_should_be_set_on_failure +✔️ When_validation_fails_the_default_error_should_be_set +``` +### ✔️ FluentValidation.Tests.PropertyChainTests +``` +✔️ AddIndexer_throws_when_nothing_added +✔️ Calling_ToString_should_construct_string_representation_of_chain +✔️ Calling_ToString_should_construct_string_representation_of_chain_with_indexers +✔️ Creates_from_expression +✔️ Should_be_subchain +✔️ Should_ignore_blanks +✔️ Should_not_be_subchain +``` +### ✔️ FluentValidation.Tests.RegularExpressionValidatorTests +``` +✔️ Can_access_expression_in_message +✔️ Can_access_expression_in_message_lambda +✔️ Can_access_expression_in_message_lambda_regex +✔️ Uses_lazily_loaded_expression +✔️ Uses_lazily_loaded_expression_with_options +✔️ Uses_regex_object +✔️ When_the_text_does_not_match_the_lambda_regex_regular_expression_then_the_validator_should_fail +✔️ When_the_text_does_not_match_the_lambda_regular_expression_then_the_validator_should_fail +✔️ When_the_text_does_not_match_the_regular_expression_then_the_validator_should_fail +✔️ When_the_text_is_empty_then_the_validator_should_fail +✔️ When_the_text_is_null_then_the_validator_should_pass +✔️ When_the_text_matches_the_lambda_regex_regular_expression_then_the_validator_should_pass +✔️ When_the_text_matches_the_lambda_regular_expression_then_the_validator_should_pass +✔️ When_the_text_matches_the_regular_expression_then_the_validator_should_pass +✔️ When_validation_fails_the_default_error_should_be_set +``` +### ✔️ FluentValidation.Tests.RuleBuilderTests +``` +✔️ Adding_a_validator_should_return_builder +✔️ Adding_a_validator_should_store_validator +✔️ Calling_validate_should_delegate_to_underlying_validator +✔️ Calling_ValidateAsync_should_delegate_to_underlying_async_validator +✔️ Calling_ValidateAsync_should_delegate_to_underlying_sync_validator +✔️ Conditional_child_validator_should_register_with_validator_type_not_property +✔️ Nullable_object_with_async_condition_should_not_throw +✔️ Nullable_object_with_condition_should_not_throw +✔️ Property_should_return_null_when_it_is_not_a_property_being_validated +✔️ Property_should_return_property_being_validated +✔️ PropertyDescription_should_return_custom_property_name +✔️ PropertyDescription_should_return_property_name_split +✔️ Result_should_use_custom_property_name_when_no_property_name_can_be_determined +✔️ Rule_for_a_non_memberexpression_should_not_generate_property_name +✔️ Should_build_property_name +✔️ Should_compile_expression +✔️ Should_set_custom_error +✔️ Should_set_custom_property_name +✔️ Should_throw_if_message_is_null +✔️ Should_throw_if_overriding_validator_is_null +✔️ Should_throw_if_overriding_validator_provider_is_null +✔️ Should_throw_if_property_name_is_null +✔️ Should_throw_if_validator_is_null +✔️ Should_throw_when_async_inverse_predicate_is_null +✔️ Should_throw_when_async_predicate_is_null +✔️ Should_throw_when_context_predicate_is_null +✔️ Should_throw_when_inverse_context_predicate_is_null +✔️ Should_throw_when_inverse_predicate_is_null +✔️ Should_throw_when_predicate_is_null +``` +### ✔️ FluentValidation.Tests.RuleDependencyTests +``` +✔️ Async_inside_dependent_rules +✔️ Async_inside_dependent_rules_when_parent_rule_not_async +✔️ Dependent_rules_inside_ruleset +✔️ Dependent_rules_inside_when +✔️ Does_not_invoke_dependent_rule_if_parent_rule_does_not_pass +✔️ Invokes_dependent_rule_if_parent_rule_passes +✔️ Nested_dependent_rules +✔️ Nested_dependent_rules_inside_ruleset +✔️ Nested_dependent_rules_inside_ruleset_inside_method +✔️ Nested_dependent_rules_inside_ruleset_no_result_when_second_level_fails +✔️ Nested_dependent_rules_inside_ruleset_no_result_when_top_level_fails +✔️ TestAsyncWithDependentRules_AsyncEntry +✔️ TestAsyncWithDependentRules_SyncEntry +✔️ Treats_root_level_RuleFor_call_as_dependent_rule_if_user_forgets_to_use_DependentRulesBuilder +``` +### ✔️ FluentValidation.Tests.RulesetTests +``` +✔️ Applies_multiple_rulesets_to_rule +✔️ Combines_rulesets_and_explicit_properties +✔️ Combines_rulesets_and_explicit_properties_async +✔️ Executes_all_rules +✔️ Executes_in_rule_in_default_and_none +✔️ Executes_in_rule_in_ruleset_and_default +✔️ Executes_multiple_rulesets +✔️ Executes_rules_in_default_ruleset_and_specific_ruleset +✔️ Executes_rules_in_specified_ruleset +✔️ Executes_rules_not_specified_in_ruleset +✔️ Includes_all_rulesets +✔️ Includes_all_rulesets_async +✔️ Includes_combination_of_rulesets +✔️ Includes_combination_of_rulesets_async +✔️ Ruleset_cascades_to_child_collection_validator +✔️ Ruleset_cascades_to_child_validator +✔️ Ruleset_selection_should_cascade_downwards_with_when_setting_child_validator_using_include_statement +✔️ Ruleset_selection_should_cascade_downwards_with_when_setting_child_validator_using_include_statement_with_lambda +✔️ Ruleset_selection_should_not_cascade_downwards_when_set_on_property +✔️ Trims_spaces +✔️ WithMessage_works_inside_rulesets +``` +### ✔️ FluentValidation.Tests.ScalePrecisionValidatorTests +``` +✔️ Scale_precision_should_be_valid +✔️ Scale_precision_should_be_valid_when_ignoring_trailing_zeroes +✔️ Scale_precision_should_be_valid_when_they_are_equal +✔️ Scale_precision_should_not_be_valid +✔️ Scale_precision_should_not_be_valid_when_ignoring_trailing_zeroes +✔️ Scale_precision_should_not_be_valid_when_they_are_equal +``` +### ✔️ FluentValidation.Tests.SharedConditionTests +``` +✔️ Async_condition_can_be_used_inside_ruleset +✔️ Condition_can_be_used_inside_ruleset +✔️ Does_not_execute_custom_Rule_when_async_condition_false +✔️ Does_not_execute_custom_Rule_when_condition_false +✔️ Does_not_execute_customasync_Rule_when_async_condition_false +✔️ Does_not_execute_customasync_Rule_when_condition_false +✔️ Doesnt_throw_NullReferenceException_when_instance_not_null +✔️ Doesnt_throw_NullReferenceException_when_instance_not_null_async +✔️ Executes_custom_rule_when_async_condition_true +✔️ Executes_custom_rule_when_condition_true +✔️ Executes_customasync_rule_when_async_condition_true +✔️ Executes_customasync_rule_when_condition_true +✔️ Nested_async_conditions_with_Custom_rule +✔️ Nested_async_conditions_with_CustomAsync_rule +✔️ Nested_conditions_with_Custom_rule +✔️ Nested_conditions_with_CustomAsync_rule +✔️ Outer_async_Unless_clause_will_trump_an_inner_Unless_clause_when_inner_fails_but_the_outer_is_satisfied +✔️ Outer_Unless_clause_will_trump_an_inner_Unless_clause_when_inner_fails_but_the_outer_is_satisfied +✔️ Rules_invoke_when_inverse_shared_async_condition_matches +✔️ Rules_invoke_when_inverse_shared_condition_matches +✔️ Rules_not_invoked_when_inverse_shared_async_condition_does_not_match +✔️ Rules_not_invoked_when_inverse_shared_condition_does_not_match +✔️ RuleSet_can_be_used_inside_async_condition +✔️ RuleSet_can_be_used_inside_condition +✔️ Runs_otherwise_conditions_for_UnlessAsync +✔️ Runs_otherwise_conditions_for_When +✔️ Runs_otherwise_conditions_for_WhenAsync +✔️ Runs_otherwise_conditons_for_Unless +✔️ Shared_async_When_is_applied_to_groupd_rules_when_initial_predicate_is_true_and_all_individual_rules_are_satisfied +✔️ Shared_async_When_is_applied_to_grouped_rules_when_initial_predicate_is_true +✔️ Shared_async_When_is_not_applied_to_grouped_rules_when_initial_predicate_is_false +✔️ Shared_async_When_respects_the_smaller_scope_of_a_inner_Unless_when_the_inner_Unless_predicate_fails +✔️ Shared_async_When_respects_the_smaller_scope_of_an_inner_Unless_when_the_inner_Unless_predicate_is_satisfied +✔️ Shared_When_is_applied_to_groupd_rules_when_initial_predicate_is_true_and_all_individual_rules_are_satisfied +✔️ Shared_When_is_applied_to_grouped_rules_when_initial_predicate_is_true +✔️ Shared_When_is_not_applied_to_grouped_rules_when_initial_predicate_is_false +✔️ Shared_When_respects_the_smaller_scope_of_a_inner_Unless_when_the_inner_Unless_predicate_fails +✔️ Shared_When_respects_the_smaller_scope_of_an_inner_Unless_when_the_inner_Unless_predicate_is_satisfied +✔️ When_async_condition_executed_for_each_instance_of_RuleForEach_condition_should_not_be_cached +✔️ When_condition_executed_for_each_instance_of_RuleForEach_condition_should_not_be_cached +✔️ When_condition_only_executed_once +✔️ WhenAsync_condition_only_executed_once +``` +### ✔️ FluentValidation.Tests.StandalonePropertyValidationTester +``` +✔️ Should_validate_property_value_without_instance +``` +### ✔️ FluentValidation.Tests.StringEnumValidatorTests +``` +✔️ IsValidTests_CaseInsensitive_CaseCorrect +✔️ IsValidTests_CaseInsensitive_CaseIncorrect +✔️ IsValidTests_CaseSensitive_CaseCorrect +✔️ IsValidTests_CaseSensitive_CaseIncorrect +✔️ When_enumType_is_not_an_enum_it_should_throw +✔️ When_enumType_is_null_it_should_throw +✔️ When_the_property_is_initialized_with_empty_string_then_the_validator_should_fail +✔️ When_the_property_is_initialized_with_invalid_string_then_the_validator_should_fail +✔️ 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 +``` +✔️ Add_AddsItem +✔️ Should_not_raise_event_once_handler_detached +✔️ When_Item_Added_Raises_ItemAdded +``` +### ✔️ FluentValidation.Tests.TransformTests +``` +✔️ Transforms_collection_element +✔️ Transforms_collection_element_async +✔️ Transforms_property_value +✔️ Transforms_property_value_to_another_type +``` +### ✔️ FluentValidation.Tests.UserSeverityTester +``` +✔️ Can_Provide_conditional_severity +✔️ Can_Provide_severity_for_item_in_collection +✔️ Correctly_provides_object_being_validated +✔️ Defaults_user_severity_to_error +✔️ Should_use_last_supplied_severity +✔️ Stores_user_severity_against_validation_failure +✔️ Throws_when_provider_is_null +``` +### ✔️ 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 +``` +✔️ Does_not_throw_when_valid +✔️ Does_not_throw_when_valid_and_a_ruleset +✔️ Does_not_throw_when_valid_and_a_ruleset_async +✔️ Does_not_throw_when_valid_async +✔️ Only_root_validator_throws +✔️ Populates_errors +✔️ Serializes_exception +✔️ Throws_exception +✔️ Throws_exception_async +✔️ Throws_exception_with_a_ruleset +✔️ Throws_exception_with_a_ruleset_async +✔️ ToString_provides_error_details +✔️ ValidationException_provides_correct_message_when_appendDefaultMessage_false +✔️ ValidationException_provides_correct_message_when_appendDefaultMessage_true +``` +### ✔️ FluentValidation.Tests.ValidationResultTests +``` +✔️ Can_serialize_failure +✔️ Can_serialize_result +✔️ Should_add_errors +✔️ Should_be_valid_when_there_are_no_errors +✔️ Should_not_be_valid_when_there_are_errors +✔️ ToString_return_empty_string_when_there_is_no_error +✔️ ToString_return_error_messages_with_given_separator +✔️ ToString_return_error_messages_with_newline_as_separator +``` +### ✔️ FluentValidation.Tests.ValidatorDescriptorTester +``` +✔️ Does_not_throw_when_rule_declared_without_property +✔️ Gets_validators_for_property +✔️ GetValidatorsForMember_and_GetRulesForMember_can_both_retrieve_for_model_level_rule +✔️ Returns_empty_collection_for_property_with_no_validators +✔️ Should_retrieve_name_given_to_it_pass_property_as_string +``` +### ✔️ FluentValidation.Tests.ValidatorSelectorTests +``` +✔️ Can_use_property_with_include +✔️ Does_not_validate_other_property +✔️ Does_not_validate_other_property_using_expression +✔️ Executes_correct_rule_when_using_property_with_include +✔️ Executes_correct_rule_when_using_property_with_include_async +✔️ Includes_nested_property +✔️ Includes_nested_property_using_expression +✔️ MemberNameValidatorSelector_returns_true_when_property_name_matches +✔️ Validates_nullable_property_with_overriden_name_when_selected +✔️ Validates_property_using_expression +``` +### ✔️ FluentValidation.Tests.ValidatorTesterTester +``` +✔️ Allows_only_one_failure_to_match +✔️ Can_use_indexer_in_string_message +✔️ Can_use_indexer_in_string_message_inverse +✔️ Expected_error_code_check +✔️ Expected_message_argument_check +✔️ Expected_message_check +✔️ Expected_severity_check +✔️ Expected_state_check +✔️ Matches_any_failure +✔️ Matches_model_level_rule +✔️ Model_level_check_fails_if_no_model_level_failures +✔️ ShouldHaveChildValidator_should_not_throw_when_property_Does_have_child_validator +✔️ ShouldHaveChildValidator_should_not_throw_when_property_Does_have_child_validator_and_expecting_a_basetype +✔️ ShouldHaveChildValidator_should_not_throw_when_property_has_collection_validators +✔️ ShouldHaveChildValidator_should_throw_when_property_has_a_different_child_validator +✔️ ShouldHaveChildValidator_should_work_with_DependentRules +✔️ ShouldHaveChildvalidator_throws_when_collection_property_Does_not_have_child_validator +✔️ ShouldHaveChildValidator_throws_when_property_does_not_have_child_validator +✔️ ShouldHaveChildValidator_works_on_model_level_rules +✔️ ShouldHaveValidationError_async +✔️ ShouldHaveValidationError_async_throws +✔️ ShouldHaveValidationError_model_async +✔️ ShouldHaveValidationError_model_async_throws +✔️ ShouldHaveValidationError_preconstructed_object_does_not_throw_for_unwritable_property +✔️ ShouldHaveValidationError_should_not_throw_when_there_are_errors_with_preconstructed_object +✔️ ShouldHaveValidationError_should_not_throw_when_there_are_validation_errors +✔️ ShouldHaveValidationError_should_not_throw_when_there_are_validation_errors__WhenAsyn_is_used +✔️ ShouldHaveValidationError_should_not_throw_when_there_are_validation_errors__WhenAsyn_is_used +✔️ ShouldHaveValidationError_should_not_throw_when_there_are_validation_errors_ruleforeach +✔️ ShouldHaveValidationError_Should_support_nested_properties +✔️ ShouldHaveValidationError_Should_throw_when_there_are_no_validation_errors +✔️ ShouldHaveValidationError_should_throw_when_there_are_no_validation_errors_with_preconstructed_object +✔️ ShouldHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_Is_Used +✔️ ShouldHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_Is_Used +✔️ ShouldHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_Is_Used +✔️ ShouldHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_Is_Used +✔️ ShouldHaveValidationError_should_throw_when_there_are_not_validation_errors_ruleforeach +✔️ ShouldHaveValidationError_with_an_unmatched_rule_and_a_single_error_should_throw_an_exception +✔️ ShouldHaveValidationError_with_an_unmatched_rule_and_multiple_errors_should_throw_an_exception +✔️ ShouldHaveValidationErrorFor_takes_account_of_rulesets +✔️ ShouldHaveValidationErrorFor_takes_account_of_rulesets_fluent_approach +✔️ ShouldNotHaveValidationError_async +✔️ ShouldNotHaveValidationError_async_model_throws +✔️ ShouldNotHaveValidationError_async_throws +✔️ ShouldNotHaveValidationError_model_async +✔️ ShouldNotHaveValidationError_should_correctly_handle_explicitly_providing_object_to_validate +✔️ ShouldNotHaveValidationError_should_correctly_handle_explicitly_providing_object_to_validate_and_other_property_fails_validation +✔️ ShouldNotHaveValidationError_should_have_validation_error_details_when_thrown_ruleforeach +✔️ ShouldNotHaveValidationError_should_not_throw_when_there_are_no_errors +✔️ ShouldNotHAveValidationError_should_not_throw_When_there_are_no_errors_with_preconstructed_object +✔️ ShouldNotHaveValidationError_should_not_throw_when_there_are_not_validation_errors_ruleforeach +✔️ ShouldNotHaveValidationError_Should_support_nested_properties +✔️ ShouldNotHaveValidationError_should_throw_when_there_are_errors +✔️ ShouldNotHaveValidationError_should_throw_when_there_are_errors_with_preconstructed_object +✔️ ShouldNotHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_is_used +✔️ ShouldNotHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_is_used +✔️ ShouldNotHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_is_used +✔️ ShouldNotHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_is_used +✔️ ShouldNotHaveValidationError_should_throw_when_there_are_validation_errors__WhenAsyn_is_used +✔️ ShouldNotHaveValidationError_should_throw_when_there_are_validation_errors__WhenAsyn_is_used +✔️ ShouldNotHaveValidationError_should_throw_when_there_are_validation_errors_ruleforeach +✔️ Tests_nested_property +✔️ Tests_nested_property_reverse +✔️ Tests_nested_property_using_obsolete_method +✔️ TestValidate_runs_async +✔️ TestValidate_runs_async_throws +✔️ Unexpected_error_code_check +✔️ Unexpected_message_check +✔️ Unexpected_message_check +✔️ Unexpected_message_check +✔️ Unexpected_message_check +✔️ Unexpected_severity_check +✔️ Unexpected_state_check +``` \ No newline at end of file diff --git a/__tests__/__outputs__/jest-junit.md b/__tests__/__outputs__/jest-junit.md index 5ddef13e..5aecf5d8 100644 --- a/__tests__/__outputs__/jest-junit.md +++ b/__tests__/__outputs__/jest-junit.md @@ -1,32 +1,26 @@ ![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical) -## fixtures/jest-junit.xml ❌ -**6** tests were completed in **1.360s** with **1** passed, **4** failed and **1** skipped. +## ❌ 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 ❌ -**4** tests were completed in **486ms** with **1** passed, **3** failed and **0** skipped. - -**Test 1** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|Passing test|1ms| - -**Test 1 › Test 1.1** -|Result|Test|Time| -|:---:|:---|---:| -|❌|Failing test|2ms| -|❌|Exception in target unit|0ms| - -**Test 2** -|Result|Test|Time| -|:---:|:---|---:| -|❌|Exception in test|0ms| -### __tests__\second.test.js ❌ -**2** tests were completed in **82ms** with **0** passed, **1** failed and **1** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|❌|Timeout test|4ms| -|✖️|Skipped test|0ms| \ No newline at end of file +### ❌ __tests__\main.test.js +``` +Test 1 + ✔️ Passing test +Test 1 › Test 1.1 + ❌ Failing test + Error: expect(received).toBeTruthy() + ❌ Exception in target unit + Error: Some error +Test 2 + ❌ Exception in test + Error: Some error +``` +### ❌ __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: +✖️ Skipped test +``` \ No newline at end of file diff --git a/__tests__/__outputs__/jest-test-results.md b/__tests__/__outputs__/jest-test-results.md index 454c2f46..ed545bfd 100644 --- a/__tests__/__outputs__/jest-test-results.md +++ b/__tests__/__outputs__/jest-test-results.md @@ -1,182 +1,182 @@ ![Tests failed](https://img.shields.io/badge/tests-4207%20passed%2C%202%20failed%2C%2030%20skipped-critical) -## fixtures/external/jest/jest-test-results.xml ❌ -**4239** tests were completed in **165.872s** with **4207** passed, **2** failed and **30** skipped. +## ❌ 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✔️|||4.127s| -|e2e/__tests__/autoClearMocks.test.ts|2✔️|||1.681s| -|e2e/__tests__/autoResetMocks.test.ts|2✔️|||1.666s| -|e2e/__tests__/autoRestoreMocks.test.ts|2✔️|||1.797s| -|e2e/__tests__/babelPluginJestHoist.test.ts|1✔️|||6.249s| +|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✔️|||1.902s| -|e2e/__tests__/circularInequality.test.ts|1✔️|||1.451s| -|e2e/__tests__/circusConcurrentEach.test.ts|2✔️|||1.591s| +|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✔️|||1.004s| -|e2e/__tests__/cliHandlesExactFilenames.test.ts|2✔️|||1.230s| -|e2e/__tests__/compareDomNodes.test.ts|1✔️|||1.407s| -|e2e/__tests__/config.test.ts|6✔️|||3.945s| -|e2e/__tests__/console.test.ts|7✔️|||8.072s| -|e2e/__tests__/consoleAfterTeardown.test.ts|1✔️|||1.341s| +|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✔️|||1.873s| -|e2e/__tests__/coverageRemapping.test.ts|1✔️|||12.701s| -|e2e/__tests__/coverageReport.test.ts|12✔️|||22.264s| -|e2e/__tests__/coverageThreshold.test.ts|5✔️|||4.868s| -|e2e/__tests__/coverageTransformInstrumented.test.ts|1✔️|||5.029s| -|e2e/__tests__/coverageWithoutTransform.test.ts|1✔️|||1.075s| +|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✔️|||2.206s| -|e2e/__tests__/customMatcherStackTrace.test.ts|2✔️|||1.539s| -|e2e/__tests__/customReporters.test.ts|9✔️|||6.553s| +|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✔️|||2.757s| +|e2e/__tests__/customTestSequencers.test.ts|3✔️|||3s| |e2e/__tests__/debug.test.ts|1✔️|||899ms| -|e2e/__tests__/declarationErrors.test.ts|3✔️|||2.389s| +|e2e/__tests__/declarationErrors.test.ts|3✔️|||2s| |e2e/__tests__/dependencyClash.test.ts|1✔️|||833ms| -|e2e/__tests__/detectOpenHandles.ts|8✔️|||7.528s| -|e2e/__tests__/domDiffing.test.ts|1✔️|||1.361s| +|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✔️|||4.721s| -|e2e/__tests__/emptyDescribeWithHooks.test.ts|4✔️|||2.886s| +|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✔️|||5.221s| +|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✔️|||2.732s| -|e2e/__tests__/expectInVm.test.ts|1✔️|||1.527s| -|e2e/__tests__/extraGlobals.test.ts|1✔️|||1.011s| +|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✔️|||10.353s| -|e2e/__tests__/fakePromises.test.ts|2✔️|||1.716s| -|e2e/__tests__/fatalWorkerError.test.ts|1✔️|||3.167s| -|e2e/__tests__/filter.test.ts|7✔️|||5.422s| -|e2e/__tests__/findRelatedFiles.test.ts|5✔️|||6.230s| +|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✔️|||2.208s| -|e2e/__tests__/generatorMock.test.ts|1✔️|||1.027s| +|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✔️|||7.505s| -|e2e/__tests__/globalSetup.test.ts|10✔️|||13.926s| -|e2e/__tests__/globalTeardown.test.ts|7✔️|||11.886s| +|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✔️|||1.043s| -|e2e/__tests__/injectGlobals.test.ts|2✔️|||1.860s| -|e2e/__tests__/jasmineAsync.test.ts|15✔️|||28.291s| +|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✔️|||2.134s| -|e2e/__tests__/jest.config.ts.test.ts|5✔️|||14.322s| -|[e2e/__tests__/jestChangedFiles.test.ts](#r0s75)|9✔️|1❌||9.045s| -|e2e/__tests__/jestEnvironmentJsdom.test.ts|1✔️|||1.744s| -|e2e/__tests__/jestRequireActual.test.ts|1✔️|||1.665s| -|e2e/__tests__/jestRequireMock.test.ts|1✔️|||2.119s| +|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✔️|||1.514s| +|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✔️|||1.764s| +|e2e/__tests__/locationInResults.test.ts|2✔️|||2s| |e2e/__tests__/logHeapUsage.test.ts|1✔️|||884ms| -|e2e/__tests__/mockNames.test.ts|8✔️|||6.771s| -|e2e/__tests__/modernFakeTimers.test.ts|2✔️|||1.680s| -|e2e/__tests__/moduleNameMapper.test.ts|5✔️|||5.395s| +|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✔️|||16.360s| +|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✔️|||1.422s| -|e2e/__tests__/nestedTestDefinitions.test.ts|4✔️|||4.641s| +|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✔️|||1.063s| -|e2e/__tests__/noTestsFound.test.ts|5✔️|||2.739s| -|[e2e/__tests__/onlyChanged.test.ts](#r0s98)|8✔️|1❌||22.281s| -|e2e/__tests__/onlyFailuresNonWatch.test.ts|1✔️|||2.893s| -|e2e/__tests__/overrideGlobals.test.ts|2✔️|||2.046s| -|e2e/__tests__/pnp.test.ts|1✔️|||2.715s| -|e2e/__tests__/presets.test.ts|2✔️|||1.966s| -|e2e/__tests__/processExit.test.ts|1✔️|||1.070s| +|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✔️|||1.137s| +|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✔️|||1.961s| +|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✔️|||1.863s| -|e2e/__tests__/resolveGetPaths.test.ts|1✔️|||1.155s| +|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✔️|||1.263s| -|e2e/__tests__/resolveWithPaths.test.ts|1✔️|||1.170s| +|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✔️|||1.999s| -|e2e/__tests__/runtimeInternalModuleRegistry.test.ts|1✔️|||1.202s| -|e2e/__tests__/selectProjects.test.ts|18✔️|||5.236s| +|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✔️|||1.967s| +|e2e/__tests__/setupFilesAfterEnvConfig.test.ts|2✔️|||2s| |e2e/__tests__/showConfig.test.ts|1✔️|||195ms| -|e2e/__tests__/skipBeforeAfterAll.test.ts|1✔️|||1.061s| +|e2e/__tests__/skipBeforeAfterAll.test.ts|1✔️|||1s| |e2e/__tests__/snapshot-unknown.test.ts|1✔️|||838ms| -|e2e/__tests__/snapshot.test.ts|9✔️|||13.899s| +|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✔️|||2.065s| -|e2e/__tests__/stackTrace.test.ts|7✔️|||4.725s| +|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✔️|||2.185s| -|e2e/__tests__/stackTraceSourceMapsWithCoverage.test.ts|1✔️|||2.444s| +|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✔️|||1.628s| -|e2e/__tests__/testEnvironmentAsync.test.ts|1✔️|||1.493s| -|e2e/__tests__/testEnvironmentCircus.test.ts|1✔️|||1.501s| -|e2e/__tests__/testEnvironmentCircusAsync.test.ts|1✔️|||1.507s| -|e2e/__tests__/testFailureExitCode.test.ts|2✔️|||4.476s| -|e2e/__tests__/testInRoot.test.ts|1✔️|||1.009s| +|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✔️|||3.076s| +|e2e/__tests__/testPathPatternReporterMessage.test.ts|1✔️|||3s| |e2e/__tests__/testResultsProcessor.test.ts|1✔️|||910ms| -|e2e/__tests__/testRetries.test.ts|4✔️|||3.277s| -|e2e/__tests__/testTodo.test.ts|5✔️|||3.573s| -|e2e/__tests__/timeouts.test.ts|4✔️|||4.029s| +|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✔️|||1.878s| -|e2e/__tests__/timerUseRealTimers.test.ts|1✔️|||1.018s| -|e2e/__tests__/toMatchInlineSnapshot.test.ts|12✔️|||23.917s| -|e2e/__tests__/toMatchInlineSnapshotWithRetries.test.ts|3✔️|||4.670s| -|e2e/__tests__/toMatchSnapshot.test.ts|9✔️|||17.025s| -|e2e/__tests__/toMatchSnapshotWithRetries.test.ts|2✔️|||4.435s| -|e2e/__tests__/toMatchSnapshotWithStringSerializer.test.ts|3✔️|||3.544s| -|e2e/__tests__/toThrowErrorMatchingInlineSnapshot.test.ts|4✔️|||3.562s| -|e2e/__tests__/toThrowErrorMatchingSnapshot.test.ts|5✔️|||3.524s| -|e2e/__tests__/transform.test.ts|16✔️|||26.740s| +|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✔️|||2.893s| -|e2e/__tests__/unexpectedToken.test.ts|3✔️|||3.411s| -|e2e/__tests__/useStderr.test.ts|1✔️|||1.352s| -|e2e/__tests__/v8Coverage.test.ts|2✔️|||2.412s| +|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✔️|||4.370s| -|e2e/__tests__/watchModeOnlyFailed.test.ts|1✔️|||1.394s| -|e2e/__tests__/watchModePatterns.test.ts|2✔️|||3.503s| -|e2e/__tests__/watchModeUpdateSnapshot.test.ts|1✔️|||1.075s| -|e2e/__tests__/workerForceExit.test.ts|2✔️|||4.751s| -|e2e/__tests__/wrongEnv.test.ts|5✔️|||3.877s| +|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| @@ -206,7 +206,7 @@ |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✔️|||8.559s| +|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| @@ -228,7 +228,7 @@ |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✔️|||1.062s| +|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| @@ -237,11 +237,11 @@ |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✔️|||5.755s| -|packages/jest-circus/src/__tests__/baseTest.test.ts|2✔️|||2.902s| +|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✔️|||3.762s| +|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| @@ -261,12 +261,12 @@ |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✔️|||2.596s| +|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✔️|||6.755s| -|packages/jest-core/src/__tests__/watchFileChanges.test.ts|1✔️|||1.514s| +|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| @@ -289,7 +289,7 @@ |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✔️|||1.145s| +|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| @@ -318,12 +318,12 @@ |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✔️|||1.172s| -|packages/jest-repl/src/__tests__/runtime_cli.test.js|4✔️|||4.094s| +|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✔️|||1.129s| +|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| @@ -334,7 +334,7 @@ |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✔️|||1.308s| +|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| @@ -344,31 +344,31 @@ |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✔️|||1.088s| +|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✔️|||2.366s| -|packages/jest-runtime/src/__tests__/runtime_require_module_or_mock.test.js|17✔️|||1.223s| -|packages/jest-runtime/src/__tests__/runtime_require_module.test.js|27✔️|||2.439s| +|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✔️|||1.149s| +|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✔️|||1.188s| +|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✔️|||1.660s| +|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| @@ -403,32 +403,30 @@ |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 ❌ -**10** tests were completed in **9.045s** with **9** passed, **1** failed and **0** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✔️|gets hg SCM roots and dedupes them|559ms| -|✔️|gets git SCM roots and dedupes them|416ms| -|✔️|gets mixed git and hg SCM roots and dedupes them|467ms| -|✔️|gets changed files for git|2.298s| -|✔️|monitors only root paths for git|151ms| -|✔️|does not find changes in files with no diff, for git|628ms| -|✔️|handles a bad revision for "changedSince", for git|878ms| -|❌|gets changed files for hg|2.219s| -|✔️|monitors only root paths for hg|281ms| -|✔️|handles a bad revision for "changedSince", for hg|949ms| -### e2e/__tests__/onlyChanged.test.ts ❌ -**9** tests were completed in **22.281s** with **8** passed, **1** failed and **0** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✔️|run for "onlyChanged" and "changedSince"|1.464s| -|✔️|run only changed files|5.196s| -|✔️|report test coverage for only changed files|1.889s| -|✔️|report test coverage of source on test file change under only changed files|822ms| -|✔️|do not pickup non-tested files when reporting coverage on only changed files|861ms| -|✔️|collect test coverage when using onlyChanged|1.058s| -|✔️|onlyChanged in config is overwritten by --all or testPathPattern|7.023s| -|❌|gets changed files for hg|3.765s| -|✔️|path on Windows is case-insensitive|0ms| \ No newline at end of file +### ❌ e2e/__tests__/jestChangedFiles.test.ts +``` +✔️ gets hg SCM roots and dedupes them +✔️ gets git SCM roots and dedupes them +✔️ gets mixed git and hg SCM roots and dedupes them +✔️ gets changed files for git +✔️ monitors only root paths for git +✔️ does not find changes in files with no diff, for git +✔️ handles a bad revision for "changedSince", for git +❌ gets changed files for hg + Error: abort: empty revision range +✔️ monitors only root paths for hg +✔️ handles a bad revision for "changedSince", for hg +``` +### ❌ e2e/__tests__/onlyChanged.test.ts +``` +✔️ run for "onlyChanged" and "changedSince" +✔️ run only changed files +✔️ report test coverage for only changed files +✔️ report test coverage of source on test file change under only changed files +✔️ do not pickup non-tested files when reporting coverage on only changed files +✔️ collect test coverage when using onlyChanged +✔️ onlyChanged in config is overwritten by --all or testPathPattern +❌ gets changed files for hg + Error: expect(received).toMatch(expected) +✔️ path on Windows is case-insensitive +``` \ No newline at end of file diff --git a/__tests__/__outputs__/mocha-json.md b/__tests__/__outputs__/mocha-json.md new file mode 100644 index 00000000..9eadcaed --- /dev/null +++ b/__tests__/__outputs__/mocha-json.md @@ -0,0 +1,29 @@ +![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical) +## ❌ 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 1 + ✔️ Passing test +Test 1 Test 1.1 + ❌ Exception in target unit + Some error + ❌ Failing test + Expected values to be strictly equal: + + false !== true + +Test 2 + ❌ Exception in test + Some error +``` +### ❌ test/second.test.js +``` +✖️ Skipped test +❌ Timeout test + Timeout of 1ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (C:\Users\Michal\Workspace\dorny\test-reporter\reports\mocha\test\second.test.js) +``` \ No newline at end of file diff --git a/__tests__/__outputs__/mocha-test-results.md b/__tests__/__outputs__/mocha-test-results.md new file mode 100644 index 00000000..fd85859e --- /dev/null +++ b/__tests__/__outputs__/mocha-test-results.md @@ -0,0 +1,41 @@ +![Tests passed successfully](https://img.shields.io/badge/tests-833%20passed%2C%206%20skipped-success) +## ✔️ 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 diff --git a/__tests__/__outputs__/provider-test-results.md b/__tests__/__outputs__/provider-test-results.md index 056452d0..79b13aab 100644 --- a/__tests__/__outputs__/provider-test-results.md +++ b/__tests__/__outputs__/provider-test-results.md @@ -1,5 +1,5 @@ ![Tests failed](https://img.shields.io/badge/tests-268%20passed%2C%201%20failed-critical) -## fixtures/external/flutter/provider-test-results.json ❌ +## ❌ 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| |:---|---:|---:|---:|---:| @@ -8,7 +8,7 @@ |[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✔️|||1.117s| +|[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| @@ -19,455 +19,356 @@ |[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 ✔️ -**24** tests were completed in **402ms** with **24** passed, **0** failed and **0** skipped. - -**ChangeNotifierProvider** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|default|189ms| -|✔️|.value|10ms| - -**ListenableProvider** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|default|9ms| -|✔️|.value|16ms| - -**Provider** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|default|11ms| -|✔️|.value|8ms| - -**ProxyProvider** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|0|11ms| -|✔️|1|10ms| -|✔️|2|8ms| -|✔️|3|10ms| -|✔️|4|9ms| -|✔️|5|9ms| -|✔️|6|9ms| - -**MultiProvider** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|with 1 ChangeNotifierProvider default|9ms| -|✔️|with 2 ChangeNotifierProvider default|9ms| -|✔️|with ListenableProvider default|12ms| -|✔️|with Provider default|8ms| -|✔️|with ProxyProvider0|7ms| -|✔️|with ProxyProvider1|9ms| -|✔️|with ProxyProvider2|7ms| -|✔️|with ProxyProvider3|9ms| -|✔️|with ProxyProvider4|9ms| -|✔️|with ProxyProvider5|7ms| -|✔️|with ProxyProvider6|7ms| -### test/change_notifier_provider_test.dart ✔️ -**10** tests were completed in **306ms** with **10** passed, **0** failed and **0** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✔️|Use builder property, not child|10ms| - -**ChangeNotifierProvider** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|value|185ms| -|✔️|builder|18ms| -|✔️|builder1|12ms| -|✔️|builder2|12ms| -|✔️|builder3|19ms| -|✔️|builder4|14ms| -|✔️|builder5|15ms| -|✔️|builder6|11ms| -|✔️|builder0|10ms| -### test/consumer_test.dart ✔️ -**18** tests were completed in **340ms** with **18** passed, **0** failed and **0** skipped. - -**consumer** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|obtains value from Provider|181ms| -|✔️|crashed with no builder|11ms| -|✔️|can be used inside MultiProvider|16ms| - -**consumer2** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|obtains value from Provider|22ms| -|✔️|crashed with no builder|8ms| -|✔️|can be used inside MultiProvider|9ms| - -**consumer3** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|obtains value from Provider|9ms| -|✔️|crashed with no builder|7ms| -|✔️|can be used inside MultiProvider|8ms| - -**consumer4** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|obtains value from Provider|8ms| -|✔️|crashed with no builder|6ms| -|✔️|can be used inside MultiProvider|8ms| - -**consumer5** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|obtains value from Provider|8ms| -|✔️|crashed with no builder|6ms| -|✔️|can be used inside MultiProvider|9ms| - -**consumer6** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|obtains value from Provider|8ms| -|✔️|crashed with no builder|8ms| -|✔️|can be used inside MultiProvider|8ms| -### test/context_test.dart ✔️ -**31** tests were completed in **698ms** with **31** passed, **0** failed and **0** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✔️|watch in layoutbuilder|179ms| -|✔️|select in layoutbuilder|12ms| -|✔️|cannot select in listView|138ms| -|✔️|watch in listView|33ms| -|✔️|watch in gridView|21ms| -|✔️|clears select dependencies for all dependents|19ms| - -**BuildContext** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|internal selected value is updated|32ms| -|✔️|create can use read without being lazy|11ms| -|✔️|watch can be used inside InheritedProvider.update|10ms| -|✔️|select doesn't fail if it loads a provider that depends on other providers|9ms| -|✔️|don't call old selectors if the child rebuilds individually|21ms| -|✔️|selects throws inside click handlers|40ms| -|✔️|select throws if try to read dynamic|9ms| -|✔️|select throws ProviderNotFoundException|9ms| -|✔️|select throws if watch called inside the callback from build|6ms| -|✔️|select throws if read called inside the callback from build|9ms| -|✔️|select throws if select called inside the callback from build|8ms| -|✔️|select throws if read called inside the callback on dependency change|10ms| -|✔️|select throws if watch called inside the callback on dependency change|17ms| -|✔️|select throws if select called inside the callback on dependency change|9ms| -|✔️|can call read inside didChangeDependencies|9ms| -|✔️|select cannot be called inside didChangeDependencies|6ms| -|✔️|select in initState throws|6ms| -|✔️|watch in initState throws|10ms| -|✔️|read in initState works|6ms| -|✔️|consumer can be removed and selector stops to be called|7ms| -|✔️|context.select deeply compares maps|15ms| -|✔️|context.select deeply compares lists|8ms| -|✔️|context.select deeply compares iterables|8ms| -|✔️|context.select deeply compares sets|11ms| -|✔️|context.watch listens to value changes|10ms| -### test/future_provider_test.dart ✔️ -**10** tests were completed in **305ms** with **10** passed, **0** failed and **0** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✔️|works with MultiProvider|184ms| -|✔️|(catchError) previous future completes after transition is no-op|16ms| -|✔️|previous future completes after transition is no-op|15ms| -|✔️|transition from future to future preserve state|12ms| -|✔️|throws if future has error and catchError is missing|24ms| -|✔️|calls catchError if present and future has error|21ms| -|✔️|works with null|14ms| -|✔️|create and dispose future with builder|12ms| -|✔️|FutureProvider() crashes if builder is null|4ms| - -**FutureProvider()** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|crashes if builder is null|3ms| -### test/inherited_provider_test.dart ✔️ -**81** tests were completed in **1.117s** with **81** passed, **0** failed and **0** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✔️|regression test #377|167ms| -|✔️|rebuild on dependency flags update|15ms| -|✔️|properly update debug flags if a create triggers another deferred create|9ms| -|✔️|properly update debug flags if a create triggers another deferred create|8ms| -|✔️|properly update debug flags if an update triggers another create/update|7ms| -|✔️|properly update debug flags if a create triggers another create/update|8ms| -|✔️|Provider.of(listen: false) outside of build works when it loads a provider|22ms| -|✔️|new value is available in didChangeDependencies|26ms| -|✔️|builder receives the current value and updates independently from `update`|16ms| -|✔️|builder can _not_ rebuild when provider updates|8ms| -|✔️|builder rebuilds if provider is recreated|9ms| -|✔️|provider.of throws if listen:true outside of the widget tree|23ms| -|✔️|InheritedProvider throws if no child is provided with default constructor|14ms| -|✔️|InheritedProvider throws if no child is provided with value constructor|8ms| -|✔️|DeferredInheritedProvider throws if no child is provided with default constructor|15ms| -|✔️|DeferredInheritedProvider throws if no child is provided with value constructor|7ms| -|✔️|startListening markNeedsNotifyDependents|7ms| -|✔️|InheritedProvider can be subclassed|8ms| -|✔️|DeferredInheritedProvider can be subclassed|7ms| -|✔️|can be used with MultiProvider|8ms| -|✔️|throw if the widget ctor changes|8ms| -|✔️|InheritedProvider lazy loading can be disabled|6ms| -|✔️|InheritedProvider.value lazy loading can be disabled|9ms| -|✔️|InheritedProvider subclass don't have to specify default lazy value|7ms| -|✔️|DeferredInheritedProvider lazy loading can be disabled|7ms| -|✔️|DeferredInheritedProvider.value lazy loading can be disabled|7ms| -|✔️|selector|14ms| -|✔️|can select multiple types from same provider|9ms| -|✔️|can select same type on two different providers|8ms| -|✔️|can select same type twice on same provider|10ms| -|✔️|Provider.of has a proper error message if context is null|6ms| - -**diagnostics** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|InheritedProvider.value|11ms| -|✔️|InheritedProvider doesn't break lazy loading|7ms| -|✔️|InheritedProvider show if listening|7ms| -|✔️|DeferredInheritedProvider.value|6ms| -|✔️|DeferredInheritedProvider|16ms| - -**InheritedProvider.value()** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|markNeedsNotifyDependents during startListening is noop|8ms| -|✔️|startListening called again when create returns new value|27ms| -|✔️|startListening|19ms| -|✔️|stopListening not called twice if rebuild doesn't have listeners|16ms| -|✔️|removeListener cannot be null|22ms| -|✔️|pass down current value|17ms| -|✔️|default updateShouldNotify|8ms| -|✔️|custom updateShouldNotify|32ms| - -**InheritedProvider()** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|hasValue|16ms| -|✔️|provider calls update if rebuilding only due to didChangeDependencies|9ms| -|✔️|provider notifying dependents doesn't call update|11ms| -|✔️|update can call Provider.of with listen:true|7ms| -|✔️|update lazy loaded can call Provider.of with listen:true|10ms| -|✔️|markNeedsNotifyDependents during startListening is noop|22ms| -|✔️|update can obtain parent of the same type than self|15ms| -|✔️|_debugCheckInvalidValueType|22ms| -|✔️|startListening|18ms| -|✔️|startListening called again when create returns new value|20ms| -|✔️|stopListening not called twice if rebuild doesn't have listeners|18ms| -|✔️|removeListener cannot be null|16ms| -|✔️|fails if initialValueBuilder calls inheritFromElement/inheritFromWiggetOfExactType|17ms| -|✔️|builder is called on every rebuild and after a dependency change|11ms| -|✔️|builder with no updateShouldNotify use ==|8ms| -|✔️|builder calls updateShouldNotify callback|8ms| -|✔️|initialValue is transmitted to valueBuilder|8ms| -|✔️|calls builder again if dependencies change|22ms| -|✔️|exposes initialValue if valueBuilder is null|20ms| -|✔️|call dispose on unmount|22ms| -|✔️|builder unmount, dispose not called if value never read|11ms| -|✔️|call dispose after new value|9ms| -|✔️|valueBuilder works without initialBuilder|11ms| -|✔️|calls initialValueBuilder lazily once|7ms| -|✔️|throws if both builder and initialBuilder are missing|5ms| - -**DeferredInheritedProvider.value()** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|hasValue|6ms| -|✔️|startListening|9ms| -|✔️|stopListening cannot be null|9ms| -|✔️|startListening doesn't need setState if already initialized|8ms| -|✔️|setState without updateShouldNotify|8ms| -|✔️|setState with updateShouldNotify|9ms| -|✔️|startListening never leave the widget uninitialized|8ms| -|✔️|startListening called again on controller change|10ms| - -**DeferredInheritedProvider()** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|create can't call inherited widgets|7ms| -|✔️|creates the value lazily|7ms| -|✔️|dispose|7ms| -|✔️|dispose no-op if never built|7ms| -### test/listenable_provider_test.dart ✔️ -**16** tests were completed in **353ms** with **16** passed, **0** failed and **0** skipped. - -**ListenableProvider** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|works with MultiProvider|173ms| -|✔️|asserts that the created notifier can have listeners|12ms| -|✔️|don't listen again if listenable instance doesn't change|12ms| -|✔️|works with null (default)|7ms| -|✔️|works with null (create)|7ms| -|✔️|stateful create called once|11ms| -|✔️|dispose called on unmount|13ms| -|✔️|dispose can be null|8ms| -|✔️|changing listenable rebuilds descendants|12ms| -|✔️|rebuilding with the same provider don't rebuilds descendants|11ms| -|✔️|notifylistener rebuilds descendants|9ms| - -**ListenableProvider value constructor** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|pass down key|17ms| -|✔️|changing the Listenable instance rebuilds dependents|29ms| - -**ListenableProvider stateful constructor** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|called with context|8ms| -|✔️|pass down key|20ms| -|✔️|throws if create is null|4ms| -### test/listenable_proxy_provider_test.dart ✔️ -**12** tests were completed in **373ms** with **12** passed, **0** failed and **0** skipped. - -**ListenableProxyProvider** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|throws if update is missing|43ms| -|✔️|asserts that the created notifier has no listener|177ms| -|✔️|asserts that the created notifier has no listener after rebuild|18ms| -|✔️|rebuilds dependendents when listeners are called|20ms| -|✔️|update returning a new Listenable disposes the previously created value and update dependents|25ms| -|✔️|disposes of created value|13ms| - -**ListenableProxyProvider variants** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|ListenableProxyProvider|13ms| -|✔️|ListenableProxyProvider2|9ms| -|✔️|ListenableProxyProvider3|9ms| -|✔️|ListenableProxyProvider4|17ms| -|✔️|ListenableProxyProvider5|12ms| -|✔️|ListenableProxyProvider6|17ms| -### test/multi_provider_test.dart ✔️ -**3** tests were completed in **198ms** with **3** passed, **0** failed and **0** skipped. - -**MultiProvider** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|throw if providers is null|30ms| -|✔️|MultiProvider children can only access parent providers|160ms| -|✔️|MultiProvider.providers with ignored child|8ms| -### test/provider_test.dart ✔️ -**11** tests were completed in **306ms** with **11** passed, **0** failed and **0** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✔️|works with MultiProvider|172ms| - -**Provider.of** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|throws if T is dynamic|26ms| -|✔️|listen defaults to true when building widgets|13ms| -|✔️|listen defaults to false outside of the widget tree|9ms| -|✔️|listen:false doesn't trigger rebuild|10ms| -|✔️|listen:true outside of the widget tree throws|11ms| - -**Provider** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|throws if the provided value is a Listenable/Stream|28ms| -|✔️|debugCheckInvalidValueType can be disabled|9ms| -|✔️|simple usage|9ms| -|✔️|throws an error if no provider found|11ms| -|✔️|update should notify|8ms| -### test/proxy_provider_test.dart ✔️ -**16** tests were completed in **438ms** with **16** passed, **0** failed and **0** skipped. - -**ProxyProvider** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|throws if the provided value is a Listenable/Stream|209ms| -|✔️|debugCheckInvalidValueType can be disabled|13ms| -|✔️|create creates initial value|23ms| -|✔️|consume another providers|18ms| -|✔️|rebuild descendants if value change|13ms| -|✔️|call dispose when unmounted with the latest result|11ms| -|✔️|don't rebuild descendants if value doesn't change|12ms| -|✔️|pass down updateShouldNotify|19ms| -|✔️|works with MultiProvider|16ms| -|✔️|update callback can trigger descendants setState synchronously|24ms| -|✔️|throws if update is null|7ms| - -**ProxyProvider variants** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|ProxyProvider2|18ms| -|✔️|ProxyProvider3|16ms| -|✔️|ProxyProvider4|9ms| -|✔️|ProxyProvider5|20ms| -|✔️|ProxyProvider6|10ms| -### test/reassemble_test.dart ✔️ -**3** tests were completed in **221ms** with **3** passed, **0** failed and **0** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✔️|ReassembleHandler|194ms| -|✔️|unevaluated create|11ms| -|✔️|unevaluated create|16ms| -### test/selector_test.dart ✔️ -**17** tests were completed in **364ms** with **17** passed, **0** failed and **0** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✔️|asserts that builder/selector are not null|32ms| -|✔️|Deep compare maps by default|158ms| -|✔️|Deep compare iterables by default|9ms| -|✔️|Deep compare sets by default|12ms| -|✔️|Deep compare lists by default|14ms| -|✔️|custom shouldRebuid|11ms| -|✔️|passes `child` and `key`|13ms| -|✔️|calls builder if the callback changes|14ms| -|✔️|works with MultiProvider|12ms| -|✔️|don't call builder again if it rebuilds but selector returns the same thing|9ms| -|✔️|call builder again if it rebuilds abd selector returns the a different variable|9ms| -|✔️|Selector|15ms| -|✔️|Selector2|9ms| -|✔️|Selector3|8ms| -|✔️|Selector4|9ms| -|✔️|Selector5|19ms| -|✔️|Selector6|11ms| -### test/stateful_provider_test.dart ✔️ -**4** tests were completed in **254ms** with **4** passed, **0** failed and **0** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✔️|asserts|6ms| -|✔️|works with MultiProvider|203ms| -|✔️|calls create only once|27ms| -|✔️|dispose|18ms| -### test/stream_provider_test.dart ✔️ -**8** tests were completed in **282ms** with **8** passed, **0** failed and **0** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✔️|works with MultiProvider|191ms| -|✔️|transition from stream to stream preserve state|16ms| -|✔️|throws if stream has error and catchError is missing|22ms| -|✔️|calls catchError if present and stream has error|20ms| -|✔️|works with null|13ms| -|✔️|StreamProvider() crashes if builder is null|5ms| - -**StreamProvider()** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|create and dispose stream with builder|11ms| -|✔️|crashes if builder is null|4ms| -### test/value_listenable_provider_test.dart ❌ -**5** tests were completed in **327ms** with **4** passed, **1** failed and **0** skipped. - -**valueListenableProvider** -|Result|Test|Time| -|:---:|:---|---:| -|✔️|rebuilds when value change|200ms| -|✔️|don't rebuild dependents by default|26ms| -|✔️|pass keys|10ms| -|✔️|don't listen again if stream instance doesn't change|22ms| -|❌|pass updateShouldNotify|69ms| \ No newline at end of file +### ✔️ test/builder_test.dart +``` +ChangeNotifierProvider + ✔️ default + ✔️ .value +ListenableProvider + ✔️ default + ✔️ .value +Provider + ✔️ default + ✔️ .value +ProxyProvider + ✔️ 0 + ✔️ 1 + ✔️ 2 + ✔️ 3 + ✔️ 4 + ✔️ 5 + ✔️ 6 +MultiProvider + ✔️ with 1 ChangeNotifierProvider default + ✔️ with 2 ChangeNotifierProvider default + ✔️ with ListenableProvider default + ✔️ with Provider default + ✔️ with ProxyProvider0 + ✔️ with ProxyProvider1 + ✔️ with ProxyProvider2 + ✔️ with ProxyProvider3 + ✔️ with ProxyProvider4 + ✔️ with ProxyProvider5 + ✔️ with ProxyProvider6 +``` +### ✔️ test/change_notifier_provider_test.dart +``` +✔️ Use builder property, not child +ChangeNotifierProvider + ✔️ value + ✔️ builder + ✔️ builder1 + ✔️ builder2 + ✔️ builder3 + ✔️ builder4 + ✔️ builder5 + ✔️ builder6 + ✔️ builder0 +``` +### ✔️ test/consumer_test.dart +``` +consumer + ✔️ obtains value from Provider + ✔️ crashed with no builder + ✔️ can be used inside MultiProvider +consumer2 + ✔️ obtains value from Provider + ✔️ crashed with no builder + ✔️ can be used inside MultiProvider +consumer3 + ✔️ obtains value from Provider + ✔️ crashed with no builder + ✔️ can be used inside MultiProvider +consumer4 + ✔️ obtains value from Provider + ✔️ crashed with no builder + ✔️ can be used inside MultiProvider +consumer5 + ✔️ obtains value from Provider + ✔️ crashed with no builder + ✔️ can be used inside MultiProvider +consumer6 + ✔️ obtains value from Provider + ✔️ crashed with no builder + ✔️ can be used inside MultiProvider +``` +### ✔️ test/context_test.dart +``` +✔️ watch in layoutbuilder +✔️ select in layoutbuilder +✔️ cannot select in listView +✔️ watch in listView +✔️ watch in gridView +✔️ clears select dependencies for all dependents +BuildContext + ✔️ internal selected value is updated + ✔️ create can use read without being lazy + ✔️ watch can be used inside InheritedProvider.update + ✔️ select doesn't fail if it loads a provider that depends on other providers + ✔️ don't call old selectors if the child rebuilds individually + ✔️ selects throws inside click handlers + ✔️ select throws if try to read dynamic + ✔️ select throws ProviderNotFoundException + ✔️ select throws if watch called inside the callback from build + ✔️ select throws if read called inside the callback from build + ✔️ select throws if select called inside the callback from build + ✔️ select throws if read called inside the callback on dependency change + ✔️ select throws if watch called inside the callback on dependency change + ✔️ select throws if select called inside the callback on dependency change + ✔️ can call read inside didChangeDependencies + ✔️ select cannot be called inside didChangeDependencies + ✔️ select in initState throws + ✔️ watch in initState throws + ✔️ read in initState works + ✔️ consumer can be removed and selector stops to be called + ✔️ context.select deeply compares maps + ✔️ context.select deeply compares lists + ✔️ context.select deeply compares iterables + ✔️ context.select deeply compares sets + ✔️ context.watch listens to value changes +``` +### ✔️ test/future_provider_test.dart +``` +✔️ works with MultiProvider +✔️ (catchError) previous future completes after transition is no-op +✔️ previous future completes after transition is no-op +✔️ transition from future to future preserve state +✔️ throws if future has error and catchError is missing +✔️ calls catchError if present and future has error +✔️ works with null +✔️ create and dispose future with builder +✔️ FutureProvider() crashes if builder is null +FutureProvider() + ✔️ crashes if builder is null +``` +### ✔️ test/inherited_provider_test.dart +``` +✔️ regression test #377 +✔️ rebuild on dependency flags update +✔️ properly update debug flags if a create triggers another deferred create +✔️ properly update debug flags if a create triggers another deferred create +✔️ properly update debug flags if an update triggers another create/update +✔️ properly update debug flags if a create triggers another create/update +✔️ Provider.of(listen: false) outside of build works when it loads a provider +✔️ new value is available in didChangeDependencies +✔️ builder receives the current value and updates independently from `update` +✔️ builder can _not_ rebuild when provider updates +✔️ builder rebuilds if provider is recreated +✔️ provider.of throws if listen:true outside of the widget tree +✔️ InheritedProvider throws if no child is provided with default constructor +✔️ InheritedProvider throws if no child is provided with value constructor +✔️ DeferredInheritedProvider throws if no child is provided with default constructor +✔️ DeferredInheritedProvider throws if no child is provided with value constructor +✔️ startListening markNeedsNotifyDependents +✔️ InheritedProvider can be subclassed +✔️ DeferredInheritedProvider can be subclassed +✔️ can be used with MultiProvider +✔️ throw if the widget ctor changes +✔️ InheritedProvider lazy loading can be disabled +✔️ InheritedProvider.value lazy loading can be disabled +✔️ InheritedProvider subclass don't have to specify default lazy value +✔️ DeferredInheritedProvider lazy loading can be disabled +✔️ DeferredInheritedProvider.value lazy loading can be disabled +✔️ selector +✔️ can select multiple types from same provider +✔️ can select same type on two different providers +✔️ can select same type twice on same provider +✔️ Provider.of has a proper error message if context is null +diagnostics + ✔️ InheritedProvider.value + ✔️ InheritedProvider doesn't break lazy loading + ✔️ InheritedProvider show if listening + ✔️ DeferredInheritedProvider.value + ✔️ DeferredInheritedProvider +InheritedProvider.value() + ✔️ markNeedsNotifyDependents during startListening is noop + ✔️ startListening called again when create returns new value + ✔️ startListening + ✔️ stopListening not called twice if rebuild doesn't have listeners + ✔️ removeListener cannot be null + ✔️ pass down current value + ✔️ default updateShouldNotify + ✔️ custom updateShouldNotify +InheritedProvider() + ✔️ hasValue + ✔️ provider calls update if rebuilding only due to didChangeDependencies + ✔️ provider notifying dependents doesn't call update + ✔️ update can call Provider.of with listen:true + ✔️ update lazy loaded can call Provider.of with listen:true + ✔️ markNeedsNotifyDependents during startListening is noop + ✔️ update can obtain parent of the same type than self + ✔️ _debugCheckInvalidValueType + ✔️ startListening + ✔️ startListening called again when create returns new value + ✔️ stopListening not called twice if rebuild doesn't have listeners + ✔️ removeListener cannot be null + ✔️ fails if initialValueBuilder calls inheritFromElement/inheritFromWiggetOfExactType + ✔️ builder is called on every rebuild and after a dependency change + ✔️ builder with no updateShouldNotify use == + ✔️ builder calls updateShouldNotify callback + ✔️ initialValue is transmitted to valueBuilder + ✔️ calls builder again if dependencies change + ✔️ exposes initialValue if valueBuilder is null + ✔️ call dispose on unmount + ✔️ builder unmount, dispose not called if value never read + ✔️ call dispose after new value + ✔️ valueBuilder works without initialBuilder + ✔️ calls initialValueBuilder lazily once + ✔️ throws if both builder and initialBuilder are missing +DeferredInheritedProvider.value() + ✔️ hasValue + ✔️ startListening + ✔️ stopListening cannot be null + ✔️ startListening doesn't need setState if already initialized + ✔️ setState without updateShouldNotify + ✔️ setState with updateShouldNotify + ✔️ startListening never leave the widget uninitialized + ✔️ startListening called again on controller change +DeferredInheritedProvider() + ✔️ create can't call inherited widgets + ✔️ creates the value lazily + ✔️ dispose + ✔️ dispose no-op if never built +``` +### ✔️ test/listenable_provider_test.dart +``` +ListenableProvider + ✔️ works with MultiProvider + ✔️ asserts that the created notifier can have listeners + ✔️ don't listen again if listenable instance doesn't change + ✔️ works with null (default) + ✔️ works with null (create) + ✔️ stateful create called once + ✔️ dispose called on unmount + ✔️ dispose can be null + ✔️ changing listenable rebuilds descendants + ✔️ rebuilding with the same provider don't rebuilds descendants + ✔️ notifylistener rebuilds descendants +ListenableProvider value constructor + ✔️ pass down key + ✔️ changing the Listenable instance rebuilds dependents +ListenableProvider stateful constructor + ✔️ called with context + ✔️ pass down key + ✔️ throws if create is null +``` +### ✔️ test/listenable_proxy_provider_test.dart +``` +ListenableProxyProvider + ✔️ throws if update is missing + ✔️ asserts that the created notifier has no listener + ✔️ asserts that the created notifier has no listener after rebuild + ✔️ rebuilds dependendents when listeners are called + ✔️ update returning a new Listenable disposes the previously created value and update dependents + ✔️ disposes of created value +ListenableProxyProvider variants + ✔️ ListenableProxyProvider + ✔️ ListenableProxyProvider2 + ✔️ ListenableProxyProvider3 + ✔️ ListenableProxyProvider4 + ✔️ ListenableProxyProvider5 + ✔️ ListenableProxyProvider6 +``` +### ✔️ 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 +``` +✔️ works with MultiProvider +Provider.of + ✔️ throws if T is dynamic + ✔️ listen defaults to true when building widgets + ✔️ listen defaults to false outside of the widget tree + ✔️ listen:false doesn't trigger rebuild + ✔️ listen:true outside of the widget tree throws +Provider + ✔️ throws if the provided value is a Listenable/Stream + ✔️ debugCheckInvalidValueType can be disabled + ✔️ simple usage + ✔️ throws an error if no provider found + ✔️ update should notify +``` +### ✔️ test/proxy_provider_test.dart +``` +ProxyProvider + ✔️ throws if the provided value is a Listenable/Stream + ✔️ debugCheckInvalidValueType can be disabled + ✔️ create creates initial value + ✔️ consume another providers + ✔️ rebuild descendants if value change + ✔️ call dispose when unmounted with the latest result + ✔️ don't rebuild descendants if value doesn't change + ✔️ pass down updateShouldNotify + ✔️ works with MultiProvider + ✔️ update callback can trigger descendants setState synchronously + ✔️ throws if update is null +ProxyProvider variants + ✔️ ProxyProvider2 + ✔️ ProxyProvider3 + ✔️ ProxyProvider4 + ✔️ ProxyProvider5 + ✔️ ProxyProvider6 +``` +### ✔️ test/reassemble_test.dart +``` +✔️ ReassembleHandler +✔️ unevaluated create +✔️ unevaluated create +``` +### ✔️ test/selector_test.dart +``` +✔️ asserts that builder/selector are not null +✔️ Deep compare maps by default +✔️ Deep compare iterables by default +✔️ Deep compare sets by default +✔️ Deep compare lists by default +✔️ custom shouldRebuid +✔️ passes `child` and `key` +✔️ calls builder if the callback changes +✔️ works with MultiProvider +✔️ don't call builder again if it rebuilds but selector returns the same thing +✔️ call builder again if it rebuilds abd selector returns the a different variable +✔️ Selector +✔️ Selector2 +✔️ Selector3 +✔️ Selector4 +✔️ Selector5 +✔️ Selector6 +``` +### ✔️ test/stateful_provider_test.dart +``` +✔️ asserts +✔️ works with MultiProvider +✔️ calls create only once +✔️ dispose +``` +### ✔️ test/stream_provider_test.dart +``` +✔️ works with MultiProvider +✔️ transition from stream to stream preserve state +✔️ throws if stream has error and catchError is missing +✔️ calls catchError if present and stream has error +✔️ works with null +✔️ StreamProvider() crashes if builder is null +StreamProvider() + ✔️ create and dispose stream with builder + ✔️ crashes if builder is null +``` +### ❌ test/value_listenable_provider_test.dart +``` +valueListenableProvider + ✔️ rebuilds when value change + ✔️ don't rebuild dependents by default + ✔️ pass keys + ✔️ don't listen again if stream instance doesn't change + ❌ pass updateShouldNotify + The following TestFailure object was thrown running a test: + Expected: <2> + Actual: <1> + Unexpected number of calls + +``` \ No newline at end of file diff --git a/__tests__/__outputs__/pulsar-test-results-no-merge.md b/__tests__/__outputs__/pulsar-test-results-no-merge.md index 627b0fd5..dbf76010 100644 --- a/__tests__/__outputs__/pulsar-test-results-no-merge.md +++ b/__tests__/__outputs__/pulsar-test-results-no-merge.md @@ -1,13 +1,12 @@ ![Tests failed](https://img.shields.io/badge/tests-1%20failed%2C%201%20skipped-critical) -## fixtures/external/java/TEST-org.apache.pulsar.AddMissingPatchVersionTest.xml ❌ +## ❌ 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 ❌ -**2** tests were completed in **116ms** with **0** passed, **1** failed and **1** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✖️|testVersionStrings|99ms| -|❌|testVersionStrings|17ms| \ No newline at end of file +### ❌ org.apache.pulsar.AddMissingPatchVersionTest +``` +✖️ testVersionStrings +❌ testVersionStrings + java.lang.AssertionError: expected [1.2.1] but found [1.2.0] +``` \ No newline at end of file diff --git a/__tests__/__outputs__/pulsar-test-results.md b/__tests__/__outputs__/pulsar-test-results.md index ffcd51f2..88e8bead 100644 --- a/__tests__/__outputs__/pulsar-test-results.md +++ b/__tests__/__outputs__/pulsar-test-results.md @@ -1,188 +1,1518 @@ ![Tests failed](https://img.shields.io/badge/tests-793%20passed%2C%201%20failed%2C%2014%20skipped-critical) -## fixtures/external/java/pulsar-test-report.xml ❌ -**808** tests were completed in **2126.531s** with **793** passed, **1** failed and **14** skipped. +## ❌ 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|7✔️|||18.584s| -|org.apache.pulsar.broker.auth.AuthenticationServiceTest|2✔️|||185ms| -|org.apache.pulsar.broker.auth.AuthLogsTest|2✔️|||1.389s| -|org.apache.pulsar.broker.auth.AuthorizationTest|1✔️|||2.384s| -|org.apache.pulsar.broker.lookup.http.HttpTopicLookupv2Test|4✔️|||1.930s| -|org.apache.pulsar.broker.namespace.NamespaceCreateBundlesTest|2✔️|||33.168s| -|org.apache.pulsar.broker.namespace.NamespaceOwnershipListenerTests|2✔️|||32.357s| -|org.apache.pulsar.broker.namespace.NamespaceServiceTest|10✔️|||75.272s| -|org.apache.pulsar.broker.namespace.NamespaceUnloadingTest|2✔️|||13.704s| -|org.apache.pulsar.broker.namespace.OwnerShipCacheForCurrentServerTest|1✔️|||15.709s| -|org.apache.pulsar.broker.namespace.OwnershipCacheTest|8✔️|||15.750s| -|org.apache.pulsar.broker.protocol.ProtocolHandlersTest|6✔️|||946ms| -|org.apache.pulsar.broker.protocol.ProtocolHandlerUtilsTest|3✔️|||7.398s| -|org.apache.pulsar.broker.protocol.ProtocolHandlerWithClassLoaderTest|1✔️|||15ms| -|org.apache.pulsar.broker.PulsarServiceTest|2✔️|||96ms| -|org.apache.pulsar.broker.service.MessagePublishBufferThrottleTest|3✔️|||13.830s| -|org.apache.pulsar.broker.service.ReplicatorTest|22✔️|||40.154s| -|org.apache.pulsar.broker.service.TopicOwnerTest|8✔️|||114.278s| -|org.apache.pulsar.broker.SLAMonitoringTest|4✔️|||9.185s| -|org.apache.pulsar.broker.stats.BookieClientsStatsGeneratorTest|2✔️|||49ms| -|org.apache.pulsar.broker.stats.ConsumerStatsTest|3✔️|||21.164s| -|org.apache.pulsar.broker.stats.ManagedCursorMetricsTest|1✔️|||281ms| -|org.apache.pulsar.broker.stats.ManagedLedgerMetricsTest|1✔️|||285ms| -|org.apache.pulsar.broker.stats.prometheus.AggregatedNamespaceStatsTest|1✔️|||40ms| -|org.apache.pulsar.broker.stats.PrometheusMetricsTest|15✔️|||83.145s| -|org.apache.pulsar.broker.stats.SubscriptionStatsTest|2✔️|||1.806s| -|org.apache.pulsar.broker.systopic.NamespaceEventsSystemTopicServiceTest|1✔️|||1.043s| -|org.apache.pulsar.broker.transaction.buffer.InMemTransactionBufferReaderTest|3✔️|||28ms| -|org.apache.pulsar.broker.transaction.buffer.TransactionBufferClientTest|4✔️|||93ms| -|org.apache.pulsar.broker.transaction.buffer.TransactionBufferTest|7✔️|||81ms| -|org.apache.pulsar.broker.transaction.buffer.TransactionEntryImplTest|1✔️|||14ms| -|org.apache.pulsar.broker.transaction.buffer.TransactionLowWaterMarkTest|2✔️|||37.577s| -|org.apache.pulsar.broker.transaction.buffer.TransactionStablePositionTest|2✔️||1✖️|49.067s| -|org.apache.pulsar.broker.transaction.coordinator.TransactionCoordinatorClientTest|3✔️|||95ms| -|org.apache.pulsar.broker.transaction.coordinator.TransactionMetaStoreAssignmentTest|1✔️|||1.151s| -|org.apache.pulsar.broker.transaction.pendingack.PendingAckInMemoryDeleteTest|2✔️||1✖️|57.293s| -|org.apache.pulsar.broker.transaction.TransactionConsumeTest|2✔️|||29.646s| -|org.apache.pulsar.broker.web.RestExceptionTest|3✔️|||37ms| -|org.apache.pulsar.broker.web.WebServiceTest|9✔️|||27.442s| -|org.apache.pulsar.client.impl.AdminApiKeyStoreTlsAuthTest|4✔️|||8.297s| -|org.apache.pulsar.client.impl.BatchMessageIdImplSerializationTest|4✔️|||30ms| -|org.apache.pulsar.client.impl.BatchMessageIndexAckDisableTest|4✔️|||13.732s| -|org.apache.pulsar.client.impl.BatchMessageIndexAckTest|5✔️|||43.856s| -|org.apache.pulsar.client.impl.BrokerClientIntegrationTest|15✔️|||148.203s| -|org.apache.pulsar.client.impl.CompactedOutBatchMessageTest|1✔️|||1.385s| -|org.apache.pulsar.client.impl.ConsumerAckResponseTest|1✔️|||549ms| -|org.apache.pulsar.client.impl.ConsumerConfigurationTest|4✔️|||12.164s| -|org.apache.pulsar.client.impl.ConsumerDedupPermitsUpdate|7✔️|||3.522s| -|org.apache.pulsar.client.impl.ConsumerUnsubscribeTest|1✔️|||129ms| -|org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithAuth|3✔️|||23.461s| -|org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithoutAuth|3✔️|||7.675s| -|org.apache.pulsar.client.impl.KeyStoreTlsTest|1✔️|||183ms| -|org.apache.pulsar.client.impl.MessageChecksumTest|3✔️|||46.690s| -|org.apache.pulsar.client.impl.MessageChunkingTest|8✔️||1✖️|73.214s| -|org.apache.pulsar.client.impl.MessageParserTest|2✔️|||5.485s| -|org.apache.pulsar.client.impl.MultiTopicsReaderTest|8✔️|||35.143s| -|org.apache.pulsar.client.impl.NegativeAcksTest|32✔️|||10.662s| -|org.apache.pulsar.client.impl.PatternTopicsConsumerImplTest|11✔️|||62.620s| -|org.apache.pulsar.client.impl.PerMessageUnAcknowledgedRedeliveryTest|5✔️|||33.504s| -|org.apache.pulsar.client.impl.PulsarMultiHostClientTest|3✔️|||15.314s| -|org.apache.pulsar.client.impl.RawMessageSerDeserTest|1✔️|||10ms| -|org.apache.pulsar.client.impl.SchemaDeleteTest|1✔️|||1.937s| -|org.apache.pulsar.client.impl.SequenceIdWithErrorTest|3✔️||2✖️|17.976s| -|org.apache.pulsar.client.impl.TopicDoesNotExistsTest|2✔️|||4.053s| -|org.apache.pulsar.client.impl.TopicFromMessageTest|5✔️|||13.659s| -|org.apache.pulsar.client.impl.TopicsConsumerImplTest|17✔️|||133.445s| -|org.apache.pulsar.client.impl.UnAcknowledgedMessagesTimeoutTest|7✔️|||43.828s| -|org.apache.pulsar.client.impl.ZeroQueueSizeTest|14✔️|||15.712s| -|org.apache.pulsar.common.api.raw.RawMessageImplTest|1✔️|||316ms| -|org.apache.pulsar.common.compression.CommandsTest|1✔️|||30ms| -|org.apache.pulsar.common.compression.CompressorCodecBackwardCompatTest|6✔️|||223ms| -|org.apache.pulsar.common.compression.CompressorCodecTest|45✔️|||737ms| -|org.apache.pulsar.common.compression.Crc32cChecksumTest|6✔️|||5.403s| -|org.apache.pulsar.common.lookup.data.LookupDataTest|4✔️|||1.530s| -|org.apache.pulsar.common.naming.MetadataTests|2✔️|||161ms| -|org.apache.pulsar.common.naming.NamespaceBundlesTest|5✔️|||99ms| -|org.apache.pulsar.common.naming.NamespaceBundleTest|6✔️|||64ms| -|org.apache.pulsar.common.naming.NamespaceNameTest|2✔️|||207ms| -|org.apache.pulsar.common.naming.ServiceConfigurationTest|4✔️|||48ms| -|org.apache.pulsar.common.naming.TopicNameTest|4✔️|||529ms| -|org.apache.pulsar.common.net.ServiceURITest|21✔️|||237ms| -|org.apache.pulsar.common.policies.data.AutoFailoverPolicyDataTest|1✔️|||15ms| -|org.apache.pulsar.common.policies.data.AutoFailoverPolicyTypeTest|1✔️|||19ms| -|org.apache.pulsar.common.policies.data.AutoTopicCreationOverrideTest|6✔️|||64ms| -|org.apache.pulsar.common.policies.data.BacklogQuotaTest|1✔️|||12ms| -|org.apache.pulsar.common.policies.data.ClusterDataTest|1✔️|||9ms| -|org.apache.pulsar.common.policies.data.ConsumerStatsTest|1✔️|||8ms| -|org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfigTest|2✔️|||948ms| -|org.apache.pulsar.common.policies.data.LocalPolicesTest|1✔️|||48ms| -|org.apache.pulsar.common.policies.data.NamespaceIsolationDataTest|1✔️|||76ms| -|org.apache.pulsar.common.policies.data.NamespaceOwnershipStatusTest|1✔️|||45ms| -|org.apache.pulsar.common.policies.data.OffloadPoliciesTest|6✔️|||216ms| -|org.apache.pulsar.common.policies.data.PartitionedTopicStatsTest|1✔️|||12ms| -|org.apache.pulsar.common.policies.data.PersistencePoliciesTest|1✔️|||19ms| -|org.apache.pulsar.common.policies.data.PersistentOfflineTopicStatsTest|1✔️|||29ms| -|org.apache.pulsar.common.policies.data.PersistentTopicStatsTest|2✔️|||51ms| -|org.apache.pulsar.common.policies.data.PoliciesDataTest|4✔️|||1.386s| -|org.apache.pulsar.common.policies.data.PublisherStatsTest|2✔️|||37ms| -|org.apache.pulsar.common.policies.data.ReplicatorStatsTest|2✔️|||30ms| -|org.apache.pulsar.common.policies.data.ResourceQuotaTest|2✔️|||45ms| -|org.apache.pulsar.common.policies.data.RetentionPolicesTest|1✔️|||8ms| -|org.apache.pulsar.common.policies.impl.AutoFailoverPolicyFactoryTest|1✔️|||22ms| -|org.apache.pulsar.common.policies.impl.MinAvailablePolicyTest|1✔️|||1ms| -|org.apache.pulsar.common.policies.impl.NamespaceIsolationPoliciesTest|7✔️|||265ms| -|org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicyImplTest|7✔️|||309ms| -|org.apache.pulsar.common.protocol.ByteBufPairTest|2✔️|||4.999s| -|org.apache.pulsar.common.protocol.CommandUtilsTests|7✔️|||2.812s| -|org.apache.pulsar.common.protocol.MarkersTest|6✔️|||3.233s| -|org.apache.pulsar.common.protocol.PulsarDecoderTest|1✔️|||3.690s| -|org.apache.pulsar.common.stats.JvmDefaultGCMetricsLoggerTest|1✔️|||82ms| -|org.apache.pulsar.common.util.collections.BitSetRecyclableRecyclableTest|2✔️|||13ms| -|org.apache.pulsar.common.util.collections.ConcurrentBitSetRecyclableTest|2✔️|||63ms| -|org.apache.pulsar.common.util.collections.ConcurrentLongHashMapTest|13✔️|||28.351s| -|org.apache.pulsar.common.util.collections.ConcurrentLongPairSetTest|15✔️|||1.519s| -|org.apache.pulsar.common.util.collections.ConcurrentOpenHashMapTest|12✔️|||9.241s| -|org.apache.pulsar.common.util.collections.ConcurrentOpenHashSetTest|11✔️|||7.115s| -|org.apache.pulsar.common.util.collections.ConcurrentOpenLongPairRangeSetTest|13✔️|||1.356s| -|org.apache.pulsar.common.util.collections.ConcurrentSortedLongPairSetTest|9✔️|||342ms| -|org.apache.pulsar.common.util.collections.FieldParserTest|2✔️|||64ms| -|org.apache.pulsar.common.util.collections.GrowableArrayBlockingQueueTest|6✔️|||350ms| -|org.apache.pulsar.common.util.collections.GrowablePriorityLongPairQueueTest|15✔️|||3.093s| -|org.apache.pulsar.common.util.collections.TripleLongPriorityQueueTest|3✔️|||238ms| -|org.apache.pulsar.common.util.FieldParserTest|1✔️|||242ms| -|org.apache.pulsar.common.util.FileModifiedTimeUpdaterTest|6✔️|||6.161s| -|org.apache.pulsar.common.util.netty.ChannelFuturesTest|5✔️|||1.549s| -|org.apache.pulsar.common.util.RateLimiterTest|11✔️|||7.200s| -|org.apache.pulsar.common.util.ReflectionsTest|12✔️|||172ms| -|org.apache.pulsar.common.util.RelativeTimeUtilTest|1✔️|||39ms| -|org.apache.pulsar.discovery.service.web.DiscoveryServiceWebTest|1✔️|||4.904s| -|org.apache.pulsar.functions.worker.PulsarFunctionE2ESecurityTest|2✔️|||27.527s| -|org.apache.pulsar.functions.worker.PulsarFunctionPublishTest|3✔️|||42.238s| -|org.apache.pulsar.functions.worker.PulsarFunctionTlsTest|1✔️|||12.012s| -|org.apache.pulsar.io.PulsarFunctionTlsTest|1✔️|||30.213s| -|org.apache.pulsar.proxy.server.AdminProxyHandlerTest|1✔️|||474ms| -|org.apache.pulsar.proxy.server.AuthedAdminProxyHandlerTest|1✔️|||2.159s| -|org.apache.pulsar.proxy.server.FunctionWorkerRoutingTest|1✔️|||10ms| -|org.apache.pulsar.proxy.server.ProxyAdditionalServletTest|1✔️|||125ms| -|org.apache.pulsar.proxy.server.ProxyAuthenticatedProducerConsumerTest|1✔️|||2.279s| -|org.apache.pulsar.proxy.server.ProxyAuthenticationTest|1✔️|||16.696s| -|org.apache.pulsar.proxy.server.ProxyConnectionThrottlingTest|1✔️|||1.792s| -|org.apache.pulsar.proxy.server.ProxyEnableHAProxyProtocolTest|1✔️|||511ms| -|org.apache.pulsar.proxy.server.ProxyForwardAuthDataTest|1✔️|||31.924s| -|org.apache.pulsar.proxy.server.ProxyIsAHttpProxyTest|10✔️|||1.660s| -|org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithAuth|3✔️|||6.701s| -|org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithoutAuth|3✔️|||7.220s| -|org.apache.pulsar.proxy.server.ProxyLookupThrottlingTest|1✔️|||2.568s| -|org.apache.pulsar.proxy.server.ProxyParserTest|5✔️|||1.346s| -|org.apache.pulsar.proxy.server.ProxyRolesEnforcementTest|1✔️|||10.403s| -|org.apache.pulsar.proxy.server.ProxyStatsTest|3✔️|||533ms| -|org.apache.pulsar.proxy.server.ProxyTest|6✔️|||2.947s| -|org.apache.pulsar.proxy.server.ProxyTlsTest|2✔️|||414ms| -|org.apache.pulsar.proxy.server.ProxyTlsTestWithAuth|1✔️|||4ms| -|org.apache.pulsar.proxy.server.ProxyWithAuthorizationNegTest|1✔️|||2.128s| -|org.apache.pulsar.proxy.server.ProxyWithAuthorizationTest|13✔️|||32.897s| -|org.apache.pulsar.proxy.server.ProxyWithoutServiceDiscoveryTest|1✔️|||2.045s| -|org.apache.pulsar.proxy.server.SuperUserAuthedAdminProxyHandlerTest|3✔️|||8.235s| -|org.apache.pulsar.proxy.server.UnauthedAdminProxyHandlerTest|2✔️|||114ms| -|org.apache.pulsar.PulsarBrokerStarterTest|9✔️|||591ms| -|org.apache.pulsar.schema.compatibility.SchemaCompatibilityCheckTest|23✔️|||107.437s| -|org.apache.pulsar.schema.PartitionedTopicSchemaTest|1✔️|||29.041s| -|org.apache.pulsar.schema.SchemaTest|3✔️|||30.859s| -|org.apache.pulsar.stats.client.PulsarBrokerStatsClientTest|2✔️|||40.752s| -|org.apache.pulsar.tests.EnumValuesDataProviderTest|6✔️|||23ms| -|org.apache.pulsar.tests.TestRetrySupportBeforeMethodRetryTest|1✔️||4✖️|36ms| -|org.apache.pulsar.tests.TestRetrySupportRetryTest|1✔️||4✖️|27ms| -|org.apache.pulsar.tests.TestRetrySupportSuccessTest|3✔️|||1ms| -|org.apache.pulsar.tests.ThreadDumpUtilTest|2✔️|||17ms| -|org.apache.pulsar.utils.SimpleTextOutputStreamTest|4✔️|||50ms| -|org.apache.pulsar.utils.StatsOutputStreamTest|6✔️|||59ms| -|org.apache.pulsar.websocket.proxy.ProxyAuthenticationTest|4✔️|||28.904s| -|org.apache.pulsar.websocket.proxy.ProxyAuthorizationTest|1✔️|||1.263s| -|org.apache.pulsar.websocket.proxy.ProxyConfigurationTest|2✔️|||8.943s| -|org.apache.pulsar.websocket.proxy.ProxyPublishConsumeTlsTest|1✔️|||10.821s| -|org.apache.pulsar.websocket.proxy.ProxyPublishConsumeWithoutZKTest|1✔️|||7.280s| -|org.apache.pulsar.websocket.proxy.v1.V1_ProxyAuthenticationTest|4✔️|||29.941s| -### org.apache.pulsar.AddMissingPatchVersionTest ❌ -**2** tests were completed in **116ms** with **0** passed, **1** failed and **1** skipped. - -|Result|Test|Time| -|:---:|:---|---:| -|✖️|testVersionStrings|99ms| -|❌|testVersionStrings|17ms| \ No newline at end of file +|[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 +``` +✖️ testVersionStrings +❌ testVersionStrings + java.lang.AssertionError: expected [1.2.1] but found [1.2.0] +``` +### ✔️ org.apache.pulsar.broker.admin.AdminApiOffloadTest +``` +✔️ testOffloadPoliciesAppliedApi +✔️ testOffloadV2 +✔️ testTopicLevelOffloadNonPartitioned +✔️ testTopicLevelOffloadPartitioned +✔️ testOffloadV1 +✔️ testOffloadPolicies +✔️ testOffloadPoliciesApi +``` +### ✔️ org.apache.pulsar.broker.auth.AuthenticationServiceTest +``` +✔️ testAuthentication +✔️ testAuthenticationHttp +``` +### ✔️ org.apache.pulsar.broker.auth.AuthLogsTest +``` +✔️ httpEndpoint +✔️ binaryEndpoint +``` +### ✔️ org.apache.pulsar.broker.auth.AuthorizationTest +``` +✔️ simple +``` +### ✔️ org.apache.pulsar.broker.lookup.http.HttpTopicLookupv2Test +``` +✔️ crossColoLookup +✔️ testNotEnoughLookupPermits +✔️ testValidateReplicationSettingsOnNamespace +✔️ testDataPojo +``` +### ✔️ org.apache.pulsar.broker.namespace.NamespaceCreateBundlesTest +``` +✔️ testCreateNamespaceWithDefaultBundles +✔️ testSplitBundleUpdatesLocalPoliciesWithoutOverwriting +``` +### ✔️ org.apache.pulsar.broker.namespace.NamespaceOwnershipListenerTests +``` +✔️ testGetAllPartitions +✔️ testNamespaceBundleOwnershipListener +``` +### ✔️ org.apache.pulsar.broker.namespace.NamespaceServiceTest +``` +✔️ testSplitMapWithRefreshedStatMap +✔️ testRemoveOwnershipNamespaceBundle +✔️ testIsServiceUnitDisabled +✔️ testLoadReportDeserialize +✔️ testCreateLookupResult +✔️ testUnloadNamespaceBundleWithStuckTopic +✔️ testUnloadNamespaceBundleFailure +✔️ testSplitAndOwnBundles +✔️ testCreateNamespaceWithDefaultNumberOfBundles +✔️ testRemoveOwnershipAndSplitBundle +``` +### ✔️ org.apache.pulsar.broker.namespace.NamespaceUnloadingTest +``` +✔️ testUnloadNotLoadedNamespace +✔️ testUnloadPartiallyLoadedNamespace +``` +### ✔️ org.apache.pulsar.broker.namespace.OwnerShipCacheForCurrentServerTest +``` +✔️ testOwnershipForCurrentServer +``` +### ✔️ org.apache.pulsar.broker.namespace.OwnershipCacheTest +``` +✔️ testGetOwnedServiceUnits +✔️ testRemoveOwnership +✔️ testGetOwnedServiceUnit +✔️ testGetOrSetOwner +✔️ testConstructor +✔️ testGetOwner +✔️ testDisableOwnership +✔️ testReestablishOwnership +``` +### ✔️ org.apache.pulsar.broker.protocol.ProtocolHandlersTest +``` +✔️ testStart +✔️ testGetProtocol +✔️ testNewChannelInitializersSuccess +✔️ testInitialize +✔️ testNewChannelInitializersOverlapped +✔️ testGetProtocolDataToAdvertise +``` +### ✔️ org.apache.pulsar.broker.protocol.ProtocolHandlerUtilsTest +``` +✔️ testLoadProtocolHandler +✔️ testLoadProtocolHandlerBlankHandlerClass +✔️ testLoadProtocolHandlerWrongHandlerClass +``` +### ✔️ org.apache.pulsar.broker.protocol.ProtocolHandlerWithClassLoaderTest +``` +✔️ testWrapper +``` +### ✔️ org.apache.pulsar.broker.PulsarServiceTest +``` +✔️ testGetWorkerService +✔️ testGetWorkerServiceException +``` +### ✔️ org.apache.pulsar.broker.service.MessagePublishBufferThrottleTest +``` +✔️ testMessagePublishBufferThrottleEnable +✔️ testBlockByPublishRateLimiting +✔️ testMessagePublishBufferThrottleDisabled +``` +### ✔️ org.apache.pulsar.broker.service.ReplicatorTest +``` +✔️ testResumptionAfterBacklogRelaxed +✔️ testReplicationOverrides +✔️ testResetCursorNotFail +✔️ testUpdateGlobalTopicPartition +✔️ testReplication +✔️ testReplicatorOnPartitionedTopic +✔️ testConcurrentReplicator +✔️ testTopicReplicatedAndProducerCreate +✔️ testDeleteReplicatorFailure +✔️ testReplicatorOnPartitionedTopic +✔️ testReplicationForBatchMessages +✔️ testReplicatorClearBacklog +✔️ verifyChecksumAfterReplication +✔️ testCloseReplicatorStartProducer +✔️ activeBrokerParse +✔️ testReplicatePeekAndSkip +✔️ testReplication +✔️ testReplicatedCluster +✔️ testTopicReplicatedAndProducerCreate +✔️ testConfigChange +✔️ testFailures +✔️ testReplicatorProducerClosing +``` +### ✔️ org.apache.pulsar.broker.service.TopicOwnerTest +``` +✔️ testReleaseOwnershipWithZookeeperDisconnectedBeforeOwnershipNodeDeleted +✔️ testAcquireOwnershipWithZookeeperDisconnectedAfterOwnershipNodeCreated +✔️ testConnectToInvalidateBundleCacheBroker +✔️ testAcquireOwnershipWithZookeeperDisconnectedBeforeOwnershipNodeCreated +✔️ testLookupPartitionedTopic +✔️ testListNonPersistentTopic +✔️ testReleaseOwnershipWithZookeeperDisconnectedAfterOwnershipNodeDeleted +✔️ testReestablishOwnershipAfterInvalidateCache +``` +### ✔️ org.apache.pulsar.broker.SLAMonitoringTest +``` +✔️ testOwnedNamespaces +✔️ testOwnershipAfterSetup +✔️ testUnloadIfBrokerCrashes +✔️ testOwnershipViaAdminAfterSetup +``` +### ✔️ org.apache.pulsar.broker.stats.BookieClientsStatsGeneratorTest +``` +✔️ testJvmDirectMemoryUsedMetric +✔️ testBookieClientStatsGenerator +``` +### ✔️ org.apache.pulsar.broker.stats.ConsumerStatsTest +``` +✔️ testAckStatsOnPartitionedTopicForExclusiveSubscription +✔️ testConsumerStatsOnZeroMaxUnackedMessagesPerConsumer +✔️ testUpdateStatsForActiveConsumerAndSubscription +``` +### ✔️ org.apache.pulsar.broker.stats.ManagedCursorMetricsTest +``` +✔️ testManagedCursorMetrics +``` +### ✔️ org.apache.pulsar.broker.stats.ManagedLedgerMetricsTest +``` +✔️ testManagedLedgerMetrics +``` +### ✔️ org.apache.pulsar.broker.stats.prometheus.AggregatedNamespaceStatsTest +``` +✔️ testSimpleAggregation +``` +### ✔️ org.apache.pulsar.broker.stats.PrometheusMetricsTest +``` +✔️ testPerTopicStats +✔️ testAuthMetrics +✔️ testPerTopicExpiredStat +✔️ testPerProducerStats +✔️ testMetricsTopicCount +✔️ testManagedLedgerBookieClientStats +✔️ testDuplicateMetricTypeDefinitions +✔️ testExpiringTokenMetrics +✔️ testPerConsumerStats +✔️ testPerNamespaceStats +✔️ testManagedCursorPersistStats +✔️ testDuplicateMetricTypeDefinitions +✔️ testExpiredTokenMetrics +✔️ testManagedLedgerCacheStats +✔️ testManagedLedgerStats +``` +### ✔️ org.apache.pulsar.broker.stats.SubscriptionStatsTest +``` +✔️ testConsumersAfterMarkDelete +✔️ testNonContiguousDeletedMessagesRanges +``` +### ✔️ org.apache.pulsar.broker.systopic.NamespaceEventsSystemTopicServiceTest +``` +✔️ testSendAndReceiveNamespaceEvents +``` +### ✔️ org.apache.pulsar.broker.transaction.buffer.InMemTransactionBufferReaderTest +``` +✔️ testCloseReleaseAllEntries +✔️ testInvalidNumEntriesArgument +✔️ testEndOfTransactionException +``` +### ✔️ org.apache.pulsar.broker.transaction.buffer.TransactionBufferClientTest +``` +✔️ testAbortOnTopic +✔️ testAbortOnSubscription +✔️ testCommitOnTopic +✔️ testCommitOnSubscription +``` +### ✔️ org.apache.pulsar.broker.transaction.buffer.TransactionBufferTest +``` +✔️ testOpenReaderOnNonExistentTxn +✔️ testAbortCommittedTxn +✔️ testAbortTxn +✔️ testAbortNonExistentTxn +✔️ testCommitNonExistentTxn +✔️ testCommitTxn +✔️ testOpenReaderOnAnOpenTxn +``` +### ✔️ org.apache.pulsar.broker.transaction.buffer.TransactionEntryImplTest +``` +✔️ testCloseShouldReleaseBuffer +``` +### ✔️ org.apache.pulsar.broker.transaction.buffer.TransactionLowWaterMarkTest +``` +✔️ testTransactionBufferLowWaterMark +✔️ testPendingAckLowWaterMark +``` +### ✔️ org.apache.pulsar.broker.transaction.buffer.TransactionStablePositionTest +``` +✔️ commitTxnTest +✔️ abortTxnTest +✖️ commitTxnTest +``` +### ✔️ org.apache.pulsar.broker.transaction.coordinator.TransactionCoordinatorClientTest +``` +✔️ testClientStart +✔️ testCommitAndAbort +✔️ testNewTxn +``` +### ✔️ org.apache.pulsar.broker.transaction.coordinator.TransactionMetaStoreAssignmentTest +``` +✔️ testTransactionMetaStoreAssignAndFailover +``` +### ✔️ org.apache.pulsar.broker.transaction.pendingack.PendingAckInMemoryDeleteTest +``` +✖️ txnAckTestNoBatchAndSharedSubMemoryDeleteTest +✔️ txnAckTestNoBatchAndSharedSubMemoryDeleteTest +✔️ txnAckTestBatchAndSharedSubMemoryDeleteTest +``` +### ✔️ org.apache.pulsar.broker.transaction.TransactionConsumeTest +``` +✔️ noSortedTest +✔️ sortedTest +``` +### ✔️ org.apache.pulsar.broker.web.RestExceptionTest +``` +✔️ testRestException +✔️ testWebApplicationException +✔️ testOtherException +``` +### ✔️ org.apache.pulsar.broker.web.WebServiceTest +``` +✔️ testTlsAuthDisallowInsecure +✔️ testBrokerReady +✔️ testDefaultClientVersion +✔️ testTlsEnabled +✔️ testTlsAuthAllowInsecure +✔️ testSplitPath +✔️ testMaxRequestSize +✔️ testTlsDisabled +✔️ testRateLimiting +``` +### ✔️ org.apache.pulsar.client.impl.AdminApiKeyStoreTlsAuthTest +``` +✔️ testAuthorizedUserAsOriginalPrincipal +✔️ testSuperUserCantListNamespaces +✔️ testPersistentList +✔️ testSuperUserCanListTenants +``` +### ✔️ org.apache.pulsar.client.impl.BatchMessageIdImplSerializationTest +``` +✔️ testSerializationEmpty +✔️ testSerialization1 +✔️ testSerializationNull +✔️ testSerialization2 +``` +### ✔️ org.apache.pulsar.client.impl.BatchMessageIndexAckDisableTest +``` +✔️ testBatchMessageIndexAckForExclusiveSubscription +✔️ testBatchMessageIndexAckForSharedSubscription +✔️ testBatchMessageIndexAckForExclusiveSubscription +✔️ testBatchMessageIndexAckForSharedSubscription +``` +### ✔️ org.apache.pulsar.client.impl.BatchMessageIndexAckTest +``` +✔️ testBatchMessageIndexAckForSharedSubscription +✔️ testBatchMessageIndexAckForSharedSubscription +✔️ testDoNotRecycleAckSetMultipleTimes +✔️ testBatchMessageIndexAckForExclusiveSubscription +✔️ testBatchMessageIndexAckForExclusiveSubscription +``` +### ✔️ org.apache.pulsar.client.impl.BrokerClientIntegrationTest +``` +✔️ testDisconnectClientWithoutClosingConnection +✔️ testResetCursor +✔️ testResetCursor +✔️ testCloseBrokerService +✔️ testUnsupportedBatchMessageConsumer +✔️ testAvroSchemaProducerConsumerWithSpecifiedReaderAndWriter +✔️ testJsonSchemaProducerConsumerWithSpecifiedReaderAndWriter +✔️ testOperationTimeout +✔️ testCleanProducer +✔️ testUnsupportedBatchMessageConsumer +✔️ testCloseConnectionOnBrokerRejectedRequest +✔️ testAddEntryOperationTimeout +✔️ testInvalidDynamicConfiguration +✔️ testMaxConcurrentTopicLoading +✔️ testCloseConnectionOnInternalServerError +``` +### ✔️ org.apache.pulsar.client.impl.CompactedOutBatchMessageTest +``` +✔️ testCompactedOutMessages +``` +### ✔️ org.apache.pulsar.client.impl.ConsumerAckResponseTest +``` +✔️ testAckResponse +``` +### ✔️ org.apache.pulsar.client.impl.ConsumerConfigurationTest +``` +✔️ testReadCompactNonPersistentExclusive +✔️ testReadCompactPersistentExclusive +✔️ testReadCompactPersistentFailover +✔️ testReadCompactPersistentShared +``` +### ✔️ org.apache.pulsar.client.impl.ConsumerDedupPermitsUpdate +``` +✔️ testConsumerDedup +✔️ testConsumerDedup +✔️ testConsumerDedup +✔️ testConsumerDedup +✔️ testConsumerDedup +✔️ testConsumerDedup +✔️ testConsumerDedup +``` +### ✔️ org.apache.pulsar.client.impl.ConsumerUnsubscribeTest +``` +✔️ testConsumerUnsubscribeReference +``` +### ✔️ org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithAuth +``` +✔️ testTlsClientAuthOverHTTPProtocol +✔️ testTlsClientAuthOverBinaryProtocol +✔️ testTlsLargeSizeMessage +``` +### ✔️ org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithoutAuth +``` +✔️ testTlsClientAuthOverHTTPProtocol +✔️ testTlsClientAuthOverBinaryProtocol +✔️ testTlsLargeSizeMessage +``` +### ✔️ org.apache.pulsar.client.impl.KeyStoreTlsTest +``` +✔️ testValidate +``` +### ✔️ org.apache.pulsar.client.impl.MessageChecksumTest +``` +✔️ testChecksumCompatibilityInMixedVersionBrokerCluster +✔️ testTamperingMessageIsDetected +✔️ testChecksumCompatibilityInMixedVersionBrokerCluster +``` +### ✔️ org.apache.pulsar.client.impl.MessageChunkingTest +``` +✔️ testPublishWithFailure +✔️ testInvalidUseCaseForChunking +✔️ testLargeMessage +✔️ testExpireIncompleteChunkMessage +✔️ testInvalidConfig +✔️ testLargeMessageAckTimeOut +✔️ testLargeMessageAckTimeOut +✔️ testLargeMessage +✖️ testMaxPendingChunkMessages +``` +### ✔️ org.apache.pulsar.client.impl.MessageParserTest +``` +✔️ testWithoutBatches +✔️ testWithBatches +``` +### ✔️ org.apache.pulsar.client.impl.MultiTopicsReaderTest +``` +✔️ testReadMessageWithBatchingWithMessageInclusive +✔️ testKeyHashRangeReader +✔️ testRemoveSubscriptionForReaderNeedRemoveCursor +✔️ testReadMessageWithBatching +✔️ testReadMessageWithoutBatchingWithMessageInclusive +✔️ testMultiReaderSeek +✔️ testReadMessageWithoutBatching +✔️ testReaderWithTimeLong +``` +### ✔️ org.apache.pulsar.client.impl.NegativeAcksTest +``` +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +✔️ testNegativeAcks +``` +### ✔️ org.apache.pulsar.client.impl.PatternTopicsConsumerImplTest +``` +✔️ testStartEmptyPatternConsumer +✔️ testBinaryProtoToGetTopicsOfNamespaceAll +✔️ testPatternTopicsSubscribeWithBuilderFail +✔️ testPubRateOnNonPersistent +✔️ testTopicDeletion +✔️ testAutoUnbubscribePatternConsumer +✔️ testTopicsPatternFilter +✔️ testBinaryProtoToGetTopicsOfNamespaceNonPersistent +✔️ testBinaryProtoToGetTopicsOfNamespacePersistent +✔️ testTopicsListMinus +✔️ testAutoSubscribePatternConsumer +``` +### ✔️ org.apache.pulsar.client.impl.PerMessageUnAcknowledgedRedeliveryTest +``` +✔️ testSharedAckedNormalTopic +✔️ testUnAckedMessageTrackerSize +✔️ testSharedAckedPartitionedTopic +✔️ testExclusiveAckedNormalTopic +✔️ testFailoverAckedNormalTopic +``` +### ✔️ org.apache.pulsar.client.impl.PulsarMultiHostClientTest +``` +✔️ testMultiHostUrlRetrySuccess +✔️ testGetPartitionedTopicDataTimeout +✔️ testGetPartitionedTopicMetaData +``` +### ✔️ org.apache.pulsar.client.impl.RawMessageSerDeserTest +``` +✔️ testSerializationAndDeserialization +``` +### ✔️ org.apache.pulsar.client.impl.SchemaDeleteTest +``` +✔️ createTopicDeleteTopicCreateTopic +``` +### ✔️ org.apache.pulsar.client.impl.SequenceIdWithErrorTest +``` +✔️ testCheckSequenceId +✔️ testDeleteTopicWithMissingData +✔️ testTopicWithWildCardChar +✖️ testCrashBrokerWithoutCursorLedgerLeak +✖️ testSkipCorruptDataLedger +``` +### ✔️ org.apache.pulsar.client.impl.TopicDoesNotExistsTest +``` +✔️ testCreateConsumerOnNotExistsTopic +✔️ testCreateProducerOnNotExistsTopic +``` +### ✔️ org.apache.pulsar.client.impl.TopicFromMessageTest +``` +✔️ testSingleTopicConsumerNoBatchFullName +✔️ testMultiTopicConsumerBatchShortName +✔️ testSingleTopicConsumerNoBatchShortName +✔️ testMultiTopicConsumerNoBatchShortName +✔️ testSingleTopicConsumerBatchShortName +``` +### ✔️ org.apache.pulsar.client.impl.TopicsConsumerImplTest +``` +✔️ testTopicAutoUpdatePartitions +✔️ testDifferentTopicsNameSubscribe +✔️ testGetLastMessageId +✔️ testConsumerUnackedRedelivery +✔️ testSubscriptionMustCompleteWhenOperationTimeoutOnMultipleTopics +✔️ testConsumerDistributionInFailoverSubscriptionWhenUpdatePartitions +✔️ multiTopicsInDifferentNameSpace +✔️ testDefaultBacklogTTL +✔️ testGetConsumersAndGetTopics +✔️ testSubscribeUnsubscribeSingleTopic +✔️ testResubscribeSameTopic +✔️ testSyncProducerAndConsumer +✔️ testPartitionsUpdatesForMultipleTopics +✔️ testTopicsNameSubscribeWithBuilderFail +✔️ testMultiTopicsMessageListener +✔️ testTopicNameValid +✔️ testAsyncConsumer +``` +### ✔️ org.apache.pulsar.client.impl.UnAcknowledgedMessagesTimeoutTest +``` +✔️ testCheckUnAcknowledgedMessageTimer +✔️ testExclusiveSingleAckedNormalTopic +✔️ testFailoverSingleAckedPartitionedTopic +✔️ testSharedSingleAckedPartitionedTopic +✔️ testAckTimeoutMinValue +✔️ testExclusiveCumulativeAckedNormalTopic +✔️ testSingleMessageBatch +``` +### ✔️ org.apache.pulsar.client.impl.ZeroQueueSizeTest +``` +✔️ zeroQueueSizeSharedSubscription +✔️ testPauseAndResume +✔️ testZeroQueueSizeMessageRedeliveryForAsyncReceive +✔️ zeroQueueSizeConsumerListener +✔️ zeroQueueSizeFailoverSubscription +✔️ validQueueSizeConfig +✔️ zeroQueueSizeNormalConsumer +✔️ zeroQueueSizeReceieveAsyncInCompatibility +✔️ InvalidQueueSizeConfig +✔️ testZeroQueueSizeMessageRedeliveryForListener +✔️ testZeroQueueSizeMessageRedelivery +✔️ zeroQueueSizePartitionedTopicInCompatibility +✔️ testFailedZeroQueueSizeBatchMessage +✔️ testPauseAndResumeWithUnloading +``` +### ✔️ org.apache.pulsar.common.api.raw.RawMessageImplTest +``` +✔️ testGetProperties +``` +### ✔️ org.apache.pulsar.common.compression.CommandsTest +``` +✔️ testChecksumSendCommand +``` +### ✔️ org.apache.pulsar.common.compression.CompressorCodecBackwardCompatTest +``` +✔️ testCompressDecompress +✔️ testCompressDecompress +✔️ testCompressDecompress +✔️ testCompressDecompress +✔️ testCompressDecompress +✔️ testCompressDecompress +``` +### ✔️ org.apache.pulsar.common.compression.CompressorCodecTest +``` +✔️ testCompressDecompress +✔️ testMultpileUsages +✔️ testMultpileUsages +✔️ testCompressDecompress +✔️ testMultpileUsages +✔️ testCompressDecompress +✔️ testMultpileUsages +✔️ testCompressDecompress +✔️ testDecompressFromSampleBuffer +✔️ testDecompressReadonlyByteBuf +✔️ testDecompressReadonlyByteBuf +✔️ testCodecProvider +✔️ testEmptyInput +✔️ testEmptyInput +✔️ testCompressDecompress +✔️ testCodecProvider +✔️ testDecompressFromSampleBuffer +✔️ testMultpileUsages +✔️ testCodecProvider +✔️ testEmptyInput +✔️ testDecompressReadonlyByteBuf +✔️ testCompressDecompress +✔️ testDecompressReadonlyByteBuf +✔️ testCompressDecompress +✔️ testCompressDecompress +✔️ testMultpileUsages +✔️ testEmptyInput +✔️ testDecompressReadonlyByteBuf +✔️ testDecompressFromSampleBuffer +✔️ testDecompressFromSampleBuffer +✔️ testDecompressFromSampleBuffer +✔️ testDecompressReadonlyByteBuf +✔️ testDecompressReadonlyByteBuf +✔️ testMultpileUsages +✔️ testCompressDecompress +✔️ testCodecProvider +✔️ testMultpileUsages +✔️ testCompressDecompress +✔️ testMultpileUsages +✔️ testDecompressReadonlyByteBuf +✔️ testEmptyInput +✔️ testCodecProvider +✔️ testDecompressReadonlyByteBuf +✔️ testDecompressReadonlyByteBuf +✔️ testMultpileUsages +``` +### ✔️ org.apache.pulsar.common.compression.Crc32cChecksumTest +``` +✔️ testCrc32cHardware +✔️ testCrc32cDirectMemoryHardware +✔️ testCrc32c +✔️ testCrc32cSoftware +✔️ testCrc32cIncremental +✔️ testCrc32cIncrementalUsingProvider +``` +### ✔️ org.apache.pulsar.common.lookup.data.LookupDataTest +``` +✔️ testLoadReportSerialization +✔️ testUrlEncoder +✔️ serializeToJsonTest +✔️ withConstructor +``` +### ✔️ org.apache.pulsar.common.naming.MetadataTests +``` +✔️ testInvalidMetadata +✔️ testValidMetadata +``` +### ✔️ org.apache.pulsar.common.naming.NamespaceBundlesTest +``` +✔️ testConstructor +✔️ testSplitBundleInTwo +✔️ testsplitBundles +✔️ testFindBundle +✔️ testSplitBundleByFixBoundary +``` +### ✔️ org.apache.pulsar.common.naming.NamespaceBundleTest +``` +✔️ testIncludes +✔️ testGetBundle +✔️ testCompareTo +✔️ testConstructor +✔️ testToString +✔️ testEquals +``` +### ✔️ org.apache.pulsar.common.naming.NamespaceNameTest +``` +✔️ namespace +✔️ testNewScheme +``` +### ✔️ org.apache.pulsar.common.naming.ServiceConfigurationTest +``` +✔️ testOptionalSettingPresent +✔️ testOptionalSettingEmpty +✔️ testInit +✔️ testInitFailure +``` +### ✔️ org.apache.pulsar.common.naming.TopicNameTest +``` +✔️ testShortTopicName +✔️ topic +✔️ testTopicNameWithoutCluster +✔️ testDecodeEncode +``` +### ✔️ org.apache.pulsar.common.net.ServiceURITest +``` +✔️ testEmptyServiceUriString +✔️ testMultipleHostsSemiColon +✔️ testInvalidServiceUris +✔️ testMultipleHostsWithoutHttpPorts +✔️ testRootPath +✔️ testMultipleHostsMixedPorts +✔️ testMultipleHostsWithoutPulsarTlsPorts +✔️ testUserInfoWithMultipleHosts +✔️ testMultipleHostsComma +✔️ testMultipleHostsMixed +✔️ testUserInfo +✔️ testIpv6UriWithoutPulsarPort +✔️ testMultiIpv6Uri +✔️ testMultiIpv6UriWithoutPulsarPort +✔️ testEmptyPath +✔️ testNullServiceUriString +✔️ testNullServiceUriInstance +✔️ testMissingServiceName +✔️ testMultipleHostsWithoutHttpsPorts +✔️ testMultipleHostsWithoutPulsarPorts +✔️ testIpv6Uri +``` +### ✔️ org.apache.pulsar.common.policies.data.AutoFailoverPolicyDataTest +``` +✔️ testAutoFailoverPolicyData +``` +### ✔️ org.apache.pulsar.common.policies.data.AutoFailoverPolicyTypeTest +``` +✔️ testAutoFailoverPolicyType +``` +### ✔️ org.apache.pulsar.common.policies.data.AutoTopicCreationOverrideTest +``` +✔️ testInvalidTopicType +✔️ testNumPartitionsTooLow +✔️ testNumPartitionsNotSet +✔️ testValidOverrideNonPartitioned +✔️ testNumPartitionsOnNonPartitioned +✔️ testValidOverridePartitioned +``` +### ✔️ org.apache.pulsar.common.policies.data.BacklogQuotaTest +``` +✔️ testBacklogQuotaIdentity +``` +### ✔️ org.apache.pulsar.common.policies.data.ClusterDataTest +``` +✔️ simple +``` +### ✔️ org.apache.pulsar.common.policies.data.ConsumerStatsTest +``` +✔️ testConsumerStats +``` +### ✔️ org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfigTest +``` +✔️ testDecodeFailed +✔️ testEncodeDecodeSuccessfully +``` +### ✔️ org.apache.pulsar.common.policies.data.LocalPolicesTest +``` +✔️ testLocalPolices +``` +### ✔️ org.apache.pulsar.common.policies.data.NamespaceIsolationDataTest +``` +✔️ testNamespaceIsolationData +``` +### ✔️ org.apache.pulsar.common.policies.data.NamespaceOwnershipStatusTest +``` +✔️ testSerialization +``` +### ✔️ org.apache.pulsar.common.policies.data.OffloadPoliciesTest +``` +✔️ testGcsConfiguration +✔️ mergeTest +✔️ compatibleWithConfigFileTest +✔️ testCreateByProperties +✔️ testS3Configuration +✔️ oldPoliciesCompatibleTest +``` +### ✔️ org.apache.pulsar.common.policies.data.PartitionedTopicStatsTest +``` +✔️ testPartitionedTopicStats +``` +### ✔️ org.apache.pulsar.common.policies.data.PersistencePoliciesTest +``` +✔️ testPersistencePolicies +``` +### ✔️ org.apache.pulsar.common.policies.data.PersistentOfflineTopicStatsTest +``` +✔️ testPersistentOfflineTopicStats +``` +### ✔️ org.apache.pulsar.common.policies.data.PersistentTopicStatsTest +``` +✔️ testPersistentTopicStatsAggregation +✔️ testPersistentTopicStats +``` +### ✔️ org.apache.pulsar.common.policies.data.PoliciesDataTest +``` +✔️ propertyAdmin +✔️ policies +✔️ bundlesData +✔️ bundlesPolicies +``` +### ✔️ org.apache.pulsar.common.policies.data.PublisherStatsTest +``` +✔️ testPublisherStats +✔️ testPublisherStatsAggregation +``` +### ✔️ org.apache.pulsar.common.policies.data.ReplicatorStatsTest +``` +✔️ testReplicatorStatsAdd +✔️ testReplicatorStatsNull +``` +### ✔️ org.apache.pulsar.common.policies.data.ResourceQuotaTest +``` +✔️ testResourceQuotaDefault +✔️ testResourceQuotaEqual +``` +### ✔️ org.apache.pulsar.common.policies.data.RetentionPolicesTest +``` +✔️ testRetentionPolices +``` +### ✔️ org.apache.pulsar.common.policies.impl.AutoFailoverPolicyFactoryTest +``` +✔️ testAutoFailoverPolicyFactory +``` +### ✔️ org.apache.pulsar.common.policies.impl.MinAvailablePolicyTest +``` +✔️ testMinAvailablePolicty +``` +### ✔️ org.apache.pulsar.common.policies.impl.NamespaceIsolationPoliciesTest +``` +✔️ testBrokerAssignment +✔️ testGetNamespaceIsolationPolicyByName +✔️ testDeletePolicy +✔️ testSetPolicy +✔️ testJsonSerialization +✔️ testDefaultConstructor +✔️ testGetNamespaceIsolationPolicyByNamespace +``` +### ✔️ org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicyImplTest +``` +✔️ testFindBrokers +✔️ testGetSecondaryBrokers +✔️ testShouldFailover +✔️ testGetPrimaryBrokers +✔️ testGetAvailablePrimaryBrokers +✔️ testConstructor +✔️ testIsPrimaryOrSecondaryBroker +``` +### ✔️ org.apache.pulsar.common.protocol.ByteBufPairTest +``` +✔️ testEncoder +✔️ testDoubleByteBuf +``` +### ✔️ org.apache.pulsar.common.protocol.CommandUtilsTests +``` +✔️ testSkipBrokerEntryMetadata +✔️ testPeekBrokerEntryMetadata +✔️ testParseBrokerEntryMetadata +✔️ testMetadataFromCommandSubscribe +✔️ testMetadataFromCommandProducer +✔️ testAddBrokerEntryMetadata +✔️ testByteBufComposite +``` +### ✔️ org.apache.pulsar.common.protocol.MarkersTest +``` +✔️ testSnapshot +✔️ testTxnAbortMarker +✔️ testUpdate +✔️ testTxnCommitMarker +✔️ testSnapshotRequest +✔️ testSnapshotResponse +``` +### ✔️ org.apache.pulsar.common.protocol.PulsarDecoderTest +``` +✔️ testChannelRead +``` +### ✔️ org.apache.pulsar.common.stats.JvmDefaultGCMetricsLoggerTest +``` +✔️ testInvokeJVMInternals +``` +### ✔️ org.apache.pulsar.common.util.collections.BitSetRecyclableRecyclableTest +``` +✔️ testResetWords +✔️ testRecycle +``` +### ✔️ org.apache.pulsar.common.util.collections.ConcurrentBitSetRecyclableTest +``` +✔️ testRecycle +✔️ testGenerateByBitSet +``` +### ✔️ org.apache.pulsar.common.util.collections.ConcurrentLongHashMapTest +``` +✔️ testRehashingWithDeletes +✔️ concurrentInsertionsAndReads +✔️ testRemove +✔️ testRehashing +✔️ simpleInsertions +✔️ testComputeIfAbsent +✔️ testConstructor +✔️ testPutIfAbsent +✔️ testIteration +✔️ testHashConflictWithDeletion +✔️ concurrentInsertions +✔️ stressConcurrentInsertionsAndReads +✔️ testNegativeUsedBucketCount +``` +### ✔️ org.apache.pulsar.common.util.collections.ConcurrentLongPairSetTest +``` +✔️ concurrentInsertionsAndReads +✔️ testEqualsObjects +✔️ testIfRemoval +✔️ testRehashing +✔️ testToString +✔️ testRemove +✔️ testItems +✔️ testRehashingWithDeletes +✔️ testHashConflictWithDeletion +✔️ testIteration +✔️ simpleInsertions +✔️ testRehashingRemoval +✔️ testRemoval +✔️ testConstructor +✔️ concurrentInsertions +``` +### ✔️ org.apache.pulsar.common.util.collections.ConcurrentOpenHashMapTest +``` +✔️ testRemove +✔️ simpleInsertions +✔️ testPutIfAbsent +✔️ concurrentInsertions +✔️ testHashConflictWithDeletion +✔️ testRehashingWithDeletes +✔️ testComputeIfAbsent +✔️ testRehashing +✔️ testIteration +✔️ testEqualsKeys +✔️ concurrentInsertionsAndReads +✔️ testConstructor +``` +### ✔️ org.apache.pulsar.common.util.collections.ConcurrentOpenHashSetTest +``` +✔️ concurrentInsertions +✔️ testRehashing +✔️ testRemoval +✔️ testEqualsObjects +✔️ testHashConflictWithDeletion +✔️ testConstructor +✔️ concurrentInsertionsAndReads +✔️ testIteration +✔️ simpleInsertions +✔️ testRehashingWithDeletes +✔️ testRemove +``` +### ✔️ org.apache.pulsar.common.util.collections.ConcurrentOpenLongPairRangeSetTest +``` +✔️ testAddForDifferentKey +✔️ testToString +✔️ testCacheFlagConflict +✔️ testDeleteWithLeastMost +✔️ testDeleteForDifferentKey +✔️ testLastRange +✔️ testAddCompareCompareWithGuava +✔️ testSpanWithGuava +✔️ testDeleteCompareWithGuava +✔️ testFirstRange +✔️ testAddForSameKey +✔️ testDeleteWithAtMost +✔️ testRangeContaining +``` +### ✔️ org.apache.pulsar.common.util.collections.ConcurrentSortedLongPairSetTest +``` +✔️ concurrentInsertions +✔️ testIfRemoval +✔️ testRemoval +✔️ testRemove +✔️ testItems +✔️ testEqualsObjects +✔️ simpleInsertions +✔️ testIteration +✔️ testToString +``` +### ✔️ org.apache.pulsar.common.util.collections.FieldParserTest +``` +✔️ testUpdateObject +✔️ testConversion +``` +### ✔️ org.apache.pulsar.common.util.collections.GrowableArrayBlockingQueueTest +``` +✔️ removeTest +✔️ growArray +✔️ pollTimeout +✔️ simple +✔️ pollTimeout2 +✔️ blockingTake +``` +### ✔️ org.apache.pulsar.common.util.collections.GrowablePriorityLongPairQueueTest +``` +✔️ testItems +✔️ testRemove +✔️ testExpandQueue +✔️ testInsertAndRemove +✔️ testEqualsObjects +✔️ testExpandRemoval +✔️ testIteration +✔️ simpleInsertions +✔️ concurrentInsertions +✔️ testConstructor +✔️ testSetWithDuplicateInsert +✔️ testExpandWithDeletes +✔️ concurrentInsertionsAndReads +✔️ testRemoval +✔️ testIfRemoval +``` +### ✔️ org.apache.pulsar.common.util.collections.TripleLongPriorityQueueTest +``` +✔️ testQueue +✔️ testCheckForEmpty +✔️ testCompareWithSamePrefix +``` +### ✔️ org.apache.pulsar.common.util.FieldParserTest +``` +✔️ testMap +``` +### ✔️ org.apache.pulsar.common.util.FileModifiedTimeUpdaterTest +``` +✔️ testFileNotModified +✔️ testFileModified +✔️ testFileModified +✔️ testFileNotModified +✔️ testFileModified +✔️ testFileNotModified +``` +### ✔️ org.apache.pulsar.common.util.netty.ChannelFuturesTest +``` +✔️ toCompletableFuture_shouldCompleteExceptionally_channelFutureCompletedAfter +✔️ toCompletableFuture_shouldCompleteSuccessfully_channelFutureCompletedAfter +✔️ toCompletableFuture_shouldCompleteSuccessfully_channelFutureCompletedBefore +✔️ toCompletableFuture_shouldCompleteExceptionally_channelFutureCompletedBefore +✔️ toCompletableFuture_shouldRequireNonNullArgument +``` +### ✔️ org.apache.pulsar.common.util.RateLimiterTest +``` +✔️ testMultipleTryAcquire +✔️ testRateLimiterWithPermitUpdater +✔️ testTryAcquire +✔️ testTryAcquireNoPermits +✔️ testClose +✔️ testResetRate +✔️ testMultipleAcquire +✔️ testAcquire +✔️ testInvalidRenewTime +✔️ testRateLimiterWithFunction +✔️ testAcquireBlock +``` +### ✔️ org.apache.pulsar.common.util.ReflectionsTest +``` +✔️ testCreateInstanceNoNoArgConstructor +✔️ testCreateInstanceConstructorThrowsException +✔️ testCreateInstanceAbstractClass +✔️ testCreateTypedInstanceUnassignableClass +✔️ testCreateInstanceClassNotFound +✔️ testCreateTypedInstanceConstructorThrowsException +✔️ testClassExists +✔️ testCreateTypedInstanceAbstractClass +✔️ testCreateTypedInstanceClassNotFound +✔️ testCreateTypedInstanceNoNoArgConstructor +✔️ testLoadClass +✔️ testClassInJarImplementsIface +``` +### ✔️ org.apache.pulsar.common.util.RelativeTimeUtilTest +``` +✔️ testParseRelativeTime +``` +### ✔️ org.apache.pulsar.discovery.service.web.DiscoveryServiceWebTest +``` +✔️ testRedirectUrlWithServerStarted +``` +### ✔️ org.apache.pulsar.functions.worker.PulsarFunctionE2ESecurityTest +``` +✔️ testAuthorizationWithAnonymousUser +✔️ testAuthorization +``` +### ✔️ org.apache.pulsar.functions.worker.PulsarFunctionPublishTest +``` +✔️ testPulsarFunctionState +✔️ testMultipleAddress +✔️ testPulsarFunctionBKCleanup +``` +### ✔️ org.apache.pulsar.functions.worker.PulsarFunctionTlsTest +``` +✔️ testFunctionsCreation +``` +### ✔️ org.apache.pulsar.io.PulsarFunctionTlsTest +``` +✔️ testAuthorization +``` +### ✔️ org.apache.pulsar.proxy.server.AdminProxyHandlerTest +``` +✔️ replayableProxyContentProviderTest +``` +### ✔️ org.apache.pulsar.proxy.server.AuthedAdminProxyHandlerTest +``` +✔️ testAuthenticatedProxyAsNonAdmin +``` +### ✔️ org.apache.pulsar.proxy.server.FunctionWorkerRoutingTest +``` +✔️ testFunctionWorkerRedirect +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyAdditionalServletTest +``` +✔️ test +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyAuthenticatedProducerConsumerTest +``` +✔️ testTlsSyncProducerAndConsumer +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyAuthenticationTest +``` +✔️ testAuthentication +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyConnectionThrottlingTest +``` +✔️ testInboundConnection +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyEnableHAProxyProtocolTest +``` +✔️ testSimpleProduceAndConsume +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyForwardAuthDataTest +``` +✔️ testForwardAuthData +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyIsAHttpProxyTest +``` +✔️ testProxyToEndsInSlash +✔️ testStreaming +✔️ testLongPath +✔️ testLongPathInProxyTo +✔️ testPathEndsInSlash +✔️ testPathNotSpecified +✔️ testTryingToUseExistingPath +✔️ testMultipleRedirect +✔️ testSingleRedirect +✔️ testRedirectNotSpecified +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithAuth +``` +✔️ testProducerFailed +✔️ testPartitions +✔️ testProducer +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithoutAuth +``` +✔️ testPartitions +✔️ testProducerFailed +✔️ testProducer +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyLookupThrottlingTest +``` +✔️ testLookup +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyParserTest +``` +✔️ testRegexSubscription +✔️ testProducerConsumer +✔️ testProducer +✔️ testPartitions +✔️ testProtocolVersionAdvertisement +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyRolesEnforcementTest +``` +✔️ testIncorrectRoles +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyStatsTest +``` +✔️ testChangeLogLevel +✔️ testConnectionsStats +✔️ testTopicStats +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyTest +``` +✔️ testPartitions +✔️ testRegexSubscription +✔️ testProtocolVersionAdvertisement +✔️ testGetSchema +✔️ testProducer +✔️ testProducerConsumer +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyTlsTest +``` +✔️ testProducer +✔️ testPartitions +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyTlsTestWithAuth +``` +✔️ testServiceStartup +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyWithAuthorizationNegTest +``` +✔️ testProxyAuthorization +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyWithAuthorizationTest +``` +✔️ tlsCiphersAndProtocols +✔️ testTlsHostVerificationProxyToClient +✔️ tlsCiphersAndProtocols +✔️ testProxyAuthorization +✔️ tlsCiphersAndProtocols +✔️ testTlsHostVerificationProxyToBroker +✔️ tlsCiphersAndProtocols +✔️ tlsCiphersAndProtocols +✔️ tlsCiphersAndProtocols +✔️ testTlsHostVerificationProxyToBroker +✔️ tlsCiphersAndProtocols +✔️ testTlsHostVerificationProxyToClient +✔️ tlsCiphersAndProtocols +``` +### ✔️ org.apache.pulsar.proxy.server.ProxyWithoutServiceDiscoveryTest +``` +✔️ testDiscoveryService +``` +### ✔️ org.apache.pulsar.proxy.server.SuperUserAuthedAdminProxyHandlerTest +``` +✔️ testAuthWithRandoCert +✔️ testAuthenticatedProxyAsAdmin +✔️ testAuthenticatedProxyAsNonAdmin +``` +### ✔️ org.apache.pulsar.proxy.server.UnauthedAdminProxyHandlerTest +``` +✔️ testUnauthenticatedProxy +✔️ testVipStatus +``` +### ✔️ org.apache.pulsar.PulsarBrokerStarterTest +``` +✔️ testMainRunBookieNoConfig +✔️ testLoadConfigWithException +✔️ testMainWithNoArgument +✔️ testLoadBalancerConfig +✔️ testGlobalZooKeeperConfig +✔️ testMainRunBookieRecoveryNoConfig +✔️ testLoadConfig +✔️ testMainEnableRunBookieThroughBrokerConfig +✔️ testMainRunBookieAndAutoRecoveryNoConfig +``` +### ✔️ org.apache.pulsar.schema.compatibility.SchemaCompatibilityCheckTest +``` +✔️ testConsumerCompatibilityCheckCanReadLastTest +✔️ testConsumerWithNotCompatibilitySchema +✔️ testProducerSendWithOldSchemaAndConsumerCanRead +✔️ testConsumerCompatibilityCheckCanReadLastTest +✔️ testProducerSendWithOldSchemaAndConsumerCanRead +✔️ testSchemaComparison +✔️ testConsumerCompatibilityCheckCanReadLastTest +✔️ testConsumerCompatibilityReadAllCheckTest +✔️ testConsumerWithNotCompatibilitySchema +✔️ testIsAutoUpdateSchema +✔️ testProducerSendWithOldSchemaAndConsumerCanRead +✔️ testConsumerCompatibilityReadAllCheckTest +✔️ testIsAutoUpdateSchema +✔️ testProducerSendWithOldSchemaAndConsumerCanRead +✔️ testConsumerWithNotCompatibilitySchema +✔️ testIsAutoUpdateSchema +✔️ testProducerSendWithOldSchemaAndConsumerCanRead +✔️ testConsumerWithNotCompatibilitySchema +✔️ testProducerSendWithOldSchemaAndConsumerCanRead +✔️ testIsAutoUpdateSchema +✔️ testIsAutoUpdateSchema +✔️ testConsumerCompatibilityCheckCanReadLastTest +✔️ testIsAutoUpdateSchema +``` +### ✔️ org.apache.pulsar.schema.PartitionedTopicSchemaTest +``` +✔️ test +``` +### ✔️ org.apache.pulsar.schema.SchemaTest +``` +✔️ testIsUsingAvroSchemaParser +✔️ testBytesSchemaDeserialize +✔️ testMultiTopicSetSchemaProvider +``` +### ✔️ org.apache.pulsar.stats.client.PulsarBrokerStatsClientTest +``` +✔️ testServiceException +✔️ testTopicInternalStats +``` +### ✔️ org.apache.pulsar.tests.EnumValuesDataProviderTest +``` +✔️ shouldFailIfEnumParameterIsMissing +✔️ testEnumValuesProvider +✔️ testEnumValuesProvider +✔️ shouldDetermineEnumValuesFromMethod +✔️ shouldContainAllEnumValues +✔️ testEnumValuesProvider +``` +### ✔️ org.apache.pulsar.tests.TestRetrySupportBeforeMethodRetryTest +``` +✔️ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod +✖️ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod +✖️ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod +✖️ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod +✖️ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod +``` +### ✔️ org.apache.pulsar.tests.TestRetrySupportRetryTest +``` +✖️ shouldCallSetupBeforeRetrying +✔️ shouldCallSetupBeforeRetrying +✖️ shouldCallSetupBeforeRetrying +✖️ shouldCallSetupBeforeRetrying +✖️ shouldCallSetupBeforeRetrying +``` +### ✔️ org.apache.pulsar.tests.TestRetrySupportSuccessTest +``` +✔️ shouldCallSetupOnce1 +✔️ shouldCallSetupOnce3 +✔️ shouldCallSetupOnce2 +``` +### ✔️ org.apache.pulsar.tests.ThreadDumpUtilTest +``` +✔️ testHelp +✔️ testThreadDump +``` +### ✔️ org.apache.pulsar.utils.SimpleTextOutputStreamTest +``` +✔️ testBooleanFormat +✔️ testDoubleFormat +✔️ testLongFormat +✔️ testString +``` +### ✔️ org.apache.pulsar.utils.StatsOutputStreamTest +``` +✔️ testLists +✔️ testNamedObjects +✔️ testNestedObjects +✔️ testNamedLists +✔️ testPairs +✔️ testObjects +``` +### ✔️ org.apache.pulsar.websocket.proxy.ProxyAuthenticationTest +``` +✔️ unauthenticatedSocketTest +✔️ authenticatedSocketTest +✔️ statsTest +✔️ anonymousSocketTest +``` +### ✔️ org.apache.pulsar.websocket.proxy.ProxyAuthorizationTest +``` +✔️ test +``` +### ✔️ org.apache.pulsar.websocket.proxy.ProxyConfigurationTest +``` +✔️ configTest +✔️ configTest +``` +### ✔️ org.apache.pulsar.websocket.proxy.ProxyPublishConsumeTlsTest +``` +✔️ socketTest +``` +### ✔️ org.apache.pulsar.websocket.proxy.ProxyPublishConsumeWithoutZKTest +``` +✔️ socketTest +``` +### ✔️ org.apache.pulsar.websocket.proxy.v1.V1_ProxyAuthenticationTest +``` +✔️ anonymousSocketTest +✔️ authenticatedSocketTest +✔️ statsTest +✔️ unauthenticatedSocketTest +``` \ 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 f56c30aa..847db6a4 100644 --- a/__tests__/__snapshots__/dart-json.test.ts.snap +++ b/__tests__/__snapshots__/dart-json.test.ts.snap @@ -160,8 +160,11 @@ The test description was: pass updateShouldNotify ════════════════════════════════════════════════════════════════════════════════════════════════════", "line": 112, - "message": "Test failed. See exception logs above. -The test description was: pass updateShouldNotify", + "message": "The following TestFailure object was thrown running a test: + Expected: <2> + Actual: <1> +Unexpected number of calls +", "path": "test/value_listenable_provider_test.dart", }, "name": "pass updateShouldNotify", diff --git a/__tests__/__snapshots__/mocha-json.test.ts.snap b/__tests__/__snapshots__/mocha-json.test.ts.snap new file mode 100644 index 00000000..70b4b96a --- /dev/null +++ b/__tests__/__snapshots__/mocha-json.test.ts.snap @@ -0,0 +1,7587 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`mocha-json tests report from ./reports/mocha-json test results matches snapshot 1`] = ` +TestRunResult { + "path": "fixtures/mocha-json.json", + "suites": Array [ + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "Test 1", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "Passing test", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Test 1 Test 1.1", + "tests": Array [ + TestCaseResult { + "error": Object { + "details": "Error: Some error + at Object.throwError (lib\\\\main.js:2:9) + at Context. (test\\\\main.test.js:15:11) + at processImmediate (internal/timers.js:461:21)", + "line": 2, + "message": "Some error", + "path": "lib/main.js", + }, + "name": "Exception in target unit", + "result": "failed", + "time": 0, + }, + TestCaseResult { + "error": Object { + "details": "AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + +false !== true + + at Context. (test\\\\main.test.js:11:14) + at processImmediate (internal/timers.js:461:21)", + "line": 11, + "message": "Expected values to be strictly equal: + +false !== true +", + "path": "test/main.test.js", + }, + "name": "Failing test", + "result": "failed", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Test 2", + "tests": Array [ + TestCaseResult { + "error": Object { + "details": "Error: Some error + at Context. (test\\\\main.test.js:22:11) + at processImmediate (internal/timers.js:461:21)", + "line": 22, + "message": "Some error", + "path": "test/main.test.js", + }, + "name": "Exception in test", + "result": "failed", + "time": 0, + }, + ], + }, + ], + "name": "test/main.test.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": null, + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "Skipped test", + "result": "skipped", + "time": 0, + }, + TestCaseResult { + "error": Object { + "details": "Error: Timeout of 1ms exceeded. For async tests and hooks, ensure \\"done()\\" is called; if returning a Promise, ensure it resolves. (C:\\\\Users\\\\Michal\\\\Workspace\\\\dorny\\\\test-reporter\\\\reports\\\\mocha\\\\test\\\\second.test.js) + at listOnTimeout (internal/timers.js:554:17) + at processTimers (internal/timers.js:497:7)", + "line": undefined, + "message": "Timeout of 1ms exceeded. For async tests and hooks, ensure \\"done()\\" is called; if returning a Promise, ensure it resolves. (C:\\\\Users\\\\Michal\\\\Workspace\\\\dorny\\\\test-reporter\\\\reports\\\\mocha\\\\test\\\\second.test.js)", + "path": undefined, + }, + "name": "Timeout test", + "result": "failed", + "time": 8, + }, + ], + }, + ], + "name": "test/second.test.js", + "totalTime": undefined, + }, + ], + "totalTime": 12, +} +`; + +exports[`mocha-json tests report from mochajs/mocha test results matches snapshot 1`] = ` +TestRunResult { + "path": "fixtures/external/mocha/mocha-test-results.json", + "suites": Array [ + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "class BufferedWorkerPool constructor", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should apply defaults", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "class BufferedWorkerPool instance method run()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should deserialize the result", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should serialize the options object", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "class BufferedWorkerPool instance method run() when passed a non-string filepath", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should reject", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "class BufferedWorkerPool instance method run() when passed no arguments", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should reject", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "class BufferedWorkerPool instance method stats()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the object returned by \`workerpool.Pool#stats\`", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "class BufferedWorkerPool instance method terminate() when called with \`force\`", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should delegate to the underlying pool w/ \\"force\\" behavior", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "class BufferedWorkerPool instance method terminate() when called without \`force\`", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should delegate to the underlying pool w/o \\"force\\" behavior", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "class BufferedWorkerPool static method create()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return a BufferedWorkerPool instance", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "class BufferedWorkerPool static method create() when passed no arguments", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not throw", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "class BufferedWorkerPool static method serializeOptions()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return a serialized string", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "class BufferedWorkerPool static method serializeOptions() when called multiple times with the same object", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not perform serialization twice", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should return the same value", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "class BufferedWorkerPool static method serializeOptions() when passed no arguments", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not throw", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/node-unit/buffered-worker-pool.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "cli/config findConfig()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should look for one of the config files using findup-sync", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "should support an explicit \`cwd\`", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "cli/config loadConfig() when config file parsing fails", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \\".cjs\\" extension", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should use the JS parser", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \\".js\\" extension", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should use the JS parser", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \\".json\\" extension", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should use the JSON parser", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \\".jsonc\\" extension", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should use the JSON parser", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \\".yaml\\" extension", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should use the YAML parser", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \\".yml\\" extension", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should use the YAML parser", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "cli/config loadConfig() when supplied a filepath with unsupported extension", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should use the JSON parser", + "result": "success", + "time": 2, + }, + ], + }, + ], + "name": "test/node-unit/cli/config.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "node-flags impliesNoTimeouts()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return true for inspect flags", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "node-flags isNodeFlag() for all allowed node env flags which conflict with mocha flags", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "--require should return false", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "-r should return false", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "node-flags isNodeFlag() for all allowed node environment flags", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "--abort-on-uncaught-exception should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--conditions should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--debug-arraybuffer-allocations should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--debug-port should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--diagnostic-dir should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--disable-proto should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--disallow-code-generation-from-strings should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--enable-source-maps should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--es-module-specifier-resolution should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--experimental-import-meta-resolve should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--experimental-json-modules should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--experimental-loader should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--experimental-modules should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--experimental-policy should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--experimental-repl-await should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--experimental-report should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--experimental-specifier-resolution should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--experimental-vm-modules should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--experimental-wasi-unstable-preview1 should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--experimental-wasm-modules should return true", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "--experimental-worker should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--force-context-aware should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--frozen-intrinsics should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--heapsnapshot-signal should return true", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "--http-parser should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--http-server-default-timeout should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--huge-max-old-generation-size should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--icu-data-dir should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--input-type should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--insecure-http-parser should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--inspect should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--inspect-brk should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--inspect-port should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--inspect-publish-uid should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--interpreted-frames-native-stack should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--jitless should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--loader should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--max-http-header-size should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--max-old-space-size should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--napi-modules should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--no-deprecation should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--no-force-async-hooks-checks should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--no-node-snapshot should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--no-warnings should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--openssl-config should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--pending-deprecation should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--perf-basic-prof should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--perf-basic-prof-only-functions should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--perf-prof should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--perf-prof-unwinding-info should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--policy-integrity should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--preserve-symlinks should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--preserve-symlinks-main should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--prof-process should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--redirect-warnings should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--report-compact should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--report-dir should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--report-directory should return true", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "--report-filename should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--report-on-fatalerror should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--report-on-signal should return true", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "--report-signal should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--report-uncaught-exception should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--stack-trace-limit should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--throw-deprecation should return true", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "--title should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--tls-cipher-list should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--tls-keylog should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--tls-max-v1.2 should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--tls-max-v1.3 should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--tls-min-v1.0 should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--tls-min-v1.1 should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--tls-min-v1.2 should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--tls-min-v1.3 should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--trace-deprecation should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--trace-event-categories should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--trace-event-file-pattern should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--trace-events-enabled should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--trace-exit should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--trace-sigint should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--trace-sync-io should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--trace-tls should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--trace-uncaught should return true", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "--trace-warnings should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--track-heap-objects should return true", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "--unhandled-rejections should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--use-bundled-ca should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--use-largepages should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--use-openssl-ca should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--v8-pool-size should return true", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "--zero-fill-buffers should return true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "node-flags isNodeFlag() special cases", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return true for \\"es-staging\\"", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should return true for \\"gc-global\\"", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return true for \\"harmony\\" itself", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return true for \\"use-strict\\"", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return true for flags starting with \\"--v8-\\"", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return true for flags starting with \\"harmony-\\" or \\"harmony_\\"", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return true for flags starting with \\"preserve-symlinks\\"", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return true for flags starting with \\"trace-\\" or \\"trace_\\"", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "node-flags isNodeFlag() when expecting leading dashes", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should require leading dashes", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "node-flags unparseNodeFlags()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should handle multiple v8 flags", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle single v8 flags", + "result": "success", + "time": 1, + }, + ], + }, + ], + "name": "test/node-unit/cli/node-flags.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "options loadOptions() \\"extension\\" handling when user does not supply \\"extension\\" option", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should retain the default", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() \\"extension\\" handling when user supplies \\"extension\\" option", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not concatenate the default value", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() \\"ignore\\" handling", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not split option values by comma", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() \\"spec\\" handling when user supplies \\"spec\\" in config and positional arguments", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should place both - unsplitted - into the positional arguments array", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() config priority", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should prioritize args over rc file", + "result": "success", + "time": 72, + }, + TestCaseResult { + "error": undefined, + "name": "should prioritize package.json over defaults", + "result": "success", + "time": 77, + }, + TestCaseResult { + "error": undefined, + "name": "should prioritize rc file over package.json", + "result": "success", + "time": 75, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when called with a one-and-done arg \\"h\\"", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return basic parsed arguments and flag", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when called with a one-and-done arg \\"help\\"", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return basic parsed arguments and flag", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when called with a one-and-done arg \\"list-interfaces\\"", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return basic parsed arguments and flag", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when called with a one-and-done arg \\"list-reporters\\"", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return basic parsed arguments and flag", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when called with a one-and-done arg \\"V\\"", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return basic parsed arguments and flag", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when called with a one-and-done arg \\"version\\"", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return basic parsed arguments and flag", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when no parameter provided", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return an object containing positional args, defaults, and anti-reloading flags", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when parameter provided package.json when called with package = false (\`--no-package\`)", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not look for package.json", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return parsed args and default config", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set package = false", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when parameter provided package.json when path to package.json (\`--package \`) is invalid", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when parameter provided package.json when path to package.json (\`--package \`) is valid", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not try to find a package.json", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should return merged options incl. package.json opts", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set package = false", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when parameter provided package.json when path to package.json unspecified", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return merged options incl. found package.json", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set package = false", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when parameter provided rc file when called with config = false (\`--no-config\`)", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not attempt to find a config file", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not attempt to load a config file", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should return parsed args, default config and package.json", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set config = false", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when parameter provided rc file when called with unspecified config when an rc file would be found", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attempt to load file at found path", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should look for a config", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should set config = false", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when parameter provided rc file when called with unspecified config when an rc file would not be found", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should look for a config", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "should not attempt to load a config file", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should set config = false", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "options loadOptions() when parameter provided rc file when path to config (\`--config \`) is invalid", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attempt to load file at path", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not look for a config", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should throw to warn the user", + "result": "success", + "time": 1, + }, + ], + }, + ], + "name": "test/node-unit/cli/options.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "helpers list() when given a comma-delimited string", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return a flat array", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "helpers list() when provided a flat array", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return a flat array", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "helpers list() when provided a nested array", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return a flat array", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "helpers validateLegacyPlugin() when a plugin throws an exception upon load", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should fail and report the original error", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "helpers validateLegacyPlugin() when used with \\"reporter\\" key", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should disallow an array of names", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should fail to recognize an unknown reporter", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "helpers validateLegacyPlugin() when used with an \\"interfaces\\" key", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should disallow an array of names", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should fail to recognize an unknown interface", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "helpers validateLegacyPlugin() when used with an unknown plugin type", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should fail", + "result": "success", + "time": 1, + }, + ], + }, + ], + "name": "test/node-unit/cli/run-helpers.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "command run builder array type", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should include option extension", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option file", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option global", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option ignore", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option reporter-option", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option require", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option spec", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option watch-files", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option watch-ignore", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "command run builder boolean type", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should include option allow-uncaught", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option async-only", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option bail", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option check-leaks", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should include option color", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option delay", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option diff", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option exit", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should include option forbid-only", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option forbid-pending", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option full-trace", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option growl", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option inline-diffs", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option invert", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option list-interfaces", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option list-reporters", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option no-colors", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option parallel", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option recursive", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option sort", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option watch", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "command run builder number type", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should include option jobs", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option retries", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "command run builder string type", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should include option config", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option fgrep", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should include option grep", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option package", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option reporter", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option slow", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should include option timeout", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should include option ui", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/node-unit/cli/run.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "Mocha instance method addFile()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should add the given file to the files array", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method lazyLoadFiles()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the \`Mocha\` instance", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method lazyLoadFiles() when passed \`true\`", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should enable lazy loading", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method lazyLoadFiles() when passed a non-\`true\` value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should enable eager loading", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method loadFiles()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should execute the optional callback if given", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should load all files from the files array", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method parallelMode() when \`Mocha\` is running in Node.js", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the Mocha instance", + "result": "success", + "time": 6, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should enable parallel mode", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should enable serial mode", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method parallelMode() when \`Mocha\` is running in Node.js when parallel mode is already disabled", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not swap the Runner, nor change lazy loading setting", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method parallelMode() when \`Mocha\` is running in Node.js when parallel mode is already enabled", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not swap the Runner, nor change lazy loading setting", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method reporter() when a reporter exists relative to the \\"mocha\\" module path", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should load from module path", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method reporter() when a reporter exists relative to the \\"mocha\\" module path when the reporter throws upon load", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw \\"invalid reporter\\" exception", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "should warn about the error before throwing", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method reporter() when a reporter exists relative to the cwd", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should load from current working directory", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method reporter() when a reporter exists relative to the cwd when the reporter throws upon load", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw \\"invalid reporter\\" exception", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "should warn about the error before throwing", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method unloadFiles()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should delegate Mocha.unloadFile() for each item in its list of files", + "result": "success", + "time": 9, + }, + TestCaseResult { + "error": undefined, + "name": "should not be allowed when the current instance is already disposed", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should reset referencesCleaned and allow for next run", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha static method unloadFile()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should unload a specific file from cache", + "result": "success", + "time": 1, + }, + ], + }, + ], + "name": "test/node-unit/mocha.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "parallel-buffered-runner ParallelBufferedRunner constructor", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should start in \\"IDLE\\" state", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "parallel-buffered-runner ParallelBufferedRunner event EVENT_RUN_END", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should change the state to COMPLETE", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "parallel-buffered-runner ParallelBufferedRunner instance method isParallelMode()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "parallel-buffered-runner ParallelBufferedRunner instance method linkPartialObjects()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the runner", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "parallel-buffered-runner ParallelBufferedRunner instance method run()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should emit \`EVENT_RUN_BEGIN\`", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should cleanly terminate the thread pool", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should cleanly terminate the thread pool", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "should cleanly terminate the thread pool", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "parallel-buffered-runner ParallelBufferedRunner instance method run() when a suite has a bail flag when no event contains an error", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not force-terminate", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "parallel-buffered-runner ParallelBufferedRunner instance method run() when a worker fails", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should delegate to Runner#uncaught", + "result": "success", + "time": 3, + }, + TestCaseResult { + "error": undefined, + "name": "should recover", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "parallel-buffered-runner ParallelBufferedRunner instance method run() when instructed to link objects", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should create object references", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "parallel-buffered-runner ParallelBufferedRunner instance method run() when instructed to link objects when event data object is missing an ID", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should result in an uncaught exception", + "result": "success", + "time": 3, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should cleanly terminate the thread pool", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should cleanly terminate the thread pool", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "parallel-buffered-runner ParallelBufferedRunner instance method run() when suite should bail when no event contains an error", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not force-terminate", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "parallel-buffered-runner ParallelBufferedRunner instance method workerReporter()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return its context", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "parallel-buffered-runner ParallelBufferedRunner instance property _state", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should disallow an invalid state transition", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/node-unit/parallel-buffered-runner.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "ParallelBuffered constructor", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should listen for Runner events", + "result": "success", + "time": 8, + }, + TestCaseResult { + "error": undefined, + "name": "should listen for Runner events expecting to occur once", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "ParallelBuffered event on any other event listened for", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should populate its \`events\` array with SerializableEvents", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "ParallelBuffered event on EVENT_RUN_END", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should remove all listeners", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "ParallelBuffered instance method done", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should execute its callback with a SerializableWorkerResult", + "result": "success", + "time": 6, + }, + TestCaseResult { + "error": undefined, + "name": "should reset its \`events\` prop", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/node-unit/reporters/parallel-buffered.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "serializer function deserialize when passed a non-object value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the value", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer function deserialize when passed a SerializedWorkerResult object", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the result of \`SerializableWorkerResult.deserialize\` called on the value", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "serializer function deserialize when passed an object value which is not a SerializedWorkerResult", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the value", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer function deserialize when passed nothing", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return \`undefined\`", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer function serialize when not passed anything", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return \`undefined\`", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer function serialize when passed a non-object value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the value", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer function serialize when passed an object value having a \`serialize\` method", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the result of the \`serialize\` method", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer function serialize when passed an object value w/o a \`serialize\` method", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the value", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent constructor when called with a non-object \`rawObject\`", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw \\"invalid arg type\\" error", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent constructor when called without \`eventName\`", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw \\"invalid arg value\\" error", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent instance method serialize", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should freeze the instance", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should mutate the instance in-place", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent instance method serialize when passed an error", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not retain not-own props", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should retain own props", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should serialize the error", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent instance method serialize when passed an object containing a nested prop with an Error value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should serialize the Error", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent instance method serialize when passed an object containing a non-\`serialize\` method", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should remove the method", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent instance method serialize when passed an object containing a top-level prop with an Error value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should serialize the Error", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent instance method serialize when passed an object containing an array", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should serialize the array", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent instance method serialize when passed an object containing an object with a \`serialize\` method", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call the \`serialize\` method", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent instance method serialize when passed an object with a \`serialize\` method", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call the \`serialize\` method", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent static method create", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should instantiate a SerializableEvent", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent static method deserialize", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return a new object w/ null prototype", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent static method deserialize when passed a falsy parameter", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw \\"invalid arg type\\" error", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent static method deserialize when passed value contains \`data\` prop", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should ignore __proto__", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent static method deserialize when passed value contains \`data\` prop when \`data\` prop contains a nested serialized Error prop", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should create an Error instance from the nested serialized Error prop", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent static method deserialize when passed value contains an \`error\` prop", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should create an Error instance from the prop", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent static method deserialize when passed value data contains a prop beginning with \\"$$\\"", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should create a new prop having a function value", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should create a new prop returning the original value", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should remove the prop with the \\"$$\\" prefix", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableEvent static method deserialize when the value data contains a prop with an array value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should deserialize each prop", + "result": "success", + "time": 18, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableWorkerResult constructor", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should add a readonly \`__type\` prop", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableWorkerResult instance method serialize", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call \`SerializableEvent#serialize\` of each of its events", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should return a read-only value", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableWorkerResult static method create", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return a new SerializableWorkerResult instance", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableWorkerResult static method deserialize", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call SerializableEvent#deserialize on each item in its \`events\` prop", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should return the deserialized value", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an instance", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return \`true\`", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an object with an appropriate \`__type\` prop", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return \`true\`", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an object without an appropriate \`__type\` prop", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return \`false\`", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/node-unit/serializer.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "stackTraceFilter() on browser", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "does not strip out other bower_components", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "stackTraceFilter() on node on POSIX OS", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "does not ignore other bower_components and components", + "result": "skipped", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should get a stack-trace as a string and prettify it", + "result": "skipped", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not replace absolute path which has cwd as infix", + "result": "skipped", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should replace absolute with relative paths", + "result": "skipped", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "stackTraceFilter() on node on Windows", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should work on Windows", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/node-unit/stack-trace-filter.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "utils function canonicalType()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return \\"asyncfunction\\" if the parameter is an async function", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return \\"buffer\\" if the parameter is a Buffer", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "utils function cwd()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the current working directory", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "utils function type()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return \\"error\\" if the parameter is an Error", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should return \\"function\\" if the parameter is an async function", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/node-unit/utils.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "worker when run as main process", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 69, + }, + ], + }, + TestGroupResult { + "name": "worker when run as worker process", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should register itself with workerpool", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "worker when run as worker process function run() when called with empty \\"filepath\\" argument", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should reject", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "worker when run as worker process function run() when called without arguments", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should reject", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "worker when run as worker process function run() when passed a non-string \`options\` value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should reject", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "worker when run as worker process function run() when passed an invalid string \`options\` value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should reject", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "worker when run as worker process function run() when the file at \\"filepath\\" argument is unloadable", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should reject", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "worker when run as worker process function run() when the file at \\"filepath\\" is loadable", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call Mocha#run", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should handle \\"--require\\"", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "should handle \\"--ui\\"", + "result": "success", + "time": 3, + }, + TestCaseResult { + "error": undefined, + "name": "should remove all uncaughtException listeners", + "result": "success", + "time": 4, + }, + TestCaseResult { + "error": undefined, + "name": "should remove all unhandledRejection listeners", + "result": "success", + "time": 4, + }, + ], + }, + TestGroupResult { + "name": "worker when run as worker process function run() when the file at \\"filepath\\" is loadable when run twice", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should initialize only once", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "worker when run as worker process function run() when the file at \\"filepath\\" is loadable when serialization fails", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should reject", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "worker when run as worker process function run() when the file at \\"filepath\\" is loadable when serialization succeeds", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should resolve with a SerializedWorkerResult", + "result": "success", + "time": 1, + }, + ], + }, + ], + "name": "test/node-unit/worker.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "Context nested", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should work", + "result": "success", + "time": 3, + }, + ], + }, + TestGroupResult { + "name": "Context Siblings sequestered sibling", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should work", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Context Siblings sibling verifiction", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should allow test siblings to modify shared context", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should have reset this.calls before describe", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not have value set within a sibling describe", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "methods retries", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the number of retries", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "methods slow()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the slow", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "methods timeout()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the timeout", + "result": "success", + "time": 1, + }, + ], + }, + ], + "name": "test/unit/context.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "durations when fast", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not highlight", + "result": "success", + "time": 11, + }, + ], + }, + TestGroupResult { + "name": "durations when reasonable", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should highlight in yellow", + "result": "success", + "time": 52, + }, + ], + }, + TestGroupResult { + "name": "durations when slow", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should highlight in red", + "result": "success", + "time": 103, + }, + ], + }, + ], + "name": "test/unit/duration.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "Errors createForbiddenExclusivityError() when Mocha instance is not running in a worker process", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should output a message regarding --forbid-only", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Errors createForbiddenExclusivityError() when Mocha instance is running in a worker process", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should output a message regarding incompatibility", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Errors createInvalidInterfaceError()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should include expected code in thrown interface errors", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Errors createInvalidReporterError()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should include expected code in thrown reporter errors", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Errors deprecate()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should cache the message", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should coerce its parameter to a string", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "should ignore falsy messages", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Errors isMochaError() when provided a non-error", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return false", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Errors isMochaError() when provided an Error object having a known Mocha error code", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Errors isMochaError() when provided an Error object with a non-Mocha error code", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return false", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Errors warn()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call process.emitWarning", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should ignore falsy messages", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not cache messages", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/errors.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "global leaks", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should cause tests to fail", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should pass when accepted", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should pass when prefixed \\"mocha-\\"", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should pass with wildcard", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/globals.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "Mocha .grep()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should add a RegExp to the mocha.options object", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should convert grep string to a RegExp", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should covert grep regex-like string to a RegExp", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should return its parent Mocha object for chainability", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha \\"fgrep\\" option", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should escape and convert string to a RegExp", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha \\"grep\\" option", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should add a RegExp to the mocha.options object", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should convert string to a RegExp", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha \\"invert\\" option", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should add a Boolean to the mocha.options object", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/grep.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "async hooks", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "one", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "three", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "two", + "result": "success", + "time": 1, + }, + ], + }, + ], + "name": "test/unit/hook-async.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "serial nested", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "bar", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "foo", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "serial nested hooks", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "one", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "two", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/hook-sync-nested.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "serial hooks", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "one", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "three", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "two", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/hook-sync.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "hook timeout", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should work", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/hook-timeout.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "Hook error", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should get the hook._error when called without arguments", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the hook._error", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Hook reset", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call Runnable.reset", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should reset the error state", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/hook.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "Mocha constructor", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set _cleanReferencesAfterRun to true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha constructor when \`global\` option is an \`Array\`", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attempt to set globals", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha constructor when \`parallel\` option is true and \`jobs\` option <= 1", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not enable parallel mode", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha constructor when \`parallel\` option is true and \`jobs\` option > 1", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should enable parallel mode", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha constructor when \`parallel\` option is true when \`enableGlobalSetup\` option is present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should toggle global setup fixtures", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha constructor when \`parallel\` option is true when \`enableGlobalTeardown\` option is present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should configure global teardown fixtures", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha constructor when \`parallel\` option is true when \`globalSetup\` option is present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should configure global setup fixtures", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Mocha constructor when \`parallel\` option is true when \`globalTeardown\` option is present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should configure global teardown fixtures", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha constructor when \`retries\` option is not present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not attempt to set retries", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha constructor when \`retries\` option is present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attempt to set retries\`", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha constructor when \`rootHooks\` option is truthy", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "shouid attempt to set root hooks", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha constructor when \`timeout\` option is \`false\`", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attempt to set timeout", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha constructor when \`timeout\` option is \`undefined\`", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not attempt to set timeout", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method _runGlobalFixtures()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should execute multiple fixtures in order", + "result": "success", + "time": 3, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method allowUncaught()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the allowUncaught option to false", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the allowUncaught option to true", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method asyncOnly()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the asyncOnly option to false", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should set the asyncOnly option to true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method bail()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method bail() when provided a falsy argument", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should unset the \\"bail\\" flag on the root suite", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method bail() when provided no arguments", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the \\"bail\\" flag on the root suite", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method checkLeaks()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the checkLeaks option to true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method cleanReferencesAfterRun()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the _cleanReferencesAfterRun attribute", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the _cleanReferencesAfterRun attribute to false", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method color()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the color option to false", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should set the color option to true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method delay()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the delay option to true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method diff()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the diff option to true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method diff() when provided \`false\` argument", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the diff option to false", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method dispose()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should dispose previous test runner", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should dispose the root suite", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should unload the files", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method forbidOnly()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the forbidOnly option to false", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the forbidOnly option to true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method forbidPending()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the forbidPending option to false", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the forbidPending option to true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method fullTrace()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the fullTrace option to false", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the fullTrace option to true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method global()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be an empty array initially", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method global() when argument is invalid", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not modify the whitelist when given empty array", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not modify the whitelist when given empty string", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method global() when argument is valid", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should add contents of string array to the whitelist", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should add string to the whitelist", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not have duplicates", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method growl()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 57, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method growl() if capable of notifications", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the growl option to true", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method growl() if not capable of notifications", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the growl option to false", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method hasGlobalSetupFixtures() when no global setup fixtures are present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return \`false\`", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method hasGlobalSetupFixtures() when one or more global setup fixtures are present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return \`true\`", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method hasGlobalTeardownFixtures() when no global teardown fixtures are present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return \`false\`", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method hasGlobalTeardownFixtures() when one or more global teardown fixtures are present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return \`true\`", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method inlineDiffs()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the inlineDiffs option to false", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should set the inlineDiffs option to true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method invert()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the invert option to true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method noHighlighting()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the noHighlighting option to true", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method parallelMode() when \`Mocha\` is running in a browser", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method reporter()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should keep reporterOption on options", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should support legacy reporterOptions", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method rootHooks()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be chainable", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method rootHooks() when provided a single \\"after all\\" hook", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attach it to the root suite", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method rootHooks() when provided a single \\"after each\\" hook", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attach it to the root suite", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method rootHooks() when provided a single \\"before all\\" hook", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attach it to the root suite", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method rootHooks() when provided a single \\"before each\\" hook", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attach it to the root suite", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method rootHooks() when provided multiple \\"after all\\" hooks", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attach each to the root suite", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method rootHooks() when provided multiple \\"after each\\" hooks", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attach each to the root suite", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method rootHooks() when provided multiple \\"before all\\" hooks", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attach each to the root suite", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method rootHooks() when provided multiple \\"before each\\" hooks", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attach each to the root suite", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should execute the callback when complete", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should initialize the stats collector", + "result": "skipped", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should instantiate a reporter", + "result": "success", + "time": 3, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() Base reporter initialization", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should configure the Base reporter", + "result": "success", + "time": 3, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() Base reporter initialization when \\"color\\" options is set", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should configure the Base reporter", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() Runner initialization", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should instantiate a Runner", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() Runner initialization when \\"global\\" option is present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should configure global vars", + "result": "success", + "time": 3, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() Runner initialization when \\"grep\\" option is present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should configure \\"grep\\"", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when \\"growl\\" option is present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should initialize growl support", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when a reporter instance has a \\"done\\" method", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call the reporter \\"done\\" method", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when a run has finished and is called again", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not call \`Runner#runAsync()\`", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when a run is in progress", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not call \`Runner#runAsync\`", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when files have been added to the Mocha instance when Mocha is set to eagerly load files", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should eagerly load files", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when files have been added to the Mocha instance when Mocha is set to lazily load files", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not eagerly load files", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when global setup fixtures disabled when global setup fixtures are present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not run global setup fixtures", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when global setup fixtures disabled when global setup fixtures not present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not run global setup fixtures", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when global setup fixtures enabled when global setup fixtures are present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should run global setup fixtures", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when global setup fixtures enabled when global setup fixtures not present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not run global setup fixtures", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when global teardown fixtures disabled when global teardown fixtures are present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not run global teardown fixtures", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when global teardown fixtures disabled when global teardown fixtures not present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not run global teardown fixtures", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when global teardown fixtures enabled when global teardown fixtures are present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should run global teardown fixtures", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when global teardown fixtures enabled when global teardown fixtures are present when global setup fixtures are present and enabled", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should use the same context as returned by \`runGlobalSetup\`", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when global teardown fixtures enabled when global teardown fixtures not present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not run global teardown fixtures", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when Mocha configured for multiple runs and multiple runs are attempted", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call \`Runner#runAsync\` for each call", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should dispose the previous runner", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not throw", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should reset the root Suite between runs", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method run() when the \`Mocha\` instance is already disposed", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not call \`Runner#runAsync\`", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method runGlobalSetup() when a fixture is not present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not attempt to run fixtures", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method runGlobalSetup() when fixture(s) are present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attempt run the fixtures", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method runGlobalTeardown() when a fixture is not present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "not attempt to run the fixtures", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method runGlobalTeardown() when fixture(s) are present", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attempt to run the fixtures", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Mocha instance method unloadFile() when run in a browser", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/mocha.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "overspecified asynchronous resolution method", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should fail when multiple methods are used", + "result": "success", + "time": 3, + }, + ], + }, + ], + "name": "test/unit/overspecified-async.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "parseQuery()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should get queryString and return key-value object", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should parse \\"+\\" as a space", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/parse-query.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "plugin module class PluginLoader constructor when passed custom plugins", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should register the custom plugins", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader constructor when passed ignored plugins", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should retain a list of ignored plugins", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader constructor when passed no options", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should populate a registry of built-in plugins", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method finalize() when a plugin has no \\"finalize\\" function", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return an array of raw implementations", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method finalize() when a plugin has one or more implementations", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should omit unused plugins", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "should return an object map using \`optionName\` key for each registered plugin", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method finalize() when no plugins have been loaded", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return an empty map", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method load() when called with a falsy value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return false", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method load() when called with an object containing a recognized plugin", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call the associated validator, if present", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should retain the value of any matching property in its mapping", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should return true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method load() when called with an object containing no recognized plugin", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return false", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method load() when passed a falsy or non-object value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not call a validator", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "should return false", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method load() when passed an object value when a key matches a known named export", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call the associated validator", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not call validators whose keys were not found", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should add the implementation to the internal mapping", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not add an implementation of plugins not present", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method load() when passed an object value when no keys match any known named exports", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return false", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method register() when passed a definition w/o an exportName", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method register() when passed a falsy parameter", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method register() when passed a non-object parameter", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method register() when the plugin export name is already in use", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method register() when the plugin export name is ignored", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not register the plugin", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not throw", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader instance method register() when the plugin export name is not in use", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not throw", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module class PluginLoader static method create()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return a PluginLoader instance", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module global fixtures plugin global setup when an implementation is a function", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should pass validation", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module global fixtures plugin global setup when an implementation is a primitive", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should fail validation", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module global fixtures plugin global setup when an implementation is an array of functions", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should pass validation", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module global fixtures plugin global setup when an implementation is an array of primitives", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should fail validation", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module global fixtures plugin global teardown when an implementation is a function", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should pass validation", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "plugin module global fixtures plugin global teardown when an implementation is a primitive", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should fail validation", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module global fixtures plugin global teardown when an implementation is an array of functions", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should pass validation", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module global fixtures plugin global teardown when an implementation is an array of primitives", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should fail validation", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module root hooks plugin 🎣 when a loaded impl is finalized", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should flatten the implementations", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "plugin module root hooks plugin 🎣 when impl is a function", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should pass validation", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module root hooks plugin 🎣 when impl is a primitive", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should fail validation", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module root hooks plugin 🎣 when impl is an array", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should fail validation", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "plugin module root hooks plugin 🎣 when impl is an object of functions", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should pass validation", + "result": "skipped", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/plugin-loader.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "using imported describe", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "using imported it", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/required-tokens.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "root", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be a valid suite", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/root.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) if async", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "this.skip() should halt synchronous execution", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "this.skip() should set runnable to pending", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) if timed-out", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should ignore call to \`done\` and not execute callback again", + "result": "success", + "time": 11, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when .pending", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not invoke the callback", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when async", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should allow a timeout of 0", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should allow updating the timeout", + "result": "success", + "time": 51, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when async when an error is passed", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should invoke the callback", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when async when an exception is thrown", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should invoke the callback", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not throw its own exception if passed a non-object", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when async when an exception is thrown and is allowed to remain uncaught", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "throws an error when it is allowed", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when async when done() is invoked with a non-Error object", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should invoke the callback", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when async when done() is invoked with a string", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should invoke the callback", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when async when the callback is invoked several times with an error", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should emit a single \\"error\\" event", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when async when the callback is invoked several times without an error", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should emit a single \\"error\\" event", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when async without error", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should invoke the callback", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when fn is not a function", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw an error", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when fn returns a non-promise", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should invoke the callback", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise is fulfilled with a value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should invoke the callback", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise is fulfilled with no value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should invoke the callback", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise is rejected", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should invoke the callback", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise is rejected without a reason", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should invoke the callback", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise takes too long to settle", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw the timeout error", + "result": "success", + "time": 12, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when sync when an exception is thrown", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should invoke the callback with error", + "result": "success", + "time": 4, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when sync when an exception is thrown and is allowed to remain uncaught", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "throws an error when it is allowed", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when sync without error", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should invoke the callback", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .run(fn) when timeouts are disabled", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not error with timeout", + "result": "success", + "time": 6, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .title", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be present", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) .titlePath()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "returns the concatenation of the parent's title path and runnable's title", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #globals", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should allow for whitelisting globals", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #isFailed()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return \`false\` if test is pending", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return \`true\` if test has failed", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "should return \`true\` if test has not failed", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #reset", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should reset current run state", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #resetTimeout()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not time out if timeouts disabled after reset", + "result": "success", + "time": 21, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #retries(n)", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the number of retries", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #slow(ms)", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not set the slow threshold if the parameter is not passed", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not set the slow threshold if the parameter is undefined", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set the slow threshold", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #slow(ms) when passed a time-formatted string", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should convert to ms", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #timeout(ms) when value is equal to lower bound given numeric value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the timeout value to disabled", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #timeout(ms) when value is equal to lower bound given string timestamp", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the timeout value to disabled", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #timeout(ms) when value is equal to upper bound given numeric value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the disabled timeout value", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #timeout(ms) when value is less than lower bound", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should clamp to lower bound given numeric", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should clamp to lower bound given timestamp", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #timeout(ms) when value is out-of-bounds given numeric value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the disabled timeout value", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #timeout(ms) when value is within \`setTimeout\` bounds given numeric value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the timeout value", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) #timeout(ms) when value is within \`setTimeout\` bounds given string timestamp", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should set the timeout value", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) interesting property id", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should have a permanent identifier", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should have a unique identifier", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) static method toValueOrError", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return an Error if parameter is falsy", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return identity if parameter is truthy", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) when arity == 0", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be .sync", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not be .async", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runnable(title, fn) when arity >= 1", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be .async", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not be .sync", + "result": "success", + "time": 1, + }, + ], + }, + ], + "name": "test/unit/runnable.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "Runner instance method _uncaught() when called with a non-Runner context", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method abort()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the Runner", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set _abort property to true", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method allowUncaught()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "async - should allow unhandled errors in hooks to propagate through", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should allow unhandled errors in sync hooks to propagate through", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should allow unhandled errors to propagate through", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not allow unhandled errors in sync hooks to propagate through", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method checkGlobals(test)", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should allow variables that match a wildcard", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should emit \\"fail\\" when a global beginning with \\"d\\" is introduced", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should emit \\"fail\\" when a new global is introduced", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should emit \\"fail\\" when a single new disallowed global is introduced after a single extra global is allowed", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not fail when a new common global is introduced", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should pluralize the error message when several are introduced", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should respect per test whitelisted globals", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should respect per test whitelisted globals but still detect other leaks", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method dispose()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should remove \\"error\\" listeners from a test", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should remove \\"uncaughtException\\" listeners from the process", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should remove all listeners from itself", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method fail()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should emit \\"fail\\"", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should emit \\"fail\\"", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should emit a helpful message when failed with a string", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should emit a helpful message when failed with an Array", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should emit a helpful message when failed with an Object", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should emit a the error when failed with an Error instance", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should emit the error when failed with an Error-like object", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should increment .failures", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should increment \`Runner#failures\`", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not emit \\"end\\" if suite bail is not true", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should recover if the error stack is not writable", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return and not increment failures when test is pending", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should set \`Test#state\` to \\"failed\\"", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method fail() when Runner has stopped when test is not pending when error is not of the \\"multiple done\\" variety", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw a \\"fatal\\" error", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method fail() when Runner has stopped when test is not pending when error is the \\"multiple done\\" variety", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw the \\"multiple done\\" error", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method globalProps()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should include common non enumerable globals", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method globals()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should default to the known globals", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should white-list globals", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method grep()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should update the runner.total with number of matched tests", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should update the runner.total with number of matched tests when inverted", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method grepTotal()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the total number of matched tests", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return the total number of matched tests when inverted", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method hook()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should augment hook title with current test title", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should execute hooks after failed test if suite bail is true", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method isParallelMode()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return false", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method linkPartialObjects()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the Runner", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method run()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should clean references after a run", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should emit \\"retry\\" when a retryable test fails", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not clean references after a run when \`cleanReferencesAfterRun\` is \`false\`", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not leak \`Process.uncaughtException\` listeners", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not throw an exception if something emits EVENT_TEST_END with a non-Test object", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method run() stack traces ginormous", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not hang if overlong error message is multiple lines", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "should not hang if overlong error message is single line", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method run() stack traces long", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should display the full stack-trace", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method run() stack traces short", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should prettify the stack-trace", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method runAsync()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should pass through options to Runner#run", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should return a Promise with a failure count", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method runTest()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return when no tests to run", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method uncaught() when allow-uncaught is set to true", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should propagate error and throw", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method uncaught() when provided an object argument when argument is a Pending", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should ignore argument and return", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method uncaught() when provided an object argument when argument is an Error", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should add the \\"uncaught\\" property to the Error", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method uncaught() when provided an object argument when argument is an Error when a Runnable is running or has run", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should clear any pending timeouts", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not attempt to fail again", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should attempt to fail", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should abort the runner without emitting end event", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should fail with the current Runnable and the error", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not notify run has ended", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not notify test has ended", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should run callback(err) to handle failing hook pattern", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "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", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not notify run has ended", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not notify test has ended", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should run callback(err) to handle failing and hooks", + "result": "success", + "time": 3, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method uncaught() when provided an object argument when argument is an Error when no Runnables are running", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should fail with a transient Runnable and the error", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method uncaught() when provided an object argument when argument is an Error when no Runnables are running when Runner is IDLE", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should emit start/end events for the benefit of reporters", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method uncaught() when provided an object argument when argument is an Error when no Runnables are running when Runner is RUNNING", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not emit start/end events", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method uncaught() when provided an object argument when argument is an Error when no Runnables are running when Runner is STOPPED", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not emit start/end events, since this presumably would have already happened", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method uncaught() when provided an object argument when argument is not an Error", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should fail with a transient Runnable and a new Error coerced from the object", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Runner instance method workerReporter()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/runner.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "Suite instance method addSuite()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "adds the suite to the suites collection", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "copies the slow value", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "copies the timeout value", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "sets the parent on the added Suite", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "treats suite as pending if its parent is pending", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method addTest()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "adds the test to the tests collection", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "copies the timeout value", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "sets the parent on the added test", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method afterAll() wraps the passed in function in a Hook", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "adds it to _afterAll", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "appends title to hook", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "uses function name if available", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method afterEach() wraps the passed in function in a Hook", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "adds it to _afterEach", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "appends title to hook", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "uses function name if available", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method bail() when argument is passed", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the Suite object", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method bail() when no argument is passed", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the bail value", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method beforeAll() wraps the passed in function in a Hook", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "adds it to _beforeAll", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "appends title to hook", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "uses function name if available", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method beforeEach() when the suite is pending", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not create a hook", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method beforeEach() wraps the passed in function in a Hook", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "adds it to _beforeEach", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "appends title to hook", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "uses function name if available", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method clone()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should clone the Suite, omitting children", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method constructor", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not throw if the title is a string", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should report listened-for deprecated events as deprecated", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should throw an error if the title isn't a string", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method create()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "does not create a second root suite", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "does not denote the root suite by being titleless", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method eachTest(fn) when there are no nested suites or tests", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return 0", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method eachTest(fn) when there are several levels of nested suites", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the number", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method eachTest(fn) when there are several tests in the suite", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the number", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method filterOnly()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should filter out all other tests and suites if a suite has \`only\`", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should filter out all other tests and suites if a test has \`only\`", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method fullTitle() when there is a parent", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "returns the combination of parent's and suite's title", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method fullTitle() when there is no parent", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "returns the suite title", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method hasOnly()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return false if no suite or test is marked \`only\`", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return true if a suite has \`only\`", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return true if a test has \`only\`", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return true if nested suite has \`only\`", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method markOnly()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call appendOnlySuite on parent", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method reset()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should forward reset to all hooks", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should forward reset to suites and tests", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should reset the \`delayed\` state", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method slow() when argument is passed", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the Suite object", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method slow() when given a string", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should parse it", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method slow() when no argument is passed", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the slow value", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method timeout()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should convert a string to milliseconds", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method timeout() when argument is passed", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the Suite object", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method timeout() when no argument is passed", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the timeout value", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method titlePath() when there is a parent the parent is not the root suite", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "returns the concatenation of parent's and suite's title", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method titlePath() when there is a parent the parent is the root suite", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "returns the suite title", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method titlePath() when there is no parent", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "returns the suite title", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method total() when there are no nested suites or tests", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return 0", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Suite instance method total() when there are several tests in the suite", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return the number", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Test initialization", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not throw if the title is a string", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should throw an error if the title isn't a string", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/suite.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "Test .clone()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should add/keep the retriedTest value", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should copy the currentRetry value", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should copy the file value", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should copy the globals value", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should copy the parent value", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should copy the retries value", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should copy the slow value", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should copy the timeout value", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should copy the title", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Test .isPending()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should be pending when its parent is pending", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should be pending when marked as such", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should not be pending by default", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Test .markOnly()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call appendOnlyTest on parent", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "Test .reset()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should call Runnable.reset", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should reset the run state", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/test.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "a test that throws non-extensible", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not pass if throwing async and test is async", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not pass if throwing sync and test is async", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not pass if throwing sync and test is sync", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "a test that throws null", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not pass if throwing async and test is async", + "result": "success", + "time": 3, + }, + TestCaseResult { + "error": undefined, + "name": "should not pass if throwing sync and test is async", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not pass if throwing sync and test is sync", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "a test that throws undefined", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should not pass if throwing async and test is async", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "should not pass if throwing sync and test is async", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not pass if throwing sync and test is sync", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/throw.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "timeouts", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should allow overriding per-test", + "result": "success", + "time": 50, + }, + TestCaseResult { + "error": undefined, + "name": "should error on timeout", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "timeouts disabling", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should work with timeout(0)", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "timeouts disabling suite-level", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should work with timeout(0)", + "result": "success", + "time": 3, + }, + ], + }, + TestGroupResult { + "name": "timeouts disabling suite-level nested suite", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should work with timeout(0)", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "timeouts disabling using before", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should work with timeout(0)", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "timeouts disabling using beforeEach", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should work with timeout(0)", + "result": "success", + "time": 2, + }, + ], + }, + TestGroupResult { + "name": "timeouts disabling using timeout(0)", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should suppress timeout(4)", + "result": "success", + "time": 50, + }, + ], + }, + ], + "name": "test/unit/timeout.spec.js", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": Array [ + TestGroupResult { + "name": "lib/utils canonicalType()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should recognize various types", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "lib/utils canonicalType() when toString on null or undefined stringifies window", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should recognize null and undefined", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils castArray() when provided a primitive value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return an array containing the primitive value only", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils castArray() when provided an \\"arguments\\" value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return an array containing the arguments", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils castArray() when provided an array value", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return a copy of the array", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils castArray() when provided an object", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return an array containing the object only", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils castArray() when provided no parameters", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return an empty array", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "lib/utils castArray() when provided null", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return an array containing a null value only", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils clean()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should format a multi line test indented with spaces", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should format a multi line test indented with tabs", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should format a single line test function", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should format es6 arrow functions", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should format es6 arrow functions with implicit return", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should format functions saved in windows style - spaces", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should format functions saved in windows style - tabs", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle empty functions", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle functions with no space between the end and the closing brace", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle functions with parentheses in the same line", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should handle functions with tabs in their declarations", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should handle named functions with space after name", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle named functions without space after name", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle newlines in the function declaration", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should remove space character indentation from the function body", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should remove tab character indentation from the function body", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should remove the wrapping function declaration", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "lib/utils createMap()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should add props from all object parameters to the object", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should add props to the object", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return an object with a null prototype", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils dQuote()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return its input as string wrapped in double quotes", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "lib/utils escape()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "replaces invalid xml characters", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "replaces the usual xml suspects", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "lib/utils isPromise()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return false if the object is null", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return false if the value is an object w/o a \\"then\\" function", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return false if the value is not an object", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return true if the value is Promise-ish", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils lookupFiles() when run in browser", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should throw", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils lookupFiles() when run in Node.js", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should delegate to new location of lookupFiles()", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should print a deprecation message", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "lib/utils slug()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should convert the string to lowercase", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should convert whitespace to dashes", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should disallow consecutive dashes", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should strip non-alphanumeric and non-dash characters", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils sQuote()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return its input as string wrapped in single quotes", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils stringify()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "might get confusing", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should canonicalize the object", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle arrays", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle circular structures in arrays", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should handle circular structures in functions", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle circular structures in objects", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle empty arrays", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle empty functions (with no properties)", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle empty objects", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle functions", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should handle functions w/ properties", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle length properties that cannot be coerced to a number", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should handle non-empty arrays", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should handle object without an Object prototype", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle Symbol", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should handle undefined values", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should handle various non-undefined, non-null, non-object, non-array, non-date, and non-function values", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should not freak out if it sees a primitive twice", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should recurse", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return an object representation of a string created with a String constructor", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should return Buffer with .toJSON representation", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should return Date object with .toISOString() + string prefix", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should return invalid Date object with .toString() + string prefix", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should stringify dates", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "lib/utils stringify() #Number", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "floats and ints", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "should show the handle -0 situations", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should work well with \`NaN\` and \`Infinity\`", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "should work with bigints when possible", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils stringify() canonicalize example", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should represent the actual full result", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "lib/utils type()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should recognize various types", + "result": "success", + "time": 1, + }, + ], + }, + TestGroupResult { + "name": "lib/utils type() when toString on null or undefined stringifies window", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should recognize null and undefined", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "lib/utils uniqueID()", + "tests": Array [ + TestCaseResult { + "error": undefined, + "name": "should return a non-empty string", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "test/unit/utils.spec.js", + "totalTime": undefined, + }, + ], + "totalTime": 5965, +} +`; diff --git a/__tests__/fixtures/empty/mocha-json.json b/__tests__/fixtures/empty/mocha-json.json new file mode 100644 index 00000000..31ca60bf --- /dev/null +++ b/__tests__/fixtures/empty/mocha-json.json @@ -0,0 +1,16 @@ +{ + "stats": { + "suites": 0, + "tests": 0, + "passes": 0, + "pending": 0, + "failures": 0, + "start": "2021-03-08T20:01:44.391Z", + "end": "2021-03-08T20:01:44.391Z", + "duration": 0 + }, + "tests": [], + "pending": [], + "failures": [], + "passes": [] +} \ No newline at end of file diff --git a/__tests__/fixtures/external/mocha/files.txt b/__tests__/fixtures/external/mocha/files.txt new file mode 100644 index 00000000..4d22c86d --- /dev/null +++ b/__tests__/fixtures/external/mocha/files.txt @@ -0,0 +1,516 @@ +.browserslistrc +.editorconfig +.eleventy.js +.eslintignore +.eslintrc.yml +.fossaignore +.gitattributes +.github/CODE_OF_CONDUCT.md +.github/CONTRIBUTING.md +.github/FUNDING.yml +.github/ISSUE_TEMPLATE/bug_report.md +.github/ISSUE_TEMPLATE/feature_request.md +.github/ISSUE_TEMPLATE/support-question.md +.github/PULL_REQUEST_TEMPLATE.md +.github/stale.yml +.github/workflows/mocha.yml +.github/workflows/nightly-site-deploy.yml +.github/workflows/purge-expired-artifacts.yml +.gitignore +.lintstagedrc.json +.mailmap +.markdownlint.json +.mocharc.yml +.npmrc +.nycrc +.wallaby.js +AUTHORS +CHANGELOG.md +LICENSE +MAINTAINERS.md +PROJECT_CHARTER.md +README.md +assets/growl/error.png +assets/growl/ok.png +assets/mocha-banner-192.png +assets/mocha-banner.svg +assets/mocha-fixture-wizard.sketch +assets/mocha-logo-128.png +assets/mocha-logo-192.png +assets/mocha-logo-64.png +assets/mocha-logo-96.png +assets/mocha-logo.svg +assets/opencollective-header.png +bin/_mocha +bin/mocha +browser-entry.js +docs/.browserslistrc +docs/.eleventyignore +docs/API.md +docs/CNAME +docs/LICENSE-CC-BY-4.0 +docs/README.md +docs/_data/blocklist.json +docs/_data/files.js +docs/_data/supporters.js +docs/_data/toc.js +docs/_data/usage.js +docs/_headers +docs/_includes/default.liquid +docs/_includes/fixture-wizard.html +docs/_includes/supporters.md +docs/api-tutorials/custom-reporter.md +docs/api-tutorials/jsdoc.tutorials.json +docs/changelogs/CHANGELOG_V3_older.md +docs/changelogs/CHANGELOG_V4.md +docs/changelogs/README.md +docs/css/normalize.css +docs/css/prism.css +docs/css/style.css +docs/css/supporters.css +docs/example/Array.js +docs/example/async-dump.js +docs/example/debug-hanging-mocha.js +docs/example/tests.html +docs/favicon.ico +docs/images/emacs.png +docs/images/jetbrains-plugin.png +docs/images/join-chat.svg +docs/images/link-icon.svg +docs/images/matomo-logo.png +docs/images/mocha-logo.svg +docs/images/mocha_side_bar.png +docs/images/openjsf-logo.svg +docs/images/reporter-doc.png +docs/images/reporter-dot.png +docs/images/reporter-html.png +docs/images/reporter-json-stream.png +docs/images/reporter-json.png +docs/images/reporter-landing-fail.png +docs/images/reporter-landing.png +docs/images/reporter-list.png +docs/images/reporter-min.png +docs/images/reporter-nyan.png +docs/images/reporter-progress.png +docs/images/reporter-spec-duration.png +docs/images/reporter-spec-fail.png +docs/images/reporter-spec.png +docs/images/reporter-string-diffs.png +docs/images/reporter-tap.png +docs/images/test-duration-range.png +docs/images/wallaby-logo.png +docs/images/wallaby.png +docs/index.md +docs/js/html5shiv.min.js +example/config/.mocharc.js +example/config/.mocharc.json +example/config/.mocharc.jsonc +example/config/.mocharc.yml +example/config/README.md +index.js +jsdoc.conf.json +karma.conf.js +lib/browser/growl.js +lib/browser/highlight-tags.js +lib/browser/parse-query.js +lib/browser/progress.js +lib/browser/template.html +lib/cli/cli.js +lib/cli/collect-files.js +lib/cli/commands.js +lib/cli/config.js +lib/cli/index.js +lib/cli/init.js +lib/cli/lookup-files.js +lib/cli/node-flags.js +lib/cli/one-and-dones.js +lib/cli/options.js +lib/cli/run-helpers.js +lib/cli/run-option-metadata.js +lib/cli/run.js +lib/cli/watch-run.js +lib/context.js +lib/errors.js +lib/esm-utils.js +lib/hook.js +lib/interfaces/bdd.js +lib/interfaces/common.js +lib/interfaces/exports.js +lib/interfaces/index.js +lib/interfaces/qunit.js +lib/interfaces/tdd.js +lib/mocha.js +lib/mocharc.json +lib/nodejs/buffered-worker-pool.js +lib/nodejs/file-unloader.js +lib/nodejs/growl.js +lib/nodejs/parallel-buffered-runner.js +lib/nodejs/reporters/parallel-buffered.js +lib/nodejs/serializer.js +lib/nodejs/worker.js +lib/pending.js +lib/plugin-loader.js +lib/reporters/base.js +lib/reporters/doc.js +lib/reporters/dot.js +lib/reporters/html.js +lib/reporters/index.js +lib/reporters/json-stream.js +lib/reporters/json.js +lib/reporters/landing.js +lib/reporters/list.js +lib/reporters/markdown.js +lib/reporters/min.js +lib/reporters/nyan.js +lib/reporters/progress.js +lib/reporters/spec.js +lib/reporters/tap.js +lib/reporters/xunit.js +lib/runnable.js +lib/runner.js +lib/stats-collector.js +lib/suite.js +lib/test.js +lib/utils.js +mocha.css +netlify.toml +package-lock.json +package-scripts.js +package.json +rollup.config.js +scripts/karma-rollup-plugin.js +scripts/linkify-changelog.js +scripts/netlify-headers.js +scripts/pick-from-package-json.js +scripts/update-authors.js +test/README.md +test/assertions.js +test/browser-specific/esm.spec.mjs +test/browser-specific/fixtures/esm.fixture.mjs +test/browser-specific/fixtures/requirejs/lib.fixture.js +test/browser-specific/fixtures/requirejs/main.fixture.js +test/browser-specific/fixtures/webpack/webpack.config.js +test/browser-specific/fixtures/webpack/webpack.fixture.mjs +test/browser-specific/requirejs-setup.js +test/browser-specific/setup.js +test/compiler-fixtures/foo.fixture.js +test/compiler/test.coffee +test/compiler/test.foo +test/integration/README.md +test/integration/color.spec.js +test/integration/common-js-require.spec.js +test/integration/compiler-globbing.spec.js +test/integration/config.spec.js +test/integration/deprecate.spec.js +test/integration/diffs.spec.js +test/integration/duplicate-arguments.spec.js +test/integration/esm.spec.js +test/integration/events.spec.js +test/integration/file-utils.spec.js +test/integration/fixtures/__default__.fixture.js +test/integration/fixtures/cascade.fixture.js +test/integration/fixtures/common-js-require.fixture.js +test/integration/fixtures/config/mocha-config/index.js +test/integration/fixtures/config/mocha-config/package.json +test/integration/fixtures/config/mocharc.cjs +test/integration/fixtures/config/mocharc.js +test/integration/fixtures/config/mocharc.json +test/integration/fixtures/config/mocharc.yaml +test/integration/fixtures/current-test-title.fixture.js +test/integration/fixtures/deprecate.fixture.js +test/integration/fixtures/diffs/diffs.css.in +test/integration/fixtures/diffs/diffs.css.out +test/integration/fixtures/diffs/diffs.fixture.js +test/integration/fixtures/diffs/output +test/integration/fixtures/esm/add.mjs +test/integration/fixtures/esm/esm-failure.fixture.mjs +test/integration/fixtures/esm/esm-success.fixture.mjs +test/integration/fixtures/esm/js-folder/add.js +test/integration/fixtures/esm/js-folder/esm-in-js.fixture.js +test/integration/fixtures/esm/js-folder/package.json +test/integration/fixtures/esm/syntax-error/esm-syntax-error.fixture.mjs +test/integration/fixtures/exit.fixture.js +test/integration/fixtures/glob/glob.spec.js +test/integration/fixtures/glob/nested/glob.spec.js +test/integration/fixtures/hooks/after-each-hook-async-error.fixture.js +test/integration/fixtures/hooks/after-each-hook-error.fixture.js +test/integration/fixtures/hooks/after-each-this-test-error.fixture.js +test/integration/fixtures/hooks/after-hook-async-error.fixture.js +test/integration/fixtures/hooks/after-hook-deepnested-error.fixture.js +test/integration/fixtures/hooks/after-hook-error.fixture.js +test/integration/fixtures/hooks/after-hook-nested-error.fixture.js +test/integration/fixtures/hooks/before-each-hook-async-error.fixture.js +test/integration/fixtures/hooks/before-each-hook-error.fixture.js +test/integration/fixtures/hooks/before-hook-async-error-tip.fixture.js +test/integration/fixtures/hooks/before-hook-async-error.fixture.js +test/integration/fixtures/hooks/before-hook-deepnested-error.fixture.js +test/integration/fixtures/hooks/before-hook-error-tip.fixture.js +test/integration/fixtures/hooks/before-hook-error.fixture.js +test/integration/fixtures/hooks/before-hook-nested-error.fixture.js +test/integration/fixtures/hooks/before-hook-root-error.fixture.js +test/integration/fixtures/hooks/multiple-hook-async-error.fixture.js +test/integration/fixtures/hooks/multiple-hook-error.fixture.js +test/integration/fixtures/multiple-done-async.fixture.js +test/integration/fixtures/multiple-done-before-each.fixture.js +test/integration/fixtures/multiple-done-before.fixture.js +test/integration/fixtures/multiple-done-specs.fixture.js +test/integration/fixtures/multiple-done-with-error.fixture.js +test/integration/fixtures/multiple-done.fixture.js +test/integration/fixtures/multiple-runs/clean-references.fixture.js +test/integration/fixtures/multiple-runs/dispose.fixture.js +test/integration/fixtures/multiple-runs/multiple-runs-with-different-output-suite.fixture.js +test/integration/fixtures/multiple-runs/multiple-runs-with-flaky-before-each-suite.fixture.js +test/integration/fixtures/multiple-runs/multiple-runs-with-flaky-before-each.fixture.js +test/integration/fixtures/multiple-runs/run-thrice-helper.js +test/integration/fixtures/multiple-runs/run-thrice.fixture.js +test/integration/fixtures/multiple-runs/start-second-run-if-previous-is-still-running-suite.fixture.js +test/integration/fixtures/multiple-runs/start-second-run-if-previous-is-still-running.fixture.js +test/integration/fixtures/no-diff.fixture.js +test/integration/fixtures/options/allow-uncaught/propagate.fixture.js +test/integration/fixtures/options/allow-uncaught/this-skip-it.fixture.js +test/integration/fixtures/options/async-only-async.fixture.js +test/integration/fixtures/options/async-only-sync.fixture.js +test/integration/fixtures/options/bail-async.fixture.js +test/integration/fixtures/options/bail-with-after.fixture.js +test/integration/fixtures/options/bail-with-afterEach.fixture.js +test/integration/fixtures/options/bail-with-before.fixture.js +test/integration/fixtures/options/bail-with-beforeEach.fixture.js +test/integration/fixtures/options/bail-with-test.fixture.js +test/integration/fixtures/options/bail.fixture.js +test/integration/fixtures/options/delay-fail.fixture.js +test/integration/fixtures/options/delay-only.fixture.js +test/integration/fixtures/options/delay.fixture.js +test/integration/fixtures/options/extension/test1.fixture.js +test/integration/fixtures/options/extension/test2.fixture.coffee +test/integration/fixtures/options/file-alpha.fixture.js +test/integration/fixtures/options/file-beta.fixture.js +test/integration/fixtures/options/file-theta.fixture.js +test/integration/fixtures/options/forbid-only/only-before-each.fixture.js +test/integration/fixtures/options/forbid-only/only-before.fixture.js +test/integration/fixtures/options/forbid-only/only-empty-suite.fixture.js +test/integration/fixtures/options/forbid-only/only-suite.fixture.js +test/integration/fixtures/options/forbid-only/only.fixture.js +test/integration/fixtures/options/forbid-only/passed.fixture.js +test/integration/fixtures/options/forbid-pending/before-this-skip.fixture.js +test/integration/fixtures/options/forbid-pending/beforeEach-this-skip.fixture.js +test/integration/fixtures/options/forbid-pending/passed.fixture.js +test/integration/fixtures/options/forbid-pending/pending.fixture.js +test/integration/fixtures/options/forbid-pending/skip-empty-suite.fixture.js +test/integration/fixtures/options/forbid-pending/skip-suite.fixture.js +test/integration/fixtures/options/forbid-pending/skip.fixture.js +test/integration/fixtures/options/forbid-pending/this-skip.fixture.js +test/integration/fixtures/options/grep.fixture.js +test/integration/fixtures/options/ignore/fail.fixture.js +test/integration/fixtures/options/ignore/nested/fail.fixture.js +test/integration/fixtures/options/ignore/nested/pass.fixture.js +test/integration/fixtures/options/ignore/pass.fixture.js +test/integration/fixtures/options/jobs/fail-in-parallel.fixture.js +test/integration/fixtures/options/only/bdd.fixture.js +test/integration/fixtures/options/only/qunit.fixture.js +test/integration/fixtures/options/only/tdd.fixture.js +test/integration/fixtures/options/parallel/bail.fixture.js +test/integration/fixtures/options/parallel/exclusive-test-a.fixture.js +test/integration/fixtures/options/parallel/exclusive-test-b.fixture.js +test/integration/fixtures/options/parallel/retries-a.fixture.js +test/integration/fixtures/options/parallel/retries-b.fixture.js +test/integration/fixtures/options/parallel/syntax-err.fixture.js +test/integration/fixtures/options/parallel/test-a.fixture.js +test/integration/fixtures/options/parallel/test-b.fixture.js +test/integration/fixtures/options/parallel/test-c.fixture.js +test/integration/fixtures/options/parallel/test-d.fixture.js +test/integration/fixtures/options/parallel/uncaught.fixture.js +test/integration/fixtures/options/reporter-with-options.fixture.js +test/integration/fixtures/options/retries.fixture.js +test/integration/fixtures/options/slow-test.fixture.js +test/integration/fixtures/options/sort-alpha.fixture.js +test/integration/fixtures/options/sort-beta.fixture.js +test/integration/fixtures/options/watch/dependency.fixture.js +test/integration/fixtures/options/watch/hook.fixture.js +test/integration/fixtures/options/watch/test-file-change.fixture.js +test/integration/fixtures/options/watch/test-with-dependency.fixture.js +test/integration/fixtures/parallel/test1.mjs +test/integration/fixtures/parallel/test2.mjs +test/integration/fixtures/parallel/test3.mjs +test/integration/fixtures/passing-async.fixture.js +test/integration/fixtures/passing-sync.fixture.js +test/integration/fixtures/passing.fixture.js +test/integration/fixtures/pending/programmatic.fixture.js +test/integration/fixtures/pending/skip-async-before-hooks.fixture.js +test/integration/fixtures/pending/skip-async-before-nested.fixture.js +test/integration/fixtures/pending/skip-async-before.fixture.js +test/integration/fixtures/pending/skip-async-beforeEach.fixture.js +test/integration/fixtures/pending/skip-async-spec.fixture.js +test/integration/fixtures/pending/skip-hierarchy.fixture.js +test/integration/fixtures/pending/skip-shorthand.fixture.js +test/integration/fixtures/pending/skip-sync-after.fixture.js +test/integration/fixtures/pending/skip-sync-before-hooks.fixture.js +test/integration/fixtures/pending/skip-sync-before-inner.fixture.js +test/integration/fixtures/pending/skip-sync-before-nested.fixture.js +test/integration/fixtures/pending/skip-sync-before.fixture.js +test/integration/fixtures/pending/skip-sync-beforeEach-cond.fixture.js +test/integration/fixtures/pending/skip-sync-beforeEach.fixture.js +test/integration/fixtures/pending/skip-sync-spec.fixture.js +test/integration/fixtures/pending/spec.fixture.js +test/integration/fixtures/plugins/global-fixtures/global-setup-teardown-multiple.fixture.js +test/integration/fixtures/plugins/global-fixtures/global-setup-teardown.fixture.js +test/integration/fixtures/plugins/global-fixtures/global-setup.fixture.js +test/integration/fixtures/plugins/global-fixtures/global-teardown.fixture.js +test/integration/fixtures/plugins/root-hooks/esm/package.json +test/integration/fixtures/plugins/root-hooks/esm/root-hook-defs-esm.fixture.js +test/integration/fixtures/plugins/root-hooks/root-hook-defs-a.fixture.js +test/integration/fixtures/plugins/root-hooks/root-hook-defs-b.fixture.js +test/integration/fixtures/plugins/root-hooks/root-hook-defs-c.fixture.js +test/integration/fixtures/plugins/root-hooks/root-hook-defs-d.fixture.js +test/integration/fixtures/plugins/root-hooks/root-hook-defs-esm-broken.fixture.js +test/integration/fixtures/plugins/root-hooks/root-hook-defs-esm.fixture.mjs +test/integration/fixtures/plugins/root-hooks/root-hook-test-2.fixture.js +test/integration/fixtures/plugins/root-hooks/root-hook-test.fixture.js +test/integration/fixtures/regression/issue-1991.fixture.js +test/integration/fixtures/regression/issue-2315.fixture.js +test/integration/fixtures/regression/issue-2406.fixture.js +test/integration/fixtures/regression/issue-2417.fixture.js +test/integration/fixtures/reporters.fixture.js +test/integration/fixtures/retries/async.fixture.js +test/integration/fixtures/retries/early-pass.fixture.js +test/integration/fixtures/retries/hooks.fixture.js +test/integration/fixtures/retries/nested.fixture.js +test/integration/fixtures/runner/events-bail-retries.fixture.js +test/integration/fixtures/runner/events-bail.fixture.js +test/integration/fixtures/runner/events-basic.fixture.js +test/integration/fixtures/runner/events-delay.fixture.js +test/integration/fixtures/runner/events-retries.fixture.js +test/integration/fixtures/simple-reporter.js +test/integration/fixtures/simple-ui.fixture.js +test/integration/fixtures/suite/suite-no-callback.fixture.js +test/integration/fixtures/suite/suite-returning-value.fixture.js +test/integration/fixtures/suite/suite-skipped-callback.fixture.js +test/integration/fixtures/suite/suite-skipped-no-callback.fixture.js +test/integration/fixtures/test-for-simple-ui.fixture.js +test/integration/fixtures/timeout-override.fixture.js +test/integration/fixtures/timeout.fixture.js +test/integration/fixtures/uncaught/after-runner.fixture.js +test/integration/fixtures/uncaught/double.fixture.js +test/integration/fixtures/uncaught/fatal.fixture.js +test/integration/fixtures/uncaught/hook.fixture.js +test/integration/fixtures/uncaught/issue-1327.fixture.js +test/integration/fixtures/uncaught/issue-1417.fixture.js +test/integration/fixtures/uncaught/listeners.fixture.js +test/integration/fixtures/uncaught/pending.fixture.js +test/integration/fixtures/uncaught/recover.fixture.js +test/integration/fixtures/uncaught/unhandled.fixture.js +test/integration/glob.spec.js +test/integration/helpers.js +test/integration/hook-err.spec.js +test/integration/hooks.spec.js +test/integration/init.spec.js +test/integration/invalid-arguments.spec.js +test/integration/multiple-done.spec.js +test/integration/multiple-runs.spec.js +test/integration/no-diff.spec.js +test/integration/only.spec.js +test/integration/options/allowUncaught.spec.js +test/integration/options/asyncOnly.spec.js +test/integration/options/bail.spec.js +test/integration/options/compilers.spec.js +test/integration/options/delay.spec.js +test/integration/options/exit.spec.js +test/integration/options/extension.spec.js +test/integration/options/file.spec.js +test/integration/options/forbidOnly.spec.js +test/integration/options/forbidPending.spec.js +test/integration/options/grep.spec.js +test/integration/options/ignore.spec.js +test/integration/options/invert.spec.js +test/integration/options/jobs.spec.js +test/integration/options/listInterfaces.spec.js +test/integration/options/listReporters.spec.js +test/integration/options/node-flags.spec.js +test/integration/options/opts.spec.js +test/integration/options/parallel.spec.js +test/integration/options/reporter-option.spec.js +test/integration/options/retries.spec.js +test/integration/options/sort.spec.js +test/integration/options/timeout.spec.js +test/integration/options/ui.spec.js +test/integration/options/watch.spec.js +test/integration/parallel.spec.js +test/integration/pending.spec.js +test/integration/plugins/global-fixtures.spec.js +test/integration/plugins/root-hooks.spec.js +test/integration/regression.spec.js +test/integration/reporters.spec.js +test/integration/retries.spec.js +test/integration/suite.spec.js +test/integration/timeout.spec.js +test/integration/uncaught.spec.js +test/interfaces/bdd.spec.js +test/interfaces/exports.spec.js +test/interfaces/qunit.spec.js +test/interfaces/tdd.spec.js +test/jsapi/index.js +test/node-unit/buffered-worker-pool.spec.js +test/node-unit/cli/config.spec.js +test/node-unit/cli/fixtures/bad-module.fixture.js +test/node-unit/cli/node-flags.spec.js +test/node-unit/cli/options.spec.js +test/node-unit/cli/run-helpers.spec.js +test/node-unit/cli/run.spec.js +test/node-unit/fixtures/dumb-module.fixture.js +test/node-unit/fixtures/dumber-module.fixture.js +test/node-unit/fixtures/wonky-reporter.fixture.js +test/node-unit/mocha.spec.js +test/node-unit/parallel-buffered-runner.spec.js +test/node-unit/reporters/parallel-buffered.spec.js +test/node-unit/serializer.spec.js +test/node-unit/stack-trace-filter.spec.js +test/node-unit/utils.spec.js +test/node-unit/worker.spec.js +test/only/bdd-require.spec.js +test/only/global/bdd.spec.js +test/only/global/qunit.spec.js +test/only/global/tdd.spec.js +test/reporters/base.spec.js +test/reporters/doc.spec.js +test/reporters/dot.spec.js +test/reporters/helpers.js +test/reporters/json-stream.spec.js +test/reporters/json.spec.js +test/reporters/landing.spec.js +test/reporters/list.spec.js +test/reporters/markdown.spec.js +test/reporters/min.spec.js +test/reporters/nyan.spec.js +test/reporters/progress.spec.js +test/reporters/spec.spec.js +test/reporters/tap.spec.js +test/reporters/xunit.spec.js +test/require/a.js +test/require/b.coffee +test/require/c.js +test/require/d.coffee +test/require/require.spec.js +test/setup.js +test/smoke/smoke.spec.js +test/unit/context.spec.js +test/unit/duration.spec.js +test/unit/errors.spec.js +test/unit/globals.spec.js +test/unit/grep.spec.js +test/unit/hook-async.spec.js +test/unit/hook-sync-nested.spec.js +test/unit/hook-sync.spec.js +test/unit/hook-timeout.spec.js +test/unit/hook.spec.js +test/unit/mocha.spec.js +test/unit/overspecified-async.spec.js +test/unit/parse-query.spec.js +test/unit/plugin-loader.spec.js +test/unit/required-tokens.spec.js +test/unit/root.spec.js +test/unit/runnable.spec.js +test/unit/runner.spec.js +test/unit/suite.spec.js +test/unit/test.spec.js +test/unit/throw.spec.js +test/unit/timeout.spec.js +test/unit/utils.spec.js diff --git a/__tests__/fixtures/external/mocha/mocha-test-results.json b/__tests__/fixtures/external/mocha/mocha-test-results.json new file mode 100644 index 00000000..fec6beb6 --- /dev/null +++ b/__tests__/fixtures/external/mocha/mocha-test-results.json @@ -0,0 +1,15097 @@ +{ + "stats": { + "suites": 590, + "tests": 839, + "passes": 833, + "pending": 6, + "failures": 0, + "start": "2021-04-01T07:58:46.190Z", + "end": "2021-04-01T07:58:52.155Z", + "duration": 5965 + }, + "tests": [ + { + "title": "should work", + "fullTitle": "Context nested should work", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work", + "fullTitle": "Context Siblings sequestered sibling should work", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not have value set within a sibling describe", + "fullTitle": "Context Siblings sibling verifiction should not have value set within a sibling describe", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow test siblings to modify shared context", + "fullTitle": "Context Siblings sibling verifiction should allow test siblings to modify shared context", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should have reset this.calls before describe", + "fullTitle": "Context Siblings sibling verifiction should have reset this.calls before describe", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the timeout", + "fullTitle": "methods timeout() should return the timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the slow", + "fullTitle": "methods slow() should return the slow", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the number of retries", + "fullTitle": "methods retries should return the number of retries", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should highlight in red", + "fullTitle": "durations when slow should highlight in red", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\duration.spec.js", + "duration": 103, + "currentRetry": 0, + "speed": "slow", + "err": {} + }, + { + "title": "should highlight in yellow", + "fullTitle": "durations when reasonable should highlight in yellow", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\duration.spec.js", + "duration": 52, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should not highlight", + "fullTitle": "durations when fast should not highlight", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\duration.spec.js", + "duration": 11, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include expected code in thrown reporter errors", + "fullTitle": "Errors createInvalidReporterError() should include expected code in thrown reporter errors", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include expected code in thrown interface errors", + "fullTitle": "Errors createInvalidInterfaceError() should include expected code in thrown interface errors", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should output a message regarding incompatibility", + "fullTitle": "Errors createForbiddenExclusivityError() when Mocha instance is running in a worker process should output a message regarding incompatibility", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should output a message regarding --forbid-only", + "fullTitle": "Errors createForbiddenExclusivityError() when Mocha instance is not running in a worker process should output a message regarding --forbid-only", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should coerce its parameter to a string", + "fullTitle": "Errors deprecate() should coerce its parameter to a string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cache the message", + "fullTitle": "Errors deprecate() should cache the message", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should ignore falsy messages", + "fullTitle": "Errors deprecate() should ignore falsy messages", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call process.emitWarning", + "fullTitle": "Errors warn() should call process.emitWarning", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not cache messages", + "fullTitle": "Errors warn() should not cache messages", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should ignore falsy messages", + "fullTitle": "Errors warn() should ignore falsy messages", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true", + "fullTitle": "Errors isMochaError() when provided an Error object having a known Mocha error code should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "Errors isMochaError() when provided an Error object with a non-Mocha error code should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "Errors isMochaError() when provided a non-error should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cause tests to fail", + "fullTitle": "global leaks should cause tests to fail", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\globals.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass when accepted", + "fullTitle": "global leaks should pass when accepted", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\globals.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass with wildcard", + "fullTitle": "global leaks should pass with wildcard", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\globals.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass when prefixed \"mocha-\"", + "fullTitle": "global leaks should pass when prefixed \"mocha-\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\globals.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add a RegExp to the mocha.options object", + "fullTitle": "Mocha \"grep\" option should add a RegExp to the mocha.options object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should convert string to a RegExp", + "fullTitle": "Mocha \"grep\" option should convert string to a RegExp", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should escape and convert string to a RegExp", + "fullTitle": "Mocha \"fgrep\" option should escape and convert string to a RegExp", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add a RegExp to the mocha.options object", + "fullTitle": "Mocha .grep() should add a RegExp to the mocha.options object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should convert grep string to a RegExp", + "fullTitle": "Mocha .grep() should convert grep string to a RegExp", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should covert grep regex-like string to a RegExp", + "fullTitle": "Mocha .grep() should covert grep regex-like string to a RegExp", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return its parent Mocha object for chainability", + "fullTitle": "Mocha .grep() should return its parent Mocha object for chainability", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add a Boolean to the mocha.options object", + "fullTitle": "Mocha \"invert\" option should add a Boolean to the mocha.options object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "one", + "fullTitle": "async hooks one", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-async.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "two", + "fullTitle": "async hooks two", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-async.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "three", + "fullTitle": "async hooks three", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-async.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "foo", + "fullTitle": "serial nested foo", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync-nested.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "bar", + "fullTitle": "serial nested bar", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync-nested.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "one", + "fullTitle": "serial nested hooks one", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync-nested.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "two", + "fullTitle": "serial nested hooks two", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync-nested.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "one", + "fullTitle": "serial hooks one", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "two", + "fullTitle": "serial hooks two", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "three", + "fullTitle": "serial hooks three", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work", + "fullTitle": "hook timeout should work", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-timeout.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the hook._error", + "fullTitle": "Hook error should set the hook._error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should get the hook._error when called without arguments", + "fullTitle": "Hook error should get the hook._error when called without arguments", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call Runnable.reset", + "fullTitle": "Hook reset should call Runnable.reset", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset the error state", + "fullTitle": "Hook reset should reset the error state", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set _cleanReferencesAfterRun to true", + "fullTitle": "Mocha constructor should set _cleanReferencesAfterRun to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to set timeout", + "fullTitle": "Mocha constructor when `timeout` option is `undefined` should not attempt to set timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to set timeout", + "fullTitle": "Mocha constructor when `timeout` option is `false` should attempt to set timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to set globals", + "fullTitle": "Mocha constructor when `global` option is an `Array` should attempt to set globals", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to set retries`", + "fullTitle": "Mocha constructor when `retries` option is present should attempt to set retries`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to set retries", + "fullTitle": "Mocha constructor when `retries` option is not present should not attempt to set retries", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "shouid attempt to set root hooks", + "fullTitle": "Mocha constructor when `rootHooks` option is truthy shouid attempt to set root hooks", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should enable parallel mode", + "fullTitle": "Mocha constructor when `parallel` option is true and `jobs` option > 1 should enable parallel mode", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not enable parallel mode", + "fullTitle": "Mocha constructor when `parallel` option is true and `jobs` option <= 1 should not enable parallel mode", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure global setup fixtures", + "fullTitle": "Mocha constructor when `parallel` option is true when `globalSetup` option is present should configure global setup fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure global teardown fixtures", + "fullTitle": "Mocha constructor when `parallel` option is true when `globalTeardown` option is present should configure global teardown fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should toggle global setup fixtures", + "fullTitle": "Mocha constructor when `parallel` option is true when `enableGlobalSetup` option is present should toggle global setup fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure global teardown fixtures", + "fullTitle": "Mocha constructor when `parallel` option is true when `enableGlobalTeardown` option is present should configure global teardown fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the allowUncaught option to true", + "fullTitle": "Mocha instance method allowUncaught() should set the allowUncaught option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the allowUncaught option to false", + "fullTitle": "Mocha instance method allowUncaught() should set the allowUncaught option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method allowUncaught() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the asyncOnly option to true", + "fullTitle": "Mocha instance method asyncOnly() should set the asyncOnly option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the asyncOnly option to false", + "fullTitle": "Mocha instance method asyncOnly() should set the asyncOnly option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method asyncOnly() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method bail() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the \"bail\" flag on the root suite", + "fullTitle": "Mocha instance method bail() when provided no arguments should set the \"bail\" flag on the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should unset the \"bail\" flag on the root suite", + "fullTitle": "Mocha instance method bail() when provided a falsy argument should unset the \"bail\" flag on the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the checkLeaks option to true", + "fullTitle": "Mocha instance method checkLeaks() should set the checkLeaks option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the _cleanReferencesAfterRun attribute", + "fullTitle": "Mocha instance method cleanReferencesAfterRun() should set the _cleanReferencesAfterRun attribute", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the _cleanReferencesAfterRun attribute to false", + "fullTitle": "Mocha instance method cleanReferencesAfterRun() should set the _cleanReferencesAfterRun attribute to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method cleanReferencesAfterRun() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the color option to true", + "fullTitle": "Mocha instance method color() should set the color option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the color option to false", + "fullTitle": "Mocha instance method color() should set the color option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method color() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the delay option to true", + "fullTitle": "Mocha instance method delay() should set the delay option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method delay() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the diff option to true", + "fullTitle": "Mocha instance method diff() should set the diff option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the diff option to false", + "fullTitle": "Mocha instance method diff() when provided `false` argument should set the diff option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should dispose the root suite", + "fullTitle": "Mocha instance method dispose() should dispose the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should dispose previous test runner", + "fullTitle": "Mocha instance method dispose() should dispose previous test runner", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should unload the files", + "fullTitle": "Mocha instance method dispose() should unload the files", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the forbidOnly option to true", + "fullTitle": "Mocha instance method forbidOnly() should set the forbidOnly option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the forbidOnly option to false", + "fullTitle": "Mocha instance method forbidOnly() should set the forbidOnly option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method forbidOnly() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the forbidPending option to true", + "fullTitle": "Mocha instance method forbidPending() should set the forbidPending option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the forbidPending option to false", + "fullTitle": "Mocha instance method forbidPending() should set the forbidPending option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method forbidPending() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the fullTrace option to true", + "fullTitle": "Mocha instance method fullTrace() should set the fullTrace option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the fullTrace option to false", + "fullTitle": "Mocha instance method fullTrace() should set the fullTrace option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method fullTrace() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be an empty array initially", + "fullTitle": "Mocha instance method global() should be an empty array initially", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method global() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not modify the whitelist when given empty string", + "fullTitle": "Mocha instance method global() when argument is invalid should not modify the whitelist when given empty string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not modify the whitelist when given empty array", + "fullTitle": "Mocha instance method global() when argument is invalid should not modify the whitelist when given empty array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add string to the whitelist", + "fullTitle": "Mocha instance method global() when argument is valid should add string to the whitelist", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add contents of string array to the whitelist", + "fullTitle": "Mocha instance method global() when argument is valid should add contents of string array to the whitelist", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not have duplicates", + "fullTitle": "Mocha instance method global() when argument is valid should not have duplicates", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method growl() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 57, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should set the growl option to true", + "fullTitle": "Mocha instance method growl() if capable of notifications should set the growl option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the growl option to false", + "fullTitle": "Mocha instance method growl() if not capable of notifications should set the growl option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the inlineDiffs option to true", + "fullTitle": "Mocha instance method inlineDiffs() should set the inlineDiffs option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the inlineDiffs option to false", + "fullTitle": "Mocha instance method inlineDiffs() should set the inlineDiffs option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method inlineDiffs() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the invert option to true", + "fullTitle": "Mocha instance method invert() should set the invert option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method invert() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the noHighlighting option to true", + "fullTitle": "Mocha instance method noHighlighting() should set the noHighlighting option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method noHighlighting() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method reporter() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should keep reporterOption on options", + "fullTitle": "Mocha instance method reporter() should keep reporterOption on options", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should support legacy reporterOptions", + "fullTitle": "Mocha instance method reporter() should support legacy reporterOptions", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should instantiate a reporter", + "fullTitle": "Mocha instance method run() should instantiate a reporter", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should initialize the stats collector", + "fullTitle": "Mocha instance method run() should initialize the stats collector", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "currentRetry": 0, + "err": {} + }, + { + "title": "should execute the callback when complete", + "fullTitle": "Mocha instance method run() should execute the callback when complete", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should eagerly load files", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not eagerly load files", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should instantiate a Runner", + "fullTitle": "Mocha instance method run() Runner initialization should instantiate a Runner", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure \"grep\"", + "fullTitle": "Mocha instance method run() Runner initialization when \"grep\" option is present should configure \"grep\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure global vars", + "fullTitle": "Mocha instance method run() Runner initialization when \"global\" option is present should configure global vars", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should initialize growl support", + "fullTitle": "Mocha instance method run() when \"growl\" option is present should initialize growl support", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure the Base reporter", + "fullTitle": "Mocha instance method run() Base reporter initialization should configure the Base reporter", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure the Base reporter", + "fullTitle": "Mocha instance method run() Base reporter initialization when \"color\" options is set should configure the Base reporter", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call the reporter \"done\" method", + "fullTitle": "Mocha instance method run() when a reporter instance has a \"done\" method should call the reporter \"done\" method", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Mocha instance method run() when a run is in progress should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not call `Runner#runAsync`", + "fullTitle": "Mocha instance method run() when a run is in progress should not call `Runner#runAsync`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Mocha instance method run() when the `Mocha` instance is already disposed should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not call `Runner#runAsync`", + "fullTitle": "Mocha instance method run() when the `Mocha` instance is already disposed should not call `Runner#runAsync`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Mocha instance method run() when a run has finished and is called again should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not call `Runner#runAsync()`", + "fullTitle": "Mocha instance method run() when a run has finished and is called again should not call `Runner#runAsync()`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw", + "fullTitle": "Mocha instance method run() when Mocha configured for multiple runs and multiple runs are attempted should not throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call `Runner#runAsync` for each call", + "fullTitle": "Mocha instance method run() when Mocha configured for multiple runs and multiple runs are attempted should call `Runner#runAsync` for each call", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset the root Suite between runs", + "fullTitle": "Mocha instance method run() when Mocha configured for multiple runs and multiple runs are attempted should reset the root Suite between runs", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should dispose the previous runner", + "fullTitle": "Mocha instance method run() when Mocha configured for multiple runs and multiple runs are attempted should dispose the previous runner", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not run global setup fixtures", + "fullTitle": "Mocha instance method run() when global setup fixtures enabled when global setup fixtures not present should not run global setup fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should run global setup fixtures", + "fullTitle": "Mocha instance method run() when global setup fixtures enabled when global setup fixtures are present should run global setup fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not run global setup fixtures", + "fullTitle": "Mocha instance method run() when global setup fixtures disabled when global setup fixtures not present should not run global setup fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not run global setup fixtures", + "fullTitle": "Mocha instance method run() when global setup fixtures disabled when global setup fixtures are present should not run global setup fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not run global teardown fixtures", + "fullTitle": "Mocha instance method run() when global teardown fixtures enabled when global teardown fixtures not present should not run global teardown fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should run global teardown fixtures", + "fullTitle": "Mocha instance method run() when global teardown fixtures enabled when global teardown fixtures are present should run global teardown fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the same context as returned by `runGlobalSetup`", + "fullTitle": "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`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not run global teardown fixtures", + "fullTitle": "Mocha instance method run() when global teardown fixtures disabled when global teardown fixtures not present should not run global teardown fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not run global teardown fixtures", + "fullTitle": "Mocha instance method run() when global teardown fixtures disabled when global teardown fixtures are present should not run global teardown fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Mocha instance method parallelMode() when `Mocha` is running in a browser should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Mocha instance method unloadFile() when run in a browser should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should execute multiple fixtures in order", + "fullTitle": "Mocha instance method _runGlobalFixtures() should execute multiple fixtures in order", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt run the fixtures", + "fullTitle": "Mocha instance method runGlobalSetup() when fixture(s) are present should attempt run the fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to run fixtures", + "fullTitle": "Mocha instance method runGlobalSetup() when a fixture is not present should not attempt to run fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to run the fixtures", + "fullTitle": "Mocha instance method runGlobalTeardown() when fixture(s) are present should attempt to run the fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "not attempt to run the fixtures", + "fullTitle": "Mocha instance method runGlobalTeardown() when a fixture is not present not attempt to run the fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `true`", + "fullTitle": "Mocha instance method hasGlobalSetupFixtures() when one or more global setup fixtures are present should return `true`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `false`", + "fullTitle": "Mocha instance method hasGlobalSetupFixtures() when no global setup fixtures are present should return `false`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `true`", + "fullTitle": "Mocha instance method hasGlobalTeardownFixtures() when one or more global teardown fixtures are present should return `true`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `false`", + "fullTitle": "Mocha instance method hasGlobalTeardownFixtures() when no global teardown fixtures are present should return `false`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method rootHooks() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach it to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided a single \"before all\" hook should attach it to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach it to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided a single \"before each\" hook should attach it to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach it to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided a single \"after all\" hook should attach it to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach it to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided a single \"after each\" hook should attach it to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach each to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided multiple \"before all\" hooks should attach each to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach each to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided multiple \"before each\" hooks should attach each to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach each to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided multiple \"after all\" hooks should attach each to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach each to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided multiple \"after each\" hooks should attach each to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail when multiple methods are used", + "fullTitle": "overspecified asynchronous resolution method should fail when multiple methods are used", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\overspecified-async.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should get queryString and return key-value object", + "fullTitle": "parseQuery() should get queryString and return key-value object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\parse-query.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should parse \"+\" as a space", + "fullTitle": "parseQuery() should parse \"+\" as a space", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\parse-query.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should populate a registry of built-in plugins", + "fullTitle": "plugin module class PluginLoader constructor when passed no options should populate a registry of built-in plugins", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should register the custom plugins", + "fullTitle": "plugin module class PluginLoader constructor when passed custom plugins should register the custom plugins", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should retain a list of ignored plugins", + "fullTitle": "plugin module class PluginLoader constructor when passed ignored plugins should retain a list of ignored plugins", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a PluginLoader instance", + "fullTitle": "plugin module class PluginLoader static method create() should return a PluginLoader instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw", + "fullTitle": "plugin module class PluginLoader instance method register() when the plugin export name is not in use should not throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "plugin module class PluginLoader instance method register() when the plugin export name is already in use should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw", + "fullTitle": "plugin module class PluginLoader instance method register() when the plugin export name is ignored should not throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not register the plugin", + "fullTitle": "plugin module class PluginLoader instance method register() when the plugin export name is ignored should not register the plugin", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "plugin module class PluginLoader instance method register() when passed a falsy parameter should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "plugin module class PluginLoader instance method register() when passed a non-object parameter should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "plugin module class PluginLoader instance method register() when passed a definition w/o an exportName should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "plugin module class PluginLoader instance method load() when called with a falsy value should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "plugin module class PluginLoader instance method load() when called with an object containing no recognized plugin should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true", + "fullTitle": "plugin module class PluginLoader instance method load() when called with an object containing a recognized plugin should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should retain the value of any matching property in its mapping", + "fullTitle": "plugin module class PluginLoader instance method load() when called with an object containing a recognized plugin should retain the value of any matching property in its mapping", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call the associated validator, if present", + "fullTitle": "plugin module class PluginLoader instance method load() when called with an object containing a recognized plugin should call the associated validator, if present", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "plugin module class PluginLoader instance method load() when passed a falsy or non-object value should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not call a validator", + "fullTitle": "plugin module class PluginLoader instance method load() when passed a falsy or non-object value should not call a validator", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "plugin module class PluginLoader instance method load() when passed an object value when no keys match any known named exports should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call the associated validator", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not call validators whose keys were not found", + "fullTitle": "plugin module class PluginLoader instance method load() when passed an object value when a key matches a known named export should not call validators whose keys were not found", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true", + "fullTitle": "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 return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add the implementation to the internal mapping", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not add an implementation of plugins not present", + "fullTitle": "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 not add an implementation of plugins not present", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an empty map", + "fullTitle": "plugin module class PluginLoader instance method finalize() when no plugins have been loaded should return an empty map", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an object map using `optionName` key for each registered plugin", + "fullTitle": "plugin module class PluginLoader instance method finalize() when a plugin has one or more implementations should return an object map using `optionName` key for each registered plugin", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should omit unused plugins", + "fullTitle": "plugin module class PluginLoader instance method finalize() when a plugin has one or more implementations should omit unused plugins", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an array of raw implementations", + "fullTitle": "plugin module class PluginLoader instance method finalize() when a plugin has no \"finalize\" function should return an array of raw implementations", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail validation", + "fullTitle": "plugin module root hooks plugin 🎣 when impl is an array should fail validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail validation", + "fullTitle": "plugin module root hooks plugin 🎣 when impl is a primitive should fail validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass validation", + "fullTitle": "plugin module root hooks plugin 🎣 when impl is a function should pass validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass validation", + "fullTitle": "plugin module root hooks plugin 🎣 when impl is an object of functions should pass validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "currentRetry": 0, + "err": {} + }, + { + "title": "should flatten the implementations", + "fullTitle": "plugin module root hooks plugin 🎣 when a loaded impl is finalized should flatten the implementations", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail validation", + "fullTitle": "plugin module global fixtures plugin global setup when an implementation is a primitive should fail validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail validation", + "fullTitle": "plugin module global fixtures plugin global setup when an implementation is an array of primitives should fail validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass validation", + "fullTitle": "plugin module global fixtures plugin global setup when an implementation is a function should pass validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass validation", + "fullTitle": "plugin module global fixtures plugin global setup when an implementation is an array of functions should pass validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail validation", + "fullTitle": "plugin module global fixtures plugin global teardown when an implementation is a primitive should fail validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail validation", + "fullTitle": "plugin module global fixtures plugin global teardown when an implementation is an array of primitives should fail validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass validation", + "fullTitle": "plugin module global fixtures plugin global teardown when an implementation is a function should pass validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass validation", + "fullTitle": "plugin module global fixtures plugin global teardown when an implementation is an array of functions should pass validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "using imported it", + "fullTitle": "using imported describe using imported it", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\required-tokens.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be a valid suite", + "fullTitle": "root should be a valid suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\root.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should clamp to lower bound given numeric", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is less than lower bound should clamp to lower bound given numeric", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should clamp to lower bound given timestamp", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is less than lower bound should clamp to lower bound given timestamp", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the timeout value to disabled", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is equal to lower bound given numeric value should set the timeout value to disabled", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the timeout value to disabled", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is equal to lower bound given string timestamp should set the timeout value to disabled", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the timeout value", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is within `setTimeout` bounds given numeric value should set the timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the timeout value", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is within `setTimeout` bounds given string timestamp should set the timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the disabled timeout value", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is equal to upper bound given numeric value should set the disabled timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the disabled timeout value", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is out-of-bounds given numeric value should set the disabled timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the slow threshold", + "fullTitle": "Runnable(title, fn) #slow(ms) should set the slow threshold", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not set the slow threshold if the parameter is not passed", + "fullTitle": "Runnable(title, fn) #slow(ms) should not set the slow threshold if the parameter is not passed", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not set the slow threshold if the parameter is undefined", + "fullTitle": "Runnable(title, fn) #slow(ms) should not set the slow threshold if the parameter is undefined", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should convert to ms", + "fullTitle": "Runnable(title, fn) #slow(ms) when passed a time-formatted string should convert to ms", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset current run state", + "fullTitle": "Runnable(title, fn) #reset should reset current run state", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be present", + "fullTitle": "Runnable(title, fn) .title should be present", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "returns the concatenation of the parent's title path and runnable's title", + "fullTitle": "Runnable(title, fn) .titlePath() returns the concatenation of the parent's title path and runnable's title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be .async", + "fullTitle": "Runnable(title, fn) when arity >= 1 should be .async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not be .sync", + "fullTitle": "Runnable(title, fn) when arity >= 1 should not be .sync", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not be .async", + "fullTitle": "Runnable(title, fn) when arity == 0 should not be .async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be .sync", + "fullTitle": "Runnable(title, fn) when arity == 0 should be .sync", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow for whitelisting globals", + "fullTitle": "Runnable(title, fn) #globals should allow for whitelisting globals", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the number of retries", + "fullTitle": "Runnable(title, fn) #retries(n) should set the number of retries", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when .pending should not invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when sync without error should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback with error", + "fullTitle": "Runnable(title, fn) .run(fn) when sync when an exception is thrown should invoke the callback with error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 4, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "throws an error when it is allowed", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not error with timeout", + "fullTitle": "Runnable(title, fn) .run(fn) when timeouts are disabled should not error with timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 6, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow updating the timeout", + "fullTitle": "Runnable(title, fn) .run(fn) when async should allow updating the timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 51, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should allow a timeout of 0", + "fullTitle": "Runnable(title, fn) .run(fn) when async should allow a timeout of 0", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when async without error should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit a single \"error\" event", + "fullTitle": "Runnable(title, fn) .run(fn) when async when the callback is invoked several times without an error should emit a single \"error\" event", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit a single \"error\" event", + "fullTitle": "Runnable(title, fn) .run(fn) when async when the callback is invoked several times with an error should emit a single \"error\" event", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when async when an exception is thrown should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw its own exception if passed a non-object", + "fullTitle": "Runnable(title, fn) .run(fn) when async when an exception is thrown should not throw its own exception if passed a non-object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "throws an error when it is allowed", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when async when an error is passed should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when async when done() is invoked with a non-Error object should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when async when done() is invoked with a string should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise is fulfilled with no value should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise is fulfilled with a value should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise is rejected should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise is rejected without a reason should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw the timeout error", + "fullTitle": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise takes too long to settle should throw the timeout error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 12, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when fn returns a non-promise should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should ignore call to `done` and not execute callback again", + "fullTitle": "Runnable(title, fn) .run(fn) if timed-out should ignore call to `done` and not execute callback again", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 11, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "this.skip() should set runnable to pending", + "fullTitle": "Runnable(title, fn) .run(fn) if async this.skip() should set runnable to pending", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "this.skip() should halt synchronous execution", + "fullTitle": "Runnable(title, fn) .run(fn) if async this.skip() should halt synchronous execution", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw an error", + "fullTitle": "Runnable(title, fn) .run(fn) when fn is not a function should throw an error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `true` if test has not failed", + "fullTitle": "Runnable(title, fn) #isFailed() should return `true` if test has not failed", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `true` if test has failed", + "fullTitle": "Runnable(title, fn) #isFailed() should return `true` if test has failed", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `false` if test is pending", + "fullTitle": "Runnable(title, fn) #isFailed() should return `false` if test is pending", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not time out if timeouts disabled after reset", + "fullTitle": "Runnable(title, fn) #resetTimeout() should not time out if timeouts disabled after reset", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 21, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return identity if parameter is truthy", + "fullTitle": "Runnable(title, fn) static method toValueOrError should return identity if parameter is truthy", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an Error if parameter is falsy", + "fullTitle": "Runnable(title, fn) static method toValueOrError should return an Error if parameter is falsy", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should have a unique identifier", + "fullTitle": "Runnable(title, fn) interesting property id should have a unique identifier", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should have a permanent identifier", + "fullTitle": "Runnable(title, fn) interesting property id should have a permanent identifier", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should update the runner.total with number of matched tests", + "fullTitle": "Runner instance method grep() should update the runner.total with number of matched tests", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should update the runner.total with number of matched tests when inverted", + "fullTitle": "Runner instance method grep() should update the runner.total with number of matched tests when inverted", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the total number of matched tests", + "fullTitle": "Runner instance method grepTotal() should return the total number of matched tests", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the total number of matched tests when inverted", + "fullTitle": "Runner instance method grepTotal() should return the total number of matched tests when inverted", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include common non enumerable globals", + "fullTitle": "Runner instance method globalProps() should include common non enumerable globals", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should default to the known globals", + "fullTitle": "Runner instance method globals() should default to the known globals", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should white-list globals", + "fullTitle": "Runner instance method globals() should white-list globals", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow variables that match a wildcard", + "fullTitle": "Runner instance method checkGlobals(test) should allow variables that match a wildcard", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit \"fail\" when a new global is introduced", + "fullTitle": "Runner instance method checkGlobals(test) should emit \"fail\" when a new global is introduced", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit \"fail\" when a single new disallowed global is introduced after a single extra global is allowed", + "fullTitle": "Runner instance method checkGlobals(test) should emit \"fail\" when a single new disallowed global is introduced after a single extra global is allowed", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not fail when a new common global is introduced", + "fullTitle": "Runner instance method checkGlobals(test) should not fail when a new common global is introduced", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pluralize the error message when several are introduced", + "fullTitle": "Runner instance method checkGlobals(test) should pluralize the error message when several are introduced", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should respect per test whitelisted globals", + "fullTitle": "Runner instance method checkGlobals(test) should respect per test whitelisted globals", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should respect per test whitelisted globals but still detect other leaks", + "fullTitle": "Runner instance method checkGlobals(test) should respect per test whitelisted globals but still detect other leaks", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit \"fail\" when a global beginning with \"d\" is introduced", + "fullTitle": "Runner instance method checkGlobals(test) should emit \"fail\" when a global beginning with \"d\" is introduced", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should execute hooks after failed test if suite bail is true", + "fullTitle": "Runner instance method hook() should execute hooks after failed test if suite bail is true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should augment hook title with current test title", + "fullTitle": "Runner instance method hook() should augment hook title with current test title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should increment `Runner#failures`", + "fullTitle": "Runner instance method fail() should increment `Runner#failures`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set `Test#state` to \"failed\"", + "fullTitle": "Runner instance method fail() should set `Test#state` to \"failed\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit \"fail\"", + "fullTitle": "Runner instance method fail() should emit \"fail\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit a helpful message when failed with a string", + "fullTitle": "Runner instance method fail() should emit a helpful message when failed with a string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit a the error when failed with an Error instance", + "fullTitle": "Runner instance method fail() should emit a the error when failed with an Error instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit the error when failed with an Error-like object", + "fullTitle": "Runner instance method fail() should emit the error when failed with an Error-like object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit a helpful message when failed with an Object", + "fullTitle": "Runner instance method fail() should emit a helpful message when failed with an Object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit a helpful message when failed with an Array", + "fullTitle": "Runner instance method fail() should emit a helpful message when failed with an Array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recover if the error stack is not writable", + "fullTitle": "Runner instance method fail() should recover if the error stack is not writable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return and not increment failures when test is pending", + "fullTitle": "Runner instance method fail() should return and not increment failures when test is pending", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should increment .failures", + "fullTitle": "Runner instance method fail() should increment .failures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit \"fail\"", + "fullTitle": "Runner instance method fail() should emit \"fail\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not emit \"end\" if suite bail is not true", + "fullTitle": "Runner instance method fail() should not emit \"end\" if suite bail is not true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw the \"multiple done\" error", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw a \"fatal\" error", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit \"retry\" when a retryable test fails", + "fullTitle": "Runner instance method run() should emit \"retry\" when a retryable test fails", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw an exception if something emits EVENT_TEST_END with a non-Test object", + "fullTitle": "Runner instance method run() should not throw an exception if something emits EVENT_TEST_END with a non-Test object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should clean references after a run", + "fullTitle": "Runner instance method run() should clean references after a run", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not clean references after a run when `cleanReferencesAfterRun` is `false`", + "fullTitle": "Runner instance method run() should not clean references after a run when `cleanReferencesAfterRun` is `false`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not leak `Process.uncaughtException` listeners", + "fullTitle": "Runner instance method run() should not leak `Process.uncaughtException` listeners", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should prettify the stack-trace", + "fullTitle": "Runner instance method run() stack traces short should prettify the stack-trace", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should display the full stack-trace", + "fullTitle": "Runner instance method run() stack traces long should display the full stack-trace", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not hang if overlong error message is single line", + "fullTitle": "Runner instance method run() stack traces ginormous should not hang if overlong error message is single line", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not hang if overlong error message is multiple lines", + "fullTitle": "Runner instance method run() stack traces ginormous should not hang if overlong error message is multiple lines", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a Promise with a failure count", + "fullTitle": "Runner instance method runAsync() should return a Promise with a failure count", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass through options to Runner#run", + "fullTitle": "Runner instance method runAsync() should pass through options to Runner#run", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove all listeners from itself", + "fullTitle": "Runner instance method dispose() should remove all listeners from itself", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove \"error\" listeners from a test", + "fullTitle": "Runner instance method dispose() should remove \"error\" listeners from a test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove \"uncaughtException\" listeners from the process", + "fullTitle": "Runner instance method dispose() should remove \"uncaughtException\" listeners from the process", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return when no tests to run", + "fullTitle": "Runner instance method runTest() should return when no tests to run", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow unhandled errors to propagate through", + "fullTitle": "Runner instance method allowUncaught() should allow unhandled errors to propagate through", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not allow unhandled errors in sync hooks to propagate through", + "fullTitle": "Runner instance method allowUncaught() should not allow unhandled errors in sync hooks to propagate through", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow unhandled errors in sync hooks to propagate through", + "fullTitle": "Runner instance method allowUncaught() should allow unhandled errors in sync hooks to propagate through", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "async - should allow unhandled errors in hooks to propagate through", + "fullTitle": "Runner instance method allowUncaught() async - should allow unhandled errors in hooks to propagate through", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set _abort property to true", + "fullTitle": "Runner instance method abort() should set _abort property to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the Runner", + "fullTitle": "Runner instance method abort() should return the Runner", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Runner instance method _uncaught() when called with a non-Runner context should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should propagate error and throw", + "fullTitle": "Runner instance method uncaught() when allow-uncaught is set to true should propagate error and throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail with a transient Runnable and a new Error coerced from the object", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should ignore argument and return", + "fullTitle": "Runner instance method uncaught() when provided an object argument when argument is a Pending should ignore argument and return", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add the \"uncaught\" property to the Error", + "fullTitle": "Runner instance method uncaught() when provided an object argument when argument is an Error should add the \"uncaught\" property to the Error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail with a transient Runnable and the error", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not emit start/end events", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit start/end events for the benefit of reporters", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not emit start/end events, since this presumably would have already happened", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Runner instance method uncaught() when provided an object argument when argument is an Error when no Runnables are running when Runner is STOPPED should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should clear any pending timeouts", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to fail again", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to fail", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail with the current Runnable and the error", + "fullTitle": "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 fail with the current Runnable and the error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should abort the runner without emitting end event", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should run callback(err) to handle failing and hooks", + "fullTitle": "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 run callback(err) to handle failing and hooks", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not notify test has ended", + "fullTitle": "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 test has ended", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not notify run has ended", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should run callback(err) to handle failing hook pattern", + "fullTitle": "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 run callback(err) to handle failing hook pattern", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not notify test has ended", + "fullTitle": "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 test has ended", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not notify run has ended", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the Runner", + "fullTitle": "Runner instance method linkPartialObjects() should return the Runner", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "Runner instance method isParallelMode() should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Runner instance method workerReporter() should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should clone the Suite, omitting children", + "fullTitle": "Suite instance method clone() should clone the Suite, omitting children", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset the `delayed` state", + "fullTitle": "Suite instance method reset() should reset the `delayed` state", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should forward reset to suites and tests", + "fullTitle": "Suite instance method reset() should forward reset to suites and tests", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should forward reset to all hooks", + "fullTitle": "Suite instance method reset() should forward reset to all hooks", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the timeout value", + "fullTitle": "Suite instance method timeout() when no argument is passed should return the timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the Suite object", + "fullTitle": "Suite instance method timeout() when argument is passed should return the Suite object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should parse it", + "fullTitle": "Suite instance method slow() when given a string should parse it", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the slow value", + "fullTitle": "Suite instance method slow() when no argument is passed should return the slow value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the Suite object", + "fullTitle": "Suite instance method slow() when argument is passed should return the Suite object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the bail value", + "fullTitle": "Suite instance method bail() when no argument is passed should return the bail value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the Suite object", + "fullTitle": "Suite instance method bail() when argument is passed should return the Suite object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "adds it to _beforeAll", + "fullTitle": "Suite instance method beforeAll() wraps the passed in function in a Hook adds it to _beforeAll", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "appends title to hook", + "fullTitle": "Suite instance method beforeAll() wraps the passed in function in a Hook appends title to hook", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "uses function name if available", + "fullTitle": "Suite instance method beforeAll() wraps the passed in function in a Hook uses function name if available", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "adds it to _afterAll", + "fullTitle": "Suite instance method afterAll() wraps the passed in function in a Hook adds it to _afterAll", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "appends title to hook", + "fullTitle": "Suite instance method afterAll() wraps the passed in function in a Hook appends title to hook", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "uses function name if available", + "fullTitle": "Suite instance method afterAll() wraps the passed in function in a Hook uses function name if available", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "adds it to _beforeEach", + "fullTitle": "Suite instance method beforeEach() wraps the passed in function in a Hook adds it to _beforeEach", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "appends title to hook", + "fullTitle": "Suite instance method beforeEach() wraps the passed in function in a Hook appends title to hook", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "uses function name if available", + "fullTitle": "Suite instance method beforeEach() wraps the passed in function in a Hook uses function name if available", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not create a hook", + "fullTitle": "Suite instance method beforeEach() when the suite is pending should not create a hook", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "adds it to _afterEach", + "fullTitle": "Suite instance method afterEach() wraps the passed in function in a Hook adds it to _afterEach", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "appends title to hook", + "fullTitle": "Suite instance method afterEach() wraps the passed in function in a Hook appends title to hook", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "uses function name if available", + "fullTitle": "Suite instance method afterEach() wraps the passed in function in a Hook uses function name if available", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "does not create a second root suite", + "fullTitle": "Suite instance method create() does not create a second root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "does not denote the root suite by being titleless", + "fullTitle": "Suite instance method create() does not denote the root suite by being titleless", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "sets the parent on the added Suite", + "fullTitle": "Suite instance method addSuite() sets the parent on the added Suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "copies the timeout value", + "fullTitle": "Suite instance method addSuite() copies the timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "copies the slow value", + "fullTitle": "Suite instance method addSuite() copies the slow value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "adds the suite to the suites collection", + "fullTitle": "Suite instance method addSuite() adds the suite to the suites collection", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "treats suite as pending if its parent is pending", + "fullTitle": "Suite instance method addSuite() treats suite as pending if its parent is pending", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "sets the parent on the added test", + "fullTitle": "Suite instance method addTest() sets the parent on the added test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "copies the timeout value", + "fullTitle": "Suite instance method addTest() copies the timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "adds the test to the tests collection", + "fullTitle": "Suite instance method addTest() adds the test to the tests collection", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "returns the suite title", + "fullTitle": "Suite instance method fullTitle() when there is no parent returns the suite title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "returns the combination of parent's and suite's title", + "fullTitle": "Suite instance method fullTitle() when there is a parent returns the combination of parent's and suite's title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "returns the suite title", + "fullTitle": "Suite instance method titlePath() when there is no parent returns the suite title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "returns the suite title", + "fullTitle": "Suite instance method titlePath() when there is a parent the parent is the root suite returns the suite title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "returns the concatenation of parent's and suite's title", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return 0", + "fullTitle": "Suite instance method total() when there are no nested suites or tests should return 0", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the number", + "fullTitle": "Suite instance method total() when there are several tests in the suite should return the number", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return 0", + "fullTitle": "Suite instance method eachTest(fn) when there are no nested suites or tests should return 0", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the number", + "fullTitle": "Suite instance method eachTest(fn) when there are several tests in the suite should return the number", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the number", + "fullTitle": "Suite instance method eachTest(fn) when there are several levels of nested suites should return the number", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw an error if the title isn't a string", + "fullTitle": "Suite instance method constructor should throw an error if the title isn't a string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw if the title is a string", + "fullTitle": "Suite instance method constructor should not throw if the title is a string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should report listened-for deprecated events as deprecated", + "fullTitle": "Suite instance method constructor should report listened-for deprecated events as deprecated", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should convert a string to milliseconds", + "fullTitle": "Suite instance method timeout() should convert a string to milliseconds", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true if a test has `only`", + "fullTitle": "Suite instance method hasOnly() should return true if a test has `only`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true if a suite has `only`", + "fullTitle": "Suite instance method hasOnly() should return true if a suite has `only`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true if nested suite has `only`", + "fullTitle": "Suite instance method hasOnly() should return true if nested suite has `only`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false if no suite or test is marked `only`", + "fullTitle": "Suite instance method hasOnly() should return false if no suite or test is marked `only`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should filter out all other tests and suites if a test has `only`", + "fullTitle": "Suite instance method filterOnly() should filter out all other tests and suites if a test has `only`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should filter out all other tests and suites if a suite has `only`", + "fullTitle": "Suite instance method filterOnly() should filter out all other tests and suites if a suite has `only`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call appendOnlySuite on parent", + "fullTitle": "Suite instance method markOnly() should call appendOnlySuite on parent", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw an error if the title isn't a string", + "fullTitle": "Test initialization should throw an error if the title isn't a string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw if the title is a string", + "fullTitle": "Test initialization should not throw if the title is a string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the title", + "fullTitle": "Test .clone() should copy the title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the timeout value", + "fullTitle": "Test .clone() should copy the timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the slow value", + "fullTitle": "Test .clone() should copy the slow value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the retries value", + "fullTitle": "Test .clone() should copy the retries value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the currentRetry value", + "fullTitle": "Test .clone() should copy the currentRetry value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add/keep the retriedTest value", + "fullTitle": "Test .clone() should add/keep the retriedTest value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the globals value", + "fullTitle": "Test .clone() should copy the globals value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the parent value", + "fullTitle": "Test .clone() should copy the parent value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the file value", + "fullTitle": "Test .clone() should copy the file value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset the run state", + "fullTitle": "Test .reset() should reset the run state", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call Runnable.reset", + "fullTitle": "Test .reset() should call Runnable.reset", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not be pending by default", + "fullTitle": "Test .isPending() should not be pending by default", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be pending when marked as such", + "fullTitle": "Test .isPending() should be pending when marked as such", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be pending when its parent is pending", + "fullTitle": "Test .isPending() should be pending when its parent is pending", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call appendOnlyTest on parent", + "fullTitle": "Test .markOnly() should call appendOnlyTest on parent", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing sync and test is sync", + "fullTitle": "a test that throws non-extensible should not pass if throwing sync and test is sync", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing sync and test is async", + "fullTitle": "a test that throws non-extensible should not pass if throwing sync and test is async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing async and test is async", + "fullTitle": "a test that throws non-extensible should not pass if throwing async and test is async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing sync and test is sync", + "fullTitle": "a test that throws undefined should not pass if throwing sync and test is sync", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing sync and test is async", + "fullTitle": "a test that throws undefined should not pass if throwing sync and test is async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing async and test is async", + "fullTitle": "a test that throws undefined should not pass if throwing async and test is async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing sync and test is sync", + "fullTitle": "a test that throws null should not pass if throwing sync and test is sync", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing sync and test is async", + "fullTitle": "a test that throws null should not pass if throwing sync and test is async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing async and test is async", + "fullTitle": "a test that throws null should not pass if throwing async and test is async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should error on timeout", + "fullTitle": "timeouts should error on timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow overriding per-test", + "fullTitle": "timeouts should allow overriding per-test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 50, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should work with timeout(0)", + "fullTitle": "timeouts disabling should work with timeout(0)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work with timeout(0)", + "fullTitle": "timeouts disabling using beforeEach should work with timeout(0)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work with timeout(0)", + "fullTitle": "timeouts disabling using before should work with timeout(0)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should suppress timeout(4)", + "fullTitle": "timeouts disabling using timeout(0) should suppress timeout(4)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 50, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work with timeout(0)", + "fullTitle": "timeouts disabling suite-level should work with timeout(0)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work with timeout(0)", + "fullTitle": "timeouts disabling suite-level nested suite should work with timeout(0)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove the wrapping function declaration", + "fullTitle": "lib/utils clean() should remove the wrapping function declaration", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle newlines in the function declaration", + "fullTitle": "lib/utils clean() should handle newlines in the function declaration", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove space character indentation from the function body", + "fullTitle": "lib/utils clean() should remove space character indentation from the function body", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove tab character indentation from the function body", + "fullTitle": "lib/utils clean() should remove tab character indentation from the function body", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle functions with tabs in their declarations", + "fullTitle": "lib/utils clean() should handle functions with tabs in their declarations", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle named functions without space after name", + "fullTitle": "lib/utils clean() should handle named functions without space after name", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle named functions with space after name", + "fullTitle": "lib/utils clean() should handle named functions with space after name", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle functions with no space between the end and the closing brace", + "fullTitle": "lib/utils clean() should handle functions with no space between the end and the closing brace", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle functions with parentheses in the same line", + "fullTitle": "lib/utils clean() should handle functions with parentheses in the same line", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle empty functions", + "fullTitle": "lib/utils clean() should handle empty functions", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format a single line test function", + "fullTitle": "lib/utils clean() should format a single line test function", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format a multi line test indented with spaces", + "fullTitle": "lib/utils clean() should format a multi line test indented with spaces", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format a multi line test indented with tabs", + "fullTitle": "lib/utils clean() should format a multi line test indented with tabs", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format functions saved in windows style - spaces", + "fullTitle": "lib/utils clean() should format functions saved in windows style - spaces", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format functions saved in windows style - tabs", + "fullTitle": "lib/utils clean() should format functions saved in windows style - tabs", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format es6 arrow functions", + "fullTitle": "lib/utils clean() should format es6 arrow functions", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format es6 arrow functions with implicit return", + "fullTitle": "lib/utils clean() should format es6 arrow functions with implicit return", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an object representation of a string created with a String constructor", + "fullTitle": "lib/utils stringify() should return an object representation of a string created with a String constructor", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return Buffer with .toJSON representation", + "fullTitle": "lib/utils stringify() should return Buffer with .toJSON representation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return Date object with .toISOString() + string prefix", + "fullTitle": "lib/utils stringify() should return Date object with .toISOString() + string prefix", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return invalid Date object with .toString() + string prefix", + "fullTitle": "lib/utils stringify() should return invalid Date object with .toString() + string prefix", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should canonicalize the object", + "fullTitle": "lib/utils stringify() should canonicalize the object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle circular structures in objects", + "fullTitle": "lib/utils stringify() should handle circular structures in objects", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle circular structures in arrays", + "fullTitle": "lib/utils stringify() should handle circular structures in arrays", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle circular structures in functions", + "fullTitle": "lib/utils stringify() should handle circular structures in functions", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle various non-undefined, non-null, non-object, non-array, non-date, and non-function values", + "fullTitle": "lib/utils stringify() should handle various non-undefined, non-null, non-object, non-array, non-date, and non-function values", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle arrays", + "fullTitle": "lib/utils stringify() should handle arrays", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle functions", + "fullTitle": "lib/utils stringify() should handle functions", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle empty objects", + "fullTitle": "lib/utils stringify() should handle empty objects", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle empty arrays", + "fullTitle": "lib/utils stringify() should handle empty arrays", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle non-empty arrays", + "fullTitle": "lib/utils stringify() should handle non-empty arrays", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle empty functions (with no properties)", + "fullTitle": "lib/utils stringify() should handle empty functions (with no properties)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle functions w/ properties", + "fullTitle": "lib/utils stringify() should handle functions w/ properties", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle undefined values", + "fullTitle": "lib/utils stringify() should handle undefined values", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recurse", + "fullTitle": "lib/utils stringify() should recurse", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "might get confusing", + "fullTitle": "lib/utils stringify() might get confusing", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not freak out if it sees a primitive twice", + "fullTitle": "lib/utils stringify() should not freak out if it sees a primitive twice", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should stringify dates", + "fullTitle": "lib/utils stringify() should stringify dates", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle object without an Object prototype", + "fullTitle": "lib/utils stringify() should handle object without an Object prototype", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle Symbol", + "fullTitle": "lib/utils stringify() should handle Symbol", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle length properties that cannot be coerced to a number", + "fullTitle": "lib/utils stringify() should handle length properties that cannot be coerced to a number", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should show the handle -0 situations", + "fullTitle": "lib/utils stringify() #Number should show the handle -0 situations", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work well with `NaN` and `Infinity`", + "fullTitle": "lib/utils stringify() #Number should work well with `NaN` and `Infinity`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "floats and ints", + "fullTitle": "lib/utils stringify() #Number floats and ints", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work with bigints when possible", + "fullTitle": "lib/utils stringify() #Number should work with bigints when possible", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should represent the actual full result", + "fullTitle": "lib/utils stringify() canonicalize example should represent the actual full result", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recognize various types", + "fullTitle": "lib/utils type() should recognize various types", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recognize null and undefined", + "fullTitle": "lib/utils type() when toString on null or undefined stringifies window should recognize null and undefined", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recognize various types", + "fullTitle": "lib/utils canonicalType() should recognize various types", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recognize null and undefined", + "fullTitle": "lib/utils canonicalType() when toString on null or undefined stringifies window should recognize null and undefined", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true if the value is Promise-ish", + "fullTitle": "lib/utils isPromise() should return true if the value is Promise-ish", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false if the value is not an object", + "fullTitle": "lib/utils isPromise() should return false if the value is not an object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false if the value is an object w/o a \"then\" function", + "fullTitle": "lib/utils isPromise() should return false if the value is an object w/o a \"then\" function", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false if the object is null", + "fullTitle": "lib/utils isPromise() should return false if the object is null", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "replaces the usual xml suspects", + "fullTitle": "lib/utils escape() replaces the usual xml suspects", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "replaces invalid xml characters", + "fullTitle": "lib/utils escape() replaces invalid xml characters", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return its input as string wrapped in single quotes", + "fullTitle": "lib/utils sQuote() should return its input as string wrapped in single quotes", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return its input as string wrapped in double quotes", + "fullTitle": "lib/utils dQuote() should return its input as string wrapped in double quotes", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an object with a null prototype", + "fullTitle": "lib/utils createMap() should return an object with a null prototype", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add props to the object", + "fullTitle": "lib/utils createMap() should add props to the object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add props from all object parameters to the object", + "fullTitle": "lib/utils createMap() should add props from all object parameters to the object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should convert the string to lowercase", + "fullTitle": "lib/utils slug() should convert the string to lowercase", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should convert whitespace to dashes", + "fullTitle": "lib/utils slug() should convert whitespace to dashes", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should strip non-alphanumeric and non-dash characters", + "fullTitle": "lib/utils slug() should strip non-alphanumeric and non-dash characters", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should disallow consecutive dashes", + "fullTitle": "lib/utils slug() should disallow consecutive dashes", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a copy of the array", + "fullTitle": "lib/utils castArray() when provided an array value should return a copy of the array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an array containing the arguments", + "fullTitle": "lib/utils castArray() when provided an \"arguments\" value should return an array containing the arguments", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an array containing the object only", + "fullTitle": "lib/utils castArray() when provided an object should return an array containing the object only", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an empty array", + "fullTitle": "lib/utils castArray() when provided no parameters should return an empty array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an array containing the primitive value only", + "fullTitle": "lib/utils castArray() when provided a primitive value should return an array containing the primitive value only", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an array containing a null value only", + "fullTitle": "lib/utils castArray() when provided null should return an array containing a null value only", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should print a deprecation message", + "fullTitle": "lib/utils lookupFiles() when run in Node.js should print a deprecation message", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should delegate to new location of lookupFiles()", + "fullTitle": "lib/utils lookupFiles() when run in Node.js should delegate to new location of lookupFiles()", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "lib/utils lookupFiles() when run in browser should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a non-empty string", + "fullTitle": "lib/utils uniqueID() should return a non-empty string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a BufferedWorkerPool instance", + "fullTitle": "class BufferedWorkerPool static method create() should return a BufferedWorkerPool instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw", + "fullTitle": "class BufferedWorkerPool static method create() when passed no arguments should not throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a serialized string", + "fullTitle": "class BufferedWorkerPool static method serializeOptions() should return a serialized string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw", + "fullTitle": "class BufferedWorkerPool static method serializeOptions() when passed no arguments should not throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not perform serialization twice", + "fullTitle": "class BufferedWorkerPool static method serializeOptions() when called multiple times with the same object should not perform serialization twice", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the same value", + "fullTitle": "class BufferedWorkerPool static method serializeOptions() when called multiple times with the same object should return the same value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should apply defaults", + "fullTitle": "class BufferedWorkerPool constructor should apply defaults", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the object returned by `workerpool.Pool#stats`", + "fullTitle": "class BufferedWorkerPool instance method stats() should return the object returned by `workerpool.Pool#stats`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should serialize the options object", + "fullTitle": "class BufferedWorkerPool instance method run() should serialize the options object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should deserialize the result", + "fullTitle": "class BufferedWorkerPool instance method run() should deserialize the result", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "class BufferedWorkerPool instance method run() when passed no arguments should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "class BufferedWorkerPool instance method run() when passed a non-string filepath should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should delegate to the underlying pool w/ \"force\" behavior", + "fullTitle": "class BufferedWorkerPool instance method terminate() when called with `force` should delegate to the underlying pool w/ \"force\" behavior", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should delegate to the underlying pool w/o \"force\" behavior", + "fullTitle": "class BufferedWorkerPool instance method terminate() when called without `force` should delegate to the underlying pool w/o \"force\" behavior", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the YAML parser", + "fullTitle": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \".yaml\" extension should use the YAML parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the YAML parser", + "fullTitle": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \".yml\" extension should use the YAML parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the JS parser", + "fullTitle": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \".js\" extension should use the JS parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the JS parser", + "fullTitle": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \".cjs\" extension should use the JS parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the JSON parser", + "fullTitle": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \".jsonc\" extension should use the JSON parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the JSON parser", + "fullTitle": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \".json\" extension should use the JSON parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the JSON parser", + "fullTitle": "cli/config loadConfig() when supplied a filepath with unsupported extension should use the JSON parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "cli/config loadConfig() when config file parsing fails should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should look for one of the config files using findup-sync", + "fullTitle": "cli/config findConfig() should look for one of the config files using findup-sync", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should support an explicit `cwd`", + "fullTitle": "cli/config findConfig() should support an explicit `cwd`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--icu-data-dir should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --icu-data-dir should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--title should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --title should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-import-meta-resolve should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-import-meta-resolve should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--use-largepages should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --use-largepages should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-tls should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-tls should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-event-categories should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-event-categories should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--conditions should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --conditions should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-event-file-pattern should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-event-file-pattern should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--disable-proto should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --disable-proto should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-worker should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-worker should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--diagnostic-dir should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --diagnostic-dir should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--debug-arraybuffer-allocations should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --debug-arraybuffer-allocations should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--max-http-header-size should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --max-http-header-size should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--v8-pool-size should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --v8-pool-size should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-max-v1.2 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-max-v1.2 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--zero-fill-buffers should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --zero-fill-buffers should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-sync-io should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-sync-io should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--disallow-code-generation-from-strings should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --disallow-code-generation-from-strings should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--force-context-aware should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --force-context-aware should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-dir should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-dir should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--pending-deprecation should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --pending-deprecation should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--use-bundled-ca should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --use-bundled-ca should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-filename should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-filename should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-compact should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-compact should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-on-fatalerror should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-on-fatalerror should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--perf-prof should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --perf-prof should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-signal should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-signal should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--preserve-symlinks-main should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --preserve-symlinks-main should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--openssl-config should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --openssl-config should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-cipher-list should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-cipher-list should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--use-openssl-ca should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --use-openssl-ca should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-sigint should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-sigint should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--no-node-snapshot should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --no-node-snapshot should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--track-heap-objects should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --track-heap-objects should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-repl-await should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-repl-await should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-json-modules should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-json-modules should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--perf-prof-unwinding-info should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --perf-prof-unwinding-info should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--abort-on-uncaught-exception should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --abort-on-uncaught-exception should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--interpreted-frames-native-stack should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --interpreted-frames-native-stack should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--perf-basic-prof-only-functions should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --perf-basic-prof-only-functions should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--max-old-space-size should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --max-old-space-size should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--perf-basic-prof should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --perf-basic-prof should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--stack-trace-limit should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --stack-trace-limit should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--jitless should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --jitless should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--huge-max-old-generation-size should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --huge-max-old-generation-size should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-uncaught-exception should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-uncaught-exception should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-on-signal should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-on-signal should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-policy should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-policy should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--enable-source-maps should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --enable-source-maps should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-loader should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-loader should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-min-v1.2 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-min-v1.2 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-modules should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-modules should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-wasm-modules should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-wasm-modules should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--policy-integrity should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --policy-integrity should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-vm-modules should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-vm-modules should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-report should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-report should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-wasi-unstable-preview1 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-wasi-unstable-preview1 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-uncaught should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-uncaught should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--insecure-http-parser should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --insecure-http-parser should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--frozen-intrinsics should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --frozen-intrinsics should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-keylog should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-keylog should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--input-type should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --input-type should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--heapsnapshot-signal should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --heapsnapshot-signal should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-max-v1.3 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-max-v1.3 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--http-parser should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --http-parser should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--http-server-default-timeout should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --http-server-default-timeout should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-specifier-resolution should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-specifier-resolution should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--no-deprecation should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --no-deprecation should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-min-v1.0 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-min-v1.0 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--no-force-async-hooks-checks should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --no-force-async-hooks-checks should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--no-warnings should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --no-warnings should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--preserve-symlinks should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --preserve-symlinks should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-min-v1.1 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-min-v1.1 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--inspect-port should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --inspect-port should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-exit should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-exit should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--redirect-warnings should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --redirect-warnings should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-min-v1.3 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-min-v1.3 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--throw-deprecation should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --throw-deprecation should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-deprecation should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-deprecation should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-warnings should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-warnings should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--unhandled-rejections should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --unhandled-rejections should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--inspect should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --inspect should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--napi-modules should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --napi-modules should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--inspect-brk should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --inspect-brk should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--inspect-publish-uid should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --inspect-publish-uid should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--debug-port should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --debug-port should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-events-enabled should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-events-enabled should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-directory should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-directory should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--prof-process should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --prof-process should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--es-module-specifier-resolution should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --es-module-specifier-resolution should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--loader should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --loader should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--require should return false", + "fullTitle": "node-flags isNodeFlag() for all allowed node env flags which conflict with mocha flags --require should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "-r should return false", + "fullTitle": "node-flags isNodeFlag() for all allowed node env flags which conflict with mocha flags -r should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should require leading dashes", + "fullTitle": "node-flags isNodeFlag() when expecting leading dashes should require leading dashes", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for flags starting with \"preserve-symlinks\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for flags starting with \"preserve-symlinks\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for flags starting with \"harmony-\" or \"harmony_\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for flags starting with \"harmony-\" or \"harmony_\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for flags starting with \"trace-\" or \"trace_\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for flags starting with \"trace-\" or \"trace_\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for \"harmony\" itself", + "fullTitle": "node-flags isNodeFlag() special cases should return true for \"harmony\" itself", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for \"gc-global\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for \"gc-global\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for \"es-staging\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for \"es-staging\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for \"use-strict\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for \"use-strict\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for flags starting with \"--v8-\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for flags starting with \"--v8-\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for inspect flags", + "fullTitle": "node-flags impliesNoTimeouts() should return true for inspect flags", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle single v8 flags", + "fullTitle": "node-flags unparseNodeFlags() should handle single v8 flags", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle multiple v8 flags", + "fullTitle": "node-flags unparseNodeFlags() should handle multiple v8 flags", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an object containing positional args, defaults, and anti-reloading flags", + "fullTitle": "options loadOptions() when no parameter provided should return an object containing positional args, defaults, and anti-reloading flags", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return merged options incl. package.json opts", + "fullTitle": "options loadOptions() when parameter provided package.json when path to package.json (`--package `) is valid should return merged options incl. package.json opts", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not try to find a package.json", + "fullTitle": "options loadOptions() when parameter provided package.json when path to package.json (`--package `) is valid should not try to find a package.json", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set package = false", + "fullTitle": "options loadOptions() when parameter provided package.json when path to package.json (`--package `) is valid should set package = false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "options loadOptions() when parameter provided package.json when path to package.json (`--package `) is invalid should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return merged options incl. found package.json", + "fullTitle": "options loadOptions() when parameter provided package.json when path to package.json unspecified should return merged options incl. found package.json", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set package = false", + "fullTitle": "options loadOptions() when parameter provided package.json when path to package.json unspecified should set package = false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return parsed args and default config", + "fullTitle": "options loadOptions() when parameter provided package.json when called with package = false (`--no-package`) should return parsed args and default config", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not look for package.json", + "fullTitle": "options loadOptions() when parameter provided package.json when called with package = false (`--no-package`) should not look for package.json", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set package = false", + "fullTitle": "options loadOptions() when parameter provided package.json when called with package = false (`--no-package`) should set package = false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return parsed args, default config and package.json", + "fullTitle": "options loadOptions() when parameter provided rc file when called with config = false (`--no-config`) should return parsed args, default config and package.json", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to load a config file", + "fullTitle": "options loadOptions() when parameter provided rc file when called with config = false (`--no-config`) should not attempt to load a config file", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to find a config file", + "fullTitle": "options loadOptions() when parameter provided rc file when called with config = false (`--no-config`) should not attempt to find a config file", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set config = false", + "fullTitle": "options loadOptions() when parameter provided rc file when called with config = false (`--no-config`) should set config = false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not look for a config", + "fullTitle": "options loadOptions() when parameter provided rc file when path to config (`--config `) is invalid should not look for a config", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to load file at path", + "fullTitle": "options loadOptions() when parameter provided rc file when path to config (`--config `) is invalid should attempt to load file at path", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw to warn the user", + "fullTitle": "options loadOptions() when parameter provided rc file when path to config (`--config `) is invalid should throw to warn the user", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should look for a config", + "fullTitle": "options loadOptions() when parameter provided rc file when called with unspecified config when an rc file would be found should look for a config", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to load file at found path", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set config = false", + "fullTitle": "options loadOptions() when parameter provided rc file when called with unspecified config when an rc file would be found should set config = false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should look for a config", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to load a config file", + "fullTitle": "options loadOptions() when parameter provided rc file when called with unspecified config when an rc file would not be found should not attempt to load a config file", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set config = false", + "fullTitle": "options loadOptions() when parameter provided rc file when called with unspecified config when an rc file would not be found should set config = false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should prioritize package.json over defaults", + "fullTitle": "options loadOptions() config priority should prioritize package.json over defaults", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 77, + "currentRetry": 0, + "speed": "slow", + "err": {} + }, + { + "title": "should prioritize rc file over package.json", + "fullTitle": "options loadOptions() config priority should prioritize rc file over package.json", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 75, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should prioritize args over rc file", + "fullTitle": "options loadOptions() config priority should prioritize args over rc file", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 72, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should return basic parsed arguments and flag", + "fullTitle": "options loadOptions() when called with a one-and-done arg \"help\" should return basic parsed arguments and flag", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return basic parsed arguments and flag", + "fullTitle": "options loadOptions() when called with a one-and-done arg \"h\" should return basic parsed arguments and flag", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return basic parsed arguments and flag", + "fullTitle": "options loadOptions() when called with a one-and-done arg \"version\" should return basic parsed arguments and flag", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return basic parsed arguments and flag", + "fullTitle": "options loadOptions() when called with a one-and-done arg \"V\" should return basic parsed arguments and flag", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return basic parsed arguments and flag", + "fullTitle": "options loadOptions() when called with a one-and-done arg \"list-interfaces\" should return basic parsed arguments and flag", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return basic parsed arguments and flag", + "fullTitle": "options loadOptions() when called with a one-and-done arg \"list-reporters\" should return basic parsed arguments and flag", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not concatenate the default value", + "fullTitle": "options loadOptions() \"extension\" handling when user supplies \"extension\" option should not concatenate the default value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should retain the default", + "fullTitle": "options loadOptions() \"extension\" handling when user does not supply \"extension\" option should retain the default", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should place both - unsplitted - into the positional arguments array", + "fullTitle": "options loadOptions() \"spec\" handling when user supplies \"spec\" in config and positional arguments should place both - unsplitted - into the positional arguments array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not split option values by comma", + "fullTitle": "options loadOptions() \"ignore\" handling should not split option values by comma", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should disallow an array of names", + "fullTitle": "helpers validateLegacyPlugin() when used with \"reporter\" key should disallow an array of names", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail to recognize an unknown reporter", + "fullTitle": "helpers validateLegacyPlugin() when used with \"reporter\" key should fail to recognize an unknown reporter", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should disallow an array of names", + "fullTitle": "helpers validateLegacyPlugin() when used with an \"interfaces\" key should disallow an array of names", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail to recognize an unknown interface", + "fullTitle": "helpers validateLegacyPlugin() when used with an \"interfaces\" key should fail to recognize an unknown interface", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail", + "fullTitle": "helpers validateLegacyPlugin() when used with an unknown plugin type should fail", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail and report the original error", + "fullTitle": "helpers validateLegacyPlugin() when a plugin throws an exception upon load should fail and report the original error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a flat array", + "fullTitle": "helpers list() when provided a flat array should return a flat array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a flat array", + "fullTitle": "helpers list() when provided a nested array should return a flat array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a flat array", + "fullTitle": "helpers list() when given a comma-delimited string should return a flat array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option retries", + "fullTitle": "command run builder number type should include option retries", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option jobs", + "fullTitle": "command run builder number type should include option jobs", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option config", + "fullTitle": "command run builder string type should include option config", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option fgrep", + "fullTitle": "command run builder string type should include option fgrep", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option grep", + "fullTitle": "command run builder string type should include option grep", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option package", + "fullTitle": "command run builder string type should include option package", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option reporter", + "fullTitle": "command run builder string type should include option reporter", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option ui", + "fullTitle": "command run builder string type should include option ui", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option slow", + "fullTitle": "command run builder string type should include option slow", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option timeout", + "fullTitle": "command run builder string type should include option timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option allow-uncaught", + "fullTitle": "command run builder boolean type should include option allow-uncaught", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option async-only", + "fullTitle": "command run builder boolean type should include option async-only", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option bail", + "fullTitle": "command run builder boolean type should include option bail", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option check-leaks", + "fullTitle": "command run builder boolean type should include option check-leaks", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option color", + "fullTitle": "command run builder boolean type should include option color", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option delay", + "fullTitle": "command run builder boolean type should include option delay", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option diff", + "fullTitle": "command run builder boolean type should include option diff", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option exit", + "fullTitle": "command run builder boolean type should include option exit", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option forbid-only", + "fullTitle": "command run builder boolean type should include option forbid-only", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option forbid-pending", + "fullTitle": "command run builder boolean type should include option forbid-pending", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option full-trace", + "fullTitle": "command run builder boolean type should include option full-trace", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option growl", + "fullTitle": "command run builder boolean type should include option growl", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option inline-diffs", + "fullTitle": "command run builder boolean type should include option inline-diffs", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option invert", + "fullTitle": "command run builder boolean type should include option invert", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option list-interfaces", + "fullTitle": "command run builder boolean type should include option list-interfaces", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option list-reporters", + "fullTitle": "command run builder boolean type should include option list-reporters", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option no-colors", + "fullTitle": "command run builder boolean type should include option no-colors", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option parallel", + "fullTitle": "command run builder boolean type should include option parallel", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option recursive", + "fullTitle": "command run builder boolean type should include option recursive", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option sort", + "fullTitle": "command run builder boolean type should include option sort", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option watch", + "fullTitle": "command run builder boolean type should include option watch", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option extension", + "fullTitle": "command run builder array type should include option extension", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option file", + "fullTitle": "command run builder array type should include option file", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option global", + "fullTitle": "command run builder array type should include option global", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option ignore", + "fullTitle": "command run builder array type should include option ignore", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option reporter-option", + "fullTitle": "command run builder array type should include option reporter-option", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option require", + "fullTitle": "command run builder array type should include option require", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option spec", + "fullTitle": "command run builder array type should include option spec", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option watch-files", + "fullTitle": "command run builder array type should include option watch-files", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option watch-ignore", + "fullTitle": "command run builder array type should include option watch-ignore", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the Mocha instance", + "fullTitle": "Mocha instance method parallelMode() when `Mocha` is running in Node.js should return the Mocha instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 6, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not swap the Runner, nor change lazy loading setting", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not swap the Runner, nor change lazy loading setting", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should enable parallel mode", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should enable serial mode", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add the given file to the files array", + "fullTitle": "Mocha instance method addFile() should add the given file to the files array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method addFile() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should load all files from the files array", + "fullTitle": "Mocha instance method loadFiles() should load all files from the files array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should execute the optional callback if given", + "fullTitle": "Mocha instance method loadFiles() should execute the optional callback if given", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should delegate Mocha.unloadFile() for each item in its list of files", + "fullTitle": "Mocha instance method unloadFiles() should delegate Mocha.unloadFile() for each item in its list of files", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 9, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method unloadFiles() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should load from current working directory", + "fullTitle": "Mocha instance method reporter() when a reporter exists relative to the cwd should load from current working directory", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw \"invalid reporter\" exception", + "fullTitle": "Mocha instance method reporter() when a reporter exists relative to the cwd when the reporter throws upon load should throw \"invalid reporter\" exception", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should warn about the error before throwing", + "fullTitle": "Mocha instance method reporter() when a reporter exists relative to the cwd when the reporter throws upon load should warn about the error before throwing", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should load from module path", + "fullTitle": "Mocha instance method reporter() when a reporter exists relative to the \"mocha\" module path should load from module path", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw \"invalid reporter\" exception", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should warn about the error before throwing", + "fullTitle": "Mocha instance method reporter() when a reporter exists relative to the \"mocha\" module path when the reporter throws upon load should warn about the error before throwing", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset referencesCleaned and allow for next run", + "fullTitle": "Mocha instance method unloadFiles() should reset referencesCleaned and allow for next run", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not be allowed when the current instance is already disposed", + "fullTitle": "Mocha instance method unloadFiles() should not be allowed when the current instance is already disposed", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the `Mocha` instance", + "fullTitle": "Mocha instance method lazyLoadFiles() should return the `Mocha` instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should enable eager loading", + "fullTitle": "Mocha instance method lazyLoadFiles() when passed a non-`true` value should enable eager loading", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should enable lazy loading", + "fullTitle": "Mocha instance method lazyLoadFiles() when passed `true` should enable lazy loading", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should unload a specific file from cache", + "fullTitle": "Mocha static method unloadFile() should unload a specific file from cache", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should start in \"IDLE\" state", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner constructor should start in \"IDLE\" state", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should disallow an invalid state transition", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance property _state should disallow an invalid state transition", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should change the state to COMPLETE", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner event EVENT_RUN_END should change the state to COMPLETE", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit `EVENT_RUN_BEGIN`", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() should emit `EVENT_RUN_BEGIN`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should create object references", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() when instructed to link objects should create object references", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should result in an uncaught exception", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recover", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() when a worker fails should recover", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should delegate to Runner#uncaught", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() when a worker fails should delegate to Runner#uncaught", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not force-terminate", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() when suite should bail when no event contains an error should not force-terminate", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cleanly terminate the thread pool", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cleanly terminate the thread pool", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not force-terminate", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() when a suite has a bail flag when no event contains an error should not force-terminate", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cleanly terminate the thread pool", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cleanly terminate the thread pool", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cleanly terminate the thread pool", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the runner", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method linkPartialObjects() should return the runner", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method isParallelMode() should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return its context", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method workerReporter() should return its context", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should listen for Runner events", + "fullTitle": "ParallelBuffered constructor should listen for Runner events", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\reporters\\parallel-buffered.spec.js", + "duration": 8, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should listen for Runner events expecting to occur once", + "fullTitle": "ParallelBuffered constructor should listen for Runner events expecting to occur once", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\reporters\\parallel-buffered.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove all listeners", + "fullTitle": "ParallelBuffered event on EVENT_RUN_END should remove all listeners", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\reporters\\parallel-buffered.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should populate its `events` array with SerializableEvents", + "fullTitle": "ParallelBuffered event on any other event listened for should populate its `events` array with SerializableEvents", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\reporters\\parallel-buffered.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should execute its callback with a SerializableWorkerResult", + "fullTitle": "ParallelBuffered instance method done should execute its callback with a SerializableWorkerResult", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\reporters\\parallel-buffered.spec.js", + "duration": 6, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset its `events` prop", + "fullTitle": "ParallelBuffered instance method done should reset its `events` prop", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\reporters\\parallel-buffered.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the value", + "fullTitle": "serializer function serialize when passed a non-object value should return the value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the value", + "fullTitle": "serializer function serialize when passed an object value w/o a `serialize` method should return the value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the result of the `serialize` method", + "fullTitle": "serializer function serialize when passed an object value having a `serialize` method should return the result of the `serialize` method", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `undefined`", + "fullTitle": "serializer function serialize when not passed anything should return `undefined`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `undefined`", + "fullTitle": "serializer function deserialize when passed nothing should return `undefined`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the value", + "fullTitle": "serializer function deserialize when passed a non-object value should return the value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the value", + "fullTitle": "serializer function deserialize when passed an object value which is not a SerializedWorkerResult should return the value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the result of `SerializableWorkerResult.deserialize` called on the value", + "fullTitle": "serializer function deserialize when passed a SerializedWorkerResult object should return the result of `SerializableWorkerResult.deserialize` called on the value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw \"invalid arg value\" error", + "fullTitle": "serializer SerializableEvent constructor when called without `eventName` should throw \"invalid arg value\" error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw \"invalid arg type\" error", + "fullTitle": "serializer SerializableEvent constructor when called with a non-object `rawObject` should throw \"invalid arg type\" error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should mutate the instance in-place", + "fullTitle": "serializer SerializableEvent instance method serialize should mutate the instance in-place", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should freeze the instance", + "fullTitle": "serializer SerializableEvent instance method serialize should freeze the instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call the `serialize` method", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an object with a `serialize` method should call the `serialize` method", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call the `serialize` method", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an object containing an object with a `serialize` method should call the `serialize` method", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove the method", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an object containing a non-`serialize` method should remove the method", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should serialize the array", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an object containing an array should serialize the array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should serialize the error", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an error should serialize the error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should retain own props", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an error should retain own props", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not retain not-own props", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an error should not retain not-own props", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should serialize the Error", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an object containing a top-level prop with an Error value should serialize the Error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should serialize the Error", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an object containing a nested prop with an Error value should serialize the Error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a new object w/ null prototype", + "fullTitle": "serializer SerializableEvent static method deserialize should return a new object w/ null prototype", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw \"invalid arg type\" error", + "fullTitle": "serializer SerializableEvent static method deserialize when passed a falsy parameter should throw \"invalid arg type\" error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should ignore __proto__", + "fullTitle": "serializer SerializableEvent static method deserialize when passed value contains `data` prop should ignore __proto__", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should create an Error instance from the nested serialized Error prop", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should create an Error instance from the prop", + "fullTitle": "serializer SerializableEvent static method deserialize when passed value contains an `error` prop should create an Error instance from the prop", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should create a new prop having a function value", + "fullTitle": "serializer SerializableEvent static method deserialize when passed value data contains a prop beginning with \"$$\" should create a new prop having a function value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should create a new prop returning the original value", + "fullTitle": "serializer SerializableEvent static method deserialize when passed value data contains a prop beginning with \"$$\" should create a new prop returning the original value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove the prop with the \"$$\" prefix", + "fullTitle": "serializer SerializableEvent static method deserialize when passed value data contains a prop beginning with \"$$\" should remove the prop with the \"$$\" prefix", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should deserialize each prop", + "fullTitle": "serializer SerializableEvent static method deserialize when the value data contains a prop with an array value should deserialize each prop", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 18, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should instantiate a SerializableEvent", + "fullTitle": "serializer SerializableEvent static method create should instantiate a SerializableEvent", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a new SerializableWorkerResult instance", + "fullTitle": "serializer SerializableWorkerResult static method create should return a new SerializableWorkerResult instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `true`", + "fullTitle": "serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an instance should return `true`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `true`", + "fullTitle": "serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an object with an appropriate `__type` prop should return `true`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `false`", + "fullTitle": "serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an object without an appropriate `__type` prop should return `false`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call SerializableEvent#deserialize on each item in its `events` prop", + "fullTitle": "serializer SerializableWorkerResult static method deserialize should call SerializableEvent#deserialize on each item in its `events` prop", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the deserialized value", + "fullTitle": "serializer SerializableWorkerResult static method deserialize should return the deserialized value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a read-only value", + "fullTitle": "serializer SerializableWorkerResult instance method serialize should return a read-only value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call `SerializableEvent#serialize` of each of its events", + "fullTitle": "serializer SerializableWorkerResult instance method serialize should call `SerializableEvent#serialize` of each of its events", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add a readonly `__type` prop", + "fullTitle": "serializer SerializableWorkerResult constructor should add a readonly `__type` prop", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should get a stack-trace as a string and prettify it", + "fullTitle": "stackTraceFilter() on node on POSIX OS should get a stack-trace as a string and prettify it", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\stack-trace-filter.spec.js", + "currentRetry": 0, + "err": {} + }, + { + "title": "does not ignore other bower_components and components", + "fullTitle": "stackTraceFilter() on node on POSIX OS does not ignore other bower_components and components", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\stack-trace-filter.spec.js", + "currentRetry": 0, + "err": {} + }, + { + "title": "should replace absolute with relative paths", + "fullTitle": "stackTraceFilter() on node on POSIX OS should replace absolute with relative paths", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\stack-trace-filter.spec.js", + "currentRetry": 0, + "err": {} + }, + { + "title": "should not replace absolute path which has cwd as infix", + "fullTitle": "stackTraceFilter() on node on POSIX OS should not replace absolute path which has cwd as infix", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\stack-trace-filter.spec.js", + "currentRetry": 0, + "err": {} + }, + { + "title": "should work on Windows", + "fullTitle": "stackTraceFilter() on node on Windows should work on Windows", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\stack-trace-filter.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "does not strip out other bower_components", + "fullTitle": "stackTraceFilter() on browser does not strip out other bower_components", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\stack-trace-filter.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the current working directory", + "fullTitle": "utils function cwd() should return the current working directory", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return \"function\" if the parameter is an async function", + "fullTitle": "utils function type() should return \"function\" if the parameter is an async function", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return \"error\" if the parameter is an Error", + "fullTitle": "utils function type() should return \"error\" if the parameter is an Error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return \"buffer\" if the parameter is a Buffer", + "fullTitle": "utils function canonicalType() should return \"buffer\" if the parameter is a Buffer", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return \"asyncfunction\" if the parameter is an async function", + "fullTitle": "utils function canonicalType() should return \"asyncfunction\" if the parameter is an async function", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "worker when run as main process should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 69, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should register itself with workerpool", + "fullTitle": "worker when run as worker process should register itself with workerpool", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "worker when run as worker process function run() when called without arguments should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "worker when run as worker process function run() when passed a non-string `options` value should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "worker when run as worker process function run() when passed an invalid string `options` value should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "worker when run as worker process function run() when called with empty \"filepath\" argument should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" argument is unloadable should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle \"--require\"", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable should handle \"--require\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle \"--ui\"", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable should handle \"--ui\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call Mocha#run", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable should call Mocha#run", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove all uncaughtException listeners", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable should remove all uncaughtException listeners", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 4, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove all unhandledRejection listeners", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable should remove all unhandledRejection listeners", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 4, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should resolve with a SerializedWorkerResult", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable when serialization succeeds should resolve with a SerializedWorkerResult", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable when serialization fails should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should initialize only once", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable when run twice should initialize only once", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + } + ], + "pending": [ + { + "title": "should initialize the stats collector", + "fullTitle": "Mocha instance method run() should initialize the stats collector", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "currentRetry": 0, + "err": {} + }, + { + "title": "should pass validation", + "fullTitle": "plugin module root hooks plugin 🎣 when impl is an object of functions should pass validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "currentRetry": 0, + "err": {} + }, + { + "title": "should get a stack-trace as a string and prettify it", + "fullTitle": "stackTraceFilter() on node on POSIX OS should get a stack-trace as a string and prettify it", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\stack-trace-filter.spec.js", + "currentRetry": 0, + "err": {} + }, + { + "title": "does not ignore other bower_components and components", + "fullTitle": "stackTraceFilter() on node on POSIX OS does not ignore other bower_components and components", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\stack-trace-filter.spec.js", + "currentRetry": 0, + "err": {} + }, + { + "title": "should replace absolute with relative paths", + "fullTitle": "stackTraceFilter() on node on POSIX OS should replace absolute with relative paths", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\stack-trace-filter.spec.js", + "currentRetry": 0, + "err": {} + }, + { + "title": "should not replace absolute path which has cwd as infix", + "fullTitle": "stackTraceFilter() on node on POSIX OS should not replace absolute path which has cwd as infix", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\stack-trace-filter.spec.js", + "currentRetry": 0, + "err": {} + } + ], + "failures": [], + "passes": [ + { + "title": "should work", + "fullTitle": "Context nested should work", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work", + "fullTitle": "Context Siblings sequestered sibling should work", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not have value set within a sibling describe", + "fullTitle": "Context Siblings sibling verifiction should not have value set within a sibling describe", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow test siblings to modify shared context", + "fullTitle": "Context Siblings sibling verifiction should allow test siblings to modify shared context", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should have reset this.calls before describe", + "fullTitle": "Context Siblings sibling verifiction should have reset this.calls before describe", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the timeout", + "fullTitle": "methods timeout() should return the timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the slow", + "fullTitle": "methods slow() should return the slow", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the number of retries", + "fullTitle": "methods retries should return the number of retries", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\context.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should highlight in red", + "fullTitle": "durations when slow should highlight in red", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\duration.spec.js", + "duration": 103, + "currentRetry": 0, + "speed": "slow", + "err": {} + }, + { + "title": "should highlight in yellow", + "fullTitle": "durations when reasonable should highlight in yellow", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\duration.spec.js", + "duration": 52, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should not highlight", + "fullTitle": "durations when fast should not highlight", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\duration.spec.js", + "duration": 11, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include expected code in thrown reporter errors", + "fullTitle": "Errors createInvalidReporterError() should include expected code in thrown reporter errors", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include expected code in thrown interface errors", + "fullTitle": "Errors createInvalidInterfaceError() should include expected code in thrown interface errors", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should output a message regarding incompatibility", + "fullTitle": "Errors createForbiddenExclusivityError() when Mocha instance is running in a worker process should output a message regarding incompatibility", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should output a message regarding --forbid-only", + "fullTitle": "Errors createForbiddenExclusivityError() when Mocha instance is not running in a worker process should output a message regarding --forbid-only", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should coerce its parameter to a string", + "fullTitle": "Errors deprecate() should coerce its parameter to a string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cache the message", + "fullTitle": "Errors deprecate() should cache the message", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should ignore falsy messages", + "fullTitle": "Errors deprecate() should ignore falsy messages", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call process.emitWarning", + "fullTitle": "Errors warn() should call process.emitWarning", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not cache messages", + "fullTitle": "Errors warn() should not cache messages", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should ignore falsy messages", + "fullTitle": "Errors warn() should ignore falsy messages", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true", + "fullTitle": "Errors isMochaError() when provided an Error object having a known Mocha error code should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "Errors isMochaError() when provided an Error object with a non-Mocha error code should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "Errors isMochaError() when provided a non-error should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\errors.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cause tests to fail", + "fullTitle": "global leaks should cause tests to fail", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\globals.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass when accepted", + "fullTitle": "global leaks should pass when accepted", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\globals.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass with wildcard", + "fullTitle": "global leaks should pass with wildcard", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\globals.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass when prefixed \"mocha-\"", + "fullTitle": "global leaks should pass when prefixed \"mocha-\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\globals.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add a RegExp to the mocha.options object", + "fullTitle": "Mocha \"grep\" option should add a RegExp to the mocha.options object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should convert string to a RegExp", + "fullTitle": "Mocha \"grep\" option should convert string to a RegExp", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should escape and convert string to a RegExp", + "fullTitle": "Mocha \"fgrep\" option should escape and convert string to a RegExp", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add a RegExp to the mocha.options object", + "fullTitle": "Mocha .grep() should add a RegExp to the mocha.options object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should convert grep string to a RegExp", + "fullTitle": "Mocha .grep() should convert grep string to a RegExp", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should covert grep regex-like string to a RegExp", + "fullTitle": "Mocha .grep() should covert grep regex-like string to a RegExp", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return its parent Mocha object for chainability", + "fullTitle": "Mocha .grep() should return its parent Mocha object for chainability", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add a Boolean to the mocha.options object", + "fullTitle": "Mocha \"invert\" option should add a Boolean to the mocha.options object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\grep.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "one", + "fullTitle": "async hooks one", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-async.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "two", + "fullTitle": "async hooks two", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-async.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "three", + "fullTitle": "async hooks three", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-async.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "foo", + "fullTitle": "serial nested foo", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync-nested.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "bar", + "fullTitle": "serial nested bar", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync-nested.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "one", + "fullTitle": "serial nested hooks one", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync-nested.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "two", + "fullTitle": "serial nested hooks two", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync-nested.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "one", + "fullTitle": "serial hooks one", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "two", + "fullTitle": "serial hooks two", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "three", + "fullTitle": "serial hooks three", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-sync.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work", + "fullTitle": "hook timeout should work", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook-timeout.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the hook._error", + "fullTitle": "Hook error should set the hook._error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should get the hook._error when called without arguments", + "fullTitle": "Hook error should get the hook._error when called without arguments", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call Runnable.reset", + "fullTitle": "Hook reset should call Runnable.reset", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset the error state", + "fullTitle": "Hook reset should reset the error state", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\hook.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set _cleanReferencesAfterRun to true", + "fullTitle": "Mocha constructor should set _cleanReferencesAfterRun to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to set timeout", + "fullTitle": "Mocha constructor when `timeout` option is `undefined` should not attempt to set timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to set timeout", + "fullTitle": "Mocha constructor when `timeout` option is `false` should attempt to set timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to set globals", + "fullTitle": "Mocha constructor when `global` option is an `Array` should attempt to set globals", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to set retries`", + "fullTitle": "Mocha constructor when `retries` option is present should attempt to set retries`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to set retries", + "fullTitle": "Mocha constructor when `retries` option is not present should not attempt to set retries", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "shouid attempt to set root hooks", + "fullTitle": "Mocha constructor when `rootHooks` option is truthy shouid attempt to set root hooks", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should enable parallel mode", + "fullTitle": "Mocha constructor when `parallel` option is true and `jobs` option > 1 should enable parallel mode", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not enable parallel mode", + "fullTitle": "Mocha constructor when `parallel` option is true and `jobs` option <= 1 should not enable parallel mode", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure global setup fixtures", + "fullTitle": "Mocha constructor when `parallel` option is true when `globalSetup` option is present should configure global setup fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure global teardown fixtures", + "fullTitle": "Mocha constructor when `parallel` option is true when `globalTeardown` option is present should configure global teardown fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should toggle global setup fixtures", + "fullTitle": "Mocha constructor when `parallel` option is true when `enableGlobalSetup` option is present should toggle global setup fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure global teardown fixtures", + "fullTitle": "Mocha constructor when `parallel` option is true when `enableGlobalTeardown` option is present should configure global teardown fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the allowUncaught option to true", + "fullTitle": "Mocha instance method allowUncaught() should set the allowUncaught option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the allowUncaught option to false", + "fullTitle": "Mocha instance method allowUncaught() should set the allowUncaught option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method allowUncaught() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the asyncOnly option to true", + "fullTitle": "Mocha instance method asyncOnly() should set the asyncOnly option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the asyncOnly option to false", + "fullTitle": "Mocha instance method asyncOnly() should set the asyncOnly option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method asyncOnly() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method bail() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the \"bail\" flag on the root suite", + "fullTitle": "Mocha instance method bail() when provided no arguments should set the \"bail\" flag on the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should unset the \"bail\" flag on the root suite", + "fullTitle": "Mocha instance method bail() when provided a falsy argument should unset the \"bail\" flag on the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the checkLeaks option to true", + "fullTitle": "Mocha instance method checkLeaks() should set the checkLeaks option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the _cleanReferencesAfterRun attribute", + "fullTitle": "Mocha instance method cleanReferencesAfterRun() should set the _cleanReferencesAfterRun attribute", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the _cleanReferencesAfterRun attribute to false", + "fullTitle": "Mocha instance method cleanReferencesAfterRun() should set the _cleanReferencesAfterRun attribute to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method cleanReferencesAfterRun() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the color option to true", + "fullTitle": "Mocha instance method color() should set the color option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the color option to false", + "fullTitle": "Mocha instance method color() should set the color option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method color() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the delay option to true", + "fullTitle": "Mocha instance method delay() should set the delay option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method delay() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the diff option to true", + "fullTitle": "Mocha instance method diff() should set the diff option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the diff option to false", + "fullTitle": "Mocha instance method diff() when provided `false` argument should set the diff option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should dispose the root suite", + "fullTitle": "Mocha instance method dispose() should dispose the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should dispose previous test runner", + "fullTitle": "Mocha instance method dispose() should dispose previous test runner", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should unload the files", + "fullTitle": "Mocha instance method dispose() should unload the files", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the forbidOnly option to true", + "fullTitle": "Mocha instance method forbidOnly() should set the forbidOnly option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the forbidOnly option to false", + "fullTitle": "Mocha instance method forbidOnly() should set the forbidOnly option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method forbidOnly() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the forbidPending option to true", + "fullTitle": "Mocha instance method forbidPending() should set the forbidPending option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the forbidPending option to false", + "fullTitle": "Mocha instance method forbidPending() should set the forbidPending option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method forbidPending() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the fullTrace option to true", + "fullTitle": "Mocha instance method fullTrace() should set the fullTrace option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the fullTrace option to false", + "fullTitle": "Mocha instance method fullTrace() should set the fullTrace option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method fullTrace() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be an empty array initially", + "fullTitle": "Mocha instance method global() should be an empty array initially", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method global() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not modify the whitelist when given empty string", + "fullTitle": "Mocha instance method global() when argument is invalid should not modify the whitelist when given empty string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not modify the whitelist when given empty array", + "fullTitle": "Mocha instance method global() when argument is invalid should not modify the whitelist when given empty array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add string to the whitelist", + "fullTitle": "Mocha instance method global() when argument is valid should add string to the whitelist", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add contents of string array to the whitelist", + "fullTitle": "Mocha instance method global() when argument is valid should add contents of string array to the whitelist", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not have duplicates", + "fullTitle": "Mocha instance method global() when argument is valid should not have duplicates", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method growl() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 57, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should set the growl option to true", + "fullTitle": "Mocha instance method growl() if capable of notifications should set the growl option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the growl option to false", + "fullTitle": "Mocha instance method growl() if not capable of notifications should set the growl option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the inlineDiffs option to true", + "fullTitle": "Mocha instance method inlineDiffs() should set the inlineDiffs option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the inlineDiffs option to false", + "fullTitle": "Mocha instance method inlineDiffs() should set the inlineDiffs option to false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method inlineDiffs() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the invert option to true", + "fullTitle": "Mocha instance method invert() should set the invert option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method invert() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the noHighlighting option to true", + "fullTitle": "Mocha instance method noHighlighting() should set the noHighlighting option to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method noHighlighting() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method reporter() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should keep reporterOption on options", + "fullTitle": "Mocha instance method reporter() should keep reporterOption on options", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should support legacy reporterOptions", + "fullTitle": "Mocha instance method reporter() should support legacy reporterOptions", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should instantiate a reporter", + "fullTitle": "Mocha instance method run() should instantiate a reporter", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should execute the callback when complete", + "fullTitle": "Mocha instance method run() should execute the callback when complete", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should eagerly load files", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not eagerly load files", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should instantiate a Runner", + "fullTitle": "Mocha instance method run() Runner initialization should instantiate a Runner", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure \"grep\"", + "fullTitle": "Mocha instance method run() Runner initialization when \"grep\" option is present should configure \"grep\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure global vars", + "fullTitle": "Mocha instance method run() Runner initialization when \"global\" option is present should configure global vars", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should initialize growl support", + "fullTitle": "Mocha instance method run() when \"growl\" option is present should initialize growl support", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure the Base reporter", + "fullTitle": "Mocha instance method run() Base reporter initialization should configure the Base reporter", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should configure the Base reporter", + "fullTitle": "Mocha instance method run() Base reporter initialization when \"color\" options is set should configure the Base reporter", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call the reporter \"done\" method", + "fullTitle": "Mocha instance method run() when a reporter instance has a \"done\" method should call the reporter \"done\" method", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Mocha instance method run() when a run is in progress should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not call `Runner#runAsync`", + "fullTitle": "Mocha instance method run() when a run is in progress should not call `Runner#runAsync`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Mocha instance method run() when the `Mocha` instance is already disposed should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not call `Runner#runAsync`", + "fullTitle": "Mocha instance method run() when the `Mocha` instance is already disposed should not call `Runner#runAsync`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Mocha instance method run() when a run has finished and is called again should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not call `Runner#runAsync()`", + "fullTitle": "Mocha instance method run() when a run has finished and is called again should not call `Runner#runAsync()`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw", + "fullTitle": "Mocha instance method run() when Mocha configured for multiple runs and multiple runs are attempted should not throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call `Runner#runAsync` for each call", + "fullTitle": "Mocha instance method run() when Mocha configured for multiple runs and multiple runs are attempted should call `Runner#runAsync` for each call", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset the root Suite between runs", + "fullTitle": "Mocha instance method run() when Mocha configured for multiple runs and multiple runs are attempted should reset the root Suite between runs", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should dispose the previous runner", + "fullTitle": "Mocha instance method run() when Mocha configured for multiple runs and multiple runs are attempted should dispose the previous runner", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not run global setup fixtures", + "fullTitle": "Mocha instance method run() when global setup fixtures enabled when global setup fixtures not present should not run global setup fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should run global setup fixtures", + "fullTitle": "Mocha instance method run() when global setup fixtures enabled when global setup fixtures are present should run global setup fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not run global setup fixtures", + "fullTitle": "Mocha instance method run() when global setup fixtures disabled when global setup fixtures not present should not run global setup fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not run global setup fixtures", + "fullTitle": "Mocha instance method run() when global setup fixtures disabled when global setup fixtures are present should not run global setup fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not run global teardown fixtures", + "fullTitle": "Mocha instance method run() when global teardown fixtures enabled when global teardown fixtures not present should not run global teardown fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should run global teardown fixtures", + "fullTitle": "Mocha instance method run() when global teardown fixtures enabled when global teardown fixtures are present should run global teardown fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the same context as returned by `runGlobalSetup`", + "fullTitle": "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`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not run global teardown fixtures", + "fullTitle": "Mocha instance method run() when global teardown fixtures disabled when global teardown fixtures not present should not run global teardown fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not run global teardown fixtures", + "fullTitle": "Mocha instance method run() when global teardown fixtures disabled when global teardown fixtures are present should not run global teardown fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Mocha instance method parallelMode() when `Mocha` is running in a browser should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Mocha instance method unloadFile() when run in a browser should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should execute multiple fixtures in order", + "fullTitle": "Mocha instance method _runGlobalFixtures() should execute multiple fixtures in order", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt run the fixtures", + "fullTitle": "Mocha instance method runGlobalSetup() when fixture(s) are present should attempt run the fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to run fixtures", + "fullTitle": "Mocha instance method runGlobalSetup() when a fixture is not present should not attempt to run fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to run the fixtures", + "fullTitle": "Mocha instance method runGlobalTeardown() when fixture(s) are present should attempt to run the fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "not attempt to run the fixtures", + "fullTitle": "Mocha instance method runGlobalTeardown() when a fixture is not present not attempt to run the fixtures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `true`", + "fullTitle": "Mocha instance method hasGlobalSetupFixtures() when one or more global setup fixtures are present should return `true`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `false`", + "fullTitle": "Mocha instance method hasGlobalSetupFixtures() when no global setup fixtures are present should return `false`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `true`", + "fullTitle": "Mocha instance method hasGlobalTeardownFixtures() when one or more global teardown fixtures are present should return `true`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `false`", + "fullTitle": "Mocha instance method hasGlobalTeardownFixtures() when no global teardown fixtures are present should return `false`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method rootHooks() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach it to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided a single \"before all\" hook should attach it to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach it to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided a single \"before each\" hook should attach it to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach it to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided a single \"after all\" hook should attach it to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach it to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided a single \"after each\" hook should attach it to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach each to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided multiple \"before all\" hooks should attach each to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach each to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided multiple \"before each\" hooks should attach each to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach each to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided multiple \"after all\" hooks should attach each to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attach each to the root suite", + "fullTitle": "Mocha instance method rootHooks() when provided multiple \"after each\" hooks should attach each to the root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail when multiple methods are used", + "fullTitle": "overspecified asynchronous resolution method should fail when multiple methods are used", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\overspecified-async.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should get queryString and return key-value object", + "fullTitle": "parseQuery() should get queryString and return key-value object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\parse-query.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should parse \"+\" as a space", + "fullTitle": "parseQuery() should parse \"+\" as a space", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\parse-query.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should populate a registry of built-in plugins", + "fullTitle": "plugin module class PluginLoader constructor when passed no options should populate a registry of built-in plugins", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should register the custom plugins", + "fullTitle": "plugin module class PluginLoader constructor when passed custom plugins should register the custom plugins", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should retain a list of ignored plugins", + "fullTitle": "plugin module class PluginLoader constructor when passed ignored plugins should retain a list of ignored plugins", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a PluginLoader instance", + "fullTitle": "plugin module class PluginLoader static method create() should return a PluginLoader instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw", + "fullTitle": "plugin module class PluginLoader instance method register() when the plugin export name is not in use should not throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "plugin module class PluginLoader instance method register() when the plugin export name is already in use should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw", + "fullTitle": "plugin module class PluginLoader instance method register() when the plugin export name is ignored should not throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not register the plugin", + "fullTitle": "plugin module class PluginLoader instance method register() when the plugin export name is ignored should not register the plugin", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "plugin module class PluginLoader instance method register() when passed a falsy parameter should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "plugin module class PluginLoader instance method register() when passed a non-object parameter should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "plugin module class PluginLoader instance method register() when passed a definition w/o an exportName should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "plugin module class PluginLoader instance method load() when called with a falsy value should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "plugin module class PluginLoader instance method load() when called with an object containing no recognized plugin should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true", + "fullTitle": "plugin module class PluginLoader instance method load() when called with an object containing a recognized plugin should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should retain the value of any matching property in its mapping", + "fullTitle": "plugin module class PluginLoader instance method load() when called with an object containing a recognized plugin should retain the value of any matching property in its mapping", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call the associated validator, if present", + "fullTitle": "plugin module class PluginLoader instance method load() when called with an object containing a recognized plugin should call the associated validator, if present", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "plugin module class PluginLoader instance method load() when passed a falsy or non-object value should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not call a validator", + "fullTitle": "plugin module class PluginLoader instance method load() when passed a falsy or non-object value should not call a validator", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "plugin module class PluginLoader instance method load() when passed an object value when no keys match any known named exports should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call the associated validator", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not call validators whose keys were not found", + "fullTitle": "plugin module class PluginLoader instance method load() when passed an object value when a key matches a known named export should not call validators whose keys were not found", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true", + "fullTitle": "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 return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add the implementation to the internal mapping", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not add an implementation of plugins not present", + "fullTitle": "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 not add an implementation of plugins not present", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an empty map", + "fullTitle": "plugin module class PluginLoader instance method finalize() when no plugins have been loaded should return an empty map", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an object map using `optionName` key for each registered plugin", + "fullTitle": "plugin module class PluginLoader instance method finalize() when a plugin has one or more implementations should return an object map using `optionName` key for each registered plugin", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should omit unused plugins", + "fullTitle": "plugin module class PluginLoader instance method finalize() when a plugin has one or more implementations should omit unused plugins", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an array of raw implementations", + "fullTitle": "plugin module class PluginLoader instance method finalize() when a plugin has no \"finalize\" function should return an array of raw implementations", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail validation", + "fullTitle": "plugin module root hooks plugin 🎣 when impl is an array should fail validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail validation", + "fullTitle": "plugin module root hooks plugin 🎣 when impl is a primitive should fail validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass validation", + "fullTitle": "plugin module root hooks plugin 🎣 when impl is a function should pass validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should flatten the implementations", + "fullTitle": "plugin module root hooks plugin 🎣 when a loaded impl is finalized should flatten the implementations", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail validation", + "fullTitle": "plugin module global fixtures plugin global setup when an implementation is a primitive should fail validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail validation", + "fullTitle": "plugin module global fixtures plugin global setup when an implementation is an array of primitives should fail validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass validation", + "fullTitle": "plugin module global fixtures plugin global setup when an implementation is a function should pass validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass validation", + "fullTitle": "plugin module global fixtures plugin global setup when an implementation is an array of functions should pass validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail validation", + "fullTitle": "plugin module global fixtures plugin global teardown when an implementation is a primitive should fail validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail validation", + "fullTitle": "plugin module global fixtures plugin global teardown when an implementation is an array of primitives should fail validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass validation", + "fullTitle": "plugin module global fixtures plugin global teardown when an implementation is a function should pass validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass validation", + "fullTitle": "plugin module global fixtures plugin global teardown when an implementation is an array of functions should pass validation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\plugin-loader.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "using imported it", + "fullTitle": "using imported describe using imported it", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\required-tokens.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be a valid suite", + "fullTitle": "root should be a valid suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\root.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should clamp to lower bound given numeric", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is less than lower bound should clamp to lower bound given numeric", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should clamp to lower bound given timestamp", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is less than lower bound should clamp to lower bound given timestamp", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the timeout value to disabled", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is equal to lower bound given numeric value should set the timeout value to disabled", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the timeout value to disabled", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is equal to lower bound given string timestamp should set the timeout value to disabled", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the timeout value", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is within `setTimeout` bounds given numeric value should set the timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the timeout value", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is within `setTimeout` bounds given string timestamp should set the timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the disabled timeout value", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is equal to upper bound given numeric value should set the disabled timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the disabled timeout value", + "fullTitle": "Runnable(title, fn) #timeout(ms) when value is out-of-bounds given numeric value should set the disabled timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the slow threshold", + "fullTitle": "Runnable(title, fn) #slow(ms) should set the slow threshold", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not set the slow threshold if the parameter is not passed", + "fullTitle": "Runnable(title, fn) #slow(ms) should not set the slow threshold if the parameter is not passed", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not set the slow threshold if the parameter is undefined", + "fullTitle": "Runnable(title, fn) #slow(ms) should not set the slow threshold if the parameter is undefined", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should convert to ms", + "fullTitle": "Runnable(title, fn) #slow(ms) when passed a time-formatted string should convert to ms", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset current run state", + "fullTitle": "Runnable(title, fn) #reset should reset current run state", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be present", + "fullTitle": "Runnable(title, fn) .title should be present", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "returns the concatenation of the parent's title path and runnable's title", + "fullTitle": "Runnable(title, fn) .titlePath() returns the concatenation of the parent's title path and runnable's title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be .async", + "fullTitle": "Runnable(title, fn) when arity >= 1 should be .async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not be .sync", + "fullTitle": "Runnable(title, fn) when arity >= 1 should not be .sync", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not be .async", + "fullTitle": "Runnable(title, fn) when arity == 0 should not be .async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be .sync", + "fullTitle": "Runnable(title, fn) when arity == 0 should be .sync", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow for whitelisting globals", + "fullTitle": "Runnable(title, fn) #globals should allow for whitelisting globals", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set the number of retries", + "fullTitle": "Runnable(title, fn) #retries(n) should set the number of retries", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when .pending should not invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when sync without error should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback with error", + "fullTitle": "Runnable(title, fn) .run(fn) when sync when an exception is thrown should invoke the callback with error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 4, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "throws an error when it is allowed", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not error with timeout", + "fullTitle": "Runnable(title, fn) .run(fn) when timeouts are disabled should not error with timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 6, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow updating the timeout", + "fullTitle": "Runnable(title, fn) .run(fn) when async should allow updating the timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 51, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should allow a timeout of 0", + "fullTitle": "Runnable(title, fn) .run(fn) when async should allow a timeout of 0", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when async without error should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit a single \"error\" event", + "fullTitle": "Runnable(title, fn) .run(fn) when async when the callback is invoked several times without an error should emit a single \"error\" event", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit a single \"error\" event", + "fullTitle": "Runnable(title, fn) .run(fn) when async when the callback is invoked several times with an error should emit a single \"error\" event", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when async when an exception is thrown should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw its own exception if passed a non-object", + "fullTitle": "Runnable(title, fn) .run(fn) when async when an exception is thrown should not throw its own exception if passed a non-object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "throws an error when it is allowed", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when async when an error is passed should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when async when done() is invoked with a non-Error object should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when async when done() is invoked with a string should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise is fulfilled with no value should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise is fulfilled with a value should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise is rejected should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise is rejected without a reason should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw the timeout error", + "fullTitle": "Runnable(title, fn) .run(fn) when fn returns a promise when the promise takes too long to settle should throw the timeout error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 12, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should invoke the callback", + "fullTitle": "Runnable(title, fn) .run(fn) when fn returns a non-promise should invoke the callback", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should ignore call to `done` and not execute callback again", + "fullTitle": "Runnable(title, fn) .run(fn) if timed-out should ignore call to `done` and not execute callback again", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 11, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "this.skip() should set runnable to pending", + "fullTitle": "Runnable(title, fn) .run(fn) if async this.skip() should set runnable to pending", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "this.skip() should halt synchronous execution", + "fullTitle": "Runnable(title, fn) .run(fn) if async this.skip() should halt synchronous execution", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw an error", + "fullTitle": "Runnable(title, fn) .run(fn) when fn is not a function should throw an error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `true` if test has not failed", + "fullTitle": "Runnable(title, fn) #isFailed() should return `true` if test has not failed", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `true` if test has failed", + "fullTitle": "Runnable(title, fn) #isFailed() should return `true` if test has failed", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `false` if test is pending", + "fullTitle": "Runnable(title, fn) #isFailed() should return `false` if test is pending", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not time out if timeouts disabled after reset", + "fullTitle": "Runnable(title, fn) #resetTimeout() should not time out if timeouts disabled after reset", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 21, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return identity if parameter is truthy", + "fullTitle": "Runnable(title, fn) static method toValueOrError should return identity if parameter is truthy", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an Error if parameter is falsy", + "fullTitle": "Runnable(title, fn) static method toValueOrError should return an Error if parameter is falsy", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should have a unique identifier", + "fullTitle": "Runnable(title, fn) interesting property id should have a unique identifier", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should have a permanent identifier", + "fullTitle": "Runnable(title, fn) interesting property id should have a permanent identifier", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runnable.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should update the runner.total with number of matched tests", + "fullTitle": "Runner instance method grep() should update the runner.total with number of matched tests", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should update the runner.total with number of matched tests when inverted", + "fullTitle": "Runner instance method grep() should update the runner.total with number of matched tests when inverted", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the total number of matched tests", + "fullTitle": "Runner instance method grepTotal() should return the total number of matched tests", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the total number of matched tests when inverted", + "fullTitle": "Runner instance method grepTotal() should return the total number of matched tests when inverted", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include common non enumerable globals", + "fullTitle": "Runner instance method globalProps() should include common non enumerable globals", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should default to the known globals", + "fullTitle": "Runner instance method globals() should default to the known globals", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should white-list globals", + "fullTitle": "Runner instance method globals() should white-list globals", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow variables that match a wildcard", + "fullTitle": "Runner instance method checkGlobals(test) should allow variables that match a wildcard", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit \"fail\" when a new global is introduced", + "fullTitle": "Runner instance method checkGlobals(test) should emit \"fail\" when a new global is introduced", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit \"fail\" when a single new disallowed global is introduced after a single extra global is allowed", + "fullTitle": "Runner instance method checkGlobals(test) should emit \"fail\" when a single new disallowed global is introduced after a single extra global is allowed", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not fail when a new common global is introduced", + "fullTitle": "Runner instance method checkGlobals(test) should not fail when a new common global is introduced", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pluralize the error message when several are introduced", + "fullTitle": "Runner instance method checkGlobals(test) should pluralize the error message when several are introduced", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should respect per test whitelisted globals", + "fullTitle": "Runner instance method checkGlobals(test) should respect per test whitelisted globals", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should respect per test whitelisted globals but still detect other leaks", + "fullTitle": "Runner instance method checkGlobals(test) should respect per test whitelisted globals but still detect other leaks", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit \"fail\" when a global beginning with \"d\" is introduced", + "fullTitle": "Runner instance method checkGlobals(test) should emit \"fail\" when a global beginning with \"d\" is introduced", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should execute hooks after failed test if suite bail is true", + "fullTitle": "Runner instance method hook() should execute hooks after failed test if suite bail is true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should augment hook title with current test title", + "fullTitle": "Runner instance method hook() should augment hook title with current test title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should increment `Runner#failures`", + "fullTitle": "Runner instance method fail() should increment `Runner#failures`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set `Test#state` to \"failed\"", + "fullTitle": "Runner instance method fail() should set `Test#state` to \"failed\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit \"fail\"", + "fullTitle": "Runner instance method fail() should emit \"fail\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit a helpful message when failed with a string", + "fullTitle": "Runner instance method fail() should emit a helpful message when failed with a string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit a the error when failed with an Error instance", + "fullTitle": "Runner instance method fail() should emit a the error when failed with an Error instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit the error when failed with an Error-like object", + "fullTitle": "Runner instance method fail() should emit the error when failed with an Error-like object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit a helpful message when failed with an Object", + "fullTitle": "Runner instance method fail() should emit a helpful message when failed with an Object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit a helpful message when failed with an Array", + "fullTitle": "Runner instance method fail() should emit a helpful message when failed with an Array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recover if the error stack is not writable", + "fullTitle": "Runner instance method fail() should recover if the error stack is not writable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return and not increment failures when test is pending", + "fullTitle": "Runner instance method fail() should return and not increment failures when test is pending", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should increment .failures", + "fullTitle": "Runner instance method fail() should increment .failures", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit \"fail\"", + "fullTitle": "Runner instance method fail() should emit \"fail\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not emit \"end\" if suite bail is not true", + "fullTitle": "Runner instance method fail() should not emit \"end\" if suite bail is not true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw the \"multiple done\" error", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw a \"fatal\" error", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit \"retry\" when a retryable test fails", + "fullTitle": "Runner instance method run() should emit \"retry\" when a retryable test fails", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw an exception if something emits EVENT_TEST_END with a non-Test object", + "fullTitle": "Runner instance method run() should not throw an exception if something emits EVENT_TEST_END with a non-Test object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should clean references after a run", + "fullTitle": "Runner instance method run() should clean references after a run", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not clean references after a run when `cleanReferencesAfterRun` is `false`", + "fullTitle": "Runner instance method run() should not clean references after a run when `cleanReferencesAfterRun` is `false`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not leak `Process.uncaughtException` listeners", + "fullTitle": "Runner instance method run() should not leak `Process.uncaughtException` listeners", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should prettify the stack-trace", + "fullTitle": "Runner instance method run() stack traces short should prettify the stack-trace", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should display the full stack-trace", + "fullTitle": "Runner instance method run() stack traces long should display the full stack-trace", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not hang if overlong error message is single line", + "fullTitle": "Runner instance method run() stack traces ginormous should not hang if overlong error message is single line", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not hang if overlong error message is multiple lines", + "fullTitle": "Runner instance method run() stack traces ginormous should not hang if overlong error message is multiple lines", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a Promise with a failure count", + "fullTitle": "Runner instance method runAsync() should return a Promise with a failure count", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should pass through options to Runner#run", + "fullTitle": "Runner instance method runAsync() should pass through options to Runner#run", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove all listeners from itself", + "fullTitle": "Runner instance method dispose() should remove all listeners from itself", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove \"error\" listeners from a test", + "fullTitle": "Runner instance method dispose() should remove \"error\" listeners from a test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove \"uncaughtException\" listeners from the process", + "fullTitle": "Runner instance method dispose() should remove \"uncaughtException\" listeners from the process", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return when no tests to run", + "fullTitle": "Runner instance method runTest() should return when no tests to run", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow unhandled errors to propagate through", + "fullTitle": "Runner instance method allowUncaught() should allow unhandled errors to propagate through", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not allow unhandled errors in sync hooks to propagate through", + "fullTitle": "Runner instance method allowUncaught() should not allow unhandled errors in sync hooks to propagate through", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow unhandled errors in sync hooks to propagate through", + "fullTitle": "Runner instance method allowUncaught() should allow unhandled errors in sync hooks to propagate through", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "async - should allow unhandled errors in hooks to propagate through", + "fullTitle": "Runner instance method allowUncaught() async - should allow unhandled errors in hooks to propagate through", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set _abort property to true", + "fullTitle": "Runner instance method abort() should set _abort property to true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the Runner", + "fullTitle": "Runner instance method abort() should return the Runner", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Runner instance method _uncaught() when called with a non-Runner context should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should propagate error and throw", + "fullTitle": "Runner instance method uncaught() when allow-uncaught is set to true should propagate error and throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail with a transient Runnable and a new Error coerced from the object", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should ignore argument and return", + "fullTitle": "Runner instance method uncaught() when provided an object argument when argument is a Pending should ignore argument and return", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add the \"uncaught\" property to the Error", + "fullTitle": "Runner instance method uncaught() when provided an object argument when argument is an Error should add the \"uncaught\" property to the Error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail with a transient Runnable and the error", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not emit start/end events", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit start/end events for the benefit of reporters", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not emit start/end events, since this presumably would have already happened", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Runner instance method uncaught() when provided an object argument when argument is an Error when no Runnables are running when Runner is STOPPED should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should clear any pending timeouts", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to fail again", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to fail", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail with the current Runnable and the error", + "fullTitle": "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 fail with the current Runnable and the error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should abort the runner without emitting end event", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should run callback(err) to handle failing and hooks", + "fullTitle": "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 run callback(err) to handle failing and hooks", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not notify test has ended", + "fullTitle": "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 test has ended", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not notify run has ended", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should run callback(err) to handle failing hook pattern", + "fullTitle": "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 run callback(err) to handle failing hook pattern", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not notify test has ended", + "fullTitle": "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 test has ended", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not notify run has ended", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the Runner", + "fullTitle": "Runner instance method linkPartialObjects() should return the Runner", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false", + "fullTitle": "Runner instance method isParallelMode() should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "Runner instance method workerReporter() should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should clone the Suite, omitting children", + "fullTitle": "Suite instance method clone() should clone the Suite, omitting children", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset the `delayed` state", + "fullTitle": "Suite instance method reset() should reset the `delayed` state", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should forward reset to suites and tests", + "fullTitle": "Suite instance method reset() should forward reset to suites and tests", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should forward reset to all hooks", + "fullTitle": "Suite instance method reset() should forward reset to all hooks", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the timeout value", + "fullTitle": "Suite instance method timeout() when no argument is passed should return the timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the Suite object", + "fullTitle": "Suite instance method timeout() when argument is passed should return the Suite object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should parse it", + "fullTitle": "Suite instance method slow() when given a string should parse it", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the slow value", + "fullTitle": "Suite instance method slow() when no argument is passed should return the slow value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the Suite object", + "fullTitle": "Suite instance method slow() when argument is passed should return the Suite object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the bail value", + "fullTitle": "Suite instance method bail() when no argument is passed should return the bail value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the Suite object", + "fullTitle": "Suite instance method bail() when argument is passed should return the Suite object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "adds it to _beforeAll", + "fullTitle": "Suite instance method beforeAll() wraps the passed in function in a Hook adds it to _beforeAll", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "appends title to hook", + "fullTitle": "Suite instance method beforeAll() wraps the passed in function in a Hook appends title to hook", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "uses function name if available", + "fullTitle": "Suite instance method beforeAll() wraps the passed in function in a Hook uses function name if available", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "adds it to _afterAll", + "fullTitle": "Suite instance method afterAll() wraps the passed in function in a Hook adds it to _afterAll", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "appends title to hook", + "fullTitle": "Suite instance method afterAll() wraps the passed in function in a Hook appends title to hook", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "uses function name if available", + "fullTitle": "Suite instance method afterAll() wraps the passed in function in a Hook uses function name if available", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "adds it to _beforeEach", + "fullTitle": "Suite instance method beforeEach() wraps the passed in function in a Hook adds it to _beforeEach", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "appends title to hook", + "fullTitle": "Suite instance method beforeEach() wraps the passed in function in a Hook appends title to hook", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "uses function name if available", + "fullTitle": "Suite instance method beforeEach() wraps the passed in function in a Hook uses function name if available", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not create a hook", + "fullTitle": "Suite instance method beforeEach() when the suite is pending should not create a hook", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "adds it to _afterEach", + "fullTitle": "Suite instance method afterEach() wraps the passed in function in a Hook adds it to _afterEach", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "appends title to hook", + "fullTitle": "Suite instance method afterEach() wraps the passed in function in a Hook appends title to hook", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "uses function name if available", + "fullTitle": "Suite instance method afterEach() wraps the passed in function in a Hook uses function name if available", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "does not create a second root suite", + "fullTitle": "Suite instance method create() does not create a second root suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "does not denote the root suite by being titleless", + "fullTitle": "Suite instance method create() does not denote the root suite by being titleless", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "sets the parent on the added Suite", + "fullTitle": "Suite instance method addSuite() sets the parent on the added Suite", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "copies the timeout value", + "fullTitle": "Suite instance method addSuite() copies the timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "copies the slow value", + "fullTitle": "Suite instance method addSuite() copies the slow value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "adds the suite to the suites collection", + "fullTitle": "Suite instance method addSuite() adds the suite to the suites collection", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "treats suite as pending if its parent is pending", + "fullTitle": "Suite instance method addSuite() treats suite as pending if its parent is pending", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "sets the parent on the added test", + "fullTitle": "Suite instance method addTest() sets the parent on the added test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "copies the timeout value", + "fullTitle": "Suite instance method addTest() copies the timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "adds the test to the tests collection", + "fullTitle": "Suite instance method addTest() adds the test to the tests collection", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "returns the suite title", + "fullTitle": "Suite instance method fullTitle() when there is no parent returns the suite title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "returns the combination of parent's and suite's title", + "fullTitle": "Suite instance method fullTitle() when there is a parent returns the combination of parent's and suite's title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "returns the suite title", + "fullTitle": "Suite instance method titlePath() when there is no parent returns the suite title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "returns the suite title", + "fullTitle": "Suite instance method titlePath() when there is a parent the parent is the root suite returns the suite title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "returns the concatenation of parent's and suite's title", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return 0", + "fullTitle": "Suite instance method total() when there are no nested suites or tests should return 0", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the number", + "fullTitle": "Suite instance method total() when there are several tests in the suite should return the number", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return 0", + "fullTitle": "Suite instance method eachTest(fn) when there are no nested suites or tests should return 0", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the number", + "fullTitle": "Suite instance method eachTest(fn) when there are several tests in the suite should return the number", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the number", + "fullTitle": "Suite instance method eachTest(fn) when there are several levels of nested suites should return the number", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw an error if the title isn't a string", + "fullTitle": "Suite instance method constructor should throw an error if the title isn't a string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw if the title is a string", + "fullTitle": "Suite instance method constructor should not throw if the title is a string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should report listened-for deprecated events as deprecated", + "fullTitle": "Suite instance method constructor should report listened-for deprecated events as deprecated", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should convert a string to milliseconds", + "fullTitle": "Suite instance method timeout() should convert a string to milliseconds", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true if a test has `only`", + "fullTitle": "Suite instance method hasOnly() should return true if a test has `only`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true if a suite has `only`", + "fullTitle": "Suite instance method hasOnly() should return true if a suite has `only`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true if nested suite has `only`", + "fullTitle": "Suite instance method hasOnly() should return true if nested suite has `only`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false if no suite or test is marked `only`", + "fullTitle": "Suite instance method hasOnly() should return false if no suite or test is marked `only`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should filter out all other tests and suites if a test has `only`", + "fullTitle": "Suite instance method filterOnly() should filter out all other tests and suites if a test has `only`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should filter out all other tests and suites if a suite has `only`", + "fullTitle": "Suite instance method filterOnly() should filter out all other tests and suites if a suite has `only`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call appendOnlySuite on parent", + "fullTitle": "Suite instance method markOnly() should call appendOnlySuite on parent", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw an error if the title isn't a string", + "fullTitle": "Test initialization should throw an error if the title isn't a string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw if the title is a string", + "fullTitle": "Test initialization should not throw if the title is a string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\suite.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the title", + "fullTitle": "Test .clone() should copy the title", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the timeout value", + "fullTitle": "Test .clone() should copy the timeout value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the slow value", + "fullTitle": "Test .clone() should copy the slow value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the retries value", + "fullTitle": "Test .clone() should copy the retries value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the currentRetry value", + "fullTitle": "Test .clone() should copy the currentRetry value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add/keep the retriedTest value", + "fullTitle": "Test .clone() should add/keep the retriedTest value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the globals value", + "fullTitle": "Test .clone() should copy the globals value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the parent value", + "fullTitle": "Test .clone() should copy the parent value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should copy the file value", + "fullTitle": "Test .clone() should copy the file value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset the run state", + "fullTitle": "Test .reset() should reset the run state", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call Runnable.reset", + "fullTitle": "Test .reset() should call Runnable.reset", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not be pending by default", + "fullTitle": "Test .isPending() should not be pending by default", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be pending when marked as such", + "fullTitle": "Test .isPending() should be pending when marked as such", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be pending when its parent is pending", + "fullTitle": "Test .isPending() should be pending when its parent is pending", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call appendOnlyTest on parent", + "fullTitle": "Test .markOnly() should call appendOnlyTest on parent", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\test.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing sync and test is sync", + "fullTitle": "a test that throws non-extensible should not pass if throwing sync and test is sync", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing sync and test is async", + "fullTitle": "a test that throws non-extensible should not pass if throwing sync and test is async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing async and test is async", + "fullTitle": "a test that throws non-extensible should not pass if throwing async and test is async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing sync and test is sync", + "fullTitle": "a test that throws undefined should not pass if throwing sync and test is sync", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing sync and test is async", + "fullTitle": "a test that throws undefined should not pass if throwing sync and test is async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing async and test is async", + "fullTitle": "a test that throws undefined should not pass if throwing async and test is async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing sync and test is sync", + "fullTitle": "a test that throws null should not pass if throwing sync and test is sync", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing sync and test is async", + "fullTitle": "a test that throws null should not pass if throwing sync and test is async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not pass if throwing async and test is async", + "fullTitle": "a test that throws null should not pass if throwing async and test is async", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\throw.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should error on timeout", + "fullTitle": "timeouts should error on timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should allow overriding per-test", + "fullTitle": "timeouts should allow overriding per-test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 50, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should work with timeout(0)", + "fullTitle": "timeouts disabling should work with timeout(0)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work with timeout(0)", + "fullTitle": "timeouts disabling using beforeEach should work with timeout(0)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work with timeout(0)", + "fullTitle": "timeouts disabling using before should work with timeout(0)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should suppress timeout(4)", + "fullTitle": "timeouts disabling using timeout(0) should suppress timeout(4)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 50, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work with timeout(0)", + "fullTitle": "timeouts disabling suite-level should work with timeout(0)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work with timeout(0)", + "fullTitle": "timeouts disabling suite-level nested suite should work with timeout(0)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\timeout.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove the wrapping function declaration", + "fullTitle": "lib/utils clean() should remove the wrapping function declaration", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle newlines in the function declaration", + "fullTitle": "lib/utils clean() should handle newlines in the function declaration", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove space character indentation from the function body", + "fullTitle": "lib/utils clean() should remove space character indentation from the function body", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove tab character indentation from the function body", + "fullTitle": "lib/utils clean() should remove tab character indentation from the function body", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle functions with tabs in their declarations", + "fullTitle": "lib/utils clean() should handle functions with tabs in their declarations", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle named functions without space after name", + "fullTitle": "lib/utils clean() should handle named functions without space after name", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle named functions with space after name", + "fullTitle": "lib/utils clean() should handle named functions with space after name", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle functions with no space between the end and the closing brace", + "fullTitle": "lib/utils clean() should handle functions with no space between the end and the closing brace", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle functions with parentheses in the same line", + "fullTitle": "lib/utils clean() should handle functions with parentheses in the same line", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle empty functions", + "fullTitle": "lib/utils clean() should handle empty functions", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format a single line test function", + "fullTitle": "lib/utils clean() should format a single line test function", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format a multi line test indented with spaces", + "fullTitle": "lib/utils clean() should format a multi line test indented with spaces", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format a multi line test indented with tabs", + "fullTitle": "lib/utils clean() should format a multi line test indented with tabs", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format functions saved in windows style - spaces", + "fullTitle": "lib/utils clean() should format functions saved in windows style - spaces", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format functions saved in windows style - tabs", + "fullTitle": "lib/utils clean() should format functions saved in windows style - tabs", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format es6 arrow functions", + "fullTitle": "lib/utils clean() should format es6 arrow functions", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should format es6 arrow functions with implicit return", + "fullTitle": "lib/utils clean() should format es6 arrow functions with implicit return", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an object representation of a string created with a String constructor", + "fullTitle": "lib/utils stringify() should return an object representation of a string created with a String constructor", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return Buffer with .toJSON representation", + "fullTitle": "lib/utils stringify() should return Buffer with .toJSON representation", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return Date object with .toISOString() + string prefix", + "fullTitle": "lib/utils stringify() should return Date object with .toISOString() + string prefix", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return invalid Date object with .toString() + string prefix", + "fullTitle": "lib/utils stringify() should return invalid Date object with .toString() + string prefix", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should canonicalize the object", + "fullTitle": "lib/utils stringify() should canonicalize the object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle circular structures in objects", + "fullTitle": "lib/utils stringify() should handle circular structures in objects", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle circular structures in arrays", + "fullTitle": "lib/utils stringify() should handle circular structures in arrays", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle circular structures in functions", + "fullTitle": "lib/utils stringify() should handle circular structures in functions", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle various non-undefined, non-null, non-object, non-array, non-date, and non-function values", + "fullTitle": "lib/utils stringify() should handle various non-undefined, non-null, non-object, non-array, non-date, and non-function values", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle arrays", + "fullTitle": "lib/utils stringify() should handle arrays", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle functions", + "fullTitle": "lib/utils stringify() should handle functions", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle empty objects", + "fullTitle": "lib/utils stringify() should handle empty objects", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle empty arrays", + "fullTitle": "lib/utils stringify() should handle empty arrays", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle non-empty arrays", + "fullTitle": "lib/utils stringify() should handle non-empty arrays", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle empty functions (with no properties)", + "fullTitle": "lib/utils stringify() should handle empty functions (with no properties)", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle functions w/ properties", + "fullTitle": "lib/utils stringify() should handle functions w/ properties", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle undefined values", + "fullTitle": "lib/utils stringify() should handle undefined values", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recurse", + "fullTitle": "lib/utils stringify() should recurse", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "might get confusing", + "fullTitle": "lib/utils stringify() might get confusing", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not freak out if it sees a primitive twice", + "fullTitle": "lib/utils stringify() should not freak out if it sees a primitive twice", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should stringify dates", + "fullTitle": "lib/utils stringify() should stringify dates", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle object without an Object prototype", + "fullTitle": "lib/utils stringify() should handle object without an Object prototype", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle Symbol", + "fullTitle": "lib/utils stringify() should handle Symbol", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle length properties that cannot be coerced to a number", + "fullTitle": "lib/utils stringify() should handle length properties that cannot be coerced to a number", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should show the handle -0 situations", + "fullTitle": "lib/utils stringify() #Number should show the handle -0 situations", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work well with `NaN` and `Infinity`", + "fullTitle": "lib/utils stringify() #Number should work well with `NaN` and `Infinity`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "floats and ints", + "fullTitle": "lib/utils stringify() #Number floats and ints", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work with bigints when possible", + "fullTitle": "lib/utils stringify() #Number should work with bigints when possible", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should represent the actual full result", + "fullTitle": "lib/utils stringify() canonicalize example should represent the actual full result", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recognize various types", + "fullTitle": "lib/utils type() should recognize various types", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recognize null and undefined", + "fullTitle": "lib/utils type() when toString on null or undefined stringifies window should recognize null and undefined", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recognize various types", + "fullTitle": "lib/utils canonicalType() should recognize various types", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recognize null and undefined", + "fullTitle": "lib/utils canonicalType() when toString on null or undefined stringifies window should recognize null and undefined", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true if the value is Promise-ish", + "fullTitle": "lib/utils isPromise() should return true if the value is Promise-ish", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false if the value is not an object", + "fullTitle": "lib/utils isPromise() should return false if the value is not an object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false if the value is an object w/o a \"then\" function", + "fullTitle": "lib/utils isPromise() should return false if the value is an object w/o a \"then\" function", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return false if the object is null", + "fullTitle": "lib/utils isPromise() should return false if the object is null", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "replaces the usual xml suspects", + "fullTitle": "lib/utils escape() replaces the usual xml suspects", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "replaces invalid xml characters", + "fullTitle": "lib/utils escape() replaces invalid xml characters", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return its input as string wrapped in single quotes", + "fullTitle": "lib/utils sQuote() should return its input as string wrapped in single quotes", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return its input as string wrapped in double quotes", + "fullTitle": "lib/utils dQuote() should return its input as string wrapped in double quotes", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an object with a null prototype", + "fullTitle": "lib/utils createMap() should return an object with a null prototype", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add props to the object", + "fullTitle": "lib/utils createMap() should add props to the object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add props from all object parameters to the object", + "fullTitle": "lib/utils createMap() should add props from all object parameters to the object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should convert the string to lowercase", + "fullTitle": "lib/utils slug() should convert the string to lowercase", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should convert whitespace to dashes", + "fullTitle": "lib/utils slug() should convert whitespace to dashes", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should strip non-alphanumeric and non-dash characters", + "fullTitle": "lib/utils slug() should strip non-alphanumeric and non-dash characters", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should disallow consecutive dashes", + "fullTitle": "lib/utils slug() should disallow consecutive dashes", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a copy of the array", + "fullTitle": "lib/utils castArray() when provided an array value should return a copy of the array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an array containing the arguments", + "fullTitle": "lib/utils castArray() when provided an \"arguments\" value should return an array containing the arguments", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an array containing the object only", + "fullTitle": "lib/utils castArray() when provided an object should return an array containing the object only", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an empty array", + "fullTitle": "lib/utils castArray() when provided no parameters should return an empty array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an array containing the primitive value only", + "fullTitle": "lib/utils castArray() when provided a primitive value should return an array containing the primitive value only", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an array containing a null value only", + "fullTitle": "lib/utils castArray() when provided null should return an array containing a null value only", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should print a deprecation message", + "fullTitle": "lib/utils lookupFiles() when run in Node.js should print a deprecation message", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should delegate to new location of lookupFiles()", + "fullTitle": "lib/utils lookupFiles() when run in Node.js should delegate to new location of lookupFiles()", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "lib/utils lookupFiles() when run in browser should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a non-empty string", + "fullTitle": "lib/utils uniqueID() should return a non-empty string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a BufferedWorkerPool instance", + "fullTitle": "class BufferedWorkerPool static method create() should return a BufferedWorkerPool instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw", + "fullTitle": "class BufferedWorkerPool static method create() when passed no arguments should not throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a serialized string", + "fullTitle": "class BufferedWorkerPool static method serializeOptions() should return a serialized string", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not throw", + "fullTitle": "class BufferedWorkerPool static method serializeOptions() when passed no arguments should not throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not perform serialization twice", + "fullTitle": "class BufferedWorkerPool static method serializeOptions() when called multiple times with the same object should not perform serialization twice", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the same value", + "fullTitle": "class BufferedWorkerPool static method serializeOptions() when called multiple times with the same object should return the same value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should apply defaults", + "fullTitle": "class BufferedWorkerPool constructor should apply defaults", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the object returned by `workerpool.Pool#stats`", + "fullTitle": "class BufferedWorkerPool instance method stats() should return the object returned by `workerpool.Pool#stats`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should serialize the options object", + "fullTitle": "class BufferedWorkerPool instance method run() should serialize the options object", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should deserialize the result", + "fullTitle": "class BufferedWorkerPool instance method run() should deserialize the result", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "class BufferedWorkerPool instance method run() when passed no arguments should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "class BufferedWorkerPool instance method run() when passed a non-string filepath should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should delegate to the underlying pool w/ \"force\" behavior", + "fullTitle": "class BufferedWorkerPool instance method terminate() when called with `force` should delegate to the underlying pool w/ \"force\" behavior", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should delegate to the underlying pool w/o \"force\" behavior", + "fullTitle": "class BufferedWorkerPool instance method terminate() when called without `force` should delegate to the underlying pool w/o \"force\" behavior", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\buffered-worker-pool.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the YAML parser", + "fullTitle": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \".yaml\" extension should use the YAML parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the YAML parser", + "fullTitle": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \".yml\" extension should use the YAML parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the JS parser", + "fullTitle": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \".js\" extension should use the JS parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the JS parser", + "fullTitle": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \".cjs\" extension should use the JS parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the JSON parser", + "fullTitle": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \".jsonc\" extension should use the JSON parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the JSON parser", + "fullTitle": "cli/config loadConfig() when parsing succeeds when supplied a filepath with \".json\" extension should use the JSON parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should use the JSON parser", + "fullTitle": "cli/config loadConfig() when supplied a filepath with unsupported extension should use the JSON parser", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "cli/config loadConfig() when config file parsing fails should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should look for one of the config files using findup-sync", + "fullTitle": "cli/config findConfig() should look for one of the config files using findup-sync", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should support an explicit `cwd`", + "fullTitle": "cli/config findConfig() should support an explicit `cwd`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\config.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--icu-data-dir should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --icu-data-dir should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--title should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --title should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-import-meta-resolve should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-import-meta-resolve should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--use-largepages should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --use-largepages should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-tls should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-tls should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-event-categories should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-event-categories should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--conditions should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --conditions should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-event-file-pattern should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-event-file-pattern should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--disable-proto should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --disable-proto should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-worker should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-worker should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--diagnostic-dir should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --diagnostic-dir should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--debug-arraybuffer-allocations should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --debug-arraybuffer-allocations should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--max-http-header-size should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --max-http-header-size should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--v8-pool-size should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --v8-pool-size should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-max-v1.2 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-max-v1.2 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--zero-fill-buffers should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --zero-fill-buffers should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-sync-io should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-sync-io should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--disallow-code-generation-from-strings should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --disallow-code-generation-from-strings should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--force-context-aware should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --force-context-aware should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-dir should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-dir should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--pending-deprecation should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --pending-deprecation should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--use-bundled-ca should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --use-bundled-ca should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-filename should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-filename should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-compact should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-compact should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-on-fatalerror should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-on-fatalerror should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--perf-prof should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --perf-prof should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-signal should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-signal should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--preserve-symlinks-main should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --preserve-symlinks-main should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--openssl-config should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --openssl-config should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-cipher-list should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-cipher-list should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--use-openssl-ca should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --use-openssl-ca should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-sigint should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-sigint should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--no-node-snapshot should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --no-node-snapshot should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--track-heap-objects should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --track-heap-objects should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-repl-await should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-repl-await should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-json-modules should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-json-modules should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--perf-prof-unwinding-info should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --perf-prof-unwinding-info should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--abort-on-uncaught-exception should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --abort-on-uncaught-exception should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--interpreted-frames-native-stack should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --interpreted-frames-native-stack should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--perf-basic-prof-only-functions should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --perf-basic-prof-only-functions should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--max-old-space-size should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --max-old-space-size should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--perf-basic-prof should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --perf-basic-prof should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--stack-trace-limit should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --stack-trace-limit should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--jitless should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --jitless should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--huge-max-old-generation-size should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --huge-max-old-generation-size should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-uncaught-exception should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-uncaught-exception should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-on-signal should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-on-signal should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-policy should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-policy should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--enable-source-maps should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --enable-source-maps should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-loader should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-loader should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-min-v1.2 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-min-v1.2 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-modules should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-modules should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-wasm-modules should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-wasm-modules should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--policy-integrity should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --policy-integrity should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-vm-modules should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-vm-modules should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-report should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-report should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-wasi-unstable-preview1 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-wasi-unstable-preview1 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-uncaught should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-uncaught should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--insecure-http-parser should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --insecure-http-parser should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--frozen-intrinsics should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --frozen-intrinsics should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-keylog should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-keylog should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--input-type should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --input-type should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--heapsnapshot-signal should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --heapsnapshot-signal should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-max-v1.3 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-max-v1.3 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--http-parser should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --http-parser should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--http-server-default-timeout should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --http-server-default-timeout should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--experimental-specifier-resolution should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --experimental-specifier-resolution should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--no-deprecation should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --no-deprecation should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-min-v1.0 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-min-v1.0 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--no-force-async-hooks-checks should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --no-force-async-hooks-checks should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--no-warnings should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --no-warnings should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--preserve-symlinks should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --preserve-symlinks should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-min-v1.1 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-min-v1.1 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--inspect-port should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --inspect-port should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-exit should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-exit should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--redirect-warnings should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --redirect-warnings should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--tls-min-v1.3 should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --tls-min-v1.3 should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--throw-deprecation should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --throw-deprecation should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-deprecation should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-deprecation should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-warnings should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-warnings should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--unhandled-rejections should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --unhandled-rejections should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--inspect should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --inspect should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--napi-modules should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --napi-modules should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--inspect-brk should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --inspect-brk should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--inspect-publish-uid should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --inspect-publish-uid should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--debug-port should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --debug-port should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--trace-events-enabled should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --trace-events-enabled should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--report-directory should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --report-directory should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--prof-process should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --prof-process should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--es-module-specifier-resolution should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --es-module-specifier-resolution should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--loader should return true", + "fullTitle": "node-flags isNodeFlag() for all allowed node environment flags --loader should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "--require should return false", + "fullTitle": "node-flags isNodeFlag() for all allowed node env flags which conflict with mocha flags --require should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "-r should return false", + "fullTitle": "node-flags isNodeFlag() for all allowed node env flags which conflict with mocha flags -r should return false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should require leading dashes", + "fullTitle": "node-flags isNodeFlag() when expecting leading dashes should require leading dashes", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for flags starting with \"preserve-symlinks\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for flags starting with \"preserve-symlinks\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for flags starting with \"harmony-\" or \"harmony_\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for flags starting with \"harmony-\" or \"harmony_\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for flags starting with \"trace-\" or \"trace_\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for flags starting with \"trace-\" or \"trace_\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for \"harmony\" itself", + "fullTitle": "node-flags isNodeFlag() special cases should return true for \"harmony\" itself", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for \"gc-global\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for \"gc-global\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for \"es-staging\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for \"es-staging\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for \"use-strict\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for \"use-strict\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for flags starting with \"--v8-\"", + "fullTitle": "node-flags isNodeFlag() special cases should return true for flags starting with \"--v8-\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true for inspect flags", + "fullTitle": "node-flags impliesNoTimeouts() should return true for inspect flags", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle single v8 flags", + "fullTitle": "node-flags unparseNodeFlags() should handle single v8 flags", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle multiple v8 flags", + "fullTitle": "node-flags unparseNodeFlags() should handle multiple v8 flags", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\node-flags.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return an object containing positional args, defaults, and anti-reloading flags", + "fullTitle": "options loadOptions() when no parameter provided should return an object containing positional args, defaults, and anti-reloading flags", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return merged options incl. package.json opts", + "fullTitle": "options loadOptions() when parameter provided package.json when path to package.json (`--package `) is valid should return merged options incl. package.json opts", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not try to find a package.json", + "fullTitle": "options loadOptions() when parameter provided package.json when path to package.json (`--package `) is valid should not try to find a package.json", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set package = false", + "fullTitle": "options loadOptions() when parameter provided package.json when path to package.json (`--package `) is valid should set package = false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "options loadOptions() when parameter provided package.json when path to package.json (`--package `) is invalid should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return merged options incl. found package.json", + "fullTitle": "options loadOptions() when parameter provided package.json when path to package.json unspecified should return merged options incl. found package.json", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set package = false", + "fullTitle": "options loadOptions() when parameter provided package.json when path to package.json unspecified should set package = false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return parsed args and default config", + "fullTitle": "options loadOptions() when parameter provided package.json when called with package = false (`--no-package`) should return parsed args and default config", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not look for package.json", + "fullTitle": "options loadOptions() when parameter provided package.json when called with package = false (`--no-package`) should not look for package.json", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set package = false", + "fullTitle": "options loadOptions() when parameter provided package.json when called with package = false (`--no-package`) should set package = false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return parsed args, default config and package.json", + "fullTitle": "options loadOptions() when parameter provided rc file when called with config = false (`--no-config`) should return parsed args, default config and package.json", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to load a config file", + "fullTitle": "options loadOptions() when parameter provided rc file when called with config = false (`--no-config`) should not attempt to load a config file", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to find a config file", + "fullTitle": "options loadOptions() when parameter provided rc file when called with config = false (`--no-config`) should not attempt to find a config file", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set config = false", + "fullTitle": "options loadOptions() when parameter provided rc file when called with config = false (`--no-config`) should set config = false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not look for a config", + "fullTitle": "options loadOptions() when parameter provided rc file when path to config (`--config `) is invalid should not look for a config", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to load file at path", + "fullTitle": "options loadOptions() when parameter provided rc file when path to config (`--config `) is invalid should attempt to load file at path", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw to warn the user", + "fullTitle": "options loadOptions() when parameter provided rc file when path to config (`--config `) is invalid should throw to warn the user", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should look for a config", + "fullTitle": "options loadOptions() when parameter provided rc file when called with unspecified config when an rc file would be found should look for a config", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should attempt to load file at found path", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set config = false", + "fullTitle": "options loadOptions() when parameter provided rc file when called with unspecified config when an rc file would be found should set config = false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should look for a config", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not attempt to load a config file", + "fullTitle": "options loadOptions() when parameter provided rc file when called with unspecified config when an rc file would not be found should not attempt to load a config file", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should set config = false", + "fullTitle": "options loadOptions() when parameter provided rc file when called with unspecified config when an rc file would not be found should set config = false", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should prioritize package.json over defaults", + "fullTitle": "options loadOptions() config priority should prioritize package.json over defaults", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 77, + "currentRetry": 0, + "speed": "slow", + "err": {} + }, + { + "title": "should prioritize rc file over package.json", + "fullTitle": "options loadOptions() config priority should prioritize rc file over package.json", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 75, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should prioritize args over rc file", + "fullTitle": "options loadOptions() config priority should prioritize args over rc file", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 72, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should return basic parsed arguments and flag", + "fullTitle": "options loadOptions() when called with a one-and-done arg \"help\" should return basic parsed arguments and flag", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return basic parsed arguments and flag", + "fullTitle": "options loadOptions() when called with a one-and-done arg \"h\" should return basic parsed arguments and flag", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return basic parsed arguments and flag", + "fullTitle": "options loadOptions() when called with a one-and-done arg \"version\" should return basic parsed arguments and flag", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return basic parsed arguments and flag", + "fullTitle": "options loadOptions() when called with a one-and-done arg \"V\" should return basic parsed arguments and flag", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return basic parsed arguments and flag", + "fullTitle": "options loadOptions() when called with a one-and-done arg \"list-interfaces\" should return basic parsed arguments and flag", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return basic parsed arguments and flag", + "fullTitle": "options loadOptions() when called with a one-and-done arg \"list-reporters\" should return basic parsed arguments and flag", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not concatenate the default value", + "fullTitle": "options loadOptions() \"extension\" handling when user supplies \"extension\" option should not concatenate the default value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should retain the default", + "fullTitle": "options loadOptions() \"extension\" handling when user does not supply \"extension\" option should retain the default", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should place both - unsplitted - into the positional arguments array", + "fullTitle": "options loadOptions() \"spec\" handling when user supplies \"spec\" in config and positional arguments should place both - unsplitted - into the positional arguments array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not split option values by comma", + "fullTitle": "options loadOptions() \"ignore\" handling should not split option values by comma", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\options.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should disallow an array of names", + "fullTitle": "helpers validateLegacyPlugin() when used with \"reporter\" key should disallow an array of names", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail to recognize an unknown reporter", + "fullTitle": "helpers validateLegacyPlugin() when used with \"reporter\" key should fail to recognize an unknown reporter", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should disallow an array of names", + "fullTitle": "helpers validateLegacyPlugin() when used with an \"interfaces\" key should disallow an array of names", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail to recognize an unknown interface", + "fullTitle": "helpers validateLegacyPlugin() when used with an \"interfaces\" key should fail to recognize an unknown interface", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail", + "fullTitle": "helpers validateLegacyPlugin() when used with an unknown plugin type should fail", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should fail and report the original error", + "fullTitle": "helpers validateLegacyPlugin() when a plugin throws an exception upon load should fail and report the original error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a flat array", + "fullTitle": "helpers list() when provided a flat array should return a flat array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a flat array", + "fullTitle": "helpers list() when provided a nested array should return a flat array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a flat array", + "fullTitle": "helpers list() when given a comma-delimited string should return a flat array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run-helpers.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option retries", + "fullTitle": "command run builder number type should include option retries", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option jobs", + "fullTitle": "command run builder number type should include option jobs", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option config", + "fullTitle": "command run builder string type should include option config", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option fgrep", + "fullTitle": "command run builder string type should include option fgrep", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option grep", + "fullTitle": "command run builder string type should include option grep", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option package", + "fullTitle": "command run builder string type should include option package", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option reporter", + "fullTitle": "command run builder string type should include option reporter", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option ui", + "fullTitle": "command run builder string type should include option ui", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option slow", + "fullTitle": "command run builder string type should include option slow", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option timeout", + "fullTitle": "command run builder string type should include option timeout", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option allow-uncaught", + "fullTitle": "command run builder boolean type should include option allow-uncaught", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option async-only", + "fullTitle": "command run builder boolean type should include option async-only", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option bail", + "fullTitle": "command run builder boolean type should include option bail", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option check-leaks", + "fullTitle": "command run builder boolean type should include option check-leaks", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option color", + "fullTitle": "command run builder boolean type should include option color", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option delay", + "fullTitle": "command run builder boolean type should include option delay", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option diff", + "fullTitle": "command run builder boolean type should include option diff", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option exit", + "fullTitle": "command run builder boolean type should include option exit", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option forbid-only", + "fullTitle": "command run builder boolean type should include option forbid-only", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option forbid-pending", + "fullTitle": "command run builder boolean type should include option forbid-pending", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option full-trace", + "fullTitle": "command run builder boolean type should include option full-trace", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option growl", + "fullTitle": "command run builder boolean type should include option growl", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option inline-diffs", + "fullTitle": "command run builder boolean type should include option inline-diffs", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option invert", + "fullTitle": "command run builder boolean type should include option invert", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option list-interfaces", + "fullTitle": "command run builder boolean type should include option list-interfaces", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option list-reporters", + "fullTitle": "command run builder boolean type should include option list-reporters", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option no-colors", + "fullTitle": "command run builder boolean type should include option no-colors", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option parallel", + "fullTitle": "command run builder boolean type should include option parallel", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option recursive", + "fullTitle": "command run builder boolean type should include option recursive", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option sort", + "fullTitle": "command run builder boolean type should include option sort", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option watch", + "fullTitle": "command run builder boolean type should include option watch", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option extension", + "fullTitle": "command run builder array type should include option extension", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option file", + "fullTitle": "command run builder array type should include option file", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option global", + "fullTitle": "command run builder array type should include option global", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option ignore", + "fullTitle": "command run builder array type should include option ignore", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option reporter-option", + "fullTitle": "command run builder array type should include option reporter-option", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option require", + "fullTitle": "command run builder array type should include option require", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option spec", + "fullTitle": "command run builder array type should include option spec", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option watch-files", + "fullTitle": "command run builder array type should include option watch-files", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should include option watch-ignore", + "fullTitle": "command run builder array type should include option watch-ignore", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\cli\\run.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the Mocha instance", + "fullTitle": "Mocha instance method parallelMode() when `Mocha` is running in Node.js should return the Mocha instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 6, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not swap the Runner, nor change lazy loading setting", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not swap the Runner, nor change lazy loading setting", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should enable parallel mode", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should enable serial mode", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add the given file to the files array", + "fullTitle": "Mocha instance method addFile() should add the given file to the files array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method addFile() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should load all files from the files array", + "fullTitle": "Mocha instance method loadFiles() should load all files from the files array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should execute the optional callback if given", + "fullTitle": "Mocha instance method loadFiles() should execute the optional callback if given", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should delegate Mocha.unloadFile() for each item in its list of files", + "fullTitle": "Mocha instance method unloadFiles() should delegate Mocha.unloadFile() for each item in its list of files", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 9, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "Mocha instance method unloadFiles() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should load from current working directory", + "fullTitle": "Mocha instance method reporter() when a reporter exists relative to the cwd should load from current working directory", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw \"invalid reporter\" exception", + "fullTitle": "Mocha instance method reporter() when a reporter exists relative to the cwd when the reporter throws upon load should throw \"invalid reporter\" exception", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should warn about the error before throwing", + "fullTitle": "Mocha instance method reporter() when a reporter exists relative to the cwd when the reporter throws upon load should warn about the error before throwing", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should load from module path", + "fullTitle": "Mocha instance method reporter() when a reporter exists relative to the \"mocha\" module path should load from module path", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw \"invalid reporter\" exception", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should warn about the error before throwing", + "fullTitle": "Mocha instance method reporter() when a reporter exists relative to the \"mocha\" module path when the reporter throws upon load should warn about the error before throwing", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset referencesCleaned and allow for next run", + "fullTitle": "Mocha instance method unloadFiles() should reset referencesCleaned and allow for next run", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not be allowed when the current instance is already disposed", + "fullTitle": "Mocha instance method unloadFiles() should not be allowed when the current instance is already disposed", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the `Mocha` instance", + "fullTitle": "Mocha instance method lazyLoadFiles() should return the `Mocha` instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should enable eager loading", + "fullTitle": "Mocha instance method lazyLoadFiles() when passed a non-`true` value should enable eager loading", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should enable lazy loading", + "fullTitle": "Mocha instance method lazyLoadFiles() when passed `true` should enable lazy loading", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should unload a specific file from cache", + "fullTitle": "Mocha static method unloadFile() should unload a specific file from cache", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\mocha.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should start in \"IDLE\" state", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner constructor should start in \"IDLE\" state", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should disallow an invalid state transition", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance property _state should disallow an invalid state transition", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should change the state to COMPLETE", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner event EVENT_RUN_END should change the state to COMPLETE", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should be chainable", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() should be chainable", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should emit `EVENT_RUN_BEGIN`", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() should emit `EVENT_RUN_BEGIN`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should create object references", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() when instructed to link objects should create object references", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should result in an uncaught exception", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should recover", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() when a worker fails should recover", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should delegate to Runner#uncaught", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() when a worker fails should delegate to Runner#uncaught", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not force-terminate", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() when suite should bail when no event contains an error should not force-terminate", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cleanly terminate the thread pool", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cleanly terminate the thread pool", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not force-terminate", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method run() when a suite has a bail flag when no event contains an error should not force-terminate", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cleanly terminate the thread pool", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cleanly terminate the thread pool", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should cleanly terminate the thread pool", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the runner", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method linkPartialObjects() should return the runner", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return true", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method isParallelMode() should return true", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return its context", + "fullTitle": "parallel-buffered-runner ParallelBufferedRunner instance method workerReporter() should return its context", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\parallel-buffered-runner.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should listen for Runner events", + "fullTitle": "ParallelBuffered constructor should listen for Runner events", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\reporters\\parallel-buffered.spec.js", + "duration": 8, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should listen for Runner events expecting to occur once", + "fullTitle": "ParallelBuffered constructor should listen for Runner events expecting to occur once", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\reporters\\parallel-buffered.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove all listeners", + "fullTitle": "ParallelBuffered event on EVENT_RUN_END should remove all listeners", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\reporters\\parallel-buffered.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should populate its `events` array with SerializableEvents", + "fullTitle": "ParallelBuffered event on any other event listened for should populate its `events` array with SerializableEvents", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\reporters\\parallel-buffered.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should execute its callback with a SerializableWorkerResult", + "fullTitle": "ParallelBuffered instance method done should execute its callback with a SerializableWorkerResult", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\reporters\\parallel-buffered.spec.js", + "duration": 6, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reset its `events` prop", + "fullTitle": "ParallelBuffered instance method done should reset its `events` prop", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\reporters\\parallel-buffered.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the value", + "fullTitle": "serializer function serialize when passed a non-object value should return the value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the value", + "fullTitle": "serializer function serialize when passed an object value w/o a `serialize` method should return the value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the result of the `serialize` method", + "fullTitle": "serializer function serialize when passed an object value having a `serialize` method should return the result of the `serialize` method", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `undefined`", + "fullTitle": "serializer function serialize when not passed anything should return `undefined`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `undefined`", + "fullTitle": "serializer function deserialize when passed nothing should return `undefined`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the value", + "fullTitle": "serializer function deserialize when passed a non-object value should return the value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the value", + "fullTitle": "serializer function deserialize when passed an object value which is not a SerializedWorkerResult should return the value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the result of `SerializableWorkerResult.deserialize` called on the value", + "fullTitle": "serializer function deserialize when passed a SerializedWorkerResult object should return the result of `SerializableWorkerResult.deserialize` called on the value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw \"invalid arg value\" error", + "fullTitle": "serializer SerializableEvent constructor when called without `eventName` should throw \"invalid arg value\" error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw \"invalid arg type\" error", + "fullTitle": "serializer SerializableEvent constructor when called with a non-object `rawObject` should throw \"invalid arg type\" error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should mutate the instance in-place", + "fullTitle": "serializer SerializableEvent instance method serialize should mutate the instance in-place", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should freeze the instance", + "fullTitle": "serializer SerializableEvent instance method serialize should freeze the instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call the `serialize` method", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an object with a `serialize` method should call the `serialize` method", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call the `serialize` method", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an object containing an object with a `serialize` method should call the `serialize` method", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove the method", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an object containing a non-`serialize` method should remove the method", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should serialize the array", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an object containing an array should serialize the array", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should serialize the error", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an error should serialize the error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should retain own props", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an error should retain own props", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should not retain not-own props", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an error should not retain not-own props", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should serialize the Error", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an object containing a top-level prop with an Error value should serialize the Error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should serialize the Error", + "fullTitle": "serializer SerializableEvent instance method serialize when passed an object containing a nested prop with an Error value should serialize the Error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a new object w/ null prototype", + "fullTitle": "serializer SerializableEvent static method deserialize should return a new object w/ null prototype", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw \"invalid arg type\" error", + "fullTitle": "serializer SerializableEvent static method deserialize when passed a falsy parameter should throw \"invalid arg type\" error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should ignore __proto__", + "fullTitle": "serializer SerializableEvent static method deserialize when passed value contains `data` prop should ignore __proto__", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should create an Error instance from the nested serialized Error prop", + "fullTitle": "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", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should create an Error instance from the prop", + "fullTitle": "serializer SerializableEvent static method deserialize when passed value contains an `error` prop should create an Error instance from the prop", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should create a new prop having a function value", + "fullTitle": "serializer SerializableEvent static method deserialize when passed value data contains a prop beginning with \"$$\" should create a new prop having a function value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should create a new prop returning the original value", + "fullTitle": "serializer SerializableEvent static method deserialize when passed value data contains a prop beginning with \"$$\" should create a new prop returning the original value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove the prop with the \"$$\" prefix", + "fullTitle": "serializer SerializableEvent static method deserialize when passed value data contains a prop beginning with \"$$\" should remove the prop with the \"$$\" prefix", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should deserialize each prop", + "fullTitle": "serializer SerializableEvent static method deserialize when the value data contains a prop with an array value should deserialize each prop", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 18, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should instantiate a SerializableEvent", + "fullTitle": "serializer SerializableEvent static method create should instantiate a SerializableEvent", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a new SerializableWorkerResult instance", + "fullTitle": "serializer SerializableWorkerResult static method create should return a new SerializableWorkerResult instance", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `true`", + "fullTitle": "serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an instance should return `true`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `true`", + "fullTitle": "serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an object with an appropriate `__type` prop should return `true`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return `false`", + "fullTitle": "serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an object without an appropriate `__type` prop should return `false`", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call SerializableEvent#deserialize on each item in its `events` prop", + "fullTitle": "serializer SerializableWorkerResult static method deserialize should call SerializableEvent#deserialize on each item in its `events` prop", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the deserialized value", + "fullTitle": "serializer SerializableWorkerResult static method deserialize should return the deserialized value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return a read-only value", + "fullTitle": "serializer SerializableWorkerResult instance method serialize should return a read-only value", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call `SerializableEvent#serialize` of each of its events", + "fullTitle": "serializer SerializableWorkerResult instance method serialize should call `SerializableEvent#serialize` of each of its events", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should add a readonly `__type` prop", + "fullTitle": "serializer SerializableWorkerResult constructor should add a readonly `__type` prop", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\serializer.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should work on Windows", + "fullTitle": "stackTraceFilter() on node on Windows should work on Windows", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\stack-trace-filter.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "does not strip out other bower_components", + "fullTitle": "stackTraceFilter() on browser does not strip out other bower_components", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\stack-trace-filter.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return the current working directory", + "fullTitle": "utils function cwd() should return the current working directory", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return \"function\" if the parameter is an async function", + "fullTitle": "utils function type() should return \"function\" if the parameter is an async function", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return \"error\" if the parameter is an Error", + "fullTitle": "utils function type() should return \"error\" if the parameter is an Error", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\utils.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return \"buffer\" if the parameter is a Buffer", + "fullTitle": "utils function canonicalType() should return \"buffer\" if the parameter is a Buffer", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should return \"asyncfunction\" if the parameter is an async function", + "fullTitle": "utils function canonicalType() should return \"asyncfunction\" if the parameter is an async function", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\utils.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should throw", + "fullTitle": "worker when run as main process should throw", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 69, + "currentRetry": 0, + "speed": "medium", + "err": {} + }, + { + "title": "should register itself with workerpool", + "fullTitle": "worker when run as worker process should register itself with workerpool", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "worker when run as worker process function run() when called without arguments should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "worker when run as worker process function run() when passed a non-string `options` value should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "worker when run as worker process function run() when passed an invalid string `options` value should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "worker when run as worker process function run() when called with empty \"filepath\" argument should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" argument is unloadable should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle \"--require\"", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable should handle \"--require\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 2, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should handle \"--ui\"", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable should handle \"--ui\"", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 3, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should call Mocha#run", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable should call Mocha#run", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove all uncaughtException listeners", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable should remove all uncaughtException listeners", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 4, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should remove all unhandledRejection listeners", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable should remove all unhandledRejection listeners", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 4, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should resolve with a SerializedWorkerResult", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable when serialization succeeds should resolve with a SerializedWorkerResult", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should reject", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable when serialization fails should reject", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "should initialize only once", + "fullTitle": "worker when run as worker process function run() when the file at \"filepath\" is loadable when run twice should initialize only once", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\mocha\\test\\node-unit\\worker.spec.js", + "duration": 1, + "currentRetry": 0, + "speed": "fast", + "err": {} + } + ] +} \ No newline at end of file diff --git a/__tests__/fixtures/mocha-json.json b/__tests__/fixtures/mocha-json.json new file mode 100644 index 00000000..3942efab --- /dev/null +++ b/__tests__/fixtures/mocha-json.json @@ -0,0 +1,158 @@ +{ + "stats": { + "suites": 3, + "tests": 6, + "passes": 1, + "pending": 1, + "failures": 4, + "start": "2021-02-24T20:26:09.297Z", + "end": "2021-02-24T20:26:09.309Z", + "duration": 12 + }, + "tests": [ + { + "title": "Timeout test", + "fullTitle": "Timeout test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\second.test.js", + "duration": 8, + "currentRetry": 0, + "err": { + "stack": "Error: Timeout of 1ms exceeded. For async tests and hooks, ensure \"done()\" is called; if returning a Promise, ensure it resolves. (C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\second.test.js)\n at listOnTimeout (internal/timers.js:554:17)\n at processTimers (internal/timers.js:497:7)", + "message": "Timeout of 1ms exceeded. For async tests and hooks, ensure \"done()\" is called; if returning a Promise, ensure it resolves. (C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\second.test.js)", + "code": "ERR_MOCHA_TIMEOUT", + "timeout": 1, + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\second.test.js" + } + }, + { + "title": "Skipped test", + "fullTitle": "Skipped test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\second.test.js", + "currentRetry": 0, + "err": {} + }, + { + "title": "Passing test", + "fullTitle": "Test 1 Passing test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\main.test.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + }, + { + "title": "Failing test", + "fullTitle": "Test 1 Test 1.1 Failing test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\main.test.js", + "duration": 1, + "currentRetry": 0, + "err": { + "stack": "AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:\n\nfalse !== true\n\n at Context. (test\\main.test.js:11:14)\n at processImmediate (internal/timers.js:461:21)", + "message": "Expected values to be strictly equal:\n\nfalse !== true\n", + "generatedMessage": true, + "name": "AssertionError", + "code": "ERR_ASSERTION", + "actual": "false", + "expected": "true", + "operator": "strictEqual" + } + }, + { + "title": "Exception in target unit", + "fullTitle": "Test 1 Test 1.1 Exception in target unit", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\main.test.js", + "duration": 0, + "currentRetry": 0, + "err": { + "stack": "Error: Some error\n at Object.throwError (lib\\main.js:2:9)\n at Context. (test\\main.test.js:15:11)\n at processImmediate (internal/timers.js:461:21)", + "message": "Some error" + } + }, + { + "title": "Exception in test", + "fullTitle": "Test 2 Exception in test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\main.test.js", + "duration": 0, + "currentRetry": 0, + "err": { + "stack": "Error: Some error\n at Context. (test\\main.test.js:22:11)\n at processImmediate (internal/timers.js:461:21)", + "message": "Some error" + } + } + ], + "pending": [ + { + "title": "Skipped test", + "fullTitle": "Skipped test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\second.test.js", + "currentRetry": 0, + "err": {} + } + ], + "failures": [ + { + "title": "Timeout test", + "fullTitle": "Timeout test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\second.test.js", + "duration": 8, + "currentRetry": 0, + "err": { + "stack": "Error: Timeout of 1ms exceeded. For async tests and hooks, ensure \"done()\" is called; if returning a Promise, ensure it resolves. (C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\second.test.js)\n at listOnTimeout (internal/timers.js:554:17)\n at processTimers (internal/timers.js:497:7)", + "message": "Timeout of 1ms exceeded. For async tests and hooks, ensure \"done()\" is called; if returning a Promise, ensure it resolves. (C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\second.test.js)", + "code": "ERR_MOCHA_TIMEOUT", + "timeout": 1, + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\second.test.js" + } + }, + { + "title": "Failing test", + "fullTitle": "Test 1 Test 1.1 Failing test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\main.test.js", + "duration": 1, + "currentRetry": 0, + "err": { + "stack": "AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:\n\nfalse !== true\n\n at Context. (test\\main.test.js:11:14)\n at processImmediate (internal/timers.js:461:21)", + "message": "Expected values to be strictly equal:\n\nfalse !== true\n", + "generatedMessage": true, + "name": "AssertionError", + "code": "ERR_ASSERTION", + "actual": "false", + "expected": "true", + "operator": "strictEqual" + } + }, + { + "title": "Exception in target unit", + "fullTitle": "Test 1 Test 1.1 Exception in target unit", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\main.test.js", + "duration": 0, + "currentRetry": 0, + "err": { + "stack": "Error: Some error\n at Object.throwError (lib\\main.js:2:9)\n at Context. (test\\main.test.js:15:11)\n at processImmediate (internal/timers.js:461:21)", + "message": "Some error" + } + }, + { + "title": "Exception in test", + "fullTitle": "Test 2 Exception in test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\main.test.js", + "duration": 0, + "currentRetry": 0, + "err": { + "stack": "Error: Some error\n at Context. (test\\main.test.js:22:11)\n at processImmediate (internal/timers.js:461:21)", + "message": "Some error" + } + } + ], + "passes": [ + { + "title": "Passing test", + "fullTitle": "Test 1 Passing test", + "file": "C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\mocha\\test\\main.test.js", + "duration": 0, + "currentRetry": 0, + "speed": "fast", + "err": {} + } + ] +} \ No newline at end of file diff --git a/__tests__/mocha-json.test.ts b/__tests__/mocha-json.test.ts new file mode 100644 index 00000000..05393faf --- /dev/null +++ b/__tests__/mocha-json.test.ts @@ -0,0 +1,67 @@ +import * as fs from 'fs' +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 {normalizeFilePath} from '../src/utils/path-utils' + +describe('mocha-json tests', () => { + it('produces empty test run result when there are no test cases', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'empty', '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) + expect(result.tests).toBe(0) + expect(result.result).toBe('success') + }) + + it('report from ./reports/mocha-json test results matches snapshot', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'mocha-json.json') + const outputPath = path.join(__dirname, '__outputs__', 'mocha-json.md') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: ['test/main.test.js', 'test/second.test.js', 'lib/main.js'] + } + + const parser = new MochaJsonParser(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 from mochajs/mocha test results matches snapshot', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'external', 'mocha', 'mocha-test-results.json') + const trackedFilesPath = path.join(__dirname, 'fixtures', 'external', 'mocha', 'files.txt') + const outputPath = path.join(__dirname, '__outputs__', 'mocha-test-results.md') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const trackedFiles = fs.readFileSync(trackedFilesPath, {encoding: 'utf8'}).split(/\n\r?/g) + const opts: ParseOptions = { + parseErrors: true, + trackedFiles + } + + const parser = new MochaJsonParser(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/action.yml b/action.yml index 930f01f9..402c451c 100644 --- a/action.yml +++ b/action.yml @@ -1,6 +1,6 @@ name: Test Reporter description: | - Displays test results directly in GitHub. Supports .NET (xUnit, NUnit, MSTest), Dart, Flutter and JavaScript (JEST). + Shows test results in GitHub UI: .NET (xUnit, NUnit, MSTest), Dart, Flutter, Java (JUnit), JavaScript (JEST, Mocha) author: Michal Dorner inputs: artifact: @@ -23,6 +23,7 @@ inputs: - flutter-json - java-junit - jest-junit + - mocha-json required: true list-suites: description: | diff --git a/assets/mocha-groups.png b/assets/mocha-groups.png new file mode 100644 index 00000000..657ec718 Binary files /dev/null and b/assets/mocha-groups.png differ diff --git a/assets/provider-error-details.png b/assets/provider-error-details.png index 1f3efabb..add37578 100644 Binary files a/assets/provider-error-details.png and b/assets/provider-error-details.png differ diff --git a/assets/provider-groups.png b/assets/provider-groups.png deleted file mode 100644 index f47267e8..00000000 Binary files a/assets/provider-groups.png and /dev/null differ diff --git a/dist/index.js b/dist/index.js index e564ff4e..11be2b2a 100644 --- a/dist/index.js +++ b/dist/index.js @@ -221,6 +221,7 @@ 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 path_utils_1 = __nccwpck_require__(4070); const github_utils_1 = __nccwpck_require__(3522); const markdown_utils_1 = __nccwpck_require__(6482); @@ -324,18 +325,29 @@ class TestReporter { const tr = await parser.parse(file, content); results.push(tr); } + core.info(`Creating check run ${name}`); + const createResp = await this.octokit.checks.create({ + head_sha: this.context.sha, + name, + status: 'in_progress', + output: { + title: name, + summary: '' + }, + ...github.context.repo + }); core.info('Creating report summary'); const { listSuites, listTests } = this; - const summary = get_report_1.getReport(results, { listSuites, listTests }); + const baseUrl = createResp.data.html_url; + const summary = get_report_1.getReport(results, { listSuites, listTests, baseUrl }); core.info('Creating annotations'); const annotations = get_annotations_1.getAnnotations(results, this.maxAnnotations); const isFailed = results.some(tr => tr.result === 'failed'); const conclusion = isFailed ? 'failure' : 'success'; const icon = isFailed ? markdown_utils_1.Icon.fail : markdown_utils_1.Icon.success; - core.info(`Creating check run with conclusion ${conclusion}`); - const resp = await this.octokit.checks.create({ - head_sha: this.context.sha, - name, + core.info(`Updating check run conclusion (${conclusion}) and output`); + const resp = await this.octokit.checks.update({ + check_run_id: createResp.data.id, conclusion, status: 'completed', output: { @@ -362,6 +374,8 @@ class TestReporter { return new java_junit_parser_1.JavaJunitParser(options); case 'jest-junit': return new jest_junit_parser_1.JestJunitParser(options); + case 'mocha-json': + return new mocha_json_parser_1.MochaJsonParser(options); default: throw new Error(`Input variable 'reporter' is set to invalid value '${reporter}'`); } @@ -512,14 +526,14 @@ class DartJsonParser { return undefined; } const { trackedFiles } = this.options; - const message = (_b = (_a = test.error) === null || _a === void 0 ? void 0 : _a.error) !== null && _b !== void 0 ? _b : ''; - const stackTrace = (_d = (_c = test.error) === null || _c === void 0 ? void 0 : _c.stackTrace) !== null && _d !== void 0 ? _d : ''; + const stackTrace = (_b = (_a = test.error) === null || _a === void 0 ? void 0 : _a.stackTrace) !== null && _b !== void 0 ? _b : ''; 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); let path; let line; if (src !== undefined) { @@ -540,6 +554,19 @@ class DartJsonParser { details }; } + getErrorMessage(message, print) { + if (this.sdk === 'flutter') { + const uselessMessageRe = /^Test failed\. See exception logs above\.\nThe test description was:/m; + const flutterPrintRe = /^══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞═+\s+(.*)\s+When the exception was thrown, this was the stack:/ms; + if (uselessMessageRe.test(message)) { + const match = print.match(flutterPrintRe); + if (match !== null) { + return match[1]; + } + } + } + return message || print; + } exceptionThrowSource(ex, trackedFiles) { const lines = ex.split(/\r?\n/g); // regexp to extract file path and line number from stack trace @@ -663,6 +690,7 @@ class DotnetTrxParser { const trx = await this.getTrxReport(path, content); const tc = this.getTestClasses(trx); const tr = this.getTestRunResult(path, trx, tc); + tr.sort(true); return tr; } async getTrxReport(path, content) { @@ -703,10 +731,6 @@ class DotnetTrxParser { tc.tests.push(test); } const result = Object.values(testClasses); - result.sort((a, b) => a.name.localeCompare(b.name)); - for (const tc of result) { - tc.tests.sort((a, b) => a.name.localeCompare(b.name)); - } return result; } getTestRunResult(path, trx, testClasses) { @@ -980,6 +1004,7 @@ exports.JavaJunitParser = JavaJunitParser; 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); class JestJunitParser { @@ -1045,7 +1070,7 @@ class JestJunitParser { const details = tc.failure[0]; let path; let line; - const src = this.exceptionThrowSource(details); + const src = node_utils_1.getExceptionSource(details, this.options.trackedFiles, file => this.getRelativePath(file)); if (src) { path = src.path; line = src.line; @@ -1056,29 +1081,13 @@ class JestJunitParser { details }; } - exceptionThrowSource(stackTrace) { - const lines = stackTrace.split(/\r?\n/); - const re = /\((.*):(\d+):\d+\)$/; - const { trackedFiles } = this.options; - for (const str of lines) { - const match = str.match(re); - if (match !== null) { - const [_, fileStr, lineStr] = match; - const filePath = path_utils_1.normalizeFilePath(fileStr); - if (filePath.startsWith('internal/') || filePath.includes('/node_modules/')) { - continue; - } - const workDir = this.getWorkDir(filePath); - if (!workDir) { - continue; - } - const path = filePath.substr(workDir.length); - if (trackedFiles.includes(path)) { - const line = parseInt(lineStr); - return { path, line }; - } - } + getRelativePath(path) { + path = 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) { var _a, _b; @@ -1088,6 +1097,108 @@ class JestJunitParser { exports.JestJunitParser = JestJunitParser; +/***/ }), + +/***/ 6043: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +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); +class MochaJsonParser { + constructor(options) { + this.options = options; + } + 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 { + return JSON.parse(content); + } + catch (e) { + throw new Error(`Invalid JSON at ${path}\n\n${e}`); + } + } + 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, [])); + }; + for (const test of mocha.passes) { + const suite = getSuite(test); + this.processTest(suite, test, 'success'); + } + for (const test of mocha.failures) { + const suite = getSuite(test); + this.processTest(suite, test, 'failed'); + } + for (const test of mocha.pending) { + const suite = getSuite(test); + this.processTest(suite, test, 'skipped'); + } + const suites = Object.values(suitesMap); + 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; + let group = suite.groups.find(grp => grp.name === groupName); + if (group === undefined) { + group = new test_results_1.TestGroupResult(groupName, []); + 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); + group.tests.push(testCase); + } + getTestCaseError(test) { + const details = test.err.stack; + const message = test.err.message; + if (details === undefined) { + return undefined; + } + let path; + let line; + const src = node_utils_1.getExceptionSource(details, this.options.trackedFiles, file => this.getRelativePath(file)); + if (src) { + path = src.path; + line = src.line; + } + return { + path, + line, + message, + details + }; + } + getRelativePath(path) { + path = 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) { + var _a, _b; + return ((_b = (_a = this.options.workDir) !== null && _a !== void 0 ? _a : this.assumedWorkDir) !== null && _b !== void 0 ? _b : (this.assumedWorkDir = path_utils_1.getBasePath(path, this.options.trackedFiles))); + } +} +exports.MochaJsonParser = MochaJsonParser; + + /***/ }), /***/ 5867: @@ -1098,6 +1209,7 @@ exports.JestJunitParser = JestJunitParser; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getAnnotations = void 0; const markdown_utils_1 = __nccwpck_require__(6482); +const parse_utils_1 = __nccwpck_require__(7811); function getAnnotations(results, maxCount) { var _a, _b, _c, _d; if (maxCount === 0) { @@ -1127,9 +1239,9 @@ function getAnnotations(results, maxCount) { errors.push({ testRunPaths: [tr.path], suiteName: ts.name, - testName: tc.name, + testName: tg.name ? `${tg.name} ► ${tc.name}` : tc.name, details: err.details, - message: (_d = (_c = err.message) !== null && _c !== void 0 ? _c : getFirstNonEmptyLine(err.details)) !== null && _d !== void 0 ? _d : 'Test failed', + message: (_d = (_c = err.message) !== null && _c !== void 0 ? _c : parse_utils_1.getFirstNonEmptyLine(err.details)) !== null && _d !== void 0 ? _d : 'Test failed', path, line }); @@ -1167,10 +1279,6 @@ function enforceCheckRunLimits(err) { } return err; } -function getFirstNonEmptyLine(stackTrace) { - const lines = stackTrace.split(/\r?\n/g); - return lines.find(str => !/^\s*$/.test(str)); -} function ident(text, prefix) { return text .split(/\n/g) @@ -1209,50 +1317,62 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getReport = void 0; const core = __importStar(__nccwpck_require__(2186)); const markdown_utils_1 = __nccwpck_require__(6482); +const parse_utils_1 = __nccwpck_require__(7811); const slugger_1 = __nccwpck_require__(3328); +const MAX_REPORT_LENGTH = 65535; const defaultOptions = { listSuites: 'all', - listTests: 'all' + listTests: 'all', + baseUrl: '' }; function getReport(results, options = defaultOptions) { core.info('Generating check run summary'); - const maxReportLength = 65535; applySort(results); const opts = { ...options }; - let report = renderReport(results, opts); - if (getByteLength(report) <= maxReportLength) { + let lines = renderReport(results, opts); + let report = lines.join('\n'); + if (getByteLength(report) <= MAX_REPORT_LENGTH) { return report; } if (opts.listTests === 'all') { core.info("Test report summary is too big - setting 'listTests' to 'failed'"); opts.listTests = 'failed'; - report = renderReport(results, opts); - if (getByteLength(report) <= maxReportLength) { + lines = renderReport(results, opts); + report = lines.join('\n'); + if (getByteLength(report) <= MAX_REPORT_LENGTH) { return report; } } - if (opts.listSuites === 'all') { - core.info("Test report summary is too big - setting 'listSuites' to 'failed'"); - opts.listSuites = 'failed'; - report = renderReport(results, opts); - if (getByteLength(report) <= maxReportLength) { - return report; + core.warning(`Test report summary exceeded limit of ${MAX_REPORT_LENGTH} bytes and will be trimmed`); + return trimReport(lines); +} +exports.getReport = getReport; +function trimReport(lines) { + const closingBlock = '```'; + const errorMsg = `**Report exceeded GitHub limit of ${MAX_REPORT_LENGTH} bytes and has been trimmed**`; + const maxErrorMsgLength = closingBlock.length + errorMsg.length + 2; + const maxReportLength = MAX_REPORT_LENGTH - maxErrorMsgLength; + let reportLength = 0; + let codeBlock = false; + let endLineIndex = 0; + for (endLineIndex = 0; endLineIndex < lines.length; endLineIndex++) { + const line = lines[endLineIndex]; + const lineLength = getByteLength(line); + reportLength += lineLength + 1; + if (reportLength > maxReportLength) { + break; } - } - if (opts.listTests !== 'none') { - core.info("Test report summary is too big - setting 'listTests' to 'none'"); - opts.listTests = 'none'; - report = renderReport(results, opts); - if (getByteLength(report) <= maxReportLength) { - return report; + if (line === '```') { + codeBlock = !codeBlock; } } - core.warning(`Test report summary exceeded limit of ${maxReportLength} bytes`); - const badge = getReportBadge(results); - const msg = `**Test report summary exceeded limit of ${maxReportLength} bytes and was removed**`; - return `${badge}\n${msg}`; + const reportLines = lines.slice(0, endLineIndex); + if (codeBlock) { + reportLines.push('```'); + } + reportLines.push(errorMsg); + return reportLines.join('\n'); } -exports.getReport = getReport; function applySort(results) { results.sort((a, b) => a.path.localeCompare(b.path)); for (const res of results) { @@ -1268,7 +1388,7 @@ function renderReport(results, options) { sections.push(badge); const runs = getTestRunsReport(results, options); sections.push(...runs); - return sections.join('\n'); + return sections; } function getReportBadge(results) { const passed = results.reduce((sum, tr) => sum + tr.passed, 0); @@ -1305,7 +1425,7 @@ function getTestRunsReport(testRuns, options) { const tableData = testRuns.map((tr, runIndex) => { const time = markdown_utils_1.formatTime(tr.time); const name = tr.path; - const addr = makeRunSlug(runIndex).link; + const addr = options.baseUrl + makeRunSlug(runIndex).link; const nameLink = 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}` : ''; @@ -1322,9 +1442,9 @@ function getTestRunsReport(testRuns, options) { function getSuitesReport(tr, runIndex, options) { const sections = []; const trSlug = makeRunSlug(runIndex); - const nameLink = `${tr.path}`; + const nameLink = `${tr.path}`; const icon = getResultIcon(tr.result); - sections.push(`## ${nameLink} ${icon}`); + sections.push(`## ${icon}\xa0${nameLink}`); const time = 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.` @@ -1336,7 +1456,7 @@ function getSuitesReport(tr, runIndex, options) { const tsTime = markdown_utils_1.formatTime(s.time); const tsName = s.name; const skipLink = options.listTests === 'none' || (options.listTests === 'failed' && s.result !== 'failed'); - const tsAddr = makeSuiteSlug(runIndex, suiteIndex).link; + const tsAddr = options.baseUrl + makeSuiteSlug(runIndex, suiteIndex).link; const tsNameLink = skipLink ? tsName : 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}` : ''; @@ -1354,33 +1474,38 @@ function getSuitesReport(tr, runIndex, options) { return sections; } function getTestsReport(ts, runIndex, suiteIndex, options) { - const groups = options.listTests === 'failed' ? ts.failedGroups : ts.groups; + var _a, _b, _c; + if (options.listTests === 'failed' && ts.result !== 'failed') { + return []; + } + const groups = ts.groups; if (groups.length === 0) { return []; } const sections = []; const tsName = ts.name; const tsSlug = makeSuiteSlug(runIndex, suiteIndex); - const tsNameLink = `${tsName}`; + const tsNameLink = `${tsName}`; const icon = getResultIcon(ts.result); - sections.push(`### ${tsNameLink} ${icon}`); - const tsTime = markdown_utils_1.formatTime(ts.time); - const headingLine2 = `**${ts.tests}** tests were completed in **${tsTime}** with **${ts.passed}** passed, **${ts.failed}** failed and **${ts.skipped}** skipped.`; - sections.push(headingLine2); + sections.push(`### ${icon}\xa0${tsNameLink}`); + sections.push('```'); for (const grp of groups) { - const tests = options.listTests === 'failed' ? grp.failedTests : grp.tests; - if (tests.length === 0) { - continue; + if (grp.name) { + sections.push(grp.name); } - const grpHeader = grp.name ? `\n**${grp.name}**` : ''; - const testsTable = markdown_utils_1.table(['Result', 'Test', 'Time'], [markdown_utils_1.Align.Center, markdown_utils_1.Align.Left, markdown_utils_1.Align.Right], ...grp.tests.map(tc => { - const name = tc.name; - const time = markdown_utils_1.formatTime(tc.time); + const space = grp.name ? ' ' : ''; + for (const tc of grp.tests) { const result = getResultIcon(tc.result); - return [result, name, time]; - })); - sections.push(grpHeader, testsTable); + sections.push(`${space}${result} ${tc.name}`); + if (tc.error) { + const lines = (_c = ((_a = tc.error.message) !== null && _a !== void 0 ? _a : (_b = 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); + if (lines) { + sections.push(...lines); + } + } + } } + sections.push('```'); return sections; } function makeRunSlug(runIndex) { @@ -1442,6 +1567,14 @@ class TestRunResult { get failedSuites() { return this.suites.filter(s => s.result === 'failed'); } + sort(deep) { + this.suites.sort((a, b) => a.name.localeCompare(b.name)); + if (deep) { + for (const suite of this.suites) { + suite.sort(deep); + } + } + } } exports.TestRunResult = TestRunResult; class TestSuiteResult { @@ -1472,6 +1605,14 @@ class TestSuiteResult { get failedGroups() { 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 : ''); }); + if (deep) { + for (const grp of this.groups) { + grp.sort(); + } + } + } } exports.TestSuiteResult = TestSuiteResult; class TestGroupResult { @@ -1497,6 +1638,9 @@ class TestGroupResult { get failedTests() { return this.tests.filter(tc => tc.result === 'failed'); } + sort() { + this.tests.sort((a, b) => a.name.localeCompare(b.name)); + } } exports.TestGroupResult = TestGroupResult; class TestCaseResult { @@ -1786,13 +1930,48 @@ function ellipsis(text, maxLength) { exports.ellipsis = ellipsis; function formatTime(ms) { if (ms > 1000) { - return `${(ms / 1000).toFixed(3)}s`; + return `${Math.round(ms / 1000)}s`; } return `${Math.round(ms)}ms`; } exports.formatTime = formatTime; +/***/ }), + +/***/ 5824: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getExceptionSource = void 0; +const path_utils_1 = __nccwpck_require__(4070); +function getExceptionSource(stackTrace, trackedFiles, getRelativePath) { + const lines = stackTrace.split(/\r?\n/); + const re = /\((.*):(\d+):\d+\)$/; + for (const str of lines) { + const match = str.match(re); + if (match !== null) { + const [_, fileStr, lineStr] = match; + const filePath = path_utils_1.normalizeFilePath(fileStr); + if (filePath.startsWith('internal/') || filePath.includes('/node_modules/')) { + continue; + } + const path = getRelativePath(filePath); + if (!path) { + continue; + } + if (trackedFiles.includes(path)) { + const line = parseInt(lineStr); + return { path, line }; + } + } + } +} +exports.getExceptionSource = getExceptionSource; + + /***/ }), /***/ 7811: @@ -1801,7 +1980,7 @@ exports.formatTime = formatTime; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.parseIsoDate = exports.parseNetDuration = void 0; +exports.getFirstNonEmptyLine = exports.parseIsoDate = exports.parseNetDuration = void 0; function parseNetDuration(str) { const durationRe = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)$/; const durationMatch = str.match(durationRe); @@ -1820,6 +1999,11 @@ function parseIsoDate(str) { return new Date(str); } exports.parseIsoDate = parseIsoDate; +function getFirstNonEmptyLine(stackTrace) { + const lines = stackTrace.split(/\r?\n/g); + return lines.find(str => !/^\s*$/.test(str)); +} +exports.getFirstNonEmptyLine = getFirstNonEmptyLine; /***/ }), diff --git a/dist/index.js.map b/dist/index.js.map index 758bded6..37f2a010 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../webpack://test-check/./lib/input-providers/artifact-provider.js","../webpack://test-check/./lib/input-providers/local-file-provider.js","../webpack://test-check/./lib/main.js","../webpack://test-check/./lib/parsers/dart-json/dart-json-parser.js","../webpack://test-check/./lib/parsers/dart-json/dart-json-types.js","../webpack://test-check/./lib/parsers/dotnet-trx/dotnet-trx-parser.js","../webpack://test-check/./lib/parsers/java-junit/java-junit-parser.js","../webpack://test-check/./lib/parsers/jest-junit/jest-junit-parser.js","../webpack://test-check/./lib/report/get-annotations.js","../webpack://test-check/./lib/report/get-report.js","../webpack://test-check/./lib/test-results.js","../webpack://test-check/./lib/utils/exec.js","../webpack://test-check/./lib/utils/git.js","../webpack://test-check/./lib/utils/github-utils.js","../webpack://test-check/./lib/utils/markdown-utils.js","../webpack://test-check/./lib/utils/parse-utils.js","../webpack://test-check/./lib/utils/path-utils.js","../webpack://test-check/./lib/utils/slugger.js","../webpack://test-check/./node_modules/@actions/core/lib/command.js","../webpack://test-check/./node_modules/@actions/core/lib/core.js","../webpack://test-check/./node_modules/@actions/core/lib/file-command.js","../webpack://test-check/./node_modules/@actions/core/lib/utils.js","../webpack://test-check/./node_modules/@actions/exec/lib/exec.js","../webpack://test-check/./node_modules/@actions/exec/lib/toolrunner.js","../webpack://test-check/./node_modules/@actions/github/lib/context.js","../webpack://test-check/./node_modules/@actions/github/lib/github.js","../webpack://test-check/./node_modules/@actions/github/lib/internal/utils.js","../webpack://test-check/./node_modules/@actions/github/lib/utils.js","../webpack://test-check/./node_modules/@actions/http-client/index.js","../webpack://test-check/./node_modules/@actions/http-client/proxy.js","../webpack://test-check/./node_modules/@actions/io/lib/io-util.js","../webpack://test-check/./node_modules/@actions/io/lib/io.js","../webpack://test-check/./node_modules/@nodelib/fs.scandir/out/adapters/fs.js","../webpack://test-check/./node_modules/@nodelib/fs.scandir/out/constants.js","../webpack://test-check/./node_modules/@nodelib/fs.scandir/out/index.js","../webpack://test-check/./node_modules/@nodelib/fs.scandir/out/providers/async.js","../webpack://test-check/./node_modules/@nodelib/fs.scandir/out/providers/common.js","../webpack://test-check/./node_modules/@nodelib/fs.scandir/out/providers/sync.js","../webpack://test-check/./node_modules/@nodelib/fs.scandir/out/settings.js","../webpack://test-check/./node_modules/@nodelib/fs.scandir/out/utils/fs.js","../webpack://test-check/./node_modules/@nodelib/fs.scandir/out/utils/index.js","../webpack://test-check/./node_modules/@nodelib/fs.stat/out/adapters/fs.js","../webpack://test-check/./node_modules/@nodelib/fs.stat/out/index.js","../webpack://test-check/./node_modules/@nodelib/fs.stat/out/providers/async.js","../webpack://test-check/./node_modules/@nodelib/fs.stat/out/providers/sync.js","../webpack://test-check/./node_modules/@nodelib/fs.stat/out/settings.js","../webpack://test-check/./node_modules/@nodelib/fs.walk/out/index.js","../webpack://test-check/./node_modules/@nodelib/fs.walk/out/providers/async.js","../webpack://test-check/./node_modules/@nodelib/fs.walk/out/providers/stream.js","../webpack://test-check/./node_modules/@nodelib/fs.walk/out/providers/sync.js","../webpack://test-check/./node_modules/@nodelib/fs.walk/out/readers/async.js","../webpack://test-check/./node_modules/@nodelib/fs.walk/out/readers/common.js","../webpack://test-check/./node_modules/@nodelib/fs.walk/out/readers/reader.js","../webpack://test-check/./node_modules/@nodelib/fs.walk/out/readers/sync.js","../webpack://test-check/./node_modules/@nodelib/fs.walk/out/settings.js","../webpack://test-check/./node_modules/@octokit/auth-token/dist-node/index.js","../webpack://test-check/./node_modules/@octokit/core/dist-node/index.js","../webpack://test-check/./node_modules/@octokit/endpoint/dist-node/index.js","../webpack://test-check/./node_modules/@octokit/endpoint/node_modules/is-plain-object/dist/is-plain-object.js","../webpack://test-check/./node_modules/@octokit/graphql/dist-node/index.js","../webpack://test-check/./node_modules/@octokit/plugin-paginate-rest/dist-node/index.js","../webpack://test-check/./node_modules/@octokit/plugin-rest-endpoint-methods/dist-node/index.js","../webpack://test-check/./node_modules/@octokit/request-error/dist-node/index.js","../webpack://test-check/./node_modules/@octokit/request/dist-node/index.js","../webpack://test-check/./node_modules/@octokit/request/node_modules/is-plain-object/dist/is-plain-object.js","../webpack://test-check/./node_modules/@sindresorhus/is/dist/index.js","../webpack://test-check/./node_modules/@szmarczak/http-timer/dist/source/index.js","../webpack://test-check/./node_modules/adm-zip/adm-zip.js","../webpack://test-check/./node_modules/adm-zip/headers/entryHeader.js","../webpack://test-check/./node_modules/adm-zip/headers/index.js","../webpack://test-check/./node_modules/adm-zip/headers/mainHeader.js","../webpack://test-check/./node_modules/adm-zip/methods/deflater.js","../webpack://test-check/./node_modules/adm-zip/methods/index.js","../webpack://test-check/./node_modules/adm-zip/methods/inflater.js","../webpack://test-check/./node_modules/adm-zip/methods/zipcrypto.js","../webpack://test-check/./node_modules/adm-zip/util/constants.js","../webpack://test-check/./node_modules/adm-zip/util/errors.js","../webpack://test-check/./node_modules/adm-zip/util/fattr.js","../webpack://test-check/./node_modules/adm-zip/util/fileSystem.js","../webpack://test-check/./node_modules/adm-zip/util/index.js","../webpack://test-check/./node_modules/adm-zip/util/utils.js","../webpack://test-check/./node_modules/adm-zip/zipEntry.js","../webpack://test-check/./node_modules/adm-zip/zipFile.js","../webpack://test-check/./node_modules/before-after-hook/index.js","../webpack://test-check/./node_modules/before-after-hook/lib/add.js","../webpack://test-check/./node_modules/before-after-hook/lib/register.js","../webpack://test-check/./node_modules/before-after-hook/lib/remove.js","../webpack://test-check/./node_modules/cacheable-lookup/source/index.js","../webpack://test-check/./node_modules/cacheable-request/node_modules/get-stream/buffer-stream.js","../webpack://test-check/./node_modules/cacheable-request/node_modules/get-stream/index.js","../webpack://test-check/./node_modules/cacheable-request/src/index.js","../webpack://test-check/./node_modules/clone-response/src/index.js","../webpack://test-check/./node_modules/decompress-response/index.js","../webpack://test-check/./node_modules/decompress-response/node_modules/mimic-response/index.js","../webpack://test-check/./node_modules/defer-to-connect/dist/source/index.js","../webpack://test-check/./node_modules/deprecation/dist-node/index.js","../webpack://test-check/./node_modules/end-of-stream/index.js","../webpack://test-check/./node_modules/fast-glob/node_modules/braces/index.js","../webpack://test-check/./node_modules/fast-glob/node_modules/braces/lib/compile.js","../webpack://test-check/./node_modules/fast-glob/node_modules/braces/lib/constants.js","../webpack://test-check/./node_modules/fast-glob/node_modules/braces/lib/expand.js","../webpack://test-check/./node_modules/fast-glob/node_modules/braces/lib/parse.js","../webpack://test-check/./node_modules/fast-glob/node_modules/braces/lib/stringify.js","../webpack://test-check/./node_modules/fast-glob/node_modules/braces/lib/utils.js","../webpack://test-check/./node_modules/fast-glob/node_modules/fill-range/index.js","../webpack://test-check/./node_modules/fast-glob/node_modules/is-number/index.js","../webpack://test-check/./node_modules/fast-glob/node_modules/micromatch/index.js","../webpack://test-check/./node_modules/fast-glob/node_modules/to-regex-range/index.js","../webpack://test-check/./node_modules/fast-glob/out/index.js","../webpack://test-check/./node_modules/fast-glob/out/managers/tasks.js","../webpack://test-check/./node_modules/fast-glob/out/providers/async.js","../webpack://test-check/./node_modules/fast-glob/out/providers/filters/deep.js","../webpack://test-check/./node_modules/fast-glob/out/providers/filters/entry.js","../webpack://test-check/./node_modules/fast-glob/out/providers/filters/error.js","../webpack://test-check/./node_modules/fast-glob/out/providers/matchers/matcher.js","../webpack://test-check/./node_modules/fast-glob/out/providers/matchers/partial.js","../webpack://test-check/./node_modules/fast-glob/out/providers/provider.js","../webpack://test-check/./node_modules/fast-glob/out/providers/stream.js","../webpack://test-check/./node_modules/fast-glob/out/providers/sync.js","../webpack://test-check/./node_modules/fast-glob/out/providers/transformers/entry.js","../webpack://test-check/./node_modules/fast-glob/out/readers/reader.js","../webpack://test-check/./node_modules/fast-glob/out/readers/stream.js","../webpack://test-check/./node_modules/fast-glob/out/readers/sync.js","../webpack://test-check/./node_modules/fast-glob/out/settings.js","../webpack://test-check/./node_modules/fast-glob/out/utils/array.js","../webpack://test-check/./node_modules/fast-glob/out/utils/errno.js","../webpack://test-check/./node_modules/fast-glob/out/utils/fs.js","../webpack://test-check/./node_modules/fast-glob/out/utils/index.js","../webpack://test-check/./node_modules/fast-glob/out/utils/path.js","../webpack://test-check/./node_modules/fast-glob/out/utils/pattern.js","../webpack://test-check/./node_modules/fast-glob/out/utils/stream.js","../webpack://test-check/./node_modules/fast-glob/out/utils/string.js","../webpack://test-check/./node_modules/fastq/queue.js","../webpack://test-check/./node_modules/glob-parent/index.js","../webpack://test-check/./node_modules/got/dist/source/as-promise/create-rejection.js","../webpack://test-check/./node_modules/got/dist/source/as-promise/index.js","../webpack://test-check/./node_modules/got/dist/source/as-promise/normalize-arguments.js","../webpack://test-check/./node_modules/got/dist/source/as-promise/parse-body.js","../webpack://test-check/./node_modules/got/dist/source/as-promise/types.js","../webpack://test-check/./node_modules/got/dist/source/core/calculate-retry-delay.js","../webpack://test-check/./node_modules/got/dist/source/core/index.js","../webpack://test-check/./node_modules/got/dist/source/core/utils/dns-ip-version.js","../webpack://test-check/./node_modules/got/dist/source/core/utils/get-body-size.js","../webpack://test-check/./node_modules/got/dist/source/core/utils/get-buffer.js","../webpack://test-check/./node_modules/got/dist/source/core/utils/is-form-data.js","../webpack://test-check/./node_modules/got/dist/source/core/utils/is-response-ok.js","../webpack://test-check/./node_modules/got/dist/source/core/utils/options-to-url.js","../webpack://test-check/./node_modules/got/dist/source/core/utils/proxy-events.js","../webpack://test-check/./node_modules/got/dist/source/core/utils/timed-out.js","../webpack://test-check/./node_modules/got/dist/source/core/utils/unhandle.js","../webpack://test-check/./node_modules/got/dist/source/core/utils/url-to-options.js","../webpack://test-check/./node_modules/got/dist/source/core/utils/weakable-map.js","../webpack://test-check/./node_modules/got/dist/source/create.js","../webpack://test-check/./node_modules/got/dist/source/index.js","../webpack://test-check/./node_modules/got/dist/source/types.js","../webpack://test-check/./node_modules/got/dist/source/utils/deep-freeze.js","../webpack://test-check/./node_modules/got/dist/source/utils/deprecation-warning.js","../webpack://test-check/./node_modules/http-cache-semantics/index.js","../webpack://test-check/./node_modules/http2-wrapper/source/agent.js","../webpack://test-check/./node_modules/http2-wrapper/source/auto.js","../webpack://test-check/./node_modules/http2-wrapper/source/client-request.js","../webpack://test-check/./node_modules/http2-wrapper/source/incoming-message.js","../webpack://test-check/./node_modules/http2-wrapper/source/index.js","../webpack://test-check/./node_modules/http2-wrapper/source/utils/calculate-server-name.js","../webpack://test-check/./node_modules/http2-wrapper/source/utils/errors.js","../webpack://test-check/./node_modules/http2-wrapper/source/utils/is-request-pseudo-header.js","../webpack://test-check/./node_modules/http2-wrapper/source/utils/proxy-events.js","../webpack://test-check/./node_modules/http2-wrapper/source/utils/url-to-options.js","../webpack://test-check/./node_modules/is-extglob/index.js","../webpack://test-check/./node_modules/is-glob/index.js","../webpack://test-check/./node_modules/json-buffer/index.js","../webpack://test-check/./node_modules/keyv/src/index.js","../webpack://test-check/./node_modules/lowercase-keys/index.js","../webpack://test-check/./node_modules/merge2/index.js","../webpack://test-check/./node_modules/mimic-response/index.js","../webpack://test-check/./node_modules/node-fetch/lib/index.js","../webpack://test-check/./node_modules/normalize-url/index.js","../webpack://test-check/./node_modules/once/once.js","../webpack://test-check/./node_modules/p-cancelable/index.js","../webpack://test-check/./node_modules/picomatch/index.js","../webpack://test-check/./node_modules/picomatch/lib/constants.js","../webpack://test-check/./node_modules/picomatch/lib/parse.js","../webpack://test-check/./node_modules/picomatch/lib/picomatch.js","../webpack://test-check/./node_modules/picomatch/lib/scan.js","../webpack://test-check/./node_modules/picomatch/lib/utils.js","../webpack://test-check/./node_modules/pump/index.js","../webpack://test-check/./node_modules/quick-lru/index.js","../webpack://test-check/./node_modules/resolve-alpn/index.js","../webpack://test-check/./node_modules/responselike/src/index.js","../webpack://test-check/./node_modules/reusify/reusify.js","../webpack://test-check/./node_modules/run-parallel/index.js","../webpack://test-check/./node_modules/sax/lib/sax.js","../webpack://test-check/./node_modules/tunnel/index.js","../webpack://test-check/./node_modules/tunnel/lib/tunnel.js","../webpack://test-check/./node_modules/universal-user-agent/dist-node/index.js","../webpack://test-check/./node_modules/wrappy/wrappy.js","../webpack://test-check/./node_modules/xml2js/lib/bom.js","../webpack://test-check/./node_modules/xml2js/lib/builder.js","../webpack://test-check/./node_modules/xml2js/lib/defaults.js","../webpack://test-check/./node_modules/xml2js/lib/parser.js","../webpack://test-check/./node_modules/xml2js/lib/processors.js","../webpack://test-check/./node_modules/xml2js/lib/xml2js.js","../webpack://test-check/./node_modules/xmlbuilder/lib/DocumentPosition.js","../webpack://test-check/./node_modules/xmlbuilder/lib/NodeType.js","../webpack://test-check/./node_modules/xmlbuilder/lib/Utility.js","../webpack://test-check/./node_modules/xmlbuilder/lib/WriterState.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLAttribute.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLCData.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLCharacterData.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLComment.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDOMConfiguration.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDOMErrorHandler.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDOMImplementation.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDOMStringList.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDTDAttList.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDTDElement.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDTDEntity.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDTDNotation.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDeclaration.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDocType.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDocument.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDocumentCB.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLDummy.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLElement.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLNamedNodeMap.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLNode.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLNodeList.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLProcessingInstruction.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLRaw.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLStreamWriter.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLStringWriter.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLStringifier.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLText.js","../webpack://test-check/./node_modules/xmlbuilder/lib/XMLWriterBase.js","../webpack://test-check/./node_modules/xmlbuilder/lib/index.js","../webpack://test-check/./node_modules/@vercel/ncc/dist/ncc/@@notfound.js","../webpack://test-check/external \"assert\"","../webpack://test-check/external \"buffer\"","../webpack://test-check/external \"child_process\"","../webpack://test-check/external \"dns\"","../webpack://test-check/external \"events\"","../webpack://test-check/external \"fs\"","../webpack://test-check/external \"http\"","../webpack://test-check/external \"http2\"","../webpack://test-check/external \"https\"","../webpack://test-check/external \"net\"","../webpack://test-check/external \"os\"","../webpack://test-check/external \"path\"","../webpack://test-check/external \"stream\"","../webpack://test-check/external \"string_decoder\"","../webpack://test-check/external \"timers\"","../webpack://test-check/external \"tls\"","../webpack://test-check/external \"url\"","../webpack://test-check/external \"util\"","../webpack://test-check/external \"zlib\"","../webpack://test-check/webpack/bootstrap","../webpack://test-check/webpack/runtime/compat","../webpack://test-check/webpack/startup"],"sourcesContent":["\"use strict\";\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}));\r\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n});\r\nvar __importStar = (this && this.__importStar) || function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n};\r\nvar __importDefault = (this && this.__importDefault) || function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.ArtifactProvider = void 0;\r\nconst core = __importStar(require(\"@actions/core\"));\r\nconst github = __importStar(require(\"@actions/github\"));\r\nconst adm_zip_1 = __importDefault(require(\"adm-zip\"));\r\nconst picomatch_1 = __importDefault(require(\"picomatch\"));\r\nconst github_utils_1 = require(\"../utils/github-utils\");\r\nclass ArtifactProvider {\r\n constructor(octokit, artifact, name, pattern, sha, runId, token) {\r\n this.octokit = octokit;\r\n this.artifact = artifact;\r\n this.name = name;\r\n this.pattern = pattern;\r\n this.sha = sha;\r\n this.runId = runId;\r\n this.token = token;\r\n if (this.artifact.startsWith('/')) {\r\n const endIndex = this.artifact.lastIndexOf('/');\r\n const rePattern = this.artifact.substring(1, endIndex);\r\n const reOpts = this.artifact.substring(endIndex + 1);\r\n const re = new RegExp(rePattern, reOpts);\r\n this.artifactNameMatch = (str) => re.test(str);\r\n this.getReportName = (str) => {\r\n const match = str.match(re);\r\n if (match === null) {\r\n throw new Error(`Artifact name '${str}' does not match regex ${this.artifact}`);\r\n }\r\n let reportName = this.name;\r\n for (let i = 1; i < match.length; i++) {\r\n reportName = reportName.replace(new RegExp(`\\\\$${i}`, 'g'), match[i]);\r\n }\r\n return reportName;\r\n };\r\n }\r\n else {\r\n this.artifactNameMatch = (str) => str === this.artifact;\r\n this.getReportName = () => this.name;\r\n }\r\n this.fileNameMatch = picomatch_1.default(pattern);\r\n }\r\n async load() {\r\n const result = {};\r\n const resp = await this.octokit.actions.listWorkflowRunArtifacts({\r\n ...github.context.repo,\r\n run_id: this.runId\r\n });\r\n if (resp.data.artifacts.length === 0) {\r\n core.warning(`No artifacts found in run ${this.runId}`);\r\n return {};\r\n }\r\n const artifacts = resp.data.artifacts.filter(a => this.artifactNameMatch(a.name));\r\n if (artifacts.length === 0) {\r\n core.warning(`No artifact matches ${this.artifact}`);\r\n return {};\r\n }\r\n for (const art of artifacts) {\r\n const fileName = `${art.name}.zip`;\r\n await github_utils_1.downloadArtifact(this.octokit, art.id, fileName, this.token);\r\n core.startGroup(`Reading archive ${fileName}`);\r\n try {\r\n const reportName = this.getReportName(art.name);\r\n core.info(`Report name: ${reportName}`);\r\n const files = [];\r\n const zip = new adm_zip_1.default(fileName);\r\n for (const entry of zip.getEntries()) {\r\n const file = entry.entryName;\r\n if (entry.isDirectory) {\r\n core.info(`Skipping ${file}: entry is a directory`);\r\n continue;\r\n }\r\n if (!this.fileNameMatch(file)) {\r\n core.info(`Skipping ${file}: filename does not match pattern`);\r\n continue;\r\n }\r\n const content = zip.readAsText(entry);\r\n files.push({ file, content });\r\n core.info(`Read ${file}: ${content.length} chars`);\r\n }\r\n if (result[reportName]) {\r\n result[reportName].push(...files);\r\n }\r\n else {\r\n result[reportName] = files;\r\n }\r\n }\r\n finally {\r\n core.endGroup();\r\n }\r\n }\r\n return result;\r\n }\r\n async listTrackedFiles() {\r\n return github_utils_1.listFiles(this.octokit, this.sha);\r\n }\r\n}\r\nexports.ArtifactProvider = ArtifactProvider;\r\n","\"use strict\";\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}));\r\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n});\r\nvar __importStar = (this && this.__importStar) || function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n};\r\nvar __importDefault = (this && this.__importDefault) || function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.LocalFileProvider = void 0;\r\nconst fs = __importStar(require(\"fs\"));\r\nconst fast_glob_1 = __importDefault(require(\"fast-glob\"));\r\nconst git_1 = require(\"../utils/git\");\r\nclass LocalFileProvider {\r\n constructor(name, pattern) {\r\n this.name = name;\r\n this.pattern = pattern;\r\n }\r\n async load() {\r\n const result = [];\r\n for (const pat of this.pattern) {\r\n const paths = await fast_glob_1.default(pat, { dot: true });\r\n for (const file of paths) {\r\n const content = await fs.promises.readFile(file, { encoding: 'utf8' });\r\n result.push({ file, content });\r\n }\r\n }\r\n return { [this.name]: result };\r\n }\r\n async listTrackedFiles() {\r\n return git_1.listFiles();\r\n }\r\n}\r\nexports.LocalFileProvider = LocalFileProvider;\r\n","\"use strict\";\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}));\r\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n});\r\nvar __importStar = (this && this.__importStar) || function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst core = __importStar(require(\"@actions/core\"));\r\nconst github = __importStar(require(\"@actions/github\"));\r\nconst artifact_provider_1 = require(\"./input-providers/artifact-provider\");\r\nconst local_file_provider_1 = require(\"./input-providers/local-file-provider\");\r\nconst get_annotations_1 = require(\"./report/get-annotations\");\r\nconst get_report_1 = require(\"./report/get-report\");\r\nconst dart_json_parser_1 = require(\"./parsers/dart-json/dart-json-parser\");\r\nconst dotnet_trx_parser_1 = require(\"./parsers/dotnet-trx/dotnet-trx-parser\");\r\nconst java_junit_parser_1 = require(\"./parsers/java-junit/java-junit-parser\");\r\nconst jest_junit_parser_1 = require(\"./parsers/jest-junit/jest-junit-parser\");\r\nconst path_utils_1 = require(\"./utils/path-utils\");\r\nconst github_utils_1 = require(\"./utils/github-utils\");\r\nconst markdown_utils_1 = require(\"./utils/markdown-utils\");\r\nasync function main() {\r\n try {\r\n const testReporter = new TestReporter();\r\n await testReporter.run();\r\n }\r\n catch (error) {\r\n core.setFailed(error.message);\r\n }\r\n}\r\nclass TestReporter {\r\n constructor() {\r\n this.artifact = core.getInput('artifact', { required: false });\r\n this.name = core.getInput('name', { required: true });\r\n this.path = core.getInput('path', { required: true });\r\n this.reporter = core.getInput('reporter', { required: true });\r\n this.listSuites = core.getInput('list-suites', { required: true });\r\n this.listTests = core.getInput('list-tests', { required: true });\r\n this.maxAnnotations = parseInt(core.getInput('max-annotations', { required: true }));\r\n this.failOnError = core.getInput('fail-on-error', { required: true }) === 'true';\r\n this.workDirInput = core.getInput('working-directory', { required: false });\r\n this.token = core.getInput('token', { required: true });\r\n this.context = github_utils_1.getCheckRunContext();\r\n this.octokit = github.getOctokit(this.token);\r\n if (this.listSuites !== 'all' && this.listSuites !== 'failed') {\r\n core.setFailed(`Input parameter 'list-suites' has invalid value`);\r\n return;\r\n }\r\n if (this.listTests !== 'all' && this.listTests !== 'failed' && this.listTests !== 'none') {\r\n core.setFailed(`Input parameter 'list-tests' has invalid value`);\r\n return;\r\n }\r\n if (isNaN(this.maxAnnotations) || this.maxAnnotations < 0 || this.maxAnnotations > 50) {\r\n core.setFailed(`Input parameter 'max-annotations' has invalid value`);\r\n return;\r\n }\r\n }\r\n async run() {\r\n if (this.workDirInput) {\r\n core.info(`Changing directory to '${this.workDirInput}'`);\r\n process.chdir(this.workDirInput);\r\n }\r\n core.info(`Check runs will be created with SHA=${this.context.sha}`);\r\n const pattern = this.path.split(',');\r\n const inputProvider = this.artifact\r\n ? new artifact_provider_1.ArtifactProvider(this.octokit, this.artifact, this.name, pattern, this.context.sha, this.context.runId, this.token)\r\n : new local_file_provider_1.LocalFileProvider(this.name, pattern);\r\n const parseErrors = this.maxAnnotations > 0;\r\n const trackedFiles = await inputProvider.listTrackedFiles();\r\n const workDir = this.artifact ? undefined : path_utils_1.normalizeDirPath(process.cwd(), true);\r\n core.info(`Found ${trackedFiles.length} files tracked by GitHub`);\r\n const options = {\r\n workDir,\r\n trackedFiles,\r\n parseErrors\r\n };\r\n core.info(`Using test report parser '${this.reporter}'`);\r\n const parser = this.getParser(this.reporter, options);\r\n const results = [];\r\n const input = await inputProvider.load();\r\n for (const [reportName, files] of Object.entries(input)) {\r\n try {\r\n core.startGroup(`Creating test report ${reportName}`);\r\n const tr = await this.createReport(parser, reportName, files);\r\n results.push(...tr);\r\n }\r\n finally {\r\n core.endGroup();\r\n }\r\n }\r\n const isFailed = results.some(tr => tr.result === 'failed');\r\n const conclusion = isFailed ? 'failure' : 'success';\r\n const passed = results.reduce((sum, tr) => sum + tr.passed, 0);\r\n const failed = results.reduce((sum, tr) => sum + tr.failed, 0);\r\n const skipped = results.reduce((sum, tr) => sum + tr.skipped, 0);\r\n const time = results.reduce((sum, tr) => sum + tr.time, 0);\r\n core.setOutput('conclusion', conclusion);\r\n core.setOutput('passed', passed);\r\n core.setOutput('failed', failed);\r\n core.setOutput('skipped', skipped);\r\n core.setOutput('time', time);\r\n if (this.failOnError && isFailed) {\r\n core.setFailed(`Failed test were found and 'fail-on-error' option is set to ${this.failOnError}`);\r\n return;\r\n }\r\n if (results.length === 0) {\r\n core.setFailed(`No test report files were found`);\r\n return;\r\n }\r\n }\r\n async createReport(parser, name, files) {\r\n if (files.length === 0) {\r\n core.warning(`No file matches path ${this.path}`);\r\n return [];\r\n }\r\n const results = [];\r\n for (const { file, content } of files) {\r\n core.info(`Processing test results from ${file}`);\r\n const tr = await parser.parse(file, content);\r\n results.push(tr);\r\n }\r\n core.info('Creating report summary');\r\n const { listSuites, listTests } = this;\r\n const summary = get_report_1.getReport(results, { listSuites, listTests });\r\n core.info('Creating annotations');\r\n const annotations = get_annotations_1.getAnnotations(results, this.maxAnnotations);\r\n const isFailed = results.some(tr => tr.result === 'failed');\r\n const conclusion = isFailed ? 'failure' : 'success';\r\n const icon = isFailed ? markdown_utils_1.Icon.fail : markdown_utils_1.Icon.success;\r\n core.info(`Creating check run with conclusion ${conclusion}`);\r\n const resp = await this.octokit.checks.create({\r\n head_sha: this.context.sha,\r\n name,\r\n conclusion,\r\n status: 'completed',\r\n output: {\r\n title: `${name} ${icon}`,\r\n summary,\r\n annotations\r\n },\r\n ...github.context.repo\r\n });\r\n core.info(`Check run create response: ${resp.status}`);\r\n core.info(`Check run URL: ${resp.data.url}`);\r\n core.info(`Check run HTML: ${resp.data.html_url}`);\r\n return results;\r\n }\r\n getParser(reporter, options) {\r\n switch (reporter) {\r\n case 'dart-json':\r\n return new dart_json_parser_1.DartJsonParser(options, 'dart');\r\n case 'dotnet-trx':\r\n return new dotnet_trx_parser_1.DotnetTrxParser(options);\r\n case 'flutter-json':\r\n return new dart_json_parser_1.DartJsonParser(options, 'flutter');\r\n case 'java-junit':\r\n return new java_junit_parser_1.JavaJunitParser(options);\r\n case 'jest-junit':\r\n return new jest_junit_parser_1.JestJunitParser(options);\r\n default:\r\n throw new Error(`Input variable 'reporter' is set to invalid value '${reporter}'`);\r\n }\r\n }\r\n}\r\nmain();\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DartJsonParser = void 0;\r\nconst path_utils_1 = require(\"../../utils/path-utils\");\r\nconst dart_json_types_1 = require(\"./dart-json-types\");\r\nconst test_results_1 = require(\"../../test-results\");\r\nclass TestRun {\r\n constructor(path, suites, success, time) {\r\n this.path = path;\r\n this.suites = suites;\r\n this.success = success;\r\n this.time = time;\r\n }\r\n}\r\nclass TestSuite {\r\n constructor(suite) {\r\n this.suite = suite;\r\n this.groups = {};\r\n }\r\n}\r\nclass TestGroup {\r\n constructor(group) {\r\n this.group = group;\r\n this.tests = [];\r\n }\r\n}\r\nclass TestCase {\r\n constructor(testStart) {\r\n this.testStart = testStart;\r\n this.print = [];\r\n this.groupId = testStart.test.groupIDs[testStart.test.groupIDs.length - 1];\r\n }\r\n get result() {\r\n var _a, _b, _c, _d;\r\n if ((_a = this.testDone) === null || _a === void 0 ? void 0 : _a.skipped) {\r\n return 'skipped';\r\n }\r\n if (((_b = this.testDone) === null || _b === void 0 ? void 0 : _b.result) === 'success') {\r\n return 'success';\r\n }\r\n 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') {\r\n return 'failed';\r\n }\r\n return undefined;\r\n }\r\n get time() {\r\n return this.testDone !== undefined ? this.testDone.time - this.testStart.time : 0;\r\n }\r\n}\r\nclass DartJsonParser {\r\n constructor(options, sdk) {\r\n this.options = options;\r\n this.sdk = sdk;\r\n }\r\n async parse(path, content) {\r\n const tr = this.getTestRun(path, content);\r\n const result = this.getTestRunResult(tr);\r\n return Promise.resolve(result);\r\n }\r\n getTestRun(path, content) {\r\n const lines = content.split(/\\n\\r?/g);\r\n const events = lines\r\n .map((str, i) => {\r\n if (str.trim() === '') {\r\n return null;\r\n }\r\n try {\r\n return JSON.parse(str);\r\n }\r\n catch (e) {\r\n const col = e.columnNumber !== undefined ? `:${e.columnNumber}` : '';\r\n throw new Error(`Invalid JSON at ${path}:${i + 1}${col}\\n\\n${e}`);\r\n }\r\n })\r\n .filter(evt => evt != null);\r\n let success = false;\r\n let totalTime = 0;\r\n const suites = {};\r\n const tests = {};\r\n for (const evt of events) {\r\n if (dart_json_types_1.isSuiteEvent(evt)) {\r\n suites[evt.suite.id] = new TestSuite(evt.suite);\r\n }\r\n else if (dart_json_types_1.isGroupEvent(evt)) {\r\n suites[evt.group.suiteID].groups[evt.group.id] = new TestGroup(evt.group);\r\n }\r\n else if (dart_json_types_1.isTestStartEvent(evt) && evt.test.url !== null) {\r\n const test = new TestCase(evt);\r\n const suite = suites[evt.test.suiteID];\r\n const group = suite.groups[evt.test.groupIDs[evt.test.groupIDs.length - 1]];\r\n group.tests.push(test);\r\n tests[evt.test.id] = test;\r\n }\r\n else if (dart_json_types_1.isTestDoneEvent(evt) && !evt.hidden) {\r\n tests[evt.testID].testDone = evt;\r\n }\r\n else if (dart_json_types_1.isErrorEvent(evt)) {\r\n tests[evt.testID].error = evt;\r\n }\r\n else if (dart_json_types_1.isMessageEvent(evt)) {\r\n tests[evt.testID].print.push(evt);\r\n }\r\n else if (dart_json_types_1.isDoneEvent(evt)) {\r\n success = evt.success;\r\n totalTime = evt.time;\r\n }\r\n }\r\n return new TestRun(path, Object.values(suites), success, totalTime);\r\n }\r\n getTestRunResult(tr) {\r\n const suites = tr.suites.map(s => {\r\n return new test_results_1.TestSuiteResult(this.getRelativePath(s.suite.path), this.getGroups(s));\r\n });\r\n return new test_results_1.TestRunResult(tr.path, suites, tr.time);\r\n }\r\n getGroups(suite) {\r\n const groups = Object.values(suite.groups).filter(grp => grp.tests.length > 0);\r\n 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); });\r\n return groups.map(group => {\r\n 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); });\r\n const tests = group.tests.map(tc => {\r\n const error = this.getError(suite, tc);\r\n const testName = group.group.name !== undefined && tc.testStart.test.name.startsWith(group.group.name)\r\n ? tc.testStart.test.name.slice(group.group.name.length).trim()\r\n : tc.testStart.test.name.trim();\r\n return new test_results_1.TestCaseResult(testName, tc.result, tc.time, error);\r\n });\r\n return new test_results_1.TestGroupResult(group.group.name, tests);\r\n });\r\n }\r\n getError(testSuite, test) {\r\n var _a, _b, _c, _d, _e, _f;\r\n if (!this.options.parseErrors || !test.error) {\r\n return undefined;\r\n }\r\n const { trackedFiles } = this.options;\r\n const message = (_b = (_a = test.error) === null || _a === void 0 ? void 0 : _a.error) !== null && _b !== void 0 ? _b : '';\r\n const stackTrace = (_d = (_c = test.error) === null || _c === void 0 ? void 0 : _c.stackTrace) !== null && _d !== void 0 ? _d : '';\r\n const print = test.print\r\n .filter(p => p.messageType === 'print')\r\n .map(p => p.message)\r\n .join('\\n');\r\n const details = [print, stackTrace].filter(str => str !== '').join('\\n');\r\n const src = this.exceptionThrowSource(details, trackedFiles);\r\n let path;\r\n let line;\r\n if (src !== undefined) {\r\n path = src.path;\r\n line = src.line;\r\n }\r\n else {\r\n const testStartPath = this.getRelativePath(testSuite.suite.path);\r\n if (trackedFiles.includes(testStartPath)) {\r\n path = testStartPath;\r\n line = (_f = (_e = test.testStart.test.root_line) !== null && _e !== void 0 ? _e : test.testStart.test.line) !== null && _f !== void 0 ? _f : undefined;\r\n }\r\n }\r\n return {\r\n path,\r\n line,\r\n message,\r\n details\r\n };\r\n }\r\n exceptionThrowSource(ex, trackedFiles) {\r\n const lines = ex.split(/\\r?\\n/g);\r\n // regexp to extract file path and line number from stack trace\r\n const dartRe = /^(?!package:)(.*)\\s+(\\d+):\\d+\\s+/;\r\n const flutterRe = /^#\\d+\\s+.*\\((?!package:)(.*):(\\d+):\\d+\\)$/;\r\n const re = this.sdk === 'dart' ? dartRe : flutterRe;\r\n for (const str of lines) {\r\n const match = str.match(re);\r\n if (match !== null) {\r\n const [_, pathStr, lineStr] = match;\r\n const path = path_utils_1.normalizeFilePath(this.getRelativePath(pathStr));\r\n if (trackedFiles.includes(path)) {\r\n const line = parseInt(lineStr);\r\n return { path, line };\r\n }\r\n }\r\n }\r\n }\r\n getRelativePath(path) {\r\n const prefix = 'file://';\r\n if (path.startsWith(prefix)) {\r\n path = path.substr(prefix.length);\r\n }\r\n path = path_utils_1.normalizeFilePath(path);\r\n const workDir = this.getWorkDir(path);\r\n if (workDir !== undefined && path.startsWith(workDir)) {\r\n path = path.substr(workDir.length);\r\n }\r\n return path;\r\n }\r\n getWorkDir(path) {\r\n var _a, _b;\r\n return ((_b = (_a = this.options.workDir) !== null && _a !== void 0 ? _a : this.assumedWorkDir) !== null && _b !== void 0 ? _b : (this.assumedWorkDir = path_utils_1.getBasePath(path, this.options.trackedFiles)));\r\n }\r\n}\r\nexports.DartJsonParser = DartJsonParser;\r\n","\"use strict\";\r\n/// reflects documentation at https://github.com/dart-lang/test/blob/master/pkgs/test/doc/json_reporter.md\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.isMessageEvent = exports.isDoneEvent = exports.isErrorEvent = exports.isTestDoneEvent = exports.isTestStartEvent = exports.isGroupEvent = exports.isSuiteEvent = void 0;\r\nfunction isSuiteEvent(event) {\r\n return event.type === 'suite';\r\n}\r\nexports.isSuiteEvent = isSuiteEvent;\r\nfunction isGroupEvent(event) {\r\n return event.type === 'group';\r\n}\r\nexports.isGroupEvent = isGroupEvent;\r\nfunction isTestStartEvent(event) {\r\n return event.type === 'testStart';\r\n}\r\nexports.isTestStartEvent = isTestStartEvent;\r\nfunction isTestDoneEvent(event) {\r\n return event.type === 'testDone';\r\n}\r\nexports.isTestDoneEvent = isTestDoneEvent;\r\nfunction isErrorEvent(event) {\r\n return event.type === 'error';\r\n}\r\nexports.isErrorEvent = isErrorEvent;\r\nfunction isDoneEvent(event) {\r\n return event.type === 'done';\r\n}\r\nexports.isDoneEvent = isDoneEvent;\r\nfunction isMessageEvent(event) {\r\n return event.type === 'print';\r\n}\r\nexports.isMessageEvent = isMessageEvent;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DotnetTrxParser = void 0;\r\nconst xml2js_1 = require(\"xml2js\");\r\nconst path_utils_1 = require(\"../../utils/path-utils\");\r\nconst parse_utils_1 = require(\"../../utils/parse-utils\");\r\nconst test_results_1 = require(\"../../test-results\");\r\nclass TestClass {\r\n constructor(name) {\r\n this.name = name;\r\n this.tests = [];\r\n }\r\n}\r\nclass Test {\r\n constructor(name, outcome, duration, error) {\r\n this.name = name;\r\n this.outcome = outcome;\r\n this.duration = duration;\r\n this.error = error;\r\n }\r\n get result() {\r\n switch (this.outcome) {\r\n case 'Passed':\r\n return 'success';\r\n case 'NotExecuted':\r\n return 'skipped';\r\n case 'Failed':\r\n return 'failed';\r\n }\r\n }\r\n}\r\nclass DotnetTrxParser {\r\n constructor(options) {\r\n this.options = options;\r\n }\r\n async parse(path, content) {\r\n const trx = await this.getTrxReport(path, content);\r\n const tc = this.getTestClasses(trx);\r\n const tr = this.getTestRunResult(path, trx, tc);\r\n return tr;\r\n }\r\n async getTrxReport(path, content) {\r\n try {\r\n return (await xml2js_1.parseStringPromise(content));\r\n }\r\n catch (e) {\r\n throw new Error(`Invalid XML at ${path}\\n\\n${e}`);\r\n }\r\n }\r\n getTestClasses(trx) {\r\n var _a;\r\n if (trx.TestRun.TestDefinitions === undefined || trx.TestRun.Results === undefined) {\r\n return [];\r\n }\r\n const unitTests = {};\r\n for (const td of trx.TestRun.TestDefinitions) {\r\n for (const ut of td.UnitTest) {\r\n unitTests[ut.$.id] = ut.TestMethod[0];\r\n }\r\n }\r\n const unitTestsResults = trx.TestRun.Results.flatMap(r => r.UnitTestResult).flatMap(unitTestResult => ({\r\n unitTestResult,\r\n testMethod: unitTests[unitTestResult.$.testId]\r\n }));\r\n const testClasses = {};\r\n for (const r of unitTestsResults) {\r\n let tc = testClasses[r.testMethod.$.className];\r\n if (tc === undefined) {\r\n tc = new TestClass(r.testMethod.$.className);\r\n testClasses[tc.name] = tc;\r\n }\r\n const output = r.unitTestResult.Output;\r\n 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;\r\n const durationAttr = r.unitTestResult.$.duration;\r\n const duration = durationAttr ? parse_utils_1.parseNetDuration(durationAttr) : 0;\r\n const test = new Test(r.testMethod.$.name, r.unitTestResult.$.outcome, duration, error);\r\n tc.tests.push(test);\r\n }\r\n const result = Object.values(testClasses);\r\n result.sort((a, b) => a.name.localeCompare(b.name));\r\n for (const tc of result) {\r\n tc.tests.sort((a, b) => a.name.localeCompare(b.name));\r\n }\r\n return result;\r\n }\r\n getTestRunResult(path, trx, testClasses) {\r\n const times = trx.TestRun.Times[0].$;\r\n const totalTime = parse_utils_1.parseIsoDate(times.finish).getTime() - parse_utils_1.parseIsoDate(times.start).getTime();\r\n const suites = testClasses.map(testClass => {\r\n const tests = testClass.tests.map(test => {\r\n const error = this.getError(test);\r\n return new test_results_1.TestCaseResult(test.name, test.result, test.duration, error);\r\n });\r\n const group = new test_results_1.TestGroupResult(null, tests);\r\n return new test_results_1.TestSuiteResult(testClass.name, [group]);\r\n });\r\n return new test_results_1.TestRunResult(path, suites, totalTime);\r\n }\r\n getError(test) {\r\n if (!this.options.parseErrors || !test.error) {\r\n return undefined;\r\n }\r\n const message = test.error.Message[0];\r\n const stackTrace = test.error.StackTrace[0];\r\n let path;\r\n let line;\r\n const src = this.exceptionThrowSource(stackTrace);\r\n if (src) {\r\n path = src.path;\r\n line = src.line;\r\n }\r\n return {\r\n path,\r\n line,\r\n message,\r\n details: `${message}\\n${stackTrace}`\r\n };\r\n }\r\n exceptionThrowSource(stackTrace) {\r\n const lines = stackTrace.split(/\\r*\\n/);\r\n const re = / in (.+):line (\\d+)$/;\r\n const { trackedFiles } = this.options;\r\n for (const str of lines) {\r\n const match = str.match(re);\r\n if (match !== null) {\r\n const [_, fileStr, lineStr] = match;\r\n const filePath = path_utils_1.normalizeFilePath(fileStr);\r\n const workDir = this.getWorkDir(filePath);\r\n if (workDir) {\r\n const file = filePath.substr(workDir.length);\r\n if (trackedFiles.includes(file)) {\r\n const line = parseInt(lineStr);\r\n return { path: file, line };\r\n }\r\n }\r\n }\r\n }\r\n }\r\n getWorkDir(path) {\r\n var _a, _b;\r\n return ((_b = (_a = this.options.workDir) !== null && _a !== void 0 ? _a : this.assumedWorkDir) !== null && _b !== void 0 ? _b : (this.assumedWorkDir = path_utils_1.getBasePath(path, this.options.trackedFiles)));\r\n }\r\n}\r\nexports.DotnetTrxParser = DotnetTrxParser;\r\n","\"use strict\";\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}));\r\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n});\r\nvar __importStar = (this && this.__importStar) || function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.JavaJunitParser = void 0;\r\nconst path = __importStar(require(\"path\"));\r\nconst xml2js_1 = require(\"xml2js\");\r\nconst path_utils_1 = require(\"../../utils/path-utils\");\r\nconst test_results_1 = require(\"../../test-results\");\r\nclass JavaJunitParser {\r\n constructor(options) {\r\n var _a;\r\n this.options = options;\r\n // Map to efficient lookup of all paths with given file name\r\n this.trackedFiles = {};\r\n for (const filePath of options.trackedFiles) {\r\n const fileName = path.basename(filePath);\r\n const files = (_a = this.trackedFiles[fileName]) !== null && _a !== void 0 ? _a : (this.trackedFiles[fileName] = []);\r\n files.push(path_utils_1.normalizeFilePath(filePath));\r\n }\r\n }\r\n async parse(filePath, content) {\r\n const reportOrSuite = await this.getJunitReport(filePath, content);\r\n const isReport = reportOrSuite.testsuites !== undefined;\r\n // XML might contain:\r\n // - multiple suites under root node\r\n // - single as root node\r\n let ju;\r\n if (isReport) {\r\n ju = reportOrSuite;\r\n }\r\n else {\r\n // Make it behave the same way as if suite was inside root node\r\n const suite = reportOrSuite.testsuite;\r\n ju = {\r\n testsuites: {\r\n $: { time: suite.$.time },\r\n testsuite: [suite]\r\n }\r\n };\r\n }\r\n return this.getTestRunResult(filePath, ju);\r\n }\r\n async getJunitReport(filePath, content) {\r\n try {\r\n return await xml2js_1.parseStringPromise(content);\r\n }\r\n catch (e) {\r\n throw new Error(`Invalid XML at ${filePath}\\n\\n${e}`);\r\n }\r\n }\r\n getTestRunResult(filePath, junit) {\r\n const suites = junit.testsuites.testsuite === undefined\r\n ? []\r\n : junit.testsuites.testsuite.map(ts => {\r\n const name = ts.$.name.trim();\r\n const time = parseFloat(ts.$.time) * 1000;\r\n const sr = new test_results_1.TestSuiteResult(name, this.getGroups(ts), time);\r\n return sr;\r\n });\r\n const time = parseFloat(junit.testsuites.$.time) * 1000;\r\n return new test_results_1.TestRunResult(filePath, suites, time);\r\n }\r\n getGroups(suite) {\r\n if (suite.testcase === undefined) {\r\n return [];\r\n }\r\n const groups = [];\r\n for (const tc of suite.testcase) {\r\n // Normally classname is same as suite name - both refer to same Java class\r\n // Therefore it doesn't make sense to process it as a group\r\n // and tests will be added to default group with empty name\r\n const className = tc.$.classname === suite.$.name ? '' : tc.$.classname;\r\n let grp = groups.find(g => g.name === className);\r\n if (grp === undefined) {\r\n grp = { name: className, tests: [] };\r\n groups.push(grp);\r\n }\r\n grp.tests.push(tc);\r\n }\r\n return groups.map(grp => {\r\n const tests = grp.tests.map(tc => {\r\n const name = tc.$.name.trim();\r\n const result = this.getTestCaseResult(tc);\r\n const time = parseFloat(tc.$.time) * 1000;\r\n const error = this.getTestCaseError(tc);\r\n return new test_results_1.TestCaseResult(name, result, time, error);\r\n });\r\n return new test_results_1.TestGroupResult(grp.name, tests);\r\n });\r\n }\r\n getTestCaseResult(test) {\r\n if (test.failure)\r\n return 'failed';\r\n if (test.skipped)\r\n return 'skipped';\r\n return 'success';\r\n }\r\n getTestCaseError(tc) {\r\n if (!this.options.parseErrors || !tc.failure) {\r\n return undefined;\r\n }\r\n const failure = tc.failure[0];\r\n const details = failure._;\r\n let filePath;\r\n let line;\r\n const src = this.exceptionThrowSource(details);\r\n if (src) {\r\n filePath = src.filePath;\r\n line = src.line;\r\n }\r\n return {\r\n path: filePath,\r\n line,\r\n details,\r\n message: failure.message\r\n };\r\n }\r\n exceptionThrowSource(stackTrace) {\r\n const lines = stackTrace.split(/\\r?\\n/);\r\n const re = /^at (.*)\\((.*):(\\d+)\\)$/;\r\n for (const str of lines) {\r\n const match = str.match(re);\r\n if (match !== null) {\r\n const [_, tracePath, fileName, lineStr] = match;\r\n const filePath = this.getFilePath(tracePath, fileName);\r\n if (filePath !== undefined) {\r\n const line = parseInt(lineStr);\r\n return { filePath, line };\r\n }\r\n }\r\n }\r\n }\r\n // Stacktrace in Java doesn't contain full paths to source file.\r\n // There are only package, file name and line.\r\n // Assuming folder structure matches package name (as it should in Java),\r\n // we can try to match tracked file.\r\n getFilePath(tracePath, fileName) {\r\n // Check if there is any tracked file with given name\r\n const files = this.trackedFiles[fileName];\r\n if (files === undefined) {\r\n return undefined;\r\n }\r\n // Remove class name and method name from trace.\r\n // Take parts until first item with capital letter - package names are lowercase while class name is CamelCase.\r\n const packageParts = tracePath.split(/\\./g);\r\n const packageIndex = packageParts.findIndex(part => part[0] <= 'Z');\r\n if (packageIndex !== -1) {\r\n packageParts.splice(packageIndex, packageParts.length - packageIndex);\r\n }\r\n if (packageParts.length === 0) {\r\n return undefined;\r\n }\r\n // Get right file\r\n // - file name matches\r\n // - parent folders structure must reflect the package name\r\n for (const filePath of files) {\r\n const dirs = path.dirname(filePath).split(/\\//g);\r\n if (packageParts.length > dirs.length) {\r\n continue;\r\n }\r\n // get only N parent folders, where N = length of package name parts\r\n if (dirs.length > packageParts.length) {\r\n dirs.splice(0, dirs.length - packageParts.length);\r\n }\r\n // check if parent folder structure matches package name\r\n const isMatch = packageParts.every((part, i) => part === dirs[i]);\r\n if (isMatch) {\r\n return filePath;\r\n }\r\n }\r\n return undefined;\r\n }\r\n}\r\nexports.JavaJunitParser = JavaJunitParser;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.JestJunitParser = void 0;\r\nconst xml2js_1 = require(\"xml2js\");\r\nconst path_utils_1 = require(\"../../utils/path-utils\");\r\nconst test_results_1 = require(\"../../test-results\");\r\nclass JestJunitParser {\r\n constructor(options) {\r\n this.options = options;\r\n }\r\n async parse(path, content) {\r\n const ju = await this.getJunitReport(path, content);\r\n return this.getTestRunResult(path, ju);\r\n }\r\n async getJunitReport(path, content) {\r\n try {\r\n return (await xml2js_1.parseStringPromise(content));\r\n }\r\n catch (e) {\r\n throw new Error(`Invalid XML at ${path}\\n\\n${e}`);\r\n }\r\n }\r\n getTestRunResult(path, junit) {\r\n const suites = junit.testsuites.testsuite === undefined\r\n ? []\r\n : junit.testsuites.testsuite.map(ts => {\r\n const name = ts.$.name.trim();\r\n const time = parseFloat(ts.$.time) * 1000;\r\n const sr = new test_results_1.TestSuiteResult(name, this.getGroups(ts), time);\r\n return sr;\r\n });\r\n const time = parseFloat(junit.testsuites.$.time) * 1000;\r\n return new test_results_1.TestRunResult(path, suites, time);\r\n }\r\n getGroups(suite) {\r\n const groups = [];\r\n for (const tc of suite.testcase) {\r\n let grp = groups.find(g => g.describe === tc.$.classname);\r\n if (grp === undefined) {\r\n grp = { describe: tc.$.classname, tests: [] };\r\n groups.push(grp);\r\n }\r\n grp.tests.push(tc);\r\n }\r\n return groups.map(grp => {\r\n const tests = grp.tests.map(tc => {\r\n const name = tc.$.name.trim();\r\n const result = this.getTestCaseResult(tc);\r\n const time = parseFloat(tc.$.time) * 1000;\r\n const error = this.getTestCaseError(tc);\r\n return new test_results_1.TestCaseResult(name, result, time, error);\r\n });\r\n return new test_results_1.TestGroupResult(grp.describe, tests);\r\n });\r\n }\r\n getTestCaseResult(test) {\r\n if (test.failure)\r\n return 'failed';\r\n if (test.skipped)\r\n return 'skipped';\r\n return 'success';\r\n }\r\n getTestCaseError(tc) {\r\n if (!this.options.parseErrors || !tc.failure) {\r\n return undefined;\r\n }\r\n const details = tc.failure[0];\r\n let path;\r\n let line;\r\n const src = this.exceptionThrowSource(details);\r\n if (src) {\r\n path = src.path;\r\n line = src.line;\r\n }\r\n return {\r\n path,\r\n line,\r\n details\r\n };\r\n }\r\n exceptionThrowSource(stackTrace) {\r\n const lines = stackTrace.split(/\\r?\\n/);\r\n const re = /\\((.*):(\\d+):\\d+\\)$/;\r\n const { trackedFiles } = this.options;\r\n for (const str of lines) {\r\n const match = str.match(re);\r\n if (match !== null) {\r\n const [_, fileStr, lineStr] = match;\r\n const filePath = path_utils_1.normalizeFilePath(fileStr);\r\n if (filePath.startsWith('internal/') || filePath.includes('/node_modules/')) {\r\n continue;\r\n }\r\n const workDir = this.getWorkDir(filePath);\r\n if (!workDir) {\r\n continue;\r\n }\r\n const path = filePath.substr(workDir.length);\r\n if (trackedFiles.includes(path)) {\r\n const line = parseInt(lineStr);\r\n return { path, line };\r\n }\r\n }\r\n }\r\n }\r\n getWorkDir(path) {\r\n var _a, _b;\r\n return ((_b = (_a = this.options.workDir) !== null && _a !== void 0 ? _a : this.assumedWorkDir) !== null && _b !== void 0 ? _b : (this.assumedWorkDir = path_utils_1.getBasePath(path, this.options.trackedFiles)));\r\n }\r\n}\r\nexports.JestJunitParser = JestJunitParser;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.getAnnotations = void 0;\r\nconst markdown_utils_1 = require(\"../utils/markdown-utils\");\r\nfunction getAnnotations(results, maxCount) {\r\n var _a, _b, _c, _d;\r\n if (maxCount === 0) {\r\n return [];\r\n }\r\n // Collect errors from TestRunResults\r\n // Merge duplicates if there are more test results files processed\r\n const errors = [];\r\n const mergeDup = results.length > 1;\r\n for (const tr of results) {\r\n for (const ts of tr.suites) {\r\n for (const tg of ts.groups) {\r\n for (const tc of tg.tests) {\r\n const err = tc.error;\r\n if (err === undefined) {\r\n continue;\r\n }\r\n const path = (_a = err.path) !== null && _a !== void 0 ? _a : tr.path;\r\n const line = (_b = err.line) !== null && _b !== void 0 ? _b : 0;\r\n if (mergeDup) {\r\n const dup = errors.find(e => path === e.path && line === e.line && err.details === e.details);\r\n if (dup !== undefined) {\r\n dup.testRunPaths.push(tr.path);\r\n continue;\r\n }\r\n }\r\n errors.push({\r\n testRunPaths: [tr.path],\r\n suiteName: ts.name,\r\n testName: tc.name,\r\n details: err.details,\r\n message: (_d = (_c = err.message) !== null && _c !== void 0 ? _c : getFirstNonEmptyLine(err.details)) !== null && _d !== void 0 ? _d : 'Test failed',\r\n path,\r\n line\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // Limit number of created annotations\r\n errors.splice(maxCount + 1);\r\n const annotations = errors.map(e => {\r\n const message = [\r\n 'Failed test found in:',\r\n e.testRunPaths.map(p => ` ${p}`).join('\\n'),\r\n 'Error:',\r\n ident(markdown_utils_1.fixEol(e.message), ' ')\r\n ].join('\\n');\r\n return enforceCheckRunLimits({\r\n path: e.path,\r\n start_line: e.line,\r\n end_line: e.line,\r\n annotation_level: 'failure',\r\n title: `${e.suiteName} ► ${e.testName}`,\r\n raw_details: markdown_utils_1.fixEol(e.details),\r\n message\r\n });\r\n });\r\n return annotations;\r\n}\r\nexports.getAnnotations = getAnnotations;\r\nfunction enforceCheckRunLimits(err) {\r\n err.title = markdown_utils_1.ellipsis(err.title || '', 255);\r\n err.message = markdown_utils_1.ellipsis(err.message, 65535);\r\n if (err.raw_details) {\r\n err.raw_details = markdown_utils_1.ellipsis(err.raw_details, 65535);\r\n }\r\n return err;\r\n}\r\nfunction getFirstNonEmptyLine(stackTrace) {\r\n const lines = stackTrace.split(/\\r?\\n/g);\r\n return lines.find(str => !/^\\s*$/.test(str));\r\n}\r\nfunction ident(text, prefix) {\r\n return text\r\n .split(/\\n/g)\r\n .map(line => prefix + line)\r\n .join('\\n');\r\n}\r\n","\"use strict\";\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}));\r\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n});\r\nvar __importStar = (this && this.__importStar) || function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.getReport = void 0;\r\nconst core = __importStar(require(\"@actions/core\"));\r\nconst markdown_utils_1 = require(\"../utils/markdown-utils\");\r\nconst slugger_1 = require(\"../utils/slugger\");\r\nconst defaultOptions = {\r\n listSuites: 'all',\r\n listTests: 'all'\r\n};\r\nfunction getReport(results, options = defaultOptions) {\r\n core.info('Generating check run summary');\r\n const maxReportLength = 65535;\r\n applySort(results);\r\n const opts = { ...options };\r\n let report = renderReport(results, opts);\r\n if (getByteLength(report) <= maxReportLength) {\r\n return report;\r\n }\r\n if (opts.listTests === 'all') {\r\n core.info(\"Test report summary is too big - setting 'listTests' to 'failed'\");\r\n opts.listTests = 'failed';\r\n report = renderReport(results, opts);\r\n if (getByteLength(report) <= maxReportLength) {\r\n return report;\r\n }\r\n }\r\n if (opts.listSuites === 'all') {\r\n core.info(\"Test report summary is too big - setting 'listSuites' to 'failed'\");\r\n opts.listSuites = 'failed';\r\n report = renderReport(results, opts);\r\n if (getByteLength(report) <= maxReportLength) {\r\n return report;\r\n }\r\n }\r\n if (opts.listTests !== 'none') {\r\n core.info(\"Test report summary is too big - setting 'listTests' to 'none'\");\r\n opts.listTests = 'none';\r\n report = renderReport(results, opts);\r\n if (getByteLength(report) <= maxReportLength) {\r\n return report;\r\n }\r\n }\r\n core.warning(`Test report summary exceeded limit of ${maxReportLength} bytes`);\r\n const badge = getReportBadge(results);\r\n const msg = `**Test report summary exceeded limit of ${maxReportLength} bytes and was removed**`;\r\n return `${badge}\\n${msg}`;\r\n}\r\nexports.getReport = getReport;\r\nfunction applySort(results) {\r\n results.sort((a, b) => a.path.localeCompare(b.path));\r\n for (const res of results) {\r\n res.suites.sort((a, b) => a.name.localeCompare(b.name));\r\n }\r\n}\r\nfunction getByteLength(text) {\r\n return Buffer.byteLength(text, 'utf8');\r\n}\r\nfunction renderReport(results, options) {\r\n const sections = [];\r\n const badge = getReportBadge(results);\r\n sections.push(badge);\r\n const runs = getTestRunsReport(results, options);\r\n sections.push(...runs);\r\n return sections.join('\\n');\r\n}\r\nfunction getReportBadge(results) {\r\n const passed = results.reduce((sum, tr) => sum + tr.passed, 0);\r\n const skipped = results.reduce((sum, tr) => sum + tr.skipped, 0);\r\n const failed = results.reduce((sum, tr) => sum + tr.failed, 0);\r\n return getBadge(passed, failed, skipped);\r\n}\r\nfunction getBadge(passed, failed, skipped) {\r\n const text = [];\r\n if (passed > 0) {\r\n text.push(`${passed} passed`);\r\n }\r\n if (failed > 0) {\r\n text.push(`${failed} failed`);\r\n }\r\n if (skipped > 0) {\r\n text.push(`${skipped} skipped`);\r\n }\r\n const message = text.length > 0 ? text.join(', ') : 'none';\r\n let color = 'success';\r\n if (failed > 0) {\r\n color = 'critical';\r\n }\r\n else if (passed === 0 && failed === 0) {\r\n color = 'yellow';\r\n }\r\n const hint = failed > 0 ? 'Tests failed' : 'Tests passed successfully';\r\n const uri = encodeURIComponent(`tests-${message}-${color}`);\r\n return `![${hint}](https://img.shields.io/badge/${uri})`;\r\n}\r\nfunction getTestRunsReport(testRuns, options) {\r\n const sections = [];\r\n if (testRuns.length > 1) {\r\n const tableData = testRuns.map((tr, runIndex) => {\r\n const time = markdown_utils_1.formatTime(tr.time);\r\n const name = tr.path;\r\n const addr = makeRunSlug(runIndex).link;\r\n const nameLink = markdown_utils_1.link(name, addr);\r\n const passed = tr.passed > 0 ? `${tr.passed}${markdown_utils_1.Icon.success}` : '';\r\n const failed = tr.failed > 0 ? `${tr.failed}${markdown_utils_1.Icon.fail}` : '';\r\n const skipped = tr.skipped > 0 ? `${tr.skipped}${markdown_utils_1.Icon.skip}` : '';\r\n return [nameLink, passed, failed, skipped, time];\r\n });\r\n const resultsTable = 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);\r\n sections.push(resultsTable);\r\n }\r\n const suitesReports = testRuns.map((tr, i) => getSuitesReport(tr, i, options)).flat();\r\n sections.push(...suitesReports);\r\n return sections;\r\n}\r\nfunction getSuitesReport(tr, runIndex, options) {\r\n const sections = [];\r\n const trSlug = makeRunSlug(runIndex);\r\n const nameLink = `${tr.path}`;\r\n const icon = getResultIcon(tr.result);\r\n sections.push(`## ${nameLink} ${icon}`);\r\n const time = markdown_utils_1.formatTime(tr.time);\r\n const headingLine2 = tr.tests > 0\r\n ? `**${tr.tests}** tests were completed in **${time}** with **${tr.passed}** passed, **${tr.failed}** failed and **${tr.skipped}** skipped.`\r\n : 'No tests found';\r\n sections.push(headingLine2);\r\n const suites = options.listSuites === 'failed' ? tr.failedSuites : tr.suites;\r\n if (suites.length > 0) {\r\n const suitesTable = 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) => {\r\n const tsTime = markdown_utils_1.formatTime(s.time);\r\n const tsName = s.name;\r\n const skipLink = options.listTests === 'none' || (options.listTests === 'failed' && s.result !== 'failed');\r\n const tsAddr = makeSuiteSlug(runIndex, suiteIndex).link;\r\n const tsNameLink = skipLink ? tsName : markdown_utils_1.link(tsName, tsAddr);\r\n const passed = s.passed > 0 ? `${s.passed}${markdown_utils_1.Icon.success}` : '';\r\n const failed = s.failed > 0 ? `${s.failed}${markdown_utils_1.Icon.fail}` : '';\r\n const skipped = s.skipped > 0 ? `${s.skipped}${markdown_utils_1.Icon.skip}` : '';\r\n return [tsNameLink, passed, failed, skipped, tsTime];\r\n }));\r\n sections.push(suitesTable);\r\n }\r\n if (options.listTests !== 'none') {\r\n const tests = suites.map((ts, suiteIndex) => getTestsReport(ts, runIndex, suiteIndex, options)).flat();\r\n if (tests.length > 1) {\r\n sections.push(...tests);\r\n }\r\n }\r\n return sections;\r\n}\r\nfunction getTestsReport(ts, runIndex, suiteIndex, options) {\r\n const groups = options.listTests === 'failed' ? ts.failedGroups : ts.groups;\r\n if (groups.length === 0) {\r\n return [];\r\n }\r\n const sections = [];\r\n const tsName = ts.name;\r\n const tsSlug = makeSuiteSlug(runIndex, suiteIndex);\r\n const tsNameLink = `${tsName}`;\r\n const icon = getResultIcon(ts.result);\r\n sections.push(`### ${tsNameLink} ${icon}`);\r\n const tsTime = markdown_utils_1.formatTime(ts.time);\r\n const headingLine2 = `**${ts.tests}** tests were completed in **${tsTime}** with **${ts.passed}** passed, **${ts.failed}** failed and **${ts.skipped}** skipped.`;\r\n sections.push(headingLine2);\r\n for (const grp of groups) {\r\n const tests = options.listTests === 'failed' ? grp.failedTests : grp.tests;\r\n if (tests.length === 0) {\r\n continue;\r\n }\r\n const grpHeader = grp.name ? `\\n**${grp.name}**` : '';\r\n const testsTable = markdown_utils_1.table(['Result', 'Test', 'Time'], [markdown_utils_1.Align.Center, markdown_utils_1.Align.Left, markdown_utils_1.Align.Right], ...grp.tests.map(tc => {\r\n const name = tc.name;\r\n const time = markdown_utils_1.formatTime(tc.time);\r\n const result = getResultIcon(tc.result);\r\n return [result, name, time];\r\n }));\r\n sections.push(grpHeader, testsTable);\r\n }\r\n return sections;\r\n}\r\nfunction makeRunSlug(runIndex) {\r\n // use prefix to avoid slug conflicts after escaping the paths\r\n return slugger_1.slug(`r${runIndex}`);\r\n}\r\nfunction makeSuiteSlug(runIndex, suiteIndex) {\r\n // use prefix to avoid slug conflicts after escaping the paths\r\n return slugger_1.slug(`r${runIndex}s${suiteIndex}`);\r\n}\r\nfunction getResultIcon(result) {\r\n switch (result) {\r\n case 'success':\r\n return markdown_utils_1.Icon.success;\r\n case 'skipped':\r\n return markdown_utils_1.Icon.skip;\r\n case 'failed':\r\n return markdown_utils_1.Icon.fail;\r\n default:\r\n return '';\r\n }\r\n}\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.TestCaseResult = exports.TestGroupResult = exports.TestSuiteResult = exports.TestRunResult = void 0;\r\nclass TestRunResult {\r\n constructor(path, suites, totalTime) {\r\n this.path = path;\r\n this.suites = suites;\r\n this.totalTime = totalTime;\r\n }\r\n get tests() {\r\n return this.suites.reduce((sum, g) => sum + g.tests, 0);\r\n }\r\n get passed() {\r\n return this.suites.reduce((sum, g) => sum + g.passed, 0);\r\n }\r\n get failed() {\r\n return this.suites.reduce((sum, g) => sum + g.failed, 0);\r\n }\r\n get skipped() {\r\n return this.suites.reduce((sum, g) => sum + g.skipped, 0);\r\n }\r\n get time() {\r\n var _a;\r\n return (_a = this.totalTime) !== null && _a !== void 0 ? _a : this.suites.reduce((sum, g) => sum + g.time, 0);\r\n }\r\n get result() {\r\n return this.suites.some(t => t.result === 'failed') ? 'failed' : 'success';\r\n }\r\n get failedSuites() {\r\n return this.suites.filter(s => s.result === 'failed');\r\n }\r\n}\r\nexports.TestRunResult = TestRunResult;\r\nclass TestSuiteResult {\r\n constructor(name, groups, totalTime) {\r\n this.name = name;\r\n this.groups = groups;\r\n this.totalTime = totalTime;\r\n }\r\n get tests() {\r\n return this.groups.reduce((sum, g) => sum + g.tests.length, 0);\r\n }\r\n get passed() {\r\n return this.groups.reduce((sum, g) => sum + g.passed, 0);\r\n }\r\n get failed() {\r\n return this.groups.reduce((sum, g) => sum + g.failed, 0);\r\n }\r\n get skipped() {\r\n return this.groups.reduce((sum, g) => sum + g.skipped, 0);\r\n }\r\n get time() {\r\n var _a;\r\n return (_a = this.totalTime) !== null && _a !== void 0 ? _a : this.groups.reduce((sum, g) => sum + g.time, 0);\r\n }\r\n get result() {\r\n return this.groups.some(t => t.result === 'failed') ? 'failed' : 'success';\r\n }\r\n get failedGroups() {\r\n return this.groups.filter(grp => grp.result === 'failed');\r\n }\r\n}\r\nexports.TestSuiteResult = TestSuiteResult;\r\nclass TestGroupResult {\r\n constructor(name, tests) {\r\n this.name = name;\r\n this.tests = tests;\r\n }\r\n get passed() {\r\n return this.tests.reduce((sum, t) => (t.result === 'success' ? sum + 1 : sum), 0);\r\n }\r\n get failed() {\r\n return this.tests.reduce((sum, t) => (t.result === 'failed' ? sum + 1 : sum), 0);\r\n }\r\n get skipped() {\r\n return this.tests.reduce((sum, t) => (t.result === 'skipped' ? sum + 1 : sum), 0);\r\n }\r\n get time() {\r\n return this.tests.reduce((sum, t) => sum + t.time, 0);\r\n }\r\n get result() {\r\n return this.tests.some(t => t.result === 'failed') ? 'failed' : 'success';\r\n }\r\n get failedTests() {\r\n return this.tests.filter(tc => tc.result === 'failed');\r\n }\r\n}\r\nexports.TestGroupResult = TestGroupResult;\r\nclass TestCaseResult {\r\n constructor(name, result, time, error) {\r\n this.name = name;\r\n this.result = result;\r\n this.time = time;\r\n this.error = error;\r\n }\r\n}\r\nexports.TestCaseResult = TestCaseResult;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst exec_1 = require(\"@actions/exec\");\r\n// Wraps original exec() function\r\n// Returns exit code and whole stdout/stderr\r\nasync function exec(commandLine, args, options) {\r\n options = options || {};\r\n let stdout = '';\r\n let stderr = '';\r\n options.listeners = {\r\n stdout: (data) => (stdout += data.toString()),\r\n stderr: (data) => (stderr += data.toString())\r\n };\r\n const code = await exec_1.exec(commandLine, args, options);\r\n return { code, stdout, stderr };\r\n}\r\nexports.default = exec;\r\n","\"use strict\";\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}));\r\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n});\r\nvar __importStar = (this && this.__importStar) || function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n};\r\nvar __importDefault = (this && this.__importDefault) || function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.listFiles = void 0;\r\nconst core = __importStar(require(\"@actions/core\"));\r\nconst exec_1 = __importDefault(require(\"./exec\"));\r\nasync function listFiles() {\r\n core.startGroup('Listing all files tracked by git');\r\n let output = '';\r\n try {\r\n output = (await exec_1.default('git', ['ls-files', '-z'])).stdout;\r\n }\r\n finally {\r\n fixStdOutNullTermination();\r\n core.endGroup();\r\n }\r\n return output.split('\\u0000').filter(s => s.length > 0);\r\n}\r\nexports.listFiles = listFiles;\r\nfunction fixStdOutNullTermination() {\r\n // Previous command uses NULL as delimiters and output is printed to stdout.\r\n // We have to make sure next thing written to stdout will start on new line.\r\n // Otherwise things like ::set-output wouldn't work.\r\n core.info('');\r\n}\r\n","\"use strict\";\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}));\r\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n});\r\nvar __importStar = (this && this.__importStar) || function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n};\r\nvar __importDefault = (this && this.__importDefault) || function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.listFiles = exports.downloadArtifact = exports.getCheckRunContext = void 0;\r\nconst fs_1 = require(\"fs\");\r\nconst core = __importStar(require(\"@actions/core\"));\r\nconst github = __importStar(require(\"@actions/github\"));\r\nconst stream = __importStar(require(\"stream\"));\r\nconst util_1 = require(\"util\");\r\nconst got_1 = __importDefault(require(\"got\"));\r\nconst asyncStream = util_1.promisify(stream.pipeline);\r\nfunction getCheckRunContext() {\r\n if (github.context.eventName === 'workflow_run') {\r\n core.info('Action was triggered by workflow_run: using SHA and RUN_ID from triggering workflow');\r\n const event = github.context.payload;\r\n if (!event.workflow_run) {\r\n throw new Error(\"Event of type 'workflow_run' is missing 'workflow_run' field\");\r\n }\r\n return {\r\n sha: event.workflow_run.head_commit.id,\r\n runId: event.workflow_run.id\r\n };\r\n }\r\n const runId = github.context.runId;\r\n if (github.context.payload.pull_request) {\r\n core.info(`Action was triggered by ${github.context.eventName}: using SHA from head of source branch`);\r\n const pr = github.context.payload.pull_request;\r\n return { sha: pr.head.sha, runId };\r\n }\r\n return { sha: github.context.sha, runId };\r\n}\r\nexports.getCheckRunContext = getCheckRunContext;\r\nasync function downloadArtifact(octokit, artifactId, fileName, token) {\r\n core.startGroup(`Downloading artifact ${fileName}`);\r\n try {\r\n core.info(`Artifact ID: ${artifactId}`);\r\n const req = octokit.actions.downloadArtifact.endpoint({\r\n ...github.context.repo,\r\n artifact_id: artifactId,\r\n archive_format: 'zip'\r\n });\r\n const headers = {\r\n Authorization: `Bearer ${token}`\r\n };\r\n const resp = await got_1.default(req.url, {\r\n headers,\r\n followRedirect: false\r\n });\r\n core.info(`Fetch artifact URL: ${resp.statusCode} ${resp.statusMessage}`);\r\n if (resp.statusCode !== 302) {\r\n throw new Error('Fetch artifact URL failed: received unexpected status code');\r\n }\r\n const url = resp.headers.location;\r\n if (url === undefined) {\r\n const receivedHeaders = Object.keys(resp.headers);\r\n core.info(`Received headers: ${receivedHeaders.join(', ')}`);\r\n throw new Error('Location header was not found in API response');\r\n }\r\n if (typeof url !== 'string') {\r\n throw new Error(`Location header has unexpected value: ${url}`);\r\n }\r\n const downloadStream = got_1.default.stream(url, { headers });\r\n const fileWriterStream = fs_1.createWriteStream(fileName);\r\n core.info(`Downloading ${url}`);\r\n downloadStream.on('downloadProgress', ({ transferred }) => {\r\n core.info(`Progress: ${transferred} B`);\r\n });\r\n await asyncStream(downloadStream, fileWriterStream);\r\n }\r\n finally {\r\n core.endGroup();\r\n }\r\n}\r\nexports.downloadArtifact = downloadArtifact;\r\nasync function listFiles(octokit, sha) {\r\n core.startGroup('Fetching list of tracked files from GitHub');\r\n try {\r\n const commit = await octokit.git.getCommit({\r\n commit_sha: sha,\r\n ...github.context.repo\r\n });\r\n const files = await listGitTree(octokit, commit.data.tree.sha, '');\r\n return files;\r\n }\r\n finally {\r\n core.endGroup();\r\n }\r\n}\r\nexports.listFiles = listFiles;\r\nasync function listGitTree(octokit, sha, path) {\r\n const pathLog = path ? ` at ${path}` : '';\r\n core.info(`Fetching tree ${sha}${pathLog}`);\r\n let truncated = false;\r\n let tree = await octokit.git.getTree({\r\n recursive: 'true',\r\n tree_sha: sha,\r\n ...github.context.repo\r\n });\r\n if (tree.data.truncated) {\r\n truncated = true;\r\n tree = await octokit.git.getTree({\r\n tree_sha: sha,\r\n ...github.context.repo\r\n });\r\n }\r\n const result = [];\r\n for (const tr of tree.data.tree) {\r\n const file = `${path}${tr.path}`;\r\n if (tr.type === 'blob') {\r\n result.push(file);\r\n }\r\n else if (tr.type === 'tree' && truncated) {\r\n const files = await listGitTree(octokit, tr.sha, `${file}/`);\r\n result.push(...files);\r\n }\r\n }\r\n return result;\r\n}\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.formatTime = exports.ellipsis = exports.fixEol = exports.tableEscape = exports.table = exports.link = exports.Icon = exports.Align = void 0;\r\nvar Align;\r\n(function (Align) {\r\n Align[\"Left\"] = \":---\";\r\n Align[\"Center\"] = \":---:\";\r\n Align[\"Right\"] = \"---:\";\r\n Align[\"None\"] = \"---\";\r\n})(Align = exports.Align || (exports.Align = {}));\r\nexports.Icon = {\r\n skip: '✖️',\r\n success: '✔️',\r\n fail: '❌' // ':x:'\r\n};\r\nfunction link(title, address) {\r\n return `[${title}](${address})`;\r\n}\r\nexports.link = link;\r\nfunction table(headers, align, ...rows) {\r\n const headerRow = `|${headers.map(tableEscape).join('|')}|`;\r\n const alignRow = `|${align.join('|')}|`;\r\n const contentRows = rows.map(row => `|${row.map(tableEscape).join('|')}|`).join('\\n');\r\n return [headerRow, alignRow, contentRows].join('\\n');\r\n}\r\nexports.table = table;\r\nfunction tableEscape(content) {\r\n return content.toString().replace('|', '\\\\|');\r\n}\r\nexports.tableEscape = tableEscape;\r\nfunction fixEol(text) {\r\n var _a;\r\n return (_a = text === null || text === void 0 ? void 0 : text.replace(/\\r/g, '')) !== null && _a !== void 0 ? _a : '';\r\n}\r\nexports.fixEol = fixEol;\r\nfunction ellipsis(text, maxLength) {\r\n if (text.length <= maxLength) {\r\n return text;\r\n }\r\n return text.substr(0, maxLength - 3) + '...';\r\n}\r\nexports.ellipsis = ellipsis;\r\nfunction formatTime(ms) {\r\n if (ms > 1000) {\r\n return `${(ms / 1000).toFixed(3)}s`;\r\n }\r\n return `${Math.round(ms)}ms`;\r\n}\r\nexports.formatTime = formatTime;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.parseIsoDate = exports.parseNetDuration = void 0;\r\nfunction parseNetDuration(str) {\r\n const durationRe = /^(\\d\\d):(\\d\\d):(\\d\\d(?:\\.\\d+)?)$/;\r\n const durationMatch = str.match(durationRe);\r\n if (durationMatch === null) {\r\n throw new Error(`Invalid format: \"${str}\" is not NET duration`);\r\n }\r\n const [_, hourStr, minStr, secStr] = durationMatch;\r\n return (parseInt(hourStr) * 3600 + parseInt(minStr) * 60 + parseFloat(secStr)) * 1000;\r\n}\r\nexports.parseNetDuration = parseNetDuration;\r\nfunction parseIsoDate(str) {\r\n 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)$/;\r\n if (str === undefined || !isoDateRe.test(str)) {\r\n throw new Error(`Invalid format: \"${str}\" is not ISO date`);\r\n }\r\n return new Date(str);\r\n}\r\nexports.parseIsoDate = parseIsoDate;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.getBasePath = exports.normalizeFilePath = exports.normalizeDirPath = void 0;\r\nfunction normalizeDirPath(path, addTrailingSlash) {\r\n if (!path) {\r\n return path;\r\n }\r\n path = normalizeFilePath(path);\r\n if (addTrailingSlash && !path.endsWith('/')) {\r\n path += '/';\r\n }\r\n return path;\r\n}\r\nexports.normalizeDirPath = normalizeDirPath;\r\nfunction normalizeFilePath(path) {\r\n if (!path) {\r\n return path;\r\n }\r\n return path.trim().replace(/\\\\/g, '/');\r\n}\r\nexports.normalizeFilePath = normalizeFilePath;\r\nfunction getBasePath(path, trackedFiles) {\r\n if (trackedFiles.includes(path)) {\r\n return '';\r\n }\r\n let max = '';\r\n for (const file of trackedFiles) {\r\n if (path.endsWith(file) && file.length > max.length) {\r\n max = file;\r\n }\r\n }\r\n if (max === '') {\r\n return undefined;\r\n }\r\n const base = path.substr(0, path.length - max.length);\r\n return base;\r\n}\r\nexports.getBasePath = getBasePath;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.slug = void 0;\r\n// Returns HTML element id and href link usable as manual anchor links\r\n// This is needed because Github in check run summary doesn't automatically\r\n// create links out of headings as it normally does for other markdown content\r\nfunction slug(name) {\r\n const slugId = name\r\n .trim()\r\n .replace(/_/g, '')\r\n .replace(/[./\\\\]/g, '-')\r\n .replace(/[^\\w-]/g, '');\r\n const id = `user-content-${slugId}`;\r\n const link = `#${slugId}`;\r\n return { id, link };\r\n}\r\nexports.slug = slug;\r\n","\"use strict\";\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst os = __importStar(require(\"os\"));\nconst utils_1 = require(\"./utils\");\n/**\n * Commands\n *\n * Command Format:\n * ::name key=value,key=value::message\n *\n * Examples:\n * ::warning::This is the message\n * ::set-env name=MY_VAR::some value\n */\nfunction issueCommand(command, properties, message) {\n const cmd = new Command(command, properties, message);\n process.stdout.write(cmd.toString() + os.EOL);\n}\nexports.issueCommand = issueCommand;\nfunction issue(name, message = '') {\n issueCommand(name, {}, message);\n}\nexports.issue = issue;\nconst CMD_STRING = '::';\nclass Command {\n constructor(command, properties, message) {\n if (!command) {\n command = 'missing.command';\n }\n this.command = command;\n this.properties = properties;\n this.message = message;\n }\n toString() {\n let cmdStr = CMD_STRING + this.command;\n if (this.properties && Object.keys(this.properties).length > 0) {\n cmdStr += ' ';\n let first = true;\n for (const key in this.properties) {\n if (this.properties.hasOwnProperty(key)) {\n const val = this.properties[key];\n if (val) {\n if (first) {\n first = false;\n }\n else {\n cmdStr += ',';\n }\n cmdStr += `${key}=${escapeProperty(val)}`;\n }\n }\n }\n }\n cmdStr += `${CMD_STRING}${escapeData(this.message)}`;\n return cmdStr;\n }\n}\nfunction escapeData(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A');\n}\nfunction escapeProperty(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n//# sourceMappingURL=command.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst command_1 = require(\"./command\");\nconst file_command_1 = require(\"./file-command\");\nconst utils_1 = require(\"./utils\");\nconst os = __importStar(require(\"os\"));\nconst path = __importStar(require(\"path\"));\n/**\n * The code to exit an action\n */\nvar ExitCode;\n(function (ExitCode) {\n /**\n * A code indicating that the action was successful\n */\n ExitCode[ExitCode[\"Success\"] = 0] = \"Success\";\n /**\n * A code indicating that the action was a failure\n */\n ExitCode[ExitCode[\"Failure\"] = 1] = \"Failure\";\n})(ExitCode = exports.ExitCode || (exports.ExitCode = {}));\n//-----------------------------------------------------------------------\n// Variables\n//-----------------------------------------------------------------------\n/**\n * Sets env variable for this action and future actions in the job\n * @param name the name of the variable to set\n * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction exportVariable(name, val) {\n const convertedVal = utils_1.toCommandValue(val);\n process.env[name] = convertedVal;\n const filePath = process.env['GITHUB_ENV'] || '';\n if (filePath) {\n const delimiter = '_GitHubActionsFileCommandDelimeter_';\n const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;\n file_command_1.issueCommand('ENV', commandValue);\n }\n else {\n command_1.issueCommand('set-env', { name }, convertedVal);\n }\n}\nexports.exportVariable = exportVariable;\n/**\n * Registers a secret which will get masked from logs\n * @param secret value of the secret\n */\nfunction setSecret(secret) {\n command_1.issueCommand('add-mask', {}, secret);\n}\nexports.setSecret = setSecret;\n/**\n * Prepends inputPath to the PATH (for this action and future actions)\n * @param inputPath\n */\nfunction addPath(inputPath) {\n const filePath = process.env['GITHUB_PATH'] || '';\n if (filePath) {\n file_command_1.issueCommand('PATH', inputPath);\n }\n else {\n command_1.issueCommand('add-path', {}, inputPath);\n }\n process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;\n}\nexports.addPath = addPath;\n/**\n * Gets the value of an input. The value is also trimmed.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string\n */\nfunction getInput(name, options) {\n const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';\n if (options && options.required && !val) {\n throw new Error(`Input required and not supplied: ${name}`);\n }\n return val.trim();\n}\nexports.getInput = getInput;\n/**\n * Sets the value of an output.\n *\n * @param name name of the output to set\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setOutput(name, value) {\n command_1.issueCommand('set-output', { name }, value);\n}\nexports.setOutput = setOutput;\n/**\n * Enables or disables the echoing of commands into stdout for the rest of the step.\n * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set.\n *\n */\nfunction setCommandEcho(enabled) {\n command_1.issue('echo', enabled ? 'on' : 'off');\n}\nexports.setCommandEcho = setCommandEcho;\n//-----------------------------------------------------------------------\n// Results\n//-----------------------------------------------------------------------\n/**\n * Sets the action status to failed.\n * When the action exits it will be with an exit code of 1\n * @param message add error issue message\n */\nfunction setFailed(message) {\n process.exitCode = ExitCode.Failure;\n error(message);\n}\nexports.setFailed = setFailed;\n//-----------------------------------------------------------------------\n// Logging Commands\n//-----------------------------------------------------------------------\n/**\n * Gets whether Actions Step Debug is on or not\n */\nfunction isDebug() {\n return process.env['RUNNER_DEBUG'] === '1';\n}\nexports.isDebug = isDebug;\n/**\n * Writes debug message to user log\n * @param message debug message\n */\nfunction debug(message) {\n command_1.issueCommand('debug', {}, message);\n}\nexports.debug = debug;\n/**\n * Adds an error issue\n * @param message error issue message. Errors will be converted to string via toString()\n */\nfunction error(message) {\n command_1.issue('error', message instanceof Error ? message.toString() : message);\n}\nexports.error = error;\n/**\n * Adds an warning issue\n * @param message warning issue message. Errors will be converted to string via toString()\n */\nfunction warning(message) {\n command_1.issue('warning', message instanceof Error ? message.toString() : message);\n}\nexports.warning = warning;\n/**\n * Writes info to log with console.log.\n * @param message info message\n */\nfunction info(message) {\n process.stdout.write(message + os.EOL);\n}\nexports.info = info;\n/**\n * Begin an output group.\n *\n * Output until the next `groupEnd` will be foldable in this group\n *\n * @param name The name of the output group\n */\nfunction startGroup(name) {\n command_1.issue('group', name);\n}\nexports.startGroup = startGroup;\n/**\n * End an output group.\n */\nfunction endGroup() {\n command_1.issue('endgroup');\n}\nexports.endGroup = endGroup;\n/**\n * Wrap an asynchronous function call in a group.\n *\n * Returns the same type as the function itself.\n *\n * @param name The name of the group\n * @param fn The function to wrap in the group\n */\nfunction group(name, fn) {\n return __awaiter(this, void 0, void 0, function* () {\n startGroup(name);\n let result;\n try {\n result = yield fn();\n }\n finally {\n endGroup();\n }\n return result;\n });\n}\nexports.group = group;\n//-----------------------------------------------------------------------\n// Wrapper action state\n//-----------------------------------------------------------------------\n/**\n * Saves state for current action, the state can only be retrieved by this action's post job execution.\n *\n * @param name name of the state to store\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction saveState(name, value) {\n command_1.issueCommand('save-state', { name }, value);\n}\nexports.saveState = saveState;\n/**\n * Gets the value of an state set by this action's main execution.\n *\n * @param name name of the state to get\n * @returns string\n */\nfunction getState(name) {\n return process.env[`STATE_${name}`] || '';\n}\nexports.getState = getState;\n//# sourceMappingURL=core.js.map","\"use strict\";\n// For internal use, subject to change.\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst fs = __importStar(require(\"fs\"));\nconst os = __importStar(require(\"os\"));\nconst utils_1 = require(\"./utils\");\nfunction issueCommand(command, message) {\n const filePath = process.env[`GITHUB_${command}`];\n if (!filePath) {\n throw new Error(`Unable to find environment variable for file command ${command}`);\n }\n if (!fs.existsSync(filePath)) {\n throw new Error(`Missing file at path: ${filePath}`);\n }\n fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, {\n encoding: 'utf8'\n });\n}\nexports.issueCommand = issueCommand;\n//# sourceMappingURL=file-command.js.map","\"use strict\";\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Sanitizes an input into a string so it can be passed into issueCommand safely\n * @param input input to sanitize into a string\n */\nfunction toCommandValue(input) {\n if (input === null || input === undefined) {\n return '';\n }\n else if (typeof input === 'string' || input instanceof String) {\n return input;\n }\n return JSON.stringify(input);\n}\nexports.toCommandValue = toCommandValue;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tr = __importStar(require(\"./toolrunner\"));\n/**\n * Exec a command.\n * Output will be streamed to the live console.\n * Returns promise with return code\n *\n * @param commandLine command to execute (can include additional args). Must be correctly escaped.\n * @param args optional arguments for tool. Escaping is handled by the lib.\n * @param options optional exec options. See ExecOptions\n * @returns Promise exit code\n */\nfunction exec(commandLine, args, options) {\n return __awaiter(this, void 0, void 0, function* () {\n const commandArgs = tr.argStringToArray(commandLine);\n if (commandArgs.length === 0) {\n throw new Error(`Parameter 'commandLine' cannot be null or empty.`);\n }\n // Path to tool to execute should be first arg\n const toolPath = commandArgs[0];\n args = commandArgs.slice(1).concat(args || []);\n const runner = new tr.ToolRunner(toolPath, args, options);\n return runner.exec();\n });\n}\nexports.exec = exec;\n//# sourceMappingURL=exec.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst os = __importStar(require(\"os\"));\nconst events = __importStar(require(\"events\"));\nconst child = __importStar(require(\"child_process\"));\nconst path = __importStar(require(\"path\"));\nconst io = __importStar(require(\"@actions/io\"));\nconst ioUtil = __importStar(require(\"@actions/io/lib/io-util\"));\n/* eslint-disable @typescript-eslint/unbound-method */\nconst IS_WINDOWS = process.platform === 'win32';\n/*\n * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way.\n */\nclass ToolRunner extends events.EventEmitter {\n constructor(toolPath, args, options) {\n super();\n if (!toolPath) {\n throw new Error(\"Parameter 'toolPath' cannot be null or empty.\");\n }\n this.toolPath = toolPath;\n this.args = args || [];\n this.options = options || {};\n }\n _debug(message) {\n if (this.options.listeners && this.options.listeners.debug) {\n this.options.listeners.debug(message);\n }\n }\n _getCommandString(options, noPrefix) {\n const toolPath = this._getSpawnFileName();\n const args = this._getSpawnArgs(options);\n let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool\n if (IS_WINDOWS) {\n // Windows + cmd file\n if (this._isCmdFile()) {\n cmd += toolPath;\n for (const a of args) {\n cmd += ` ${a}`;\n }\n }\n // Windows + verbatim\n else if (options.windowsVerbatimArguments) {\n cmd += `\"${toolPath}\"`;\n for (const a of args) {\n cmd += ` ${a}`;\n }\n }\n // Windows (regular)\n else {\n cmd += this._windowsQuoteCmdArg(toolPath);\n for (const a of args) {\n cmd += ` ${this._windowsQuoteCmdArg(a)}`;\n }\n }\n }\n else {\n // OSX/Linux - this can likely be improved with some form of quoting.\n // creating processes on Unix is fundamentally different than Windows.\n // on Unix, execvp() takes an arg array.\n cmd += toolPath;\n for (const a of args) {\n cmd += ` ${a}`;\n }\n }\n return cmd;\n }\n _processLineBuffer(data, strBuffer, onLine) {\n try {\n let s = strBuffer + data.toString();\n let n = s.indexOf(os.EOL);\n while (n > -1) {\n const line = s.substring(0, n);\n onLine(line);\n // the rest of the string ...\n s = s.substring(n + os.EOL.length);\n n = s.indexOf(os.EOL);\n }\n strBuffer = s;\n }\n catch (err) {\n // streaming lines to console is best effort. Don't fail a build.\n this._debug(`error processing line. Failed with error ${err}`);\n }\n }\n _getSpawnFileName() {\n if (IS_WINDOWS) {\n if (this._isCmdFile()) {\n return process.env['COMSPEC'] || 'cmd.exe';\n }\n }\n return this.toolPath;\n }\n _getSpawnArgs(options) {\n if (IS_WINDOWS) {\n if (this._isCmdFile()) {\n let argline = `/D /S /C \"${this._windowsQuoteCmdArg(this.toolPath)}`;\n for (const a of this.args) {\n argline += ' ';\n argline += options.windowsVerbatimArguments\n ? a\n : this._windowsQuoteCmdArg(a);\n }\n argline += '\"';\n return [argline];\n }\n }\n return this.args;\n }\n _endsWith(str, end) {\n return str.endsWith(end);\n }\n _isCmdFile() {\n const upperToolPath = this.toolPath.toUpperCase();\n return (this._endsWith(upperToolPath, '.CMD') ||\n this._endsWith(upperToolPath, '.BAT'));\n }\n _windowsQuoteCmdArg(arg) {\n // for .exe, apply the normal quoting rules that libuv applies\n if (!this._isCmdFile()) {\n return this._uvQuoteCmdArg(arg);\n }\n // otherwise apply quoting rules specific to the cmd.exe command line parser.\n // the libuv rules are generic and are not designed specifically for cmd.exe\n // command line parser.\n //\n // for a detailed description of the cmd.exe command line parser, refer to\n // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912\n // need quotes for empty arg\n if (!arg) {\n return '\"\"';\n }\n // determine whether the arg needs to be quoted\n const cmdSpecialChars = [\n ' ',\n '\\t',\n '&',\n '(',\n ')',\n '[',\n ']',\n '{',\n '}',\n '^',\n '=',\n ';',\n '!',\n \"'\",\n '+',\n ',',\n '`',\n '~',\n '|',\n '<',\n '>',\n '\"'\n ];\n let needsQuotes = false;\n for (const char of arg) {\n if (cmdSpecialChars.some(x => x === char)) {\n needsQuotes = true;\n break;\n }\n }\n // short-circuit if quotes not needed\n if (!needsQuotes) {\n return arg;\n }\n // the following quoting rules are very similar to the rules that by libuv applies.\n //\n // 1) wrap the string in quotes\n //\n // 2) double-up quotes - i.e. \" => \"\"\n //\n // this is different from the libuv quoting rules. libuv replaces \" with \\\", which unfortunately\n // doesn't work well with a cmd.exe command line.\n //\n // note, replacing \" with \"\" also works well if the arg is passed to a downstream .NET console app.\n // for example, the command line:\n // foo.exe \"myarg:\"\"my val\"\"\"\n // is parsed by a .NET console app into an arg array:\n // [ \"myarg:\\\"my val\\\"\" ]\n // which is the same end result when applying libuv quoting rules. although the actual\n // command line from libuv quoting rules would look like:\n // foo.exe \"myarg:\\\"my val\\\"\"\n //\n // 3) double-up slashes that precede a quote,\n // e.g. hello \\world => \"hello \\world\"\n // hello\\\"world => \"hello\\\\\"\"world\"\n // hello\\\\\"world => \"hello\\\\\\\\\"\"world\"\n // hello world\\ => \"hello world\\\\\"\n //\n // technically this is not required for a cmd.exe command line, or the batch argument parser.\n // the reasons for including this as a .cmd quoting rule are:\n //\n // a) this is optimized for the scenario where the argument is passed from the .cmd file to an\n // external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule.\n //\n // b) it's what we've been doing previously (by deferring to node default behavior) and we\n // haven't heard any complaints about that aspect.\n //\n // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be\n // escaped when used on the command line directly - even though within a .cmd file % can be escaped\n // by using %%.\n //\n // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts\n // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing.\n //\n // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would\n // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the\n // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args\n // to an external program.\n //\n // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file.\n // % can be escaped within a .cmd file.\n let reverse = '\"';\n let quoteHit = true;\n for (let i = arg.length; i > 0; i--) {\n // walk the string in reverse\n reverse += arg[i - 1];\n if (quoteHit && arg[i - 1] === '\\\\') {\n reverse += '\\\\'; // double the slash\n }\n else if (arg[i - 1] === '\"') {\n quoteHit = true;\n reverse += '\"'; // double the quote\n }\n else {\n quoteHit = false;\n }\n }\n reverse += '\"';\n return reverse\n .split('')\n .reverse()\n .join('');\n }\n _uvQuoteCmdArg(arg) {\n // Tool runner wraps child_process.spawn() and needs to apply the same quoting as\n // Node in certain cases where the undocumented spawn option windowsVerbatimArguments\n // is used.\n //\n // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV,\n // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details),\n // pasting copyright notice from Node within this function:\n //\n // Copyright Joyent, Inc. and other Node contributors. All rights reserved.\n //\n // Permission is hereby granted, free of charge, to any person obtaining a copy\n // of this software and associated documentation files (the \"Software\"), to\n // deal in the Software without restriction, including without limitation the\n // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n // sell copies of the Software, and to permit persons to whom the Software is\n // furnished to do so, subject to the following conditions:\n //\n // The above copyright notice and this permission notice shall be included in\n // all copies or substantial portions of the Software.\n //\n // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n // IN THE SOFTWARE.\n if (!arg) {\n // Need double quotation for empty argument\n return '\"\"';\n }\n if (!arg.includes(' ') && !arg.includes('\\t') && !arg.includes('\"')) {\n // No quotation needed\n return arg;\n }\n if (!arg.includes('\"') && !arg.includes('\\\\')) {\n // No embedded double quotes or backslashes, so I can just wrap\n // quote marks around the whole thing.\n return `\"${arg}\"`;\n }\n // Expected input/output:\n // input : hello\"world\n // output: \"hello\\\"world\"\n // input : hello\"\"world\n // output: \"hello\\\"\\\"world\"\n // input : hello\\world\n // output: hello\\world\n // input : hello\\\\world\n // output: hello\\\\world\n // input : hello\\\"world\n // output: \"hello\\\\\\\"world\"\n // input : hello\\\\\"world\n // output: \"hello\\\\\\\\\\\"world\"\n // input : hello world\\\n // output: \"hello world\\\\\" - note the comment in libuv actually reads \"hello world\\\"\n // but it appears the comment is wrong, it should be \"hello world\\\\\"\n let reverse = '\"';\n let quoteHit = true;\n for (let i = arg.length; i > 0; i--) {\n // walk the string in reverse\n reverse += arg[i - 1];\n if (quoteHit && arg[i - 1] === '\\\\') {\n reverse += '\\\\';\n }\n else if (arg[i - 1] === '\"') {\n quoteHit = true;\n reverse += '\\\\';\n }\n else {\n quoteHit = false;\n }\n }\n reverse += '\"';\n return reverse\n .split('')\n .reverse()\n .join('');\n }\n _cloneExecOptions(options) {\n options = options || {};\n const result = {\n cwd: options.cwd || process.cwd(),\n env: options.env || process.env,\n silent: options.silent || false,\n windowsVerbatimArguments: options.windowsVerbatimArguments || false,\n failOnStdErr: options.failOnStdErr || false,\n ignoreReturnCode: options.ignoreReturnCode || false,\n delay: options.delay || 10000\n };\n result.outStream = options.outStream || process.stdout;\n result.errStream = options.errStream || process.stderr;\n return result;\n }\n _getSpawnOptions(options, toolPath) {\n options = options || {};\n const result = {};\n result.cwd = options.cwd;\n result.env = options.env;\n result['windowsVerbatimArguments'] =\n options.windowsVerbatimArguments || this._isCmdFile();\n if (options.windowsVerbatimArguments) {\n result.argv0 = `\"${toolPath}\"`;\n }\n return result;\n }\n /**\n * Exec a tool.\n * Output will be streamed to the live console.\n * Returns promise with return code\n *\n * @param tool path to tool to exec\n * @param options optional exec options. See ExecOptions\n * @returns number\n */\n exec() {\n return __awaiter(this, void 0, void 0, function* () {\n // root the tool path if it is unrooted and contains relative pathing\n if (!ioUtil.isRooted(this.toolPath) &&\n (this.toolPath.includes('/') ||\n (IS_WINDOWS && this.toolPath.includes('\\\\')))) {\n // prefer options.cwd if it is specified, however options.cwd may also need to be rooted\n this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath);\n }\n // if the tool is only a file name, then resolve it from the PATH\n // otherwise verify it exists (add extension on Windows if necessary)\n this.toolPath = yield io.which(this.toolPath, true);\n return new Promise((resolve, reject) => {\n this._debug(`exec tool: ${this.toolPath}`);\n this._debug('arguments:');\n for (const arg of this.args) {\n this._debug(` ${arg}`);\n }\n const optionsNonNull = this._cloneExecOptions(this.options);\n if (!optionsNonNull.silent && optionsNonNull.outStream) {\n optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL);\n }\n const state = new ExecState(optionsNonNull, this.toolPath);\n state.on('debug', (message) => {\n this._debug(message);\n });\n const fileName = this._getSpawnFileName();\n const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName));\n const stdbuffer = '';\n if (cp.stdout) {\n cp.stdout.on('data', (data) => {\n if (this.options.listeners && this.options.listeners.stdout) {\n this.options.listeners.stdout(data);\n }\n if (!optionsNonNull.silent && optionsNonNull.outStream) {\n optionsNonNull.outStream.write(data);\n }\n this._processLineBuffer(data, stdbuffer, (line) => {\n if (this.options.listeners && this.options.listeners.stdline) {\n this.options.listeners.stdline(line);\n }\n });\n });\n }\n const errbuffer = '';\n if (cp.stderr) {\n cp.stderr.on('data', (data) => {\n state.processStderr = true;\n if (this.options.listeners && this.options.listeners.stderr) {\n this.options.listeners.stderr(data);\n }\n if (!optionsNonNull.silent &&\n optionsNonNull.errStream &&\n optionsNonNull.outStream) {\n const s = optionsNonNull.failOnStdErr\n ? optionsNonNull.errStream\n : optionsNonNull.outStream;\n s.write(data);\n }\n this._processLineBuffer(data, errbuffer, (line) => {\n if (this.options.listeners && this.options.listeners.errline) {\n this.options.listeners.errline(line);\n }\n });\n });\n }\n cp.on('error', (err) => {\n state.processError = err.message;\n state.processExited = true;\n state.processClosed = true;\n state.CheckComplete();\n });\n cp.on('exit', (code) => {\n state.processExitCode = code;\n state.processExited = true;\n this._debug(`Exit code ${code} received from tool '${this.toolPath}'`);\n state.CheckComplete();\n });\n cp.on('close', (code) => {\n state.processExitCode = code;\n state.processExited = true;\n state.processClosed = true;\n this._debug(`STDIO streams have closed for tool '${this.toolPath}'`);\n state.CheckComplete();\n });\n state.on('done', (error, exitCode) => {\n if (stdbuffer.length > 0) {\n this.emit('stdline', stdbuffer);\n }\n if (errbuffer.length > 0) {\n this.emit('errline', errbuffer);\n }\n cp.removeAllListeners();\n if (error) {\n reject(error);\n }\n else {\n resolve(exitCode);\n }\n });\n if (this.options.input) {\n if (!cp.stdin) {\n throw new Error('child process missing stdin');\n }\n cp.stdin.end(this.options.input);\n }\n });\n });\n }\n}\nexports.ToolRunner = ToolRunner;\n/**\n * Convert an arg string to an array of args. Handles escaping\n *\n * @param argString string of arguments\n * @returns string[] array of arguments\n */\nfunction argStringToArray(argString) {\n const args = [];\n let inQuotes = false;\n let escaped = false;\n let arg = '';\n function append(c) {\n // we only escape double quotes.\n if (escaped && c !== '\"') {\n arg += '\\\\';\n }\n arg += c;\n escaped = false;\n }\n for (let i = 0; i < argString.length; i++) {\n const c = argString.charAt(i);\n if (c === '\"') {\n if (!escaped) {\n inQuotes = !inQuotes;\n }\n else {\n append(c);\n }\n continue;\n }\n if (c === '\\\\' && escaped) {\n append(c);\n continue;\n }\n if (c === '\\\\' && inQuotes) {\n escaped = true;\n continue;\n }\n if (c === ' ' && !inQuotes) {\n if (arg.length > 0) {\n args.push(arg);\n arg = '';\n }\n continue;\n }\n append(c);\n }\n if (arg.length > 0) {\n args.push(arg.trim());\n }\n return args;\n}\nexports.argStringToArray = argStringToArray;\nclass ExecState extends events.EventEmitter {\n constructor(options, toolPath) {\n super();\n this.processClosed = false; // tracks whether the process has exited and stdio is closed\n this.processError = '';\n this.processExitCode = 0;\n this.processExited = false; // tracks whether the process has exited\n this.processStderr = false; // tracks whether stderr was written to\n this.delay = 10000; // 10 seconds\n this.done = false;\n this.timeout = null;\n if (!toolPath) {\n throw new Error('toolPath must not be empty');\n }\n this.options = options;\n this.toolPath = toolPath;\n if (options.delay) {\n this.delay = options.delay;\n }\n }\n CheckComplete() {\n if (this.done) {\n return;\n }\n if (this.processClosed) {\n this._setResult();\n }\n else if (this.processExited) {\n this.timeout = setTimeout(ExecState.HandleTimeout, this.delay, this);\n }\n }\n _debug(message) {\n this.emit('debug', message);\n }\n _setResult() {\n // determine whether there is an error\n let error;\n if (this.processExited) {\n if (this.processError) {\n error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`);\n }\n else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) {\n error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`);\n }\n else if (this.processStderr && this.options.failOnStdErr) {\n error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`);\n }\n }\n // clear the timeout\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n this.done = true;\n this.emit('done', error, this.processExitCode);\n }\n static HandleTimeout(state) {\n if (state.done) {\n return;\n }\n if (!state.processClosed && state.processExited) {\n const message = `The STDIO streams did not close within ${state.delay /\n 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;\n state._debug(message);\n }\n state._setResult();\n }\n}\n//# sourceMappingURL=toolrunner.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Context = void 0;\nconst fs_1 = require(\"fs\");\nconst os_1 = require(\"os\");\nclass Context {\n /**\n * Hydrate the context from the environment\n */\n constructor() {\n this.payload = {};\n if (process.env.GITHUB_EVENT_PATH) {\n if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) {\n this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' }));\n }\n else {\n const path = process.env.GITHUB_EVENT_PATH;\n process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`);\n }\n }\n this.eventName = process.env.GITHUB_EVENT_NAME;\n this.sha = process.env.GITHUB_SHA;\n this.ref = process.env.GITHUB_REF;\n this.workflow = process.env.GITHUB_WORKFLOW;\n this.action = process.env.GITHUB_ACTION;\n this.actor = process.env.GITHUB_ACTOR;\n this.job = process.env.GITHUB_JOB;\n this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10);\n this.runId = parseInt(process.env.GITHUB_RUN_ID, 10);\n }\n get issue() {\n const payload = this.payload;\n return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number });\n }\n get repo() {\n if (process.env.GITHUB_REPOSITORY) {\n const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');\n return { owner, repo };\n }\n if (this.payload.repository) {\n return {\n owner: this.payload.repository.owner.login,\n repo: this.payload.repository.name\n };\n }\n throw new Error(\"context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'\");\n }\n}\nexports.Context = Context;\n//# sourceMappingURL=context.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getOctokit = exports.context = void 0;\nconst Context = __importStar(require(\"./context\"));\nconst utils_1 = require(\"./utils\");\nexports.context = new Context.Context();\n/**\n * Returns a hydrated octokit ready to use for GitHub Actions\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokit(token, options) {\n return new utils_1.GitHub(utils_1.getOctokitOptions(token, options));\n}\nexports.getOctokit = getOctokit;\n//# sourceMappingURL=github.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getApiBaseUrl = exports.getProxyAgent = exports.getAuthString = void 0;\nconst httpClient = __importStar(require(\"@actions/http-client\"));\nfunction getAuthString(token, options) {\n if (!token && !options.auth) {\n throw new Error('Parameter token or opts.auth is required');\n }\n else if (token && options.auth) {\n throw new Error('Parameters token and opts.auth may not both be specified');\n }\n return typeof options.auth === 'string' ? options.auth : `token ${token}`;\n}\nexports.getAuthString = getAuthString;\nfunction getProxyAgent(destinationUrl) {\n const hc = new httpClient.HttpClient();\n return hc.getAgent(destinationUrl);\n}\nexports.getProxyAgent = getProxyAgent;\nfunction getApiBaseUrl() {\n return process.env['GITHUB_API_URL'] || 'https://api.github.com';\n}\nexports.getApiBaseUrl = getApiBaseUrl;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getOctokitOptions = exports.GitHub = exports.context = void 0;\nconst Context = __importStar(require(\"./context\"));\nconst Utils = __importStar(require(\"./internal/utils\"));\n// octokit + plugins\nconst core_1 = require(\"@octokit/core\");\nconst plugin_rest_endpoint_methods_1 = require(\"@octokit/plugin-rest-endpoint-methods\");\nconst plugin_paginate_rest_1 = require(\"@octokit/plugin-paginate-rest\");\nexports.context = new Context.Context();\nconst baseUrl = Utils.getApiBaseUrl();\nconst defaults = {\n baseUrl,\n request: {\n agent: Utils.getProxyAgent(baseUrl)\n }\n};\nexports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);\n/**\n * Convience function to correctly format Octokit Options to pass into the constructor.\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokitOptions(token, options) {\n const opts = Object.assign({}, options || {}); // Shallow clone - don't mutate the object provided by the caller\n // Auth\n const auth = Utils.getAuthString(token, opts);\n if (auth) {\n opts.auth = auth;\n }\n return opts;\n}\nexports.getOctokitOptions = getOctokitOptions;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst http = require(\"http\");\nconst https = require(\"https\");\nconst pm = require(\"./proxy\");\nlet tunnel;\nvar HttpCodes;\n(function (HttpCodes) {\n HttpCodes[HttpCodes[\"OK\"] = 200] = \"OK\";\n HttpCodes[HttpCodes[\"MultipleChoices\"] = 300] = \"MultipleChoices\";\n HttpCodes[HttpCodes[\"MovedPermanently\"] = 301] = \"MovedPermanently\";\n HttpCodes[HttpCodes[\"ResourceMoved\"] = 302] = \"ResourceMoved\";\n HttpCodes[HttpCodes[\"SeeOther\"] = 303] = \"SeeOther\";\n HttpCodes[HttpCodes[\"NotModified\"] = 304] = \"NotModified\";\n HttpCodes[HttpCodes[\"UseProxy\"] = 305] = \"UseProxy\";\n HttpCodes[HttpCodes[\"SwitchProxy\"] = 306] = \"SwitchProxy\";\n HttpCodes[HttpCodes[\"TemporaryRedirect\"] = 307] = \"TemporaryRedirect\";\n HttpCodes[HttpCodes[\"PermanentRedirect\"] = 308] = \"PermanentRedirect\";\n HttpCodes[HttpCodes[\"BadRequest\"] = 400] = \"BadRequest\";\n HttpCodes[HttpCodes[\"Unauthorized\"] = 401] = \"Unauthorized\";\n HttpCodes[HttpCodes[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\n HttpCodes[HttpCodes[\"Forbidden\"] = 403] = \"Forbidden\";\n HttpCodes[HttpCodes[\"NotFound\"] = 404] = \"NotFound\";\n HttpCodes[HttpCodes[\"MethodNotAllowed\"] = 405] = \"MethodNotAllowed\";\n HttpCodes[HttpCodes[\"NotAcceptable\"] = 406] = \"NotAcceptable\";\n HttpCodes[HttpCodes[\"ProxyAuthenticationRequired\"] = 407] = \"ProxyAuthenticationRequired\";\n HttpCodes[HttpCodes[\"RequestTimeout\"] = 408] = \"RequestTimeout\";\n HttpCodes[HttpCodes[\"Conflict\"] = 409] = \"Conflict\";\n HttpCodes[HttpCodes[\"Gone\"] = 410] = \"Gone\";\n HttpCodes[HttpCodes[\"TooManyRequests\"] = 429] = \"TooManyRequests\";\n HttpCodes[HttpCodes[\"InternalServerError\"] = 500] = \"InternalServerError\";\n HttpCodes[HttpCodes[\"NotImplemented\"] = 501] = \"NotImplemented\";\n HttpCodes[HttpCodes[\"BadGateway\"] = 502] = \"BadGateway\";\n HttpCodes[HttpCodes[\"ServiceUnavailable\"] = 503] = \"ServiceUnavailable\";\n HttpCodes[HttpCodes[\"GatewayTimeout\"] = 504] = \"GatewayTimeout\";\n})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {}));\nvar Headers;\n(function (Headers) {\n Headers[\"Accept\"] = \"accept\";\n Headers[\"ContentType\"] = \"content-type\";\n})(Headers = exports.Headers || (exports.Headers = {}));\nvar MediaTypes;\n(function (MediaTypes) {\n MediaTypes[\"ApplicationJson\"] = \"application/json\";\n})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {}));\n/**\n * Returns the proxy URL, depending upon the supplied url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\nfunction getProxyUrl(serverUrl) {\n let proxyUrl = pm.getProxyUrl(new URL(serverUrl));\n return proxyUrl ? proxyUrl.href : '';\n}\nexports.getProxyUrl = getProxyUrl;\nconst HttpRedirectCodes = [\n HttpCodes.MovedPermanently,\n HttpCodes.ResourceMoved,\n HttpCodes.SeeOther,\n HttpCodes.TemporaryRedirect,\n HttpCodes.PermanentRedirect\n];\nconst HttpResponseRetryCodes = [\n HttpCodes.BadGateway,\n HttpCodes.ServiceUnavailable,\n HttpCodes.GatewayTimeout\n];\nconst RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];\nconst ExponentialBackoffCeiling = 10;\nconst ExponentialBackoffTimeSlice = 5;\nclass HttpClientError extends Error {\n constructor(message, statusCode) {\n super(message);\n this.name = 'HttpClientError';\n this.statusCode = statusCode;\n Object.setPrototypeOf(this, HttpClientError.prototype);\n }\n}\nexports.HttpClientError = HttpClientError;\nclass HttpClientResponse {\n constructor(message) {\n this.message = message;\n }\n readBody() {\n return new Promise(async (resolve, reject) => {\n let output = Buffer.alloc(0);\n this.message.on('data', (chunk) => {\n output = Buffer.concat([output, chunk]);\n });\n this.message.on('end', () => {\n resolve(output.toString());\n });\n });\n }\n}\nexports.HttpClientResponse = HttpClientResponse;\nfunction isHttps(requestUrl) {\n let parsedUrl = new URL(requestUrl);\n return parsedUrl.protocol === 'https:';\n}\nexports.isHttps = isHttps;\nclass HttpClient {\n constructor(userAgent, handlers, requestOptions) {\n this._ignoreSslError = false;\n this._allowRedirects = true;\n this._allowRedirectDowngrade = false;\n this._maxRedirects = 50;\n this._allowRetries = false;\n this._maxRetries = 1;\n this._keepAlive = false;\n this._disposed = false;\n this.userAgent = userAgent;\n this.handlers = handlers || [];\n this.requestOptions = requestOptions;\n if (requestOptions) {\n if (requestOptions.ignoreSslError != null) {\n this._ignoreSslError = requestOptions.ignoreSslError;\n }\n this._socketTimeout = requestOptions.socketTimeout;\n if (requestOptions.allowRedirects != null) {\n this._allowRedirects = requestOptions.allowRedirects;\n }\n if (requestOptions.allowRedirectDowngrade != null) {\n this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;\n }\n if (requestOptions.maxRedirects != null) {\n this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);\n }\n if (requestOptions.keepAlive != null) {\n this._keepAlive = requestOptions.keepAlive;\n }\n if (requestOptions.allowRetries != null) {\n this._allowRetries = requestOptions.allowRetries;\n }\n if (requestOptions.maxRetries != null) {\n this._maxRetries = requestOptions.maxRetries;\n }\n }\n }\n options(requestUrl, additionalHeaders) {\n return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});\n }\n get(requestUrl, additionalHeaders) {\n return this.request('GET', requestUrl, null, additionalHeaders || {});\n }\n del(requestUrl, additionalHeaders) {\n return this.request('DELETE', requestUrl, null, additionalHeaders || {});\n }\n post(requestUrl, data, additionalHeaders) {\n return this.request('POST', requestUrl, data, additionalHeaders || {});\n }\n patch(requestUrl, data, additionalHeaders) {\n return this.request('PATCH', requestUrl, data, additionalHeaders || {});\n }\n put(requestUrl, data, additionalHeaders) {\n return this.request('PUT', requestUrl, data, additionalHeaders || {});\n }\n head(requestUrl, additionalHeaders) {\n return this.request('HEAD', requestUrl, null, additionalHeaders || {});\n }\n sendStream(verb, requestUrl, stream, additionalHeaders) {\n return this.request(verb, requestUrl, stream, additionalHeaders);\n }\n /**\n * Gets a typed object from an endpoint\n * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise\n */\n async getJson(requestUrl, additionalHeaders = {}) {\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n let res = await this.get(requestUrl, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n }\n async postJson(requestUrl, obj, additionalHeaders = {}) {\n let data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n let res = await this.post(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n }\n async putJson(requestUrl, obj, additionalHeaders = {}) {\n let data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n let res = await this.put(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n }\n async patchJson(requestUrl, obj, additionalHeaders = {}) {\n let data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n let res = await this.patch(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n }\n /**\n * Makes a raw http request.\n * All other methods such as get, post, patch, and request ultimately call this.\n * Prefer get, del, post and patch\n */\n async request(verb, requestUrl, data, headers) {\n if (this._disposed) {\n throw new Error('Client has already been disposed.');\n }\n let parsedUrl = new URL(requestUrl);\n let info = this._prepareRequest(verb, parsedUrl, headers);\n // Only perform retries on reads since writes may not be idempotent.\n let maxTries = this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1\n ? this._maxRetries + 1\n : 1;\n let numTries = 0;\n let response;\n while (numTries < maxTries) {\n response = await this.requestRaw(info, data);\n // Check if it's an authentication challenge\n if (response &&\n response.message &&\n response.message.statusCode === HttpCodes.Unauthorized) {\n let authenticationHandler;\n for (let i = 0; i < this.handlers.length; i++) {\n if (this.handlers[i].canHandleAuthentication(response)) {\n authenticationHandler = this.handlers[i];\n break;\n }\n }\n if (authenticationHandler) {\n return authenticationHandler.handleAuthentication(this, info, data);\n }\n else {\n // We have received an unauthorized response but have no handlers to handle it.\n // Let the response return to the caller.\n return response;\n }\n }\n let redirectsRemaining = this._maxRedirects;\n while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 &&\n this._allowRedirects &&\n redirectsRemaining > 0) {\n const redirectUrl = response.message.headers['location'];\n if (!redirectUrl) {\n // if there's no location to redirect to, we won't\n break;\n }\n let parsedRedirectUrl = new URL(redirectUrl);\n if (parsedUrl.protocol == 'https:' &&\n parsedUrl.protocol != parsedRedirectUrl.protocol &&\n !this._allowRedirectDowngrade) {\n throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.');\n }\n // we need to finish reading the response before reassigning response\n // which will leak the open socket.\n await response.readBody();\n // strip authorization header if redirected to a different hostname\n if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {\n for (let header in headers) {\n // header names are case insensitive\n if (header.toLowerCase() === 'authorization') {\n delete headers[header];\n }\n }\n }\n // let's make the request with the new redirectUrl\n info = this._prepareRequest(verb, parsedRedirectUrl, headers);\n response = await this.requestRaw(info, data);\n redirectsRemaining--;\n }\n if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) {\n // If not a retry code, return immediately instead of retrying\n return response;\n }\n numTries += 1;\n if (numTries < maxTries) {\n await response.readBody();\n await this._performExponentialBackoff(numTries);\n }\n }\n return response;\n }\n /**\n * Needs to be called if keepAlive is set to true in request options.\n */\n dispose() {\n if (this._agent) {\n this._agent.destroy();\n }\n this._disposed = true;\n }\n /**\n * Raw request.\n * @param info\n * @param data\n */\n requestRaw(info, data) {\n return new Promise((resolve, reject) => {\n let callbackForResult = function (err, res) {\n if (err) {\n reject(err);\n }\n resolve(res);\n };\n this.requestRawWithCallback(info, data, callbackForResult);\n });\n }\n /**\n * Raw request with callback.\n * @param info\n * @param data\n * @param onResult\n */\n requestRawWithCallback(info, data, onResult) {\n let socket;\n if (typeof data === 'string') {\n info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');\n }\n let callbackCalled = false;\n let handleResult = (err, res) => {\n if (!callbackCalled) {\n callbackCalled = true;\n onResult(err, res);\n }\n };\n let req = info.httpModule.request(info.options, (msg) => {\n let res = new HttpClientResponse(msg);\n handleResult(null, res);\n });\n req.on('socket', sock => {\n socket = sock;\n });\n // If we ever get disconnected, we want the socket to timeout eventually\n req.setTimeout(this._socketTimeout || 3 * 60000, () => {\n if (socket) {\n socket.end();\n }\n handleResult(new Error('Request timeout: ' + info.options.path), null);\n });\n req.on('error', function (err) {\n // err has statusCode property\n // res should have headers\n handleResult(err, null);\n });\n if (data && typeof data === 'string') {\n req.write(data, 'utf8');\n }\n if (data && typeof data !== 'string') {\n data.on('close', function () {\n req.end();\n });\n data.pipe(req);\n }\n else {\n req.end();\n }\n }\n /**\n * Gets an http agent. This function is useful when you need an http agent that handles\n * routing through a proxy server - depending upon the url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\n getAgent(serverUrl) {\n let parsedUrl = new URL(serverUrl);\n return this._getAgent(parsedUrl);\n }\n _prepareRequest(method, requestUrl, headers) {\n const info = {};\n info.parsedUrl = requestUrl;\n const usingSsl = info.parsedUrl.protocol === 'https:';\n info.httpModule = usingSsl ? https : http;\n const defaultPort = usingSsl ? 443 : 80;\n info.options = {};\n info.options.host = info.parsedUrl.hostname;\n info.options.port = info.parsedUrl.port\n ? parseInt(info.parsedUrl.port)\n : defaultPort;\n info.options.path =\n (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');\n info.options.method = method;\n info.options.headers = this._mergeHeaders(headers);\n if (this.userAgent != null) {\n info.options.headers['user-agent'] = this.userAgent;\n }\n info.options.agent = this._getAgent(info.parsedUrl);\n // gives handlers an opportunity to participate\n if (this.handlers) {\n this.handlers.forEach(handler => {\n handler.prepareRequest(info.options);\n });\n }\n return info;\n }\n _mergeHeaders(headers) {\n const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\n if (this.requestOptions && this.requestOptions.headers) {\n return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers));\n }\n return lowercaseKeys(headers || {});\n }\n _getExistingOrDefaultHeader(additionalHeaders, header, _default) {\n const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\n let clientHeader;\n if (this.requestOptions && this.requestOptions.headers) {\n clientHeader = lowercaseKeys(this.requestOptions.headers)[header];\n }\n return additionalHeaders[header] || clientHeader || _default;\n }\n _getAgent(parsedUrl) {\n let agent;\n let proxyUrl = pm.getProxyUrl(parsedUrl);\n let useProxy = proxyUrl && proxyUrl.hostname;\n if (this._keepAlive && useProxy) {\n agent = this._proxyAgent;\n }\n if (this._keepAlive && !useProxy) {\n agent = this._agent;\n }\n // if agent is already assigned use that agent.\n if (!!agent) {\n return agent;\n }\n const usingSsl = parsedUrl.protocol === 'https:';\n let maxSockets = 100;\n if (!!this.requestOptions) {\n maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;\n }\n if (useProxy) {\n // If using proxy, need tunnel\n if (!tunnel) {\n tunnel = require('tunnel');\n }\n const agentOptions = {\n maxSockets: maxSockets,\n keepAlive: this._keepAlive,\n proxy: {\n proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`,\n host: proxyUrl.hostname,\n port: proxyUrl.port\n }\n };\n let tunnelAgent;\n const overHttps = proxyUrl.protocol === 'https:';\n if (usingSsl) {\n tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;\n }\n else {\n tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;\n }\n agent = tunnelAgent(agentOptions);\n this._proxyAgent = agent;\n }\n // if reusing agent across request and tunneling agent isn't assigned create a new agent\n if (this._keepAlive && !agent) {\n const options = { keepAlive: this._keepAlive, maxSockets: maxSockets };\n agent = usingSsl ? new https.Agent(options) : new http.Agent(options);\n this._agent = agent;\n }\n // if not using private agent and tunnel agent isn't setup then use global agent\n if (!agent) {\n agent = usingSsl ? https.globalAgent : http.globalAgent;\n }\n if (usingSsl && this._ignoreSslError) {\n // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n agent.options = Object.assign(agent.options || {}, {\n rejectUnauthorized: false\n });\n }\n return agent;\n }\n _performExponentialBackoff(retryNumber) {\n retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);\n const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);\n return new Promise(resolve => setTimeout(() => resolve(), ms));\n }\n static dateTimeDeserializer(key, value) {\n if (typeof value === 'string') {\n let a = new Date(value);\n if (!isNaN(a.valueOf())) {\n return a;\n }\n }\n return value;\n }\n async _processResponse(res, options) {\n return new Promise(async (resolve, reject) => {\n const statusCode = res.message.statusCode;\n const response = {\n statusCode: statusCode,\n result: null,\n headers: {}\n };\n // not found leads to null obj returned\n if (statusCode == HttpCodes.NotFound) {\n resolve(response);\n }\n let obj;\n let contents;\n // get the result from the body\n try {\n contents = await res.readBody();\n if (contents && contents.length > 0) {\n if (options && options.deserializeDates) {\n obj = JSON.parse(contents, HttpClient.dateTimeDeserializer);\n }\n else {\n obj = JSON.parse(contents);\n }\n response.result = obj;\n }\n response.headers = res.message.headers;\n }\n catch (err) {\n // Invalid resource (contents not json); leaving result obj null\n }\n // note that 3xx redirects are handled by the http layer.\n if (statusCode > 299) {\n let msg;\n // if exception/error in body, attempt to get better error\n if (obj && obj.message) {\n msg = obj.message;\n }\n else if (contents && contents.length > 0) {\n // it may be the case that the exception is in the body message as string\n msg = contents;\n }\n else {\n msg = 'Failed request: (' + statusCode + ')';\n }\n let err = new HttpClientError(msg, statusCode);\n err.result = response.result;\n reject(err);\n }\n else {\n resolve(response);\n }\n });\n }\n}\nexports.HttpClient = HttpClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction getProxyUrl(reqUrl) {\n let usingSsl = reqUrl.protocol === 'https:';\n let proxyUrl;\n if (checkBypass(reqUrl)) {\n return proxyUrl;\n }\n let proxyVar;\n if (usingSsl) {\n proxyVar = process.env['https_proxy'] || process.env['HTTPS_PROXY'];\n }\n else {\n proxyVar = process.env['http_proxy'] || process.env['HTTP_PROXY'];\n }\n if (proxyVar) {\n proxyUrl = new URL(proxyVar);\n }\n return proxyUrl;\n}\nexports.getProxyUrl = getProxyUrl;\nfunction checkBypass(reqUrl) {\n if (!reqUrl.hostname) {\n return false;\n }\n let noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';\n if (!noProxy) {\n return false;\n }\n // Determine the request port\n let reqPort;\n if (reqUrl.port) {\n reqPort = Number(reqUrl.port);\n }\n else if (reqUrl.protocol === 'http:') {\n reqPort = 80;\n }\n else if (reqUrl.protocol === 'https:') {\n reqPort = 443;\n }\n // Format the request hostname and hostname with port\n let upperReqHosts = [reqUrl.hostname.toUpperCase()];\n if (typeof reqPort === 'number') {\n upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);\n }\n // Compare request host against noproxy\n for (let upperNoProxyItem of noProxy\n .split(',')\n .map(x => x.trim().toUpperCase())\n .filter(x => x)) {\n if (upperReqHosts.some(x => x === upperNoProxyItem)) {\n return true;\n }\n }\n return false;\n}\nexports.checkBypass = checkBypass;\n","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar _a;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst assert_1 = require(\"assert\");\nconst fs = require(\"fs\");\nconst path = require(\"path\");\n_a = fs.promises, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink;\nexports.IS_WINDOWS = process.platform === 'win32';\nfunction exists(fsPath) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield exports.stat(fsPath);\n }\n catch (err) {\n if (err.code === 'ENOENT') {\n return false;\n }\n throw err;\n }\n return true;\n });\n}\nexports.exists = exists;\nfunction isDirectory(fsPath, useStat = false) {\n return __awaiter(this, void 0, void 0, function* () {\n const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath);\n return stats.isDirectory();\n });\n}\nexports.isDirectory = isDirectory;\n/**\n * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like:\n * \\, \\hello, \\\\hello\\share, C:, and C:\\hello (and corresponding alternate separator cases).\n */\nfunction isRooted(p) {\n p = normalizeSeparators(p);\n if (!p) {\n throw new Error('isRooted() parameter \"p\" cannot be empty');\n }\n if (exports.IS_WINDOWS) {\n return (p.startsWith('\\\\') || /^[A-Z]:/i.test(p) // e.g. \\ or \\hello or \\\\hello\n ); // e.g. C: or C:\\hello\n }\n return p.startsWith('/');\n}\nexports.isRooted = isRooted;\n/**\n * Recursively create a directory at `fsPath`.\n *\n * This implementation is optimistic, meaning it attempts to create the full\n * path first, and backs up the path stack from there.\n *\n * @param fsPath The path to create\n * @param maxDepth The maximum recursion depth\n * @param depth The current recursion depth\n */\nfunction mkdirP(fsPath, maxDepth = 1000, depth = 1) {\n return __awaiter(this, void 0, void 0, function* () {\n assert_1.ok(fsPath, 'a path argument must be provided');\n fsPath = path.resolve(fsPath);\n if (depth >= maxDepth)\n return exports.mkdir(fsPath);\n try {\n yield exports.mkdir(fsPath);\n return;\n }\n catch (err) {\n switch (err.code) {\n case 'ENOENT': {\n yield mkdirP(path.dirname(fsPath), maxDepth, depth + 1);\n yield exports.mkdir(fsPath);\n return;\n }\n default: {\n let stats;\n try {\n stats = yield exports.stat(fsPath);\n }\n catch (err2) {\n throw err;\n }\n if (!stats.isDirectory())\n throw err;\n }\n }\n }\n });\n}\nexports.mkdirP = mkdirP;\n/**\n * Best effort attempt to determine whether a file exists and is executable.\n * @param filePath file path to check\n * @param extensions additional file extensions to try\n * @return if file exists and is executable, returns the file path. otherwise empty string.\n */\nfunction tryGetExecutablePath(filePath, extensions) {\n return __awaiter(this, void 0, void 0, function* () {\n let stats = undefined;\n try {\n // test file exists\n stats = yield exports.stat(filePath);\n }\n catch (err) {\n if (err.code !== 'ENOENT') {\n // eslint-disable-next-line no-console\n console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);\n }\n }\n if (stats && stats.isFile()) {\n if (exports.IS_WINDOWS) {\n // on Windows, test for valid extension\n const upperExt = path.extname(filePath).toUpperCase();\n if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) {\n return filePath;\n }\n }\n else {\n if (isUnixExecutable(stats)) {\n return filePath;\n }\n }\n }\n // try each extension\n const originalFilePath = filePath;\n for (const extension of extensions) {\n filePath = originalFilePath + extension;\n stats = undefined;\n try {\n stats = yield exports.stat(filePath);\n }\n catch (err) {\n if (err.code !== 'ENOENT') {\n // eslint-disable-next-line no-console\n console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);\n }\n }\n if (stats && stats.isFile()) {\n if (exports.IS_WINDOWS) {\n // preserve the case of the actual file (since an extension was appended)\n try {\n const directory = path.dirname(filePath);\n const upperName = path.basename(filePath).toUpperCase();\n for (const actualName of yield exports.readdir(directory)) {\n if (upperName === actualName.toUpperCase()) {\n filePath = path.join(directory, actualName);\n break;\n }\n }\n }\n catch (err) {\n // eslint-disable-next-line no-console\n console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`);\n }\n return filePath;\n }\n else {\n if (isUnixExecutable(stats)) {\n return filePath;\n }\n }\n }\n }\n return '';\n });\n}\nexports.tryGetExecutablePath = tryGetExecutablePath;\nfunction normalizeSeparators(p) {\n p = p || '';\n if (exports.IS_WINDOWS) {\n // convert slashes on Windows\n p = p.replace(/\\//g, '\\\\');\n // remove redundant slashes\n return p.replace(/\\\\\\\\+/g, '\\\\');\n }\n // remove redundant slashes\n return p.replace(/\\/\\/+/g, '/');\n}\n// on Mac/Linux, test the execute bit\n// R W X R W X R W X\n// 256 128 64 32 16 8 4 2 1\nfunction isUnixExecutable(stats) {\n return ((stats.mode & 1) > 0 ||\n ((stats.mode & 8) > 0 && stats.gid === process.getgid()) ||\n ((stats.mode & 64) > 0 && stats.uid === process.getuid()));\n}\n//# sourceMappingURL=io-util.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst childProcess = require(\"child_process\");\nconst path = require(\"path\");\nconst util_1 = require(\"util\");\nconst ioUtil = require(\"./io-util\");\nconst exec = util_1.promisify(childProcess.exec);\n/**\n * Copies a file or folder.\n * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js\n *\n * @param source source path\n * @param dest destination path\n * @param options optional. See CopyOptions.\n */\nfunction cp(source, dest, options = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const { force, recursive } = readCopyOptions(options);\n const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null;\n // Dest is an existing file, but not forcing\n if (destStat && destStat.isFile() && !force) {\n return;\n }\n // If dest is an existing directory, should copy inside.\n const newDest = destStat && destStat.isDirectory()\n ? path.join(dest, path.basename(source))\n : dest;\n if (!(yield ioUtil.exists(source))) {\n throw new Error(`no such file or directory: ${source}`);\n }\n const sourceStat = yield ioUtil.stat(source);\n if (sourceStat.isDirectory()) {\n if (!recursive) {\n throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`);\n }\n else {\n yield cpDirRecursive(source, newDest, 0, force);\n }\n }\n else {\n if (path.relative(source, newDest) === '') {\n // a file cannot be copied to itself\n throw new Error(`'${newDest}' and '${source}' are the same file`);\n }\n yield copyFile(source, newDest, force);\n }\n });\n}\nexports.cp = cp;\n/**\n * Moves a path.\n *\n * @param source source path\n * @param dest destination path\n * @param options optional. See MoveOptions.\n */\nfunction mv(source, dest, options = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n if (yield ioUtil.exists(dest)) {\n let destExists = true;\n if (yield ioUtil.isDirectory(dest)) {\n // If dest is directory copy src into dest\n dest = path.join(dest, path.basename(source));\n destExists = yield ioUtil.exists(dest);\n }\n if (destExists) {\n if (options.force == null || options.force) {\n yield rmRF(dest);\n }\n else {\n throw new Error('Destination already exists');\n }\n }\n }\n yield mkdirP(path.dirname(dest));\n yield ioUtil.rename(source, dest);\n });\n}\nexports.mv = mv;\n/**\n * Remove a path recursively with force\n *\n * @param inputPath path to remove\n */\nfunction rmRF(inputPath) {\n return __awaiter(this, void 0, void 0, function* () {\n if (ioUtil.IS_WINDOWS) {\n // Node doesn't provide a delete operation, only an unlink function. This means that if the file is being used by another\n // program (e.g. antivirus), it won't be deleted. To address this, we shell out the work to rd/del.\n try {\n if (yield ioUtil.isDirectory(inputPath, true)) {\n yield exec(`rd /s /q \"${inputPath}\"`);\n }\n else {\n yield exec(`del /f /a \"${inputPath}\"`);\n }\n }\n catch (err) {\n // if you try to delete a file that doesn't exist, desired result is achieved\n // other errors are valid\n if (err.code !== 'ENOENT')\n throw err;\n }\n // Shelling out fails to remove a symlink folder with missing source, this unlink catches that\n try {\n yield ioUtil.unlink(inputPath);\n }\n catch (err) {\n // if you try to delete a file that doesn't exist, desired result is achieved\n // other errors are valid\n if (err.code !== 'ENOENT')\n throw err;\n }\n }\n else {\n let isDir = false;\n try {\n isDir = yield ioUtil.isDirectory(inputPath);\n }\n catch (err) {\n // if you try to delete a file that doesn't exist, desired result is achieved\n // other errors are valid\n if (err.code !== 'ENOENT')\n throw err;\n return;\n }\n if (isDir) {\n yield exec(`rm -rf \"${inputPath}\"`);\n }\n else {\n yield ioUtil.unlink(inputPath);\n }\n }\n });\n}\nexports.rmRF = rmRF;\n/**\n * Make a directory. Creates the full path with folders in between\n * Will throw if it fails\n *\n * @param fsPath path to create\n * @returns Promise\n */\nfunction mkdirP(fsPath) {\n return __awaiter(this, void 0, void 0, function* () {\n yield ioUtil.mkdirP(fsPath);\n });\n}\nexports.mkdirP = mkdirP;\n/**\n * Returns path of a tool had the tool actually been invoked. Resolves via paths.\n * If you check and the tool does not exist, it will throw.\n *\n * @param tool name of the tool\n * @param check whether to check if tool exists\n * @returns Promise path to tool\n */\nfunction which(tool, check) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!tool) {\n throw new Error(\"parameter 'tool' is required\");\n }\n // recursive when check=true\n if (check) {\n const result = yield which(tool, false);\n if (!result) {\n if (ioUtil.IS_WINDOWS) {\n throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`);\n }\n else {\n throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`);\n }\n }\n }\n try {\n // build the list of extensions to try\n const extensions = [];\n if (ioUtil.IS_WINDOWS && process.env.PATHEXT) {\n for (const extension of process.env.PATHEXT.split(path.delimiter)) {\n if (extension) {\n extensions.push(extension);\n }\n }\n }\n // if it's rooted, return it if exists. otherwise return empty.\n if (ioUtil.isRooted(tool)) {\n const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions);\n if (filePath) {\n return filePath;\n }\n return '';\n }\n // if any path separators, return empty\n if (tool.includes('/') || (ioUtil.IS_WINDOWS && tool.includes('\\\\'))) {\n return '';\n }\n // build the list of directories\n //\n // Note, technically \"where\" checks the current directory on Windows. From a toolkit perspective,\n // it feels like we should not do this. Checking the current directory seems like more of a use\n // case of a shell, and the which() function exposed by the toolkit should strive for consistency\n // across platforms.\n const directories = [];\n if (process.env.PATH) {\n for (const p of process.env.PATH.split(path.delimiter)) {\n if (p) {\n directories.push(p);\n }\n }\n }\n // return the first match\n for (const directory of directories) {\n const filePath = yield ioUtil.tryGetExecutablePath(directory + path.sep + tool, extensions);\n if (filePath) {\n return filePath;\n }\n }\n return '';\n }\n catch (err) {\n throw new Error(`which failed with message ${err.message}`);\n }\n });\n}\nexports.which = which;\nfunction readCopyOptions(options) {\n const force = options.force == null ? true : options.force;\n const recursive = Boolean(options.recursive);\n return { force, recursive };\n}\nfunction cpDirRecursive(sourceDir, destDir, currentDepth, force) {\n return __awaiter(this, void 0, void 0, function* () {\n // Ensure there is not a run away recursive copy\n if (currentDepth >= 255)\n return;\n currentDepth++;\n yield mkdirP(destDir);\n const files = yield ioUtil.readdir(sourceDir);\n for (const fileName of files) {\n const srcFile = `${sourceDir}/${fileName}`;\n const destFile = `${destDir}/${fileName}`;\n const srcFileStat = yield ioUtil.lstat(srcFile);\n if (srcFileStat.isDirectory()) {\n // Recurse\n yield cpDirRecursive(srcFile, destFile, currentDepth, force);\n }\n else {\n yield copyFile(srcFile, destFile, force);\n }\n }\n // Change the mode for the newly created directory\n yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode);\n });\n}\n// Buffered file copy\nfunction copyFile(srcFile, destFile, force) {\n return __awaiter(this, void 0, void 0, function* () {\n if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) {\n // unlink/re-link it\n try {\n yield ioUtil.lstat(destFile);\n yield ioUtil.unlink(destFile);\n }\n catch (e) {\n // Try to override file permission\n if (e.code === 'EPERM') {\n yield ioUtil.chmod(destFile, '0666');\n yield ioUtil.unlink(destFile);\n }\n // other errors = it doesn't exist, no work to do\n }\n // Copy over symlink\n const symlinkFull = yield ioUtil.readlink(srcFile);\n yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null);\n }\n else if (!(yield ioUtil.exists(destFile)) || force) {\n yield ioUtil.copyFile(srcFile, destFile);\n }\n });\n}\n//# sourceMappingURL=io.js.map","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;\r\nconst fs = require(\"fs\");\r\nexports.FILE_SYSTEM_ADAPTER = {\r\n lstat: fs.lstat,\r\n stat: fs.stat,\r\n lstatSync: fs.lstatSync,\r\n statSync: fs.statSync,\r\n readdir: fs.readdir,\r\n readdirSync: fs.readdirSync\r\n};\r\nfunction createFileSystemAdapter(fsMethods) {\r\n if (fsMethods === undefined) {\r\n return exports.FILE_SYSTEM_ADAPTER;\r\n }\r\n return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);\r\n}\r\nexports.createFileSystemAdapter = createFileSystemAdapter;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = void 0;\r\nconst NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.');\r\nconst MAJOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[0], 10);\r\nconst MINOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[1], 10);\r\nconst SUPPORTED_MAJOR_VERSION = 10;\r\nconst SUPPORTED_MINOR_VERSION = 10;\r\nconst IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION;\r\nconst IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION;\r\n/**\r\n * IS `true` for Node.js 10.10 and greater.\r\n */\r\nexports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Settings = exports.scandirSync = exports.scandir = void 0;\r\nconst async = require(\"./providers/async\");\r\nconst sync = require(\"./providers/sync\");\r\nconst settings_1 = require(\"./settings\");\r\nexports.Settings = settings_1.default;\r\nfunction scandir(path, optionsOrSettingsOrCallback, callback) {\r\n if (typeof optionsOrSettingsOrCallback === 'function') {\r\n return async.read(path, getSettings(), optionsOrSettingsOrCallback);\r\n }\r\n async.read(path, getSettings(optionsOrSettingsOrCallback), callback);\r\n}\r\nexports.scandir = scandir;\r\nfunction scandirSync(path, optionsOrSettings) {\r\n const settings = getSettings(optionsOrSettings);\r\n return sync.read(path, settings);\r\n}\r\nexports.scandirSync = scandirSync;\r\nfunction getSettings(settingsOrOptions = {}) {\r\n if (settingsOrOptions instanceof settings_1.default) {\r\n return settingsOrOptions;\r\n }\r\n return new settings_1.default(settingsOrOptions);\r\n}\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.readdir = exports.readdirWithFileTypes = exports.read = void 0;\r\nconst fsStat = require(\"@nodelib/fs.stat\");\r\nconst rpl = require(\"run-parallel\");\r\nconst constants_1 = require(\"../constants\");\r\nconst utils = require(\"../utils\");\r\nconst common = require(\"./common\");\r\nfunction read(directory, settings, callback) {\r\n if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {\r\n return readdirWithFileTypes(directory, settings, callback);\r\n }\r\n return readdir(directory, settings, callback);\r\n}\r\nexports.read = read;\r\nfunction readdirWithFileTypes(directory, settings, callback) {\r\n settings.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => {\r\n if (readdirError !== null) {\r\n return callFailureCallback(callback, readdirError);\r\n }\r\n const entries = dirents.map((dirent) => ({\r\n dirent,\r\n name: dirent.name,\r\n path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)\r\n }));\r\n if (!settings.followSymbolicLinks) {\r\n return callSuccessCallback(callback, entries);\r\n }\r\n const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings));\r\n rpl(tasks, (rplError, rplEntries) => {\r\n if (rplError !== null) {\r\n return callFailureCallback(callback, rplError);\r\n }\r\n callSuccessCallback(callback, rplEntries);\r\n });\r\n });\r\n}\r\nexports.readdirWithFileTypes = readdirWithFileTypes;\r\nfunction makeRplTaskEntry(entry, settings) {\r\n return (done) => {\r\n if (!entry.dirent.isSymbolicLink()) {\r\n return done(null, entry);\r\n }\r\n settings.fs.stat(entry.path, (statError, stats) => {\r\n if (statError !== null) {\r\n if (settings.throwErrorOnBrokenSymbolicLink) {\r\n return done(statError);\r\n }\r\n return done(null, entry);\r\n }\r\n entry.dirent = utils.fs.createDirentFromStats(entry.name, stats);\r\n return done(null, entry);\r\n });\r\n };\r\n}\r\nfunction readdir(directory, settings, callback) {\r\n settings.fs.readdir(directory, (readdirError, names) => {\r\n if (readdirError !== null) {\r\n return callFailureCallback(callback, readdirError);\r\n }\r\n const filepaths = names.map((name) => common.joinPathSegments(directory, name, settings.pathSegmentSeparator));\r\n const tasks = filepaths.map((filepath) => {\r\n return (done) => fsStat.stat(filepath, settings.fsStatSettings, done);\r\n });\r\n rpl(tasks, (rplError, results) => {\r\n if (rplError !== null) {\r\n return callFailureCallback(callback, rplError);\r\n }\r\n const entries = [];\r\n names.forEach((name, index) => {\r\n const stats = results[index];\r\n const entry = {\r\n name,\r\n path: filepaths[index],\r\n dirent: utils.fs.createDirentFromStats(name, stats)\r\n };\r\n if (settings.stats) {\r\n entry.stats = stats;\r\n }\r\n entries.push(entry);\r\n });\r\n callSuccessCallback(callback, entries);\r\n });\r\n });\r\n}\r\nexports.readdir = readdir;\r\nfunction callFailureCallback(callback, error) {\r\n callback(error);\r\n}\r\nfunction callSuccessCallback(callback, result) {\r\n callback(null, result);\r\n}\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.joinPathSegments = void 0;\r\nfunction joinPathSegments(a, b, separator) {\r\n /**\r\n * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).\r\n */\r\n if (a.endsWith(separator)) {\r\n return a + b;\r\n }\r\n return a + separator + b;\r\n}\r\nexports.joinPathSegments = joinPathSegments;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.readdir = exports.readdirWithFileTypes = exports.read = void 0;\r\nconst fsStat = require(\"@nodelib/fs.stat\");\r\nconst constants_1 = require(\"../constants\");\r\nconst utils = require(\"../utils\");\r\nconst common = require(\"./common\");\r\nfunction read(directory, settings) {\r\n if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {\r\n return readdirWithFileTypes(directory, settings);\r\n }\r\n return readdir(directory, settings);\r\n}\r\nexports.read = read;\r\nfunction readdirWithFileTypes(directory, settings) {\r\n const dirents = settings.fs.readdirSync(directory, { withFileTypes: true });\r\n return dirents.map((dirent) => {\r\n const entry = {\r\n dirent,\r\n name: dirent.name,\r\n path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)\r\n };\r\n if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) {\r\n try {\r\n const stats = settings.fs.statSync(entry.path);\r\n entry.dirent = utils.fs.createDirentFromStats(entry.name, stats);\r\n }\r\n catch (error) {\r\n if (settings.throwErrorOnBrokenSymbolicLink) {\r\n throw error;\r\n }\r\n }\r\n }\r\n return entry;\r\n });\r\n}\r\nexports.readdirWithFileTypes = readdirWithFileTypes;\r\nfunction readdir(directory, settings) {\r\n const names = settings.fs.readdirSync(directory);\r\n return names.map((name) => {\r\n const entryPath = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);\r\n const stats = fsStat.statSync(entryPath, settings.fsStatSettings);\r\n const entry = {\r\n name,\r\n path: entryPath,\r\n dirent: utils.fs.createDirentFromStats(name, stats)\r\n };\r\n if (settings.stats) {\r\n entry.stats = stats;\r\n }\r\n return entry;\r\n });\r\n}\r\nexports.readdir = readdir;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst path = require(\"path\");\r\nconst fsStat = require(\"@nodelib/fs.stat\");\r\nconst fs = require(\"./adapters/fs\");\r\nclass Settings {\r\n constructor(_options = {}) {\r\n this._options = _options;\r\n this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false);\r\n this.fs = fs.createFileSystemAdapter(this._options.fs);\r\n this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep);\r\n this.stats = this._getValue(this._options.stats, false);\r\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);\r\n this.fsStatSettings = new fsStat.Settings({\r\n followSymbolicLink: this.followSymbolicLinks,\r\n fs: this.fs,\r\n throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink\r\n });\r\n }\r\n _getValue(option, value) {\r\n return option !== null && option !== void 0 ? option : value;\r\n }\r\n}\r\nexports.default = Settings;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.createDirentFromStats = void 0;\r\nclass DirentFromStats {\r\n constructor(name, stats) {\r\n this.name = name;\r\n this.isBlockDevice = stats.isBlockDevice.bind(stats);\r\n this.isCharacterDevice = stats.isCharacterDevice.bind(stats);\r\n this.isDirectory = stats.isDirectory.bind(stats);\r\n this.isFIFO = stats.isFIFO.bind(stats);\r\n this.isFile = stats.isFile.bind(stats);\r\n this.isSocket = stats.isSocket.bind(stats);\r\n this.isSymbolicLink = stats.isSymbolicLink.bind(stats);\r\n }\r\n}\r\nfunction createDirentFromStats(name, stats) {\r\n return new DirentFromStats(name, stats);\r\n}\r\nexports.createDirentFromStats = createDirentFromStats;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.fs = void 0;\r\nconst fs = require(\"./fs\");\r\nexports.fs = fs;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;\r\nconst fs = require(\"fs\");\r\nexports.FILE_SYSTEM_ADAPTER = {\r\n lstat: fs.lstat,\r\n stat: fs.stat,\r\n lstatSync: fs.lstatSync,\r\n statSync: fs.statSync\r\n};\r\nfunction createFileSystemAdapter(fsMethods) {\r\n if (fsMethods === undefined) {\r\n return exports.FILE_SYSTEM_ADAPTER;\r\n }\r\n return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);\r\n}\r\nexports.createFileSystemAdapter = createFileSystemAdapter;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.statSync = exports.stat = exports.Settings = void 0;\r\nconst async = require(\"./providers/async\");\r\nconst sync = require(\"./providers/sync\");\r\nconst settings_1 = require(\"./settings\");\r\nexports.Settings = settings_1.default;\r\nfunction stat(path, optionsOrSettingsOrCallback, callback) {\r\n if (typeof optionsOrSettingsOrCallback === 'function') {\r\n return async.read(path, getSettings(), optionsOrSettingsOrCallback);\r\n }\r\n async.read(path, getSettings(optionsOrSettingsOrCallback), callback);\r\n}\r\nexports.stat = stat;\r\nfunction statSync(path, optionsOrSettings) {\r\n const settings = getSettings(optionsOrSettings);\r\n return sync.read(path, settings);\r\n}\r\nexports.statSync = statSync;\r\nfunction getSettings(settingsOrOptions = {}) {\r\n if (settingsOrOptions instanceof settings_1.default) {\r\n return settingsOrOptions;\r\n }\r\n return new settings_1.default(settingsOrOptions);\r\n}\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.read = void 0;\r\nfunction read(path, settings, callback) {\r\n settings.fs.lstat(path, (lstatError, lstat) => {\r\n if (lstatError !== null) {\r\n return callFailureCallback(callback, lstatError);\r\n }\r\n if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {\r\n return callSuccessCallback(callback, lstat);\r\n }\r\n settings.fs.stat(path, (statError, stat) => {\r\n if (statError !== null) {\r\n if (settings.throwErrorOnBrokenSymbolicLink) {\r\n return callFailureCallback(callback, statError);\r\n }\r\n return callSuccessCallback(callback, lstat);\r\n }\r\n if (settings.markSymbolicLink) {\r\n stat.isSymbolicLink = () => true;\r\n }\r\n callSuccessCallback(callback, stat);\r\n });\r\n });\r\n}\r\nexports.read = read;\r\nfunction callFailureCallback(callback, error) {\r\n callback(error);\r\n}\r\nfunction callSuccessCallback(callback, result) {\r\n callback(null, result);\r\n}\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.read = void 0;\r\nfunction read(path, settings) {\r\n const lstat = settings.fs.lstatSync(path);\r\n if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {\r\n return lstat;\r\n }\r\n try {\r\n const stat = settings.fs.statSync(path);\r\n if (settings.markSymbolicLink) {\r\n stat.isSymbolicLink = () => true;\r\n }\r\n return stat;\r\n }\r\n catch (error) {\r\n if (!settings.throwErrorOnBrokenSymbolicLink) {\r\n return lstat;\r\n }\r\n throw error;\r\n }\r\n}\r\nexports.read = read;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst fs = require(\"./adapters/fs\");\r\nclass Settings {\r\n constructor(_options = {}) {\r\n this._options = _options;\r\n this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true);\r\n this.fs = fs.createFileSystemAdapter(this._options.fs);\r\n this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false);\r\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);\r\n }\r\n _getValue(option, value) {\r\n return option !== null && option !== void 0 ? option : value;\r\n }\r\n}\r\nexports.default = Settings;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Settings = exports.walkStream = exports.walkSync = exports.walk = void 0;\r\nconst async_1 = require(\"./providers/async\");\r\nconst stream_1 = require(\"./providers/stream\");\r\nconst sync_1 = require(\"./providers/sync\");\r\nconst settings_1 = require(\"./settings\");\r\nexports.Settings = settings_1.default;\r\nfunction walk(directory, optionsOrSettingsOrCallback, callback) {\r\n if (typeof optionsOrSettingsOrCallback === 'function') {\r\n return new async_1.default(directory, getSettings()).read(optionsOrSettingsOrCallback);\r\n }\r\n new async_1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback);\r\n}\r\nexports.walk = walk;\r\nfunction walkSync(directory, optionsOrSettings) {\r\n const settings = getSettings(optionsOrSettings);\r\n const provider = new sync_1.default(directory, settings);\r\n return provider.read();\r\n}\r\nexports.walkSync = walkSync;\r\nfunction walkStream(directory, optionsOrSettings) {\r\n const settings = getSettings(optionsOrSettings);\r\n const provider = new stream_1.default(directory, settings);\r\n return provider.read();\r\n}\r\nexports.walkStream = walkStream;\r\nfunction getSettings(settingsOrOptions = {}) {\r\n if (settingsOrOptions instanceof settings_1.default) {\r\n return settingsOrOptions;\r\n }\r\n return new settings_1.default(settingsOrOptions);\r\n}\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst async_1 = require(\"../readers/async\");\r\nclass AsyncProvider {\r\n constructor(_root, _settings) {\r\n this._root = _root;\r\n this._settings = _settings;\r\n this._reader = new async_1.default(this._root, this._settings);\r\n this._storage = new Set();\r\n }\r\n read(callback) {\r\n this._reader.onError((error) => {\r\n callFailureCallback(callback, error);\r\n });\r\n this._reader.onEntry((entry) => {\r\n this._storage.add(entry);\r\n });\r\n this._reader.onEnd(() => {\r\n callSuccessCallback(callback, [...this._storage]);\r\n });\r\n this._reader.read();\r\n }\r\n}\r\nexports.default = AsyncProvider;\r\nfunction callFailureCallback(callback, error) {\r\n callback(error);\r\n}\r\nfunction callSuccessCallback(callback, entries) {\r\n callback(null, entries);\r\n}\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst stream_1 = require(\"stream\");\r\nconst async_1 = require(\"../readers/async\");\r\nclass StreamProvider {\r\n constructor(_root, _settings) {\r\n this._root = _root;\r\n this._settings = _settings;\r\n this._reader = new async_1.default(this._root, this._settings);\r\n this._stream = new stream_1.Readable({\r\n objectMode: true,\r\n read: () => { },\r\n destroy: () => {\r\n if (!this._reader.isDestroyed) {\r\n this._reader.destroy();\r\n }\r\n }\r\n });\r\n }\r\n read() {\r\n this._reader.onError((error) => {\r\n this._stream.emit('error', error);\r\n });\r\n this._reader.onEntry((entry) => {\r\n this._stream.push(entry);\r\n });\r\n this._reader.onEnd(() => {\r\n this._stream.push(null);\r\n });\r\n this._reader.read();\r\n return this._stream;\r\n }\r\n}\r\nexports.default = StreamProvider;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst sync_1 = require(\"../readers/sync\");\r\nclass SyncProvider {\r\n constructor(_root, _settings) {\r\n this._root = _root;\r\n this._settings = _settings;\r\n this._reader = new sync_1.default(this._root, this._settings);\r\n }\r\n read() {\r\n return this._reader.read();\r\n }\r\n}\r\nexports.default = SyncProvider;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst events_1 = require(\"events\");\r\nconst fsScandir = require(\"@nodelib/fs.scandir\");\r\nconst fastq = require(\"fastq\");\r\nconst common = require(\"./common\");\r\nconst reader_1 = require(\"./reader\");\r\nclass AsyncReader extends reader_1.default {\r\n constructor(_root, _settings) {\r\n super(_root, _settings);\r\n this._settings = _settings;\r\n this._scandir = fsScandir.scandir;\r\n this._emitter = new events_1.EventEmitter();\r\n this._queue = fastq(this._worker.bind(this), this._settings.concurrency);\r\n this._isFatalError = false;\r\n this._isDestroyed = false;\r\n this._queue.drain = () => {\r\n if (!this._isFatalError) {\r\n this._emitter.emit('end');\r\n }\r\n };\r\n }\r\n read() {\r\n this._isFatalError = false;\r\n this._isDestroyed = false;\r\n setImmediate(() => {\r\n this._pushToQueue(this._root, this._settings.basePath);\r\n });\r\n return this._emitter;\r\n }\r\n get isDestroyed() {\r\n return this._isDestroyed;\r\n }\r\n destroy() {\r\n if (this._isDestroyed) {\r\n throw new Error('The reader is already destroyed');\r\n }\r\n this._isDestroyed = true;\r\n this._queue.killAndDrain();\r\n }\r\n onEntry(callback) {\r\n this._emitter.on('entry', callback);\r\n }\r\n onError(callback) {\r\n this._emitter.once('error', callback);\r\n }\r\n onEnd(callback) {\r\n this._emitter.once('end', callback);\r\n }\r\n _pushToQueue(directory, base) {\r\n const queueItem = { directory, base };\r\n this._queue.push(queueItem, (error) => {\r\n if (error !== null) {\r\n this._handleError(error);\r\n }\r\n });\r\n }\r\n _worker(item, done) {\r\n this._scandir(item.directory, this._settings.fsScandirSettings, (error, entries) => {\r\n if (error !== null) {\r\n return done(error, undefined);\r\n }\r\n for (const entry of entries) {\r\n this._handleEntry(entry, item.base);\r\n }\r\n done(null, undefined);\r\n });\r\n }\r\n _handleError(error) {\r\n if (this._isDestroyed || !common.isFatalError(this._settings, error)) {\r\n return;\r\n }\r\n this._isFatalError = true;\r\n this._isDestroyed = true;\r\n this._emitter.emit('error', error);\r\n }\r\n _handleEntry(entry, base) {\r\n if (this._isDestroyed || this._isFatalError) {\r\n return;\r\n }\r\n const fullpath = entry.path;\r\n if (base !== undefined) {\r\n entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);\r\n }\r\n if (common.isAppliedFilter(this._settings.entryFilter, entry)) {\r\n this._emitEntry(entry);\r\n }\r\n if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) {\r\n this._pushToQueue(fullpath, entry.path);\r\n }\r\n }\r\n _emitEntry(entry) {\r\n this._emitter.emit('entry', entry);\r\n }\r\n}\r\nexports.default = AsyncReader;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.joinPathSegments = exports.replacePathSegmentSeparator = exports.isAppliedFilter = exports.isFatalError = void 0;\r\nfunction isFatalError(settings, error) {\r\n if (settings.errorFilter === null) {\r\n return true;\r\n }\r\n return !settings.errorFilter(error);\r\n}\r\nexports.isFatalError = isFatalError;\r\nfunction isAppliedFilter(filter, value) {\r\n return filter === null || filter(value);\r\n}\r\nexports.isAppliedFilter = isAppliedFilter;\r\nfunction replacePathSegmentSeparator(filepath, separator) {\r\n return filepath.split(/[/\\\\]/).join(separator);\r\n}\r\nexports.replacePathSegmentSeparator = replacePathSegmentSeparator;\r\nfunction joinPathSegments(a, b, separator) {\r\n if (a === '') {\r\n return b;\r\n }\r\n /**\r\n * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).\r\n */\r\n if (a.endsWith(separator)) {\r\n return a + b;\r\n }\r\n return a + separator + b;\r\n}\r\nexports.joinPathSegments = joinPathSegments;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst common = require(\"./common\");\r\nclass Reader {\r\n constructor(_root, _settings) {\r\n this._root = _root;\r\n this._settings = _settings;\r\n this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator);\r\n }\r\n}\r\nexports.default = Reader;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst fsScandir = require(\"@nodelib/fs.scandir\");\r\nconst common = require(\"./common\");\r\nconst reader_1 = require(\"./reader\");\r\nclass SyncReader extends reader_1.default {\r\n constructor() {\r\n super(...arguments);\r\n this._scandir = fsScandir.scandirSync;\r\n this._storage = new Set();\r\n this._queue = new Set();\r\n }\r\n read() {\r\n this._pushToQueue(this._root, this._settings.basePath);\r\n this._handleQueue();\r\n return [...this._storage];\r\n }\r\n _pushToQueue(directory, base) {\r\n this._queue.add({ directory, base });\r\n }\r\n _handleQueue() {\r\n for (const item of this._queue.values()) {\r\n this._handleDirectory(item.directory, item.base);\r\n }\r\n }\r\n _handleDirectory(directory, base) {\r\n try {\r\n const entries = this._scandir(directory, this._settings.fsScandirSettings);\r\n for (const entry of entries) {\r\n this._handleEntry(entry, base);\r\n }\r\n }\r\n catch (error) {\r\n this._handleError(error);\r\n }\r\n }\r\n _handleError(error) {\r\n if (!common.isFatalError(this._settings, error)) {\r\n return;\r\n }\r\n throw error;\r\n }\r\n _handleEntry(entry, base) {\r\n const fullpath = entry.path;\r\n if (base !== undefined) {\r\n entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);\r\n }\r\n if (common.isAppliedFilter(this._settings.entryFilter, entry)) {\r\n this._pushToStorage(entry);\r\n }\r\n if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) {\r\n this._pushToQueue(fullpath, entry.path);\r\n }\r\n }\r\n _pushToStorage(entry) {\r\n this._storage.add(entry);\r\n }\r\n}\r\nexports.default = SyncReader;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst path = require(\"path\");\r\nconst fsScandir = require(\"@nodelib/fs.scandir\");\r\nclass Settings {\r\n constructor(_options = {}) {\r\n this._options = _options;\r\n this.basePath = this._getValue(this._options.basePath, undefined);\r\n this.concurrency = this._getValue(this._options.concurrency, Infinity);\r\n this.deepFilter = this._getValue(this._options.deepFilter, null);\r\n this.entryFilter = this._getValue(this._options.entryFilter, null);\r\n this.errorFilter = this._getValue(this._options.errorFilter, null);\r\n this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep);\r\n this.fsScandirSettings = new fsScandir.Settings({\r\n followSymbolicLinks: this._options.followSymbolicLinks,\r\n fs: this._options.fs,\r\n pathSegmentSeparator: this._options.pathSegmentSeparator,\r\n stats: this._options.stats,\r\n throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink\r\n });\r\n }\r\n _getValue(option, value) {\r\n return option !== null && option !== void 0 ? option : value;\r\n }\r\n}\r\nexports.default = Settings;\r\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nasync function auth(token) {\n const tokenType = token.split(/\\./).length === 3 ? \"app\" : /^v\\d+\\./.test(token) ? \"installation\" : \"oauth\";\n return {\n type: \"token\",\n token: token,\n tokenType\n };\n}\n\n/**\n * Prefix token for usage in the Authorization header\n *\n * @param token OAuth token or JSON Web Token\n */\nfunction withAuthorizationPrefix(token) {\n if (token.split(/\\./).length === 3) {\n return `bearer ${token}`;\n }\n\n return `token ${token}`;\n}\n\nasync function hook(token, request, route, parameters) {\n const endpoint = request.endpoint.merge(route, parameters);\n endpoint.headers.authorization = withAuthorizationPrefix(token);\n return request(endpoint);\n}\n\nconst createTokenAuth = function createTokenAuth(token) {\n if (!token) {\n throw new Error(\"[@octokit/auth-token] No token passed to createTokenAuth\");\n }\n\n if (typeof token !== \"string\") {\n throw new Error(\"[@octokit/auth-token] Token passed to createTokenAuth is not a string\");\n }\n\n token = token.replace(/^(token|bearer) +/i, \"\");\n return Object.assign(auth.bind(null, token), {\n hook: hook.bind(null, token)\n });\n};\n\nexports.createTokenAuth = createTokenAuth;\n//# sourceMappingURL=index.js.map\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar universalUserAgent = require('universal-user-agent');\nvar beforeAfterHook = require('before-after-hook');\nvar request = require('@octokit/request');\nvar graphql = require('@octokit/graphql');\nvar authToken = require('@octokit/auth-token');\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nconst VERSION = \"3.2.1\";\n\nclass Octokit {\n constructor(options = {}) {\n const hook = new beforeAfterHook.Collection();\n const requestDefaults = {\n baseUrl: request.request.endpoint.DEFAULTS.baseUrl,\n headers: {},\n request: Object.assign({}, options.request, {\n hook: hook.bind(null, \"request\")\n }),\n mediaType: {\n previews: [],\n format: \"\"\n }\n }; // prepend default user agent with `options.userAgent` if set\n\n requestDefaults.headers[\"user-agent\"] = [options.userAgent, `octokit-core.js/${VERSION} ${universalUserAgent.getUserAgent()}`].filter(Boolean).join(\" \");\n\n if (options.baseUrl) {\n requestDefaults.baseUrl = options.baseUrl;\n }\n\n if (options.previews) {\n requestDefaults.mediaType.previews = options.previews;\n }\n\n if (options.timeZone) {\n requestDefaults.headers[\"time-zone\"] = options.timeZone;\n }\n\n this.request = request.request.defaults(requestDefaults);\n this.graphql = graphql.withCustomRequest(this.request).defaults(requestDefaults);\n this.log = Object.assign({\n debug: () => {},\n info: () => {},\n warn: console.warn.bind(console),\n error: console.error.bind(console)\n }, options.log);\n this.hook = hook; // (1) If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance\n // is unauthenticated. The `this.auth()` method is a no-op and no request hook is registered.\n // (2) If only `options.auth` is set, use the default token authentication strategy.\n // (3) If `options.authStrategy` is set then use it and pass in `options.auth`. Always pass own request as many strategies accept a custom request instance.\n // TODO: type `options.auth` based on `options.authStrategy`.\n\n if (!options.authStrategy) {\n if (!options.auth) {\n // (1)\n this.auth = async () => ({\n type: \"unauthenticated\"\n });\n } else {\n // (2)\n const auth = authToken.createTokenAuth(options.auth); // @ts-ignore ¯\\_(ツ)_/¯\n\n hook.wrap(\"request\", auth.hook);\n this.auth = auth;\n }\n } else {\n const {\n authStrategy\n } = options,\n otherOptions = _objectWithoutProperties(options, [\"authStrategy\"]);\n\n const auth = authStrategy(Object.assign({\n request: this.request,\n log: this.log,\n // we pass the current octokit instance as well as its constructor options\n // to allow for authentication strategies that return a new octokit instance\n // that shares the same internal state as the current one. The original\n // requirement for this was the \"event-octokit\" authentication strategy\n // of https://github.com/probot/octokit-auth-probot.\n octokit: this,\n octokitOptions: otherOptions\n }, options.auth)); // @ts-ignore ¯\\_(ツ)_/¯\n\n hook.wrap(\"request\", auth.hook);\n this.auth = auth;\n } // apply plugins\n // https://stackoverflow.com/a/16345172\n\n\n const classConstructor = this.constructor;\n classConstructor.plugins.forEach(plugin => {\n Object.assign(this, plugin(this, options));\n });\n }\n\n static defaults(defaults) {\n const OctokitWithDefaults = class extends this {\n constructor(...args) {\n const options = args[0] || {};\n\n if (typeof defaults === \"function\") {\n super(defaults(options));\n return;\n }\n\n super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent ? {\n userAgent: `${options.userAgent} ${defaults.userAgent}`\n } : null));\n }\n\n };\n return OctokitWithDefaults;\n }\n /**\n * Attach a plugin (or many) to your Octokit instance.\n *\n * @example\n * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...)\n */\n\n\n static plugin(...newPlugins) {\n var _a;\n\n const currentPlugins = this.plugins;\n const NewOctokit = (_a = class extends this {}, _a.plugins = currentPlugins.concat(newPlugins.filter(plugin => !currentPlugins.includes(plugin))), _a);\n return NewOctokit;\n }\n\n}\nOctokit.VERSION = VERSION;\nOctokit.plugins = [];\n\nexports.Octokit = Octokit;\n//# sourceMappingURL=index.js.map\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar isPlainObject = require('is-plain-object');\nvar universalUserAgent = require('universal-user-agent');\n\nfunction lowercaseKeys(object) {\n if (!object) {\n return {};\n }\n\n return Object.keys(object).reduce((newObj, key) => {\n newObj[key.toLowerCase()] = object[key];\n return newObj;\n }, {});\n}\n\nfunction mergeDeep(defaults, options) {\n const result = Object.assign({}, defaults);\n Object.keys(options).forEach(key => {\n if (isPlainObject.isPlainObject(options[key])) {\n if (!(key in defaults)) Object.assign(result, {\n [key]: options[key]\n });else result[key] = mergeDeep(defaults[key], options[key]);\n } else {\n Object.assign(result, {\n [key]: options[key]\n });\n }\n });\n return result;\n}\n\nfunction removeUndefinedProperties(obj) {\n for (const key in obj) {\n if (obj[key] === undefined) {\n delete obj[key];\n }\n }\n\n return obj;\n}\n\nfunction merge(defaults, route, options) {\n if (typeof route === \"string\") {\n let [method, url] = route.split(\" \");\n options = Object.assign(url ? {\n method,\n url\n } : {\n url: method\n }, options);\n } else {\n options = Object.assign({}, route);\n } // lowercase header names before merging with defaults to avoid duplicates\n\n\n options.headers = lowercaseKeys(options.headers); // remove properties with undefined values before merging\n\n removeUndefinedProperties(options);\n removeUndefinedProperties(options.headers);\n const mergedOptions = mergeDeep(defaults || {}, options); // mediaType.previews arrays are merged, instead of overwritten\n\n if (defaults && defaults.mediaType.previews.length) {\n mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(preview => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews);\n }\n\n mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map(preview => preview.replace(/-preview/, \"\"));\n return mergedOptions;\n}\n\nfunction addQueryParameters(url, parameters) {\n const separator = /\\?/.test(url) ? \"&\" : \"?\";\n const names = Object.keys(parameters);\n\n if (names.length === 0) {\n return url;\n }\n\n return url + separator + names.map(name => {\n if (name === \"q\") {\n return \"q=\" + parameters.q.split(\"+\").map(encodeURIComponent).join(\"+\");\n }\n\n return `${name}=${encodeURIComponent(parameters[name])}`;\n }).join(\"&\");\n}\n\nconst urlVariableRegex = /\\{[^}]+\\}/g;\n\nfunction removeNonChars(variableName) {\n return variableName.replace(/^\\W+|\\W+$/g, \"\").split(/,/);\n}\n\nfunction extractUrlVariableNames(url) {\n const matches = url.match(urlVariableRegex);\n\n if (!matches) {\n return [];\n }\n\n return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);\n}\n\nfunction omit(object, keysToOmit) {\n return Object.keys(object).filter(option => !keysToOmit.includes(option)).reduce((obj, key) => {\n obj[key] = object[key];\n return obj;\n }, {});\n}\n\n// Based on https://github.com/bramstein/url-template, licensed under BSD\n// TODO: create separate package.\n//\n// Copyright (c) 2012-2014, Bram Stein\n// All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n// 1. Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\n// 3. The name of the author may not be used to endorse or promote products\n// derived from this software without specific prior written permission.\n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR \"AS IS\" AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n/* istanbul ignore file */\nfunction encodeReserved(str) {\n return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {\n if (!/%[0-9A-Fa-f]/.test(part)) {\n part = encodeURI(part).replace(/%5B/g, \"[\").replace(/%5D/g, \"]\");\n }\n\n return part;\n }).join(\"\");\n}\n\nfunction encodeUnreserved(str) {\n return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {\n return \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\n\nfunction encodeValue(operator, value, key) {\n value = operator === \"+\" || operator === \"#\" ? encodeReserved(value) : encodeUnreserved(value);\n\n if (key) {\n return encodeUnreserved(key) + \"=\" + value;\n } else {\n return value;\n }\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null;\n}\n\nfunction isKeyOperator(operator) {\n return operator === \";\" || operator === \"&\" || operator === \"?\";\n}\n\nfunction getValues(context, operator, key, modifier) {\n var value = context[key],\n result = [];\n\n if (isDefined(value) && value !== \"\") {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n value = value.toString();\n\n if (modifier && modifier !== \"*\") {\n value = value.substring(0, parseInt(modifier, 10));\n }\n\n result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : \"\"));\n } else {\n if (modifier === \"*\") {\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function (value) {\n result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : \"\"));\n });\n } else {\n Object.keys(value).forEach(function (k) {\n if (isDefined(value[k])) {\n result.push(encodeValue(operator, value[k], k));\n }\n });\n }\n } else {\n const tmp = [];\n\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function (value) {\n tmp.push(encodeValue(operator, value));\n });\n } else {\n Object.keys(value).forEach(function (k) {\n if (isDefined(value[k])) {\n tmp.push(encodeUnreserved(k));\n tmp.push(encodeValue(operator, value[k].toString()));\n }\n });\n }\n\n if (isKeyOperator(operator)) {\n result.push(encodeUnreserved(key) + \"=\" + tmp.join(\",\"));\n } else if (tmp.length !== 0) {\n result.push(tmp.join(\",\"));\n }\n }\n }\n } else {\n if (operator === \";\") {\n if (isDefined(value)) {\n result.push(encodeUnreserved(key));\n }\n } else if (value === \"\" && (operator === \"&\" || operator === \"?\")) {\n result.push(encodeUnreserved(key) + \"=\");\n } else if (value === \"\") {\n result.push(\"\");\n }\n }\n\n return result;\n}\n\nfunction parseUrl(template) {\n return {\n expand: expand.bind(null, template)\n };\n}\n\nfunction expand(template, context) {\n var operators = [\"+\", \"#\", \".\", \"/\", \";\", \"?\", \"&\"];\n return template.replace(/\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g, function (_, expression, literal) {\n if (expression) {\n let operator = \"\";\n const values = [];\n\n if (operators.indexOf(expression.charAt(0)) !== -1) {\n operator = expression.charAt(0);\n expression = expression.substr(1);\n }\n\n expression.split(/,/g).forEach(function (variable) {\n var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n });\n\n if (operator && operator !== \"+\") {\n var separator = \",\";\n\n if (operator === \"?\") {\n separator = \"&\";\n } else if (operator !== \"#\") {\n separator = operator;\n }\n\n return (values.length !== 0 ? operator : \"\") + values.join(separator);\n } else {\n return values.join(\",\");\n }\n } else {\n return encodeReserved(literal);\n }\n });\n}\n\nfunction parse(options) {\n // https://fetch.spec.whatwg.org/#methods\n let method = options.method.toUpperCase(); // replace :varname with {varname} to make it RFC 6570 compatible\n\n let url = (options.url || \"/\").replace(/:([a-z]\\w+)/g, \"{$1}\");\n let headers = Object.assign({}, options.headers);\n let body;\n let parameters = omit(options, [\"method\", \"baseUrl\", \"url\", \"headers\", \"request\", \"mediaType\"]); // extract variable names from URL to calculate remaining variables later\n\n const urlVariableNames = extractUrlVariableNames(url);\n url = parseUrl(url).expand(parameters);\n\n if (!/^http/.test(url)) {\n url = options.baseUrl + url;\n }\n\n const omittedParameters = Object.keys(options).filter(option => urlVariableNames.includes(option)).concat(\"baseUrl\");\n const remainingParameters = omit(parameters, omittedParameters);\n const isBinaryRequest = /application\\/octet-stream/i.test(headers.accept);\n\n if (!isBinaryRequest) {\n if (options.mediaType.format) {\n // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw\n headers.accept = headers.accept.split(/,/).map(preview => preview.replace(/application\\/vnd(\\.\\w+)(\\.v3)?(\\.\\w+)?(\\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(\",\");\n }\n\n if (options.mediaType.previews.length) {\n const previewsFromAcceptHeader = headers.accept.match(/[\\w-]+(?=-preview)/g) || [];\n headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map(preview => {\n const format = options.mediaType.format ? `.${options.mediaType.format}` : \"+json\";\n return `application/vnd.github.${preview}-preview${format}`;\n }).join(\",\");\n }\n } // for GET/HEAD requests, set URL query parameters from remaining parameters\n // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters\n\n\n if ([\"GET\", \"HEAD\"].includes(method)) {\n url = addQueryParameters(url, remainingParameters);\n } else {\n if (\"data\" in remainingParameters) {\n body = remainingParameters.data;\n } else {\n if (Object.keys(remainingParameters).length) {\n body = remainingParameters;\n } else {\n headers[\"content-length\"] = 0;\n }\n }\n } // default content-type for JSON if body is set\n\n\n if (!headers[\"content-type\"] && typeof body !== \"undefined\") {\n headers[\"content-type\"] = \"application/json; charset=utf-8\";\n } // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body.\n // fetch does not allow to set `content-length` header, but we can set body to an empty string\n\n\n if ([\"PATCH\", \"PUT\"].includes(method) && typeof body === \"undefined\") {\n body = \"\";\n } // Only return body/request keys if present\n\n\n return Object.assign({\n method,\n url,\n headers\n }, typeof body !== \"undefined\" ? {\n body\n } : null, options.request ? {\n request: options.request\n } : null);\n}\n\nfunction endpointWithDefaults(defaults, route, options) {\n return parse(merge(defaults, route, options));\n}\n\nfunction withDefaults(oldDefaults, newDefaults) {\n const DEFAULTS = merge(oldDefaults, newDefaults);\n const endpoint = endpointWithDefaults.bind(null, DEFAULTS);\n return Object.assign(endpoint, {\n DEFAULTS,\n defaults: withDefaults.bind(null, DEFAULTS),\n merge: merge.bind(null, DEFAULTS),\n parse\n });\n}\n\nconst VERSION = \"6.0.9\";\n\nconst userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`; // DEFAULTS has all properties set that EndpointOptions has, except url.\n// So we use RequestParameters and add method as additional required property.\n\nconst DEFAULTS = {\n method: \"GET\",\n baseUrl: \"https://api.github.com\",\n headers: {\n accept: \"application/vnd.github.v3+json\",\n \"user-agent\": userAgent\n },\n mediaType: {\n format: \"\",\n previews: []\n }\n};\n\nconst endpoint = withDefaults(null, DEFAULTS);\n\nexports.endpoint = endpoint;\n//# sourceMappingURL=index.js.map\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n/*!\n * is-plain-object \n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nfunction isPlainObject(o) {\n var ctor,prot;\n\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n\nexports.isPlainObject = isPlainObject;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar request = require('@octokit/request');\nvar universalUserAgent = require('universal-user-agent');\n\nconst VERSION = \"4.5.7\";\n\nclass GraphqlError extends Error {\n constructor(request, response) {\n const message = response.data.errors[0].message;\n super(message);\n Object.assign(this, response.data);\n Object.assign(this, {\n headers: response.headers\n });\n this.name = \"GraphqlError\";\n this.request = request; // Maintains proper stack trace (only available on V8)\n\n /* istanbul ignore next */\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n}\n\nconst NON_VARIABLE_OPTIONS = [\"method\", \"baseUrl\", \"url\", \"headers\", \"request\", \"query\", \"mediaType\"];\nconst GHES_V3_SUFFIX_REGEX = /\\/api\\/v3\\/?$/;\nfunction graphql(request, query, options) {\n if (typeof query === \"string\" && options && \"query\" in options) {\n return Promise.reject(new Error(`[@octokit/graphql] \"query\" cannot be used as variable name`));\n }\n\n const parsedOptions = typeof query === \"string\" ? Object.assign({\n query\n }, options) : query;\n const requestOptions = Object.keys(parsedOptions).reduce((result, key) => {\n if (NON_VARIABLE_OPTIONS.includes(key)) {\n result[key] = parsedOptions[key];\n return result;\n }\n\n if (!result.variables) {\n result.variables = {};\n }\n\n result.variables[key] = parsedOptions[key];\n return result;\n }, {}); // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix\n // https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451\n\n const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl;\n\n if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {\n requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, \"/api/graphql\");\n }\n\n return request(requestOptions).then(response => {\n if (response.data.errors) {\n const headers = {};\n\n for (const key of Object.keys(response.headers)) {\n headers[key] = response.headers[key];\n }\n\n throw new GraphqlError(requestOptions, {\n headers,\n data: response.data\n });\n }\n\n return response.data.data;\n });\n}\n\nfunction withDefaults(request$1, newDefaults) {\n const newRequest = request$1.defaults(newDefaults);\n\n const newApi = (query, options) => {\n return graphql(newRequest, query, options);\n };\n\n return Object.assign(newApi, {\n defaults: withDefaults.bind(null, newRequest),\n endpoint: request.request.endpoint\n });\n}\n\nconst graphql$1 = withDefaults(request.request, {\n headers: {\n \"user-agent\": `octokit-graphql.js/${VERSION} ${universalUserAgent.getUserAgent()}`\n },\n method: \"POST\",\n url: \"/graphql\"\n});\nfunction withCustomRequest(customRequest) {\n return withDefaults(customRequest, {\n method: \"POST\",\n url: \"/graphql\"\n });\n}\n\nexports.graphql = graphql$1;\nexports.withCustomRequest = withCustomRequest;\n//# sourceMappingURL=index.js.map\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nconst VERSION = \"2.6.0\";\n\n/**\n * Some “list” response that can be paginated have a different response structure\n *\n * They have a `total_count` key in the response (search also has `incomplete_results`,\n * /installation/repositories also has `repository_selection`), as well as a key with\n * the list of the items which name varies from endpoint to endpoint.\n *\n * Octokit normalizes these responses so that paginated results are always returned following\n * the same structure. One challenge is that if the list response has only one page, no Link\n * header is provided, so this header alone is not sufficient to check wether a response is\n * paginated or not.\n *\n * We check if a \"total_count\" key is present in the response data, but also make sure that\n * a \"url\" property is not, as the \"Get the combined status for a specific ref\" endpoint would\n * otherwise match: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref\n */\nfunction normalizePaginatedListResponse(response) {\n const responseNeedsNormalization = \"total_count\" in response.data && !(\"url\" in response.data);\n if (!responseNeedsNormalization) return response; // keep the additional properties intact as there is currently no other way\n // to retrieve the same information.\n\n const incompleteResults = response.data.incomplete_results;\n const repositorySelection = response.data.repository_selection;\n const totalCount = response.data.total_count;\n delete response.data.incomplete_results;\n delete response.data.repository_selection;\n delete response.data.total_count;\n const namespaceKey = Object.keys(response.data)[0];\n const data = response.data[namespaceKey];\n response.data = data;\n\n if (typeof incompleteResults !== \"undefined\") {\n response.data.incomplete_results = incompleteResults;\n }\n\n if (typeof repositorySelection !== \"undefined\") {\n response.data.repository_selection = repositorySelection;\n }\n\n response.data.total_count = totalCount;\n return response;\n}\n\nfunction iterator(octokit, route, parameters) {\n const options = typeof route === \"function\" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters);\n const requestMethod = typeof route === \"function\" ? route : octokit.request;\n const method = options.method;\n const headers = options.headers;\n let url = options.url;\n return {\n [Symbol.asyncIterator]: () => ({\n async next() {\n if (!url) return {\n done: true\n };\n const response = await requestMethod({\n method,\n url,\n headers\n });\n const normalizedResponse = normalizePaginatedListResponse(response); // `response.headers.link` format:\n // '; rel=\"next\", ; rel=\"last\"'\n // sets `url` to undefined if \"next\" URL is not present or `link` header is not set\n\n url = ((normalizedResponse.headers.link || \"\").match(/<([^>]+)>;\\s*rel=\"next\"/) || [])[1];\n return {\n value: normalizedResponse\n };\n }\n\n })\n };\n}\n\nfunction paginate(octokit, route, parameters, mapFn) {\n if (typeof parameters === \"function\") {\n mapFn = parameters;\n parameters = undefined;\n }\n\n return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn);\n}\n\nfunction gather(octokit, results, iterator, mapFn) {\n return iterator.next().then(result => {\n if (result.done) {\n return results;\n }\n\n let earlyExit = false;\n\n function done() {\n earlyExit = true;\n }\n\n results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data);\n\n if (earlyExit) {\n return results;\n }\n\n return gather(octokit, results, iterator, mapFn);\n });\n}\n\nconst composePaginateRest = Object.assign(paginate, {\n iterator\n});\n\n/**\n * @param octokit Octokit instance\n * @param options Options passed to Octokit constructor\n */\n\nfunction paginateRest(octokit) {\n return {\n paginate: Object.assign(paginate.bind(null, octokit), {\n iterator: iterator.bind(null, octokit)\n })\n };\n}\npaginateRest.VERSION = VERSION;\n\nexports.composePaginateRest = composePaginateRest;\nexports.paginateRest = paginateRest;\n//# sourceMappingURL=index.js.map\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nconst Endpoints = {\n actions: {\n addSelectedRepoToOrgSecret: [\"PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}\"],\n cancelWorkflowRun: [\"POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel\"],\n createOrUpdateOrgSecret: [\"PUT /orgs/{org}/actions/secrets/{secret_name}\"],\n createOrUpdateRepoSecret: [\"PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}\"],\n createRegistrationTokenForOrg: [\"POST /orgs/{org}/actions/runners/registration-token\"],\n createRegistrationTokenForRepo: [\"POST /repos/{owner}/{repo}/actions/runners/registration-token\"],\n createRemoveTokenForOrg: [\"POST /orgs/{org}/actions/runners/remove-token\"],\n createRemoveTokenForRepo: [\"POST /repos/{owner}/{repo}/actions/runners/remove-token\"],\n createWorkflowDispatch: [\"POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches\"],\n deleteArtifact: [\"DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}\"],\n deleteOrgSecret: [\"DELETE /orgs/{org}/actions/secrets/{secret_name}\"],\n deleteRepoSecret: [\"DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}\"],\n deleteSelfHostedRunnerFromOrg: [\"DELETE /orgs/{org}/actions/runners/{runner_id}\"],\n deleteSelfHostedRunnerFromRepo: [\"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}\"],\n deleteWorkflowRun: [\"DELETE /repos/{owner}/{repo}/actions/runs/{run_id}\"],\n deleteWorkflowRunLogs: [\"DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs\"],\n downloadArtifact: [\"GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}\"],\n downloadJobLogsForWorkflowRun: [\"GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs\"],\n downloadWorkflowRunLogs: [\"GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs\"],\n getArtifact: [\"GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}\"],\n getJobForWorkflowRun: [\"GET /repos/{owner}/{repo}/actions/jobs/{job_id}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/actions/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/actions/secrets/{secret_name}\"],\n getRepoPublicKey: [\"GET /repos/{owner}/{repo}/actions/secrets/public-key\"],\n getRepoSecret: [\"GET /repos/{owner}/{repo}/actions/secrets/{secret_name}\"],\n getSelfHostedRunnerForOrg: [\"GET /orgs/{org}/actions/runners/{runner_id}\"],\n getSelfHostedRunnerForRepo: [\"GET /repos/{owner}/{repo}/actions/runners/{runner_id}\"],\n getWorkflow: [\"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}\"],\n getWorkflowRun: [\"GET /repos/{owner}/{repo}/actions/runs/{run_id}\"],\n getWorkflowRunUsage: [\"GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing\"],\n getWorkflowUsage: [\"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing\"],\n listArtifactsForRepo: [\"GET /repos/{owner}/{repo}/actions/artifacts\"],\n listJobsForWorkflowRun: [\"GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs\"],\n listOrgSecrets: [\"GET /orgs/{org}/actions/secrets\"],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/actions/secrets\"],\n listRepoWorkflows: [\"GET /repos/{owner}/{repo}/actions/workflows\"],\n listRunnerApplicationsForOrg: [\"GET /orgs/{org}/actions/runners/downloads\"],\n listRunnerApplicationsForRepo: [\"GET /repos/{owner}/{repo}/actions/runners/downloads\"],\n listSelectedReposForOrgSecret: [\"GET /orgs/{org}/actions/secrets/{secret_name}/repositories\"],\n listSelfHostedRunnersForOrg: [\"GET /orgs/{org}/actions/runners\"],\n listSelfHostedRunnersForRepo: [\"GET /repos/{owner}/{repo}/actions/runners\"],\n listWorkflowRunArtifacts: [\"GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts\"],\n listWorkflowRuns: [\"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs\"],\n listWorkflowRunsForRepo: [\"GET /repos/{owner}/{repo}/actions/runs\"],\n reRunWorkflow: [\"POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun\"],\n removeSelectedRepoFromOrgSecret: [\"DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}\"],\n setSelectedReposForOrgSecret: [\"PUT /orgs/{org}/actions/secrets/{secret_name}/repositories\"]\n },\n activity: {\n checkRepoIsStarredByAuthenticatedUser: [\"GET /user/starred/{owner}/{repo}\"],\n deleteRepoSubscription: [\"DELETE /repos/{owner}/{repo}/subscription\"],\n deleteThreadSubscription: [\"DELETE /notifications/threads/{thread_id}/subscription\"],\n getFeeds: [\"GET /feeds\"],\n getRepoSubscription: [\"GET /repos/{owner}/{repo}/subscription\"],\n getThread: [\"GET /notifications/threads/{thread_id}\"],\n getThreadSubscriptionForAuthenticatedUser: [\"GET /notifications/threads/{thread_id}/subscription\"],\n listEventsForAuthenticatedUser: [\"GET /users/{username}/events\"],\n listNotificationsForAuthenticatedUser: [\"GET /notifications\"],\n listOrgEventsForAuthenticatedUser: [\"GET /users/{username}/events/orgs/{org}\"],\n listPublicEvents: [\"GET /events\"],\n listPublicEventsForRepoNetwork: [\"GET /networks/{owner}/{repo}/events\"],\n listPublicEventsForUser: [\"GET /users/{username}/events/public\"],\n listPublicOrgEvents: [\"GET /orgs/{org}/events\"],\n listReceivedEventsForUser: [\"GET /users/{username}/received_events\"],\n listReceivedPublicEventsForUser: [\"GET /users/{username}/received_events/public\"],\n listRepoEvents: [\"GET /repos/{owner}/{repo}/events\"],\n listRepoNotificationsForAuthenticatedUser: [\"GET /repos/{owner}/{repo}/notifications\"],\n listReposStarredByAuthenticatedUser: [\"GET /user/starred\"],\n listReposStarredByUser: [\"GET /users/{username}/starred\"],\n listReposWatchedByUser: [\"GET /users/{username}/subscriptions\"],\n listStargazersForRepo: [\"GET /repos/{owner}/{repo}/stargazers\"],\n listWatchedReposForAuthenticatedUser: [\"GET /user/subscriptions\"],\n listWatchersForRepo: [\"GET /repos/{owner}/{repo}/subscribers\"],\n markNotificationsAsRead: [\"PUT /notifications\"],\n markRepoNotificationsAsRead: [\"PUT /repos/{owner}/{repo}/notifications\"],\n markThreadAsRead: [\"PATCH /notifications/threads/{thread_id}\"],\n setRepoSubscription: [\"PUT /repos/{owner}/{repo}/subscription\"],\n setThreadSubscription: [\"PUT /notifications/threads/{thread_id}/subscription\"],\n starRepoForAuthenticatedUser: [\"PUT /user/starred/{owner}/{repo}\"],\n unstarRepoForAuthenticatedUser: [\"DELETE /user/starred/{owner}/{repo}\"]\n },\n apps: {\n addRepoToInstallation: [\"PUT /user/installations/{installation_id}/repositories/{repository_id}\"],\n checkToken: [\"POST /applications/{client_id}/token\"],\n createContentAttachment: [\"POST /content_references/{content_reference_id}/attachments\", {\n mediaType: {\n previews: [\"corsair\"]\n }\n }],\n createFromManifest: [\"POST /app-manifests/{code}/conversions\"],\n createInstallationAccessToken: [\"POST /app/installations/{installation_id}/access_tokens\"],\n deleteAuthorization: [\"DELETE /applications/{client_id}/grant\"],\n deleteInstallation: [\"DELETE /app/installations/{installation_id}\"],\n deleteToken: [\"DELETE /applications/{client_id}/token\"],\n getAuthenticated: [\"GET /app\"],\n getBySlug: [\"GET /apps/{app_slug}\"],\n getInstallation: [\"GET /app/installations/{installation_id}\"],\n getOrgInstallation: [\"GET /orgs/{org}/installation\"],\n getRepoInstallation: [\"GET /repos/{owner}/{repo}/installation\"],\n getSubscriptionPlanForAccount: [\"GET /marketplace_listing/accounts/{account_id}\"],\n getSubscriptionPlanForAccountStubbed: [\"GET /marketplace_listing/stubbed/accounts/{account_id}\"],\n getUserInstallation: [\"GET /users/{username}/installation\"],\n listAccountsForPlan: [\"GET /marketplace_listing/plans/{plan_id}/accounts\"],\n listAccountsForPlanStubbed: [\"GET /marketplace_listing/stubbed/plans/{plan_id}/accounts\"],\n listInstallationReposForAuthenticatedUser: [\"GET /user/installations/{installation_id}/repositories\"],\n listInstallations: [\"GET /app/installations\"],\n listInstallationsForAuthenticatedUser: [\"GET /user/installations\"],\n listPlans: [\"GET /marketplace_listing/plans\"],\n listPlansStubbed: [\"GET /marketplace_listing/stubbed/plans\"],\n listReposAccessibleToInstallation: [\"GET /installation/repositories\"],\n listSubscriptionsForAuthenticatedUser: [\"GET /user/marketplace_purchases\"],\n listSubscriptionsForAuthenticatedUserStubbed: [\"GET /user/marketplace_purchases/stubbed\"],\n removeRepoFromInstallation: [\"DELETE /user/installations/{installation_id}/repositories/{repository_id}\"],\n resetToken: [\"PATCH /applications/{client_id}/token\"],\n revokeInstallationAccessToken: [\"DELETE /installation/token\"],\n suspendInstallation: [\"PUT /app/installations/{installation_id}/suspended\"],\n unsuspendInstallation: [\"DELETE /app/installations/{installation_id}/suspended\"]\n },\n billing: {\n getGithubActionsBillingOrg: [\"GET /orgs/{org}/settings/billing/actions\"],\n getGithubActionsBillingUser: [\"GET /users/{username}/settings/billing/actions\"],\n getGithubPackagesBillingOrg: [\"GET /orgs/{org}/settings/billing/packages\"],\n getGithubPackagesBillingUser: [\"GET /users/{username}/settings/billing/packages\"],\n getSharedStorageBillingOrg: [\"GET /orgs/{org}/settings/billing/shared-storage\"],\n getSharedStorageBillingUser: [\"GET /users/{username}/settings/billing/shared-storage\"]\n },\n checks: {\n create: [\"POST /repos/{owner}/{repo}/check-runs\", {\n mediaType: {\n previews: [\"antiope\"]\n }\n }],\n createSuite: [\"POST /repos/{owner}/{repo}/check-suites\", {\n mediaType: {\n previews: [\"antiope\"]\n }\n }],\n get: [\"GET /repos/{owner}/{repo}/check-runs/{check_run_id}\", {\n mediaType: {\n previews: [\"antiope\"]\n }\n }],\n getSuite: [\"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}\", {\n mediaType: {\n previews: [\"antiope\"]\n }\n }],\n listAnnotations: [\"GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations\", {\n mediaType: {\n previews: [\"antiope\"]\n }\n }],\n listForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/check-runs\", {\n mediaType: {\n previews: [\"antiope\"]\n }\n }],\n listForSuite: [\"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs\", {\n mediaType: {\n previews: [\"antiope\"]\n }\n }],\n listSuitesForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/check-suites\", {\n mediaType: {\n previews: [\"antiope\"]\n }\n }],\n rerequestSuite: [\"POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest\", {\n mediaType: {\n previews: [\"antiope\"]\n }\n }],\n setSuitesPreferences: [\"PATCH /repos/{owner}/{repo}/check-suites/preferences\", {\n mediaType: {\n previews: [\"antiope\"]\n }\n }],\n update: [\"PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}\", {\n mediaType: {\n previews: [\"antiope\"]\n }\n }]\n },\n codeScanning: {\n getAlert: [\"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}\", {}, {\n renamedParameters: {\n alert_id: \"alert_number\"\n }\n }],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/code-scanning/alerts\"],\n listRecentAnalyses: [\"GET /repos/{owner}/{repo}/code-scanning/analyses\"],\n updateAlert: [\"PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}\"],\n uploadSarif: [\"POST /repos/{owner}/{repo}/code-scanning/sarifs\"]\n },\n codesOfConduct: {\n getAllCodesOfConduct: [\"GET /codes_of_conduct\", {\n mediaType: {\n previews: [\"scarlet-witch\"]\n }\n }],\n getConductCode: [\"GET /codes_of_conduct/{key}\", {\n mediaType: {\n previews: [\"scarlet-witch\"]\n }\n }],\n getForRepo: [\"GET /repos/{owner}/{repo}/community/code_of_conduct\", {\n mediaType: {\n previews: [\"scarlet-witch\"]\n }\n }]\n },\n emojis: {\n get: [\"GET /emojis\"]\n },\n gists: {\n checkIsStarred: [\"GET /gists/{gist_id}/star\"],\n create: [\"POST /gists\"],\n createComment: [\"POST /gists/{gist_id}/comments\"],\n delete: [\"DELETE /gists/{gist_id}\"],\n deleteComment: [\"DELETE /gists/{gist_id}/comments/{comment_id}\"],\n fork: [\"POST /gists/{gist_id}/forks\"],\n get: [\"GET /gists/{gist_id}\"],\n getComment: [\"GET /gists/{gist_id}/comments/{comment_id}\"],\n getRevision: [\"GET /gists/{gist_id}/{sha}\"],\n list: [\"GET /gists\"],\n listComments: [\"GET /gists/{gist_id}/comments\"],\n listCommits: [\"GET /gists/{gist_id}/commits\"],\n listForUser: [\"GET /users/{username}/gists\"],\n listForks: [\"GET /gists/{gist_id}/forks\"],\n listPublic: [\"GET /gists/public\"],\n listStarred: [\"GET /gists/starred\"],\n star: [\"PUT /gists/{gist_id}/star\"],\n unstar: [\"DELETE /gists/{gist_id}/star\"],\n update: [\"PATCH /gists/{gist_id}\"],\n updateComment: [\"PATCH /gists/{gist_id}/comments/{comment_id}\"]\n },\n git: {\n createBlob: [\"POST /repos/{owner}/{repo}/git/blobs\"],\n createCommit: [\"POST /repos/{owner}/{repo}/git/commits\"],\n createRef: [\"POST /repos/{owner}/{repo}/git/refs\"],\n createTag: [\"POST /repos/{owner}/{repo}/git/tags\"],\n createTree: [\"POST /repos/{owner}/{repo}/git/trees\"],\n deleteRef: [\"DELETE /repos/{owner}/{repo}/git/refs/{ref}\"],\n getBlob: [\"GET /repos/{owner}/{repo}/git/blobs/{file_sha}\"],\n getCommit: [\"GET /repos/{owner}/{repo}/git/commits/{commit_sha}\"],\n getRef: [\"GET /repos/{owner}/{repo}/git/ref/{ref}\"],\n getTag: [\"GET /repos/{owner}/{repo}/git/tags/{tag_sha}\"],\n getTree: [\"GET /repos/{owner}/{repo}/git/trees/{tree_sha}\"],\n listMatchingRefs: [\"GET /repos/{owner}/{repo}/git/matching-refs/{ref}\"],\n updateRef: [\"PATCH /repos/{owner}/{repo}/git/refs/{ref}\"]\n },\n gitignore: {\n getAllTemplates: [\"GET /gitignore/templates\"],\n getTemplate: [\"GET /gitignore/templates/{name}\"]\n },\n interactions: {\n getRestrictionsForOrg: [\"GET /orgs/{org}/interaction-limits\", {\n mediaType: {\n previews: [\"sombra\"]\n }\n }],\n getRestrictionsForRepo: [\"GET /repos/{owner}/{repo}/interaction-limits\", {\n mediaType: {\n previews: [\"sombra\"]\n }\n }],\n removeRestrictionsForOrg: [\"DELETE /orgs/{org}/interaction-limits\", {\n mediaType: {\n previews: [\"sombra\"]\n }\n }],\n removeRestrictionsForRepo: [\"DELETE /repos/{owner}/{repo}/interaction-limits\", {\n mediaType: {\n previews: [\"sombra\"]\n }\n }],\n setRestrictionsForOrg: [\"PUT /orgs/{org}/interaction-limits\", {\n mediaType: {\n previews: [\"sombra\"]\n }\n }],\n setRestrictionsForRepo: [\"PUT /repos/{owner}/{repo}/interaction-limits\", {\n mediaType: {\n previews: [\"sombra\"]\n }\n }]\n },\n issues: {\n addAssignees: [\"POST /repos/{owner}/{repo}/issues/{issue_number}/assignees\"],\n addLabels: [\"POST /repos/{owner}/{repo}/issues/{issue_number}/labels\"],\n checkUserCanBeAssigned: [\"GET /repos/{owner}/{repo}/assignees/{assignee}\"],\n create: [\"POST /repos/{owner}/{repo}/issues\"],\n createComment: [\"POST /repos/{owner}/{repo}/issues/{issue_number}/comments\"],\n createLabel: [\"POST /repos/{owner}/{repo}/labels\"],\n createMilestone: [\"POST /repos/{owner}/{repo}/milestones\"],\n deleteComment: [\"DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}\"],\n deleteLabel: [\"DELETE /repos/{owner}/{repo}/labels/{name}\"],\n deleteMilestone: [\"DELETE /repos/{owner}/{repo}/milestones/{milestone_number}\"],\n get: [\"GET /repos/{owner}/{repo}/issues/{issue_number}\"],\n getComment: [\"GET /repos/{owner}/{repo}/issues/comments/{comment_id}\"],\n getEvent: [\"GET /repos/{owner}/{repo}/issues/events/{event_id}\"],\n getLabel: [\"GET /repos/{owner}/{repo}/labels/{name}\"],\n getMilestone: [\"GET /repos/{owner}/{repo}/milestones/{milestone_number}\"],\n list: [\"GET /issues\"],\n listAssignees: [\"GET /repos/{owner}/{repo}/assignees\"],\n listComments: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/comments\"],\n listCommentsForRepo: [\"GET /repos/{owner}/{repo}/issues/comments\"],\n listEvents: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/events\"],\n listEventsForRepo: [\"GET /repos/{owner}/{repo}/issues/events\"],\n listEventsForTimeline: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/timeline\", {\n mediaType: {\n previews: [\"mockingbird\"]\n }\n }],\n listForAuthenticatedUser: [\"GET /user/issues\"],\n listForOrg: [\"GET /orgs/{org}/issues\"],\n listForRepo: [\"GET /repos/{owner}/{repo}/issues\"],\n listLabelsForMilestone: [\"GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels\"],\n listLabelsForRepo: [\"GET /repos/{owner}/{repo}/labels\"],\n listLabelsOnIssue: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/labels\"],\n listMilestones: [\"GET /repos/{owner}/{repo}/milestones\"],\n lock: [\"PUT /repos/{owner}/{repo}/issues/{issue_number}/lock\"],\n removeAllLabels: [\"DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels\"],\n removeAssignees: [\"DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees\"],\n removeLabel: [\"DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}\"],\n setLabels: [\"PUT /repos/{owner}/{repo}/issues/{issue_number}/labels\"],\n unlock: [\"DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock\"],\n update: [\"PATCH /repos/{owner}/{repo}/issues/{issue_number}\"],\n updateComment: [\"PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}\"],\n updateLabel: [\"PATCH /repos/{owner}/{repo}/labels/{name}\"],\n updateMilestone: [\"PATCH /repos/{owner}/{repo}/milestones/{milestone_number}\"]\n },\n licenses: {\n get: [\"GET /licenses/{license}\"],\n getAllCommonlyUsed: [\"GET /licenses\"],\n getForRepo: [\"GET /repos/{owner}/{repo}/license\"]\n },\n markdown: {\n render: [\"POST /markdown\"],\n renderRaw: [\"POST /markdown/raw\", {\n headers: {\n \"content-type\": \"text/plain; charset=utf-8\"\n }\n }]\n },\n meta: {\n get: [\"GET /meta\"]\n },\n migrations: {\n cancelImport: [\"DELETE /repos/{owner}/{repo}/import\"],\n deleteArchiveForAuthenticatedUser: [\"DELETE /user/migrations/{migration_id}/archive\", {\n mediaType: {\n previews: [\"wyandotte\"]\n }\n }],\n deleteArchiveForOrg: [\"DELETE /orgs/{org}/migrations/{migration_id}/archive\", {\n mediaType: {\n previews: [\"wyandotte\"]\n }\n }],\n downloadArchiveForOrg: [\"GET /orgs/{org}/migrations/{migration_id}/archive\", {\n mediaType: {\n previews: [\"wyandotte\"]\n }\n }],\n getArchiveForAuthenticatedUser: [\"GET /user/migrations/{migration_id}/archive\", {\n mediaType: {\n previews: [\"wyandotte\"]\n }\n }],\n getCommitAuthors: [\"GET /repos/{owner}/{repo}/import/authors\"],\n getImportStatus: [\"GET /repos/{owner}/{repo}/import\"],\n getLargeFiles: [\"GET /repos/{owner}/{repo}/import/large_files\"],\n getStatusForAuthenticatedUser: [\"GET /user/migrations/{migration_id}\", {\n mediaType: {\n previews: [\"wyandotte\"]\n }\n }],\n getStatusForOrg: [\"GET /orgs/{org}/migrations/{migration_id}\", {\n mediaType: {\n previews: [\"wyandotte\"]\n }\n }],\n listForAuthenticatedUser: [\"GET /user/migrations\", {\n mediaType: {\n previews: [\"wyandotte\"]\n }\n }],\n listForOrg: [\"GET /orgs/{org}/migrations\", {\n mediaType: {\n previews: [\"wyandotte\"]\n }\n }],\n listReposForOrg: [\"GET /orgs/{org}/migrations/{migration_id}/repositories\", {\n mediaType: {\n previews: [\"wyandotte\"]\n }\n }],\n listReposForUser: [\"GET /user/migrations/{migration_id}/repositories\", {\n mediaType: {\n previews: [\"wyandotte\"]\n }\n }],\n mapCommitAuthor: [\"PATCH /repos/{owner}/{repo}/import/authors/{author_id}\"],\n setLfsPreference: [\"PATCH /repos/{owner}/{repo}/import/lfs\"],\n startForAuthenticatedUser: [\"POST /user/migrations\"],\n startForOrg: [\"POST /orgs/{org}/migrations\"],\n startImport: [\"PUT /repos/{owner}/{repo}/import\"],\n unlockRepoForAuthenticatedUser: [\"DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock\", {\n mediaType: {\n previews: [\"wyandotte\"]\n }\n }],\n unlockRepoForOrg: [\"DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock\", {\n mediaType: {\n previews: [\"wyandotte\"]\n }\n }],\n updateImport: [\"PATCH /repos/{owner}/{repo}/import\"]\n },\n orgs: {\n blockUser: [\"PUT /orgs/{org}/blocks/{username}\"],\n checkBlockedUser: [\"GET /orgs/{org}/blocks/{username}\"],\n checkMembershipForUser: [\"GET /orgs/{org}/members/{username}\"],\n checkPublicMembershipForUser: [\"GET /orgs/{org}/public_members/{username}\"],\n convertMemberToOutsideCollaborator: [\"PUT /orgs/{org}/outside_collaborators/{username}\"],\n createInvitation: [\"POST /orgs/{org}/invitations\"],\n createWebhook: [\"POST /orgs/{org}/hooks\"],\n deleteWebhook: [\"DELETE /orgs/{org}/hooks/{hook_id}\"],\n get: [\"GET /orgs/{org}\"],\n getMembershipForAuthenticatedUser: [\"GET /user/memberships/orgs/{org}\"],\n getMembershipForUser: [\"GET /orgs/{org}/memberships/{username}\"],\n getWebhook: [\"GET /orgs/{org}/hooks/{hook_id}\"],\n list: [\"GET /organizations\"],\n listAppInstallations: [\"GET /orgs/{org}/installations\"],\n listBlockedUsers: [\"GET /orgs/{org}/blocks\"],\n listForAuthenticatedUser: [\"GET /user/orgs\"],\n listForUser: [\"GET /users/{username}/orgs\"],\n listInvitationTeams: [\"GET /orgs/{org}/invitations/{invitation_id}/teams\"],\n listMembers: [\"GET /orgs/{org}/members\"],\n listMembershipsForAuthenticatedUser: [\"GET /user/memberships/orgs\"],\n listOutsideCollaborators: [\"GET /orgs/{org}/outside_collaborators\"],\n listPendingInvitations: [\"GET /orgs/{org}/invitations\"],\n listPublicMembers: [\"GET /orgs/{org}/public_members\"],\n listWebhooks: [\"GET /orgs/{org}/hooks\"],\n pingWebhook: [\"POST /orgs/{org}/hooks/{hook_id}/pings\"],\n removeMember: [\"DELETE /orgs/{org}/members/{username}\"],\n removeMembershipForUser: [\"DELETE /orgs/{org}/memberships/{username}\"],\n removeOutsideCollaborator: [\"DELETE /orgs/{org}/outside_collaborators/{username}\"],\n removePublicMembershipForAuthenticatedUser: [\"DELETE /orgs/{org}/public_members/{username}\"],\n setMembershipForUser: [\"PUT /orgs/{org}/memberships/{username}\"],\n setPublicMembershipForAuthenticatedUser: [\"PUT /orgs/{org}/public_members/{username}\"],\n unblockUser: [\"DELETE /orgs/{org}/blocks/{username}\"],\n update: [\"PATCH /orgs/{org}\"],\n updateMembershipForAuthenticatedUser: [\"PATCH /user/memberships/orgs/{org}\"],\n updateWebhook: [\"PATCH /orgs/{org}/hooks/{hook_id}\"]\n },\n projects: {\n addCollaborator: [\"PUT /projects/{project_id}/collaborators/{username}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n createCard: [\"POST /projects/columns/{column_id}/cards\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n createColumn: [\"POST /projects/{project_id}/columns\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n createForAuthenticatedUser: [\"POST /user/projects\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n createForOrg: [\"POST /orgs/{org}/projects\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n createForRepo: [\"POST /repos/{owner}/{repo}/projects\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n delete: [\"DELETE /projects/{project_id}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n deleteCard: [\"DELETE /projects/columns/cards/{card_id}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n deleteColumn: [\"DELETE /projects/columns/{column_id}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n get: [\"GET /projects/{project_id}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n getCard: [\"GET /projects/columns/cards/{card_id}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n getColumn: [\"GET /projects/columns/{column_id}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n getPermissionForUser: [\"GET /projects/{project_id}/collaborators/{username}/permission\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n listCards: [\"GET /projects/columns/{column_id}/cards\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n listCollaborators: [\"GET /projects/{project_id}/collaborators\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n listColumns: [\"GET /projects/{project_id}/columns\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n listForOrg: [\"GET /orgs/{org}/projects\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n listForRepo: [\"GET /repos/{owner}/{repo}/projects\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n listForUser: [\"GET /users/{username}/projects\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n moveCard: [\"POST /projects/columns/cards/{card_id}/moves\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n moveColumn: [\"POST /projects/columns/{column_id}/moves\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n removeCollaborator: [\"DELETE /projects/{project_id}/collaborators/{username}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n update: [\"PATCH /projects/{project_id}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n updateCard: [\"PATCH /projects/columns/cards/{card_id}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n updateColumn: [\"PATCH /projects/columns/{column_id}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }]\n },\n pulls: {\n checkIfMerged: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/merge\"],\n create: [\"POST /repos/{owner}/{repo}/pulls\"],\n createReplyForReviewComment: [\"POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies\"],\n createReview: [\"POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews\"],\n createReviewComment: [\"POST /repos/{owner}/{repo}/pulls/{pull_number}/comments\"],\n deletePendingReview: [\"DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\"],\n deleteReviewComment: [\"DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}\"],\n dismissReview: [\"PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals\"],\n get: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}\"],\n getReview: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\"],\n getReviewComment: [\"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}\"],\n list: [\"GET /repos/{owner}/{repo}/pulls\"],\n listCommentsForReview: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments\"],\n listCommits: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/commits\"],\n listFiles: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/files\"],\n listRequestedReviewers: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\"],\n listReviewComments: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/comments\"],\n listReviewCommentsForRepo: [\"GET /repos/{owner}/{repo}/pulls/comments\"],\n listReviews: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews\"],\n merge: [\"PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge\"],\n removeRequestedReviewers: [\"DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\"],\n requestReviewers: [\"POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\"],\n submitReview: [\"POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events\"],\n update: [\"PATCH /repos/{owner}/{repo}/pulls/{pull_number}\"],\n updateBranch: [\"PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch\", {\n mediaType: {\n previews: [\"lydian\"]\n }\n }],\n updateReview: [\"PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\"],\n updateReviewComment: [\"PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}\"]\n },\n rateLimit: {\n get: [\"GET /rate_limit\"]\n },\n reactions: {\n createForCommitComment: [\"POST /repos/{owner}/{repo}/comments/{comment_id}/reactions\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n createForIssue: [\"POST /repos/{owner}/{repo}/issues/{issue_number}/reactions\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n createForIssueComment: [\"POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n createForPullRequestReviewComment: [\"POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n createForTeamDiscussionCommentInOrg: [\"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n createForTeamDiscussionInOrg: [\"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n deleteForCommitComment: [\"DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n deleteForIssue: [\"DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n deleteForIssueComment: [\"DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n deleteForPullRequestComment: [\"DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n deleteForTeamDiscussion: [\"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n deleteForTeamDiscussionComment: [\"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n deleteLegacy: [\"DELETE /reactions/{reaction_id}\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }, {\n deprecated: \"octokit.reactions.deleteLegacy() is deprecated, see https://developer.github.com/v3/reactions/#delete-a-reaction-legacy\"\n }],\n listForCommitComment: [\"GET /repos/{owner}/{repo}/comments/{comment_id}/reactions\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n listForIssue: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/reactions\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n listForIssueComment: [\"GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n listForPullRequestReviewComment: [\"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n listForTeamDiscussionCommentInOrg: [\"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }],\n listForTeamDiscussionInOrg: [\"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\", {\n mediaType: {\n previews: [\"squirrel-girl\"]\n }\n }]\n },\n repos: {\n acceptInvitation: [\"PATCH /user/repository_invitations/{invitation_id}\"],\n addAppAccessRestrictions: [\"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\", {}, {\n mapToData: \"apps\"\n }],\n addCollaborator: [\"PUT /repos/{owner}/{repo}/collaborators/{username}\"],\n addStatusCheckContexts: [\"POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\", {}, {\n mapToData: \"contexts\"\n }],\n addTeamAccessRestrictions: [\"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\", {}, {\n mapToData: \"teams\"\n }],\n addUserAccessRestrictions: [\"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\", {}, {\n mapToData: \"users\"\n }],\n checkCollaborator: [\"GET /repos/{owner}/{repo}/collaborators/{username}\"],\n checkVulnerabilityAlerts: [\"GET /repos/{owner}/{repo}/vulnerability-alerts\", {\n mediaType: {\n previews: [\"dorian\"]\n }\n }],\n compareCommits: [\"GET /repos/{owner}/{repo}/compare/{base}...{head}\"],\n createCommitComment: [\"POST /repos/{owner}/{repo}/commits/{commit_sha}/comments\"],\n createCommitSignatureProtection: [\"POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\", {\n mediaType: {\n previews: [\"zzzax\"]\n }\n }],\n createCommitStatus: [\"POST /repos/{owner}/{repo}/statuses/{sha}\"],\n createDeployKey: [\"POST /repos/{owner}/{repo}/keys\"],\n createDeployment: [\"POST /repos/{owner}/{repo}/deployments\"],\n createDeploymentStatus: [\"POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\"],\n createDispatchEvent: [\"POST /repos/{owner}/{repo}/dispatches\"],\n createForAuthenticatedUser: [\"POST /user/repos\"],\n createFork: [\"POST /repos/{owner}/{repo}/forks\"],\n createInOrg: [\"POST /orgs/{org}/repos\"],\n createOrUpdateFileContents: [\"PUT /repos/{owner}/{repo}/contents/{path}\"],\n createPagesSite: [\"POST /repos/{owner}/{repo}/pages\", {\n mediaType: {\n previews: [\"switcheroo\"]\n }\n }],\n createRelease: [\"POST /repos/{owner}/{repo}/releases\"],\n createUsingTemplate: [\"POST /repos/{template_owner}/{template_repo}/generate\", {\n mediaType: {\n previews: [\"baptiste\"]\n }\n }],\n createWebhook: [\"POST /repos/{owner}/{repo}/hooks\"],\n declineInvitation: [\"DELETE /user/repository_invitations/{invitation_id}\"],\n delete: [\"DELETE /repos/{owner}/{repo}\"],\n deleteAccessRestrictions: [\"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions\"],\n deleteAdminBranchProtection: [\"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\"],\n deleteBranchProtection: [\"DELETE /repos/{owner}/{repo}/branches/{branch}/protection\"],\n deleteCommitComment: [\"DELETE /repos/{owner}/{repo}/comments/{comment_id}\"],\n deleteCommitSignatureProtection: [\"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\", {\n mediaType: {\n previews: [\"zzzax\"]\n }\n }],\n deleteDeployKey: [\"DELETE /repos/{owner}/{repo}/keys/{key_id}\"],\n deleteDeployment: [\"DELETE /repos/{owner}/{repo}/deployments/{deployment_id}\"],\n deleteFile: [\"DELETE /repos/{owner}/{repo}/contents/{path}\"],\n deleteInvitation: [\"DELETE /repos/{owner}/{repo}/invitations/{invitation_id}\"],\n deletePagesSite: [\"DELETE /repos/{owner}/{repo}/pages\", {\n mediaType: {\n previews: [\"switcheroo\"]\n }\n }],\n deletePullRequestReviewProtection: [\"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\"],\n deleteRelease: [\"DELETE /repos/{owner}/{repo}/releases/{release_id}\"],\n deleteReleaseAsset: [\"DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}\"],\n deleteWebhook: [\"DELETE /repos/{owner}/{repo}/hooks/{hook_id}\"],\n disableAutomatedSecurityFixes: [\"DELETE /repos/{owner}/{repo}/automated-security-fixes\", {\n mediaType: {\n previews: [\"london\"]\n }\n }],\n disableVulnerabilityAlerts: [\"DELETE /repos/{owner}/{repo}/vulnerability-alerts\", {\n mediaType: {\n previews: [\"dorian\"]\n }\n }],\n downloadArchive: [\"GET /repos/{owner}/{repo}/{archive_format}/{ref}\"],\n enableAutomatedSecurityFixes: [\"PUT /repos/{owner}/{repo}/automated-security-fixes\", {\n mediaType: {\n previews: [\"london\"]\n }\n }],\n enableVulnerabilityAlerts: [\"PUT /repos/{owner}/{repo}/vulnerability-alerts\", {\n mediaType: {\n previews: [\"dorian\"]\n }\n }],\n get: [\"GET /repos/{owner}/{repo}\"],\n getAccessRestrictions: [\"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions\"],\n getAdminBranchProtection: [\"GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\"],\n getAllStatusCheckContexts: [\"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\"],\n getAllTopics: [\"GET /repos/{owner}/{repo}/topics\", {\n mediaType: {\n previews: [\"mercy\"]\n }\n }],\n getAppsWithAccessToProtectedBranch: [\"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\"],\n getBranch: [\"GET /repos/{owner}/{repo}/branches/{branch}\"],\n getBranchProtection: [\"GET /repos/{owner}/{repo}/branches/{branch}/protection\"],\n getClones: [\"GET /repos/{owner}/{repo}/traffic/clones\"],\n getCodeFrequencyStats: [\"GET /repos/{owner}/{repo}/stats/code_frequency\"],\n getCollaboratorPermissionLevel: [\"GET /repos/{owner}/{repo}/collaborators/{username}/permission\"],\n getCombinedStatusForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/status\"],\n getCommit: [\"GET /repos/{owner}/{repo}/commits/{ref}\"],\n getCommitActivityStats: [\"GET /repos/{owner}/{repo}/stats/commit_activity\"],\n getCommitComment: [\"GET /repos/{owner}/{repo}/comments/{comment_id}\"],\n getCommitSignatureProtection: [\"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\", {\n mediaType: {\n previews: [\"zzzax\"]\n }\n }],\n getCommunityProfileMetrics: [\"GET /repos/{owner}/{repo}/community/profile\", {\n mediaType: {\n previews: [\"black-panther\"]\n }\n }],\n getContent: [\"GET /repos/{owner}/{repo}/contents/{path}\"],\n getContributorsStats: [\"GET /repos/{owner}/{repo}/stats/contributors\"],\n getDeployKey: [\"GET /repos/{owner}/{repo}/keys/{key_id}\"],\n getDeployment: [\"GET /repos/{owner}/{repo}/deployments/{deployment_id}\"],\n getDeploymentStatus: [\"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}\"],\n getLatestPagesBuild: [\"GET /repos/{owner}/{repo}/pages/builds/latest\"],\n getLatestRelease: [\"GET /repos/{owner}/{repo}/releases/latest\"],\n getPages: [\"GET /repos/{owner}/{repo}/pages\"],\n getPagesBuild: [\"GET /repos/{owner}/{repo}/pages/builds/{build_id}\"],\n getParticipationStats: [\"GET /repos/{owner}/{repo}/stats/participation\"],\n getPullRequestReviewProtection: [\"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\"],\n getPunchCardStats: [\"GET /repos/{owner}/{repo}/stats/punch_card\"],\n getReadme: [\"GET /repos/{owner}/{repo}/readme\"],\n getRelease: [\"GET /repos/{owner}/{repo}/releases/{release_id}\"],\n getReleaseAsset: [\"GET /repos/{owner}/{repo}/releases/assets/{asset_id}\"],\n getReleaseByTag: [\"GET /repos/{owner}/{repo}/releases/tags/{tag}\"],\n getStatusChecksProtection: [\"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\"],\n getTeamsWithAccessToProtectedBranch: [\"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\"],\n getTopPaths: [\"GET /repos/{owner}/{repo}/traffic/popular/paths\"],\n getTopReferrers: [\"GET /repos/{owner}/{repo}/traffic/popular/referrers\"],\n getUsersWithAccessToProtectedBranch: [\"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\"],\n getViews: [\"GET /repos/{owner}/{repo}/traffic/views\"],\n getWebhook: [\"GET /repos/{owner}/{repo}/hooks/{hook_id}\"],\n listBranches: [\"GET /repos/{owner}/{repo}/branches\"],\n listBranchesForHeadCommit: [\"GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head\", {\n mediaType: {\n previews: [\"groot\"]\n }\n }],\n listCollaborators: [\"GET /repos/{owner}/{repo}/collaborators\"],\n listCommentsForCommit: [\"GET /repos/{owner}/{repo}/commits/{commit_sha}/comments\"],\n listCommitCommentsForRepo: [\"GET /repos/{owner}/{repo}/comments\"],\n listCommitStatusesForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/statuses\"],\n listCommits: [\"GET /repos/{owner}/{repo}/commits\"],\n listContributors: [\"GET /repos/{owner}/{repo}/contributors\"],\n listDeployKeys: [\"GET /repos/{owner}/{repo}/keys\"],\n listDeploymentStatuses: [\"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\"],\n listDeployments: [\"GET /repos/{owner}/{repo}/deployments\"],\n listForAuthenticatedUser: [\"GET /user/repos\"],\n listForOrg: [\"GET /orgs/{org}/repos\"],\n listForUser: [\"GET /users/{username}/repos\"],\n listForks: [\"GET /repos/{owner}/{repo}/forks\"],\n listInvitations: [\"GET /repos/{owner}/{repo}/invitations\"],\n listInvitationsForAuthenticatedUser: [\"GET /user/repository_invitations\"],\n listLanguages: [\"GET /repos/{owner}/{repo}/languages\"],\n listPagesBuilds: [\"GET /repos/{owner}/{repo}/pages/builds\"],\n listPublic: [\"GET /repositories\"],\n listPullRequestsAssociatedWithCommit: [\"GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls\", {\n mediaType: {\n previews: [\"groot\"]\n }\n }],\n listReleaseAssets: [\"GET /repos/{owner}/{repo}/releases/{release_id}/assets\"],\n listReleases: [\"GET /repos/{owner}/{repo}/releases\"],\n listTags: [\"GET /repos/{owner}/{repo}/tags\"],\n listTeams: [\"GET /repos/{owner}/{repo}/teams\"],\n listWebhooks: [\"GET /repos/{owner}/{repo}/hooks\"],\n merge: [\"POST /repos/{owner}/{repo}/merges\"],\n pingWebhook: [\"POST /repos/{owner}/{repo}/hooks/{hook_id}/pings\"],\n removeAppAccessRestrictions: [\"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\", {}, {\n mapToData: \"apps\"\n }],\n removeCollaborator: [\"DELETE /repos/{owner}/{repo}/collaborators/{username}\"],\n removeStatusCheckContexts: [\"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\", {}, {\n mapToData: \"contexts\"\n }],\n removeStatusCheckProtection: [\"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\"],\n removeTeamAccessRestrictions: [\"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\", {}, {\n mapToData: \"teams\"\n }],\n removeUserAccessRestrictions: [\"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\", {}, {\n mapToData: \"users\"\n }],\n replaceAllTopics: [\"PUT /repos/{owner}/{repo}/topics\", {\n mediaType: {\n previews: [\"mercy\"]\n }\n }],\n requestPagesBuild: [\"POST /repos/{owner}/{repo}/pages/builds\"],\n setAdminBranchProtection: [\"POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\"],\n setAppAccessRestrictions: [\"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\", {}, {\n mapToData: \"apps\"\n }],\n setStatusCheckContexts: [\"PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\", {}, {\n mapToData: \"contexts\"\n }],\n setTeamAccessRestrictions: [\"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\", {}, {\n mapToData: \"teams\"\n }],\n setUserAccessRestrictions: [\"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\", {}, {\n mapToData: \"users\"\n }],\n testPushWebhook: [\"POST /repos/{owner}/{repo}/hooks/{hook_id}/tests\"],\n transfer: [\"POST /repos/{owner}/{repo}/transfer\"],\n update: [\"PATCH /repos/{owner}/{repo}\"],\n updateBranchProtection: [\"PUT /repos/{owner}/{repo}/branches/{branch}/protection\"],\n updateCommitComment: [\"PATCH /repos/{owner}/{repo}/comments/{comment_id}\"],\n updateInformationAboutPagesSite: [\"PUT /repos/{owner}/{repo}/pages\"],\n updateInvitation: [\"PATCH /repos/{owner}/{repo}/invitations/{invitation_id}\"],\n updatePullRequestReviewProtection: [\"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\"],\n updateRelease: [\"PATCH /repos/{owner}/{repo}/releases/{release_id}\"],\n updateReleaseAsset: [\"PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}\"],\n updateStatusCheckPotection: [\"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\"],\n updateWebhook: [\"PATCH /repos/{owner}/{repo}/hooks/{hook_id}\"],\n uploadReleaseAsset: [\"POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}\", {\n baseUrl: \"https://uploads.github.com\"\n }]\n },\n search: {\n code: [\"GET /search/code\"],\n commits: [\"GET /search/commits\", {\n mediaType: {\n previews: [\"cloak\"]\n }\n }],\n issuesAndPullRequests: [\"GET /search/issues\"],\n labels: [\"GET /search/labels\"],\n repos: [\"GET /search/repositories\"],\n topics: [\"GET /search/topics\", {\n mediaType: {\n previews: [\"mercy\"]\n }\n }],\n users: [\"GET /search/users\"]\n },\n teams: {\n addOrUpdateMembershipForUserInOrg: [\"PUT /orgs/{org}/teams/{team_slug}/memberships/{username}\"],\n addOrUpdateProjectPermissionsInOrg: [\"PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n addOrUpdateRepoPermissionsInOrg: [\"PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\"],\n checkPermissionsForProjectInOrg: [\"GET /orgs/{org}/teams/{team_slug}/projects/{project_id}\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n checkPermissionsForRepoInOrg: [\"GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\"],\n create: [\"POST /orgs/{org}/teams\"],\n createDiscussionCommentInOrg: [\"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\"],\n createDiscussionInOrg: [\"POST /orgs/{org}/teams/{team_slug}/discussions\"],\n deleteDiscussionCommentInOrg: [\"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\"],\n deleteDiscussionInOrg: [\"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\"],\n deleteInOrg: [\"DELETE /orgs/{org}/teams/{team_slug}\"],\n getByName: [\"GET /orgs/{org}/teams/{team_slug}\"],\n getDiscussionCommentInOrg: [\"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\"],\n getDiscussionInOrg: [\"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\"],\n getMembershipForUserInOrg: [\"GET /orgs/{org}/teams/{team_slug}/memberships/{username}\"],\n list: [\"GET /orgs/{org}/teams\"],\n listChildInOrg: [\"GET /orgs/{org}/teams/{team_slug}/teams\"],\n listDiscussionCommentsInOrg: [\"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\"],\n listDiscussionsInOrg: [\"GET /orgs/{org}/teams/{team_slug}/discussions\"],\n listForAuthenticatedUser: [\"GET /user/teams\"],\n listMembersInOrg: [\"GET /orgs/{org}/teams/{team_slug}/members\"],\n listPendingInvitationsInOrg: [\"GET /orgs/{org}/teams/{team_slug}/invitations\"],\n listProjectsInOrg: [\"GET /orgs/{org}/teams/{team_slug}/projects\", {\n mediaType: {\n previews: [\"inertia\"]\n }\n }],\n listReposInOrg: [\"GET /orgs/{org}/teams/{team_slug}/repos\"],\n removeMembershipForUserInOrg: [\"DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}\"],\n removeProjectInOrg: [\"DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}\"],\n removeRepoInOrg: [\"DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\"],\n updateDiscussionCommentInOrg: [\"PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\"],\n updateDiscussionInOrg: [\"PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\"],\n updateInOrg: [\"PATCH /orgs/{org}/teams/{team_slug}\"]\n },\n users: {\n addEmailForAuthenticated: [\"POST /user/emails\"],\n block: [\"PUT /user/blocks/{username}\"],\n checkBlocked: [\"GET /user/blocks/{username}\"],\n checkFollowingForUser: [\"GET /users/{username}/following/{target_user}\"],\n checkPersonIsFollowedByAuthenticated: [\"GET /user/following/{username}\"],\n createGpgKeyForAuthenticated: [\"POST /user/gpg_keys\"],\n createPublicSshKeyForAuthenticated: [\"POST /user/keys\"],\n deleteEmailForAuthenticated: [\"DELETE /user/emails\"],\n deleteGpgKeyForAuthenticated: [\"DELETE /user/gpg_keys/{gpg_key_id}\"],\n deletePublicSshKeyForAuthenticated: [\"DELETE /user/keys/{key_id}\"],\n follow: [\"PUT /user/following/{username}\"],\n getAuthenticated: [\"GET /user\"],\n getByUsername: [\"GET /users/{username}\"],\n getContextForUser: [\"GET /users/{username}/hovercard\"],\n getGpgKeyForAuthenticated: [\"GET /user/gpg_keys/{gpg_key_id}\"],\n getPublicSshKeyForAuthenticated: [\"GET /user/keys/{key_id}\"],\n list: [\"GET /users\"],\n listBlockedByAuthenticated: [\"GET /user/blocks\"],\n listEmailsForAuthenticated: [\"GET /user/emails\"],\n listFollowedByAuthenticated: [\"GET /user/following\"],\n listFollowersForAuthenticatedUser: [\"GET /user/followers\"],\n listFollowersForUser: [\"GET /users/{username}/followers\"],\n listFollowingForUser: [\"GET /users/{username}/following\"],\n listGpgKeysForAuthenticated: [\"GET /user/gpg_keys\"],\n listGpgKeysForUser: [\"GET /users/{username}/gpg_keys\"],\n listPublicEmailsForAuthenticated: [\"GET /user/public_emails\"],\n listPublicKeysForUser: [\"GET /users/{username}/keys\"],\n listPublicSshKeysForAuthenticated: [\"GET /user/keys\"],\n setPrimaryEmailVisibilityForAuthenticated: [\"PATCH /user/email/visibility\"],\n unblock: [\"DELETE /user/blocks/{username}\"],\n unfollow: [\"DELETE /user/following/{username}\"],\n updateAuthenticated: [\"PATCH /user\"]\n }\n};\n\nconst VERSION = \"4.2.1\";\n\nfunction endpointsToMethods(octokit, endpointsMap) {\n const newMethods = {};\n\n for (const [scope, endpoints] of Object.entries(endpointsMap)) {\n for (const [methodName, endpoint] of Object.entries(endpoints)) {\n const [route, defaults, decorations] = endpoint;\n const [method, url] = route.split(/ /);\n const endpointDefaults = Object.assign({\n method,\n url\n }, defaults);\n\n if (!newMethods[scope]) {\n newMethods[scope] = {};\n }\n\n const scopeMethods = newMethods[scope];\n\n if (decorations) {\n scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations);\n continue;\n }\n\n scopeMethods[methodName] = octokit.request.defaults(endpointDefaults);\n }\n }\n\n return newMethods;\n}\n\nfunction decorate(octokit, scope, methodName, defaults, decorations) {\n const requestWithDefaults = octokit.request.defaults(defaults);\n /* istanbul ignore next */\n\n function withDecorations(...args) {\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n let options = requestWithDefaults.endpoint.merge(...args); // There are currently no other decorations than `.mapToData`\n\n if (decorations.mapToData) {\n options = Object.assign({}, options, {\n data: options[decorations.mapToData],\n [decorations.mapToData]: undefined\n });\n return requestWithDefaults(options);\n }\n\n if (decorations.renamed) {\n const [newScope, newMethodName] = decorations.renamed;\n octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`);\n }\n\n if (decorations.deprecated) {\n octokit.log.warn(decorations.deprecated);\n }\n\n if (decorations.renamedParameters) {\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n const options = requestWithDefaults.endpoint.merge(...args);\n\n for (const [name, alias] of Object.entries(decorations.renamedParameters)) {\n if (name in options) {\n octokit.log.warn(`\"${name}\" parameter is deprecated for \"octokit.${scope}.${methodName}()\". Use \"${alias}\" instead`);\n\n if (!(alias in options)) {\n options[alias] = options[name];\n }\n\n delete options[name];\n }\n }\n\n return requestWithDefaults(options);\n } // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n\n\n return requestWithDefaults(...args);\n }\n\n return Object.assign(withDecorations, requestWithDefaults);\n}\n\n/**\n * This plugin is a 1:1 copy of internal @octokit/rest plugins. The primary\n * goal is to rebuild @octokit/rest on top of @octokit/core. Once that is\n * done, we will remove the registerEndpoints methods and return the methods\n * directly as with the other plugins. At that point we will also remove the\n * legacy workarounds and deprecations.\n *\n * See the plan at\n * https://github.com/octokit/plugin-rest-endpoint-methods.js/pull/1\n */\n\nfunction restEndpointMethods(octokit) {\n return endpointsToMethods(octokit, Endpoints);\n}\nrestEndpointMethods.VERSION = VERSION;\n\nexports.restEndpointMethods = restEndpointMethods;\n//# sourceMappingURL=index.js.map\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar deprecation = require('deprecation');\nvar once = _interopDefault(require('once'));\n\nconst logOnce = once(deprecation => console.warn(deprecation));\n/**\n * Error with extra properties to help with debugging\n */\n\nclass RequestError extends Error {\n constructor(message, statusCode, options) {\n super(message); // Maintains proper stack trace (only available on V8)\n\n /* istanbul ignore next */\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n\n this.name = \"HttpError\";\n this.status = statusCode;\n Object.defineProperty(this, \"code\", {\n get() {\n logOnce(new deprecation.Deprecation(\"[@octokit/request-error] `error.code` is deprecated, use `error.status`.\"));\n return statusCode;\n }\n\n });\n this.headers = options.headers || {}; // redact request credentials without mutating original request options\n\n const requestCopy = Object.assign({}, options.request);\n\n if (options.request.headers.authorization) {\n requestCopy.headers = Object.assign({}, options.request.headers, {\n authorization: options.request.headers.authorization.replace(/ .*$/, \" [REDACTED]\")\n });\n }\n\n requestCopy.url = requestCopy.url // client_id & client_secret can be passed as URL query parameters to increase rate limit\n // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications\n .replace(/\\bclient_secret=\\w+/g, \"client_secret=[REDACTED]\") // OAuth tokens can be passed as URL query parameters, although it is not recommended\n // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header\n .replace(/\\baccess_token=\\w+/g, \"access_token=[REDACTED]\");\n this.request = requestCopy;\n }\n\n}\n\nexports.RequestError = RequestError;\n//# sourceMappingURL=index.js.map\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar endpoint = require('@octokit/endpoint');\nvar universalUserAgent = require('universal-user-agent');\nvar isPlainObject = require('is-plain-object');\nvar nodeFetch = _interopDefault(require('node-fetch'));\nvar requestError = require('@octokit/request-error');\n\nconst VERSION = \"5.4.10\";\n\nfunction getBufferResponse(response) {\n return response.arrayBuffer();\n}\n\nfunction fetchWrapper(requestOptions) {\n if (isPlainObject.isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) {\n requestOptions.body = JSON.stringify(requestOptions.body);\n }\n\n let headers = {};\n let status;\n let url;\n const fetch = requestOptions.request && requestOptions.request.fetch || nodeFetch;\n return fetch(requestOptions.url, Object.assign({\n method: requestOptions.method,\n body: requestOptions.body,\n headers: requestOptions.headers,\n redirect: requestOptions.redirect\n }, requestOptions.request)).then(response => {\n url = response.url;\n status = response.status;\n\n for (const keyAndValue of response.headers) {\n headers[keyAndValue[0]] = keyAndValue[1];\n }\n\n if (status === 204 || status === 205) {\n return;\n } // GitHub API returns 200 for HEAD requests\n\n\n if (requestOptions.method === \"HEAD\") {\n if (status < 400) {\n return;\n }\n\n throw new requestError.RequestError(response.statusText, status, {\n headers,\n request: requestOptions\n });\n }\n\n if (status === 304) {\n throw new requestError.RequestError(\"Not modified\", status, {\n headers,\n request: requestOptions\n });\n }\n\n if (status >= 400) {\n return response.text().then(message => {\n const error = new requestError.RequestError(message, status, {\n headers,\n request: requestOptions\n });\n\n try {\n let responseBody = JSON.parse(error.message);\n Object.assign(error, responseBody);\n let errors = responseBody.errors; // Assumption `errors` would always be in Array format\n\n error.message = error.message + \": \" + errors.map(JSON.stringify).join(\", \");\n } catch (e) {// ignore, see octokit/rest.js#684\n }\n\n throw error;\n });\n }\n\n const contentType = response.headers.get(\"content-type\");\n\n if (/application\\/json/.test(contentType)) {\n return response.json();\n }\n\n if (!contentType || /^text\\/|charset=utf-8$/.test(contentType)) {\n return response.text();\n }\n\n return getBufferResponse(response);\n }).then(data => {\n return {\n status,\n url,\n headers,\n data\n };\n }).catch(error => {\n if (error instanceof requestError.RequestError) {\n throw error;\n }\n\n throw new requestError.RequestError(error.message, 500, {\n headers,\n request: requestOptions\n });\n });\n}\n\nfunction withDefaults(oldEndpoint, newDefaults) {\n const endpoint = oldEndpoint.defaults(newDefaults);\n\n const newApi = function (route, parameters) {\n const endpointOptions = endpoint.merge(route, parameters);\n\n if (!endpointOptions.request || !endpointOptions.request.hook) {\n return fetchWrapper(endpoint.parse(endpointOptions));\n }\n\n const request = (route, parameters) => {\n return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters)));\n };\n\n Object.assign(request, {\n endpoint,\n defaults: withDefaults.bind(null, endpoint)\n });\n return endpointOptions.request.hook(request, endpointOptions);\n };\n\n return Object.assign(newApi, {\n endpoint,\n defaults: withDefaults.bind(null, endpoint)\n });\n}\n\nconst request = withDefaults(endpoint.endpoint, {\n headers: {\n \"user-agent\": `octokit-request.js/${VERSION} ${universalUserAgent.getUserAgent()}`\n }\n});\n\nexports.request = request;\n//# sourceMappingURL=index.js.map\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n/*!\n * is-plain-object \n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nfunction isPlainObject(o) {\n var ctor,prot;\n\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n\nexports.isPlainObject = isPlainObject;\n","\"use strict\";\n/// \n/// \n/// \nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst typedArrayTypeNames = [\n 'Int8Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Int16Array',\n 'Uint16Array',\n 'Int32Array',\n 'Uint32Array',\n 'Float32Array',\n 'Float64Array',\n 'BigInt64Array',\n 'BigUint64Array'\n];\nfunction isTypedArrayName(name) {\n return typedArrayTypeNames.includes(name);\n}\nconst objectTypeNames = [\n 'Function',\n 'Generator',\n 'AsyncGenerator',\n 'GeneratorFunction',\n 'AsyncGeneratorFunction',\n 'AsyncFunction',\n 'Observable',\n 'Array',\n 'Buffer',\n 'Object',\n 'RegExp',\n 'Date',\n 'Error',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'ArrayBuffer',\n 'SharedArrayBuffer',\n 'DataView',\n 'Promise',\n 'URL',\n 'HTMLElement',\n ...typedArrayTypeNames\n];\nfunction isObjectTypeName(name) {\n return objectTypeNames.includes(name);\n}\nconst primitiveTypeNames = [\n 'null',\n 'undefined',\n 'string',\n 'number',\n 'bigint',\n 'boolean',\n 'symbol'\n];\nfunction isPrimitiveTypeName(name) {\n return primitiveTypeNames.includes(name);\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction isOfType(type) {\n return (value) => typeof value === type;\n}\nconst { toString } = Object.prototype;\nconst getObjectType = (value) => {\n const objectTypeName = toString.call(value).slice(8, -1);\n if (/HTML\\w+Element/.test(objectTypeName) && is.domElement(value)) {\n return 'HTMLElement';\n }\n if (isObjectTypeName(objectTypeName)) {\n return objectTypeName;\n }\n return undefined;\n};\nconst isObjectOfType = (type) => (value) => getObjectType(value) === type;\nfunction is(value) {\n if (value === null) {\n return 'null';\n }\n switch (typeof value) {\n case 'undefined':\n return 'undefined';\n case 'string':\n return 'string';\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'function':\n return 'Function';\n case 'bigint':\n return 'bigint';\n case 'symbol':\n return 'symbol';\n default:\n }\n if (is.observable(value)) {\n return 'Observable';\n }\n if (is.array(value)) {\n return 'Array';\n }\n if (is.buffer(value)) {\n return 'Buffer';\n }\n const tagType = getObjectType(value);\n if (tagType) {\n return tagType;\n }\n if (value instanceof String || value instanceof Boolean || value instanceof Number) {\n throw new TypeError('Please don\\'t use object wrappers for primitive types');\n }\n return 'Object';\n}\nis.undefined = isOfType('undefined');\nis.string = isOfType('string');\nconst isNumberType = isOfType('number');\nis.number = (value) => isNumberType(value) && !is.nan(value);\nis.bigint = isOfType('bigint');\n// eslint-disable-next-line @typescript-eslint/ban-types\nis.function_ = isOfType('function');\nis.null_ = (value) => value === null;\nis.class_ = (value) => is.function_(value) && value.toString().startsWith('class ');\nis.boolean = (value) => value === true || value === false;\nis.symbol = isOfType('symbol');\nis.numericString = (value) => is.string(value) && !is.emptyStringOrWhitespace(value) && !Number.isNaN(Number(value));\nis.array = (value, assertion) => {\n if (!Array.isArray(value)) {\n return false;\n }\n if (!is.function_(assertion)) {\n return true;\n }\n return value.every(assertion);\n};\nis.buffer = (value) => { var _a, _b, _c, _d; return (_d = (_c = (_b = (_a = value) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.isBuffer) === null || _c === void 0 ? void 0 : _c.call(_b, value)) !== null && _d !== void 0 ? _d : false; };\nis.nullOrUndefined = (value) => is.null_(value) || is.undefined(value);\nis.object = (value) => !is.null_(value) && (typeof value === 'object' || is.function_(value));\nis.iterable = (value) => { var _a; return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a[Symbol.iterator]); };\nis.asyncIterable = (value) => { var _a; return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a[Symbol.asyncIterator]); };\nis.generator = (value) => is.iterable(value) && is.function_(value.next) && is.function_(value.throw);\nis.asyncGenerator = (value) => is.asyncIterable(value) && is.function_(value.next) && is.function_(value.throw);\nis.nativePromise = (value) => isObjectOfType('Promise')(value);\nconst hasPromiseAPI = (value) => {\n var _a, _b;\n return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a.then) &&\n is.function_((_b = value) === null || _b === void 0 ? void 0 : _b.catch);\n};\nis.promise = (value) => is.nativePromise(value) || hasPromiseAPI(value);\nis.generatorFunction = isObjectOfType('GeneratorFunction');\nis.asyncGeneratorFunction = (value) => getObjectType(value) === 'AsyncGeneratorFunction';\nis.asyncFunction = (value) => getObjectType(value) === 'AsyncFunction';\n// eslint-disable-next-line no-prototype-builtins, @typescript-eslint/ban-types\nis.boundFunction = (value) => is.function_(value) && !value.hasOwnProperty('prototype');\nis.regExp = isObjectOfType('RegExp');\nis.date = isObjectOfType('Date');\nis.error = isObjectOfType('Error');\nis.map = (value) => isObjectOfType('Map')(value);\nis.set = (value) => isObjectOfType('Set')(value);\nis.weakMap = (value) => isObjectOfType('WeakMap')(value);\nis.weakSet = (value) => isObjectOfType('WeakSet')(value);\nis.int8Array = isObjectOfType('Int8Array');\nis.uint8Array = isObjectOfType('Uint8Array');\nis.uint8ClampedArray = isObjectOfType('Uint8ClampedArray');\nis.int16Array = isObjectOfType('Int16Array');\nis.uint16Array = isObjectOfType('Uint16Array');\nis.int32Array = isObjectOfType('Int32Array');\nis.uint32Array = isObjectOfType('Uint32Array');\nis.float32Array = isObjectOfType('Float32Array');\nis.float64Array = isObjectOfType('Float64Array');\nis.bigInt64Array = isObjectOfType('BigInt64Array');\nis.bigUint64Array = isObjectOfType('BigUint64Array');\nis.arrayBuffer = isObjectOfType('ArrayBuffer');\nis.sharedArrayBuffer = isObjectOfType('SharedArrayBuffer');\nis.dataView = isObjectOfType('DataView');\nis.directInstanceOf = (instance, class_) => Object.getPrototypeOf(instance) === class_.prototype;\nis.urlInstance = (value) => isObjectOfType('URL')(value);\nis.urlString = (value) => {\n if (!is.string(value)) {\n return false;\n }\n try {\n new URL(value); // eslint-disable-line no-new\n return true;\n }\n catch (_a) {\n return false;\n }\n};\n// TODO: Use the `not` operator with a type guard here when it's available.\n// Example: `is.truthy = (value: unknown): value is (not false | not 0 | not '' | not undefined | not null) => Boolean(value);`\nis.truthy = (value) => Boolean(value);\n// Example: `is.falsy = (value: unknown): value is (not true | 0 | '' | undefined | null) => Boolean(value);`\nis.falsy = (value) => !value;\nis.nan = (value) => Number.isNaN(value);\nis.primitive = (value) => is.null_(value) || isPrimitiveTypeName(typeof value);\nis.integer = (value) => Number.isInteger(value);\nis.safeInteger = (value) => Number.isSafeInteger(value);\nis.plainObject = (value) => {\n // From: https://github.com/sindresorhus/is-plain-obj/blob/master/index.js\n if (toString.call(value) !== '[object Object]') {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === null || prototype === Object.getPrototypeOf({});\n};\nis.typedArray = (value) => isTypedArrayName(getObjectType(value));\nconst isValidLength = (value) => is.safeInteger(value) && value >= 0;\nis.arrayLike = (value) => !is.nullOrUndefined(value) && !is.function_(value) && isValidLength(value.length);\nis.inRange = (value, range) => {\n if (is.number(range)) {\n return value >= Math.min(0, range) && value <= Math.max(range, 0);\n }\n if (is.array(range) && range.length === 2) {\n return value >= Math.min(...range) && value <= Math.max(...range);\n }\n throw new TypeError(`Invalid range: ${JSON.stringify(range)}`);\n};\nconst NODE_TYPE_ELEMENT = 1;\nconst DOM_PROPERTIES_TO_CHECK = [\n 'innerHTML',\n 'ownerDocument',\n 'style',\n 'attributes',\n 'nodeValue'\n];\nis.domElement = (value) => {\n return is.object(value) &&\n value.nodeType === NODE_TYPE_ELEMENT &&\n is.string(value.nodeName) &&\n !is.plainObject(value) &&\n DOM_PROPERTIES_TO_CHECK.every(property => property in value);\n};\nis.observable = (value) => {\n var _a, _b, _c, _d;\n if (!value) {\n return false;\n }\n // eslint-disable-next-line no-use-extend-native/no-use-extend-native\n if (value === ((_b = (_a = value)[Symbol.observable]) === null || _b === void 0 ? void 0 : _b.call(_a))) {\n return true;\n }\n if (value === ((_d = (_c = value)['@@observable']) === null || _d === void 0 ? void 0 : _d.call(_c))) {\n return true;\n }\n return false;\n};\nis.nodeStream = (value) => is.object(value) && is.function_(value.pipe) && !is.observable(value);\nis.infinite = (value) => value === Infinity || value === -Infinity;\nconst isAbsoluteMod2 = (remainder) => (value) => is.integer(value) && Math.abs(value % 2) === remainder;\nis.evenInteger = isAbsoluteMod2(0);\nis.oddInteger = isAbsoluteMod2(1);\nis.emptyArray = (value) => is.array(value) && value.length === 0;\nis.nonEmptyArray = (value) => is.array(value) && value.length > 0;\nis.emptyString = (value) => is.string(value) && value.length === 0;\n// TODO: Use `not ''` when the `not` operator is available.\nis.nonEmptyString = (value) => is.string(value) && value.length > 0;\nconst isWhiteSpaceString = (value) => is.string(value) && !/\\S/.test(value);\nis.emptyStringOrWhitespace = (value) => is.emptyString(value) || isWhiteSpaceString(value);\nis.emptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length === 0;\n// TODO: Use `not` operator here to remove `Map` and `Set` from type guard:\n// - https://github.com/Microsoft/TypeScript/pull/29317\nis.nonEmptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length > 0;\nis.emptySet = (value) => is.set(value) && value.size === 0;\nis.nonEmptySet = (value) => is.set(value) && value.size > 0;\nis.emptyMap = (value) => is.map(value) && value.size === 0;\nis.nonEmptyMap = (value) => is.map(value) && value.size > 0;\nconst predicateOnArray = (method, predicate, values) => {\n if (!is.function_(predicate)) {\n throw new TypeError(`Invalid predicate: ${JSON.stringify(predicate)}`);\n }\n if (values.length === 0) {\n throw new TypeError('Invalid number of values');\n }\n return method.call(values, predicate);\n};\nis.any = (predicate, ...values) => {\n const predicates = is.array(predicate) ? predicate : [predicate];\n return predicates.some(singlePredicate => predicateOnArray(Array.prototype.some, singlePredicate, values));\n};\nis.all = (predicate, ...values) => predicateOnArray(Array.prototype.every, predicate, values);\nconst assertType = (condition, description, value) => {\n if (!condition) {\n throw new TypeError(`Expected value which is \\`${description}\\`, received value of type \\`${is(value)}\\`.`);\n }\n};\nexports.assert = {\n // Unknowns.\n undefined: (value) => assertType(is.undefined(value), 'undefined', value),\n string: (value) => assertType(is.string(value), 'string', value),\n number: (value) => assertType(is.number(value), 'number', value),\n bigint: (value) => assertType(is.bigint(value), 'bigint', value),\n // eslint-disable-next-line @typescript-eslint/ban-types\n function_: (value) => assertType(is.function_(value), 'Function', value),\n null_: (value) => assertType(is.null_(value), 'null', value),\n class_: (value) => assertType(is.class_(value), \"Class\" /* class_ */, value),\n boolean: (value) => assertType(is.boolean(value), 'boolean', value),\n symbol: (value) => assertType(is.symbol(value), 'symbol', value),\n numericString: (value) => assertType(is.numericString(value), \"string with a number\" /* numericString */, value),\n array: (value, assertion) => {\n const assert = assertType;\n assert(is.array(value), 'Array', value);\n if (assertion) {\n value.forEach(assertion);\n }\n },\n buffer: (value) => assertType(is.buffer(value), 'Buffer', value),\n nullOrUndefined: (value) => assertType(is.nullOrUndefined(value), \"null or undefined\" /* nullOrUndefined */, value),\n object: (value) => assertType(is.object(value), 'Object', value),\n iterable: (value) => assertType(is.iterable(value), \"Iterable\" /* iterable */, value),\n asyncIterable: (value) => assertType(is.asyncIterable(value), \"AsyncIterable\" /* asyncIterable */, value),\n generator: (value) => assertType(is.generator(value), 'Generator', value),\n asyncGenerator: (value) => assertType(is.asyncGenerator(value), 'AsyncGenerator', value),\n nativePromise: (value) => assertType(is.nativePromise(value), \"native Promise\" /* nativePromise */, value),\n promise: (value) => assertType(is.promise(value), 'Promise', value),\n generatorFunction: (value) => assertType(is.generatorFunction(value), 'GeneratorFunction', value),\n asyncGeneratorFunction: (value) => assertType(is.asyncGeneratorFunction(value), 'AsyncGeneratorFunction', value),\n // eslint-disable-next-line @typescript-eslint/ban-types\n asyncFunction: (value) => assertType(is.asyncFunction(value), 'AsyncFunction', value),\n // eslint-disable-next-line @typescript-eslint/ban-types\n boundFunction: (value) => assertType(is.boundFunction(value), 'Function', value),\n regExp: (value) => assertType(is.regExp(value), 'RegExp', value),\n date: (value) => assertType(is.date(value), 'Date', value),\n error: (value) => assertType(is.error(value), 'Error', value),\n map: (value) => assertType(is.map(value), 'Map', value),\n set: (value) => assertType(is.set(value), 'Set', value),\n weakMap: (value) => assertType(is.weakMap(value), 'WeakMap', value),\n weakSet: (value) => assertType(is.weakSet(value), 'WeakSet', value),\n int8Array: (value) => assertType(is.int8Array(value), 'Int8Array', value),\n uint8Array: (value) => assertType(is.uint8Array(value), 'Uint8Array', value),\n uint8ClampedArray: (value) => assertType(is.uint8ClampedArray(value), 'Uint8ClampedArray', value),\n int16Array: (value) => assertType(is.int16Array(value), 'Int16Array', value),\n uint16Array: (value) => assertType(is.uint16Array(value), 'Uint16Array', value),\n int32Array: (value) => assertType(is.int32Array(value), 'Int32Array', value),\n uint32Array: (value) => assertType(is.uint32Array(value), 'Uint32Array', value),\n float32Array: (value) => assertType(is.float32Array(value), 'Float32Array', value),\n float64Array: (value) => assertType(is.float64Array(value), 'Float64Array', value),\n bigInt64Array: (value) => assertType(is.bigInt64Array(value), 'BigInt64Array', value),\n bigUint64Array: (value) => assertType(is.bigUint64Array(value), 'BigUint64Array', value),\n arrayBuffer: (value) => assertType(is.arrayBuffer(value), 'ArrayBuffer', value),\n sharedArrayBuffer: (value) => assertType(is.sharedArrayBuffer(value), 'SharedArrayBuffer', value),\n dataView: (value) => assertType(is.dataView(value), 'DataView', value),\n urlInstance: (value) => assertType(is.urlInstance(value), 'URL', value),\n urlString: (value) => assertType(is.urlString(value), \"string with a URL\" /* urlString */, value),\n truthy: (value) => assertType(is.truthy(value), \"truthy\" /* truthy */, value),\n falsy: (value) => assertType(is.falsy(value), \"falsy\" /* falsy */, value),\n nan: (value) => assertType(is.nan(value), \"NaN\" /* nan */, value),\n primitive: (value) => assertType(is.primitive(value), \"primitive\" /* primitive */, value),\n integer: (value) => assertType(is.integer(value), \"integer\" /* integer */, value),\n safeInteger: (value) => assertType(is.safeInteger(value), \"integer\" /* safeInteger */, value),\n plainObject: (value) => assertType(is.plainObject(value), \"plain object\" /* plainObject */, value),\n typedArray: (value) => assertType(is.typedArray(value), \"TypedArray\" /* typedArray */, value),\n arrayLike: (value) => assertType(is.arrayLike(value), \"array-like\" /* arrayLike */, value),\n domElement: (value) => assertType(is.domElement(value), \"HTMLElement\" /* domElement */, value),\n observable: (value) => assertType(is.observable(value), 'Observable', value),\n nodeStream: (value) => assertType(is.nodeStream(value), \"Node.js Stream\" /* nodeStream */, value),\n infinite: (value) => assertType(is.infinite(value), \"infinite number\" /* infinite */, value),\n emptyArray: (value) => assertType(is.emptyArray(value), \"empty array\" /* emptyArray */, value),\n nonEmptyArray: (value) => assertType(is.nonEmptyArray(value), \"non-empty array\" /* nonEmptyArray */, value),\n emptyString: (value) => assertType(is.emptyString(value), \"empty string\" /* emptyString */, value),\n nonEmptyString: (value) => assertType(is.nonEmptyString(value), \"non-empty string\" /* nonEmptyString */, value),\n emptyStringOrWhitespace: (value) => assertType(is.emptyStringOrWhitespace(value), \"empty string or whitespace\" /* emptyStringOrWhitespace */, value),\n emptyObject: (value) => assertType(is.emptyObject(value), \"empty object\" /* emptyObject */, value),\n nonEmptyObject: (value) => assertType(is.nonEmptyObject(value), \"non-empty object\" /* nonEmptyObject */, value),\n emptySet: (value) => assertType(is.emptySet(value), \"empty set\" /* emptySet */, value),\n nonEmptySet: (value) => assertType(is.nonEmptySet(value), \"non-empty set\" /* nonEmptySet */, value),\n emptyMap: (value) => assertType(is.emptyMap(value), \"empty map\" /* emptyMap */, value),\n nonEmptyMap: (value) => assertType(is.nonEmptyMap(value), \"non-empty map\" /* nonEmptyMap */, value),\n // Numbers.\n evenInteger: (value) => assertType(is.evenInteger(value), \"even integer\" /* evenInteger */, value),\n oddInteger: (value) => assertType(is.oddInteger(value), \"odd integer\" /* oddInteger */, value),\n // Two arguments.\n directInstanceOf: (instance, class_) => assertType(is.directInstanceOf(instance, class_), \"T\" /* directInstanceOf */, instance),\n inRange: (value, range) => assertType(is.inRange(value, range), \"in range\" /* inRange */, value),\n // Variadic functions.\n any: (predicate, ...values) => assertType(is.any(predicate, ...values), \"predicate returns truthy for any value\" /* any */, values),\n all: (predicate, ...values) => assertType(is.all(predicate, ...values), \"predicate returns truthy for all values\" /* all */, values)\n};\n// Some few keywords are reserved, but we'll populate them for Node.js users\n// See https://github.com/Microsoft/TypeScript/issues/2536\nObject.defineProperties(is, {\n class: {\n value: is.class_\n },\n function: {\n value: is.function_\n },\n null: {\n value: is.null_\n }\n});\nObject.defineProperties(exports.assert, {\n class: {\n value: exports.assert.class_\n },\n function: {\n value: exports.assert.function_\n },\n null: {\n value: exports.assert.null_\n }\n});\nexports.default = is;\n// For CommonJS default export support\nmodule.exports = is;\nmodule.exports.default = is;\nmodule.exports.assert = exports.assert;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst defer_to_connect_1 = require(\"defer-to-connect\");\nconst nodejsMajorVersion = Number(process.versions.node.split('.')[0]);\nconst timer = (request) => {\n const timings = {\n start: Date.now(),\n socket: undefined,\n lookup: undefined,\n connect: undefined,\n secureConnect: undefined,\n upload: undefined,\n response: undefined,\n end: undefined,\n error: undefined,\n abort: undefined,\n phases: {\n wait: undefined,\n dns: undefined,\n tcp: undefined,\n tls: undefined,\n request: undefined,\n firstByte: undefined,\n download: undefined,\n total: undefined\n }\n };\n request.timings = timings;\n const handleError = (origin) => {\n const emit = origin.emit.bind(origin);\n origin.emit = (event, ...args) => {\n // Catches the `error` event\n if (event === 'error') {\n timings.error = Date.now();\n timings.phases.total = timings.error - timings.start;\n origin.emit = emit;\n }\n // Saves the original behavior\n return emit(event, ...args);\n };\n };\n handleError(request);\n request.prependOnceListener('abort', () => {\n timings.abort = Date.now();\n // Let the `end` response event be responsible for setting the total phase,\n // unless the Node.js major version is >= 13.\n if (!timings.response || nodejsMajorVersion >= 13) {\n timings.phases.total = Date.now() - timings.start;\n }\n });\n const onSocket = (socket) => {\n timings.socket = Date.now();\n timings.phases.wait = timings.socket - timings.start;\n const lookupListener = () => {\n timings.lookup = Date.now();\n timings.phases.dns = timings.lookup - timings.socket;\n };\n socket.prependOnceListener('lookup', lookupListener);\n defer_to_connect_1.default(socket, {\n connect: () => {\n timings.connect = Date.now();\n if (timings.lookup === undefined) {\n socket.removeListener('lookup', lookupListener);\n timings.lookup = timings.connect;\n timings.phases.dns = timings.lookup - timings.socket;\n }\n timings.phases.tcp = timings.connect - timings.lookup;\n // This callback is called before flushing any data,\n // so we don't need to set `timings.phases.request` here.\n },\n secureConnect: () => {\n timings.secureConnect = Date.now();\n timings.phases.tls = timings.secureConnect - timings.connect;\n }\n });\n };\n if (request.socket) {\n onSocket(request.socket);\n }\n else {\n request.prependOnceListener('socket', onSocket);\n }\n const onUpload = () => {\n var _a;\n timings.upload = Date.now();\n timings.phases.request = timings.upload - (_a = timings.secureConnect, (_a !== null && _a !== void 0 ? _a : timings.connect));\n };\n const writableFinished = () => {\n if (typeof request.writableFinished === 'boolean') {\n return request.writableFinished;\n }\n // Node.js doesn't have `request.writableFinished` property\n return request.finished && request.outputSize === 0 && (!request.socket || request.socket.writableLength === 0);\n };\n if (writableFinished()) {\n onUpload();\n }\n else {\n request.prependOnceListener('finish', onUpload);\n }\n request.prependOnceListener('response', (response) => {\n timings.response = Date.now();\n timings.phases.firstByte = timings.response - timings.upload;\n response.timings = timings;\n handleError(response);\n response.prependOnceListener('end', () => {\n timings.end = Date.now();\n timings.phases.download = timings.end - timings.response;\n timings.phases.total = timings.end - timings.start;\n });\n });\n return timings;\n};\nexports.default = timer;\n// For CommonJS default export support\nmodule.exports = timer;\nmodule.exports.default = timer;\n","var Utils = require(\"./util\");\r\nvar fs = Utils.FileSystem.require(),\r\n\tpth = require(\"path\");\r\n\r\nfs.existsSync = fs.existsSync || pth.existsSync;\r\n\r\nvar ZipEntry = require(\"./zipEntry\"),\r\n\tZipFile = require(\"./zipFile\");\r\n\r\nvar isWin = /^win/.test(process.platform);\r\n\r\nfunction canonical(p) {\r\n var safeSuffix = pth.normalize(p).replace(/^(\\.\\.(\\/|\\\\|$))+/, '');\r\n return pth.join('./', safeSuffix);\r\n}\r\n\r\nmodule.exports = function (/**String*/input) {\r\n\tvar _zip = undefined,\r\n\t\t_filename = \"\";\r\n\r\n\tif (input && typeof input === \"string\") { // load zip file\r\n\t\tif (fs.existsSync(input)) {\r\n\t\t\t_filename = input;\r\n\t\t\t_zip = new ZipFile(input, Utils.Constants.FILE);\r\n\t\t} else {\r\n\t\t\tthrow new Error(Utils.Errors.INVALID_FILENAME);\r\n\t\t}\r\n\t} else if (input && Buffer.isBuffer(input)) { // load buffer\r\n\t\t_zip = new ZipFile(input, Utils.Constants.BUFFER);\r\n\t} else { // create new zip file\r\n\t\t_zip = new ZipFile(null, Utils.Constants.NONE);\r\n\t}\r\n\r\n\tfunction sanitize(prefix, name) {\r\n\t\tprefix = pth.resolve(pth.normalize(prefix));\r\n\t\tvar parts = name.split('/');\r\n\t\tfor (var i = 0, l = parts.length; i < l; i++) {\r\n\t\t\tvar path = pth.normalize(pth.join(prefix, parts.slice(i, l).join(pth.sep)));\r\n\t\t\tif (path.indexOf(prefix) === 0) {\r\n\t\t\t\treturn path;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn pth.normalize(pth.join(prefix, pth.basename(name)));\r\n\t}\r\n\r\n\tfunction getEntry(/**Object*/entry) {\r\n\t\tif (entry && _zip) {\r\n\t\t\tvar item;\r\n\t\t\t// If entry was given as a file name\r\n\t\t\tif (typeof entry === \"string\")\r\n\t\t\t\titem = _zip.getEntry(entry);\r\n\t\t\t// if entry was given as a ZipEntry object\r\n\t\t\tif (typeof entry === \"object\" && typeof entry.entryName !== \"undefined\" && typeof entry.header !== \"undefined\")\r\n\t\t\t\titem = _zip.getEntry(entry.entryName);\r\n\r\n\t\t\tif (item) {\r\n\t\t\t\treturn item;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n function fixPath(zipPath){\r\n // convert windows file separators\r\n zipPath = zipPath.split(\"\\\\\").join(\"/\");\r\n // add separator if it wasnt given\r\n if (zipPath.charAt(zipPath.length - 1) !== \"/\") {\r\n zipPath += \"/\";\r\n } \r\n return zipPath;\r\n }\r\n\r\n\treturn {\r\n\t\t/**\r\n\t\t * Extracts the given entry from the archive and returns the content as a Buffer object\r\n\t\t * @param entry ZipEntry object or String with the full path of the entry\r\n\t\t *\r\n\t\t * @return Buffer or Null in case of error\r\n\t\t */\r\n\t\treadFile: function (/**Object*/entry, /*String, Buffer*/pass) {\r\n\t\t\tvar item = getEntry(entry);\r\n\t\t\treturn item && item.getData(pass) || null;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Asynchronous readFile\r\n\t\t * @param entry ZipEntry object or String with the full path of the entry\r\n\t\t * @param callback\r\n\t\t *\r\n\t\t * @return Buffer or Null in case of error\r\n\t\t */\r\n\t\treadFileAsync: function (/**Object*/entry, /**Function*/callback) {\r\n\t\t\tvar item = getEntry(entry);\r\n\t\t\tif (item) {\r\n\t\t\t\titem.getDataAsync(callback);\r\n\t\t\t} else {\r\n\t\t\t\tcallback(null, \"getEntry failed for:\" + entry)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Extracts the given entry from the archive and returns the content as plain text in the given encoding\r\n\t\t * @param entry ZipEntry object or String with the full path of the entry\r\n\t\t * @param encoding Optional. If no encoding is specified utf8 is used\r\n\t\t *\r\n\t\t * @return String\r\n\t\t */\r\n\t\treadAsText: function (/**Object*/entry, /**String=*/encoding) {\r\n\t\t\tvar item = getEntry(entry);\r\n\t\t\tif (item) {\r\n\t\t\t\tvar data = item.getData();\r\n\t\t\t\tif (data && data.length) {\r\n\t\t\t\t\treturn data.toString(encoding || \"utf8\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn \"\";\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Asynchronous readAsText\r\n\t\t * @param entry ZipEntry object or String with the full path of the entry\r\n\t\t * @param callback\r\n\t\t * @param encoding Optional. If no encoding is specified utf8 is used\r\n\t\t *\r\n\t\t * @return String\r\n\t\t */\r\n\t\treadAsTextAsync: function (/**Object*/entry, /**Function*/callback, /**String=*/encoding) {\r\n\t\t\tvar item = getEntry(entry);\r\n\t\t\tif (item) {\r\n\t\t\t\titem.getDataAsync(function (data, err) {\r\n\t\t\t\t\tif (err) {\r\n\t\t\t\t\t\tcallback(data, err);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (data && data.length) {\r\n\t\t\t\t\t\tcallback(data.toString(encoding || \"utf8\"));\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tcallback(\"\");\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\tcallback(\"\");\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Remove the entry from the file or the entry and all it's nested directories and files if the given entry is a directory\r\n\t\t *\r\n\t\t * @param entry\r\n\t\t */\r\n\t\tdeleteFile: function (/**Object*/entry) { // @TODO: test deleteFile\r\n\t\t\tvar item = getEntry(entry);\r\n\t\t\tif (item) {\r\n\t\t\t\t_zip.deleteEntry(item.entryName);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Adds a comment to the zip. The zip must be rewritten after adding the comment.\r\n\t\t *\r\n\t\t * @param comment\r\n\t\t */\r\n\t\taddZipComment: function (/**String*/comment) { // @TODO: test addZipComment\r\n\t\t\t_zip.comment = comment;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Returns the zip comment\r\n\t\t *\r\n\t\t * @return String\r\n\t\t */\r\n\t\tgetZipComment: function () {\r\n\t\t\treturn _zip.comment || '';\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Adds a comment to a specified zipEntry. The zip must be rewritten after adding the comment\r\n\t\t * The comment cannot exceed 65535 characters in length\r\n\t\t *\r\n\t\t * @param entry\r\n\t\t * @param comment\r\n\t\t */\r\n\t\taddZipEntryComment: function (/**Object*/entry, /**String*/comment) {\r\n\t\t\tvar item = getEntry(entry);\r\n\t\t\tif (item) {\r\n\t\t\t\titem.comment = comment;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Returns the comment of the specified entry\r\n\t\t *\r\n\t\t * @param entry\r\n\t\t * @return String\r\n\t\t */\r\n\t\tgetZipEntryComment: function (/**Object*/entry) {\r\n\t\t\tvar item = getEntry(entry);\r\n\t\t\tif (item) {\r\n\t\t\t\treturn item.comment || '';\r\n\t\t\t}\r\n\t\t\treturn ''\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Updates the content of an existing entry inside the archive. The zip must be rewritten after updating the content\r\n\t\t *\r\n\t\t * @param entry\r\n\t\t * @param content\r\n\t\t */\r\n\t\tupdateFile: function (/**Object*/entry, /**Buffer*/content) {\r\n\t\t\tvar item = getEntry(entry);\r\n\t\t\tif (item) {\r\n\t\t\t\titem.setData(content);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Adds a file from the disk to the archive\r\n\t\t *\r\n\t\t * @param localPath File to add to zip\r\n\t\t * @param zipPath Optional path inside the zip\r\n\t\t * @param zipName Optional name for the file\r\n\t\t */\r\n\t\taddLocalFile: function (/**String*/localPath, /**String=*/zipPath, /**String=*/zipName, /**String*/comment) {\r\n\t\t\tif (fs.existsSync(localPath)) {\r\n\t\t\t\t// fix ZipPath\r\n\t\t\t\tzipPath = (zipPath) ? fixPath(zipPath) : \"\";\r\n\r\n\t\t\t\t// p - local file name\r\n\t\t\t\tvar p = localPath.split(\"\\\\\").join(\"/\").split(\"/\").pop();\r\n\r\n\t\t\t\t// add file name into zippath\r\n\t\t\t\tzipPath += (zipName) ? zipName : p;\r\n\r\n\t\t\t\t// read file attributes \r\n\t\t\t\tconst _attr = fs.statSync(localPath);\r\n\r\n\t\t\t\t// add file into zip file\r\n\t\t\t\tthis.addFile(zipPath, fs.readFileSync(localPath), comment, _attr)\r\n\t\t\t} else {\r\n\t\t\t\tthrow new Error(Utils.Errors.FILE_NOT_FOUND.replace(\"%s\", localPath));\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Adds a local directory and all its nested files and directories to the archive\r\n\t\t *\r\n\t\t * @param localPath\r\n\t\t * @param zipPath optional path inside zip\r\n\t\t * @param filter optional RegExp or Function if files match will\r\n\t\t * be included.\r\n\t\t */\r\n addLocalFolder: function (/**String*/localPath, /**String=*/zipPath, /**=RegExp|Function*/filter) {\r\n // Prepare filter\r\n if (filter instanceof RegExp) { // if filter is RegExp wrap it \r\n filter = (function (rx){\r\n return function (filename) {\r\n return rx.test(filename);\r\n }\r\n })(filter);\r\n } else if ('function' !== typeof filter) { // if filter is not function we will replace it\r\n filter = function () {\r\n return true;\r\n };\r\n }\r\n\r\n // fix ZipPath\r\n zipPath = (zipPath) ? fixPath(zipPath) : \"\";\r\n\r\n // normalize the path first\r\n localPath = pth.normalize(localPath);\r\n\r\n if (fs.existsSync(localPath)) {\r\n\r\n var items = Utils.findFiles(localPath),\r\n self = this;\r\n\r\n if (items.length) {\r\n items.forEach(function (filepath) {\r\n var p = pth.relative(localPath, filepath).split(\"\\\\\").join(\"/\"); //windows fix\r\n if (filter(p)) {\r\n if (filepath.charAt(filepath.length - 1) !== pth.sep) {\r\n self.addFile(zipPath + p, fs.readFileSync(filepath), \"\", fs.statSync(filepath));\r\n } else {\r\n self.addFile(zipPath + p + '/', Buffer.alloc(0), \"\", 0);\r\n }\r\n }\r\n });\r\n }\r\n } else {\r\n throw new Error(Utils.Errors.FILE_NOT_FOUND.replace(\"%s\", localPath));\r\n }\r\n },\r\n\r\n\t\t/**\r\n\t\t * Asynchronous addLocalFile\r\n\t\t * @param localPath\r\n\t\t * @param callback\r\n\t\t * @param zipPath optional path inside zip\r\n\t\t * @param filter optional RegExp or Function if files match will\r\n\t\t * be included.\r\n\t\t */\r\n\t\taddLocalFolderAsync: function (/*String*/localPath, /*Function*/callback, /*String*/zipPath, /*RegExp|Function*/filter) {\r\n\t\t\tif (filter === undefined) {\r\n\t\t\t\tfilter = function () {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t};\r\n\t\t\t} else if (filter instanceof RegExp) {\r\n\t\t\t\tfilter = function (filter) {\r\n\t\t\t\t\treturn function (filename) {\r\n\t\t\t\t\t\treturn filter.test(filename);\r\n\t\t\t\t\t}\r\n\t\t\t\t}(filter);\r\n\t\t\t}\r\n\r\n\t\t\tif (zipPath) {\r\n\t\t\t\tzipPath = zipPath.split(\"\\\\\").join(\"/\");\r\n\t\t\t\tif (zipPath.charAt(zipPath.length - 1) !== \"/\") {\r\n\t\t\t\t\tzipPath += \"/\";\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tzipPath = \"\";\r\n\t\t\t}\r\n\t\t\t// normalize the path first\r\n\t\t\tlocalPath = pth.normalize(localPath);\r\n\t\t\tlocalPath = localPath.split(\"\\\\\").join(\"/\"); //windows fix\r\n\t\t\tif (localPath.charAt(localPath.length - 1) !== \"/\")\r\n\t\t\t\tlocalPath += \"/\";\r\n\r\n\t\t\tvar self = this;\r\n\t\t\tfs.open(localPath, 'r', function (err, fd) {\r\n\t\t\t\tif (err && err.code === 'ENOENT') {\r\n\t\t\t\t\tcallback(undefined, Utils.Errors.FILE_NOT_FOUND.replace(\"%s\", localPath));\r\n\t\t\t\t} else if (err) {\r\n\t\t\t\t\tcallback(undefined, err);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar items = Utils.findFiles(localPath);\r\n\t\t\t\t\tvar i = -1;\r\n\r\n\t\t\t\t\tvar next = function () {\r\n\t\t\t\t\t\ti += 1;\r\n\t\t\t\t\t\tif (i < items.length) {\r\n\t\t\t\t\t\t\tvar p = items[i].split(\"\\\\\").join(\"/\").replace(new RegExp(localPath.replace(/(\\(|\\))/g, '\\\\$1'), 'i'), \"\"); //windows fix\r\n\t\t\t\t\t\t\tp = p.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').replace(/[^\\x20-\\x7E]/g, '') // accent fix\r\n\t\t\t\t\t\t\tif (filter(p)) {\r\n\t\t\t\t\t\t\t\tif (p.charAt(p.length - 1) !== \"/\") {\r\n\t\t\t\t\t\t\t\t\tfs.readFile(items[i], function (err, data) {\r\n\t\t\t\t\t\t\t\t\t\tif (err) {\r\n\t\t\t\t\t\t\t\t\t\t\tcallback(undefined, err);\r\n\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\tself.addFile(zipPath + p, data, '', 0);\r\n\t\t\t\t\t\t\t\t\t\t\tnext();\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tself.addFile(zipPath + p, Buffer.alloc(0), \"\", 0);\r\n\t\t\t\t\t\t\t\t\tnext();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tnext();\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tcallback(true, undefined);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tnext();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Allows you to create a entry (file or directory) in the zip file.\r\n\t\t * If you want to create a directory the entryName must end in / and a null buffer should be provided.\r\n\t\t * Comment and attributes are optional\r\n\t\t *\r\n\t\t * @param entryName\r\n\t\t * @param content\r\n\t\t * @param comment\r\n\t\t * @param attr\r\n\t\t */\r\n\t\taddFile: function (/**String*/entryName, /**Buffer*/content, /**String*/comment, /**Number*/attr) {\r\n\t\t\t// prepare new entry\r\n\t\t\tvar entry = new ZipEntry();\r\n\t\t\tentry.entryName = entryName;\r\n\t\t\tentry.comment = comment || \"\";\r\n\r\n\t\t\tvar isStat = ('object' === typeof attr) && (attr instanceof fs.Stats);\r\n\r\n\t\t\t// last modification time from file stats\r\n\t\t\tif (isStat){\r\n\t\t\t\tentry.header.time = attr.mtime;\r\n\t\t\t}\r\n\r\n\t\t\t// Set file attribute\r\n\t\t\tvar fileattr = (entry.isDirectory) ? 0x10 : 0; // (MS-DOS directory flag)\r\n\r\n\t\t\t// extended attributes field for Unix\r\n\t\t\tif('win32' !== process.platform){\r\n\t\t\t\t// set file type either S_IFDIR / S_IFREG\r\n\t\t\t\tvar unix = (entry.isDirectory) ? 0x4000 : 0x8000;\r\n\r\n\t\t\t\tif (isStat) { \t\t\t\t\t\t\t\t\t\t// File attributes from file stats\r\n\t\t\t\t\tunix |= (0xfff & attr.mode) \r\n\t\t\t\t}else if ('number' === typeof attr){ \t\t\t\t// attr from given attr values\r\n\t\t\t\t\tunix |= (0xfff & attr);\r\n\t\t\t\t}else{\t\t\t\t\t\t\t\t\t\t\t\t// Default values: \r\n\t\t\t\t\tunix |= (entry.isDirectory) ? 0o755 : 0o644; \t// permissions (drwxr-xr-x) or (-r-wr--r--)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfileattr = (fileattr | (unix << 16)) >>> 0;\t\t\t// add attributes\r\n\t\t\t}\r\n\r\n\t\t\tentry.attr = fileattr;\r\n\r\n\t\t\tentry.setData(content);\r\n\t\t\t_zip.setEntry(entry);\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Returns an array of ZipEntry objects representing the files and folders inside the archive\r\n\t\t *\r\n\t\t * @return Array\r\n\t\t */\r\n\t\tgetEntries: function () {\r\n\t\t\tif (_zip) {\r\n\t\t\t\treturn _zip.entries;\r\n\t\t\t} else {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Returns a ZipEntry object representing the file or folder specified by ``name``.\r\n\t\t *\r\n\t\t * @param name\r\n\t\t * @return ZipEntry\r\n\t\t */\r\n\t\tgetEntry: function (/**String*/name) {\r\n\t\t\treturn getEntry(name);\r\n\t\t},\r\n\r\n\t\tgetEntryCount: function() {\r\n\t\t\treturn _zip.getEntryCount();\r\n\t\t},\r\n\r\n\t\tforEach: function(callback) {\r\n\t\t\treturn _zip.forEach(callback);\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Extracts the given entry to the given targetPath\r\n\t\t * If the entry is a directory inside the archive, the entire directory and it's subdirectories will be extracted\r\n\t\t *\r\n\t\t * @param entry ZipEntry object or String with the full path of the entry\r\n\t\t * @param targetPath Target folder where to write the file\r\n\t\t * @param maintainEntryPath If maintainEntryPath is true and the entry is inside a folder, the entry folder\r\n\t\t * will be created in targetPath as well. Default is TRUE\r\n\t\t * @param overwrite If the file already exists at the target path, the file will be overwriten if this is true.\r\n\t\t * Default is FALSE\r\n * @param outFileName String If set will override the filename of the extracted file (Only works if the entry is a file)\r\n\t\t *\r\n\t\t * @return Boolean\r\n\t\t */\r\n\t\textractEntryTo: function (/**Object*/entry, /**String*/targetPath, /**Boolean*/maintainEntryPath, /**Boolean*/overwrite, /**String**/outFileName) {\r\n\t\t\toverwrite = overwrite || false;\r\n\t\t\tmaintainEntryPath = typeof maintainEntryPath === \"undefined\" ? true : maintainEntryPath;\r\n\r\n\t\t\tvar item = getEntry(entry);\r\n\t\t\tif (!item) {\r\n\t\t\t\tthrow new Error(Utils.Errors.NO_ENTRY);\r\n\t\t\t}\r\n\r\n\t\t\tvar entryName = canonical(item.entryName);\r\n\r\n\t\t\tvar target = sanitize(targetPath,outFileName && !item.isDirectory ? outFileName : (maintainEntryPath ? entryName : pth.basename(entryName)));\r\n\r\n\t\t\tif (item.isDirectory) {\r\n\t\t\t\ttarget = pth.resolve(target, \"..\");\r\n\t\t\t\tvar children = _zip.getEntryChildren(item);\r\n\t\t\t\tchildren.forEach(function (child) {\r\n\t\t\t\t\tif (child.isDirectory) return;\r\n\t\t\t\t\tvar content = child.getData();\r\n\t\t\t\t\tif (!content) {\r\n\t\t\t\t\t\tthrow new Error(Utils.Errors.CANT_EXTRACT_FILE);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar name = canonical(child.entryName)\r\n\t\t\t\t\tvar childName = sanitize(targetPath, maintainEntryPath ? name : pth.basename(name));\r\n\r\n\t\t\t\t\tUtils.writeFileTo(childName, content, overwrite);\r\n\t\t\t\t});\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tvar content = item.getData();\r\n\t\t\tif (!content) throw new Error(Utils.Errors.CANT_EXTRACT_FILE);\r\n\r\n\t\t\tif (fs.existsSync(target) && !overwrite) {\r\n\t\t\t\tthrow new Error(Utils.Errors.CANT_OVERRIDE);\r\n\t\t\t}\r\n\t\t\tUtils.writeFileTo(target, content, overwrite);\r\n\r\n\t\t\treturn true;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Test the archive\r\n\t\t *\r\n\t\t */\r\n\t\ttest: function (pass) {\r\n\t\t\tif (!_zip) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tfor (var entry in _zip.entries) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif (entry.isDirectory) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar content = _zip.entries[entry].getData(pass);\r\n\t\t\t\t\tif (!content) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (err) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Extracts the entire archive to the given location\r\n\t\t *\r\n\t\t * @param targetPath Target location\r\n\t\t * @param overwrite If the file already exists at the target path, the file will be overwriten if this is true.\r\n\t\t * Default is FALSE\r\n\t\t */\r\n\t\textractAllTo: function (/**String*/targetPath, /**Boolean*/overwrite, /*String, Buffer*/pass) {\r\n\t\t\toverwrite = overwrite || false;\r\n\t\t\tif (!_zip) {\r\n\t\t\t\tthrow new Error(Utils.Errors.NO_ZIP);\r\n\t\t\t}\r\n\t\t\t_zip.entries.forEach(function (entry) {\r\n\t\t\t\tvar entryName = sanitize(targetPath, canonical(entry.entryName.toString()));\r\n\t\t\t\tif (entry.isDirectory) {\r\n\t\t\t\t\tUtils.makeDir(entryName);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar content = entry.getData(pass);\r\n\t\t\t\tif (!content) {\r\n\t\t\t\t\tthrow new Error(Utils.Errors.CANT_EXTRACT_FILE);\r\n\t\t\t\t}\r\n\t\t\t\tUtils.writeFileTo(entryName, content, overwrite);\r\n\t\t\t\ttry {\r\n\t\t\t\t\tfs.utimesSync(entryName, entry.header.time, entry.header.time)\r\n\t\t\t\t} catch (err) {\r\n\t\t\t\t\tthrow new Error(Utils.Errors.CANT_EXTRACT_FILE);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Asynchronous extractAllTo\r\n\t\t *\r\n\t\t * @param targetPath Target location\r\n\t\t * @param overwrite If the file already exists at the target path, the file will be overwriten if this is true.\r\n\t\t * Default is FALSE\r\n\t\t * @param callback\r\n\t\t */\r\n\t\textractAllToAsync: function (/**String*/targetPath, /**Boolean*/overwrite, /**Function*/callback) {\r\n\t\t\tif (!callback) {\r\n\t\t\t\tcallback = function() {}\r\n\t\t\t}\r\n\t\t\toverwrite = overwrite || false;\r\n\t\t\tif (!_zip) {\r\n\t\t\t\tcallback(new Error(Utils.Errors.NO_ZIP));\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar entries = _zip.entries;\r\n\t\t\tvar i = entries.length;\r\n\t\t\tentries.forEach(function (entry) {\r\n\t\t\t\tif (i <= 0) return; // Had an error already\r\n\r\n\t\t\t\tvar entryName = pth.normalize(canonical(entry.entryName.toString()));\r\n\r\n\t\t\t\tif (entry.isDirectory) {\r\n\t\t\t\t\tUtils.makeDir(sanitize(targetPath, entryName));\r\n\t\t\t\t\tif (--i === 0)\r\n\t\t\t\t\t\tcallback(undefined);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tentry.getDataAsync(function (content, err) {\r\n\t\t\t\t\tif (i <= 0) return;\r\n\t\t\t\t\tif (err) {\r\n\t\t\t\t\t\tcallback(new Error(err));\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!content) {\r\n\t\t\t\t\t\ti = 0;\r\n\t\t\t\t\t\tcallback(new Error(Utils.Errors.CANT_EXTRACT_FILE));\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tUtils.writeFileToAsync(sanitize(targetPath, entryName), content, overwrite, function (succ) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tfs.utimesSync(pth.resolve(targetPath, entryName), entry.header.time, entry.header.time);\r\n\t\t\t\t\t\t} catch (err) {\r\n\t\t\t\t\t\t\tcallback(new Error('Unable to set utimes'));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (i <= 0) return;\r\n\t\t\t\t\t\tif (!succ) {\r\n\t\t\t\t\t\t\ti = 0;\r\n\t\t\t\t\t\t\tcallback(new Error('Unable to write'));\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (--i === 0)\r\n\t\t\t\t\t\t\tcallback(undefined);\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * 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\r\n\t\t *\r\n\t\t * @param targetFileName\r\n\t\t * @param callback\r\n\t\t */\r\n\t\twriteZip: function (/**String*/targetFileName, /**Function*/callback) {\r\n\t\t\tif (arguments.length === 1) {\r\n\t\t\t\tif (typeof targetFileName === \"function\") {\r\n\t\t\t\t\tcallback = targetFileName;\r\n\t\t\t\t\ttargetFileName = \"\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (!targetFileName && _filename) {\r\n\t\t\t\ttargetFileName = _filename;\r\n\t\t\t}\r\n\t\t\tif (!targetFileName) return;\r\n\r\n\t\t\tvar zipData = _zip.compressToBuffer();\r\n\t\t\tif (zipData) {\r\n\t\t\t\tvar ok = Utils.writeFileTo(targetFileName, zipData, true);\r\n\t\t\t\tif (typeof callback === 'function') callback(!ok ? new Error(\"failed\") : null, \"\");\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Returns the content of the entire zip file as a Buffer object\r\n\t\t *\r\n\t\t * @return Buffer\r\n\t\t */\r\n\t\ttoBuffer: function (/**Function=*/onSuccess, /**Function=*/onFail, /**Function=*/onItemStart, /**Function=*/onItemEnd) {\r\n\t\t\tthis.valueOf = 2;\r\n\t\t\tif (typeof onSuccess === \"function\") {\r\n\t\t\t\t_zip.toAsyncBuffer(onSuccess, onFail, onItemStart, onItemEnd);\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\treturn _zip.compressToBuffer()\r\n\t\t}\r\n\t}\r\n};\r\n","var Utils = require(\"../util\"),\r\n Constants = Utils.Constants;\r\n\r\n/* The central directory file header */\r\nmodule.exports = function () {\r\n var _verMade = 0x14,\r\n _version = 0x0A,\r\n _flags = 0,\r\n _method = 0,\r\n _time = 0,\r\n _crc = 0,\r\n _compressedSize = 0,\r\n _size = 0,\r\n _fnameLen = 0,\r\n _extraLen = 0,\r\n\r\n _comLen = 0,\r\n _diskStart = 0,\r\n _inattr = 0,\r\n _attr = 0,\r\n _offset = 0;\r\n\r\n switch(process.platform){\r\n case 'win32':\r\n _verMade |= 0x0A00;\r\n case 'darwin':\r\n _verMade |= 0x1300;\r\n default:\r\n _verMade |= 0x0300;\r\n }\r\n\r\n var _dataHeader = {};\r\n\r\n function setTime(val) {\r\n val = new Date(val);\r\n _time = (val.getFullYear() - 1980 & 0x7f) << 25 // b09-16 years from 1980\r\n | (val.getMonth() + 1) << 21 // b05-08 month\r\n | val.getDate() << 16 // b00-04 hour\r\n\r\n // 2 bytes time\r\n | val.getHours() << 11 // b11-15 hour\r\n | val.getMinutes() << 5 // b05-10 minute\r\n | val.getSeconds() >> 1; // b00-04 seconds divided by 2\r\n }\r\n\r\n setTime(+new Date());\r\n\r\n return {\r\n get made () { return _verMade; },\r\n set made (val) { _verMade = val; },\r\n\r\n get version () { return _version; },\r\n set version (val) { _version = val },\r\n\r\n get flags () { return _flags },\r\n set flags (val) { _flags = val; },\r\n\r\n get method () { return _method; },\r\n set method (val) {\r\n switch (val){\r\n case Constants.STORED:\r\n this.version = 10;\r\n case Constants.DEFLATED:\r\n default:\r\n this.version = 20;\r\n }\r\n _method = val;\r\n },\r\n\r\n get time () { return new Date(\r\n ((_time >> 25) & 0x7f) + 1980,\r\n ((_time >> 21) & 0x0f) - 1,\r\n (_time >> 16) & 0x1f,\r\n (_time >> 11) & 0x1f,\r\n (_time >> 5) & 0x3f,\r\n (_time & 0x1f) << 1\r\n );\r\n },\r\n set time (val) {\r\n setTime(val);\r\n },\r\n\r\n get crc () { return _crc; },\r\n set crc (val) { _crc = val; },\r\n\r\n get compressedSize () { return _compressedSize; },\r\n set compressedSize (val) { _compressedSize = val; },\r\n\r\n get size () { return _size; },\r\n set size (val) { _size = val; },\r\n\r\n get fileNameLength () { return _fnameLen; },\r\n set fileNameLength (val) { _fnameLen = val; },\r\n\r\n get extraLength () { return _extraLen },\r\n set extraLength (val) { _extraLen = val; },\r\n\r\n get commentLength () { return _comLen },\r\n set commentLength (val) { _comLen = val },\r\n\r\n get diskNumStart () { return _diskStart },\r\n set diskNumStart (val) { _diskStart = val },\r\n\r\n get inAttr () { return _inattr },\r\n set inAttr (val) { _inattr = val },\r\n\r\n get attr () { return _attr },\r\n set attr (val) { _attr = val },\r\n\r\n get offset () { return _offset },\r\n set offset (val) { _offset = val },\r\n\r\n get encripted () { return (_flags & 1) === 1 },\r\n\r\n get entryHeaderSize () {\r\n return Constants.CENHDR + _fnameLen + _extraLen + _comLen;\r\n },\r\n\r\n get realDataOffset () {\r\n return _offset + Constants.LOCHDR + _dataHeader.fnameLen + _dataHeader.extraLen;\r\n },\r\n\r\n get dataHeader () {\r\n return _dataHeader;\r\n },\r\n\r\n loadDataHeaderFromBinary : function(/*Buffer*/input) {\r\n var data = input.slice(_offset, _offset + Constants.LOCHDR);\r\n // 30 bytes and should start with \"PK\\003\\004\"\r\n if (data.readUInt32LE(0) !== Constants.LOCSIG) {\r\n throw new Error(Utils.Errors.INVALID_LOC);\r\n }\r\n _dataHeader = {\r\n // version needed to extract\r\n version : data.readUInt16LE(Constants.LOCVER),\r\n // general purpose bit flag\r\n flags : data.readUInt16LE(Constants.LOCFLG),\r\n // compression method\r\n method : data.readUInt16LE(Constants.LOCHOW),\r\n // modification time (2 bytes time, 2 bytes date)\r\n time : data.readUInt32LE(Constants.LOCTIM),\r\n // uncompressed file crc-32 value\r\n crc : data.readUInt32LE(Constants.LOCCRC),\r\n // compressed size\r\n compressedSize : data.readUInt32LE(Constants.LOCSIZ),\r\n // uncompressed size\r\n size : data.readUInt32LE(Constants.LOCLEN),\r\n // filename length\r\n fnameLen : data.readUInt16LE(Constants.LOCNAM),\r\n // extra field length\r\n extraLen : data.readUInt16LE(Constants.LOCEXT)\r\n }\r\n },\r\n\r\n loadFromBinary : function(/*Buffer*/data) {\r\n // data should be 46 bytes and start with \"PK 01 02\"\r\n if (data.length !== Constants.CENHDR || data.readUInt32LE(0) !== Constants.CENSIG) {\r\n throw new Error(Utils.Errors.INVALID_CEN);\r\n }\r\n // version made by\r\n _verMade = data.readUInt16LE(Constants.CENVEM);\r\n // version needed to extract\r\n _version = data.readUInt16LE(Constants.CENVER);\r\n // encrypt, decrypt flags\r\n _flags = data.readUInt16LE(Constants.CENFLG);\r\n // compression method\r\n _method = data.readUInt16LE(Constants.CENHOW);\r\n // modification time (2 bytes time, 2 bytes date)\r\n _time = data.readUInt32LE(Constants.CENTIM);\r\n // uncompressed file crc-32 value\r\n _crc = data.readUInt32LE(Constants.CENCRC);\r\n // compressed size\r\n _compressedSize = data.readUInt32LE(Constants.CENSIZ);\r\n // uncompressed size\r\n _size = data.readUInt32LE(Constants.CENLEN);\r\n // filename length\r\n _fnameLen = data.readUInt16LE(Constants.CENNAM);\r\n // extra field length\r\n _extraLen = data.readUInt16LE(Constants.CENEXT);\r\n // file comment length\r\n _comLen = data.readUInt16LE(Constants.CENCOM);\r\n // volume number start\r\n _diskStart = data.readUInt16LE(Constants.CENDSK);\r\n // internal file attributes\r\n _inattr = data.readUInt16LE(Constants.CENATT);\r\n // external file attributes\r\n _attr = data.readUInt32LE(Constants.CENATX);\r\n // LOC header offset\r\n _offset = data.readUInt32LE(Constants.CENOFF);\r\n },\r\n\r\n dataHeaderToBinary : function() {\r\n // LOC header size (30 bytes)\r\n var data = Buffer.alloc(Constants.LOCHDR);\r\n // \"PK\\003\\004\"\r\n data.writeUInt32LE(Constants.LOCSIG, 0);\r\n // version needed to extract\r\n data.writeUInt16LE(_version, Constants.LOCVER);\r\n // general purpose bit flag\r\n data.writeUInt16LE(_flags, Constants.LOCFLG);\r\n // compression method\r\n data.writeUInt16LE(_method, Constants.LOCHOW);\r\n // modification time (2 bytes time, 2 bytes date)\r\n data.writeUInt32LE(_time, Constants.LOCTIM);\r\n // uncompressed file crc-32 value\r\n data.writeUInt32LE(_crc, Constants.LOCCRC);\r\n // compressed size\r\n data.writeUInt32LE(_compressedSize, Constants.LOCSIZ);\r\n // uncompressed size\r\n data.writeUInt32LE(_size, Constants.LOCLEN);\r\n // filename length\r\n data.writeUInt16LE(_fnameLen, Constants.LOCNAM);\r\n // extra field length\r\n data.writeUInt16LE(_extraLen, Constants.LOCEXT);\r\n return data;\r\n },\r\n\r\n entryHeaderToBinary : function() {\r\n // CEN header size (46 bytes)\r\n var data = Buffer.alloc(Constants.CENHDR + _fnameLen + _extraLen + _comLen);\r\n // \"PK\\001\\002\"\r\n data.writeUInt32LE(Constants.CENSIG, 0);\r\n // version made by\r\n data.writeUInt16LE(_verMade, Constants.CENVEM);\r\n // version needed to extract\r\n data.writeUInt16LE(_version, Constants.CENVER);\r\n // encrypt, decrypt flags\r\n data.writeUInt16LE(_flags, Constants.CENFLG);\r\n // compression method\r\n data.writeUInt16LE(_method, Constants.CENHOW);\r\n // modification time (2 bytes time, 2 bytes date)\r\n data.writeUInt32LE(_time, Constants.CENTIM);\r\n // uncompressed file crc-32 value\r\n data.writeUInt32LE(_crc, Constants.CENCRC);\r\n // compressed size\r\n data.writeUInt32LE(_compressedSize, Constants.CENSIZ);\r\n // uncompressed size\r\n data.writeUInt32LE(_size, Constants.CENLEN);\r\n // filename length\r\n data.writeUInt16LE(_fnameLen, Constants.CENNAM);\r\n // extra field length\r\n data.writeUInt16LE(_extraLen, Constants.CENEXT);\r\n // file comment length\r\n data.writeUInt16LE(_comLen, Constants.CENCOM);\r\n // volume number start\r\n data.writeUInt16LE(_diskStart, Constants.CENDSK);\r\n // internal file attributes\r\n data.writeUInt16LE(_inattr, Constants.CENATT);\r\n // external file attributes\r\n data.writeUInt32LE(_attr, Constants.CENATX);\r\n // LOC header offset\r\n data.writeUInt32LE(_offset, Constants.CENOFF);\r\n // fill all with\r\n data.fill(0x00, Constants.CENHDR);\r\n return data;\r\n },\r\n\r\n toString : function() {\r\n return '{\\n' +\r\n '\\t\"made\" : ' + _verMade + \",\\n\" +\r\n '\\t\"version\" : ' + _version + \",\\n\" +\r\n '\\t\"flags\" : ' + _flags + \",\\n\" +\r\n '\\t\"method\" : ' + Utils.methodToString(_method) + \",\\n\" +\r\n '\\t\"time\" : ' + this.time + \",\\n\" +\r\n '\\t\"crc\" : 0x' + _crc.toString(16).toUpperCase() + \",\\n\" +\r\n '\\t\"compressedSize\" : ' + _compressedSize + \" bytes,\\n\" +\r\n '\\t\"size\" : ' + _size + \" bytes,\\n\" +\r\n '\\t\"fileNameLength\" : ' + _fnameLen + \",\\n\" +\r\n '\\t\"extraLength\" : ' + _extraLen + \" bytes,\\n\" +\r\n '\\t\"commentLength\" : ' + _comLen + \" bytes,\\n\" +\r\n '\\t\"diskNumStart\" : ' + _diskStart + \",\\n\" +\r\n '\\t\"inAttr\" : ' + _inattr + \",\\n\" +\r\n '\\t\"attr\" : ' + _attr + \",\\n\" +\r\n '\\t\"offset\" : ' + _offset + \",\\n\" +\r\n '\\t\"entryHeaderSize\" : ' + (Constants.CENHDR + _fnameLen + _extraLen + _comLen) + \" bytes\\n\" +\r\n '}';\r\n }\r\n }\r\n};\r\n","exports.EntryHeader = require(\"./entryHeader\");\r\nexports.MainHeader = require(\"./mainHeader\");\r\n","var Utils = require(\"../util\"),\r\n Constants = Utils.Constants;\r\n\r\n/* The entries in the end of central directory */\r\nmodule.exports = function () {\r\n var _volumeEntries = 0,\r\n _totalEntries = 0,\r\n _size = 0,\r\n _offset = 0,\r\n _commentLength = 0;\r\n\r\n return {\r\n get diskEntries () { return _volumeEntries },\r\n set diskEntries (/*Number*/val) { _volumeEntries = _totalEntries = val; },\r\n\r\n get totalEntries () { return _totalEntries },\r\n set totalEntries (/*Number*/val) { _totalEntries = _volumeEntries = val; },\r\n\r\n get size () { return _size },\r\n set size (/*Number*/val) { _size = val; },\r\n\r\n get offset () { return _offset },\r\n set offset (/*Number*/val) { _offset = val; },\r\n\r\n get commentLength () { return _commentLength },\r\n set commentLength (/*Number*/val) { _commentLength = val; },\r\n\r\n get mainHeaderSize () {\r\n return Constants.ENDHDR + _commentLength;\r\n },\r\n\r\n loadFromBinary : function(/*Buffer*/data) {\r\n // data should be 22 bytes and start with \"PK 05 06\"\r\n // or be 56+ bytes and start with \"PK 06 06\" for Zip64\r\n if ((data.length !== Constants.ENDHDR || data.readUInt32LE(0) !== Constants.ENDSIG) &&\r\n (data.length < Constants.ZIP64HDR || data.readUInt32LE(0) !== Constants.ZIP64SIG)) {\r\n\r\n throw new Error(Utils.Errors.INVALID_END);\r\n }\r\n\r\n if (data.readUInt32LE(0) === Constants.ENDSIG) {\r\n // number of entries on this volume\r\n _volumeEntries = data.readUInt16LE(Constants.ENDSUB);\r\n // total number of entries\r\n _totalEntries = data.readUInt16LE(Constants.ENDTOT);\r\n // central directory size in bytes\r\n _size = data.readUInt32LE(Constants.ENDSIZ);\r\n // offset of first CEN header\r\n _offset = data.readUInt32LE(Constants.ENDOFF);\r\n // zip file comment length\r\n _commentLength = data.readUInt16LE(Constants.ENDCOM);\r\n } else {\r\n // number of entries on this volume\r\n _volumeEntries = Utils.readBigUInt64LE(data, Constants.ZIP64SUB);\r\n // total number of entries\r\n _totalEntries = Utils.readBigUInt64LE(data, Constants.ZIP64TOT);\r\n // central directory size in bytes\r\n _size = Utils.readBigUInt64LE(data, Constants.ZIP64SIZ);\r\n // offset of first CEN header\r\n _offset = Utils.readBigUInt64LE(data, Constants.ZIP64OFF);\r\n\r\n _commentLength = 0;\r\n }\r\n\r\n },\r\n\r\n toBinary : function() {\r\n var b = Buffer.alloc(Constants.ENDHDR + _commentLength);\r\n // \"PK 05 06\" signature\r\n b.writeUInt32LE(Constants.ENDSIG, 0);\r\n b.writeUInt32LE(0, 4);\r\n // number of entries on this volume\r\n b.writeUInt16LE(_volumeEntries, Constants.ENDSUB);\r\n // total number of entries\r\n b.writeUInt16LE(_totalEntries, Constants.ENDTOT);\r\n // central directory size in bytes\r\n b.writeUInt32LE(_size, Constants.ENDSIZ);\r\n // offset of first CEN header\r\n b.writeUInt32LE(_offset, Constants.ENDOFF);\r\n // zip file comment length\r\n b.writeUInt16LE(_commentLength, Constants.ENDCOM);\r\n // fill comment memory with spaces so no garbage is left there\r\n b.fill(\" \", Constants.ENDHDR);\r\n\r\n return b;\r\n },\r\n\r\n toString : function() {\r\n return '{\\n' +\r\n '\\t\"diskEntries\" : ' + _volumeEntries + \",\\n\" +\r\n '\\t\"totalEntries\" : ' + _totalEntries + \",\\n\" +\r\n '\\t\"size\" : ' + _size + \" bytes,\\n\" +\r\n '\\t\"offset\" : 0x' + _offset.toString(16).toUpperCase() + \",\\n\" +\r\n '\\t\"commentLength\" : 0x' + _commentLength + \"\\n\" +\r\n '}';\r\n }\r\n }\r\n};","module.exports = function (/*Buffer*/inbuf) {\r\n\r\n var zlib = require(\"zlib\");\r\n \r\n var opts = {chunkSize: (parseInt(inbuf.length / 1024) + 1) * 1024};\r\n \r\n return {\r\n deflate: function () {\r\n return zlib.deflateRawSync(inbuf, opts);\r\n },\r\n\r\n deflateAsync: function (/*Function*/callback) {\r\n var tmp = zlib.createDeflateRaw(opts), parts = [], total = 0;\r\n tmp.on('data', function (data) {\r\n parts.push(data);\r\n total += data.length;\r\n });\r\n tmp.on('end', function () {\r\n var buf = Buffer.alloc(total), written = 0;\r\n buf.fill(0);\r\n for (var i = 0; i < parts.length; i++) {\r\n var part = parts[i];\r\n part.copy(buf, written);\r\n written += part.length;\r\n }\r\n callback && callback(buf);\r\n });\r\n tmp.end(inbuf);\r\n }\r\n }\r\n};\r\n","exports.Deflater = require(\"./deflater\");\r\nexports.Inflater = require(\"./inflater\");\r\nexports.ZipCrypto = require(\"./zipcrypto\");","module.exports = function (/*Buffer*/inbuf) {\r\n\r\n var zlib = require(\"zlib\");\r\n\r\n return {\r\n inflate: function () {\r\n return zlib.inflateRawSync(inbuf);\r\n },\r\n\r\n inflateAsync: function (/*Function*/callback) {\r\n var tmp = zlib.createInflateRaw(), parts = [], total = 0;\r\n tmp.on('data', function (data) {\r\n parts.push(data);\r\n total += data.length;\r\n });\r\n tmp.on('end', function () {\r\n var buf = Buffer.alloc(total), written = 0;\r\n buf.fill(0);\r\n for (var i = 0; i < parts.length; i++) {\r\n var part = parts[i];\r\n part.copy(buf, written);\r\n written += part.length;\r\n }\r\n callback && callback(buf);\r\n });\r\n tmp.end(inbuf);\r\n }\r\n }\r\n};\r\n","// generate CRC32 lookup table\r\nconst crctable = (new Uint32Array(256)).map((t,crc)=>{\r\n for(let j=0;j<8;j++){\r\n if (0 !== (crc & 1)){\r\n crc = (crc >>> 1) ^ 0xEDB88320\r\n }else{\r\n crc >>>= 1 \r\n }\r\n }\r\n return crc>>>0;\r\n});\r\n\r\nfunction make_decrypter(/*Buffer*/pwd){\r\n // C-style uInt32 Multiply\r\n const uMul = (a,b) => Math.imul(a, b) >>> 0;\r\n // Initialize keys with default values\r\n const keys = new Uint32Array([0x12345678, 0x23456789, 0x34567890]);\r\n // crc32 byte update \r\n const crc32update = (pCrc32, bval) => {\r\n return crctable[(pCrc32 ^ bval) & 0xff] ^ (pCrc32 >>> 8);\r\n }\r\n // update keys with byteValues\r\n const updateKeys = (byteValue) => {\r\n keys[0] = crc32update(keys[0], byteValue);\r\n keys[1] += keys[0] & 0xff; \r\n keys[1] = uMul(keys[1], 134775813) + 1;\r\n keys[2] = crc32update(keys[2], keys[1] >>> 24);\r\n }\r\n\r\n // 1. Stage initialize key\r\n const pass = (Buffer.isBuffer(pwd)) ? pwd : Buffer.from(pwd);\r\n for(let i=0; i< pass.length; i++){\r\n updateKeys(pass[i]);\r\n }\r\n\r\n // return decrypter function\r\n return function (/*Buffer*/data){\r\n if (!Buffer.isBuffer(data)){\r\n throw 'decrypter needs Buffer'\r\n }\r\n // result - we create new Buffer for results\r\n const result = Buffer.alloc(data.length);\r\n let pos = 0;\r\n // process input data\r\n for(let c of data){\r\n const k = (keys[2] | 2) >>> 0; // key\r\n c ^= (uMul(k, k^1) >> 8) & 0xff; // decode\r\n result[pos++] = c; // Save Value\r\n updateKeys(c); // update keys with decoded byte\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nfunction decrypt(/*Buffer*/ data, /*Object*/header, /*String, Buffer*/ pwd){\r\n if (!data || !Buffer.isBuffer(data) || data.length < 12) {\r\n return Buffer.alloc(0);\r\n }\r\n \r\n // We Initialize and generate decrypting function\r\n const decrypter = make_decrypter(pwd);\r\n\r\n // check - for testing password\r\n const check = header.crc >>> 24;\r\n // decrypt salt what is always 12 bytes and is a part of file content\r\n const testbyte = decrypter(data.slice(0, 12))[11];\r\n\r\n // does password meet expectations\r\n if (check !== testbyte){\r\n throw 'ADM-ZIP: Wrong Password';\r\n }\r\n\r\n // decode content\r\n return decrypter(data.slice(12));\r\n}\r\n\r\nmodule.exports = {decrypt};\r\n","module.exports = {\r\n /* The local file header */\r\n LOCHDR : 30, // LOC header size\r\n LOCSIG : 0x04034b50, // \"PK\\003\\004\"\r\n LOCVER : 4,\t// version needed to extract\r\n LOCFLG : 6, // general purpose bit flag\r\n LOCHOW : 8, // compression method\r\n LOCTIM : 10, // modification time (2 bytes time, 2 bytes date)\r\n LOCCRC : 14, // uncompressed file crc-32 value\r\n LOCSIZ : 18, // compressed size\r\n LOCLEN : 22, // uncompressed size\r\n LOCNAM : 26, // filename length\r\n LOCEXT : 28, // extra field length\r\n\r\n /* The Data descriptor */\r\n EXTSIG : 0x08074b50, // \"PK\\007\\008\"\r\n EXTHDR : 16, // EXT header size\r\n EXTCRC : 4, // uncompressed file crc-32 value\r\n EXTSIZ : 8, // compressed size\r\n EXTLEN : 12, // uncompressed size\r\n\r\n /* The central directory file header */\r\n CENHDR : 46, // CEN header size\r\n CENSIG : 0x02014b50, // \"PK\\001\\002\"\r\n CENVEM : 4, // version made by\r\n CENVER : 6, // version needed to extract\r\n CENFLG : 8, // encrypt, decrypt flags\r\n CENHOW : 10, // compression method\r\n CENTIM : 12, // modification time (2 bytes time, 2 bytes date)\r\n CENCRC : 16, // uncompressed file crc-32 value\r\n CENSIZ : 20, // compressed size\r\n CENLEN : 24, // uncompressed size\r\n CENNAM : 28, // filename length\r\n CENEXT : 30, // extra field length\r\n CENCOM : 32, // file comment length\r\n CENDSK : 34, // volume number start\r\n CENATT : 36, // internal file attributes\r\n CENATX : 38, // external file attributes (host system dependent)\r\n CENOFF : 42, // LOC header offset\r\n\r\n /* The entries in the end of central directory */\r\n ENDHDR : 22, // END header size\r\n ENDSIG : 0x06054b50, // \"PK\\005\\006\"\r\n ENDSUB : 8, // number of entries on this disk\r\n ENDTOT : 10, // total number of entries\r\n ENDSIZ : 12, // central directory size in bytes\r\n ENDOFF : 16, // offset of first CEN header\r\n ENDCOM : 20, // zip file comment length\r\n\r\n END64HDR : 20, // zip64 END header size\r\n END64SIG : 0x07064b50, // zip64 Locator signature, \"PK\\006\\007\"\r\n END64START : 4, // number of the disk with the start of the zip64\r\n END64OFF : 8, // relative offset of the zip64 end of central directory\r\n END64NUMDISKS : 16, // total number of disks\r\n\r\n ZIP64SIG : 0x06064b50, // zip64 signature, \"PK\\006\\006\"\r\n ZIP64HDR : 56, // zip64 record minimum size\r\n ZIP64LEAD : 12, // leading bytes at the start of the record, not counted by the value stored in ZIP64SIZE\r\n ZIP64SIZE : 4, // zip64 size of the central directory record\r\n ZIP64VEM : 12, // zip64 version made by\r\n ZIP64VER : 14, // zip64 version needed to extract\r\n ZIP64DSK : 16, // zip64 number of this disk\r\n ZIP64DSKDIR : 20, // number of the disk with the start of the record directory\r\n ZIP64SUB : 24, // number of entries on this disk\r\n ZIP64TOT : 32, // total number of entries\r\n ZIP64SIZB : 40, // zip64 central directory size in bytes\r\n ZIP64OFF : 48, // offset of start of central directory with respect to the starting disk number\r\n ZIP64EXTRA : 56, // extensible data sector\r\n\r\n /* Compression methods */\r\n STORED : 0, // no compression\r\n SHRUNK : 1, // shrunk\r\n REDUCED1 : 2, // reduced with compression factor 1\r\n REDUCED2 : 3, // reduced with compression factor 2\r\n REDUCED3 : 4, // reduced with compression factor 3\r\n REDUCED4 : 5, // reduced with compression factor 4\r\n IMPLODED : 6, // imploded\r\n // 7 reserved\r\n DEFLATED : 8, // deflated\r\n ENHANCED_DEFLATED: 9, // enhanced deflated\r\n PKWARE : 10,// PKWare DCL imploded\r\n // 11 reserved\r\n BZIP2 : 12, // compressed using BZIP2\r\n // 13 reserved\r\n LZMA : 14, // LZMA\r\n // 15-17 reserved\r\n IBM_TERSE : 18, // compressed using IBM TERSE\r\n IBM_LZ77 : 19, //IBM LZ77 z\r\n\r\n /* General purpose bit flag */\r\n FLG_ENC : 0, // encripted file\r\n FLG_COMP1 : 1, // compression option\r\n FLG_COMP2 : 2, // compression option\r\n FLG_DESC : 4, // data descriptor\r\n FLG_ENH : 8, // enhanced deflation\r\n FLG_STR : 16, // strong encryption\r\n FLG_LNG : 1024, // language encoding\r\n FLG_MSK : 4096, // mask header values\r\n\r\n /* Load type */\r\n FILE : 0,\r\n BUFFER : 1,\r\n NONE : 2,\r\n\r\n /* 4.5 Extensible data fields */\r\n EF_ID : 0,\r\n EF_SIZE : 2,\r\n\r\n /* Header IDs */\r\n ID_ZIP64 : 0x0001,\r\n ID_AVINFO : 0x0007,\r\n ID_PFS : 0x0008,\r\n ID_OS2 : 0x0009,\r\n ID_NTFS : 0x000a,\r\n ID_OPENVMS : 0x000c,\r\n ID_UNIX : 0x000d,\r\n ID_FORK : 0x000e,\r\n ID_PATCH : 0x000f,\r\n ID_X509_PKCS7 : 0x0014,\r\n ID_X509_CERTID_F : 0x0015,\r\n ID_X509_CERTID_C : 0x0016,\r\n ID_STRONGENC : 0x0017,\r\n ID_RECORD_MGT : 0x0018,\r\n ID_X509_PKCS7_RL : 0x0019,\r\n ID_IBM1 : 0x0065,\r\n ID_IBM2 : 0x0066,\r\n ID_POSZIP : 0x4690,\r\n\r\n EF_ZIP64_OR_32 : 0xffffffff,\r\n EF_ZIP64_OR_16 : 0xffff,\r\n EF_ZIP64_SUNCOMP : 0,\r\n EF_ZIP64_SCOMP : 8,\r\n EF_ZIP64_RHO : 16,\r\n EF_ZIP64_DSN : 24\r\n};\r\n","module.exports = {\r\n /* Header error messages */\r\n \"INVALID_LOC\" : \"Invalid LOC header (bad signature)\",\r\n \"INVALID_CEN\" : \"Invalid CEN header (bad signature)\",\r\n \"INVALID_END\" : \"Invalid END header (bad signature)\",\r\n\r\n /* ZipEntry error messages*/\r\n \"NO_DATA\" : \"Nothing to decompress\",\r\n \"BAD_CRC\" : \"CRC32 checksum failed\",\r\n \"FILE_IN_THE_WAY\" : \"There is a file in the way: %s\",\r\n \"UNKNOWN_METHOD\" : \"Invalid/unsupported compression method\",\r\n\r\n /* Inflater error messages */\r\n \"AVAIL_DATA\" : \"inflate::Available inflate data did not terminate\",\r\n \"INVALID_DISTANCE\" : \"inflate::Invalid literal/length or distance code in fixed or dynamic block\",\r\n \"TO_MANY_CODES\" : \"inflate::Dynamic block code description: too many length or distance codes\",\r\n \"INVALID_REPEAT_LEN\" : \"inflate::Dynamic block code description: repeat more than specified lengths\",\r\n \"INVALID_REPEAT_FIRST\" : \"inflate::Dynamic block code description: repeat lengths with no first length\",\r\n \"INCOMPLETE_CODES\" : \"inflate::Dynamic block code description: code lengths codes incomplete\",\r\n \"INVALID_DYN_DISTANCE\": \"inflate::Dynamic block code description: invalid distance code lengths\",\r\n \"INVALID_CODES_LEN\": \"inflate::Dynamic block code description: invalid literal/length code lengths\",\r\n \"INVALID_STORE_BLOCK\" : \"inflate::Stored block length did not match one's complement\",\r\n \"INVALID_BLOCK_TYPE\" : \"inflate::Invalid block type (type == 3)\",\r\n\r\n /* ADM-ZIP error messages */\r\n \"CANT_EXTRACT_FILE\" : \"Could not extract the file\",\r\n \"CANT_OVERRIDE\" : \"Target file already exists\",\r\n \"NO_ZIP\" : \"No zip file was loaded\",\r\n \"NO_ENTRY\" : \"Entry doesn't exist\",\r\n \"DIRECTORY_CONTENT_ERROR\" : \"A directory cannot have content\",\r\n \"FILE_NOT_FOUND\" : \"File not found: %s\",\r\n \"NOT_IMPLEMENTED\" : \"Not implemented\",\r\n \"INVALID_FILENAME\" : \"Invalid filename\",\r\n \"INVALID_FORMAT\" : \"Invalid or unsupported zip format. No END header found\"\r\n};","var fs = require(\"./fileSystem\").require(),\r\n pth = require(\"path\");\r\n\t\r\nfs.existsSync = fs.existsSync || pth.existsSync;\r\n\r\nmodule.exports = function(/*String*/path) {\r\n\r\n var _path = path || \"\",\r\n _permissions = 0,\r\n _obj = newAttr(),\r\n _stat = null;\r\n\r\n function newAttr() {\r\n return {\r\n directory : false,\r\n readonly : false,\r\n hidden : false,\r\n executable : false,\r\n mtime : 0,\r\n atime : 0\r\n }\r\n }\r\n\r\n if (_path && fs.existsSync(_path)) {\r\n _stat = fs.statSync(_path);\r\n _obj.directory = _stat.isDirectory();\r\n _obj.mtime = _stat.mtime;\r\n _obj.atime = _stat.atime;\r\n _obj.executable = (0o111 & _stat.mode) != 0; // file is executable who ever har right not just owner\r\n _obj.readonly = (0o200 & _stat.mode) == 0; // readonly if owner has no write right\r\n _obj.hidden = pth.basename(_path)[0] === \".\";\r\n } else {\r\n console.warn(\"Invalid path: \" + _path)\r\n }\r\n\r\n return {\r\n\r\n get directory () {\r\n return _obj.directory;\r\n },\r\n\r\n get readOnly () {\r\n return _obj.readonly;\r\n },\r\n\r\n get hidden () {\r\n return _obj.hidden;\r\n },\r\n\r\n get mtime () {\r\n return _obj.mtime;\r\n },\r\n\r\n get atime () {\r\n return _obj.atime;\r\n },\r\n\r\n\r\n get executable () {\r\n return _obj.executable;\r\n },\r\n\r\n decodeAttributes : function(val) {\r\n\r\n },\r\n\r\n encodeAttributes : function (val) {\r\n\r\n },\r\n\r\n toString : function() {\r\n return '{\\n' +\r\n '\\t\"path\" : \"' + _path + \",\\n\" +\r\n '\\t\"isDirectory\" : ' + _obj.directory + \",\\n\" +\r\n '\\t\"isReadOnly\" : ' + _obj.readonly + \",\\n\" +\r\n '\\t\"isHidden\" : ' + _obj.hidden + \",\\n\" +\r\n '\\t\"isExecutable\" : ' + _obj.executable + \",\\n\" +\r\n '\\t\"mTime\" : ' + _obj.mtime + \"\\n\" +\r\n '\\t\"aTime\" : ' + _obj.atime + \"\\n\" +\r\n '}';\r\n }\r\n }\r\n\r\n};\r\n","exports.require = function() {\r\n var fs = require(\"fs\");\r\n if (process && process.versions && process.versions['electron']) {\r\n\t try {\r\n\t originalFs = require(\"original-fs\");\r\n\t if (Object.keys(originalFs).length > 0) {\r\n\t fs = originalFs;\r\n }\r\n\t } catch (e) {}\r\n }\r\n return fs\r\n};\r\n","module.exports = require(\"./utils\");\r\nmodule.exports.FileSystem = require(\"./fileSystem\");\r\nmodule.exports.Constants = require(\"./constants\");\r\nmodule.exports.Errors = require(\"./errors\");\r\nmodule.exports.FileAttr = require(\"./fattr\");","var fs = require(\"./fileSystem\").require(),\r\n pth = require('path');\r\n\r\nfs.existsSync = fs.existsSync || pth.existsSync;\r\n\r\nmodule.exports = (function() {\r\n\r\n var crcTable = [],\r\n Constants = require('./constants'),\r\n Errors = require('./errors'),\r\n\r\n PATH_SEPARATOR = pth.sep;\r\n\r\n\r\n function mkdirSync(/*String*/path) {\r\n var resolvedPath = path.split(PATH_SEPARATOR)[0];\r\n path.split(PATH_SEPARATOR).forEach(function(name) {\r\n if (!name || name.substr(-1,1) === \":\") return;\r\n resolvedPath += PATH_SEPARATOR + name;\r\n var stat;\r\n try {\r\n stat = fs.statSync(resolvedPath);\r\n } catch (e) {\r\n fs.mkdirSync(resolvedPath);\r\n }\r\n if (stat && stat.isFile())\r\n throw Errors.FILE_IN_THE_WAY.replace(\"%s\", resolvedPath);\r\n });\r\n }\r\n\r\n function findSync(/*String*/dir, /*RegExp*/pattern, /*Boolean*/recoursive) {\r\n if (typeof pattern === 'boolean') {\r\n recoursive = pattern;\r\n pattern = undefined;\r\n }\r\n var files = [];\r\n fs.readdirSync(dir).forEach(function(file) {\r\n var path = pth.join(dir, file);\r\n\r\n if (fs.statSync(path).isDirectory() && recoursive)\r\n files = files.concat(findSync(path, pattern, recoursive));\r\n\r\n if (!pattern || pattern.test(path)) {\r\n files.push(pth.normalize(path) + (fs.statSync(path).isDirectory() ? PATH_SEPARATOR : \"\"));\r\n }\r\n\r\n });\r\n return files;\r\n }\r\n\r\n function readBigUInt64LE(/*Buffer*/buffer, /*int*/index) {\r\n var slice = Buffer.from(buffer.slice(index, index + 8));\r\n slice.swap64();\r\n\r\n return parseInt(`0x${ slice.toString('hex') }`);\r\n }\r\n\r\n return {\r\n makeDir : function(/*String*/path) {\r\n mkdirSync(path);\r\n },\r\n\r\n crc32 : function(buf) {\r\n if (typeof buf === 'string') {\r\n buf = Buffer.alloc(buf.length, buf);\r\n }\r\n var b = Buffer.alloc(4);\r\n if (!crcTable.length) {\r\n for (var n = 0; n < 256; n++) {\r\n var c = n;\r\n for (var k = 8; --k >= 0;) //\r\n if ((c & 1) !== 0) { c = 0xedb88320 ^ (c >>> 1); } else { c = c >>> 1; }\r\n if (c < 0) {\r\n b.writeInt32LE(c, 0);\r\n c = b.readUInt32LE(0);\r\n }\r\n crcTable[n] = c;\r\n }\r\n }\r\n var crc = 0, off = 0, len = buf.length, c1 = ~crc;\r\n while(--len >= 0) c1 = crcTable[(c1 ^ buf[off++]) & 0xff] ^ (c1 >>> 8);\r\n crc = ~c1;\r\n b.writeInt32LE(crc & 0xffffffff, 0);\r\n return b.readUInt32LE(0);\r\n },\r\n\r\n methodToString : function(/*Number*/method) {\r\n switch (method) {\r\n case Constants.STORED:\r\n return 'STORED (' + method + ')';\r\n case Constants.DEFLATED:\r\n return 'DEFLATED (' + method + ')';\r\n default:\r\n return 'UNSUPPORTED (' + method + ')';\r\n }\r\n\r\n },\r\n\r\n writeFileTo : function(/*String*/path, /*Buffer*/content, /*Boolean*/overwrite, /*Number*/attr) {\r\n if (fs.existsSync(path)) {\r\n if (!overwrite)\r\n return false; // cannot overwrite\r\n\r\n var stat = fs.statSync(path);\r\n if (stat.isDirectory()) {\r\n return false;\r\n }\r\n }\r\n var folder = pth.dirname(path);\r\n if (!fs.existsSync(folder)) {\r\n mkdirSync(folder);\r\n }\r\n\r\n var fd;\r\n try {\r\n fd = fs.openSync(path, 'w', 438); // 0666\r\n } catch(e) {\r\n fs.chmodSync(path, 438);\r\n fd = fs.openSync(path, 'w', 438);\r\n }\r\n if (fd) {\r\n try {\r\n fs.writeSync(fd, content, 0, content.length, 0);\r\n }\r\n catch (e){\r\n throw e;\r\n }\r\n finally {\r\n fs.closeSync(fd);\r\n }\r\n }\r\n fs.chmodSync(path, attr || 438);\r\n return true;\r\n },\r\n\r\n writeFileToAsync : function(/*String*/path, /*Buffer*/content, /*Boolean*/overwrite, /*Number*/attr, /*Function*/callback) {\r\n if(typeof attr === 'function') {\r\n callback = attr;\r\n attr = undefined;\r\n }\r\n\r\n fs.exists(path, function(exists) {\r\n if(exists && !overwrite)\r\n return callback(false);\r\n\r\n fs.stat(path, function(err, stat) {\r\n if(exists &&stat.isDirectory()) {\r\n return callback(false);\r\n }\r\n\r\n var folder = pth.dirname(path);\r\n fs.exists(folder, function(exists) {\r\n if(!exists)\r\n mkdirSync(folder);\r\n\r\n fs.open(path, 'w', 438, function(err, fd) {\r\n if(err) {\r\n fs.chmod(path, 438, function() {\r\n fs.open(path, 'w', 438, function(err, fd) {\r\n fs.write(fd, content, 0, content.length, 0, function() {\r\n fs.close(fd, function() {\r\n fs.chmod(path, attr || 438, function() {\r\n callback(true);\r\n })\r\n });\r\n });\r\n });\r\n })\r\n } else {\r\n if(fd) {\r\n fs.write(fd, content, 0, content.length, 0, function() {\r\n fs.close(fd, function() {\r\n fs.chmod(path, attr || 438, function() {\r\n callback(true);\r\n })\r\n });\r\n });\r\n } else {\r\n fs.chmod(path, attr || 438, function() {\r\n callback(true);\r\n })\r\n }\r\n }\r\n });\r\n })\r\n })\r\n })\r\n },\r\n\r\n findFiles : function(/*String*/path) {\r\n return findSync(path, true);\r\n },\r\n\r\n getAttributes : function(/*String*/path) {\r\n\r\n },\r\n\r\n setAttributes : function(/*String*/path) {\r\n\r\n },\r\n\r\n toBuffer : function(input) {\r\n if (Buffer.isBuffer(input)) {\r\n return input;\r\n } else {\r\n if (input.length === 0) {\r\n return Buffer.alloc(0)\r\n }\r\n return Buffer.from(input, 'utf8');\r\n }\r\n },\r\n\r\n readBigUInt64LE,\r\n\r\n Constants : Constants,\r\n Errors : Errors\r\n }\r\n})();\r\n","var Utils = require(\"./util\"),\r\n Headers = require(\"./headers\"),\r\n Constants = Utils.Constants,\r\n Methods = require(\"./methods\");\r\n\r\nmodule.exports = function (/*Buffer*/input) {\r\n\r\n var _entryHeader = new Headers.EntryHeader(),\r\n _entryName = Buffer.alloc(0),\r\n _comment = Buffer.alloc(0),\r\n _isDirectory = false,\r\n uncompressedData = null,\r\n _extra = Buffer.alloc(0);\r\n\r\n function getCompressedDataFromZip() {\r\n if (!input || !Buffer.isBuffer(input)) {\r\n return Buffer.alloc(0);\r\n }\r\n _entryHeader.loadDataHeaderFromBinary(input);\r\n return input.slice(_entryHeader.realDataOffset, _entryHeader.realDataOffset + _entryHeader.compressedSize)\r\n }\r\n\r\n function crc32OK(data) {\r\n // 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\r\n if ((_entryHeader.flags & 0x8) !== 0x8) {\r\n if (Utils.crc32(data) !== _entryHeader.dataHeader.crc) {\r\n return false;\r\n }\r\n } else {\r\n // @TODO: load and check data descriptor header\r\n // The fields in the local header are filled with zero, and the CRC-32 and size are appended in a 12-byte structure\r\n // (optionally preceded by a 4-byte signature) immediately after the compressed data:\r\n }\r\n return true;\r\n }\r\n\r\n function decompress(/*Boolean*/async, /*Function*/callback, /*String, Buffer*/pass) {\r\n if(typeof callback === 'undefined' && typeof async === 'string') {\r\n pass=async;\r\n async=void 0;\r\n }\r\n if (_isDirectory) {\r\n if (async && callback) {\r\n callback(Buffer.alloc(0), Utils.Errors.DIRECTORY_CONTENT_ERROR); //si added error.\r\n }\r\n return Buffer.alloc(0);\r\n }\r\n\r\n var compressedData = getCompressedDataFromZip();\r\n\r\n if (compressedData.length === 0) {\r\n // File is empty, nothing to decompress.\r\n if (async && callback) callback(compressedData);\r\n return compressedData;\r\n }\r\n\r\n if (_entryHeader.encripted){\r\n if ('string' !== typeof pass && !Buffer.isBuffer(pass)){\r\n throw new Error('ADM-ZIP: Incompatible password parameter');\r\n }\r\n compressedData = Methods.ZipCrypto.decrypt(compressedData, _entryHeader, pass);\r\n }\r\n\r\n var data = Buffer.alloc(_entryHeader.size);\r\n\r\n switch (_entryHeader.method) {\r\n case Utils.Constants.STORED:\r\n compressedData.copy(data);\r\n if (!crc32OK(data)) {\r\n if (async && callback) callback(data, Utils.Errors.BAD_CRC);//si added error\r\n throw new Error(Utils.Errors.BAD_CRC);\r\n } else {//si added otherwise did not seem to return data.\r\n if (async && callback) callback(data);\r\n return data;\r\n }\r\n case Utils.Constants.DEFLATED:\r\n var inflater = new Methods.Inflater(compressedData);\r\n if (!async) {\r\n var result = inflater.inflate(data);\r\n result.copy(data, 0);\r\n if (!crc32OK(data)) {\r\n throw new Error(Utils.Errors.BAD_CRC + \" \" + _entryName.toString());\r\n }\r\n return data;\r\n } else {\r\n inflater.inflateAsync(function(result) {\r\n result.copy(data, 0);\r\n if (!crc32OK(data)) {\r\n if (callback) callback(data, Utils.Errors.BAD_CRC); //si added error\r\n } else { //si added otherwise did not seem to return data.\r\n if (callback) callback(data);\r\n }\r\n })\r\n }\r\n break;\r\n default:\r\n if (async && callback) callback(Buffer.alloc(0), Utils.Errors.UNKNOWN_METHOD);\r\n throw new Error(Utils.Errors.UNKNOWN_METHOD);\r\n }\r\n }\r\n\r\n function compress(/*Boolean*/async, /*Function*/callback) {\r\n if ((!uncompressedData || !uncompressedData.length) && Buffer.isBuffer(input)) {\r\n // no data set or the data wasn't changed to require recompression\r\n if (async && callback) callback(getCompressedDataFromZip());\r\n return getCompressedDataFromZip();\r\n }\r\n\r\n if (uncompressedData.length && !_isDirectory) {\r\n var compressedData;\r\n // Local file header\r\n switch (_entryHeader.method) {\r\n case Utils.Constants.STORED:\r\n _entryHeader.compressedSize = _entryHeader.size;\r\n\r\n compressedData = Buffer.alloc(uncompressedData.length);\r\n uncompressedData.copy(compressedData);\r\n\r\n if (async && callback) callback(compressedData);\r\n return compressedData;\r\n default:\r\n case Utils.Constants.DEFLATED:\r\n\r\n var deflater = new Methods.Deflater(uncompressedData);\r\n if (!async) {\r\n var deflated = deflater.deflate();\r\n _entryHeader.compressedSize = deflated.length;\r\n return deflated;\r\n } else {\r\n deflater.deflateAsync(function(data) {\r\n compressedData = Buffer.alloc(data.length);\r\n _entryHeader.compressedSize = data.length;\r\n data.copy(compressedData);\r\n callback && callback(compressedData);\r\n })\r\n }\r\n deflater = null;\r\n break;\r\n }\r\n } else {\r\n if (async && callback) {\r\n callback(Buffer.alloc(0));\r\n } else {\r\n return Buffer.alloc(0);\r\n }\r\n }\r\n }\r\n\r\n function readUInt64LE(buffer, offset) {\r\n return (buffer.readUInt32LE(offset + 4) << 4) + buffer.readUInt32LE(offset);\r\n }\r\n\r\n function parseExtra(data) {\r\n var offset = 0;\r\n var signature, size, part;\r\n while(offset= Constants.EF_ZIP64_SCOMP) {\r\n size = readUInt64LE(data, Constants.EF_ZIP64_SUNCOMP);\r\n if(_entryHeader.size === Constants.EF_ZIP64_OR_32) {\r\n _entryHeader.size = size;\r\n }\r\n }\r\n if(data.length >= Constants.EF_ZIP64_RHO) {\r\n compressedSize = readUInt64LE(data, Constants.EF_ZIP64_SCOMP);\r\n if(_entryHeader.compressedSize === Constants.EF_ZIP64_OR_32) {\r\n _entryHeader.compressedSize = compressedSize;\r\n }\r\n }\r\n if(data.length >= Constants.EF_ZIP64_DSN) {\r\n offset = readUInt64LE(data, Constants.EF_ZIP64_RHO);\r\n if(_entryHeader.offset === Constants.EF_ZIP64_OR_32) {\r\n _entryHeader.offset = offset;\r\n }\r\n }\r\n if(data.length >= Constants.EF_ZIP64_DSN+4) {\r\n diskNumStart = data.readUInt32LE(Constants.EF_ZIP64_DSN);\r\n if(_entryHeader.diskNumStart === Constants.EF_ZIP64_OR_16) {\r\n _entryHeader.diskNumStart = diskNumStart;\r\n }\r\n }\r\n }\r\n\r\n\r\n return {\r\n get entryName () { return _entryName.toString(); },\r\n get rawEntryName() { return _entryName; },\r\n set entryName (val) {\r\n _entryName = Utils.toBuffer(val);\r\n var lastChar = _entryName[_entryName.length - 1];\r\n _isDirectory = (lastChar === 47) || (lastChar === 92);\r\n _entryHeader.fileNameLength = _entryName.length;\r\n },\r\n\r\n get extra () { return _extra; },\r\n set extra (val) {\r\n _extra = val;\r\n _entryHeader.extraLength = val.length;\r\n parseExtra(val);\r\n },\r\n\r\n get comment () { return _comment.toString(); },\r\n set comment (val) {\r\n _comment = Utils.toBuffer(val);\r\n _entryHeader.commentLength = _comment.length;\r\n },\r\n\r\n get name () { var n = _entryName.toString(); return _isDirectory ? n.substr(n.length - 1).split(\"/\").pop() : n.split(\"/\").pop(); },\r\n get isDirectory () { return _isDirectory },\r\n\r\n getCompressedData : function() {\r\n return compress(false, null)\r\n },\r\n\r\n getCompressedDataAsync : function(/*Function*/callback) {\r\n compress(true, callback)\r\n },\r\n\r\n setData : function(value) {\r\n uncompressedData = Utils.toBuffer(value);\r\n if (!_isDirectory && uncompressedData.length) {\r\n _entryHeader.size = uncompressedData.length;\r\n _entryHeader.method = Utils.Constants.DEFLATED;\r\n _entryHeader.crc = Utils.crc32(value);\r\n _entryHeader.changed = true;\r\n } else { // folders and blank files should be stored\r\n _entryHeader.method = Utils.Constants.STORED;\r\n }\r\n },\r\n\r\n getData : function(pass) {\r\n if (_entryHeader.changed) {\r\n\t\t\t\treturn uncompressedData;\r\n\t\t\t} else {\r\n\t\t\t\treturn decompress(false, null, pass);\r\n }\r\n },\r\n\r\n getDataAsync : function(/*Function*/callback, pass) {\r\n\t\t\tif (_entryHeader.changed) {\r\n\t\t\t\tcallback(uncompressedData)\r\n\t\t\t} else {\r\n\t\t\t\tdecompress(true, callback, pass)\r\n }\r\n },\r\n\r\n set attr(attr) { _entryHeader.attr = attr; },\r\n get attr() { return _entryHeader.attr; },\r\n\r\n set header(/*Buffer*/data) {\r\n _entryHeader.loadFromBinary(data);\r\n },\r\n\r\n get header() {\r\n return _entryHeader;\r\n },\r\n\r\n packHeader : function() {\r\n var header = _entryHeader.entryHeaderToBinary();\r\n // add\r\n _entryName.copy(header, Utils.Constants.CENHDR);\r\n if (_entryHeader.extraLength) {\r\n _extra.copy(header, Utils.Constants.CENHDR + _entryName.length)\r\n }\r\n if (_entryHeader.commentLength) {\r\n _comment.copy(header, Utils.Constants.CENHDR + _entryName.length + _entryHeader.extraLength, _comment.length);\r\n }\r\n return header;\r\n },\r\n\r\n toString : function() {\r\n return '{\\n' +\r\n '\\t\"entryName\" : \"' + _entryName.toString() + \"\\\",\\n\" +\r\n '\\t\"name\" : \"' + (_isDirectory ? _entryName.toString().replace(/\\/$/, '').split(\"/\").pop() : _entryName.toString().split(\"/\").pop()) + \"\\\",\\n\" +\r\n '\\t\"comment\" : \"' + _comment.toString() + \"\\\",\\n\" +\r\n '\\t\"isDirectory\" : ' + _isDirectory + \",\\n\" +\r\n '\\t\"header\" : ' + _entryHeader.toString().replace(/\\t/mg, \"\\t\\t\").replace(/}/mg, \"\\t}\") + \",\\n\" +\r\n '\\t\"compressedData\" : <' + (input && input.length + \" bytes buffer\" || \"null\") + \">\\n\" +\r\n '\\t\"data\" : <' + (uncompressedData && uncompressedData.length + \" bytes buffer\" || \"null\") + \">\\n\" +\r\n '}';\r\n }\r\n }\r\n};\r\n","var ZipEntry = require(\"./zipEntry\"),\r\n\tHeaders = require(\"./headers\"),\r\n\tUtils = require(\"./util\");\r\n\r\nmodule.exports = function (/*String|Buffer*/input, /*Number*/inputType) {\r\n\tvar entryList = [],\r\n\t\tentryTable = {},\r\n\t\t_comment = Buffer.alloc(0),\r\n\t\tfilename = \"\",\r\n\t\tfs = Utils.FileSystem.require(),\r\n\t\tinBuffer = null,\r\n\t\tmainHeader = new Headers.MainHeader(),\r\n\t\tloadedEntries = false;\r\n\r\n\tif (inputType === Utils.Constants.FILE) {\r\n\t\t// is a filename\r\n\t\tfilename = input;\r\n\t\tinBuffer = fs.readFileSync(filename);\r\n\t\treadMainHeader();\r\n\t} else if (inputType === Utils.Constants.BUFFER) {\r\n\t\t// is a memory buffer\r\n\t\tinBuffer = input;\r\n\t\treadMainHeader();\r\n\t} else {\r\n\t\t// none. is a new file\r\n\t\tloadedEntries = true;\r\n\t}\r\n\r\n\tfunction iterateEntries(callback) {\r\n\t\tconst totalEntries = mainHeader.diskEntries; // total number of entries\r\n\t\tlet index = mainHeader.offset; // offset of first CEN header\r\n\r\n\t\tfor (let i = 0; i < totalEntries; i++) {\r\n\t\t\tlet tmp = index;\r\n\t\t\tconst entry = new ZipEntry(inBuffer);\r\n\r\n\t\t\tentry.header = inBuffer.slice(tmp, tmp += Utils.Constants.CENHDR);\r\n\t\t\tentry.entryName = inBuffer.slice(tmp, tmp += entry.header.fileNameLength);\r\n\r\n\t\t\tindex += entry.header.entryHeaderSize;\r\n\r\n\t\t\tcallback(entry);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction readEntries() {\r\n\t\tloadedEntries = true;\r\n\t\tentryTable = {};\r\n\t\tentryList = new Array(mainHeader.diskEntries); // total number of entries\r\n\t\tvar index = mainHeader.offset; // offset of first CEN header\r\n\t\tfor (var i = 0; i < entryList.length; i++) {\r\n\r\n\t\t\tvar tmp = index,\r\n\t\t\t\tentry = new ZipEntry(inBuffer);\r\n\t\t\tentry.header = inBuffer.slice(tmp, tmp += Utils.Constants.CENHDR);\r\n\r\n\t\t\tentry.entryName = inBuffer.slice(tmp, tmp += entry.header.fileNameLength);\r\n\r\n\t\t\tif (entry.header.extraLength) {\r\n\t\t\t\tentry.extra = inBuffer.slice(tmp, tmp += entry.header.extraLength);\r\n\t\t\t}\r\n\r\n\t\t\tif (entry.header.commentLength)\r\n\t\t\t\tentry.comment = inBuffer.slice(tmp, tmp + entry.header.commentLength);\r\n\r\n\t\t\tindex += entry.header.entryHeaderSize;\r\n\r\n\t\t\tentryList[i] = entry;\r\n\t\t\tentryTable[entry.entryName] = entry;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction readMainHeader() {\r\n\t\tvar i = inBuffer.length - Utils.Constants.ENDHDR, // END header size\r\n\t\t\tmax = Math.max(0, i - 0xFFFF), // 0xFFFF is the max zip file comment length\r\n\t\t\tn = max,\r\n\t\t\tendStart = inBuffer.length,\r\n\t\t\tendOffset = -1, // Start offset of the END header\r\n\t\t\tcommentEnd = 0;\r\n\r\n\t\tfor (i; i >= n; i--) {\r\n\t\t\tif (inBuffer[i] !== 0x50) continue; // quick check that the byte is 'P'\r\n\t\t\tif (inBuffer.readUInt32LE(i) === Utils.Constants.ENDSIG) { // \"PK\\005\\006\"\r\n\t\t\t\tendOffset = i;\r\n\t\t\t\tcommentEnd = i;\r\n\t\t\t\tendStart = i + Utils.Constants.ENDHDR;\r\n\t\t\t\t// We already found a regular signature, let's look just a bit further to check if there's any zip64 signature\r\n\t\t\t\tn = i - Utils.Constants.END64HDR;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif (inBuffer.readUInt32LE(i) === Utils.Constants.END64SIG) {\r\n\t\t\t\t// Found a zip64 signature, let's continue reading the whole zip64 record\r\n\t\t\t\tn = max;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif (inBuffer.readUInt32LE(i) == Utils.Constants.ZIP64SIG) {\r\n\t\t\t\t// Found the zip64 record, let's determine it's size\r\n\t\t\t\tendOffset = i;\r\n\t\t\t\tendStart = i + Utils.readBigUInt64LE(inBuffer, i + Utils.Constants.ZIP64SIZE) + Utils.Constants.ZIP64LEAD;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!~endOffset)\r\n\t\t\tthrow new Error(Utils.Errors.INVALID_FORMAT);\r\n\r\n\t\tmainHeader.loadFromBinary(inBuffer.slice(endOffset, endStart));\r\n\t\tif (mainHeader.commentLength) {\r\n\t\t\t_comment = inBuffer.slice(commentEnd + Utils.Constants.ENDHDR);\r\n\t\t}\r\n\t\t// readEntries();\r\n\t}\r\n\r\n\treturn {\r\n\t\t/**\r\n\t\t * Returns an array of ZipEntry objects existent in the current opened archive\r\n\t\t * @return Array\r\n\t\t */\r\n\t\tget entries() {\r\n\t\t\tif (!loadedEntries) {\r\n\t\t\t\treadEntries();\r\n\t\t\t}\r\n\t\t\treturn entryList;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Archive comment\r\n\t\t * @return {String}\r\n\t\t */\r\n\t\tget comment() {\r\n\t\t\treturn _comment.toString();\r\n\t\t},\r\n\t\tset comment(val) {\r\n\t\t\t_comment = Utils.toBuffer(val);\r\n\t\t\tmainHeader.commentLength = _comment.length;\r\n\t\t},\r\n\r\n\t\tgetEntryCount: function() {\r\n\t\t\tif (!loadedEntries) {\r\n\t\t\t\treturn mainHeader.diskEntries;\r\n\t\t\t}\r\n\r\n\t\t\treturn entryList.length;\r\n\t\t},\r\n\r\n\t\tforEach: function(callback) {\r\n\t\t\tif (!loadedEntries) {\r\n\t\t\t\titerateEntries(callback);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tentryList.forEach(callback);\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Returns a reference to the entry with the given name or null if entry is inexistent\r\n\t\t *\r\n\t\t * @param entryName\r\n\t\t * @return ZipEntry\r\n\t\t */\r\n\t\tgetEntry: function (/*String*/entryName) {\r\n\t\t\tif (!loadedEntries) {\r\n\t\t\t\treadEntries();\r\n\t\t\t}\r\n\t\t\treturn entryTable[entryName] || null;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Adds the given entry to the entry list\r\n\t\t *\r\n\t\t * @param entry\r\n\t\t */\r\n\t\tsetEntry: function (/*ZipEntry*/entry) {\r\n\t\t\tif (!loadedEntries) {\r\n\t\t\t\treadEntries();\r\n\t\t\t}\r\n\t\t\tentryList.push(entry);\r\n\t\t\tentryTable[entry.entryName] = entry;\r\n\t\t\tmainHeader.totalEntries = entryList.length;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Removes the entry with the given name from the entry list.\r\n\t\t *\r\n\t\t * If the entry is a directory, then all nested files and directories will be removed\r\n\t\t * @param entryName\r\n\t\t */\r\n\t\tdeleteEntry: function (/*String*/entryName) {\r\n\t\t\tif (!loadedEntries) {\r\n\t\t\t\treadEntries();\r\n\t\t\t}\r\n\t\t\tvar entry = entryTable[entryName];\r\n\t\t\tif (entry && entry.isDirectory) {\r\n\t\t\t\tvar _self = this;\r\n\t\t\t\tthis.getEntryChildren(entry).forEach(function (child) {\r\n\t\t\t\t\tif (child.entryName !== entryName) {\r\n\t\t\t\t\t\t_self.deleteEntry(child.entryName)\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\tentryList.splice(entryList.indexOf(entry), 1);\r\n\t\t\tdelete(entryTable[entryName]);\r\n\t\t\tmainHeader.totalEntries = entryList.length;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Iterates and returns all nested files and directories of the given entry\r\n\t\t *\r\n\t\t * @param entry\r\n\t\t * @return Array\r\n\t\t */\r\n\t\tgetEntryChildren: function (/*ZipEntry*/entry) {\r\n\t\t\tif (!loadedEntries) {\r\n\t\t\t\treadEntries();\r\n\t\t\t}\r\n\t\t\tif (entry.isDirectory) {\r\n\t\t\t\tvar list = [],\r\n\t\t\t\t\tname = entry.entryName,\r\n\t\t\t\t\tlen = name.length;\r\n\r\n\t\t\t\tentryList.forEach(function (zipEntry) {\r\n\t\t\t\t\tif (zipEntry.entryName.substr(0, len) === name) {\r\n\t\t\t\t\t\tlist.push(zipEntry);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\treturn list;\r\n\t\t\t}\r\n\t\t\treturn []\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Returns the zip file\r\n\t\t *\r\n\t\t * @return Buffer\r\n\t\t */\r\n\t\tcompressToBuffer: function () {\r\n\t\t\tif (!loadedEntries) {\r\n\t\t\t\treadEntries();\r\n\t\t\t}\r\n\t\t\tif (entryList.length > 1) {\r\n\t\t\t\tentryList.sort(function (a, b) {\r\n\t\t\t\t\tvar nameA = a.entryName.toLowerCase();\r\n\t\t\t\t\tvar nameB = b.entryName.toLowerCase();\r\n\t\t\t\t\tif (nameA < nameB) {\r\n\t\t\t\t\t\treturn -1\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (nameA > nameB) {\r\n\t\t\t\t\t\treturn 1\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tvar totalSize = 0,\r\n\t\t\t\tdataBlock = [],\r\n\t\t\t\tentryHeaders = [],\r\n\t\t\t\tdindex = 0;\r\n\r\n\t\t\tmainHeader.size = 0;\r\n\t\t\tmainHeader.offset = 0;\r\n\r\n\t\t\tentryList.forEach(function (entry) {\r\n\t\t\t\t// compress data and set local and entry header accordingly. Reason why is called first\r\n\t\t\t\tvar compressedData = entry.getCompressedData();\r\n\t\t\t\t// data header\r\n\t\t\t\tentry.header.offset = dindex;\r\n\t\t\t\tvar dataHeader = entry.header.dataHeaderToBinary();\r\n\t\t\t\tvar entryNameLen = entry.rawEntryName.length;\r\n\t\t\t\tvar extra = entry.extra.toString();\r\n\t\t\t\tvar postHeader = Buffer.alloc(entryNameLen + extra.length);\r\n\t\t\t\tentry.rawEntryName.copy(postHeader, 0);\r\n\t\t\t\tpostHeader.fill(extra, entryNameLen);\r\n\r\n\t\t\t\tvar dataLength = dataHeader.length + postHeader.length + compressedData.length;\r\n\r\n\t\t\t\tdindex += dataLength;\r\n\r\n\t\t\t\tdataBlock.push(dataHeader);\r\n\t\t\t\tdataBlock.push(postHeader);\r\n\t\t\t\tdataBlock.push(compressedData);\r\n\r\n\t\t\t\tvar entryHeader = entry.packHeader();\r\n\t\t\t\tentryHeaders.push(entryHeader);\r\n\t\t\t\tmainHeader.size += entryHeader.length;\r\n\t\t\t\ttotalSize += (dataLength + entryHeader.length);\r\n\t\t\t});\r\n\r\n\t\t\ttotalSize += mainHeader.mainHeaderSize; // also includes zip file comment length\r\n\t\t\t// point to end of data and beginning of central directory first record\r\n\t\t\tmainHeader.offset = dindex;\r\n\r\n\t\t\tdindex = 0;\r\n\t\t\tvar outBuffer = Buffer.alloc(totalSize);\r\n\t\t\tdataBlock.forEach(function (content) {\r\n\t\t\t\tcontent.copy(outBuffer, dindex); // write data blocks\r\n\t\t\t\tdindex += content.length;\r\n\t\t\t});\r\n\t\t\tentryHeaders.forEach(function (content) {\r\n\t\t\t\tcontent.copy(outBuffer, dindex); // write central directory entries\r\n\t\t\t\tdindex += content.length;\r\n\t\t\t});\r\n\r\n\t\t\tvar mh = mainHeader.toBinary();\r\n\t\t\tif (_comment) {\r\n\t\t\t\tBuffer.from(_comment).copy(mh, Utils.Constants.ENDHDR); // add zip file comment\r\n\t\t\t}\r\n\r\n\t\t\tmh.copy(outBuffer, dindex); // write main header\r\n\r\n\t\t\treturn outBuffer\r\n\t\t},\r\n\r\n\t\ttoAsyncBuffer: function (/*Function*/onSuccess, /*Function*/onFail, /*Function*/onItemStart, /*Function*/onItemEnd) {\r\n\t\t\tif (!loadedEntries) {\r\n\t\t\t\treadEntries();\r\n\t\t\t}\r\n\t\t\tif (entryList.length > 1) {\r\n\t\t\t\tentryList.sort(function (a, b) {\r\n\t\t\t\t\tvar nameA = a.entryName.toLowerCase();\r\n\t\t\t\t\tvar nameB = b.entryName.toLowerCase();\r\n\t\t\t\t\tif (nameA > nameB) {\r\n\t\t\t\t\t\treturn -1\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (nameA < nameB) {\r\n\t\t\t\t\t\treturn 1\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tvar totalSize = 0,\r\n\t\t\t\tdataBlock = [],\r\n\t\t\t\tentryHeaders = [],\r\n\t\t\t\tdindex = 0;\r\n\r\n\t\t\tmainHeader.size = 0;\r\n\t\t\tmainHeader.offset = 0;\r\n\r\n\t\t\tvar compress = function (entryList) {\r\n\t\t\t\tvar self = arguments.callee;\r\n\t\t\t\tif (entryList.length) {\r\n\t\t\t\t\tvar entry = entryList.pop();\r\n\t\t\t\t\tvar name = entry.entryName + entry.extra.toString();\r\n\t\t\t\t\tif (onItemStart) onItemStart(name);\r\n\t\t\t\t\tentry.getCompressedDataAsync(function (compressedData) {\r\n\t\t\t\t\t\tif (onItemEnd) onItemEnd(name);\r\n\r\n\t\t\t\t\t\tentry.header.offset = dindex;\r\n\t\t\t\t\t\t// data header\r\n\t\t\t\t\t\tvar dataHeader = entry.header.dataHeaderToBinary();\r\n\t\t\t\t\t\tvar postHeader;\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tpostHeader = Buffer.alloc(name.length, name); // using alloc will work on node 5.x+\r\n\t\t\t\t\t\t} catch(e){\r\n\t\t\t\t\t\t\tpostHeader = new Buffer(name); // use deprecated method if alloc fails...\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvar dataLength = dataHeader.length + postHeader.length + compressedData.length;\r\n\r\n\t\t\t\t\t\tdindex += dataLength;\r\n\r\n\t\t\t\t\t\tdataBlock.push(dataHeader);\r\n\t\t\t\t\t\tdataBlock.push(postHeader);\r\n\t\t\t\t\t\tdataBlock.push(compressedData);\r\n\r\n\t\t\t\t\t\tvar entryHeader = entry.packHeader();\r\n\t\t\t\t\t\tentryHeaders.push(entryHeader);\r\n\t\t\t\t\t\tmainHeader.size += entryHeader.length;\r\n\t\t\t\t\t\ttotalSize += (dataLength + entryHeader.length);\r\n\r\n\t\t\t\t\t\tif (entryList.length) {\r\n\t\t\t\t\t\t\tself(entryList);\r\n\t\t\t\t\t\t} else {\r\n\r\n\r\n\t\t\t\t\t\t\ttotalSize += mainHeader.mainHeaderSize; // also includes zip file comment length\r\n\t\t\t\t\t\t\t// point to end of data and beginning of central directory first record\r\n\t\t\t\t\t\t\tmainHeader.offset = dindex;\r\n\r\n\t\t\t\t\t\t\tdindex = 0;\r\n\t\t\t\t\t\t\tvar outBuffer = Buffer.alloc(totalSize);\r\n\t\t\t\t\t\t\tdataBlock.forEach(function (content) {\r\n\t\t\t\t\t\t\t\tcontent.copy(outBuffer, dindex); // write data blocks\r\n\t\t\t\t\t\t\t\tdindex += content.length;\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tentryHeaders.forEach(function (content) {\r\n\t\t\t\t\t\t\t\tcontent.copy(outBuffer, dindex); // write central directory entries\r\n\t\t\t\t\t\t\t\tdindex += content.length;\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\tvar mh = mainHeader.toBinary();\r\n\t\t\t\t\t\t\tif (_comment) {\r\n\t\t\t\t\t\t\t\t_comment.copy(mh, Utils.Constants.ENDHDR); // add zip file comment\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tmh.copy(outBuffer, dindex); // write main header\r\n\r\n\t\t\t\t\t\t\tonSuccess(outBuffer);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tcompress(entryList);\r\n\t\t}\r\n\t}\r\n};\r\n","var register = require('./lib/register')\nvar addHook = require('./lib/add')\nvar removeHook = require('./lib/remove')\n\n// bind with array of arguments: https://stackoverflow.com/a/21792913\nvar bind = Function.bind\nvar bindable = bind.bind(bind)\n\nfunction bindApi (hook, state, name) {\n var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state])\n hook.api = { remove: removeHookRef }\n hook.remove = removeHookRef\n\n ;['before', 'error', 'after', 'wrap'].forEach(function (kind) {\n var args = name ? [state, kind, name] : [state, kind]\n hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args)\n })\n}\n\nfunction HookSingular () {\n var singularHookName = 'h'\n var singularHookState = {\n registry: {}\n }\n var singularHook = register.bind(null, singularHookState, singularHookName)\n bindApi(singularHook, singularHookState, singularHookName)\n return singularHook\n}\n\nfunction HookCollection () {\n var state = {\n registry: {}\n }\n\n var hook = register.bind(null, state)\n bindApi(hook, state)\n\n return hook\n}\n\nvar collectionHookDeprecationMessageDisplayed = false\nfunction Hook () {\n if (!collectionHookDeprecationMessageDisplayed) {\n console.warn('[before-after-hook]: \"Hook()\" repurposing warning, use \"Hook.Collection()\". Read more: https://git.io/upgrade-before-after-hook-to-1.4')\n collectionHookDeprecationMessageDisplayed = true\n }\n return HookCollection()\n}\n\nHook.Singular = HookSingular.bind()\nHook.Collection = HookCollection.bind()\n\nmodule.exports = Hook\n// expose constructors as a named property for TypeScript\nmodule.exports.Hook = Hook\nmodule.exports.Singular = Hook.Singular\nmodule.exports.Collection = Hook.Collection\n","module.exports = addHook\n\nfunction addHook (state, kind, name, hook) {\n var orig = hook\n if (!state.registry[name]) {\n state.registry[name] = []\n }\n\n if (kind === 'before') {\n hook = function (method, options) {\n return Promise.resolve()\n .then(orig.bind(null, options))\n .then(method.bind(null, options))\n }\n }\n\n if (kind === 'after') {\n hook = function (method, options) {\n var result\n return Promise.resolve()\n .then(method.bind(null, options))\n .then(function (result_) {\n result = result_\n return orig(result, options)\n })\n .then(function () {\n return result\n })\n }\n }\n\n if (kind === 'error') {\n hook = function (method, options) {\n return Promise.resolve()\n .then(method.bind(null, options))\n .catch(function (error) {\n return orig(error, options)\n })\n }\n }\n\n state.registry[name].push({\n hook: hook,\n orig: orig\n })\n}\n","module.exports = register\n\nfunction register (state, name, method, options) {\n if (typeof method !== 'function') {\n throw new Error('method for before hook must be a function')\n }\n\n if (!options) {\n options = {}\n }\n\n if (Array.isArray(name)) {\n return name.reverse().reduce(function (callback, name) {\n return register.bind(null, state, name, callback, options)\n }, method)()\n }\n\n return Promise.resolve()\n .then(function () {\n if (!state.registry[name]) {\n return method(options)\n }\n\n return (state.registry[name]).reduce(function (method, registered) {\n return registered.hook.bind(null, method, options)\n }, method)()\n })\n}\n","module.exports = removeHook\n\nfunction removeHook (state, name, method) {\n if (!state.registry[name]) {\n return\n }\n\n var index = state.registry[name]\n .map(function (registered) { return registered.orig })\n .indexOf(method)\n\n if (index === -1) {\n return\n }\n\n state.registry[name].splice(index, 1)\n}\n","'use strict';\nconst {\n\tV4MAPPED,\n\tADDRCONFIG,\n\tALL,\n\tpromises: {\n\t\tResolver: AsyncResolver\n\t},\n\tlookup: dnsLookup\n} = require('dns');\nconst {promisify} = require('util');\nconst os = require('os');\n\nconst kCacheableLookupCreateConnection = Symbol('cacheableLookupCreateConnection');\nconst kCacheableLookupInstance = Symbol('cacheableLookupInstance');\nconst kExpires = Symbol('expires');\n\nconst supportsALL = typeof ALL === 'number';\n\nconst verifyAgent = agent => {\n\tif (!(agent && typeof agent.createConnection === 'function')) {\n\t\tthrow new Error('Expected an Agent instance as the first argument');\n\t}\n};\n\nconst map4to6 = entries => {\n\tfor (const entry of entries) {\n\t\tif (entry.family === 6) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tentry.address = `::ffff:${entry.address}`;\n\t\tentry.family = 6;\n\t}\n};\n\nconst getIfaceInfo = () => {\n\tlet has4 = false;\n\tlet has6 = false;\n\n\tfor (const device of Object.values(os.networkInterfaces())) {\n\t\tfor (const iface of device) {\n\t\t\tif (iface.internal) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (iface.family === 'IPv6') {\n\t\t\t\thas6 = true;\n\t\t\t} else {\n\t\t\t\thas4 = true;\n\t\t\t}\n\n\t\t\tif (has4 && has6) {\n\t\t\t\treturn {has4, has6};\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {has4, has6};\n};\n\nconst isIterable = map => {\n\treturn Symbol.iterator in map;\n};\n\nconst ttl = {ttl: true};\nconst all = {all: true};\n\nclass CacheableLookup {\n\tconstructor({\n\t\tcache = new Map(),\n\t\tmaxTtl = Infinity,\n\t\tfallbackDuration = 3600,\n\t\terrorTtl = 0.15,\n\t\tresolver = new AsyncResolver(),\n\t\tlookup = dnsLookup\n\t} = {}) {\n\t\tthis.maxTtl = maxTtl;\n\t\tthis.errorTtl = errorTtl;\n\n\t\tthis._cache = cache;\n\t\tthis._resolver = resolver;\n\t\tthis._dnsLookup = promisify(lookup);\n\n\t\tif (this._resolver instanceof AsyncResolver) {\n\t\t\tthis._resolve4 = this._resolver.resolve4.bind(this._resolver);\n\t\t\tthis._resolve6 = this._resolver.resolve6.bind(this._resolver);\n\t\t} else {\n\t\t\tthis._resolve4 = promisify(this._resolver.resolve4.bind(this._resolver));\n\t\t\tthis._resolve6 = promisify(this._resolver.resolve6.bind(this._resolver));\n\t\t}\n\n\t\tthis._iface = getIfaceInfo();\n\n\t\tthis._pending = {};\n\t\tthis._nextRemovalTime = false;\n\t\tthis._hostnamesToFallback = new Set();\n\n\t\tif (fallbackDuration < 1) {\n\t\t\tthis._fallback = false;\n\t\t} else {\n\t\t\tthis._fallback = true;\n\n\t\t\tconst interval = setInterval(() => {\n\t\t\t\tthis._hostnamesToFallback.clear();\n\t\t\t}, fallbackDuration * 1000);\n\n\t\t\t/* istanbul ignore next: There is no `interval.unref()` when running inside an Electron renderer */\n\t\t\tif (interval.unref) {\n\t\t\t\tinterval.unref();\n\t\t\t}\n\t\t}\n\n\t\tthis.lookup = this.lookup.bind(this);\n\t\tthis.lookupAsync = this.lookupAsync.bind(this);\n\t}\n\n\tset servers(servers) {\n\t\tthis.clear();\n\n\t\tthis._resolver.setServers(servers);\n\t}\n\n\tget servers() {\n\t\treturn this._resolver.getServers();\n\t}\n\n\tlookup(hostname, options, callback) {\n\t\tif (typeof options === 'function') {\n\t\t\tcallback = options;\n\t\t\toptions = {};\n\t\t} else if (typeof options === 'number') {\n\t\t\toptions = {\n\t\t\t\tfamily: options\n\t\t\t};\n\t\t}\n\n\t\tif (!callback) {\n\t\t\tthrow new Error('Callback must be a function.');\n\t\t}\n\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\tthis.lookupAsync(hostname, options).then(result => {\n\t\t\tif (options.all) {\n\t\t\t\tcallback(null, result);\n\t\t\t} else {\n\t\t\t\tcallback(null, result.address, result.family, result.expires, result.ttl);\n\t\t\t}\n\t\t}, callback);\n\t}\n\n\tasync lookupAsync(hostname, options = {}) {\n\t\tif (typeof options === 'number') {\n\t\t\toptions = {\n\t\t\t\tfamily: options\n\t\t\t};\n\t\t}\n\n\t\tlet cached = await this.query(hostname);\n\n\t\tif (options.family === 6) {\n\t\t\tconst filtered = cached.filter(entry => entry.family === 6);\n\n\t\t\tif (options.hints & V4MAPPED) {\n\t\t\t\tif ((supportsALL && options.hints & ALL) || filtered.length === 0) {\n\t\t\t\t\tmap4to6(cached);\n\t\t\t\t} else {\n\t\t\t\t\tcached = filtered;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcached = filtered;\n\t\t\t}\n\t\t} else if (options.family === 4) {\n\t\t\tcached = cached.filter(entry => entry.family === 4);\n\t\t}\n\n\t\tif (options.hints & ADDRCONFIG) {\n\t\t\tconst {_iface} = this;\n\t\t\tcached = cached.filter(entry => entry.family === 6 ? _iface.has6 : _iface.has4);\n\t\t}\n\n\t\tif (cached.length === 0) {\n\t\t\tconst error = new Error(`cacheableLookup ENOTFOUND ${hostname}`);\n\t\t\terror.code = 'ENOTFOUND';\n\t\t\terror.hostname = hostname;\n\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (options.all) {\n\t\t\treturn cached;\n\t\t}\n\n\t\treturn cached[0];\n\t}\n\n\tasync query(hostname) {\n\t\tlet cached = await this._cache.get(hostname);\n\n\t\tif (!cached) {\n\t\t\tconst pending = this._pending[hostname];\n\n\t\t\tif (pending) {\n\t\t\t\tcached = await pending;\n\t\t\t} else {\n\t\t\t\tconst newPromise = this.queryAndCache(hostname);\n\t\t\t\tthis._pending[hostname] = newPromise;\n\n\t\t\t\ttry {\n\t\t\t\t\tcached = await newPromise;\n\t\t\t\t} finally {\n\t\t\t\t\tdelete this._pending[hostname];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcached = cached.map(entry => {\n\t\t\treturn {...entry};\n\t\t});\n\n\t\treturn cached;\n\t}\n\n\tasync _resolve(hostname) {\n\t\tconst wrap = async promise => {\n\t\t\ttry {\n\t\t\t\treturn await promise;\n\t\t\t} catch (error) {\n\t\t\t\tif (error.code === 'ENODATA' || error.code === 'ENOTFOUND') {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t};\n\n\t\t// ANY is unsafe as it doesn't trigger new queries in the underlying server.\n\t\tconst [A, AAAA] = await Promise.all([\n\t\t\tthis._resolve4(hostname, ttl),\n\t\t\tthis._resolve6(hostname, ttl)\n\t\t].map(promise => wrap(promise)));\n\n\t\tlet aTtl = 0;\n\t\tlet aaaaTtl = 0;\n\t\tlet cacheTtl = 0;\n\n\t\tconst now = Date.now();\n\n\t\tfor (const entry of A) {\n\t\t\tentry.family = 4;\n\t\t\tentry.expires = now + (entry.ttl * 1000);\n\n\t\t\taTtl = Math.max(aTtl, entry.ttl);\n\t\t}\n\n\t\tfor (const entry of AAAA) {\n\t\t\tentry.family = 6;\n\t\t\tentry.expires = now + (entry.ttl * 1000);\n\n\t\t\taaaaTtl = Math.max(aaaaTtl, entry.ttl);\n\t\t}\n\n\t\tif (A.length > 0) {\n\t\t\tif (AAAA.length > 0) {\n\t\t\t\tcacheTtl = Math.min(aTtl, aaaaTtl);\n\t\t\t} else {\n\t\t\t\tcacheTtl = aTtl;\n\t\t\t}\n\t\t} else {\n\t\t\tcacheTtl = aaaaTtl;\n\t\t}\n\n\t\treturn {\n\t\t\tentries: [\n\t\t\t\t...A,\n\t\t\t\t...AAAA\n\t\t\t],\n\t\t\tcacheTtl\n\t\t};\n\t}\n\n\tasync _lookup(hostname) {\n\t\ttry {\n\t\t\tconst entries = await this._dnsLookup(hostname, {\n\t\t\t\tall: true\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tentries,\n\t\t\t\tcacheTtl: 0\n\t\t\t};\n\t\t} catch (_) {\n\t\t\treturn {\n\t\t\t\tentries: [],\n\t\t\t\tcacheTtl: 0\n\t\t\t};\n\t\t}\n\t}\n\n\tasync _set(hostname, data, cacheTtl) {\n\t\tif (this.maxTtl > 0 && cacheTtl > 0) {\n\t\t\tcacheTtl = Math.min(cacheTtl, this.maxTtl) * 1000;\n\t\t\tdata[kExpires] = Date.now() + cacheTtl;\n\n\t\t\ttry {\n\t\t\t\tawait this._cache.set(hostname, data, cacheTtl);\n\t\t\t} catch (error) {\n\t\t\t\tthis.lookupAsync = async () => {\n\t\t\t\t\tconst cacheError = new Error('Cache Error. Please recreate the CacheableLookup instance.');\n\t\t\t\t\tcacheError.cause = error;\n\n\t\t\t\t\tthrow cacheError;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (isIterable(this._cache)) {\n\t\t\t\tthis._tick(cacheTtl);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync queryAndCache(hostname) {\n\t\tif (this._hostnamesToFallback.has(hostname)) {\n\t\t\treturn this._dnsLookup(hostname, all);\n\t\t}\n\n\t\tlet query = await this._resolve(hostname);\n\n\t\tif (query.entries.length === 0 && this._fallback) {\n\t\t\tquery = await this._lookup(hostname);\n\n\t\t\tif (query.entries.length !== 0) {\n\t\t\t\t// Use `dns.lookup(...)` for that particular hostname\n\t\t\t\tthis._hostnamesToFallback.add(hostname);\n\t\t\t}\n\t\t}\n\n\t\tconst cacheTtl = query.entries.length === 0 ? this.errorTtl : query.cacheTtl;\n\t\tawait this._set(hostname, query.entries, cacheTtl);\n\n\t\treturn query.entries;\n\t}\n\n\t_tick(ms) {\n\t\tconst nextRemovalTime = this._nextRemovalTime;\n\n\t\tif (!nextRemovalTime || ms < nextRemovalTime) {\n\t\t\tclearTimeout(this._removalTimeout);\n\n\t\t\tthis._nextRemovalTime = ms;\n\n\t\t\tthis._removalTimeout = setTimeout(() => {\n\t\t\t\tthis._nextRemovalTime = false;\n\n\t\t\t\tlet nextExpiry = Infinity;\n\n\t\t\t\tconst now = Date.now();\n\n\t\t\t\tfor (const [hostname, entries] of this._cache) {\n\t\t\t\t\tconst expires = entries[kExpires];\n\n\t\t\t\t\tif (now >= expires) {\n\t\t\t\t\t\tthis._cache.delete(hostname);\n\t\t\t\t\t} else if (expires < nextExpiry) {\n\t\t\t\t\t\tnextExpiry = expires;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nextExpiry !== Infinity) {\n\t\t\t\t\tthis._tick(nextExpiry - now);\n\t\t\t\t}\n\t\t\t}, ms);\n\n\t\t\t/* istanbul ignore next: There is no `timeout.unref()` when running inside an Electron renderer */\n\t\t\tif (this._removalTimeout.unref) {\n\t\t\t\tthis._removalTimeout.unref();\n\t\t\t}\n\t\t}\n\t}\n\n\tinstall(agent) {\n\t\tverifyAgent(agent);\n\n\t\tif (kCacheableLookupCreateConnection in agent) {\n\t\t\tthrow new Error('CacheableLookup has been already installed');\n\t\t}\n\n\t\tagent[kCacheableLookupCreateConnection] = agent.createConnection;\n\t\tagent[kCacheableLookupInstance] = this;\n\n\t\tagent.createConnection = (options, callback) => {\n\t\t\tif (!('lookup' in options)) {\n\t\t\t\toptions.lookup = this.lookup;\n\t\t\t}\n\n\t\t\treturn agent[kCacheableLookupCreateConnection](options, callback);\n\t\t};\n\t}\n\n\tuninstall(agent) {\n\t\tverifyAgent(agent);\n\n\t\tif (agent[kCacheableLookupCreateConnection]) {\n\t\t\tif (agent[kCacheableLookupInstance] !== this) {\n\t\t\t\tthrow new Error('The agent is not owned by this CacheableLookup instance');\n\t\t\t}\n\n\t\t\tagent.createConnection = agent[kCacheableLookupCreateConnection];\n\n\t\t\tdelete agent[kCacheableLookupCreateConnection];\n\t\t\tdelete agent[kCacheableLookupInstance];\n\t\t}\n\t}\n\n\tupdateInterfaceInfo() {\n\t\tconst {_iface} = this;\n\n\t\tthis._iface = getIfaceInfo();\n\n\t\tif ((_iface.has4 && !this._iface.has4) || (_iface.has6 && !this._iface.has6)) {\n\t\t\tthis._cache.clear();\n\t\t}\n\t}\n\n\tclear(hostname) {\n\t\tif (hostname) {\n\t\t\tthis._cache.delete(hostname);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._cache.clear();\n\t}\n}\n\nmodule.exports = CacheableLookup;\nmodule.exports.default = CacheableLookup;\n","'use strict';\nconst {PassThrough: PassThroughStream} = require('stream');\n\nmodule.exports = options => {\n\toptions = {...options};\n\n\tconst {array} = options;\n\tlet {encoding} = options;\n\tconst isBuffer = encoding === 'buffer';\n\tlet objectMode = false;\n\n\tif (array) {\n\t\tobjectMode = !(encoding || isBuffer);\n\t} else {\n\t\tencoding = encoding || 'utf8';\n\t}\n\n\tif (isBuffer) {\n\t\tencoding = null;\n\t}\n\n\tconst stream = new PassThroughStream({objectMode});\n\n\tif (encoding) {\n\t\tstream.setEncoding(encoding);\n\t}\n\n\tlet length = 0;\n\tconst chunks = [];\n\n\tstream.on('data', chunk => {\n\t\tchunks.push(chunk);\n\n\t\tif (objectMode) {\n\t\t\tlength = chunks.length;\n\t\t} else {\n\t\t\tlength += chunk.length;\n\t\t}\n\t});\n\n\tstream.getBufferedValue = () => {\n\t\tif (array) {\n\t\t\treturn chunks;\n\t\t}\n\n\t\treturn isBuffer ? Buffer.concat(chunks, length) : chunks.join('');\n\t};\n\n\tstream.getBufferedLength = () => length;\n\n\treturn stream;\n};\n","'use strict';\nconst {constants: BufferConstants} = require('buffer');\nconst pump = require('pump');\nconst bufferStream = require('./buffer-stream');\n\nclass MaxBufferError extends Error {\n\tconstructor() {\n\t\tsuper('maxBuffer exceeded');\n\t\tthis.name = 'MaxBufferError';\n\t}\n}\n\nasync function getStream(inputStream, options) {\n\tif (!inputStream) {\n\t\treturn Promise.reject(new Error('Expected a stream'));\n\t}\n\n\toptions = {\n\t\tmaxBuffer: Infinity,\n\t\t...options\n\t};\n\n\tconst {maxBuffer} = options;\n\n\tlet stream;\n\tawait new Promise((resolve, reject) => {\n\t\tconst rejectPromise = error => {\n\t\t\t// Don't retrieve an oversized buffer.\n\t\t\tif (error && stream.getBufferedLength() <= BufferConstants.MAX_LENGTH) {\n\t\t\t\terror.bufferedData = stream.getBufferedValue();\n\t\t\t}\n\n\t\t\treject(error);\n\t\t};\n\n\t\tstream = pump(inputStream, bufferStream(options), error => {\n\t\t\tif (error) {\n\t\t\t\trejectPromise(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresolve();\n\t\t});\n\n\t\tstream.on('data', () => {\n\t\t\tif (stream.getBufferedLength() > maxBuffer) {\n\t\t\t\trejectPromise(new MaxBufferError());\n\t\t\t}\n\t\t});\n\t});\n\n\treturn stream.getBufferedValue();\n}\n\nmodule.exports = getStream;\n// TODO: Remove this for the next major release\nmodule.exports.default = getStream;\nmodule.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'});\nmodule.exports.array = (stream, options) => getStream(stream, {...options, array: true});\nmodule.exports.MaxBufferError = MaxBufferError;\n","'use strict';\n\nconst EventEmitter = require('events');\nconst urlLib = require('url');\nconst normalizeUrl = require('normalize-url');\nconst getStream = require('get-stream');\nconst CachePolicy = require('http-cache-semantics');\nconst Response = require('responselike');\nconst lowercaseKeys = require('lowercase-keys');\nconst cloneResponse = require('clone-response');\nconst Keyv = require('keyv');\n\nclass CacheableRequest {\n\tconstructor(request, cacheAdapter) {\n\t\tif (typeof request !== 'function') {\n\t\t\tthrow new TypeError('Parameter `request` must be a function');\n\t\t}\n\n\t\tthis.cache = new Keyv({\n\t\t\turi: typeof cacheAdapter === 'string' && cacheAdapter,\n\t\t\tstore: typeof cacheAdapter !== 'string' && cacheAdapter,\n\t\t\tnamespace: 'cacheable-request'\n\t\t});\n\n\t\treturn this.createCacheableRequest(request);\n\t}\n\n\tcreateCacheableRequest(request) {\n\t\treturn (opts, cb) => {\n\t\t\tlet url;\n\t\t\tif (typeof opts === 'string') {\n\t\t\t\turl = normalizeUrlObject(urlLib.parse(opts));\n\t\t\t\topts = {};\n\t\t\t} else if (opts instanceof urlLib.URL) {\n\t\t\t\turl = normalizeUrlObject(urlLib.parse(opts.toString()));\n\t\t\t\topts = {};\n\t\t\t} else {\n\t\t\t\tconst [pathname, ...searchParts] = (opts.path || '').split('?');\n\t\t\t\tconst search = searchParts.length > 0 ?\n\t\t\t\t\t`?${searchParts.join('?')}` :\n\t\t\t\t\t'';\n\t\t\t\turl = normalizeUrlObject({ ...opts, pathname, search });\n\t\t\t}\n\n\t\t\topts = {\n\t\t\t\theaders: {},\n\t\t\t\tmethod: 'GET',\n\t\t\t\tcache: true,\n\t\t\t\tstrictTtl: false,\n\t\t\t\tautomaticFailover: false,\n\t\t\t\t...opts,\n\t\t\t\t...urlObjectToRequestOptions(url)\n\t\t\t};\n\t\t\topts.headers = lowercaseKeys(opts.headers);\n\n\t\t\tconst ee = new EventEmitter();\n\t\t\tconst normalizedUrlString = normalizeUrl(\n\t\t\t\turlLib.format(url),\n\t\t\t\t{\n\t\t\t\t\tstripWWW: false,\n\t\t\t\t\tremoveTrailingSlash: false,\n\t\t\t\t\tstripAuthentication: false\n\t\t\t\t}\n\t\t\t);\n\t\t\tconst key = `${opts.method}:${normalizedUrlString}`;\n\t\t\tlet revalidate = false;\n\t\t\tlet madeRequest = false;\n\n\t\t\tconst makeRequest = opts => {\n\t\t\t\tmadeRequest = true;\n\t\t\t\tlet requestErrored = false;\n\t\t\t\tlet requestErrorCallback;\n\n\t\t\t\tconst requestErrorPromise = new Promise(resolve => {\n\t\t\t\t\trequestErrorCallback = () => {\n\t\t\t\t\t\tif (!requestErrored) {\n\t\t\t\t\t\t\trequestErrored = true;\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tconst handler = response => {\n\t\t\t\t\tif (revalidate && !opts.forceRefresh) {\n\t\t\t\t\t\tresponse.status = response.statusCode;\n\t\t\t\t\t\tconst revalidatedPolicy = CachePolicy.fromObject(revalidate.cachePolicy).revalidatedPolicy(opts, response);\n\t\t\t\t\t\tif (!revalidatedPolicy.modified) {\n\t\t\t\t\t\t\tconst headers = revalidatedPolicy.policy.responseHeaders();\n\t\t\t\t\t\t\tresponse = new Response(revalidate.statusCode, headers, revalidate.body, revalidate.url);\n\t\t\t\t\t\t\tresponse.cachePolicy = revalidatedPolicy.policy;\n\t\t\t\t\t\t\tresponse.fromCache = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!response.fromCache) {\n\t\t\t\t\t\tresponse.cachePolicy = new CachePolicy(opts, response, opts);\n\t\t\t\t\t\tresponse.fromCache = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet clonedResponse;\n\t\t\t\t\tif (opts.cache && response.cachePolicy.storable()) {\n\t\t\t\t\t\tclonedResponse = cloneResponse(response);\n\n\t\t\t\t\t\t(async () => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst bodyPromise = getStream.buffer(response);\n\n\t\t\t\t\t\t\t\tawait Promise.race([\n\t\t\t\t\t\t\t\t\trequestErrorPromise,\n\t\t\t\t\t\t\t\t\tnew Promise(resolve => response.once('end', resolve))\n\t\t\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t\t\tif (requestErrored) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst body = await bodyPromise;\n\n\t\t\t\t\t\t\t\tconst value = {\n\t\t\t\t\t\t\t\t\tcachePolicy: response.cachePolicy.toObject(),\n\t\t\t\t\t\t\t\t\turl: response.url,\n\t\t\t\t\t\t\t\t\tstatusCode: response.fromCache ? revalidate.statusCode : response.statusCode,\n\t\t\t\t\t\t\t\t\tbody\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tlet ttl = opts.strictTtl ? response.cachePolicy.timeToLive() : undefined;\n\t\t\t\t\t\t\t\tif (opts.maxTtl) {\n\t\t\t\t\t\t\t\t\tttl = ttl ? Math.min(ttl, opts.maxTtl) : opts.maxTtl;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait this.cache.set(key, value, ttl);\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})();\n\t\t\t\t\t} else if (opts.cache && revalidate) {\n\t\t\t\t\t\t(async () => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait this.cache.delete(key);\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})();\n\t\t\t\t\t}\n\n\t\t\t\t\tee.emit('response', clonedResponse || response);\n\t\t\t\t\tif (typeof cb === 'function') {\n\t\t\t\t\t\tcb(clonedResponse || response);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\ttry {\n\t\t\t\t\tconst req = request(opts, handler);\n\t\t\t\t\treq.once('error', requestErrorCallback);\n\t\t\t\t\treq.once('abort', requestErrorCallback);\n\t\t\t\t\tee.emit('request', req);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tee.emit('error', new CacheableRequest.RequestError(error));\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t(async () => {\n\t\t\t\tconst get = async opts => {\n\t\t\t\t\tawait Promise.resolve();\n\n\t\t\t\t\tconst cacheEntry = opts.cache ? await this.cache.get(key) : undefined;\n\t\t\t\t\tif (typeof cacheEntry === 'undefined') {\n\t\t\t\t\t\treturn makeRequest(opts);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst policy = CachePolicy.fromObject(cacheEntry.cachePolicy);\n\t\t\t\t\tif (policy.satisfiesWithoutRevalidation(opts) && !opts.forceRefresh) {\n\t\t\t\t\t\tconst headers = policy.responseHeaders();\n\t\t\t\t\t\tconst response = new Response(cacheEntry.statusCode, headers, cacheEntry.body, cacheEntry.url);\n\t\t\t\t\t\tresponse.cachePolicy = policy;\n\t\t\t\t\t\tresponse.fromCache = true;\n\n\t\t\t\t\t\tee.emit('response', response);\n\t\t\t\t\t\tif (typeof cb === 'function') {\n\t\t\t\t\t\t\tcb(response);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\trevalidate = cacheEntry;\n\t\t\t\t\t\topts.headers = policy.revalidationHeaders(opts);\n\t\t\t\t\t\tmakeRequest(opts);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst errorHandler = error => ee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\tthis.cache.once('error', errorHandler);\n\t\t\t\tee.on('response', () => this.cache.removeListener('error', errorHandler));\n\n\t\t\t\ttry {\n\t\t\t\t\tawait get(opts);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (opts.automaticFailover && !madeRequest) {\n\t\t\t\t\t\tmakeRequest(opts);\n\t\t\t\t\t}\n\n\t\t\t\t\tee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\treturn ee;\n\t\t};\n\t}\n}\n\nfunction urlObjectToRequestOptions(url) {\n\tconst options = { ...url };\n\toptions.path = `${url.pathname || '/'}${url.search || ''}`;\n\tdelete options.pathname;\n\tdelete options.search;\n\treturn options;\n}\n\nfunction normalizeUrlObject(url) {\n\t// If url was parsed by url.parse or new URL:\n\t// - hostname will be set\n\t// - host will be hostname[:port]\n\t// - port will be set if it was explicit in the parsed string\n\t// Otherwise, url was from request options:\n\t// - hostname or host may be set\n\t// - host shall not have port encoded\n\treturn {\n\t\tprotocol: url.protocol,\n\t\tauth: url.auth,\n\t\thostname: url.hostname || url.host || 'localhost',\n\t\tport: url.port,\n\t\tpathname: url.pathname,\n\t\tsearch: url.search\n\t};\n}\n\nCacheableRequest.RequestError = class extends Error {\n\tconstructor(error) {\n\t\tsuper(error.message);\n\t\tthis.name = 'RequestError';\n\t\tObject.assign(this, error);\n\t}\n};\n\nCacheableRequest.CacheError = class extends Error {\n\tconstructor(error) {\n\t\tsuper(error.message);\n\t\tthis.name = 'CacheError';\n\t\tObject.assign(this, error);\n\t}\n};\n\nmodule.exports = CacheableRequest;\n","'use strict';\n\nconst PassThrough = require('stream').PassThrough;\nconst mimicResponse = require('mimic-response');\n\nconst cloneResponse = response => {\n\tif (!(response && response.pipe)) {\n\t\tthrow new TypeError('Parameter `response` must be a response stream.');\n\t}\n\n\tconst clone = new PassThrough();\n\tmimicResponse(response, clone);\n\n\treturn response.pipe(clone);\n};\n\nmodule.exports = cloneResponse;\n","'use strict';\nconst {Transform, PassThrough} = require('stream');\nconst zlib = require('zlib');\nconst mimicResponse = require('mimic-response');\n\nmodule.exports = response => {\n\tconst contentEncoding = (response.headers['content-encoding'] || '').toLowerCase();\n\n\tif (!['gzip', 'deflate', 'br'].includes(contentEncoding)) {\n\t\treturn response;\n\t}\n\n\t// TODO: Remove this when targeting Node.js 12.\n\tconst isBrotli = contentEncoding === 'br';\n\tif (isBrotli && typeof zlib.createBrotliDecompress !== 'function') {\n\t\tresponse.destroy(new Error('Brotli is not supported on Node.js < 12'));\n\t\treturn response;\n\t}\n\n\tlet isEmpty = true;\n\n\tconst checker = new Transform({\n\t\ttransform(data, _encoding, callback) {\n\t\t\tisEmpty = false;\n\n\t\t\tcallback(null, data);\n\t\t},\n\n\t\tflush(callback) {\n\t\t\tcallback();\n\t\t}\n\t});\n\n\tconst finalStream = new PassThrough({\n\t\tautoDestroy: false,\n\t\tdestroy(error, callback) {\n\t\t\tresponse.destroy();\n\n\t\t\tcallback(error);\n\t\t}\n\t});\n\n\tconst decompressStream = isBrotli ? zlib.createBrotliDecompress() : zlib.createUnzip();\n\n\tdecompressStream.once('error', error => {\n\t\tif (isEmpty && !response.readable) {\n\t\t\tfinalStream.end();\n\t\t\treturn;\n\t\t}\n\n\t\tfinalStream.destroy(error);\n\t});\n\n\tmimicResponse(response, finalStream);\n\tresponse.pipe(checker).pipe(decompressStream).pipe(finalStream);\n\n\treturn finalStream;\n};\n","'use strict';\n\n// We define these manually to ensure they're always copied\n// even if they would move up the prototype chain\n// https://nodejs.org/api/http.html#http_class_http_incomingmessage\nconst knownProperties = [\n\t'aborted',\n\t'complete',\n\t'headers',\n\t'httpVersion',\n\t'httpVersionMinor',\n\t'httpVersionMajor',\n\t'method',\n\t'rawHeaders',\n\t'rawTrailers',\n\t'setTimeout',\n\t'socket',\n\t'statusCode',\n\t'statusMessage',\n\t'trailers',\n\t'url'\n];\n\nmodule.exports = (fromStream, toStream) => {\n\tif (toStream._readableState.autoDestroy) {\n\t\tthrow new Error('The second stream must have the `autoDestroy` option set to `false`');\n\t}\n\n\tconst fromProperties = new Set(Object.keys(fromStream).concat(knownProperties));\n\n\tconst properties = {};\n\n\tfor (const property of fromProperties) {\n\t\t// Don't overwrite existing properties.\n\t\tif (property in toStream) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tproperties[property] = {\n\t\t\tget() {\n\t\t\t\tconst value = fromStream[property];\n\t\t\t\tconst isFunction = typeof value === 'function';\n\n\t\t\t\treturn isFunction ? value.bind(fromStream) : value;\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tfromStream[property] = value;\n\t\t\t},\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false\n\t\t};\n\t}\n\n\tObject.defineProperties(toStream, properties);\n\n\tfromStream.once('aborted', () => {\n\t\ttoStream.destroy();\n\n\t\ttoStream.emit('aborted');\n\t});\n\n\tfromStream.once('close', () => {\n\t\tif (fromStream.complete) {\n\t\t\tif (toStream.readable) {\n\t\t\t\ttoStream.once('end', () => {\n\t\t\t\t\ttoStream.emit('close');\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\ttoStream.emit('close');\n\t\t\t}\n\t\t} else {\n\t\t\ttoStream.emit('close');\n\t\t}\n\t});\n\n\treturn toStream;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tls_1 = require(\"tls\");\nconst deferToConnect = (socket, fn) => {\n let listeners;\n if (typeof fn === 'function') {\n const connect = fn;\n listeners = { connect };\n }\n else {\n listeners = fn;\n }\n const hasConnectListener = typeof listeners.connect === 'function';\n const hasSecureConnectListener = typeof listeners.secureConnect === 'function';\n const hasCloseListener = typeof listeners.close === 'function';\n const onConnect = () => {\n if (hasConnectListener) {\n listeners.connect();\n }\n if (socket instanceof tls_1.TLSSocket && hasSecureConnectListener) {\n if (socket.authorized) {\n listeners.secureConnect();\n }\n else if (!socket.authorizationError) {\n socket.once('secureConnect', listeners.secureConnect);\n }\n }\n if (hasCloseListener) {\n socket.once('close', listeners.close);\n }\n };\n if (socket.writable && !socket.connecting) {\n onConnect();\n }\n else if (socket.connecting) {\n socket.once('connect', onConnect);\n }\n else if (socket.destroyed && hasCloseListener) {\n listeners.close(socket._hadError);\n }\n};\nexports.default = deferToConnect;\n// For CommonJS default export support\nmodule.exports = deferToConnect;\nmodule.exports.default = deferToConnect;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nclass Deprecation extends Error {\n constructor(message) {\n super(message); // Maintains proper stack trace (only available on V8)\n\n /* istanbul ignore next */\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n\n this.name = 'Deprecation';\n }\n\n}\n\nexports.Deprecation = Deprecation;\n","var once = require('once');\n\nvar noop = function() {};\n\nvar isRequest = function(stream) {\n\treturn stream.setHeader && typeof stream.abort === 'function';\n};\n\nvar isChildProcess = function(stream) {\n\treturn stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3\n};\n\nvar eos = function(stream, opts, callback) {\n\tif (typeof opts === 'function') return eos(stream, null, opts);\n\tif (!opts) opts = {};\n\n\tcallback = once(callback || noop);\n\n\tvar ws = stream._writableState;\n\tvar rs = stream._readableState;\n\tvar readable = opts.readable || (opts.readable !== false && stream.readable);\n\tvar writable = opts.writable || (opts.writable !== false && stream.writable);\n\tvar cancelled = false;\n\n\tvar onlegacyfinish = function() {\n\t\tif (!stream.writable) onfinish();\n\t};\n\n\tvar onfinish = function() {\n\t\twritable = false;\n\t\tif (!readable) callback.call(stream);\n\t};\n\n\tvar onend = function() {\n\t\treadable = false;\n\t\tif (!writable) callback.call(stream);\n\t};\n\n\tvar onexit = function(exitCode) {\n\t\tcallback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);\n\t};\n\n\tvar onerror = function(err) {\n\t\tcallback.call(stream, err);\n\t};\n\n\tvar onclose = function() {\n\t\tprocess.nextTick(onclosenexttick);\n\t};\n\n\tvar onclosenexttick = function() {\n\t\tif (cancelled) return;\n\t\tif (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close'));\n\t\tif (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close'));\n\t};\n\n\tvar onrequest = function() {\n\t\tstream.req.on('finish', onfinish);\n\t};\n\n\tif (isRequest(stream)) {\n\t\tstream.on('complete', onfinish);\n\t\tstream.on('abort', onclose);\n\t\tif (stream.req) onrequest();\n\t\telse stream.on('request', onrequest);\n\t} else if (writable && !ws) { // legacy streams\n\t\tstream.on('end', onlegacyfinish);\n\t\tstream.on('close', onlegacyfinish);\n\t}\n\n\tif (isChildProcess(stream)) stream.on('exit', onexit);\n\n\tstream.on('end', onend);\n\tstream.on('finish', onfinish);\n\tif (opts.error !== false) stream.on('error', onerror);\n\tstream.on('close', onclose);\n\n\treturn function() {\n\t\tcancelled = true;\n\t\tstream.removeListener('complete', onfinish);\n\t\tstream.removeListener('abort', onclose);\n\t\tstream.removeListener('request', onrequest);\n\t\tif (stream.req) stream.req.removeListener('finish', onfinish);\n\t\tstream.removeListener('end', onlegacyfinish);\n\t\tstream.removeListener('close', onlegacyfinish);\n\t\tstream.removeListener('finish', onfinish);\n\t\tstream.removeListener('exit', onexit);\n\t\tstream.removeListener('end', onend);\n\t\tstream.removeListener('error', onerror);\n\t\tstream.removeListener('close', onclose);\n\t};\n};\n\nmodule.exports = eos;\n","'use strict';\n\nconst stringify = require('./lib/stringify');\nconst compile = require('./lib/compile');\nconst expand = require('./lib/expand');\nconst parse = require('./lib/parse');\n\n/**\n * Expand the given pattern or create a regex-compatible string.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)']\n * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c']\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {String}\n * @api public\n */\n\nconst braces = (input, options = {}) => {\n let output = [];\n\n if (Array.isArray(input)) {\n for (let pattern of input) {\n let result = braces.create(pattern, options);\n if (Array.isArray(result)) {\n output.push(...result);\n } else {\n output.push(result);\n }\n }\n } else {\n output = [].concat(braces.create(input, options));\n }\n\n if (options && options.expand === true && options.nodupes === true) {\n output = [...new Set(output)];\n }\n return output;\n};\n\n/**\n * Parse the given `str` with the given `options`.\n *\n * ```js\n * // braces.parse(pattern, [, options]);\n * const ast = braces.parse('a/{b,c}/d');\n * console.log(ast);\n * ```\n * @param {String} pattern Brace pattern to parse\n * @param {Object} options\n * @return {Object} Returns an AST\n * @api public\n */\n\nbraces.parse = (input, options = {}) => parse(input, options);\n\n/**\n * Creates a braces string from an AST, or an AST node.\n *\n * ```js\n * const braces = require('braces');\n * let ast = braces.parse('foo/{a,b}/bar');\n * console.log(stringify(ast.nodes[2])); //=> '{a,b}'\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.stringify = (input, options = {}) => {\n if (typeof input === 'string') {\n return stringify(braces.parse(input, options), options);\n }\n return stringify(input, options);\n};\n\n/**\n * Compiles a brace pattern into a regex-compatible, optimized string.\n * This method is called by the main [braces](#braces) function by default.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.compile('a/{b,c}/d'));\n * //=> ['a/(b|c)/d']\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.compile = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n return compile(input, options);\n};\n\n/**\n * Expands a brace pattern into an array. This method is called by the\n * main [braces](#braces) function when `options.expand` is true. Before\n * using this method it's recommended that you read the [performance notes](#performance))\n * and advantages of using [.compile](#compile) instead.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.expand('a/{b,c}/d'));\n * //=> ['a/b/d', 'a/c/d'];\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.expand = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n\n let result = expand(input, options);\n\n // filter out empty strings if specified\n if (options.noempty === true) {\n result = result.filter(Boolean);\n }\n\n // filter out duplicates if specified\n if (options.nodupes === true) {\n result = [...new Set(result)];\n }\n\n return result;\n};\n\n/**\n * Processes a brace pattern and returns either an expanded array\n * (if `options.expand` is true), a highly optimized regex-compatible string.\n * This method is called by the main [braces](#braces) function.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}'))\n * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)'\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.create = (input, options = {}) => {\n if (input === '' || input.length < 3) {\n return [input];\n }\n\n return options.expand !== true\n ? braces.compile(input, options)\n : braces.expand(input, options);\n};\n\n/**\n * Expose \"braces\"\n */\n\nmodule.exports = braces;\n","'use strict';\n\nconst fill = require('fill-range');\nconst utils = require('./utils');\n\nconst compile = (ast, options = {}) => {\n let walk = (node, parent = {}) => {\n let invalidBlock = utils.isInvalidBrace(parent);\n let invalidNode = node.invalid === true && options.escapeInvalid === true;\n let invalid = invalidBlock === true || invalidNode === true;\n let prefix = options.escapeInvalid === true ? '\\\\' : '';\n let output = '';\n\n if (node.isOpen === true) {\n return prefix + node.value;\n }\n if (node.isClose === true) {\n return prefix + node.value;\n }\n\n if (node.type === 'open') {\n return invalid ? (prefix + node.value) : '(';\n }\n\n if (node.type === 'close') {\n return invalid ? (prefix + node.value) : ')';\n }\n\n if (node.type === 'comma') {\n return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|');\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes && node.ranges > 0) {\n let args = utils.reduce(node.nodes);\n let range = fill(...args, { ...options, wrap: false, toRegex: true });\n\n if (range.length !== 0) {\n return args.length > 1 && range.length > 1 ? `(${range})` : range;\n }\n }\n\n if (node.nodes) {\n for (let child of node.nodes) {\n output += walk(child, node);\n }\n }\n return output;\n };\n\n return walk(ast);\n};\n\nmodule.exports = compile;\n","'use strict';\n\nmodule.exports = {\n MAX_LENGTH: 1024 * 64,\n\n // Digits\n CHAR_0: '0', /* 0 */\n CHAR_9: '9', /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 'A', /* A */\n CHAR_LOWERCASE_A: 'a', /* a */\n CHAR_UPPERCASE_Z: 'Z', /* Z */\n CHAR_LOWERCASE_Z: 'z', /* z */\n\n CHAR_LEFT_PARENTHESES: '(', /* ( */\n CHAR_RIGHT_PARENTHESES: ')', /* ) */\n\n CHAR_ASTERISK: '*', /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: '&', /* & */\n CHAR_AT: '@', /* @ */\n CHAR_BACKSLASH: '\\\\', /* \\ */\n CHAR_BACKTICK: '`', /* ` */\n CHAR_CARRIAGE_RETURN: '\\r', /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */\n CHAR_COLON: ':', /* : */\n CHAR_COMMA: ',', /* , */\n CHAR_DOLLAR: '$', /* . */\n CHAR_DOT: '.', /* . */\n CHAR_DOUBLE_QUOTE: '\"', /* \" */\n CHAR_EQUAL: '=', /* = */\n CHAR_EXCLAMATION_MARK: '!', /* ! */\n CHAR_FORM_FEED: '\\f', /* \\f */\n CHAR_FORWARD_SLASH: '/', /* / */\n CHAR_HASH: '#', /* # */\n CHAR_HYPHEN_MINUS: '-', /* - */\n CHAR_LEFT_ANGLE_BRACKET: '<', /* < */\n CHAR_LEFT_CURLY_BRACE: '{', /* { */\n CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */\n CHAR_LINE_FEED: '\\n', /* \\n */\n CHAR_NO_BREAK_SPACE: '\\u00A0', /* \\u00A0 */\n CHAR_PERCENT: '%', /* % */\n CHAR_PLUS: '+', /* + */\n CHAR_QUESTION_MARK: '?', /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */\n CHAR_RIGHT_CURLY_BRACE: '}', /* } */\n CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */\n CHAR_SEMICOLON: ';', /* ; */\n CHAR_SINGLE_QUOTE: '\\'', /* ' */\n CHAR_SPACE: ' ', /* */\n CHAR_TAB: '\\t', /* \\t */\n CHAR_UNDERSCORE: '_', /* _ */\n CHAR_VERTICAL_LINE: '|', /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\\uFEFF' /* \\uFEFF */\n};\n","'use strict';\n\nconst fill = require('fill-range');\nconst stringify = require('./stringify');\nconst utils = require('./utils');\n\nconst append = (queue = '', stash = '', enclose = false) => {\n let result = [];\n\n queue = [].concat(queue);\n stash = [].concat(stash);\n\n if (!stash.length) return queue;\n if (!queue.length) {\n return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash;\n }\n\n for (let item of queue) {\n if (Array.isArray(item)) {\n for (let value of item) {\n result.push(append(value, stash, enclose));\n }\n } else {\n for (let ele of stash) {\n if (enclose === true && typeof ele === 'string') ele = `{${ele}}`;\n result.push(Array.isArray(ele) ? append(item, ele, enclose) : (item + ele));\n }\n }\n }\n return utils.flatten(result);\n};\n\nconst expand = (ast, options = {}) => {\n let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit;\n\n let walk = (node, parent = {}) => {\n node.queue = [];\n\n let p = parent;\n let q = parent.queue;\n\n while (p.type !== 'brace' && p.type !== 'root' && p.parent) {\n p = p.parent;\n q = p.queue;\n }\n\n if (node.invalid || node.dollar) {\n q.push(append(q.pop(), stringify(node, options)));\n return;\n }\n\n if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) {\n q.push(append(q.pop(), ['{}']));\n return;\n }\n\n if (node.nodes && node.ranges > 0) {\n let args = utils.reduce(node.nodes);\n\n if (utils.exceedsLimit(...args, options.step, rangeLimit)) {\n throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');\n }\n\n let range = fill(...args, options);\n if (range.length === 0) {\n range = stringify(node, options);\n }\n\n q.push(append(q.pop(), range));\n node.nodes = [];\n return;\n }\n\n let enclose = utils.encloseBrace(node);\n let queue = node.queue;\n let block = node;\n\n while (block.type !== 'brace' && block.type !== 'root' && block.parent) {\n block = block.parent;\n queue = block.queue;\n }\n\n for (let i = 0; i < node.nodes.length; i++) {\n let child = node.nodes[i];\n\n if (child.type === 'comma' && node.type === 'brace') {\n if (i === 1) queue.push('');\n queue.push('');\n continue;\n }\n\n if (child.type === 'close') {\n q.push(append(q.pop(), queue, enclose));\n continue;\n }\n\n if (child.value && child.type !== 'open') {\n queue.push(append(queue.pop(), child.value));\n continue;\n }\n\n if (child.nodes) {\n walk(child, node);\n }\n }\n\n return queue;\n };\n\n return utils.flatten(walk(ast));\n};\n\nmodule.exports = expand;\n","'use strict';\n\nconst stringify = require('./stringify');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n CHAR_BACKSLASH, /* \\ */\n CHAR_BACKTICK, /* ` */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_RIGHT_SQUARE_BRACKET, /* ] */\n CHAR_DOUBLE_QUOTE, /* \" */\n CHAR_SINGLE_QUOTE, /* ' */\n CHAR_NO_BREAK_SPACE,\n CHAR_ZERO_WIDTH_NOBREAK_SPACE\n} = require('./constants');\n\n/**\n * parse\n */\n\nconst parse = (input, options = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n let opts = options || {};\n let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n if (input.length > max) {\n throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`);\n }\n\n let ast = { type: 'root', input, nodes: [] };\n let stack = [ast];\n let block = ast;\n let prev = ast;\n let brackets = 0;\n let length = input.length;\n let index = 0;\n let depth = 0;\n let value;\n let memo = {};\n\n /**\n * Helpers\n */\n\n const advance = () => input[index++];\n const push = node => {\n if (node.type === 'text' && prev.type === 'dot') {\n prev.type = 'text';\n }\n\n if (prev && prev.type === 'text' && node.type === 'text') {\n prev.value += node.value;\n return;\n }\n\n block.nodes.push(node);\n node.parent = block;\n node.prev = prev;\n prev = node;\n return node;\n };\n\n push({ type: 'bos' });\n\n while (index < length) {\n block = stack[stack.length - 1];\n value = advance();\n\n /**\n * Invalid chars\n */\n\n if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) {\n continue;\n }\n\n /**\n * Escaped chars\n */\n\n if (value === CHAR_BACKSLASH) {\n push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() });\n continue;\n }\n\n /**\n * Right square bracket (literal): ']'\n */\n\n if (value === CHAR_RIGHT_SQUARE_BRACKET) {\n push({ type: 'text', value: '\\\\' + value });\n continue;\n }\n\n /**\n * Left square bracket: '['\n */\n\n if (value === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n\n let closed = true;\n let next;\n\n while (index < length && (next = advance())) {\n value += next;\n\n if (next === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n continue;\n }\n\n if (next === CHAR_BACKSLASH) {\n value += advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n brackets--;\n\n if (brackets === 0) {\n break;\n }\n }\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === CHAR_LEFT_PARENTHESES) {\n block = push({ type: 'paren', nodes: [] });\n stack.push(block);\n push({ type: 'text', value });\n continue;\n }\n\n if (value === CHAR_RIGHT_PARENTHESES) {\n if (block.type !== 'paren') {\n push({ type: 'text', value });\n continue;\n }\n block = stack.pop();\n push({ type: 'text', value });\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Quotes: '|\"|`\n */\n\n if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) {\n let open = value;\n let next;\n\n if (options.keepQuotes !== true) {\n value = '';\n }\n\n while (index < length && (next = advance())) {\n if (next === CHAR_BACKSLASH) {\n value += next + advance();\n continue;\n }\n\n if (next === open) {\n if (options.keepQuotes === true) value += next;\n break;\n }\n\n value += next;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Left curly brace: '{'\n */\n\n if (value === CHAR_LEFT_CURLY_BRACE) {\n depth++;\n\n let dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true;\n let brace = {\n type: 'brace',\n open: true,\n close: false,\n dollar,\n depth,\n commas: 0,\n ranges: 0,\n nodes: []\n };\n\n block = push(brace);\n stack.push(block);\n push({ type: 'open', value });\n continue;\n }\n\n /**\n * Right curly brace: '}'\n */\n\n if (value === CHAR_RIGHT_CURLY_BRACE) {\n if (block.type !== 'brace') {\n push({ type: 'text', value });\n continue;\n }\n\n let type = 'close';\n block = stack.pop();\n block.close = true;\n\n push({ type, value });\n depth--;\n\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Comma: ','\n */\n\n if (value === CHAR_COMMA && depth > 0) {\n if (block.ranges > 0) {\n block.ranges = 0;\n let open = block.nodes.shift();\n block.nodes = [open, { type: 'text', value: stringify(block) }];\n }\n\n push({ type: 'comma', value });\n block.commas++;\n continue;\n }\n\n /**\n * Dot: '.'\n */\n\n if (value === CHAR_DOT && depth > 0 && block.commas === 0) {\n let siblings = block.nodes;\n\n if (depth === 0 || siblings.length === 0) {\n push({ type: 'text', value });\n continue;\n }\n\n if (prev.type === 'dot') {\n block.range = [];\n prev.value += value;\n prev.type = 'range';\n\n if (block.nodes.length !== 3 && block.nodes.length !== 5) {\n block.invalid = true;\n block.ranges = 0;\n prev.type = 'text';\n continue;\n }\n\n block.ranges++;\n block.args = [];\n continue;\n }\n\n if (prev.type === 'range') {\n siblings.pop();\n\n let before = siblings[siblings.length - 1];\n before.value += prev.value + value;\n prev = before;\n block.ranges--;\n continue;\n }\n\n push({ type: 'dot', value });\n continue;\n }\n\n /**\n * Text\n */\n\n push({ type: 'text', value });\n }\n\n // Mark imbalanced braces and brackets as invalid\n do {\n block = stack.pop();\n\n if (block.type !== 'root') {\n block.nodes.forEach(node => {\n if (!node.nodes) {\n if (node.type === 'open') node.isOpen = true;\n if (node.type === 'close') node.isClose = true;\n if (!node.nodes) node.type = 'text';\n node.invalid = true;\n }\n });\n\n // get the location of the block on parent.nodes (block's siblings)\n let parent = stack[stack.length - 1];\n let index = parent.nodes.indexOf(block);\n // replace the (invalid) block with it's nodes\n parent.nodes.splice(index, 1, ...block.nodes);\n }\n } while (stack.length > 0);\n\n push({ type: 'eos' });\n return ast;\n};\n\nmodule.exports = parse;\n","'use strict';\n\nconst utils = require('./utils');\n\nmodule.exports = (ast, options = {}) => {\n let stringify = (node, parent = {}) => {\n let invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent);\n let invalidNode = node.invalid === true && options.escapeInvalid === true;\n let output = '';\n\n if (node.value) {\n if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) {\n return '\\\\' + node.value;\n }\n return node.value;\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes) {\n for (let child of node.nodes) {\n output += stringify(child);\n }\n }\n return output;\n };\n\n return stringify(ast);\n};\n\n","'use strict';\n\nexports.isInteger = num => {\n if (typeof num === 'number') {\n return Number.isInteger(num);\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isInteger(Number(num));\n }\n return false;\n};\n\n/**\n * Find a node of the given type\n */\n\nexports.find = (node, type) => node.nodes.find(node => node.type === type);\n\n/**\n * Find a node of the given type\n */\n\nexports.exceedsLimit = (min, max, step = 1, limit) => {\n if (limit === false) return false;\n if (!exports.isInteger(min) || !exports.isInteger(max)) return false;\n return ((Number(max) - Number(min)) / Number(step)) >= limit;\n};\n\n/**\n * Escape the given node with '\\\\' before node.value\n */\n\nexports.escapeNode = (block, n = 0, type) => {\n let node = block.nodes[n];\n if (!node) return;\n\n if ((type && node.type === type) || node.type === 'open' || node.type === 'close') {\n if (node.escaped !== true) {\n node.value = '\\\\' + node.value;\n node.escaped = true;\n }\n }\n};\n\n/**\n * Returns true if the given brace node should be enclosed in literal braces\n */\n\nexports.encloseBrace = node => {\n if (node.type !== 'brace') return false;\n if ((node.commas >> 0 + node.ranges >> 0) === 0) {\n node.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a brace node is invalid.\n */\n\nexports.isInvalidBrace = block => {\n if (block.type !== 'brace') return false;\n if (block.invalid === true || block.dollar) return true;\n if ((block.commas >> 0 + block.ranges >> 0) === 0) {\n block.invalid = true;\n return true;\n }\n if (block.open !== true || block.close !== true) {\n block.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a node is an open or close node\n */\n\nexports.isOpenOrClose = node => {\n if (node.type === 'open' || node.type === 'close') {\n return true;\n }\n return node.open === true || node.close === true;\n};\n\n/**\n * Reduce an array of text nodes.\n */\n\nexports.reduce = nodes => nodes.reduce((acc, node) => {\n if (node.type === 'text') acc.push(node.value);\n if (node.type === 'range') node.type = 'text';\n return acc;\n}, []);\n\n/**\n * Flatten an array\n */\n\nexports.flatten = (...args) => {\n const result = [];\n const flat = arr => {\n for (let i = 0; i < arr.length; i++) {\n let ele = arr[i];\n Array.isArray(ele) ? flat(ele, result) : ele !== void 0 && result.push(ele);\n }\n return result;\n };\n flat(args);\n return result;\n};\n","/*!\n * fill-range \n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nconst util = require('util');\nconst toRegexRange = require('to-regex-range');\n\nconst isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\n\nconst transform = toNumber => {\n return value => toNumber === true ? Number(value) : String(value);\n};\n\nconst isValidValue = value => {\n return typeof value === 'number' || (typeof value === 'string' && value !== '');\n};\n\nconst isNumber = num => Number.isInteger(+num);\n\nconst zeros = input => {\n let value = `${input}`;\n let index = -1;\n if (value[0] === '-') value = value.slice(1);\n if (value === '0') return false;\n while (value[++index] === '0');\n return index > 0;\n};\n\nconst stringify = (start, end, options) => {\n if (typeof start === 'string' || typeof end === 'string') {\n return true;\n }\n return options.stringify === true;\n};\n\nconst pad = (input, maxLength, toNumber) => {\n if (maxLength > 0) {\n let dash = input[0] === '-' ? '-' : '';\n if (dash) input = input.slice(1);\n input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0'));\n }\n if (toNumber === false) {\n return String(input);\n }\n return input;\n};\n\nconst toMaxLen = (input, maxLength) => {\n let negative = input[0] === '-' ? '-' : '';\n if (negative) {\n input = input.slice(1);\n maxLength--;\n }\n while (input.length < maxLength) input = '0' + input;\n return negative ? ('-' + input) : input;\n};\n\nconst toSequence = (parts, options) => {\n parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n\n let prefix = options.capture ? '' : '?:';\n let positives = '';\n let negatives = '';\n let result;\n\n if (parts.positives.length) {\n positives = parts.positives.join('|');\n }\n\n if (parts.negatives.length) {\n negatives = `-(${prefix}${parts.negatives.join('|')})`;\n }\n\n if (positives && negatives) {\n result = `${positives}|${negatives}`;\n } else {\n result = positives || negatives;\n }\n\n if (options.wrap) {\n return `(${prefix}${result})`;\n }\n\n return result;\n};\n\nconst toRange = (a, b, isNumbers, options) => {\n if (isNumbers) {\n return toRegexRange(a, b, { wrap: false, ...options });\n }\n\n let start = String.fromCharCode(a);\n if (a === b) return start;\n\n let stop = String.fromCharCode(b);\n return `[${start}-${stop}]`;\n};\n\nconst toRegex = (start, end, options) => {\n if (Array.isArray(start)) {\n let wrap = options.wrap === true;\n let prefix = options.capture ? '' : '?:';\n return wrap ? `(${prefix}${start.join('|')})` : start.join('|');\n }\n return toRegexRange(start, end, options);\n};\n\nconst rangeError = (...args) => {\n return new RangeError('Invalid range arguments: ' + util.inspect(...args));\n};\n\nconst invalidRange = (start, end, options) => {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n};\n\nconst invalidStep = (step, options) => {\n if (options.strictRanges === true) {\n throw new TypeError(`Expected step \"${step}\" to be a number`);\n }\n return [];\n};\n\nconst fillNumbers = (start, end, step = 1, options = {}) => {\n let a = Number(start);\n let b = Number(end);\n\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n }\n\n // fix negative zero\n if (a === 0) a = 0;\n if (b === 0) b = 0;\n\n let descending = a > b;\n let startString = String(start);\n let endString = String(end);\n let stepString = String(step);\n step = Math.max(Math.abs(step), 1);\n\n let padded = zeros(startString) || zeros(endString) || zeros(stepString);\n let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0;\n let toNumber = padded === false && stringify(start, end, options) === false;\n let format = options.transform || transform(toNumber);\n\n if (options.toRegex && step === 1) {\n return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options);\n }\n\n let parts = { negatives: [], positives: [] };\n let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num));\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n if (options.toRegex === true && step > 1) {\n push(a);\n } else {\n range.push(pad(format(a, index), maxLen, toNumber));\n }\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return step > 1\n ? toSequence(parts, options)\n : toRegex(range, null, { wrap: false, ...options });\n }\n\n return range;\n};\n\nconst fillLetters = (start, end, step = 1, options = {}) => {\n if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) {\n return invalidRange(start, end, options);\n }\n\n\n let format = options.transform || (val => String.fromCharCode(val));\n let a = `${start}`.charCodeAt(0);\n let b = `${end}`.charCodeAt(0);\n\n let descending = a > b;\n let min = Math.min(a, b);\n let max = Math.max(a, b);\n\n if (options.toRegex && step === 1) {\n return toRange(min, max, false, options);\n }\n\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n range.push(format(a, index));\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return toRegex(range, null, { wrap: false, options });\n }\n\n return range;\n};\n\nconst fill = (start, end, step, options = {}) => {\n if (end == null && isValidValue(start)) {\n return [start];\n }\n\n if (!isValidValue(start) || !isValidValue(end)) {\n return invalidRange(start, end, options);\n }\n\n if (typeof step === 'function') {\n return fill(start, end, 1, { transform: step });\n }\n\n if (isObject(step)) {\n return fill(start, end, 0, step);\n }\n\n let opts = { ...options };\n if (opts.capture === true) opts.wrap = true;\n step = step || opts.step || 1;\n\n if (!isNumber(step)) {\n if (step != null && !isObject(step)) return invalidStep(step, opts);\n return fill(start, end, 1, step);\n }\n\n if (isNumber(start) && isNumber(end)) {\n return fillNumbers(start, end, step, opts);\n }\n\n return fillLetters(start, end, Math.max(Math.abs(step), 1), opts);\n};\n\nmodule.exports = fill;\n","/*!\n * is-number \n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function(num) {\n if (typeof num === 'number') {\n return num - num === 0;\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);\n }\n return false;\n};\n","'use strict';\n\nconst util = require('util');\nconst braces = require('braces');\nconst picomatch = require('picomatch');\nconst utils = require('picomatch/lib/utils');\nconst isEmptyString = val => typeof val === 'string' && (val === '' || val === './');\n\n/**\n * Returns an array of strings that match one or more glob patterns.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm(list, patterns[, options]);\n *\n * console.log(mm(['a.js', 'a.txt'], ['*.js']));\n * //=> [ 'a.js' ]\n * ```\n * @param {String|Array} list List of strings to match.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} options See available [options](#options)\n * @return {Array} Returns an array of matches\n * @summary false\n * @api public\n */\n\nconst micromatch = (list, patterns, options) => {\n patterns = [].concat(patterns);\n list = [].concat(list);\n\n let omit = new Set();\n let keep = new Set();\n let items = new Set();\n let negatives = 0;\n\n let onResult = state => {\n items.add(state.output);\n if (options && options.onResult) {\n options.onResult(state);\n }\n };\n\n for (let i = 0; i < patterns.length; i++) {\n let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true);\n let negated = isMatch.state.negated || isMatch.state.negatedExtglob;\n if (negated) negatives++;\n\n for (let item of list) {\n let matched = isMatch(item, true);\n\n let match = negated ? !matched.isMatch : matched.isMatch;\n if (!match) continue;\n\n if (negated) {\n omit.add(matched.output);\n } else {\n omit.delete(matched.output);\n keep.add(matched.output);\n }\n }\n }\n\n let result = negatives === patterns.length ? [...items] : [...keep];\n let matches = result.filter(item => !omit.has(item));\n\n if (options && matches.length === 0) {\n if (options.failglob === true) {\n throw new Error(`No matches found for \"${patterns.join(', ')}\"`);\n }\n\n if (options.nonull === true || options.nullglob === true) {\n return options.unescape ? patterns.map(p => p.replace(/\\\\/g, '')) : patterns;\n }\n }\n\n return matches;\n};\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.match = micromatch;\n\n/**\n * Returns a matcher function from the given glob `pattern` and `options`.\n * The returned function takes a string to match as its only argument and returns\n * true if the string is a match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matcher(pattern[, options]);\n *\n * const isMatch = mm.matcher('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @param {String} `pattern` Glob pattern\n * @param {Object} `options`\n * @return {Function} Returns a matcher function.\n * @api public\n */\n\nmicromatch.matcher = (pattern, options) => picomatch(pattern, options);\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.isMatch(string, patterns[, options]);\n *\n * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(mm.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.any = micromatch.isMatch;\n\n/**\n * Returns a list of strings that _**do not match any**_ of the given `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.not(list, patterns[, options]);\n *\n * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a'));\n * //=> ['b.b', 'c.c']\n * ```\n * @param {Array} `list` Array of strings to match.\n * @param {String|Array} `patterns` One or more glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of strings that **do not match** the given patterns.\n * @api public\n */\n\nmicromatch.not = (list, patterns, options = {}) => {\n patterns = [].concat(patterns).map(String);\n let result = new Set();\n let items = [];\n\n let onResult = state => {\n if (options.onResult) options.onResult(state);\n items.push(state.output);\n };\n\n let matches = micromatch(list, patterns, { ...options, onResult });\n\n for (let item of items) {\n if (!matches.includes(item)) {\n result.add(item);\n }\n }\n return [...result];\n};\n\n/**\n * Returns true if the given `string` contains the given pattern. Similar\n * to [.isMatch](#isMatch) but the pattern can match any part of the string.\n *\n * ```js\n * var mm = require('micromatch');\n * // mm.contains(string, pattern[, options]);\n *\n * console.log(mm.contains('aa/bb/cc', '*b'));\n * //=> true\n * console.log(mm.contains('aa/bb/cc', '*d'));\n * //=> false\n * ```\n * @param {String} `str` The string to match.\n * @param {String|Array} `patterns` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if the patter matches any part of `str`.\n * @api public\n */\n\nmicromatch.contains = (str, pattern, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n if (Array.isArray(pattern)) {\n return pattern.some(p => micromatch.contains(str, p, options));\n }\n\n if (typeof pattern === 'string') {\n if (isEmptyString(str) || isEmptyString(pattern)) {\n return false;\n }\n\n if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) {\n return true;\n }\n }\n\n return micromatch.isMatch(str, pattern, { ...options, contains: true });\n};\n\n/**\n * Filter the keys of the given object with the given `glob` pattern\n * and `options`. Does not attempt to match nested keys. If you need this feature,\n * use [glob-object][] instead.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matchKeys(object, patterns[, options]);\n *\n * const obj = { aa: 'a', ab: 'b', ac: 'c' };\n * console.log(mm.matchKeys(obj, '*b'));\n * //=> { ab: 'b' }\n * ```\n * @param {Object} `object` The object with keys to filter.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Object} Returns an object with only keys that match the given patterns.\n * @api public\n */\n\nmicromatch.matchKeys = (obj, patterns, options) => {\n if (!utils.isObject(obj)) {\n throw new TypeError('Expected the first argument to be an object');\n }\n let keys = micromatch(Object.keys(obj), patterns, options);\n let res = {};\n for (let key of keys) res[key] = obj[key];\n return res;\n};\n\n/**\n * Returns true if some of the strings in the given `list` match any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.some(list, patterns[, options]);\n *\n * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // true\n * console.log(mm.some(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.some = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (items.some(item => isMatch(item))) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Returns true if every string in the given `list` matches\n * any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.every(list, patterns[, options]);\n *\n * console.log(mm.every('foo.js', ['foo.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // false\n * console.log(mm.every(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.every = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (!items.every(item => isMatch(item))) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Returns true if **all** of the given `patterns` match\n * the specified string.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.all(string, patterns[, options]);\n *\n * console.log(mm.all('foo.js', ['foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', '!foo.js']));\n * // false\n *\n * console.log(mm.all('foo.js', ['*.js', 'foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));\n * // true\n * ```\n * @param {String|Array} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.all = (str, patterns, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n return [].concat(patterns).every(p => picomatch(p, options)(str));\n};\n\n/**\n * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.capture(pattern, string[, options]);\n *\n * console.log(mm.capture('test/*.js', 'test/foo.js'));\n * //=> ['foo']\n * console.log(mm.capture('test/*.js', 'foo/bar.css'));\n * //=> null\n * ```\n * @param {String} `glob` Glob pattern to use for matching.\n * @param {String} `input` String to match\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns an array of captures if the input matches the glob pattern, otherwise `null`.\n * @api public\n */\n\nmicromatch.capture = (glob, input, options) => {\n let posix = utils.isWindows(options);\n let regex = picomatch.makeRe(String(glob), { ...options, capture: true });\n let match = regex.exec(posix ? utils.toPosixSlashes(input) : input);\n\n if (match) {\n return match.slice(1).map(v => v === void 0 ? '' : v);\n }\n};\n\n/**\n * Create a regular expression from the given glob `pattern`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.makeRe(pattern[, options]);\n *\n * console.log(mm.makeRe('*.js'));\n * //=> /^(?:(\\.[\\\\\\/])?(?!\\.)(?=.)[^\\/]*?\\.js)$/\n * ```\n * @param {String} `pattern` A glob pattern to convert to regex.\n * @param {Object} `options`\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\nmicromatch.makeRe = (...args) => picomatch.makeRe(...args);\n\n/**\n * Scan a glob pattern to separate the pattern into segments. Used\n * by the [split](#split) method.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.scan(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\nmicromatch.scan = (...args) => picomatch.scan(...args);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm(pattern[, options]);\n * ```\n * @param {String} `glob`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as regex source string.\n * @api public\n */\n\nmicromatch.parse = (patterns, options) => {\n let res = [];\n for (let pattern of [].concat(patterns || [])) {\n for (let str of braces(String(pattern), options)) {\n res.push(picomatch.parse(str, options));\n }\n }\n return res;\n};\n\n/**\n * Process the given brace `pattern`.\n *\n * ```js\n * const { braces } = require('micromatch');\n * console.log(braces('foo/{a,b,c}/bar'));\n * //=> [ 'foo/(a|b|c)/bar' ]\n *\n * console.log(braces('foo/{a,b,c}/bar', { expand: true }));\n * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ]\n * ```\n * @param {String} `pattern` String with brace pattern to process.\n * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options.\n * @return {Array}\n * @api public\n */\n\nmicromatch.braces = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n if ((options && options.nobrace === true) || !/\\{.*\\}/.test(pattern)) {\n return [pattern];\n }\n return braces(pattern, options);\n};\n\n/**\n * Expand braces\n */\n\nmicromatch.braceExpand = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n return micromatch.braces(pattern, { ...options, expand: true });\n};\n\n/**\n * Expose micromatch\n */\n\nmodule.exports = micromatch;\n","/*!\n * to-regex-range \n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst isNumber = require('is-number');\n\nconst toRegexRange = (min, max, options) => {\n if (isNumber(min) === false) {\n throw new TypeError('toRegexRange: expected the first argument to be a number');\n }\n\n if (max === void 0 || min === max) {\n return String(min);\n }\n\n if (isNumber(max) === false) {\n throw new TypeError('toRegexRange: expected the second argument to be a number.');\n }\n\n let opts = { relaxZeros: true, ...options };\n if (typeof opts.strictZeros === 'boolean') {\n opts.relaxZeros = opts.strictZeros === false;\n }\n\n let relax = String(opts.relaxZeros);\n let shorthand = String(opts.shorthand);\n let capture = String(opts.capture);\n let wrap = String(opts.wrap);\n let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap;\n\n if (toRegexRange.cache.hasOwnProperty(cacheKey)) {\n return toRegexRange.cache[cacheKey].result;\n }\n\n let a = Math.min(min, max);\n let b = Math.max(min, max);\n\n if (Math.abs(a - b) === 1) {\n let result = min + '|' + max;\n if (opts.capture) {\n return `(${result})`;\n }\n if (opts.wrap === false) {\n return result;\n }\n return `(?:${result})`;\n }\n\n let isPadded = hasPadding(min) || hasPadding(max);\n let state = { min, max, a, b };\n let positives = [];\n let negatives = [];\n\n if (isPadded) {\n state.isPadded = isPadded;\n state.maxLen = String(state.max).length;\n }\n\n if (a < 0) {\n let newMin = b < 0 ? Math.abs(b) : 1;\n negatives = splitToPatterns(newMin, Math.abs(a), state, opts);\n a = state.a = 0;\n }\n\n if (b >= 0) {\n positives = splitToPatterns(a, b, state, opts);\n }\n\n state.negatives = negatives;\n state.positives = positives;\n state.result = collatePatterns(negatives, positives, opts);\n\n if (opts.capture === true) {\n state.result = `(${state.result})`;\n } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) {\n state.result = `(?:${state.result})`;\n }\n\n toRegexRange.cache[cacheKey] = state;\n return state.result;\n};\n\nfunction collatePatterns(neg, pos, options) {\n let onlyNegative = filterPatterns(neg, pos, '-', false, options) || [];\n let onlyPositive = filterPatterns(pos, neg, '', false, options) || [];\n let intersected = filterPatterns(neg, pos, '-?', true, options) || [];\n let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive);\n return subpatterns.join('|');\n}\n\nfunction splitToRanges(min, max) {\n let nines = 1;\n let zeros = 1;\n\n let stop = countNines(min, nines);\n let stops = new Set([max]);\n\n while (min <= stop && stop <= max) {\n stops.add(stop);\n nines += 1;\n stop = countNines(min, nines);\n }\n\n stop = countZeros(max + 1, zeros) - 1;\n\n while (min < stop && stop <= max) {\n stops.add(stop);\n zeros += 1;\n stop = countZeros(max + 1, zeros) - 1;\n }\n\n stops = [...stops];\n stops.sort(compare);\n return stops;\n}\n\n/**\n * Convert a range to a regex pattern\n * @param {Number} `start`\n * @param {Number} `stop`\n * @return {String}\n */\n\nfunction rangeToPattern(start, stop, options) {\n if (start === stop) {\n return { pattern: start, count: [], digits: 0 };\n }\n\n let zipped = zip(start, stop);\n let digits = zipped.length;\n let pattern = '';\n let count = 0;\n\n for (let i = 0; i < digits; i++) {\n let [startDigit, stopDigit] = zipped[i];\n\n if (startDigit === stopDigit) {\n pattern += startDigit;\n\n } else if (startDigit !== '0' || stopDigit !== '9') {\n pattern += toCharacterClass(startDigit, stopDigit, options);\n\n } else {\n count++;\n }\n }\n\n if (count) {\n pattern += options.shorthand === true ? '\\\\d' : '[0-9]';\n }\n\n return { pattern, count: [count], digits };\n}\n\nfunction splitToPatterns(min, max, tok, options) {\n let ranges = splitToRanges(min, max);\n let tokens = [];\n let start = min;\n let prev;\n\n for (let i = 0; i < ranges.length; i++) {\n let max = ranges[i];\n let obj = rangeToPattern(String(start), String(max), options);\n let zeros = '';\n\n if (!tok.isPadded && prev && prev.pattern === obj.pattern) {\n if (prev.count.length > 1) {\n prev.count.pop();\n }\n\n prev.count.push(obj.count[0]);\n prev.string = prev.pattern + toQuantifier(prev.count);\n start = max + 1;\n continue;\n }\n\n if (tok.isPadded) {\n zeros = padZeros(max, tok, options);\n }\n\n obj.string = zeros + obj.pattern + toQuantifier(obj.count);\n tokens.push(obj);\n start = max + 1;\n prev = obj;\n }\n\n return tokens;\n}\n\nfunction filterPatterns(arr, comparison, prefix, intersection, options) {\n let result = [];\n\n for (let ele of arr) {\n let { string } = ele;\n\n // only push if _both_ are negative...\n if (!intersection && !contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n\n // or _both_ are positive\n if (intersection && contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n }\n return result;\n}\n\n/**\n * Zip strings\n */\n\nfunction zip(a, b) {\n let arr = [];\n for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]);\n return arr;\n}\n\nfunction compare(a, b) {\n return a > b ? 1 : b > a ? -1 : 0;\n}\n\nfunction contains(arr, key, val) {\n return arr.some(ele => ele[key] === val);\n}\n\nfunction countNines(min, len) {\n return Number(String(min).slice(0, -len) + '9'.repeat(len));\n}\n\nfunction countZeros(integer, zeros) {\n return integer - (integer % Math.pow(10, zeros));\n}\n\nfunction toQuantifier(digits) {\n let [start = 0, stop = ''] = digits;\n if (stop || start > 1) {\n return `{${start + (stop ? ',' + stop : '')}}`;\n }\n return '';\n}\n\nfunction toCharacterClass(a, b, options) {\n return `[${a}${(b - a === 1) ? '' : '-'}${b}]`;\n}\n\nfunction hasPadding(str) {\n return /^-?(0+)\\d/.test(str);\n}\n\nfunction padZeros(value, tok, options) {\n if (!tok.isPadded) {\n return value;\n }\n\n let diff = Math.abs(tok.maxLen - String(value).length);\n let relax = options.relaxZeros !== false;\n\n switch (diff) {\n case 0:\n return '';\n case 1:\n return relax ? '0?' : '0';\n case 2:\n return relax ? '0{0,2}' : '00';\n default: {\n return relax ? `0{0,${diff}}` : `0{${diff}}`;\n }\n }\n}\n\n/**\n * Cache\n */\n\ntoRegexRange.cache = {};\ntoRegexRange.clearCache = () => (toRegexRange.cache = {});\n\n/**\n * Expose `toRegexRange`\n */\n\nmodule.exports = toRegexRange;\n","\"use strict\";\r\nconst taskManager = require(\"./managers/tasks\");\r\nconst async_1 = require(\"./providers/async\");\r\nconst stream_1 = require(\"./providers/stream\");\r\nconst sync_1 = require(\"./providers/sync\");\r\nconst settings_1 = require(\"./settings\");\r\nconst utils = require(\"./utils\");\r\nasync function FastGlob(source, options) {\r\n assertPatternsInput(source);\r\n const works = getWorks(source, async_1.default, options);\r\n const result = await Promise.all(works);\r\n return utils.array.flatten(result);\r\n}\r\n// https://github.com/typescript-eslint/typescript-eslint/issues/60\r\n// eslint-disable-next-line no-redeclare\r\n(function (FastGlob) {\r\n function sync(source, options) {\r\n assertPatternsInput(source);\r\n const works = getWorks(source, sync_1.default, options);\r\n return utils.array.flatten(works);\r\n }\r\n FastGlob.sync = sync;\r\n function stream(source, options) {\r\n assertPatternsInput(source);\r\n const works = getWorks(source, stream_1.default, options);\r\n /**\r\n * The stream returned by the provider cannot work with an asynchronous iterator.\r\n * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams.\r\n * This affects performance (+25%). I don't see best solution right now.\r\n */\r\n return utils.stream.merge(works);\r\n }\r\n FastGlob.stream = stream;\r\n function generateTasks(source, options) {\r\n assertPatternsInput(source);\r\n const patterns = [].concat(source);\r\n const settings = new settings_1.default(options);\r\n return taskManager.generate(patterns, settings);\r\n }\r\n FastGlob.generateTasks = generateTasks;\r\n function isDynamicPattern(source, options) {\r\n assertPatternsInput(source);\r\n const settings = new settings_1.default(options);\r\n return utils.pattern.isDynamicPattern(source, settings);\r\n }\r\n FastGlob.isDynamicPattern = isDynamicPattern;\r\n function escapePath(source) {\r\n assertPatternsInput(source);\r\n return utils.path.escape(source);\r\n }\r\n FastGlob.escapePath = escapePath;\r\n})(FastGlob || (FastGlob = {}));\r\nfunction getWorks(source, _Provider, options) {\r\n const patterns = [].concat(source);\r\n const settings = new settings_1.default(options);\r\n const tasks = taskManager.generate(patterns, settings);\r\n const provider = new _Provider(settings);\r\n return tasks.map(provider.read, provider);\r\n}\r\nfunction assertPatternsInput(input) {\r\n const source = [].concat(input);\r\n const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item));\r\n if (!isValidSource) {\r\n throw new TypeError('Patterns must be a string (non empty) or an array of strings');\r\n }\r\n}\r\nmodule.exports = FastGlob;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0;\r\nconst utils = require(\"../utils\");\r\nfunction generate(patterns, settings) {\r\n const positivePatterns = getPositivePatterns(patterns);\r\n const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore);\r\n const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings));\r\n const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings));\r\n const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false);\r\n const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true);\r\n return staticTasks.concat(dynamicTasks);\r\n}\r\nexports.generate = generate;\r\nfunction convertPatternsToTasks(positive, negative, dynamic) {\r\n const positivePatternsGroup = groupPatternsByBaseDirectory(positive);\r\n // When we have a global group – there is no reason to divide the patterns into independent tasks.\r\n // In this case, the global task covers the rest.\r\n if ('.' in positivePatternsGroup) {\r\n const task = convertPatternGroupToTask('.', positive, negative, dynamic);\r\n return [task];\r\n }\r\n return convertPatternGroupsToTasks(positivePatternsGroup, negative, dynamic);\r\n}\r\nexports.convertPatternsToTasks = convertPatternsToTasks;\r\nfunction getPositivePatterns(patterns) {\r\n return utils.pattern.getPositivePatterns(patterns);\r\n}\r\nexports.getPositivePatterns = getPositivePatterns;\r\nfunction getNegativePatternsAsPositive(patterns, ignore) {\r\n const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore);\r\n const positive = negative.map(utils.pattern.convertToPositivePattern);\r\n return positive;\r\n}\r\nexports.getNegativePatternsAsPositive = getNegativePatternsAsPositive;\r\nfunction groupPatternsByBaseDirectory(patterns) {\r\n const group = {};\r\n return patterns.reduce((collection, pattern) => {\r\n const base = utils.pattern.getBaseDirectory(pattern);\r\n if (base in collection) {\r\n collection[base].push(pattern);\r\n }\r\n else {\r\n collection[base] = [pattern];\r\n }\r\n return collection;\r\n }, group);\r\n}\r\nexports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory;\r\nfunction convertPatternGroupsToTasks(positive, negative, dynamic) {\r\n return Object.keys(positive).map((base) => {\r\n return convertPatternGroupToTask(base, positive[base], negative, dynamic);\r\n });\r\n}\r\nexports.convertPatternGroupsToTasks = convertPatternGroupsToTasks;\r\nfunction convertPatternGroupToTask(base, positive, negative, dynamic) {\r\n return {\r\n dynamic,\r\n positive,\r\n negative,\r\n base,\r\n patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern))\r\n };\r\n}\r\nexports.convertPatternGroupToTask = convertPatternGroupToTask;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst stream_1 = require(\"../readers/stream\");\r\nconst provider_1 = require(\"./provider\");\r\nclass ProviderAsync extends provider_1.default {\r\n constructor() {\r\n super(...arguments);\r\n this._reader = new stream_1.default(this._settings);\r\n }\r\n read(task) {\r\n const root = this._getRootDirectory(task);\r\n const options = this._getReaderOptions(task);\r\n const entries = [];\r\n return new Promise((resolve, reject) => {\r\n const stream = this.api(root, task, options);\r\n stream.once('error', reject);\r\n stream.on('data', (entry) => entries.push(options.transform(entry)));\r\n stream.once('end', () => resolve(entries));\r\n });\r\n }\r\n api(root, task, options) {\r\n if (task.dynamic) {\r\n return this._reader.dynamic(root, options);\r\n }\r\n return this._reader.static(task.patterns, options);\r\n }\r\n}\r\nexports.default = ProviderAsync;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst utils = require(\"../../utils\");\r\nconst partial_1 = require(\"../matchers/partial\");\r\nclass DeepFilter {\r\n constructor(_settings, _micromatchOptions) {\r\n this._settings = _settings;\r\n this._micromatchOptions = _micromatchOptions;\r\n }\r\n getFilter(basePath, positive, negative) {\r\n const matcher = this._getMatcher(positive);\r\n const negativeRe = this._getNegativePatternsRe(negative);\r\n return (entry) => this._filter(basePath, entry, matcher, negativeRe);\r\n }\r\n _getMatcher(patterns) {\r\n return new partial_1.default(patterns, this._settings, this._micromatchOptions);\r\n }\r\n _getNegativePatternsRe(patterns) {\r\n const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern);\r\n return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions);\r\n }\r\n _filter(basePath, entry, matcher, negativeRe) {\r\n if (this._isSkippedByDeep(basePath, entry.path)) {\r\n return false;\r\n }\r\n if (this._isSkippedSymbolicLink(entry)) {\r\n return false;\r\n }\r\n const filepath = utils.path.removeLeadingDotSegment(entry.path);\r\n if (this._isSkippedByPositivePatterns(filepath, matcher)) {\r\n return false;\r\n }\r\n return this._isSkippedByNegativePatterns(filepath, negativeRe);\r\n }\r\n _isSkippedByDeep(basePath, entryPath) {\r\n /**\r\n * Avoid unnecessary depth calculations when it doesn't matter.\r\n */\r\n if (this._settings.deep === Infinity) {\r\n return false;\r\n }\r\n return this._getEntryLevel(basePath, entryPath) >= this._settings.deep;\r\n }\r\n _getEntryLevel(basePath, entryPath) {\r\n const entryPathDepth = entryPath.split('/').length;\r\n if (basePath === '') {\r\n return entryPathDepth;\r\n }\r\n const basePathDepth = basePath.split('/').length;\r\n return entryPathDepth - basePathDepth;\r\n }\r\n _isSkippedSymbolicLink(entry) {\r\n return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink();\r\n }\r\n _isSkippedByPositivePatterns(entryPath, matcher) {\r\n return !this._settings.baseNameMatch && !matcher.match(entryPath);\r\n }\r\n _isSkippedByNegativePatterns(entryPath, patternsRe) {\r\n return !utils.pattern.matchAny(entryPath, patternsRe);\r\n }\r\n}\r\nexports.default = DeepFilter;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst utils = require(\"../../utils\");\r\nclass EntryFilter {\r\n constructor(_settings, _micromatchOptions) {\r\n this._settings = _settings;\r\n this._micromatchOptions = _micromatchOptions;\r\n this.index = new Map();\r\n }\r\n getFilter(positive, negative) {\r\n const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions);\r\n const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions);\r\n return (entry) => this._filter(entry, positiveRe, negativeRe);\r\n }\r\n _filter(entry, positiveRe, negativeRe) {\r\n if (this._settings.unique && this._isDuplicateEntry(entry)) {\r\n return false;\r\n }\r\n if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) {\r\n return false;\r\n }\r\n if (this._isSkippedByAbsoluteNegativePatterns(entry.path, negativeRe)) {\r\n return false;\r\n }\r\n const filepath = this._settings.baseNameMatch ? entry.name : entry.path;\r\n const isMatched = this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe);\r\n if (this._settings.unique && isMatched) {\r\n this._createIndexRecord(entry);\r\n }\r\n return isMatched;\r\n }\r\n _isDuplicateEntry(entry) {\r\n return this.index.has(entry.path);\r\n }\r\n _createIndexRecord(entry) {\r\n this.index.set(entry.path, undefined);\r\n }\r\n _onlyFileFilter(entry) {\r\n return this._settings.onlyFiles && !entry.dirent.isFile();\r\n }\r\n _onlyDirectoryFilter(entry) {\r\n return this._settings.onlyDirectories && !entry.dirent.isDirectory();\r\n }\r\n _isSkippedByAbsoluteNegativePatterns(entryPath, patternsRe) {\r\n if (!this._settings.absolute) {\r\n return false;\r\n }\r\n const fullpath = utils.path.makeAbsolute(this._settings.cwd, entryPath);\r\n return utils.pattern.matchAny(fullpath, patternsRe);\r\n }\r\n _isMatchToPatterns(entryPath, patternsRe) {\r\n const filepath = utils.path.removeLeadingDotSegment(entryPath);\r\n return utils.pattern.matchAny(filepath, patternsRe);\r\n }\r\n}\r\nexports.default = EntryFilter;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst utils = require(\"../../utils\");\r\nclass ErrorFilter {\r\n constructor(_settings) {\r\n this._settings = _settings;\r\n }\r\n getFilter() {\r\n return (error) => this._isNonFatalError(error);\r\n }\r\n _isNonFatalError(error) {\r\n return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors;\r\n }\r\n}\r\nexports.default = ErrorFilter;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst utils = require(\"../../utils\");\r\nclass Matcher {\r\n constructor(_patterns, _settings, _micromatchOptions) {\r\n this._patterns = _patterns;\r\n this._settings = _settings;\r\n this._micromatchOptions = _micromatchOptions;\r\n this._storage = [];\r\n this._fillStorage();\r\n }\r\n _fillStorage() {\r\n /**\r\n * The original pattern may include `{,*,**,a/*}`, which will lead to problems with matching (unresolved level).\r\n * So, before expand patterns with brace expansion into separated patterns.\r\n */\r\n const patterns = utils.pattern.expandPatternsWithBraceExpansion(this._patterns);\r\n for (const pattern of patterns) {\r\n const segments = this._getPatternSegments(pattern);\r\n const sections = this._splitSegmentsIntoSections(segments);\r\n this._storage.push({\r\n complete: sections.length <= 1,\r\n pattern,\r\n segments,\r\n sections\r\n });\r\n }\r\n }\r\n _getPatternSegments(pattern) {\r\n const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions);\r\n return parts.map((part) => {\r\n const dynamic = utils.pattern.isDynamicPattern(part, this._settings);\r\n if (!dynamic) {\r\n return {\r\n dynamic: false,\r\n pattern: part\r\n };\r\n }\r\n return {\r\n dynamic: true,\r\n pattern: part,\r\n patternRe: utils.pattern.makeRe(part, this._micromatchOptions)\r\n };\r\n });\r\n }\r\n _splitSegmentsIntoSections(segments) {\r\n return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern));\r\n }\r\n}\r\nexports.default = Matcher;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst matcher_1 = require(\"./matcher\");\r\nclass PartialMatcher extends matcher_1.default {\r\n match(filepath) {\r\n const parts = filepath.split('/');\r\n const levels = parts.length;\r\n const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels);\r\n for (const pattern of patterns) {\r\n const section = pattern.sections[0];\r\n /**\r\n * In this case, the pattern has a globstar and we must read all directories unconditionally,\r\n * but only if the level has reached the end of the first group.\r\n *\r\n * fixtures/{a,b}/**\r\n * ^ true/false ^ always true\r\n */\r\n if (!pattern.complete && levels > section.length) {\r\n return true;\r\n }\r\n const match = parts.every((part, index) => {\r\n const segment = pattern.segments[index];\r\n if (segment.dynamic && segment.patternRe.test(part)) {\r\n return true;\r\n }\r\n if (!segment.dynamic && segment.pattern === part) {\r\n return true;\r\n }\r\n return false;\r\n });\r\n if (match) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\nexports.default = PartialMatcher;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst path = require(\"path\");\r\nconst deep_1 = require(\"./filters/deep\");\r\nconst entry_1 = require(\"./filters/entry\");\r\nconst error_1 = require(\"./filters/error\");\r\nconst entry_2 = require(\"./transformers/entry\");\r\nclass Provider {\r\n constructor(_settings) {\r\n this._settings = _settings;\r\n this.errorFilter = new error_1.default(this._settings);\r\n this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions());\r\n this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions());\r\n this.entryTransformer = new entry_2.default(this._settings);\r\n }\r\n _getRootDirectory(task) {\r\n return path.resolve(this._settings.cwd, task.base);\r\n }\r\n _getReaderOptions(task) {\r\n const basePath = task.base === '.' ? '' : task.base;\r\n return {\r\n basePath,\r\n pathSegmentSeparator: '/',\r\n concurrency: this._settings.concurrency,\r\n deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative),\r\n entryFilter: this.entryFilter.getFilter(task.positive, task.negative),\r\n errorFilter: this.errorFilter.getFilter(),\r\n followSymbolicLinks: this._settings.followSymbolicLinks,\r\n fs: this._settings.fs,\r\n stats: this._settings.stats,\r\n throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink,\r\n transform: this.entryTransformer.getTransformer()\r\n };\r\n }\r\n _getMicromatchOptions() {\r\n return {\r\n dot: this._settings.dot,\r\n matchBase: this._settings.baseNameMatch,\r\n nobrace: !this._settings.braceExpansion,\r\n nocase: !this._settings.caseSensitiveMatch,\r\n noext: !this._settings.extglob,\r\n noglobstar: !this._settings.globstar,\r\n posix: true,\r\n strictSlashes: false\r\n };\r\n }\r\n}\r\nexports.default = Provider;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst stream_1 = require(\"stream\");\r\nconst stream_2 = require(\"../readers/stream\");\r\nconst provider_1 = require(\"./provider\");\r\nclass ProviderStream extends provider_1.default {\r\n constructor() {\r\n super(...arguments);\r\n this._reader = new stream_2.default(this._settings);\r\n }\r\n read(task) {\r\n const root = this._getRootDirectory(task);\r\n const options = this._getReaderOptions(task);\r\n const source = this.api(root, task, options);\r\n const destination = new stream_1.Readable({ objectMode: true, read: () => { } });\r\n source\r\n .once('error', (error) => destination.emit('error', error))\r\n .on('data', (entry) => destination.emit('data', options.transform(entry)))\r\n .once('end', () => destination.emit('end'));\r\n destination\r\n .once('close', () => source.destroy());\r\n return destination;\r\n }\r\n api(root, task, options) {\r\n if (task.dynamic) {\r\n return this._reader.dynamic(root, options);\r\n }\r\n return this._reader.static(task.patterns, options);\r\n }\r\n}\r\nexports.default = ProviderStream;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst sync_1 = require(\"../readers/sync\");\r\nconst provider_1 = require(\"./provider\");\r\nclass ProviderSync extends provider_1.default {\r\n constructor() {\r\n super(...arguments);\r\n this._reader = new sync_1.default(this._settings);\r\n }\r\n read(task) {\r\n const root = this._getRootDirectory(task);\r\n const options = this._getReaderOptions(task);\r\n const entries = this.api(root, task, options);\r\n return entries.map(options.transform);\r\n }\r\n api(root, task, options) {\r\n if (task.dynamic) {\r\n return this._reader.dynamic(root, options);\r\n }\r\n return this._reader.static(task.patterns, options);\r\n }\r\n}\r\nexports.default = ProviderSync;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst utils = require(\"../../utils\");\r\nclass EntryTransformer {\r\n constructor(_settings) {\r\n this._settings = _settings;\r\n }\r\n getTransformer() {\r\n return (entry) => this._transform(entry);\r\n }\r\n _transform(entry) {\r\n let filepath = entry.path;\r\n if (this._settings.absolute) {\r\n filepath = utils.path.makeAbsolute(this._settings.cwd, filepath);\r\n filepath = utils.path.unixify(filepath);\r\n }\r\n if (this._settings.markDirectories && entry.dirent.isDirectory()) {\r\n filepath += '/';\r\n }\r\n if (!this._settings.objectMode) {\r\n return filepath;\r\n }\r\n return Object.assign(Object.assign({}, entry), { path: filepath });\r\n }\r\n}\r\nexports.default = EntryTransformer;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst path = require(\"path\");\r\nconst fsStat = require(\"@nodelib/fs.stat\");\r\nconst utils = require(\"../utils\");\r\nclass Reader {\r\n constructor(_settings) {\r\n this._settings = _settings;\r\n this._fsStatSettings = new fsStat.Settings({\r\n followSymbolicLink: this._settings.followSymbolicLinks,\r\n fs: this._settings.fs,\r\n throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks\r\n });\r\n }\r\n _getFullEntryPath(filepath) {\r\n return path.resolve(this._settings.cwd, filepath);\r\n }\r\n _makeEntry(stats, pattern) {\r\n const entry = {\r\n name: pattern,\r\n path: pattern,\r\n dirent: utils.fs.createDirentFromStats(pattern, stats)\r\n };\r\n if (this._settings.stats) {\r\n entry.stats = stats;\r\n }\r\n return entry;\r\n }\r\n _isFatalError(error) {\r\n return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors;\r\n }\r\n}\r\nexports.default = Reader;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst stream_1 = require(\"stream\");\r\nconst fsStat = require(\"@nodelib/fs.stat\");\r\nconst fsWalk = require(\"@nodelib/fs.walk\");\r\nconst reader_1 = require(\"./reader\");\r\nclass ReaderStream extends reader_1.default {\r\n constructor() {\r\n super(...arguments);\r\n this._walkStream = fsWalk.walkStream;\r\n this._stat = fsStat.stat;\r\n }\r\n dynamic(root, options) {\r\n return this._walkStream(root, options);\r\n }\r\n static(patterns, options) {\r\n const filepaths = patterns.map(this._getFullEntryPath, this);\r\n const stream = new stream_1.PassThrough({ objectMode: true });\r\n stream._write = (index, _enc, done) => {\r\n return this._getEntry(filepaths[index], patterns[index], options)\r\n .then((entry) => {\r\n if (entry !== null && options.entryFilter(entry)) {\r\n stream.push(entry);\r\n }\r\n if (index === filepaths.length - 1) {\r\n stream.end();\r\n }\r\n done();\r\n })\r\n .catch(done);\r\n };\r\n for (let i = 0; i < filepaths.length; i++) {\r\n stream.write(i);\r\n }\r\n return stream;\r\n }\r\n _getEntry(filepath, pattern, options) {\r\n return this._getStat(filepath)\r\n .then((stats) => this._makeEntry(stats, pattern))\r\n .catch((error) => {\r\n if (options.errorFilter(error)) {\r\n return null;\r\n }\r\n throw error;\r\n });\r\n }\r\n _getStat(filepath) {\r\n return new Promise((resolve, reject) => {\r\n this._stat(filepath, this._fsStatSettings, (error, stats) => {\r\n return error === null ? resolve(stats) : reject(error);\r\n });\r\n });\r\n }\r\n}\r\nexports.default = ReaderStream;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst fsStat = require(\"@nodelib/fs.stat\");\r\nconst fsWalk = require(\"@nodelib/fs.walk\");\r\nconst reader_1 = require(\"./reader\");\r\nclass ReaderSync extends reader_1.default {\r\n constructor() {\r\n super(...arguments);\r\n this._walkSync = fsWalk.walkSync;\r\n this._statSync = fsStat.statSync;\r\n }\r\n dynamic(root, options) {\r\n return this._walkSync(root, options);\r\n }\r\n static(patterns, options) {\r\n const entries = [];\r\n for (const pattern of patterns) {\r\n const filepath = this._getFullEntryPath(pattern);\r\n const entry = this._getEntry(filepath, pattern, options);\r\n if (entry === null || !options.entryFilter(entry)) {\r\n continue;\r\n }\r\n entries.push(entry);\r\n }\r\n return entries;\r\n }\r\n _getEntry(filepath, pattern, options) {\r\n try {\r\n const stats = this._getStat(filepath);\r\n return this._makeEntry(stats, pattern);\r\n }\r\n catch (error) {\r\n if (options.errorFilter(error)) {\r\n return null;\r\n }\r\n throw error;\r\n }\r\n }\r\n _getStat(filepath) {\r\n return this._statSync(filepath, this._fsStatSettings);\r\n }\r\n}\r\nexports.default = ReaderSync;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0;\r\nconst fs = require(\"fs\");\r\nconst os = require(\"os\");\r\n/**\r\n * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero.\r\n * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107\r\n */\r\nconst CPU_COUNT = Math.max(os.cpus().length, 1);\r\nexports.DEFAULT_FILE_SYSTEM_ADAPTER = {\r\n lstat: fs.lstat,\r\n lstatSync: fs.lstatSync,\r\n stat: fs.stat,\r\n statSync: fs.statSync,\r\n readdir: fs.readdir,\r\n readdirSync: fs.readdirSync\r\n};\r\nclass Settings {\r\n constructor(_options = {}) {\r\n this._options = _options;\r\n this.absolute = this._getValue(this._options.absolute, false);\r\n this.baseNameMatch = this._getValue(this._options.baseNameMatch, false);\r\n this.braceExpansion = this._getValue(this._options.braceExpansion, true);\r\n this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true);\r\n this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT);\r\n this.cwd = this._getValue(this._options.cwd, process.cwd());\r\n this.deep = this._getValue(this._options.deep, Infinity);\r\n this.dot = this._getValue(this._options.dot, false);\r\n this.extglob = this._getValue(this._options.extglob, true);\r\n this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true);\r\n this.fs = this._getFileSystemMethods(this._options.fs);\r\n this.globstar = this._getValue(this._options.globstar, true);\r\n this.ignore = this._getValue(this._options.ignore, []);\r\n this.markDirectories = this._getValue(this._options.markDirectories, false);\r\n this.objectMode = this._getValue(this._options.objectMode, false);\r\n this.onlyDirectories = this._getValue(this._options.onlyDirectories, false);\r\n this.onlyFiles = this._getValue(this._options.onlyFiles, true);\r\n this.stats = this._getValue(this._options.stats, false);\r\n this.suppressErrors = this._getValue(this._options.suppressErrors, false);\r\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false);\r\n this.unique = this._getValue(this._options.unique, true);\r\n if (this.onlyDirectories) {\r\n this.onlyFiles = false;\r\n }\r\n if (this.stats) {\r\n this.objectMode = true;\r\n }\r\n }\r\n _getValue(option, value) {\r\n return option === undefined ? value : option;\r\n }\r\n _getFileSystemMethods(methods = {}) {\r\n return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods);\r\n }\r\n}\r\nexports.default = Settings;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.splitWhen = exports.flatten = void 0;\r\nfunction flatten(items) {\r\n return items.reduce((collection, item) => [].concat(collection, item), []);\r\n}\r\nexports.flatten = flatten;\r\nfunction splitWhen(items, predicate) {\r\n const result = [[]];\r\n let groupIndex = 0;\r\n for (const item of items) {\r\n if (predicate(item)) {\r\n groupIndex++;\r\n result[groupIndex] = [];\r\n }\r\n else {\r\n result[groupIndex].push(item);\r\n }\r\n }\r\n return result;\r\n}\r\nexports.splitWhen = splitWhen;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.isEnoentCodeError = void 0;\r\nfunction isEnoentCodeError(error) {\r\n return error.code === 'ENOENT';\r\n}\r\nexports.isEnoentCodeError = isEnoentCodeError;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.createDirentFromStats = void 0;\r\nclass DirentFromStats {\r\n constructor(name, stats) {\r\n this.name = name;\r\n this.isBlockDevice = stats.isBlockDevice.bind(stats);\r\n this.isCharacterDevice = stats.isCharacterDevice.bind(stats);\r\n this.isDirectory = stats.isDirectory.bind(stats);\r\n this.isFIFO = stats.isFIFO.bind(stats);\r\n this.isFile = stats.isFile.bind(stats);\r\n this.isSocket = stats.isSocket.bind(stats);\r\n this.isSymbolicLink = stats.isSymbolicLink.bind(stats);\r\n }\r\n}\r\nfunction createDirentFromStats(name, stats) {\r\n return new DirentFromStats(name, stats);\r\n}\r\nexports.createDirentFromStats = createDirentFromStats;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.string = exports.stream = exports.pattern = exports.path = exports.fs = exports.errno = exports.array = void 0;\r\nconst array = require(\"./array\");\r\nexports.array = array;\r\nconst errno = require(\"./errno\");\r\nexports.errno = errno;\r\nconst fs = require(\"./fs\");\r\nexports.fs = fs;\r\nconst path = require(\"./path\");\r\nexports.path = path;\r\nconst pattern = require(\"./pattern\");\r\nexports.pattern = pattern;\r\nconst stream = require(\"./stream\");\r\nexports.stream = stream;\r\nconst string = require(\"./string\");\r\nexports.string = string;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.removeLeadingDotSegment = exports.escape = exports.makeAbsolute = exports.unixify = void 0;\r\nconst path = require(\"path\");\r\nconst LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\\\\r\nconst UNESCAPED_GLOB_SYMBOLS_RE = /(\\\\?)([()*?[\\]{|}]|^!|[!+@](?=\\())/g;\r\n/**\r\n * Designed to work only with simple paths: `dir\\\\file`.\r\n */\r\nfunction unixify(filepath) {\r\n return filepath.replace(/\\\\/g, '/');\r\n}\r\nexports.unixify = unixify;\r\nfunction makeAbsolute(cwd, filepath) {\r\n return path.resolve(cwd, filepath);\r\n}\r\nexports.makeAbsolute = makeAbsolute;\r\nfunction escape(pattern) {\r\n return pattern.replace(UNESCAPED_GLOB_SYMBOLS_RE, '\\\\$2');\r\n}\r\nexports.escape = escape;\r\nfunction removeLeadingDotSegment(entry) {\r\n // We do not use `startsWith` because this is 10x slower than current implementation for some cases.\r\n // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with\r\n if (entry.charAt(0) === '.') {\r\n const secondCharactery = entry.charAt(1);\r\n if (secondCharactery === '/' || secondCharactery === '\\\\') {\r\n return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT);\r\n }\r\n }\r\n return entry;\r\n}\r\nexports.removeLeadingDotSegment = removeLeadingDotSegment;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0;\r\nconst path = require(\"path\");\r\nconst globParent = require(\"glob-parent\");\r\nconst micromatch = require(\"micromatch\");\r\nconst picomatch = require(\"picomatch\");\r\nconst GLOBSTAR = '**';\r\nconst ESCAPE_SYMBOL = '\\\\';\r\nconst COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/;\r\nconst REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\\[.*]/;\r\nconst REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\\(.*\\|.*\\)/;\r\nconst GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\\(.*\\)/;\r\nconst BRACE_EXPANSIONS_SYMBOLS_RE = /{.*(?:,|\\.\\.).*}/;\r\nfunction isStaticPattern(pattern, options = {}) {\r\n return !isDynamicPattern(pattern, options);\r\n}\r\nexports.isStaticPattern = isStaticPattern;\r\nfunction isDynamicPattern(pattern, options = {}) {\r\n /**\r\n * A special case with an empty string is necessary for matching patterns that start with a forward slash.\r\n * An empty string cannot be a dynamic pattern.\r\n * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'.\r\n */\r\n if (pattern === '') {\r\n return false;\r\n }\r\n /**\r\n * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check\r\n * filepath directly (without read directory).\r\n */\r\n if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) {\r\n return true;\r\n }\r\n if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) {\r\n return true;\r\n }\r\n if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) {\r\n return true;\r\n }\r\n if (options.braceExpansion !== false && BRACE_EXPANSIONS_SYMBOLS_RE.test(pattern)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\nexports.isDynamicPattern = isDynamicPattern;\r\nfunction convertToPositivePattern(pattern) {\r\n return isNegativePattern(pattern) ? pattern.slice(1) : pattern;\r\n}\r\nexports.convertToPositivePattern = convertToPositivePattern;\r\nfunction convertToNegativePattern(pattern) {\r\n return '!' + pattern;\r\n}\r\nexports.convertToNegativePattern = convertToNegativePattern;\r\nfunction isNegativePattern(pattern) {\r\n return pattern.startsWith('!') && pattern[1] !== '(';\r\n}\r\nexports.isNegativePattern = isNegativePattern;\r\nfunction isPositivePattern(pattern) {\r\n return !isNegativePattern(pattern);\r\n}\r\nexports.isPositivePattern = isPositivePattern;\r\nfunction getNegativePatterns(patterns) {\r\n return patterns.filter(isNegativePattern);\r\n}\r\nexports.getNegativePatterns = getNegativePatterns;\r\nfunction getPositivePatterns(patterns) {\r\n return patterns.filter(isPositivePattern);\r\n}\r\nexports.getPositivePatterns = getPositivePatterns;\r\nfunction getBaseDirectory(pattern) {\r\n return globParent(pattern, { flipBackslashes: false });\r\n}\r\nexports.getBaseDirectory = getBaseDirectory;\r\nfunction hasGlobStar(pattern) {\r\n return pattern.includes(GLOBSTAR);\r\n}\r\nexports.hasGlobStar = hasGlobStar;\r\nfunction endsWithSlashGlobStar(pattern) {\r\n return pattern.endsWith('/' + GLOBSTAR);\r\n}\r\nexports.endsWithSlashGlobStar = endsWithSlashGlobStar;\r\nfunction isAffectDepthOfReadingPattern(pattern) {\r\n const basename = path.basename(pattern);\r\n return endsWithSlashGlobStar(pattern) || isStaticPattern(basename);\r\n}\r\nexports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern;\r\nfunction expandPatternsWithBraceExpansion(patterns) {\r\n return patterns.reduce((collection, pattern) => {\r\n return collection.concat(expandBraceExpansion(pattern));\r\n }, []);\r\n}\r\nexports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion;\r\nfunction expandBraceExpansion(pattern) {\r\n return micromatch.braces(pattern, {\r\n expand: true,\r\n nodupes: true\r\n });\r\n}\r\nexports.expandBraceExpansion = expandBraceExpansion;\r\nfunction getPatternParts(pattern, options) {\r\n let { parts } = picomatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true }));\r\n /**\r\n * The scan method returns an empty array in some cases.\r\n * See micromatch/picomatch#58 for more details.\r\n */\r\n if (parts.length === 0) {\r\n parts = [pattern];\r\n }\r\n /**\r\n * The scan method does not return an empty part for the pattern with a forward slash.\r\n * This is another part of micromatch/picomatch#58.\r\n */\r\n if (parts[0].startsWith('/')) {\r\n parts[0] = parts[0].slice(1);\r\n parts.unshift('');\r\n }\r\n return parts;\r\n}\r\nexports.getPatternParts = getPatternParts;\r\nfunction makeRe(pattern, options) {\r\n return micromatch.makeRe(pattern, options);\r\n}\r\nexports.makeRe = makeRe;\r\nfunction convertPatternsToRe(patterns, options) {\r\n return patterns.map((pattern) => makeRe(pattern, options));\r\n}\r\nexports.convertPatternsToRe = convertPatternsToRe;\r\nfunction matchAny(entry, patternsRe) {\r\n return patternsRe.some((patternRe) => patternRe.test(entry));\r\n}\r\nexports.matchAny = matchAny;\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.merge = void 0;\r\nconst merge2 = require(\"merge2\");\r\nfunction merge(streams) {\r\n const mergedStream = merge2(streams);\r\n streams.forEach((stream) => {\r\n stream.once('error', (error) => mergedStream.emit('error', error));\r\n });\r\n mergedStream.once('close', () => propagateCloseEventToSources(streams));\r\n mergedStream.once('end', () => propagateCloseEventToSources(streams));\r\n return mergedStream;\r\n}\r\nexports.merge = merge;\r\nfunction propagateCloseEventToSources(streams) {\r\n streams.forEach((stream) => stream.emit('close'));\r\n}\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.isEmpty = exports.isString = void 0;\r\nfunction isString(input) {\r\n return typeof input === 'string';\r\n}\r\nexports.isString = isString;\r\nfunction isEmpty(input) {\r\n return input === '';\r\n}\r\nexports.isEmpty = isEmpty;\r\n","'use strict'\n\nvar reusify = require('reusify')\n\nfunction fastqueue (context, worker, concurrency) {\n if (typeof context === 'function') {\n concurrency = worker\n worker = context\n context = null\n }\n\n if (concurrency < 1) {\n throw new Error('fastqueue concurrency must be greater than 1')\n }\n\n var cache = reusify(Task)\n var queueHead = null\n var queueTail = null\n var _running = 0\n var errorHandler = null\n\n var self = {\n push: push,\n drain: noop,\n saturated: noop,\n pause: pause,\n paused: false,\n concurrency: concurrency,\n running: running,\n resume: resume,\n idle: idle,\n length: length,\n getQueue: getQueue,\n unshift: unshift,\n empty: noop,\n kill: kill,\n killAndDrain: killAndDrain,\n error: error\n }\n\n return self\n\n function running () {\n return _running\n }\n\n function pause () {\n self.paused = true\n }\n\n function length () {\n var current = queueHead\n var counter = 0\n\n while (current) {\n current = current.next\n counter++\n }\n\n return counter\n }\n\n function getQueue () {\n var current = queueHead\n var tasks = []\n\n while (current) {\n tasks.push(current.value)\n current = current.next\n }\n\n return tasks\n }\n\n function resume () {\n if (!self.paused) return\n self.paused = false\n for (var i = 0; i < self.concurrency; i++) {\n _running++\n release()\n }\n }\n\n function idle () {\n return _running === 0 && self.length() === 0\n }\n\n function push (value, done) {\n var current = cache.get()\n\n current.context = context\n current.release = release\n current.value = value\n current.callback = done || noop\n current.errorHandler = errorHandler\n\n if (_running === self.concurrency || self.paused) {\n if (queueTail) {\n queueTail.next = current\n queueTail = current\n } else {\n queueHead = current\n queueTail = current\n self.saturated()\n }\n } else {\n _running++\n worker.call(context, current.value, current.worked)\n }\n }\n\n function unshift (value, done) {\n var current = cache.get()\n\n current.context = context\n current.release = release\n current.value = value\n current.callback = done || noop\n\n if (_running === self.concurrency || self.paused) {\n if (queueHead) {\n current.next = queueHead\n queueHead = current\n } else {\n queueHead = current\n queueTail = current\n self.saturated()\n }\n } else {\n _running++\n worker.call(context, current.value, current.worked)\n }\n }\n\n function release (holder) {\n if (holder) {\n cache.release(holder)\n }\n var next = queueHead\n if (next) {\n if (!self.paused) {\n if (queueTail === queueHead) {\n queueTail = null\n }\n queueHead = next.next\n next.next = null\n worker.call(context, next.value, next.worked)\n if (queueTail === null) {\n self.empty()\n }\n } else {\n _running--\n }\n } else if (--_running === 0) {\n self.drain()\n }\n }\n\n function kill () {\n queueHead = null\n queueTail = null\n self.drain = noop\n }\n\n function killAndDrain () {\n queueHead = null\n queueTail = null\n self.drain()\n self.drain = noop\n }\n\n function error (handler) {\n errorHandler = handler\n }\n}\n\nfunction noop () {}\n\nfunction Task () {\n this.value = null\n this.callback = noop\n this.next = null\n this.release = noop\n this.context = null\n this.errorHandler = null\n\n var self = this\n\n this.worked = function worked (err, result) {\n var callback = self.callback\n var errorHandler = self.errorHandler\n var val = self.value\n self.value = null\n self.callback = noop\n if (self.errorHandler) {\n errorHandler(err, val)\n }\n callback.call(self.context, err, result)\n self.release(self)\n }\n}\n\nmodule.exports = fastqueue\n","'use strict';\n\nvar isGlob = require('is-glob');\nvar pathPosixDirname = require('path').posix.dirname;\nvar isWin32 = require('os').platform() === 'win32';\n\nvar slash = '/';\nvar backslash = /\\\\/g;\nvar enclosure = /[\\{\\[].*[\\/]*.*[\\}\\]]$/;\nvar globby = /(^|[^\\\\])([\\{\\[]|\\([^\\)]+$)/;\nvar escaped = /\\\\([\\!\\*\\?\\|\\[\\]\\(\\)\\{\\}])/g;\n\n/**\n * @param {string} str\n * @param {Object} opts\n * @param {boolean} [opts.flipBackslashes=true]\n */\nmodule.exports = function globParent(str, opts) {\n var options = Object.assign({ flipBackslashes: true }, opts);\n\n // flip windows path separators\n if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) {\n str = str.replace(backslash, slash);\n }\n\n // special case for strings ending in enclosure containing path separator\n if (enclosure.test(str)) {\n str += slash;\n }\n\n // preserves full path in case of trailing path separator\n str += 'a';\n\n // remove path parts that are globby\n do {\n str = pathPosixDirname(str);\n } while (isGlob(str) || globby.test(str));\n\n // remove escape chars and return result\n return str.replace(escaped, '$1');\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst types_1 = require(\"./types\");\nfunction createRejection(error, ...beforeErrorGroups) {\n const promise = (async () => {\n if (error instanceof types_1.RequestError) {\n try {\n for (const hooks of beforeErrorGroups) {\n if (hooks) {\n for (const hook of hooks) {\n // eslint-disable-next-line no-await-in-loop\n error = await hook(error);\n }\n }\n }\n }\n catch (error_) {\n error = error_;\n }\n }\n throw error;\n })();\n const returnPromise = () => promise;\n promise.json = returnPromise;\n promise.text = returnPromise;\n promise.buffer = returnPromise;\n promise.on = returnPromise;\n return promise;\n}\nexports.default = createRejection;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"events\");\nconst is_1 = require(\"@sindresorhus/is\");\nconst PCancelable = require(\"p-cancelable\");\nconst types_1 = require(\"./types\");\nconst parse_body_1 = require(\"./parse-body\");\nconst core_1 = require(\"../core\");\nconst proxy_events_1 = require(\"../core/utils/proxy-events\");\nconst get_buffer_1 = require(\"../core/utils/get-buffer\");\nconst is_response_ok_1 = require(\"../core/utils/is-response-ok\");\nconst proxiedRequestEvents = [\n 'request',\n 'response',\n 'redirect',\n 'uploadProgress',\n 'downloadProgress'\n];\nfunction asPromise(normalizedOptions) {\n let globalRequest;\n let globalResponse;\n const emitter = new events_1.EventEmitter();\n const promise = new PCancelable((resolve, reject, onCancel) => {\n const makeRequest = (retryCount) => {\n const request = new core_1.default(undefined, normalizedOptions);\n request.retryCount = retryCount;\n request._noPipe = true;\n onCancel(() => request.destroy());\n onCancel.shouldReject = false;\n onCancel(() => reject(new types_1.CancelError(request)));\n globalRequest = request;\n request.once('response', async (response) => {\n var _a;\n response.retryCount = retryCount;\n if (response.request.aborted) {\n // Canceled while downloading - will throw a `CancelError` or `TimeoutError` error\n return;\n }\n // Download body\n let rawBody;\n try {\n rawBody = await get_buffer_1.default(request);\n response.rawBody = rawBody;\n }\n catch (_b) {\n // The same error is caught below.\n // See request.once('error')\n return;\n }\n if (request._isAboutToError) {\n return;\n }\n // Parse body\n const contentEncoding = ((_a = response.headers['content-encoding']) !== null && _a !== void 0 ? _a : '').toLowerCase();\n const isCompressed = ['gzip', 'deflate', 'br'].includes(contentEncoding);\n const { options } = request;\n if (isCompressed && !options.decompress) {\n response.body = rawBody;\n }\n else {\n try {\n response.body = parse_body_1.default(response, options.responseType, options.parseJson, options.encoding);\n }\n catch (error) {\n // Fallback to `utf8`\n response.body = rawBody.toString();\n if (is_response_ok_1.isResponseOk(response)) {\n request._beforeError(error);\n return;\n }\n }\n }\n try {\n for (const [index, hook] of options.hooks.afterResponse.entries()) {\n // @ts-expect-error TS doesn't notice that CancelableRequest is a Promise\n // eslint-disable-next-line no-await-in-loop\n response = await hook(response, async (updatedOptions) => {\n const typedOptions = core_1.default.normalizeArguments(undefined, {\n ...updatedOptions,\n retry: {\n calculateDelay: () => 0\n },\n throwHttpErrors: false,\n resolveBodyOnly: false\n }, options);\n // Remove any further hooks for that request, because we'll call them anyway.\n // The loop continues. We don't want duplicates (asPromise recursion).\n typedOptions.hooks.afterResponse = typedOptions.hooks.afterResponse.slice(0, index);\n for (const hook of typedOptions.hooks.beforeRetry) {\n // eslint-disable-next-line no-await-in-loop\n await hook(typedOptions);\n }\n const promise = asPromise(typedOptions);\n onCancel(() => {\n promise.catch(() => { });\n promise.cancel();\n });\n return promise;\n });\n }\n }\n catch (error) {\n request._beforeError(new types_1.RequestError(error.message, error, request));\n return;\n }\n if (!is_response_ok_1.isResponseOk(response)) {\n request._beforeError(new types_1.HTTPError(response));\n return;\n }\n globalResponse = response;\n resolve(request.options.resolveBodyOnly ? response.body : response);\n });\n const onError = (error) => {\n if (promise.isCanceled) {\n return;\n }\n const { options } = request;\n if (error instanceof types_1.HTTPError && !options.throwHttpErrors) {\n const { response } = error;\n resolve(request.options.resolveBodyOnly ? response.body : response);\n return;\n }\n reject(error);\n };\n request.once('error', onError);\n const previousBody = request.options.body;\n request.once('retry', (newRetryCount, error) => {\n var _a, _b;\n if (previousBody === ((_a = error.request) === null || _a === void 0 ? void 0 : _a.options.body) && is_1.default.nodeStream((_b = error.request) === null || _b === void 0 ? void 0 : _b.options.body)) {\n onError(error);\n return;\n }\n makeRequest(newRetryCount);\n });\n proxy_events_1.default(request, emitter, proxiedRequestEvents);\n };\n makeRequest(0);\n });\n promise.on = (event, fn) => {\n emitter.on(event, fn);\n return promise;\n };\n const shortcut = (responseType) => {\n const newPromise = (async () => {\n // Wait until downloading has ended\n await promise;\n const { options } = globalResponse.request;\n return parse_body_1.default(globalResponse, responseType, options.parseJson, options.encoding);\n })();\n Object.defineProperties(newPromise, Object.getOwnPropertyDescriptors(promise));\n return newPromise;\n };\n promise.json = () => {\n const { headers } = globalRequest.options;\n if (!globalRequest.writableFinished && headers.accept === undefined) {\n headers.accept = 'application/json';\n }\n return shortcut('json');\n };\n promise.buffer = () => shortcut('buffer');\n promise.text = () => shortcut('text');\n return promise;\n}\nexports.default = asPromise;\n__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nconst normalizeArguments = (options, defaults) => {\n if (is_1.default.null_(options.encoding)) {\n throw new TypeError('To get a Buffer, set `options.responseType` to `buffer` instead');\n }\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.encoding);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.resolveBodyOnly);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.methodRewriting);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.isStream);\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.responseType);\n // `options.responseType`\n if (options.responseType === undefined) {\n options.responseType = 'text';\n }\n // `options.retry`\n const { retry } = options;\n if (defaults) {\n options.retry = { ...defaults.retry };\n }\n else {\n options.retry = {\n calculateDelay: retryObject => retryObject.computedValue,\n limit: 0,\n methods: [],\n statusCodes: [],\n errorCodes: [],\n maxRetryAfter: undefined\n };\n }\n if (is_1.default.object(retry)) {\n options.retry = {\n ...options.retry,\n ...retry\n };\n options.retry.methods = [...new Set(options.retry.methods.map(method => method.toUpperCase()))];\n options.retry.statusCodes = [...new Set(options.retry.statusCodes)];\n options.retry.errorCodes = [...new Set(options.retry.errorCodes)];\n }\n else if (is_1.default.number(retry)) {\n options.retry.limit = retry;\n }\n if (is_1.default.undefined(options.retry.maxRetryAfter)) {\n options.retry.maxRetryAfter = Math.min(\n // TypeScript is not smart enough to handle `.filter(x => is.number(x))`.\n // eslint-disable-next-line unicorn/no-fn-reference-in-iterator\n ...[options.timeout.request, options.timeout.connect].filter(is_1.default.number));\n }\n // `options.pagination`\n if (is_1.default.object(options.pagination)) {\n if (defaults) {\n options.pagination = {\n ...defaults.pagination,\n ...options.pagination\n };\n }\n const { pagination } = options;\n if (!is_1.default.function_(pagination.transform)) {\n throw new Error('`options.pagination.transform` must be implemented');\n }\n if (!is_1.default.function_(pagination.shouldContinue)) {\n throw new Error('`options.pagination.shouldContinue` must be implemented');\n }\n if (!is_1.default.function_(pagination.filter)) {\n throw new TypeError('`options.pagination.filter` must be implemented');\n }\n if (!is_1.default.function_(pagination.paginate)) {\n throw new Error('`options.pagination.paginate` must be implemented');\n }\n }\n // JSON mode\n if (options.responseType === 'json' && options.headers.accept === undefined) {\n options.headers.accept = 'application/json';\n }\n return options;\n};\nexports.default = normalizeArguments;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst types_1 = require(\"./types\");\nconst parseBody = (response, responseType, parseJson, encoding) => {\n const { rawBody } = response;\n try {\n if (responseType === 'text') {\n return rawBody.toString(encoding);\n }\n if (responseType === 'json') {\n return rawBody.length === 0 ? '' : parseJson(rawBody.toString());\n }\n if (responseType === 'buffer') {\n return rawBody;\n }\n throw new types_1.ParseError({\n message: `Unknown body type '${responseType}'`,\n name: 'Error'\n }, response);\n }\n catch (error) {\n throw new types_1.ParseError(error, response);\n }\n};\nexports.default = parseBody;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancelError = exports.ParseError = void 0;\nconst core_1 = require(\"../core\");\n/**\nAn error to be thrown when server response code is 2xx, and parsing body fails.\nIncludes a `response` property.\n*/\nclass ParseError extends core_1.RequestError {\n constructor(error, response) {\n const { options } = response.request;\n super(`${error.message} in \"${options.url.toString()}\"`, error, response.request);\n this.name = 'ParseError';\n }\n}\nexports.ParseError = ParseError;\n/**\nAn error to be thrown when the request is aborted with `.cancel()`.\n*/\nclass CancelError extends core_1.RequestError {\n constructor(request) {\n super('Promise was canceled', {}, request);\n this.name = 'CancelError';\n }\n get isCanceled() {\n return true;\n }\n}\nexports.CancelError = CancelError;\n__exportStar(require(\"../core\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.retryAfterStatusCodes = void 0;\nexports.retryAfterStatusCodes = new Set([413, 429, 503]);\nconst calculateRetryDelay = ({ attemptCount, retryOptions, error, retryAfter }) => {\n if (attemptCount > retryOptions.limit) {\n return 0;\n }\n const hasMethod = retryOptions.methods.includes(error.options.method);\n const hasErrorCode = retryOptions.errorCodes.includes(error.code);\n const hasStatusCode = error.response && retryOptions.statusCodes.includes(error.response.statusCode);\n if (!hasMethod || (!hasErrorCode && !hasStatusCode)) {\n return 0;\n }\n if (error.response) {\n if (retryAfter) {\n if (retryOptions.maxRetryAfter === undefined || retryAfter > retryOptions.maxRetryAfter) {\n return 0;\n }\n return retryAfter;\n }\n if (error.response.statusCode === 413) {\n return 0;\n }\n }\n const noise = Math.random() * 100;\n return ((2 ** (attemptCount - 1)) * 1000) + noise;\n};\nexports.default = calculateRetryDelay;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.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;\nconst util_1 = require(\"util\");\nconst stream_1 = require(\"stream\");\nconst fs_1 = require(\"fs\");\nconst url_1 = require(\"url\");\nconst http = require(\"http\");\nconst http_1 = require(\"http\");\nconst https = require(\"https\");\nconst http_timer_1 = require(\"@szmarczak/http-timer\");\nconst cacheable_lookup_1 = require(\"cacheable-lookup\");\nconst CacheableRequest = require(\"cacheable-request\");\nconst decompressResponse = require(\"decompress-response\");\n// @ts-expect-error Missing types\nconst http2wrapper = require(\"http2-wrapper\");\nconst lowercaseKeys = require(\"lowercase-keys\");\nconst is_1 = require(\"@sindresorhus/is\");\nconst get_body_size_1 = require(\"./utils/get-body-size\");\nconst is_form_data_1 = require(\"./utils/is-form-data\");\nconst proxy_events_1 = require(\"./utils/proxy-events\");\nconst timed_out_1 = require(\"./utils/timed-out\");\nconst url_to_options_1 = require(\"./utils/url-to-options\");\nconst options_to_url_1 = require(\"./utils/options-to-url\");\nconst weakable_map_1 = require(\"./utils/weakable-map\");\nconst get_buffer_1 = require(\"./utils/get-buffer\");\nconst dns_ip_version_1 = require(\"./utils/dns-ip-version\");\nconst is_response_ok_1 = require(\"./utils/is-response-ok\");\nconst deprecation_warning_1 = require(\"../utils/deprecation-warning\");\nconst normalize_arguments_1 = require(\"../as-promise/normalize-arguments\");\nconst calculate_retry_delay_1 = require(\"./calculate-retry-delay\");\nconst globalDnsCache = new cacheable_lookup_1.default();\nconst kRequest = Symbol('request');\nconst kResponse = Symbol('response');\nconst kResponseSize = Symbol('responseSize');\nconst kDownloadedSize = Symbol('downloadedSize');\nconst kBodySize = Symbol('bodySize');\nconst kUploadedSize = Symbol('uploadedSize');\nconst kServerResponsesPiped = Symbol('serverResponsesPiped');\nconst kUnproxyEvents = Symbol('unproxyEvents');\nconst kIsFromCache = Symbol('isFromCache');\nconst kCancelTimeouts = Symbol('cancelTimeouts');\nconst kStartedReading = Symbol('startedReading');\nconst kStopReading = Symbol('stopReading');\nconst kTriggerRead = Symbol('triggerRead');\nconst kBody = Symbol('body');\nconst kJobs = Symbol('jobs');\nconst kOriginalResponse = Symbol('originalResponse');\nconst kRetryTimeout = Symbol('retryTimeout');\nexports.kIsNormalizedAlready = Symbol('isNormalizedAlready');\nconst supportsBrotli = is_1.default.string(process.versions.brotli);\nexports.withoutBody = new Set(['GET', 'HEAD']);\nexports.knownHookEvents = [\n 'init',\n 'beforeRequest',\n 'beforeRedirect',\n 'beforeError',\n 'beforeRetry',\n // Promise-Only\n 'afterResponse'\n];\nfunction validateSearchParameters(searchParameters) {\n // eslint-disable-next-line guard-for-in\n for (const key in searchParameters) {\n const value = searchParameters[key];\n if (!is_1.default.string(value) && !is_1.default.number(value) && !is_1.default.boolean(value) && !is_1.default.null_(value) && !is_1.default.undefined(value)) {\n throw new TypeError(`The \\`searchParams\\` value '${String(value)}' must be a string, number, boolean or null`);\n }\n }\n}\nfunction isClientRequest(clientRequest) {\n return is_1.default.object(clientRequest) && !('statusCode' in clientRequest);\n}\nconst cacheableStore = new weakable_map_1.default();\nconst waitForOpenFile = async (file) => new Promise((resolve, reject) => {\n const onError = (error) => {\n reject(error);\n };\n // Node.js 12 has incomplete types\n if (!file.pending) {\n resolve();\n }\n file.once('error', onError);\n file.once('ready', () => {\n file.off('error', onError);\n resolve();\n });\n});\nconst redirectCodes = new Set([300, 301, 302, 303, 304, 307, 308]);\nconst nonEnumerableProperties = [\n 'context',\n 'body',\n 'json',\n 'form'\n];\nexports.setNonEnumerableProperties = (sources, to) => {\n // Non enumerable properties shall not be merged\n const properties = {};\n for (const source of sources) {\n if (!source) {\n continue;\n }\n for (const name of nonEnumerableProperties) {\n if (!(name in source)) {\n continue;\n }\n properties[name] = {\n writable: true,\n configurable: true,\n enumerable: false,\n // @ts-expect-error TS doesn't see the check above\n value: source[name]\n };\n }\n }\n Object.defineProperties(to, properties);\n};\n/**\nAn error to be thrown when a request fails.\nContains a `code` property with error class code, like `ECONNREFUSED`.\n*/\nclass RequestError extends Error {\n constructor(message, error, self) {\n var _a;\n super(message);\n Error.captureStackTrace(this, this.constructor);\n this.name = 'RequestError';\n this.code = error.code;\n if (self instanceof Request) {\n Object.defineProperty(this, 'request', {\n enumerable: false,\n value: self\n });\n Object.defineProperty(this, 'response', {\n enumerable: false,\n value: self[kResponse]\n });\n Object.defineProperty(this, 'options', {\n // This fails because of TS 3.7.2 useDefineForClassFields\n // Ref: https://github.com/microsoft/TypeScript/issues/34972\n enumerable: false,\n value: self.options\n });\n }\n else {\n Object.defineProperty(this, 'options', {\n // This fails because of TS 3.7.2 useDefineForClassFields\n // Ref: https://github.com/microsoft/TypeScript/issues/34972\n enumerable: false,\n value: self\n });\n }\n this.timings = (_a = this.request) === null || _a === void 0 ? void 0 : _a.timings;\n // Recover the original stacktrace\n if (is_1.default.string(error.stack) && is_1.default.string(this.stack)) {\n const indexOfMessage = this.stack.indexOf(this.message) + this.message.length;\n const thisStackTrace = this.stack.slice(indexOfMessage).split('\\n').reverse();\n const errorStackTrace = error.stack.slice(error.stack.indexOf(error.message) + error.message.length).split('\\n').reverse();\n // Remove duplicated traces\n while (errorStackTrace.length !== 0 && errorStackTrace[0] === thisStackTrace[0]) {\n thisStackTrace.shift();\n }\n this.stack = `${this.stack.slice(0, indexOfMessage)}${thisStackTrace.reverse().join('\\n')}${errorStackTrace.reverse().join('\\n')}`;\n }\n }\n}\nexports.RequestError = RequestError;\n/**\nAn error to be thrown when the server redirects you more than ten times.\nIncludes a `response` property.\n*/\nclass MaxRedirectsError extends RequestError {\n constructor(request) {\n super(`Redirected ${request.options.maxRedirects} times. Aborting.`, {}, request);\n this.name = 'MaxRedirectsError';\n }\n}\nexports.MaxRedirectsError = MaxRedirectsError;\n/**\nAn error to be thrown when the server response code is not 2xx nor 3xx if `options.followRedirect` is `true`, but always except for 304.\nIncludes a `response` property.\n*/\nclass HTTPError extends RequestError {\n constructor(response) {\n super(`Response code ${response.statusCode} (${response.statusMessage})`, {}, response.request);\n this.name = 'HTTPError';\n }\n}\nexports.HTTPError = HTTPError;\n/**\nAn error to be thrown when a cache method fails.\nFor example, if the database goes down or there's a filesystem error.\n*/\nclass CacheError extends RequestError {\n constructor(error, request) {\n super(error.message, error, request);\n this.name = 'CacheError';\n }\n}\nexports.CacheError = CacheError;\n/**\nAn error to be thrown when the request body is a stream and an error occurs while reading from that stream.\n*/\nclass UploadError extends RequestError {\n constructor(error, request) {\n super(error.message, error, request);\n this.name = 'UploadError';\n }\n}\nexports.UploadError = UploadError;\n/**\nAn error to be thrown when the request is aborted due to a timeout.\nIncludes an `event` and `timings` property.\n*/\nclass TimeoutError extends RequestError {\n constructor(error, timings, request) {\n super(error.message, error, request);\n this.name = 'TimeoutError';\n this.event = error.event;\n this.timings = timings;\n }\n}\nexports.TimeoutError = TimeoutError;\n/**\nAn error to be thrown when reading from response stream fails.\n*/\nclass ReadError extends RequestError {\n constructor(error, request) {\n super(error.message, error, request);\n this.name = 'ReadError';\n }\n}\nexports.ReadError = ReadError;\n/**\nAn error to be thrown when given an unsupported protocol.\n*/\nclass UnsupportedProtocolError extends RequestError {\n constructor(options) {\n super(`Unsupported protocol \"${options.url.protocol}\"`, {}, options);\n this.name = 'UnsupportedProtocolError';\n }\n}\nexports.UnsupportedProtocolError = UnsupportedProtocolError;\nconst proxiedRequestEvents = [\n 'socket',\n 'connect',\n 'continue',\n 'information',\n 'upgrade',\n 'timeout'\n];\nclass Request extends stream_1.Duplex {\n constructor(url, options = {}, defaults) {\n super({\n // This must be false, to enable throwing after destroy\n // It is used for retry logic in Promise API\n autoDestroy: false,\n // It needs to be zero because we're just proxying the data to another stream\n highWaterMark: 0\n });\n this[kDownloadedSize] = 0;\n this[kUploadedSize] = 0;\n this.requestInitialized = false;\n this[kServerResponsesPiped] = new Set();\n this.redirects = [];\n this[kStopReading] = false;\n this[kTriggerRead] = false;\n this[kJobs] = [];\n this.retryCount = 0;\n // TODO: Remove this when targeting Node.js >= 12\n this._progressCallbacks = [];\n const unlockWrite = () => this._unlockWrite();\n const lockWrite = () => this._lockWrite();\n this.on('pipe', (source) => {\n source.prependListener('data', unlockWrite);\n source.on('data', lockWrite);\n source.prependListener('end', unlockWrite);\n source.on('end', lockWrite);\n });\n this.on('unpipe', (source) => {\n source.off('data', unlockWrite);\n source.off('data', lockWrite);\n source.off('end', unlockWrite);\n source.off('end', lockWrite);\n });\n this.on('pipe', source => {\n if (source instanceof http_1.IncomingMessage) {\n this.options.headers = {\n ...source.headers,\n ...this.options.headers\n };\n }\n });\n const { json, body, form } = options;\n if (json || body || form) {\n this._lockWrite();\n }\n if (exports.kIsNormalizedAlready in options) {\n this.options = options;\n }\n else {\n try {\n // @ts-expect-error Common TypeScript bug saying that `this.constructor` is not accessible\n this.options = this.constructor.normalizeArguments(url, options, defaults);\n }\n catch (error) {\n // TODO: Move this to `_destroy()`\n if (is_1.default.nodeStream(options.body)) {\n options.body.destroy();\n }\n this.destroy(error);\n return;\n }\n }\n (async () => {\n var _a;\n try {\n if (this.options.body instanceof fs_1.ReadStream) {\n await waitForOpenFile(this.options.body);\n }\n const { url: normalizedURL } = this.options;\n if (!normalizedURL) {\n throw new TypeError('Missing `url` property');\n }\n this.requestUrl = normalizedURL.toString();\n decodeURI(this.requestUrl);\n await this._finalizeBody();\n await this._makeRequest();\n if (this.destroyed) {\n (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.destroy();\n return;\n }\n // Queued writes etc.\n for (const job of this[kJobs]) {\n job();\n }\n // Prevent memory leak\n this[kJobs].length = 0;\n this.requestInitialized = true;\n }\n catch (error) {\n if (error instanceof RequestError) {\n this._beforeError(error);\n return;\n }\n // This is a workaround for https://github.com/nodejs/node/issues/33335\n if (!this.destroyed) {\n this.destroy(error);\n }\n }\n })();\n }\n static normalizeArguments(url, options, defaults) {\n var _a, _b, _c, _d, _e;\n const rawOptions = options;\n if (is_1.default.object(url) && !is_1.default.urlInstance(url)) {\n options = { ...defaults, ...url, ...options };\n }\n else {\n if (url && options && options.url !== undefined) {\n throw new TypeError('The `url` option is mutually exclusive with the `input` argument');\n }\n options = { ...defaults, ...options };\n if (url !== undefined) {\n options.url = url;\n }\n if (is_1.default.urlInstance(options.url)) {\n options.url = new url_1.URL(options.url.toString());\n }\n }\n // TODO: Deprecate URL options in Got 12.\n // Support extend-specific options\n if (options.cache === false) {\n options.cache = undefined;\n }\n if (options.dnsCache === false) {\n options.dnsCache = undefined;\n }\n // Nice type assertions\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.method);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.headers);\n is_1.assert.any([is_1.default.string, is_1.default.urlInstance, is_1.default.undefined], options.prefixUrl);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.cookieJar);\n is_1.assert.any([is_1.default.object, is_1.default.string, is_1.default.undefined], options.searchParams);\n is_1.assert.any([is_1.default.object, is_1.default.string, is_1.default.undefined], options.cache);\n is_1.assert.any([is_1.default.object, is_1.default.number, is_1.default.undefined], options.timeout);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.context);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.hooks);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.decompress);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.ignoreInvalidCookies);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.followRedirect);\n is_1.assert.any([is_1.default.number, is_1.default.undefined], options.maxRedirects);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.throwHttpErrors);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.http2);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.allowGetBody);\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.localAddress);\n is_1.assert.any([dns_ip_version_1.isDnsLookupIpVersion, is_1.default.undefined], options.dnsLookupIpVersion);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.https);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.rejectUnauthorized);\n if (options.https) {\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.https.rejectUnauthorized);\n is_1.assert.any([is_1.default.function_, is_1.default.undefined], options.https.checkServerIdentity);\n is_1.assert.any([is_1.default.string, is_1.default.object, is_1.default.array, is_1.default.undefined], options.https.certificateAuthority);\n is_1.assert.any([is_1.default.string, is_1.default.object, is_1.default.array, is_1.default.undefined], options.https.key);\n is_1.assert.any([is_1.default.string, is_1.default.object, is_1.default.array, is_1.default.undefined], options.https.certificate);\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.https.passphrase);\n is_1.assert.any([is_1.default.string, is_1.default.buffer, is_1.default.array, is_1.default.undefined], options.https.pfx);\n }\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.cacheOptions);\n // `options.method`\n if (is_1.default.string(options.method)) {\n options.method = options.method.toUpperCase();\n }\n else {\n options.method = 'GET';\n }\n // `options.headers`\n if (options.headers === (defaults === null || defaults === void 0 ? void 0 : defaults.headers)) {\n options.headers = { ...options.headers };\n }\n else {\n options.headers = lowercaseKeys({ ...(defaults === null || defaults === void 0 ? void 0 : defaults.headers), ...options.headers });\n }\n // Disallow legacy `url.Url`\n if ('slashes' in options) {\n throw new TypeError('The legacy `url.Url` has been deprecated. Use `URL` instead.');\n }\n // `options.auth`\n if ('auth' in options) {\n throw new TypeError('Parameter `auth` is deprecated. Use `username` / `password` instead.');\n }\n // `options.searchParams`\n if ('searchParams' in options) {\n if (options.searchParams && options.searchParams !== (defaults === null || defaults === void 0 ? void 0 : defaults.searchParams)) {\n let searchParameters;\n if (is_1.default.string(options.searchParams) || (options.searchParams instanceof url_1.URLSearchParams)) {\n searchParameters = new url_1.URLSearchParams(options.searchParams);\n }\n else {\n validateSearchParameters(options.searchParams);\n searchParameters = new url_1.URLSearchParams();\n // eslint-disable-next-line guard-for-in\n for (const key in options.searchParams) {\n const value = options.searchParams[key];\n if (value === null) {\n searchParameters.append(key, '');\n }\n else if (value !== undefined) {\n searchParameters.append(key, value);\n }\n }\n }\n // `normalizeArguments()` is also used to merge options\n (_a = defaults === null || defaults === void 0 ? void 0 : defaults.searchParams) === null || _a === void 0 ? void 0 : _a.forEach((value, key) => {\n // Only use default if one isn't already defined\n if (!searchParameters.has(key)) {\n searchParameters.append(key, value);\n }\n });\n options.searchParams = searchParameters;\n }\n }\n // `options.username` & `options.password`\n options.username = (_b = options.username) !== null && _b !== void 0 ? _b : '';\n options.password = (_c = options.password) !== null && _c !== void 0 ? _c : '';\n // `options.prefixUrl` & `options.url`\n if (is_1.default.undefined(options.prefixUrl)) {\n options.prefixUrl = (_d = defaults === null || defaults === void 0 ? void 0 : defaults.prefixUrl) !== null && _d !== void 0 ? _d : '';\n }\n else {\n options.prefixUrl = options.prefixUrl.toString();\n if (options.prefixUrl !== '' && !options.prefixUrl.endsWith('/')) {\n options.prefixUrl += '/';\n }\n }\n if (is_1.default.string(options.url)) {\n if (options.url.startsWith('/')) {\n throw new Error('`input` must not start with a slash when using `prefixUrl`');\n }\n options.url = options_to_url_1.default(options.prefixUrl + options.url, options);\n }\n else if ((is_1.default.undefined(options.url) && options.prefixUrl !== '') || options.protocol) {\n options.url = options_to_url_1.default(options.prefixUrl, options);\n }\n if (options.url) {\n if ('port' in options) {\n delete options.port;\n }\n // Make it possible to change `options.prefixUrl`\n let { prefixUrl } = options;\n Object.defineProperty(options, 'prefixUrl', {\n set: (value) => {\n const url = options.url;\n if (!url.href.startsWith(value)) {\n throw new Error(`Cannot change \\`prefixUrl\\` from ${prefixUrl} to ${value}: ${url.href}`);\n }\n options.url = new url_1.URL(value + url.href.slice(prefixUrl.length));\n prefixUrl = value;\n },\n get: () => prefixUrl\n });\n // Support UNIX sockets\n let { protocol } = options.url;\n if (protocol === 'unix:') {\n protocol = 'http:';\n options.url = new url_1.URL(`http://unix${options.url.pathname}${options.url.search}`);\n }\n // Set search params\n if (options.searchParams) {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n options.url.search = options.searchParams.toString();\n }\n // Protocol check\n if (protocol !== 'http:' && protocol !== 'https:') {\n throw new UnsupportedProtocolError(options);\n }\n // Update `username`\n if (options.username === '') {\n options.username = options.url.username;\n }\n else {\n options.url.username = options.username;\n }\n // Update `password`\n if (options.password === '') {\n options.password = options.url.password;\n }\n else {\n options.url.password = options.password;\n }\n }\n // `options.cookieJar`\n const { cookieJar } = options;\n if (cookieJar) {\n let { setCookie, getCookieString } = cookieJar;\n is_1.assert.function_(setCookie);\n is_1.assert.function_(getCookieString);\n /* istanbul ignore next: Horrible `tough-cookie` v3 check */\n if (setCookie.length === 4 && getCookieString.length === 0) {\n setCookie = util_1.promisify(setCookie.bind(options.cookieJar));\n getCookieString = util_1.promisify(getCookieString.bind(options.cookieJar));\n options.cookieJar = {\n setCookie,\n getCookieString: getCookieString\n };\n }\n }\n // `options.cache`\n const { cache } = options;\n if (cache) {\n if (!cacheableStore.has(cache)) {\n cacheableStore.set(cache, new CacheableRequest(((requestOptions, handler) => {\n const result = requestOptions[kRequest](requestOptions, handler);\n // TODO: remove this when `cacheable-request` supports async request functions.\n if (is_1.default.promise(result)) {\n // @ts-expect-error\n // We only need to implement the error handler in order to support HTTP2 caching.\n // The result will be a promise anyway.\n result.once = (event, handler) => {\n if (event === 'error') {\n result.catch(handler);\n }\n else if (event === 'abort') {\n // The empty catch is needed here in case when\n // it rejects before it's `await`ed in `_makeRequest`.\n (async () => {\n try {\n const request = (await result);\n request.once('abort', handler);\n }\n catch (_a) { }\n })();\n }\n else {\n /* istanbul ignore next: safety check */\n throw new Error(`Unknown HTTP2 promise event: ${event}`);\n }\n return result;\n };\n }\n return result;\n }), cache));\n }\n }\n // `options.cacheOptions`\n options.cacheOptions = { ...options.cacheOptions };\n // `options.dnsCache`\n if (options.dnsCache === true) {\n options.dnsCache = globalDnsCache;\n }\n else if (!is_1.default.undefined(options.dnsCache) && !options.dnsCache.lookup) {\n throw new TypeError(`Parameter \\`dnsCache\\` must be a CacheableLookup instance or a boolean, got ${is_1.default(options.dnsCache)}`);\n }\n // `options.timeout`\n if (is_1.default.number(options.timeout)) {\n options.timeout = { request: options.timeout };\n }\n else if (defaults && options.timeout !== defaults.timeout) {\n options.timeout = {\n ...defaults.timeout,\n ...options.timeout\n };\n }\n else {\n options.timeout = { ...options.timeout };\n }\n // `options.context`\n if (!options.context) {\n options.context = {};\n }\n // `options.hooks`\n const areHooksDefault = options.hooks === (defaults === null || defaults === void 0 ? void 0 : defaults.hooks);\n options.hooks = { ...options.hooks };\n for (const event of exports.knownHookEvents) {\n if (event in options.hooks) {\n if (is_1.default.array(options.hooks[event])) {\n // See https://github.com/microsoft/TypeScript/issues/31445#issuecomment-576929044\n options.hooks[event] = [...options.hooks[event]];\n }\n else {\n throw new TypeError(`Parameter \\`${event}\\` must be an Array, got ${is_1.default(options.hooks[event])}`);\n }\n }\n else {\n options.hooks[event] = [];\n }\n }\n if (defaults && !areHooksDefault) {\n for (const event of exports.knownHookEvents) {\n const defaultHooks = defaults.hooks[event];\n if (defaultHooks.length > 0) {\n // See https://github.com/microsoft/TypeScript/issues/31445#issuecomment-576929044\n options.hooks[event] = [\n ...defaults.hooks[event],\n ...options.hooks[event]\n ];\n }\n }\n }\n // DNS options\n if ('family' in options) {\n deprecation_warning_1.default('\"options.family\" was never documented, please use \"options.dnsLookupIpVersion\"');\n }\n // HTTPS options\n if (defaults === null || defaults === void 0 ? void 0 : defaults.https) {\n options.https = { ...defaults.https, ...options.https };\n }\n if ('rejectUnauthorized' in options) {\n deprecation_warning_1.default('\"options.rejectUnauthorized\" is now deprecated, please use \"options.https.rejectUnauthorized\"');\n }\n if ('checkServerIdentity' in options) {\n deprecation_warning_1.default('\"options.checkServerIdentity\" was never documented, please use \"options.https.checkServerIdentity\"');\n }\n if ('ca' in options) {\n deprecation_warning_1.default('\"options.ca\" was never documented, please use \"options.https.certificateAuthority\"');\n }\n if ('key' in options) {\n deprecation_warning_1.default('\"options.key\" was never documented, please use \"options.https.key\"');\n }\n if ('cert' in options) {\n deprecation_warning_1.default('\"options.cert\" was never documented, please use \"options.https.certificate\"');\n }\n if ('passphrase' in options) {\n deprecation_warning_1.default('\"options.passphrase\" was never documented, please use \"options.https.passphrase\"');\n }\n if ('pfx' in options) {\n deprecation_warning_1.default('\"options.pfx\" was never documented, please use \"options.https.pfx\"');\n }\n // Other options\n if ('followRedirects' in options) {\n throw new TypeError('The `followRedirects` option does not exist. Use `followRedirect` instead.');\n }\n if (options.agent) {\n for (const key in options.agent) {\n if (key !== 'http' && key !== 'https' && key !== 'http2') {\n throw new TypeError(`Expected the \\`options.agent\\` properties to be \\`http\\`, \\`https\\` or \\`http2\\`, got \\`${key}\\``);\n }\n }\n }\n options.maxRedirects = (_e = options.maxRedirects) !== null && _e !== void 0 ? _e : 0;\n // Set non-enumerable properties\n exports.setNonEnumerableProperties([defaults, rawOptions], options);\n return normalize_arguments_1.default(options, defaults);\n }\n _lockWrite() {\n const onLockedWrite = () => {\n throw new TypeError('The payload has been already provided');\n };\n this.write = onLockedWrite;\n this.end = onLockedWrite;\n }\n _unlockWrite() {\n this.write = super.write;\n this.end = super.end;\n }\n async _finalizeBody() {\n const { options } = this;\n const { headers } = options;\n const isForm = !is_1.default.undefined(options.form);\n const isJSON = !is_1.default.undefined(options.json);\n const isBody = !is_1.default.undefined(options.body);\n const hasPayload = isForm || isJSON || isBody;\n const cannotHaveBody = exports.withoutBody.has(options.method) && !(options.method === 'GET' && options.allowGetBody);\n this._cannotHaveBody = cannotHaveBody;\n if (hasPayload) {\n if (cannotHaveBody) {\n throw new TypeError(`The \\`${options.method}\\` method cannot be used with a body`);\n }\n if ([isBody, isForm, isJSON].filter(isTrue => isTrue).length > 1) {\n throw new TypeError('The `body`, `json` and `form` options are mutually exclusive');\n }\n if (isBody &&\n !(options.body instanceof stream_1.Readable) &&\n !is_1.default.string(options.body) &&\n !is_1.default.buffer(options.body) &&\n !is_form_data_1.default(options.body)) {\n throw new TypeError('The `body` option must be a stream.Readable, string or Buffer');\n }\n if (isForm && !is_1.default.object(options.form)) {\n throw new TypeError('The `form` option must be an Object');\n }\n {\n // Serialize body\n const noContentType = !is_1.default.string(headers['content-type']);\n if (isBody) {\n // Special case for https://github.com/form-data/form-data\n if (is_form_data_1.default(options.body) && noContentType) {\n headers['content-type'] = `multipart/form-data; boundary=${options.body.getBoundary()}`;\n }\n this[kBody] = options.body;\n }\n else if (isForm) {\n if (noContentType) {\n headers['content-type'] = 'application/x-www-form-urlencoded';\n }\n this[kBody] = (new url_1.URLSearchParams(options.form)).toString();\n }\n else {\n if (noContentType) {\n headers['content-type'] = 'application/json';\n }\n this[kBody] = options.stringifyJson(options.json);\n }\n const uploadBodySize = await get_body_size_1.default(this[kBody], options.headers);\n // See https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD send a Content-Length in a request message when\n // no Transfer-Encoding is sent and the request method defines a meaning\n // for an enclosed payload body. For example, a Content-Length header\n // field is normally sent in a POST request even when the value is 0\n // (indicating an empty payload body). A user agent SHOULD NOT send a\n // Content-Length header field when the request message does not contain\n // a payload body and the method semantics do not anticipate such a\n // body.\n if (is_1.default.undefined(headers['content-length']) && is_1.default.undefined(headers['transfer-encoding'])) {\n if (!cannotHaveBody && !is_1.default.undefined(uploadBodySize)) {\n headers['content-length'] = String(uploadBodySize);\n }\n }\n }\n }\n else if (cannotHaveBody) {\n this._lockWrite();\n }\n else {\n this._unlockWrite();\n }\n this[kBodySize] = Number(headers['content-length']) || undefined;\n }\n async _onResponseBase(response) {\n const { options } = this;\n const { url } = options;\n this[kOriginalResponse] = response;\n if (options.decompress) {\n response = decompressResponse(response);\n }\n const statusCode = response.statusCode;\n const typedResponse = response;\n typedResponse.statusMessage = typedResponse.statusMessage ? typedResponse.statusMessage : http.STATUS_CODES[statusCode];\n typedResponse.url = options.url.toString();\n typedResponse.requestUrl = this.requestUrl;\n typedResponse.redirectUrls = this.redirects;\n typedResponse.request = this;\n typedResponse.isFromCache = response.fromCache || false;\n typedResponse.ip = this.ip;\n typedResponse.retryCount = this.retryCount;\n this[kIsFromCache] = typedResponse.isFromCache;\n this[kResponseSize] = Number(response.headers['content-length']) || undefined;\n this[kResponse] = response;\n response.once('end', () => {\n this[kResponseSize] = this[kDownloadedSize];\n this.emit('downloadProgress', this.downloadProgress);\n });\n response.once('error', (error) => {\n // Force clean-up, because some packages don't do this.\n // TODO: Fix decompress-response\n response.destroy();\n this._beforeError(new ReadError(error, this));\n });\n response.once('aborted', () => {\n this._beforeError(new ReadError({\n name: 'Error',\n message: 'The server aborted pending request',\n code: 'ECONNRESET'\n }, this));\n });\n this.emit('downloadProgress', this.downloadProgress);\n const rawCookies = response.headers['set-cookie'];\n if (is_1.default.object(options.cookieJar) && rawCookies) {\n let promises = rawCookies.map(async (rawCookie) => options.cookieJar.setCookie(rawCookie, url.toString()));\n if (options.ignoreInvalidCookies) {\n promises = promises.map(async (p) => p.catch(() => { }));\n }\n try {\n await Promise.all(promises);\n }\n catch (error) {\n this._beforeError(error);\n return;\n }\n }\n if (options.followRedirect && response.headers.location && redirectCodes.has(statusCode)) {\n // We're being redirected, we don't care about the response.\n // It'd be best to abort the request, but we can't because\n // we would have to sacrifice the TCP connection. We don't want that.\n response.resume();\n if (this[kRequest]) {\n this[kCancelTimeouts]();\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this[kRequest];\n this[kUnproxyEvents]();\n }\n const shouldBeGet = statusCode === 303 && options.method !== 'GET' && options.method !== 'HEAD';\n if (shouldBeGet || !options.methodRewriting) {\n // Server responded with \"see other\", indicating that the resource exists at another location,\n // and the client should request it from that location via GET or HEAD.\n options.method = 'GET';\n if ('body' in options) {\n delete options.body;\n }\n if ('json' in options) {\n delete options.json;\n }\n if ('form' in options) {\n delete options.form;\n }\n this[kBody] = undefined;\n delete options.headers['content-length'];\n }\n if (this.redirects.length >= options.maxRedirects) {\n this._beforeError(new MaxRedirectsError(this));\n return;\n }\n try {\n // Do not remove. See https://github.com/sindresorhus/got/pull/214\n const redirectBuffer = Buffer.from(response.headers.location, 'binary').toString();\n // Handles invalid URLs. See https://github.com/sindresorhus/got/issues/604\n const redirectUrl = new url_1.URL(redirectBuffer, url);\n const redirectString = redirectUrl.toString();\n decodeURI(redirectString);\n // Redirecting to a different site, clear sensitive data.\n if (redirectUrl.hostname !== url.hostname || redirectUrl.port !== url.port) {\n if ('host' in options.headers) {\n delete options.headers.host;\n }\n if ('cookie' in options.headers) {\n delete options.headers.cookie;\n }\n if ('authorization' in options.headers) {\n delete options.headers.authorization;\n }\n if (options.username || options.password) {\n options.username = '';\n options.password = '';\n }\n }\n else {\n redirectUrl.username = options.username;\n redirectUrl.password = options.password;\n }\n this.redirects.push(redirectString);\n options.url = redirectUrl;\n for (const hook of options.hooks.beforeRedirect) {\n // eslint-disable-next-line no-await-in-loop\n await hook(options, typedResponse);\n }\n this.emit('redirect', typedResponse, options);\n await this._makeRequest();\n }\n catch (error) {\n this._beforeError(error);\n return;\n }\n return;\n }\n if (options.isStream && options.throwHttpErrors && !is_response_ok_1.isResponseOk(typedResponse)) {\n this._beforeError(new HTTPError(typedResponse));\n return;\n }\n response.on('readable', () => {\n if (this[kTriggerRead]) {\n this._read();\n }\n });\n this.on('resume', () => {\n response.resume();\n });\n this.on('pause', () => {\n response.pause();\n });\n response.once('end', () => {\n this.push(null);\n });\n this.emit('response', response);\n for (const destination of this[kServerResponsesPiped]) {\n if (destination.headersSent) {\n continue;\n }\n // eslint-disable-next-line guard-for-in\n for (const key in response.headers) {\n const isAllowed = options.decompress ? key !== 'content-encoding' : true;\n const value = response.headers[key];\n if (isAllowed) {\n destination.setHeader(key, value);\n }\n }\n destination.statusCode = statusCode;\n }\n }\n async _onResponse(response) {\n try {\n await this._onResponseBase(response);\n }\n catch (error) {\n /* istanbul ignore next: better safe than sorry */\n this._beforeError(error);\n }\n }\n _onRequest(request) {\n const { options } = this;\n const { timeout, url } = options;\n http_timer_1.default(request);\n this[kCancelTimeouts] = timed_out_1.default(request, timeout, url);\n const responseEventName = options.cache ? 'cacheableResponse' : 'response';\n request.once(responseEventName, (response) => {\n void this._onResponse(response);\n });\n request.once('error', (error) => {\n var _a;\n // Force clean-up, because some packages (e.g. nock) don't do this.\n request.destroy();\n // Node.js <= 12.18.2 mistakenly emits the response `end` first.\n (_a = request.res) === null || _a === void 0 ? void 0 : _a.removeAllListeners('end');\n error = error instanceof timed_out_1.TimeoutError ? new TimeoutError(error, this.timings, this) : new RequestError(error.message, error, this);\n this._beforeError(error);\n });\n this[kUnproxyEvents] = proxy_events_1.default(request, this, proxiedRequestEvents);\n this[kRequest] = request;\n this.emit('uploadProgress', this.uploadProgress);\n // Send body\n const body = this[kBody];\n const currentRequest = this.redirects.length === 0 ? this : request;\n if (is_1.default.nodeStream(body)) {\n body.pipe(currentRequest);\n body.once('error', (error) => {\n this._beforeError(new UploadError(error, this));\n });\n }\n else {\n this._unlockWrite();\n if (!is_1.default.undefined(body)) {\n this._writeRequest(body, undefined, () => { });\n currentRequest.end();\n this._lockWrite();\n }\n else if (this._cannotHaveBody || this._noPipe) {\n currentRequest.end();\n this._lockWrite();\n }\n }\n this.emit('request', request);\n }\n async _createCacheableRequest(url, options) {\n return new Promise((resolve, reject) => {\n // TODO: Remove `utils/url-to-options.ts` when `cacheable-request` is fixed\n Object.assign(options, url_to_options_1.default(url));\n // `http-cache-semantics` checks this\n // TODO: Fix this ignore.\n // @ts-expect-error\n delete options.url;\n let request;\n // This is ugly\n const cacheRequest = cacheableStore.get(options.cache)(options, async (response) => {\n // TODO: Fix `cacheable-response`\n response._readableState.autoDestroy = false;\n if (request) {\n (await request).emit('cacheableResponse', response);\n }\n resolve(response);\n });\n // Restore options\n options.url = url;\n cacheRequest.once('error', reject);\n cacheRequest.once('request', async (requestOrPromise) => {\n request = requestOrPromise;\n resolve(request);\n });\n });\n }\n async _makeRequest() {\n var _a, _b, _c, _d, _e;\n const { options } = this;\n const { headers } = options;\n for (const key in headers) {\n if (is_1.default.undefined(headers[key])) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete headers[key];\n }\n else if (is_1.default.null_(headers[key])) {\n throw new TypeError(`Use \\`undefined\\` instead of \\`null\\` to delete the \\`${key}\\` header`);\n }\n }\n if (options.decompress && is_1.default.undefined(headers['accept-encoding'])) {\n headers['accept-encoding'] = supportsBrotli ? 'gzip, deflate, br' : 'gzip, deflate';\n }\n // Set cookies\n if (options.cookieJar) {\n const cookieString = await options.cookieJar.getCookieString(options.url.toString());\n if (is_1.default.nonEmptyString(cookieString)) {\n options.headers.cookie = cookieString;\n }\n }\n for (const hook of options.hooks.beforeRequest) {\n // eslint-disable-next-line no-await-in-loop\n const result = await hook(options);\n if (!is_1.default.undefined(result)) {\n // @ts-expect-error Skip the type mismatch to support abstract responses\n options.request = () => result;\n break;\n }\n }\n if (options.body && this[kBody] !== options.body) {\n this[kBody] = options.body;\n }\n const { agent, request, timeout, url } = options;\n if (options.dnsCache && !('lookup' in options)) {\n options.lookup = options.dnsCache.lookup;\n }\n // UNIX sockets\n if (url.hostname === 'unix') {\n const matches = /(?.+?):(?.+)/.exec(`${url.pathname}${url.search}`);\n if (matches === null || matches === void 0 ? void 0 : matches.groups) {\n const { socketPath, path } = matches.groups;\n Object.assign(options, {\n socketPath,\n path,\n host: ''\n });\n }\n }\n const isHttps = url.protocol === 'https:';\n // Fallback function\n let fallbackFn;\n if (options.http2) {\n fallbackFn = http2wrapper.auto;\n }\n else {\n fallbackFn = isHttps ? https.request : http.request;\n }\n const realFn = (_a = options.request) !== null && _a !== void 0 ? _a : fallbackFn;\n // Cache support\n const fn = options.cache ? this._createCacheableRequest : realFn;\n // Pass an agent directly when HTTP2 is disabled\n if (agent && !options.http2) {\n options.agent = agent[isHttps ? 'https' : 'http'];\n }\n // Prepare plain HTTP request options\n options[kRequest] = realFn;\n delete options.request;\n // TODO: Fix this ignore.\n // @ts-expect-error\n delete options.timeout;\n const requestOptions = options;\n requestOptions.shared = (_b = options.cacheOptions) === null || _b === void 0 ? void 0 : _b.shared;\n requestOptions.cacheHeuristic = (_c = options.cacheOptions) === null || _c === void 0 ? void 0 : _c.cacheHeuristic;\n requestOptions.immutableMinTimeToLive = (_d = options.cacheOptions) === null || _d === void 0 ? void 0 : _d.immutableMinTimeToLive;\n requestOptions.ignoreCargoCult = (_e = options.cacheOptions) === null || _e === void 0 ? void 0 : _e.ignoreCargoCult;\n // If `dnsLookupIpVersion` is not present do not override `family`\n if (options.dnsLookupIpVersion !== undefined) {\n try {\n requestOptions.family = dns_ip_version_1.dnsLookupIpVersionToFamily(options.dnsLookupIpVersion);\n }\n catch (_f) {\n throw new Error('Invalid `dnsLookupIpVersion` option value');\n }\n }\n // HTTPS options remapping\n if (options.https) {\n if ('rejectUnauthorized' in options.https) {\n requestOptions.rejectUnauthorized = options.https.rejectUnauthorized;\n }\n if (options.https.checkServerIdentity) {\n requestOptions.checkServerIdentity = options.https.checkServerIdentity;\n }\n if (options.https.certificateAuthority) {\n requestOptions.ca = options.https.certificateAuthority;\n }\n if (options.https.certificate) {\n requestOptions.cert = options.https.certificate;\n }\n if (options.https.key) {\n requestOptions.key = options.https.key;\n }\n if (options.https.passphrase) {\n requestOptions.passphrase = options.https.passphrase;\n }\n if (options.https.pfx) {\n requestOptions.pfx = options.https.pfx;\n }\n }\n try {\n let requestOrResponse = await fn(url, requestOptions);\n if (is_1.default.undefined(requestOrResponse)) {\n requestOrResponse = fallbackFn(url, requestOptions);\n }\n // Restore options\n options.request = request;\n options.timeout = timeout;\n options.agent = agent;\n // HTTPS options restore\n if (options.https) {\n if ('rejectUnauthorized' in options.https) {\n delete requestOptions.rejectUnauthorized;\n }\n if (options.https.checkServerIdentity) {\n // @ts-expect-error - This one will be removed when we remove the alias.\n delete requestOptions.checkServerIdentity;\n }\n if (options.https.certificateAuthority) {\n delete requestOptions.ca;\n }\n if (options.https.certificate) {\n delete requestOptions.cert;\n }\n if (options.https.key) {\n delete requestOptions.key;\n }\n if (options.https.passphrase) {\n delete requestOptions.passphrase;\n }\n if (options.https.pfx) {\n delete requestOptions.pfx;\n }\n }\n if (isClientRequest(requestOrResponse)) {\n this._onRequest(requestOrResponse);\n // Emit the response after the stream has been ended\n }\n else if (this.writable) {\n this.once('finish', () => {\n void this._onResponse(requestOrResponse);\n });\n this._unlockWrite();\n this.end();\n this._lockWrite();\n }\n else {\n void this._onResponse(requestOrResponse);\n }\n }\n catch (error) {\n if (error instanceof CacheableRequest.CacheError) {\n throw new CacheError(error, this);\n }\n throw new RequestError(error.message, error, this);\n }\n }\n async _error(error) {\n try {\n for (const hook of this.options.hooks.beforeError) {\n // eslint-disable-next-line no-await-in-loop\n error = await hook(error);\n }\n }\n catch (error_) {\n error = new RequestError(error_.message, error_, this);\n }\n this.destroy(error);\n }\n _beforeError(error) {\n if (this[kStopReading]) {\n return;\n }\n const { options } = this;\n const retryCount = this.retryCount + 1;\n this[kStopReading] = true;\n if (!(error instanceof RequestError)) {\n error = new RequestError(error.message, error, this);\n }\n const typedError = error;\n const { response } = typedError;\n void (async () => {\n if (response && !response.body) {\n response.setEncoding(this._readableState.encoding);\n try {\n response.rawBody = await get_buffer_1.default(response);\n response.body = response.rawBody.toString();\n }\n catch (_a) { }\n }\n if (this.listenerCount('retry') !== 0) {\n let backoff;\n try {\n let retryAfter;\n if (response && 'retry-after' in response.headers) {\n retryAfter = Number(response.headers['retry-after']);\n if (Number.isNaN(retryAfter)) {\n retryAfter = Date.parse(response.headers['retry-after']) - Date.now();\n if (retryAfter <= 0) {\n retryAfter = 1;\n }\n }\n else {\n retryAfter *= 1000;\n }\n }\n backoff = await options.retry.calculateDelay({\n attemptCount: retryCount,\n retryOptions: options.retry,\n error: typedError,\n retryAfter,\n computedValue: calculate_retry_delay_1.default({\n attemptCount: retryCount,\n retryOptions: options.retry,\n error: typedError,\n retryAfter,\n computedValue: 0\n })\n });\n }\n catch (error_) {\n void this._error(new RequestError(error_.message, error_, this));\n return;\n }\n if (backoff) {\n const retry = async () => {\n try {\n for (const hook of this.options.hooks.beforeRetry) {\n // eslint-disable-next-line no-await-in-loop\n await hook(this.options, typedError, retryCount);\n }\n }\n catch (error_) {\n void this._error(new RequestError(error_.message, error, this));\n return;\n }\n // Something forced us to abort the retry\n if (this.destroyed) {\n return;\n }\n this.destroy();\n this.emit('retry', retryCount, error);\n };\n this[kRetryTimeout] = setTimeout(retry, backoff);\n return;\n }\n }\n void this._error(typedError);\n })();\n }\n _read() {\n this[kTriggerRead] = true;\n const response = this[kResponse];\n if (response && !this[kStopReading]) {\n // We cannot put this in the `if` above\n // because `.read()` also triggers the `end` event\n if (response.readableLength) {\n this[kTriggerRead] = false;\n }\n let data;\n while ((data = response.read()) !== null) {\n this[kDownloadedSize] += data.length;\n this[kStartedReading] = true;\n const progress = this.downloadProgress;\n if (progress.percent < 1) {\n this.emit('downloadProgress', progress);\n }\n this.push(data);\n }\n }\n }\n // Node.js 12 has incorrect types, so the encoding must be a string\n _write(chunk, encoding, callback) {\n const write = () => {\n this._writeRequest(chunk, encoding, callback);\n };\n if (this.requestInitialized) {\n write();\n }\n else {\n this[kJobs].push(write);\n }\n }\n _writeRequest(chunk, encoding, callback) {\n if (this[kRequest].destroyed) {\n // Probably the `ClientRequest` instance will throw\n return;\n }\n this._progressCallbacks.push(() => {\n this[kUploadedSize] += Buffer.byteLength(chunk, encoding);\n const progress = this.uploadProgress;\n if (progress.percent < 1) {\n this.emit('uploadProgress', progress);\n }\n });\n // TODO: What happens if it's from cache? Then this[kRequest] won't be defined.\n this[kRequest].write(chunk, encoding, (error) => {\n if (!error && this._progressCallbacks.length > 0) {\n this._progressCallbacks.shift()();\n }\n callback(error);\n });\n }\n _final(callback) {\n const endRequest = () => {\n // FIX: Node.js 10 calls the write callback AFTER the end callback!\n while (this._progressCallbacks.length !== 0) {\n this._progressCallbacks.shift()();\n }\n // We need to check if `this[kRequest]` is present,\n // because it isn't when we use cache.\n if (!(kRequest in this)) {\n callback();\n return;\n }\n if (this[kRequest].destroyed) {\n callback();\n return;\n }\n this[kRequest].end((error) => {\n if (!error) {\n this[kBodySize] = this[kUploadedSize];\n this.emit('uploadProgress', this.uploadProgress);\n this[kRequest].emit('upload-complete');\n }\n callback(error);\n });\n };\n if (this.requestInitialized) {\n endRequest();\n }\n else {\n this[kJobs].push(endRequest);\n }\n }\n _destroy(error, callback) {\n var _a;\n this[kStopReading] = true;\n // Prevent further retries\n clearTimeout(this[kRetryTimeout]);\n if (kRequest in this) {\n this[kCancelTimeouts]();\n // TODO: Remove the next `if` when these get fixed:\n // - https://github.com/nodejs/node/issues/32851\n if (!((_a = this[kResponse]) === null || _a === void 0 ? void 0 : _a.complete)) {\n this[kRequest].destroy();\n }\n }\n if (error !== null && !is_1.default.undefined(error) && !(error instanceof RequestError)) {\n error = new RequestError(error.message, error, this);\n }\n callback(error);\n }\n get _isAboutToError() {\n return this[kStopReading];\n }\n /**\n The remote IP address.\n */\n get ip() {\n var _a;\n return (_a = this.socket) === null || _a === void 0 ? void 0 : _a.remoteAddress;\n }\n /**\n Indicates whether the request has been aborted or not.\n */\n get aborted() {\n var _a, _b, _c;\n return ((_b = (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.destroyed) !== null && _b !== void 0 ? _b : this.destroyed) && !((_c = this[kOriginalResponse]) === null || _c === void 0 ? void 0 : _c.complete);\n }\n get socket() {\n var _a, _b;\n return (_b = (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.socket) !== null && _b !== void 0 ? _b : undefined;\n }\n /**\n Progress event for downloading (receiving a response).\n */\n get downloadProgress() {\n let percent;\n if (this[kResponseSize]) {\n percent = this[kDownloadedSize] / this[kResponseSize];\n }\n else if (this[kResponseSize] === this[kDownloadedSize]) {\n percent = 1;\n }\n else {\n percent = 0;\n }\n return {\n percent,\n transferred: this[kDownloadedSize],\n total: this[kResponseSize]\n };\n }\n /**\n Progress event for uploading (sending a request).\n */\n get uploadProgress() {\n let percent;\n if (this[kBodySize]) {\n percent = this[kUploadedSize] / this[kBodySize];\n }\n else if (this[kBodySize] === this[kUploadedSize]) {\n percent = 1;\n }\n else {\n percent = 0;\n }\n return {\n percent,\n transferred: this[kUploadedSize],\n total: this[kBodySize]\n };\n }\n /**\n The object contains the following properties:\n\n - `start` - Time when the request started.\n - `socket` - Time when a socket was assigned to the request.\n - `lookup` - Time when the DNS lookup finished.\n - `connect` - Time when the socket successfully connected.\n - `secureConnect` - Time when the socket securely connected.\n - `upload` - Time when the request finished uploading.\n - `response` - Time when the request fired `response` event.\n - `end` - Time when the response fired `end` event.\n - `error` - Time when the request fired `error` event.\n - `abort` - Time when the request fired `abort` event.\n - `phases`\n - `wait` - `timings.socket - timings.start`\n - `dns` - `timings.lookup - timings.socket`\n - `tcp` - `timings.connect - timings.lookup`\n - `tls` - `timings.secureConnect - timings.connect`\n - `request` - `timings.upload - (timings.secureConnect || timings.connect)`\n - `firstByte` - `timings.response - timings.upload`\n - `download` - `timings.end - timings.response`\n - `total` - `(timings.end || timings.error || timings.abort) - timings.start`\n\n If something has not been measured yet, it will be `undefined`.\n\n __Note__: The time is a `number` representing the milliseconds elapsed since the UNIX epoch.\n */\n get timings() {\n var _a;\n return (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.timings;\n }\n /**\n Whether the response was retrieved from the cache.\n */\n get isFromCache() {\n return this[kIsFromCache];\n }\n pipe(destination, options) {\n if (this[kStartedReading]) {\n throw new Error('Failed to pipe. The response has been emitted already.');\n }\n if (destination instanceof http_1.ServerResponse) {\n this[kServerResponsesPiped].add(destination);\n }\n return super.pipe(destination, options);\n }\n unpipe(destination) {\n if (destination instanceof http_1.ServerResponse) {\n this[kServerResponsesPiped].delete(destination);\n }\n super.unpipe(destination);\n return this;\n }\n}\nexports.default = Request;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.dnsLookupIpVersionToFamily = exports.isDnsLookupIpVersion = void 0;\nconst conversionTable = {\n auto: 0,\n ipv4: 4,\n ipv6: 6\n};\nexports.isDnsLookupIpVersion = (value) => {\n return value in conversionTable;\n};\nexports.dnsLookupIpVersionToFamily = (dnsLookupIpVersion) => {\n if (exports.isDnsLookupIpVersion(dnsLookupIpVersion)) {\n return conversionTable[dnsLookupIpVersion];\n }\n throw new Error('Invalid DNS lookup IP version');\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fs_1 = require(\"fs\");\nconst util_1 = require(\"util\");\nconst is_1 = require(\"@sindresorhus/is\");\nconst is_form_data_1 = require(\"./is-form-data\");\nconst statAsync = util_1.promisify(fs_1.stat);\nexports.default = async (body, headers) => {\n if (headers && 'content-length' in headers) {\n return Number(headers['content-length']);\n }\n if (!body) {\n return 0;\n }\n if (is_1.default.string(body)) {\n return Buffer.byteLength(body);\n }\n if (is_1.default.buffer(body)) {\n return body.length;\n }\n if (is_form_data_1.default(body)) {\n return util_1.promisify(body.getLength.bind(body))();\n }\n if (body instanceof fs_1.ReadStream) {\n const { size } = await statAsync(body.path);\n if (size === 0) {\n return undefined;\n }\n return size;\n }\n return undefined;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// TODO: Update https://github.com/sindresorhus/get-stream\nconst getBuffer = async (stream) => {\n const chunks = [];\n let length = 0;\n for await (const chunk of stream) {\n chunks.push(chunk);\n length += Buffer.byteLength(chunk);\n }\n if (Buffer.isBuffer(chunks[0])) {\n return Buffer.concat(chunks, length);\n }\n return Buffer.from(chunks.join(''));\n};\nexports.default = getBuffer;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nexports.default = (body) => is_1.default.nodeStream(body) && is_1.default.function_(body.getBoundary);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isResponseOk = void 0;\nexports.isResponseOk = (response) => {\n const { statusCode } = response;\n const limitStatusCode = response.request.options.followRedirect ? 299 : 399;\n return (statusCode >= 200 && statusCode <= limitStatusCode) || statusCode === 304;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/* istanbul ignore file: deprecated */\nconst url_1 = require(\"url\");\nconst keys = [\n 'protocol',\n 'host',\n 'hostname',\n 'port',\n 'pathname',\n 'search'\n];\nexports.default = (origin, options) => {\n var _a, _b;\n if (options.path) {\n if (options.pathname) {\n throw new TypeError('Parameters `path` and `pathname` are mutually exclusive.');\n }\n if (options.search) {\n throw new TypeError('Parameters `path` and `search` are mutually exclusive.');\n }\n if (options.searchParams) {\n throw new TypeError('Parameters `path` and `searchParams` are mutually exclusive.');\n }\n }\n if (options.search && options.searchParams) {\n throw new TypeError('Parameters `search` and `searchParams` are mutually exclusive.');\n }\n if (!origin) {\n if (!options.protocol) {\n throw new TypeError('No URL protocol specified');\n }\n origin = `${options.protocol}//${(_b = (_a = options.hostname) !== null && _a !== void 0 ? _a : options.host) !== null && _b !== void 0 ? _b : ''}`;\n }\n const url = new url_1.URL(origin);\n if (options.path) {\n const searchIndex = options.path.indexOf('?');\n if (searchIndex === -1) {\n options.pathname = options.path;\n }\n else {\n options.pathname = options.path.slice(0, searchIndex);\n options.search = options.path.slice(searchIndex + 1);\n }\n delete options.path;\n }\n for (const key of keys) {\n if (options[key]) {\n url[key] = options[key].toString();\n }\n }\n return url;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction default_1(from, to, events) {\n const fns = {};\n for (const event of events) {\n fns[event] = (...args) => {\n to.emit(event, ...args);\n };\n from.on(event, fns[event]);\n }\n return () => {\n for (const event of events) {\n from.off(event, fns[event]);\n }\n };\n}\nexports.default = default_1;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TimeoutError = void 0;\nconst net = require(\"net\");\nconst unhandle_1 = require(\"./unhandle\");\nconst reentry = Symbol('reentry');\nconst noop = () => { };\nclass TimeoutError extends Error {\n constructor(threshold, event) {\n super(`Timeout awaiting '${event}' for ${threshold}ms`);\n this.event = event;\n this.name = 'TimeoutError';\n this.code = 'ETIMEDOUT';\n }\n}\nexports.TimeoutError = TimeoutError;\nexports.default = (request, delays, options) => {\n if (reentry in request) {\n return noop;\n }\n request[reentry] = true;\n const cancelers = [];\n const { once, unhandleAll } = unhandle_1.default();\n const addTimeout = (delay, callback, event) => {\n var _a;\n const timeout = setTimeout(callback, delay, delay, event);\n (_a = timeout.unref) === null || _a === void 0 ? void 0 : _a.call(timeout);\n const cancel = () => {\n clearTimeout(timeout);\n };\n cancelers.push(cancel);\n return cancel;\n };\n const { host, hostname } = options;\n const timeoutHandler = (delay, event) => {\n request.destroy(new TimeoutError(delay, event));\n };\n const cancelTimeouts = () => {\n for (const cancel of cancelers) {\n cancel();\n }\n unhandleAll();\n };\n request.once('error', error => {\n cancelTimeouts();\n // Save original behavior\n /* istanbul ignore next */\n if (request.listenerCount('error') === 0) {\n throw error;\n }\n });\n request.once('close', cancelTimeouts);\n once(request, 'response', (response) => {\n once(response, 'end', cancelTimeouts);\n });\n if (typeof delays.request !== 'undefined') {\n addTimeout(delays.request, timeoutHandler, 'request');\n }\n if (typeof delays.socket !== 'undefined') {\n const socketTimeoutHandler = () => {\n timeoutHandler(delays.socket, 'socket');\n };\n request.setTimeout(delays.socket, socketTimeoutHandler);\n // `request.setTimeout(0)` causes a memory leak.\n // We can just remove the listener and forget about the timer - it's unreffed.\n // See https://github.com/sindresorhus/got/issues/690\n cancelers.push(() => {\n request.removeListener('timeout', socketTimeoutHandler);\n });\n }\n once(request, 'socket', (socket) => {\n var _a;\n const { socketPath } = request;\n /* istanbul ignore next: hard to test */\n if (socket.connecting) {\n const hasPath = Boolean(socketPath !== null && socketPath !== void 0 ? socketPath : net.isIP((_a = hostname !== null && hostname !== void 0 ? hostname : host) !== null && _a !== void 0 ? _a : '') !== 0);\n if (typeof delays.lookup !== 'undefined' && !hasPath && typeof socket.address().address === 'undefined') {\n const cancelTimeout = addTimeout(delays.lookup, timeoutHandler, 'lookup');\n once(socket, 'lookup', cancelTimeout);\n }\n if (typeof delays.connect !== 'undefined') {\n const timeConnect = () => addTimeout(delays.connect, timeoutHandler, 'connect');\n if (hasPath) {\n once(socket, 'connect', timeConnect());\n }\n else {\n once(socket, 'lookup', (error) => {\n if (error === null) {\n once(socket, 'connect', timeConnect());\n }\n });\n }\n }\n if (typeof delays.secureConnect !== 'undefined' && options.protocol === 'https:') {\n once(socket, 'connect', () => {\n const cancelTimeout = addTimeout(delays.secureConnect, timeoutHandler, 'secureConnect');\n once(socket, 'secureConnect', cancelTimeout);\n });\n }\n }\n if (typeof delays.send !== 'undefined') {\n const timeRequest = () => addTimeout(delays.send, timeoutHandler, 'send');\n /* istanbul ignore next: hard to test */\n if (socket.connecting) {\n once(socket, 'connect', () => {\n once(request, 'upload-complete', timeRequest());\n });\n }\n else {\n once(request, 'upload-complete', timeRequest());\n }\n }\n });\n if (typeof delays.response !== 'undefined') {\n once(request, 'upload-complete', () => {\n const cancelTimeout = addTimeout(delays.response, timeoutHandler, 'response');\n once(request, 'response', cancelTimeout);\n });\n }\n return cancelTimeouts;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// When attaching listeners, it's very easy to forget about them.\n// Especially if you do error handling and set timeouts.\n// So instead of checking if it's proper to throw an error on every timeout ever,\n// use this simple tool which will remove all listeners you have attached.\nexports.default = () => {\n const handlers = [];\n return {\n once(origin, event, fn) {\n origin.once(event, fn);\n handlers.push({ origin, event, fn });\n },\n unhandleAll() {\n for (const handler of handlers) {\n const { origin, event, fn } = handler;\n origin.removeListener(event, fn);\n }\n handlers.length = 0;\n }\n };\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nexports.default = (url) => {\n // Cast to URL\n url = url;\n const options = {\n protocol: url.protocol,\n hostname: is_1.default.string(url.hostname) && url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname,\n host: url.host,\n hash: url.hash,\n search: url.search,\n pathname: url.pathname,\n href: url.href,\n path: `${url.pathname || ''}${url.search || ''}`\n };\n if (is_1.default.string(url.port) && url.port.length > 0) {\n options.port = Number(url.port);\n }\n if (url.username || url.password) {\n options.auth = `${url.username || ''}:${url.password || ''}`;\n }\n return options;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass WeakableMap {\n constructor() {\n this.weakMap = new WeakMap();\n this.map = new Map();\n }\n set(key, value) {\n if (typeof key === 'object') {\n this.weakMap.set(key, value);\n }\n else {\n this.map.set(key, value);\n }\n }\n get(key) {\n if (typeof key === 'object') {\n return this.weakMap.get(key);\n }\n return this.map.get(key);\n }\n has(key) {\n if (typeof key === 'object') {\n return this.weakMap.has(key);\n }\n return this.map.has(key);\n }\n}\nexports.default = WeakableMap;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultHandler = void 0;\nconst is_1 = require(\"@sindresorhus/is\");\nconst as_promise_1 = require(\"./as-promise\");\nconst create_rejection_1 = require(\"./as-promise/create-rejection\");\nconst core_1 = require(\"./core\");\nconst deep_freeze_1 = require(\"./utils/deep-freeze\");\nconst errors = {\n RequestError: as_promise_1.RequestError,\n CacheError: as_promise_1.CacheError,\n ReadError: as_promise_1.ReadError,\n HTTPError: as_promise_1.HTTPError,\n MaxRedirectsError: as_promise_1.MaxRedirectsError,\n TimeoutError: as_promise_1.TimeoutError,\n ParseError: as_promise_1.ParseError,\n CancelError: as_promise_1.CancelError,\n UnsupportedProtocolError: as_promise_1.UnsupportedProtocolError,\n UploadError: as_promise_1.UploadError\n};\n// The `delay` package weighs 10KB (!)\nconst delay = async (ms) => new Promise(resolve => {\n setTimeout(resolve, ms);\n});\nconst { normalizeArguments } = core_1.default;\nconst mergeOptions = (...sources) => {\n let mergedOptions;\n for (const source of sources) {\n mergedOptions = normalizeArguments(undefined, source, mergedOptions);\n }\n return mergedOptions;\n};\nconst getPromiseOrStream = (options) => options.isStream ? new core_1.default(undefined, options) : as_promise_1.default(options);\nconst isGotInstance = (value) => ('defaults' in value && 'options' in value.defaults);\nconst aliases = [\n 'get',\n 'post',\n 'put',\n 'patch',\n 'head',\n 'delete'\n];\nexports.defaultHandler = (options, next) => next(options);\nconst callInitHooks = (hooks, options) => {\n if (hooks) {\n for (const hook of hooks) {\n hook(options);\n }\n }\n};\nconst create = (defaults) => {\n // Proxy properties from next handlers\n defaults._rawHandlers = defaults.handlers;\n defaults.handlers = defaults.handlers.map(fn => ((options, next) => {\n // This will be assigned by assigning result\n let root;\n const result = fn(options, newOptions => {\n root = next(newOptions);\n return root;\n });\n if (result !== root && !options.isStream && root) {\n const typedResult = result;\n const { then: promiseThen, catch: promiseCatch, finally: promiseFianlly } = typedResult;\n Object.setPrototypeOf(typedResult, Object.getPrototypeOf(root));\n Object.defineProperties(typedResult, Object.getOwnPropertyDescriptors(root));\n // These should point to the new promise\n // eslint-disable-next-line promise/prefer-await-to-then\n typedResult.then = promiseThen;\n typedResult.catch = promiseCatch;\n typedResult.finally = promiseFianlly;\n }\n return result;\n }));\n // Got interface\n const got = ((url, options = {}, _defaults) => {\n var _a, _b;\n let iteration = 0;\n const iterateHandlers = (newOptions) => {\n return defaults.handlers[iteration++](newOptions, iteration === defaults.handlers.length ? getPromiseOrStream : iterateHandlers);\n };\n // TODO: Remove this in Got 12.\n if (is_1.default.plainObject(url)) {\n const mergedOptions = {\n ...url,\n ...options\n };\n core_1.setNonEnumerableProperties([url, options], mergedOptions);\n options = mergedOptions;\n url = undefined;\n }\n try {\n // Call `init` hooks\n let initHookError;\n try {\n callInitHooks(defaults.options.hooks.init, options);\n callInitHooks((_a = options.hooks) === null || _a === void 0 ? void 0 : _a.init, options);\n }\n catch (error) {\n initHookError = error;\n }\n // Normalize options & call handlers\n const normalizedOptions = normalizeArguments(url, options, _defaults !== null && _defaults !== void 0 ? _defaults : defaults.options);\n normalizedOptions[core_1.kIsNormalizedAlready] = true;\n if (initHookError) {\n throw new as_promise_1.RequestError(initHookError.message, initHookError, normalizedOptions);\n }\n return iterateHandlers(normalizedOptions);\n }\n catch (error) {\n if (options.isStream) {\n throw error;\n }\n else {\n return create_rejection_1.default(error, defaults.options.hooks.beforeError, (_b = options.hooks) === null || _b === void 0 ? void 0 : _b.beforeError);\n }\n }\n });\n got.extend = (...instancesOrOptions) => {\n const optionsArray = [defaults.options];\n let handlers = [...defaults._rawHandlers];\n let isMutableDefaults;\n for (const value of instancesOrOptions) {\n if (isGotInstance(value)) {\n optionsArray.push(value.defaults.options);\n handlers.push(...value.defaults._rawHandlers);\n isMutableDefaults = value.defaults.mutableDefaults;\n }\n else {\n optionsArray.push(value);\n if ('handlers' in value) {\n handlers.push(...value.handlers);\n }\n isMutableDefaults = value.mutableDefaults;\n }\n }\n handlers = handlers.filter(handler => handler !== exports.defaultHandler);\n if (handlers.length === 0) {\n handlers.push(exports.defaultHandler);\n }\n return create({\n options: mergeOptions(...optionsArray),\n handlers,\n mutableDefaults: Boolean(isMutableDefaults)\n });\n };\n // Pagination\n const paginateEach = (async function* (url, options) {\n // TODO: Remove this `@ts-expect-error` when upgrading to TypeScript 4.\n // Error: Argument of type 'Merge> | undefined' is not assignable to parameter of type 'Options | undefined'.\n // @ts-expect-error\n let normalizedOptions = normalizeArguments(url, options, defaults.options);\n normalizedOptions.resolveBodyOnly = false;\n const pagination = normalizedOptions.pagination;\n if (!is_1.default.object(pagination)) {\n throw new TypeError('`options.pagination` must be implemented');\n }\n const all = [];\n let { countLimit } = pagination;\n let numberOfRequests = 0;\n while (numberOfRequests < pagination.requestLimit) {\n if (numberOfRequests !== 0) {\n // eslint-disable-next-line no-await-in-loop\n await delay(pagination.backoff);\n }\n // @ts-expect-error FIXME!\n // TODO: Throw when result is not an instance of Response\n // eslint-disable-next-line no-await-in-loop\n const result = (await got(undefined, undefined, normalizedOptions));\n // eslint-disable-next-line no-await-in-loop\n const parsed = await pagination.transform(result);\n const current = [];\n for (const item of parsed) {\n if (pagination.filter(item, all, current)) {\n if (!pagination.shouldContinue(item, all, current)) {\n return;\n }\n yield item;\n if (pagination.stackAllItems) {\n all.push(item);\n }\n current.push(item);\n if (--countLimit <= 0) {\n return;\n }\n }\n }\n const optionsToMerge = pagination.paginate(result, all, current);\n if (optionsToMerge === false) {\n return;\n }\n if (optionsToMerge === result.request.options) {\n normalizedOptions = result.request.options;\n }\n else if (optionsToMerge !== undefined) {\n normalizedOptions = normalizeArguments(undefined, optionsToMerge, normalizedOptions);\n }\n numberOfRequests++;\n }\n });\n got.paginate = paginateEach;\n got.paginate.all = (async (url, options) => {\n const results = [];\n for await (const item of paginateEach(url, options)) {\n results.push(item);\n }\n return results;\n });\n // For those who like very descriptive names\n got.paginate.each = paginateEach;\n // Stream API\n got.stream = ((url, options) => got(url, { ...options, isStream: true }));\n // Shortcuts\n for (const method of aliases) {\n got[method] = ((url, options) => got(url, { ...options, method }));\n got.stream[method] = ((url, options) => {\n return got(url, { ...options, method, isStream: true });\n });\n }\n Object.assign(got, errors);\n Object.defineProperty(got, 'defaults', {\n value: defaults.mutableDefaults ? defaults : deep_freeze_1.default(defaults),\n writable: defaults.mutableDefaults,\n configurable: defaults.mutableDefaults,\n enumerable: true\n });\n got.mergeOptions = mergeOptions;\n return got;\n};\nexports.default = create;\n__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst url_1 = require(\"url\");\nconst create_1 = require(\"./create\");\nconst defaults = {\n options: {\n method: 'GET',\n retry: {\n limit: 2,\n methods: [\n 'GET',\n 'PUT',\n 'HEAD',\n 'DELETE',\n 'OPTIONS',\n 'TRACE'\n ],\n statusCodes: [\n 408,\n 413,\n 429,\n 500,\n 502,\n 503,\n 504,\n 521,\n 522,\n 524\n ],\n errorCodes: [\n 'ETIMEDOUT',\n 'ECONNRESET',\n 'EADDRINUSE',\n 'ECONNREFUSED',\n 'EPIPE',\n 'ENOTFOUND',\n 'ENETUNREACH',\n 'EAI_AGAIN'\n ],\n maxRetryAfter: undefined,\n calculateDelay: ({ computedValue }) => computedValue\n },\n timeout: {},\n headers: {\n 'user-agent': 'got (https://github.com/sindresorhus/got)'\n },\n hooks: {\n init: [],\n beforeRequest: [],\n beforeRedirect: [],\n beforeRetry: [],\n beforeError: [],\n afterResponse: []\n },\n cache: undefined,\n dnsCache: undefined,\n decompress: true,\n throwHttpErrors: true,\n followRedirect: true,\n isStream: false,\n responseType: 'text',\n resolveBodyOnly: false,\n maxRedirects: 10,\n prefixUrl: '',\n methodRewriting: true,\n ignoreInvalidCookies: false,\n context: {},\n // TODO: Set this to `true` when Got 12 gets released\n http2: false,\n allowGetBody: false,\n https: undefined,\n pagination: {\n transform: (response) => {\n if (response.request.options.responseType === 'json') {\n return response.body;\n }\n return JSON.parse(response.body);\n },\n paginate: response => {\n if (!Reflect.has(response.headers, 'link')) {\n return false;\n }\n const items = response.headers.link.split(',');\n let next;\n for (const item of items) {\n const parsed = item.split(';');\n if (parsed[1].includes('next')) {\n next = parsed[0].trimStart().trim();\n next = next.slice(1, -1);\n break;\n }\n }\n if (next) {\n const options = {\n url: new url_1.URL(next)\n };\n return options;\n }\n return false;\n },\n filter: () => true,\n shouldContinue: () => true,\n countLimit: Infinity,\n backoff: 0,\n requestLimit: 10000,\n stackAllItems: true\n },\n parseJson: (text) => JSON.parse(text),\n stringifyJson: (object) => JSON.stringify(object),\n cacheOptions: {}\n },\n handlers: [create_1.defaultHandler],\n mutableDefaults: false\n};\nconst got = create_1.default(defaults);\nexports.default = got;\n// For CommonJS default export support\nmodule.exports = got;\nmodule.exports.default = got;\nmodule.exports.__esModule = true; // Workaround for TS issue: https://github.com/sindresorhus/got/pull/1267\n__exportStar(require(\"./create\"), exports);\n__exportStar(require(\"./as-promise\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nfunction deepFreeze(object) {\n for (const value of Object.values(object)) {\n if (is_1.default.plainObject(value) || is_1.default.array(value)) {\n deepFreeze(value);\n }\n }\n return Object.freeze(object);\n}\nexports.default = deepFreeze;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst alreadyWarned = new Set();\nexports.default = (message) => {\n if (alreadyWarned.has(message)) {\n return;\n }\n alreadyWarned.add(message);\n // @ts-expect-error Missing types.\n process.emitWarning(`Got: ${message}`, {\n type: 'DeprecationWarning'\n });\n};\n","'use strict';\n// rfc7231 6.1\nconst statusCodeCacheableByDefault = new Set([\n 200,\n 203,\n 204,\n 206,\n 300,\n 301,\n 404,\n 405,\n 410,\n 414,\n 501,\n]);\n\n// This implementation does not understand partial responses (206)\nconst understoodStatuses = new Set([\n 200,\n 203,\n 204,\n 300,\n 301,\n 302,\n 303,\n 307,\n 308,\n 404,\n 405,\n 410,\n 414,\n 501,\n]);\n\nconst errorStatusCodes = new Set([\n 500,\n 502,\n 503, \n 504,\n]);\n\nconst hopByHopHeaders = {\n date: true, // included, because we add Age update Date\n connection: true,\n 'keep-alive': true,\n 'proxy-authenticate': true,\n 'proxy-authorization': true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n};\n\nconst excludedFromRevalidationUpdate = {\n // Since the old body is reused, it doesn't make sense to change properties of the body\n 'content-length': true,\n 'content-encoding': true,\n 'transfer-encoding': true,\n 'content-range': true,\n};\n\nfunction toNumberOrZero(s) {\n const n = parseInt(s, 10);\n return isFinite(n) ? n : 0;\n}\n\n// RFC 5861\nfunction isErrorResponse(response) {\n // consider undefined response as faulty\n if(!response) {\n return true\n }\n return errorStatusCodes.has(response.status);\n}\n\nfunction parseCacheControl(header) {\n const cc = {};\n if (!header) return cc;\n\n // TODO: When there is more than one value present for a given directive (e.g., two Expires header fields, multiple Cache-Control: max-age directives),\n // the directive's value is considered invalid. Caches are encouraged to consider responses that have invalid freshness information to be stale\n const parts = header.trim().split(/\\s*,\\s*/); // TODO: lame parsing\n for (const part of parts) {\n const [k, v] = part.split(/\\s*=\\s*/, 2);\n cc[k] = v === undefined ? true : v.replace(/^\"|\"$/g, ''); // TODO: lame unquoting\n }\n\n return cc;\n}\n\nfunction formatCacheControl(cc) {\n let parts = [];\n for (const k in cc) {\n const v = cc[k];\n parts.push(v === true ? k : k + '=' + v);\n }\n if (!parts.length) {\n return undefined;\n }\n return parts.join(', ');\n}\n\nmodule.exports = class CachePolicy {\n constructor(\n req,\n res,\n {\n shared,\n cacheHeuristic,\n immutableMinTimeToLive,\n ignoreCargoCult,\n _fromObject,\n } = {}\n ) {\n if (_fromObject) {\n this._fromObject(_fromObject);\n return;\n }\n\n if (!res || !res.headers) {\n throw Error('Response headers missing');\n }\n this._assertRequestHasHeaders(req);\n\n this._responseTime = this.now();\n this._isShared = shared !== false;\n this._cacheHeuristic =\n undefined !== cacheHeuristic ? cacheHeuristic : 0.1; // 10% matches IE\n this._immutableMinTtl =\n undefined !== immutableMinTimeToLive\n ? immutableMinTimeToLive\n : 24 * 3600 * 1000;\n\n this._status = 'status' in res ? res.status : 200;\n this._resHeaders = res.headers;\n this._rescc = parseCacheControl(res.headers['cache-control']);\n this._method = 'method' in req ? req.method : 'GET';\n this._url = req.url;\n this._host = req.headers.host;\n this._noAuthorization = !req.headers.authorization;\n this._reqHeaders = res.headers.vary ? req.headers : null; // Don't keep all request headers if they won't be used\n this._reqcc = parseCacheControl(req.headers['cache-control']);\n\n // Assume that if someone uses legacy, non-standard uncecessary options they don't understand caching,\n // so there's no point stricly adhering to the blindly copy&pasted directives.\n if (\n ignoreCargoCult &&\n 'pre-check' in this._rescc &&\n 'post-check' in this._rescc\n ) {\n delete this._rescc['pre-check'];\n delete this._rescc['post-check'];\n delete this._rescc['no-cache'];\n delete this._rescc['no-store'];\n delete this._rescc['must-revalidate'];\n this._resHeaders = Object.assign({}, this._resHeaders, {\n 'cache-control': formatCacheControl(this._rescc),\n });\n delete this._resHeaders.expires;\n delete this._resHeaders.pragma;\n }\n\n // When the Cache-Control header field is not present in a request, caches MUST consider the no-cache request pragma-directive\n // as having the same effect as if \"Cache-Control: no-cache\" were present (see Section 5.2.1).\n if (\n res.headers['cache-control'] == null &&\n /no-cache/.test(res.headers.pragma)\n ) {\n this._rescc['no-cache'] = true;\n }\n }\n\n now() {\n return Date.now();\n }\n\n storable() {\n // The \"no-store\" request directive indicates that a cache MUST NOT store any part of either this request or any response to it.\n return !!(\n !this._reqcc['no-store'] &&\n // A cache MUST NOT store a response to any request, unless:\n // The request method is understood by the cache and defined as being cacheable, and\n ('GET' === this._method ||\n 'HEAD' === this._method ||\n ('POST' === this._method && this._hasExplicitExpiration())) &&\n // the response status code is understood by the cache, and\n understoodStatuses.has(this._status) &&\n // the \"no-store\" cache directive does not appear in request or response header fields, and\n !this._rescc['no-store'] &&\n // the \"private\" response directive does not appear in the response, if the cache is shared, and\n (!this._isShared || !this._rescc.private) &&\n // the Authorization header field does not appear in the request, if the cache is shared,\n (!this._isShared ||\n this._noAuthorization ||\n this._allowsStoringAuthenticated()) &&\n // the response either:\n // contains an Expires header field, or\n (this._resHeaders.expires ||\n // contains a max-age response directive, or\n // contains a s-maxage response directive and the cache is shared, or\n // contains a public response directive.\n this._rescc['max-age'] ||\n (this._isShared && this._rescc['s-maxage']) ||\n this._rescc.public ||\n // has a status code that is defined as cacheable by default\n statusCodeCacheableByDefault.has(this._status))\n );\n }\n\n _hasExplicitExpiration() {\n // 4.2.1 Calculating Freshness Lifetime\n return (\n (this._isShared && this._rescc['s-maxage']) ||\n this._rescc['max-age'] ||\n this._resHeaders.expires\n );\n }\n\n _assertRequestHasHeaders(req) {\n if (!req || !req.headers) {\n throw Error('Request headers missing');\n }\n }\n\n satisfiesWithoutRevalidation(req) {\n this._assertRequestHasHeaders(req);\n\n // When presented with a request, a cache MUST NOT reuse a stored response, unless:\n // the presented request does not contain the no-cache pragma (Section 5.4), nor the no-cache cache directive,\n // unless the stored response is successfully validated (Section 4.3), and\n const requestCC = parseCacheControl(req.headers['cache-control']);\n if (requestCC['no-cache'] || /no-cache/.test(req.headers.pragma)) {\n return false;\n }\n\n if (requestCC['max-age'] && this.age() > requestCC['max-age']) {\n return false;\n }\n\n if (\n requestCC['min-fresh'] &&\n this.timeToLive() < 1000 * requestCC['min-fresh']\n ) {\n return false;\n }\n\n // the stored response is either:\n // fresh, or allowed to be served stale\n if (this.stale()) {\n const allowsStale =\n requestCC['max-stale'] &&\n !this._rescc['must-revalidate'] &&\n (true === requestCC['max-stale'] ||\n requestCC['max-stale'] > this.age() - this.maxAge());\n if (!allowsStale) {\n return false;\n }\n }\n\n return this._requestMatches(req, false);\n }\n\n _requestMatches(req, allowHeadMethod) {\n // The presented effective request URI and that of the stored response match, and\n return (\n (!this._url || this._url === req.url) &&\n this._host === req.headers.host &&\n // the request method associated with the stored response allows it to be used for the presented request, and\n (!req.method ||\n this._method === req.method ||\n (allowHeadMethod && 'HEAD' === req.method)) &&\n // selecting header fields nominated by the stored response (if any) match those presented, and\n this._varyMatches(req)\n );\n }\n\n _allowsStoringAuthenticated() {\n // following Cache-Control response directives (Section 5.2.2) have such an effect: must-revalidate, public, and s-maxage.\n return (\n this._rescc['must-revalidate'] ||\n this._rescc.public ||\n this._rescc['s-maxage']\n );\n }\n\n _varyMatches(req) {\n if (!this._resHeaders.vary) {\n return true;\n }\n\n // A Vary header field-value of \"*\" always fails to match\n if (this._resHeaders.vary === '*') {\n return false;\n }\n\n const fields = this._resHeaders.vary\n .trim()\n .toLowerCase()\n .split(/\\s*,\\s*/);\n for (const name of fields) {\n if (req.headers[name] !== this._reqHeaders[name]) return false;\n }\n return true;\n }\n\n _copyWithoutHopByHopHeaders(inHeaders) {\n const headers = {};\n for (const name in inHeaders) {\n if (hopByHopHeaders[name]) continue;\n headers[name] = inHeaders[name];\n }\n // 9.1. Connection\n if (inHeaders.connection) {\n const tokens = inHeaders.connection.trim().split(/\\s*,\\s*/);\n for (const name of tokens) {\n delete headers[name];\n }\n }\n if (headers.warning) {\n const warnings = headers.warning.split(/,/).filter(warning => {\n return !/^\\s*1[0-9][0-9]/.test(warning);\n });\n if (!warnings.length) {\n delete headers.warning;\n } else {\n headers.warning = warnings.join(',').trim();\n }\n }\n return headers;\n }\n\n responseHeaders() {\n const headers = this._copyWithoutHopByHopHeaders(this._resHeaders);\n const age = this.age();\n\n // A cache SHOULD generate 113 warning if it heuristically chose a freshness\n // lifetime greater than 24 hours and the response's age is greater than 24 hours.\n if (\n age > 3600 * 24 &&\n !this._hasExplicitExpiration() &&\n this.maxAge() > 3600 * 24\n ) {\n headers.warning =\n (headers.warning ? `${headers.warning}, ` : '') +\n '113 - \"rfc7234 5.5.4\"';\n }\n headers.age = `${Math.round(age)}`;\n headers.date = new Date(this.now()).toUTCString();\n return headers;\n }\n\n /**\n * Value of the Date response header or current time if Date was invalid\n * @return timestamp\n */\n date() {\n const serverDate = Date.parse(this._resHeaders.date);\n if (isFinite(serverDate)) {\n return serverDate;\n }\n return this._responseTime;\n }\n\n /**\n * Value of the Age header, in seconds, updated for the current time.\n * May be fractional.\n *\n * @return Number\n */\n age() {\n let age = this._ageValue();\n\n const residentTime = (this.now() - this._responseTime) / 1000;\n return age + residentTime;\n }\n\n _ageValue() {\n return toNumberOrZero(this._resHeaders.age);\n }\n\n /**\n * Value of applicable max-age (or heuristic equivalent) in seconds. This counts since response's `Date`.\n *\n * For an up-to-date value, see `timeToLive()`.\n *\n * @return Number\n */\n maxAge() {\n if (!this.storable() || this._rescc['no-cache']) {\n return 0;\n }\n\n // Shared responses with cookies are cacheable according to the RFC, but IMHO it'd be unwise to do so by default\n // so this implementation requires explicit opt-in via public header\n if (\n this._isShared &&\n (this._resHeaders['set-cookie'] &&\n !this._rescc.public &&\n !this._rescc.immutable)\n ) {\n return 0;\n }\n\n if (this._resHeaders.vary === '*') {\n return 0;\n }\n\n if (this._isShared) {\n if (this._rescc['proxy-revalidate']) {\n return 0;\n }\n // if a response includes the s-maxage directive, a shared cache recipient MUST ignore the Expires field.\n if (this._rescc['s-maxage']) {\n return toNumberOrZero(this._rescc['s-maxage']);\n }\n }\n\n // If a response includes a Cache-Control field with the max-age directive, a recipient MUST ignore the Expires field.\n if (this._rescc['max-age']) {\n return toNumberOrZero(this._rescc['max-age']);\n }\n\n const defaultMinTtl = this._rescc.immutable ? this._immutableMinTtl : 0;\n\n const serverDate = this.date();\n if (this._resHeaders.expires) {\n const expires = Date.parse(this._resHeaders.expires);\n // A cache recipient MUST interpret invalid date formats, especially the value \"0\", as representing a time in the past (i.e., \"already expired\").\n if (Number.isNaN(expires) || expires < serverDate) {\n return 0;\n }\n return Math.max(defaultMinTtl, (expires - serverDate) / 1000);\n }\n\n if (this._resHeaders['last-modified']) {\n const lastModified = Date.parse(this._resHeaders['last-modified']);\n if (isFinite(lastModified) && serverDate > lastModified) {\n return Math.max(\n defaultMinTtl,\n ((serverDate - lastModified) / 1000) * this._cacheHeuristic\n );\n }\n }\n\n return defaultMinTtl;\n }\n\n timeToLive() {\n const age = this.maxAge() - this.age();\n const staleIfErrorAge = age + toNumberOrZero(this._rescc['stale-if-error']);\n const staleWhileRevalidateAge = age + toNumberOrZero(this._rescc['stale-while-revalidate']);\n return Math.max(0, age, staleIfErrorAge, staleWhileRevalidateAge) * 1000;\n }\n\n stale() {\n return this.maxAge() <= this.age();\n }\n\n _useStaleIfError() {\n return this.maxAge() + toNumberOrZero(this._rescc['stale-if-error']) > this.age();\n }\n\n useStaleWhileRevalidate() {\n return this.maxAge() + toNumberOrZero(this._rescc['stale-while-revalidate']) > this.age();\n }\n\n static fromObject(obj) {\n return new this(undefined, undefined, { _fromObject: obj });\n }\n\n _fromObject(obj) {\n if (this._responseTime) throw Error('Reinitialized');\n if (!obj || obj.v !== 1) throw Error('Invalid serialization');\n\n this._responseTime = obj.t;\n this._isShared = obj.sh;\n this._cacheHeuristic = obj.ch;\n this._immutableMinTtl =\n obj.imm !== undefined ? obj.imm : 24 * 3600 * 1000;\n this._status = obj.st;\n this._resHeaders = obj.resh;\n this._rescc = obj.rescc;\n this._method = obj.m;\n this._url = obj.u;\n this._host = obj.h;\n this._noAuthorization = obj.a;\n this._reqHeaders = obj.reqh;\n this._reqcc = obj.reqcc;\n }\n\n toObject() {\n return {\n v: 1,\n t: this._responseTime,\n sh: this._isShared,\n ch: this._cacheHeuristic,\n imm: this._immutableMinTtl,\n st: this._status,\n resh: this._resHeaders,\n rescc: this._rescc,\n m: this._method,\n u: this._url,\n h: this._host,\n a: this._noAuthorization,\n reqh: this._reqHeaders,\n reqcc: this._reqcc,\n };\n }\n\n /**\n * Headers for sending to the origin server to revalidate stale response.\n * Allows server to return 304 to allow reuse of the previous response.\n *\n * Hop by hop headers are always stripped.\n * Revalidation headers may be added or removed, depending on request.\n */\n revalidationHeaders(incomingReq) {\n this._assertRequestHasHeaders(incomingReq);\n const headers = this._copyWithoutHopByHopHeaders(incomingReq.headers);\n\n // This implementation does not understand range requests\n delete headers['if-range'];\n\n if (!this._requestMatches(incomingReq, true) || !this.storable()) {\n // revalidation allowed via HEAD\n // not for the same resource, or wasn't allowed to be cached anyway\n delete headers['if-none-match'];\n delete headers['if-modified-since'];\n return headers;\n }\n\n /* MUST send that entity-tag in any cache validation request (using If-Match or If-None-Match) if an entity-tag has been provided by the origin server. */\n if (this._resHeaders.etag) {\n headers['if-none-match'] = headers['if-none-match']\n ? `${headers['if-none-match']}, ${this._resHeaders.etag}`\n : this._resHeaders.etag;\n }\n\n // Clients MAY issue simple (non-subrange) GET requests with either weak validators or strong validators. Clients MUST NOT use weak validators in other forms of request.\n const forbidsWeakValidators =\n headers['accept-ranges'] ||\n headers['if-match'] ||\n headers['if-unmodified-since'] ||\n (this._method && this._method != 'GET');\n\n /* SHOULD send the Last-Modified value in non-subrange cache validation requests (using If-Modified-Since) if only a Last-Modified value has been provided by the origin server.\n Note: This implementation does not understand partial responses (206) */\n if (forbidsWeakValidators) {\n delete headers['if-modified-since'];\n\n if (headers['if-none-match']) {\n const etags = headers['if-none-match']\n .split(/,/)\n .filter(etag => {\n return !/^\\s*W\\//.test(etag);\n });\n if (!etags.length) {\n delete headers['if-none-match'];\n } else {\n headers['if-none-match'] = etags.join(',').trim();\n }\n }\n } else if (\n this._resHeaders['last-modified'] &&\n !headers['if-modified-since']\n ) {\n headers['if-modified-since'] = this._resHeaders['last-modified'];\n }\n\n return headers;\n }\n\n /**\n * Creates new CachePolicy with information combined from the previews response,\n * and the new revalidation response.\n *\n * Returns {policy, modified} where modified is a boolean indicating\n * whether the response body has been modified, and old cached body can't be used.\n *\n * @return {Object} {policy: CachePolicy, modified: Boolean}\n */\n revalidatedPolicy(request, response) {\n this._assertRequestHasHeaders(request);\n if(this._useStaleIfError() && isErrorResponse(response)) { // I consider the revalidation request unsuccessful\n return {\n modified: false,\n matches: false,\n policy: this,\n };\n }\n if (!response || !response.headers) {\n throw Error('Response headers missing');\n }\n\n // These aren't going to be supported exactly, since one CachePolicy object\n // doesn't know about all the other cached objects.\n let matches = false;\n if (response.status !== undefined && response.status != 304) {\n matches = false;\n } else if (\n response.headers.etag &&\n !/^\\s*W\\//.test(response.headers.etag)\n ) {\n // \"All of the stored responses with the same strong validator are selected.\n // If none of the stored responses contain the same strong validator,\n // then the cache MUST NOT use the new response to update any stored responses.\"\n matches =\n this._resHeaders.etag &&\n this._resHeaders.etag.replace(/^\\s*W\\//, '') ===\n response.headers.etag;\n } else if (this._resHeaders.etag && response.headers.etag) {\n // \"If the new response contains a weak validator and that validator corresponds\n // to one of the cache's stored responses,\n // then the most recent of those matching stored responses is selected for update.\"\n matches =\n this._resHeaders.etag.replace(/^\\s*W\\//, '') ===\n response.headers.etag.replace(/^\\s*W\\//, '');\n } else if (this._resHeaders['last-modified']) {\n matches =\n this._resHeaders['last-modified'] ===\n response.headers['last-modified'];\n } else {\n // If the new response does not include any form of validator (such as in the case where\n // a client generates an If-Modified-Since request from a source other than the Last-Modified\n // response header field), and there is only one stored response, and that stored response also\n // lacks a validator, then that stored response is selected for update.\n if (\n !this._resHeaders.etag &&\n !this._resHeaders['last-modified'] &&\n !response.headers.etag &&\n !response.headers['last-modified']\n ) {\n matches = true;\n }\n }\n\n if (!matches) {\n return {\n policy: new this.constructor(request, response),\n // Client receiving 304 without body, even if it's invalid/mismatched has no option\n // but to reuse a cached body. We don't have a good way to tell clients to do\n // error recovery in such case.\n modified: response.status != 304,\n matches: false,\n };\n }\n\n // use other header fields provided in the 304 (Not Modified) response to replace all instances\n // of the corresponding header fields in the stored response.\n const headers = {};\n for (const k in this._resHeaders) {\n headers[k] =\n k in response.headers && !excludedFromRevalidationUpdate[k]\n ? response.headers[k]\n : this._resHeaders[k];\n }\n\n const newResponse = Object.assign({}, response, {\n status: this._status,\n method: this._method,\n headers,\n });\n return {\n policy: new this.constructor(request, newResponse, {\n shared: this._isShared,\n cacheHeuristic: this._cacheHeuristic,\n immutableMinTimeToLive: this._immutableMinTtl,\n }),\n modified: false,\n matches: true,\n };\n }\n};\n","'use strict';\nconst EventEmitter = require('events');\nconst tls = require('tls');\nconst http2 = require('http2');\nconst QuickLRU = require('quick-lru');\n\nconst kCurrentStreamsCount = Symbol('currentStreamsCount');\nconst kRequest = Symbol('request');\nconst kOriginSet = Symbol('cachedOriginSet');\nconst kGracefullyClosing = Symbol('gracefullyClosing');\n\nconst nameKeys = [\n\t// `http2.connect()` options\n\t'maxDeflateDynamicTableSize',\n\t'maxSessionMemory',\n\t'maxHeaderListPairs',\n\t'maxOutstandingPings',\n\t'maxReservedRemoteStreams',\n\t'maxSendHeaderBlockLength',\n\t'paddingStrategy',\n\n\t// `tls.connect()` options\n\t'localAddress',\n\t'path',\n\t'rejectUnauthorized',\n\t'minDHSize',\n\n\t// `tls.createSecureContext()` options\n\t'ca',\n\t'cert',\n\t'clientCertEngine',\n\t'ciphers',\n\t'key',\n\t'pfx',\n\t'servername',\n\t'minVersion',\n\t'maxVersion',\n\t'secureProtocol',\n\t'crl',\n\t'honorCipherOrder',\n\t'ecdhCurve',\n\t'dhparam',\n\t'secureOptions',\n\t'sessionIdContext'\n];\n\nconst getSortedIndex = (array, value, compare) => {\n\tlet low = 0;\n\tlet high = array.length;\n\n\twhile (low < high) {\n\t\tconst mid = (low + high) >>> 1;\n\n\t\t/* istanbul ignore next */\n\t\tif (compare(array[mid], value)) {\n\t\t\t// This never gets called because we use descending sort. Better to have this anyway.\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\thigh = mid;\n\t\t}\n\t}\n\n\treturn low;\n};\n\nconst compareSessions = (a, b) => {\n\treturn a.remoteSettings.maxConcurrentStreams > b.remoteSettings.maxConcurrentStreams;\n};\n\n// See https://tools.ietf.org/html/rfc8336\nconst closeCoveredSessions = (where, session) => {\n\t// Clients SHOULD NOT emit new requests on any connection whose Origin\n\t// Set is a proper subset of another connection's Origin Set, and they\n\t// SHOULD close it once all outstanding requests are satisfied.\n\tfor (const coveredSession of where) {\n\t\tif (\n\t\t\t// The set is a proper subset when its length is less than the other set.\n\t\t\tcoveredSession[kOriginSet].length < session[kOriginSet].length &&\n\n\t\t\t// And the other set includes all elements of the subset.\n\t\t\tcoveredSession[kOriginSet].every(origin => session[kOriginSet].includes(origin)) &&\n\n\t\t\t// Makes sure that the session can handle all requests from the covered session.\n\t\t\tcoveredSession[kCurrentStreamsCount] + session[kCurrentStreamsCount] <= session.remoteSettings.maxConcurrentStreams\n\t\t) {\n\t\t\t// This allows pending requests to finish and prevents making new requests.\n\t\t\tgracefullyClose(coveredSession);\n\t\t}\n\t}\n};\n\n// This is basically inverted `closeCoveredSessions(...)`.\nconst closeSessionIfCovered = (where, coveredSession) => {\n\tfor (const session of where) {\n\t\tif (\n\t\t\tcoveredSession[kOriginSet].length < session[kOriginSet].length &&\n\t\t\tcoveredSession[kOriginSet].every(origin => session[kOriginSet].includes(origin)) &&\n\t\t\tcoveredSession[kCurrentStreamsCount] + session[kCurrentStreamsCount] <= session.remoteSettings.maxConcurrentStreams\n\t\t) {\n\t\t\tgracefullyClose(coveredSession);\n\t\t}\n\t}\n};\n\nconst getSessions = ({agent, isFree}) => {\n\tconst result = {};\n\n\t// eslint-disable-next-line guard-for-in\n\tfor (const normalizedOptions in agent.sessions) {\n\t\tconst sessions = agent.sessions[normalizedOptions];\n\n\t\tconst filtered = sessions.filter(session => {\n\t\t\tconst result = session[Agent.kCurrentStreamsCount] < session.remoteSettings.maxConcurrentStreams;\n\n\t\t\treturn isFree ? result : !result;\n\t\t});\n\n\t\tif (filtered.length !== 0) {\n\t\t\tresult[normalizedOptions] = filtered;\n\t\t}\n\t}\n\n\treturn result;\n};\n\nconst gracefullyClose = session => {\n\tsession[kGracefullyClosing] = true;\n\n\tif (session[kCurrentStreamsCount] === 0) {\n\t\tsession.close();\n\t}\n};\n\nclass Agent extends EventEmitter {\n\tconstructor({timeout = 60000, maxSessions = Infinity, maxFreeSessions = 10, maxCachedTlsSessions = 100} = {}) {\n\t\tsuper();\n\n\t\t// A session is considered busy when its current streams count\n\t\t// is equal to or greater than the `maxConcurrentStreams` value.\n\n\t\t// A session is considered free when its current streams count\n\t\t// is less than the `maxConcurrentStreams` value.\n\n\t\t// SESSIONS[NORMALIZED_OPTIONS] = [];\n\t\tthis.sessions = {};\n\n\t\t// The queue for creating new sessions. It looks like this:\n\t\t// QUEUE[NORMALIZED_OPTIONS][NORMALIZED_ORIGIN] = ENTRY_FUNCTION\n\t\t//\n\t\t// The entry function has `listeners`, `completed` and `destroyed` properties.\n\t\t// `listeners` is an array of objects containing `resolve` and `reject` functions.\n\t\t// `completed` is a boolean. It's set to true after ENTRY_FUNCTION is executed.\n\t\t// `destroyed` is a boolean. If it's set to true, the session will be destroyed if hasn't connected yet.\n\t\tthis.queue = {};\n\n\t\t// Each session will use this timeout value.\n\t\tthis.timeout = timeout;\n\n\t\t// Max sessions in total\n\t\tthis.maxSessions = maxSessions;\n\n\t\t// Max free sessions in total\n\t\t// TODO: decreasing `maxFreeSessions` should close some sessions\n\t\tthis.maxFreeSessions = maxFreeSessions;\n\n\t\tthis._freeSessionsCount = 0;\n\t\tthis._sessionsCount = 0;\n\n\t\t// We don't support push streams by default.\n\t\tthis.settings = {\n\t\t\tenablePush: false\n\t\t};\n\n\t\t// Reusing TLS sessions increases performance.\n\t\tthis.tlsSessionCache = new QuickLRU({maxSize: maxCachedTlsSessions});\n\t}\n\n\tstatic normalizeOrigin(url, servername) {\n\t\tif (typeof url === 'string') {\n\t\t\turl = new URL(url);\n\t\t}\n\n\t\tif (servername && url.hostname !== servername) {\n\t\t\turl.hostname = servername;\n\t\t}\n\n\t\treturn url.origin;\n\t}\n\n\tnormalizeOptions(options) {\n\t\tlet normalized = '';\n\n\t\tif (options) {\n\t\t\tfor (const key of nameKeys) {\n\t\t\t\tif (options[key]) {\n\t\t\t\t\tnormalized += `:${options[key]}`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn normalized;\n\t}\n\n\t_tryToCreateNewSession(normalizedOptions, normalizedOrigin) {\n\t\tif (!(normalizedOptions in this.queue) || !(normalizedOrigin in this.queue[normalizedOptions])) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst item = this.queue[normalizedOptions][normalizedOrigin];\n\n\t\t// The entry function can be run only once.\n\t\t// BUG: The session may be never created when:\n\t\t// - the first condition is false AND\n\t\t// - this function is never called with the same arguments in the future.\n\t\tif (this._sessionsCount < this.maxSessions && !item.completed) {\n\t\t\titem.completed = true;\n\n\t\t\titem();\n\t\t}\n\t}\n\n\tgetSession(origin, options, listeners) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (Array.isArray(listeners)) {\n\t\t\t\tlisteners = [...listeners];\n\n\t\t\t\t// Resolve the current promise ASAP, we're just moving the listeners.\n\t\t\t\t// They will be executed at a different time.\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\tlisteners = [{resolve, reject}];\n\t\t\t}\n\n\t\t\tconst normalizedOptions = this.normalizeOptions(options);\n\t\t\tconst normalizedOrigin = Agent.normalizeOrigin(origin, options && options.servername);\n\n\t\t\tif (normalizedOrigin === undefined) {\n\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\treject(new TypeError('The `origin` argument needs to be a string or an URL object'));\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (normalizedOptions in this.sessions) {\n\t\t\t\tconst sessions = this.sessions[normalizedOptions];\n\n\t\t\t\tlet maxConcurrentStreams = -1;\n\t\t\t\tlet currentStreamsCount = -1;\n\t\t\t\tlet optimalSession;\n\n\t\t\t\t// We could just do this.sessions[normalizedOptions].find(...) but that isn't optimal.\n\t\t\t\t// Additionally, we are looking for session which has biggest current pending streams count.\n\t\t\t\tfor (const session of sessions) {\n\t\t\t\t\tconst sessionMaxConcurrentStreams = session.remoteSettings.maxConcurrentStreams;\n\n\t\t\t\t\tif (sessionMaxConcurrentStreams < maxConcurrentStreams) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (session[kOriginSet].includes(normalizedOrigin)) {\n\t\t\t\t\t\tconst sessionCurrentStreamsCount = session[kCurrentStreamsCount];\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tsessionCurrentStreamsCount >= sessionMaxConcurrentStreams ||\n\t\t\t\t\t\t\tsession[kGracefullyClosing] ||\n\t\t\t\t\t\t\t// Unfortunately the `close` event isn't called immediately,\n\t\t\t\t\t\t\t// so `session.destroyed` is `true`, but `session.closed` is `false`.\n\t\t\t\t\t\t\tsession.destroyed\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// We only need set this once.\n\t\t\t\t\t\tif (!optimalSession) {\n\t\t\t\t\t\t\tmaxConcurrentStreams = sessionMaxConcurrentStreams;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// We're looking for the session which has biggest current pending stream count,\n\t\t\t\t\t\t// in order to minimalize the amount of active sessions.\n\t\t\t\t\t\tif (sessionCurrentStreamsCount > currentStreamsCount) {\n\t\t\t\t\t\t\toptimalSession = session;\n\t\t\t\t\t\t\tcurrentStreamsCount = sessionCurrentStreamsCount;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (optimalSession) {\n\t\t\t\t\t/* istanbul ignore next: safety check */\n\t\t\t\t\tif (listeners.length !== 1) {\n\t\t\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\t\t\tconst error = new Error(\n\t\t\t\t\t\t\t\t`Expected the length of listeners to be 1, got ${listeners.length}.\\n` +\n\t\t\t\t\t\t\t\t'Please report this to https://github.com/szmarczak/http2-wrapper/'\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlisteners[0].resolve(optimalSession);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (normalizedOptions in this.queue) {\n\t\t\t\tif (normalizedOrigin in this.queue[normalizedOptions]) {\n\t\t\t\t\t// There's already an item in the queue, just attach ourselves to it.\n\t\t\t\t\tthis.queue[normalizedOptions][normalizedOrigin].listeners.push(...listeners);\n\n\t\t\t\t\t// This shouldn't be executed here.\n\t\t\t\t\t// See the comment inside _tryToCreateNewSession.\n\t\t\t\t\tthis._tryToCreateNewSession(normalizedOptions, normalizedOrigin);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.queue[normalizedOptions] = {};\n\t\t\t}\n\n\t\t\t// The entry must be removed from the queue IMMEDIATELY when:\n\t\t\t// 1. the session connects successfully,\n\t\t\t// 2. an error occurs.\n\t\t\tconst removeFromQueue = () => {\n\t\t\t\t// Our entry can be replaced. We cannot remove the new one.\n\t\t\t\tif (normalizedOptions in this.queue && this.queue[normalizedOptions][normalizedOrigin] === entry) {\n\t\t\t\t\tdelete this.queue[normalizedOptions][normalizedOrigin];\n\n\t\t\t\t\tif (Object.keys(this.queue[normalizedOptions]).length === 0) {\n\t\t\t\t\t\tdelete this.queue[normalizedOptions];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// The main logic is here\n\t\t\tconst entry = () => {\n\t\t\t\tconst name = `${normalizedOrigin}:${normalizedOptions}`;\n\t\t\t\tlet receivedSettings = false;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst session = http2.connect(origin, {\n\t\t\t\t\t\tcreateConnection: this.createConnection,\n\t\t\t\t\t\tsettings: this.settings,\n\t\t\t\t\t\tsession: this.tlsSessionCache.get(name),\n\t\t\t\t\t\t...options\n\t\t\t\t\t});\n\t\t\t\t\tsession[kCurrentStreamsCount] = 0;\n\t\t\t\t\tsession[kGracefullyClosing] = false;\n\n\t\t\t\t\tconst isFree = () => session[kCurrentStreamsCount] < session.remoteSettings.maxConcurrentStreams;\n\t\t\t\t\tlet wasFree = true;\n\n\t\t\t\t\tsession.socket.once('session', tlsSession => {\n\t\t\t\t\t\tthis.tlsSessionCache.set(name, tlsSession);\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.once('error', error => {\n\t\t\t\t\t\t// Listeners are empty when the session successfully connected.\n\t\t\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// The connection got broken, purge the cache.\n\t\t\t\t\t\tthis.tlsSessionCache.delete(name);\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.setTimeout(this.timeout, () => {\n\t\t\t\t\t\t// Terminates all streams owned by this session.\n\t\t\t\t\t\t// TODO: Maybe the streams should have a \"Session timed out\" error?\n\t\t\t\t\t\tsession.destroy();\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.once('close', () => {\n\t\t\t\t\t\tif (receivedSettings) {\n\t\t\t\t\t\t\t// 1. If it wasn't free then no need to decrease because\n\t\t\t\t\t\t\t// it has been decreased already in session.request().\n\t\t\t\t\t\t\t// 2. `stream.once('close')` won't increment the count\n\t\t\t\t\t\t\t// because the session is already closed.\n\t\t\t\t\t\t\tif (wasFree) {\n\t\t\t\t\t\t\t\tthis._freeSessionsCount--;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis._sessionsCount--;\n\n\t\t\t\t\t\t\t// This cannot be moved to the stream logic,\n\t\t\t\t\t\t\t// because there may be a session that hadn't made a single request.\n\t\t\t\t\t\t\tconst where = this.sessions[normalizedOptions];\n\t\t\t\t\t\t\twhere.splice(where.indexOf(session), 1);\n\n\t\t\t\t\t\t\tif (where.length === 0) {\n\t\t\t\t\t\t\t\tdelete this.sessions[normalizedOptions];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Broken connection\n\t\t\t\t\t\t\tconst error = new Error('Session closed without receiving a SETTINGS frame');\n\t\t\t\t\t\t\terror.code = 'HTTP2WRAPPER_NOSETTINGS';\n\n\t\t\t\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tremoveFromQueue();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// There may be another session awaiting.\n\t\t\t\t\t\tthis._tryToCreateNewSession(normalizedOptions, normalizedOrigin);\n\t\t\t\t\t});\n\n\t\t\t\t\t// Iterates over the queue and processes listeners.\n\t\t\t\t\tconst processListeners = () => {\n\t\t\t\t\t\tif (!(normalizedOptions in this.queue) || !isFree()) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const origin of session[kOriginSet]) {\n\t\t\t\t\t\t\tif (origin in this.queue[normalizedOptions]) {\n\t\t\t\t\t\t\t\tconst {listeners} = this.queue[normalizedOptions][origin];\n\n\t\t\t\t\t\t\t\t// Prevents session overloading.\n\t\t\t\t\t\t\t\twhile (listeners.length !== 0 && isFree()) {\n\t\t\t\t\t\t\t\t\t// We assume `resolve(...)` calls `request(...)` *directly*,\n\t\t\t\t\t\t\t\t\t// otherwise the session will get overloaded.\n\t\t\t\t\t\t\t\t\tlisteners.shift().resolve(session);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst where = this.queue[normalizedOptions];\n\t\t\t\t\t\t\t\tif (where[origin].listeners.length === 0) {\n\t\t\t\t\t\t\t\t\tdelete where[origin];\n\n\t\t\t\t\t\t\t\t\tif (Object.keys(where).length === 0) {\n\t\t\t\t\t\t\t\t\t\tdelete this.queue[normalizedOptions];\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// We're no longer free, no point in continuing.\n\t\t\t\t\t\t\t\tif (!isFree()) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// The Origin Set cannot shrink. No need to check if it suddenly became covered by another one.\n\t\t\t\t\tsession.on('origin', () => {\n\t\t\t\t\t\tsession[kOriginSet] = session.originSet;\n\n\t\t\t\t\t\tif (!isFree()) {\n\t\t\t\t\t\t\t// The session is full.\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tprocessListeners();\n\n\t\t\t\t\t\t// Close covered sessions (if possible).\n\t\t\t\t\t\tcloseCoveredSessions(this.sessions[normalizedOptions], session);\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.once('remoteSettings', () => {\n\t\t\t\t\t\t// Fix Node.js bug preventing the process from exiting\n\t\t\t\t\t\tsession.ref();\n\t\t\t\t\t\tsession.unref();\n\n\t\t\t\t\t\tthis._sessionsCount++;\n\n\t\t\t\t\t\t// The Agent could have been destroyed already.\n\t\t\t\t\t\tif (entry.destroyed) {\n\t\t\t\t\t\t\tconst error = new Error('Agent has been destroyed');\n\n\t\t\t\t\t\t\tfor (const listener of listeners) {\n\t\t\t\t\t\t\t\tlistener.reject(error);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsession.destroy();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsession[kOriginSet] = session.originSet;\n\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst where = this.sessions;\n\n\t\t\t\t\t\t\tif (normalizedOptions in where) {\n\t\t\t\t\t\t\t\tconst sessions = where[normalizedOptions];\n\t\t\t\t\t\t\t\tsessions.splice(getSortedIndex(sessions, session, compareSessions), 0, session);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twhere[normalizedOptions] = [session];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._freeSessionsCount += 1;\n\t\t\t\t\t\treceivedSettings = true;\n\n\t\t\t\t\t\tthis.emit('session', session);\n\n\t\t\t\t\t\tprocessListeners();\n\t\t\t\t\t\tremoveFromQueue();\n\n\t\t\t\t\t\t// TODO: Close last recently used (or least used?) session\n\t\t\t\t\t\tif (session[kCurrentStreamsCount] === 0 && this._freeSessionsCount > this.maxFreeSessions) {\n\t\t\t\t\t\t\tsession.close();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check if we haven't managed to execute all listeners.\n\t\t\t\t\t\tif (listeners.length !== 0) {\n\t\t\t\t\t\t\t// Request for a new session with predefined listeners.\n\t\t\t\t\t\t\tthis.getSession(normalizedOrigin, options, listeners);\n\t\t\t\t\t\t\tlisteners.length = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// `session.remoteSettings.maxConcurrentStreams` might get increased\n\t\t\t\t\t\tsession.on('remoteSettings', () => {\n\t\t\t\t\t\t\tprocessListeners();\n\n\t\t\t\t\t\t\t// In case the Origin Set changes\n\t\t\t\t\t\t\tcloseCoveredSessions(this.sessions[normalizedOptions], session);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\t// Shim `session.request()` in order to catch all streams\n\t\t\t\t\tsession[kRequest] = session.request;\n\t\t\t\t\tsession.request = (headers, streamOptions) => {\n\t\t\t\t\t\tif (session[kGracefullyClosing]) {\n\t\t\t\t\t\t\tthrow new Error('The session is gracefully closing. No new streams are allowed.');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst stream = session[kRequest](headers, streamOptions);\n\n\t\t\t\t\t\t// The process won't exit until the session is closed or all requests are gone.\n\t\t\t\t\t\tsession.ref();\n\n\t\t\t\t\t\t++session[kCurrentStreamsCount];\n\n\t\t\t\t\t\tif (session[kCurrentStreamsCount] === session.remoteSettings.maxConcurrentStreams) {\n\t\t\t\t\t\t\tthis._freeSessionsCount--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstream.once('close', () => {\n\t\t\t\t\t\t\twasFree = isFree();\n\n\t\t\t\t\t\t\t--session[kCurrentStreamsCount];\n\n\t\t\t\t\t\t\tif (!session.destroyed && !session.closed) {\n\t\t\t\t\t\t\t\tcloseSessionIfCovered(this.sessions[normalizedOptions], session);\n\n\t\t\t\t\t\t\t\tif (isFree() && !session.closed) {\n\t\t\t\t\t\t\t\t\tif (!wasFree) {\n\t\t\t\t\t\t\t\t\t\tthis._freeSessionsCount++;\n\n\t\t\t\t\t\t\t\t\t\twasFree = true;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst isEmpty = session[kCurrentStreamsCount] === 0;\n\n\t\t\t\t\t\t\t\t\tif (isEmpty) {\n\t\t\t\t\t\t\t\t\t\tsession.unref();\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tisEmpty &&\n\t\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t\tthis._freeSessionsCount > this.maxFreeSessions ||\n\t\t\t\t\t\t\t\t\t\t\tsession[kGracefullyClosing]\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tsession.close();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tcloseCoveredSessions(this.sessions[normalizedOptions], session);\n\t\t\t\t\t\t\t\t\t\tprocessListeners();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn stream;\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\tfor (const listener of listeners) {\n\t\t\t\t\t\tlistener.reject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tremoveFromQueue();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tentry.listeners = listeners;\n\t\t\tentry.completed = false;\n\t\t\tentry.destroyed = false;\n\n\t\t\tthis.queue[normalizedOptions][normalizedOrigin] = entry;\n\t\t\tthis._tryToCreateNewSession(normalizedOptions, normalizedOrigin);\n\t\t});\n\t}\n\n\trequest(origin, options, headers, streamOptions) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.getSession(origin, options, [{\n\t\t\t\treject,\n\t\t\t\tresolve: session => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresolve(session.request(headers, streamOptions));\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}]);\n\t\t});\n\t}\n\n\tcreateConnection(origin, options) {\n\t\treturn Agent.connect(origin, options);\n\t}\n\n\tstatic connect(origin, options) {\n\t\toptions.ALPNProtocols = ['h2'];\n\n\t\tconst port = origin.port || 443;\n\t\tconst host = origin.hostname || origin.host;\n\n\t\tif (typeof options.servername === 'undefined') {\n\t\t\toptions.servername = host;\n\t\t}\n\n\t\treturn tls.connect(port, host, options);\n\t}\n\n\tcloseFreeSessions() {\n\t\tfor (const sessions of Object.values(this.sessions)) {\n\t\t\tfor (const session of sessions) {\n\t\t\t\tif (session[kCurrentStreamsCount] === 0) {\n\t\t\t\t\tsession.close();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy(reason) {\n\t\tfor (const sessions of Object.values(this.sessions)) {\n\t\t\tfor (const session of sessions) {\n\t\t\t\tsession.destroy(reason);\n\t\t\t}\n\t\t}\n\n\t\tfor (const entriesOfAuthority of Object.values(this.queue)) {\n\t\t\tfor (const entry of Object.values(entriesOfAuthority)) {\n\t\t\t\tentry.destroyed = true;\n\t\t\t}\n\t\t}\n\n\t\t// New requests should NOT attach to destroyed sessions\n\t\tthis.queue = {};\n\t}\n\n\tget freeSessions() {\n\t\treturn getSessions({agent: this, isFree: true});\n\t}\n\n\tget busySessions() {\n\t\treturn getSessions({agent: this, isFree: false});\n\t}\n}\n\nAgent.kCurrentStreamsCount = kCurrentStreamsCount;\nAgent.kGracefullyClosing = kGracefullyClosing;\n\nmodule.exports = {\n\tAgent,\n\tglobalAgent: new Agent()\n};\n","'use strict';\nconst http = require('http');\nconst https = require('https');\nconst resolveALPN = require('resolve-alpn');\nconst QuickLRU = require('quick-lru');\nconst Http2ClientRequest = require('./client-request');\nconst calculateServerName = require('./utils/calculate-server-name');\nconst urlToOptions = require('./utils/url-to-options');\n\nconst cache = new QuickLRU({maxSize: 100});\nconst queue = new Map();\n\nconst installSocket = (agent, socket, options) => {\n\tsocket._httpMessage = {shouldKeepAlive: true};\n\n\tconst onFree = () => {\n\t\tagent.emit('free', socket, options);\n\t};\n\n\tsocket.on('free', onFree);\n\n\tconst onClose = () => {\n\t\tagent.removeSocket(socket, options);\n\t};\n\n\tsocket.on('close', onClose);\n\n\tconst onRemove = () => {\n\t\tagent.removeSocket(socket, options);\n\t\tsocket.off('close', onClose);\n\t\tsocket.off('free', onFree);\n\t\tsocket.off('agentRemove', onRemove);\n\t};\n\n\tsocket.on('agentRemove', onRemove);\n\n\tagent.emit('free', socket, options);\n};\n\nconst resolveProtocol = async options => {\n\tconst name = `${options.host}:${options.port}:${options.ALPNProtocols.sort()}`;\n\n\tif (!cache.has(name)) {\n\t\tif (queue.has(name)) {\n\t\t\tconst result = await queue.get(name);\n\t\t\treturn result.alpnProtocol;\n\t\t}\n\n\t\tconst {path, agent} = options;\n\t\toptions.path = options.socketPath;\n\n\t\tconst resultPromise = resolveALPN(options);\n\t\tqueue.set(name, resultPromise);\n\n\t\ttry {\n\t\t\tconst {socket, alpnProtocol} = await resultPromise;\n\t\t\tcache.set(name, alpnProtocol);\n\n\t\t\toptions.path = path;\n\n\t\t\tif (alpnProtocol === 'h2') {\n\t\t\t\t// https://github.com/nodejs/node/issues/33343\n\t\t\t\tsocket.destroy();\n\t\t\t} else {\n\t\t\t\tconst {globalAgent} = https;\n\t\t\t\tconst defaultCreateConnection = https.Agent.prototype.createConnection;\n\n\t\t\t\tif (agent) {\n\t\t\t\t\tif (agent.createConnection === defaultCreateConnection) {\n\t\t\t\t\t\tinstallSocket(agent, socket, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t}\n\t\t\t\t} else if (globalAgent.createConnection === defaultCreateConnection) {\n\t\t\t\t\tinstallSocket(globalAgent, socket, options);\n\t\t\t\t} else {\n\t\t\t\t\tsocket.destroy();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tqueue.delete(name);\n\n\t\t\treturn alpnProtocol;\n\t\t} catch (error) {\n\t\t\tqueue.delete(name);\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\treturn cache.get(name);\n};\n\nmodule.exports = async (input, options, callback) => {\n\tif (typeof input === 'string' || input instanceof URL) {\n\t\tinput = urlToOptions(new URL(input));\n\t}\n\n\tif (typeof options === 'function') {\n\t\tcallback = options;\n\t\toptions = undefined;\n\t}\n\n\toptions = {\n\t\tALPNProtocols: ['h2', 'http/1.1'],\n\t\t...input,\n\t\t...options,\n\t\tresolveSocket: true\n\t};\n\n\tif (!Array.isArray(options.ALPNProtocols) || options.ALPNProtocols.length === 0) {\n\t\tthrow new Error('The `ALPNProtocols` option must be an Array with at least one entry');\n\t}\n\n\toptions.protocol = options.protocol || 'https:';\n\tconst isHttps = options.protocol === 'https:';\n\n\toptions.host = options.hostname || options.host || 'localhost';\n\toptions.session = options.tlsSession;\n\toptions.servername = options.servername || calculateServerName(options);\n\toptions.port = options.port || (isHttps ? 443 : 80);\n\toptions._defaultAgent = isHttps ? https.globalAgent : http.globalAgent;\n\n\tconst agents = options.agent;\n\n\tif (agents) {\n\t\tif (agents.addRequest) {\n\t\t\tthrow new Error('The `options.agent` object can contain only `http`, `https` or `http2` properties');\n\t\t}\n\n\t\toptions.agent = agents[isHttps ? 'https' : 'http'];\n\t}\n\n\tif (isHttps) {\n\t\tconst protocol = await resolveProtocol(options);\n\n\t\tif (protocol === 'h2') {\n\t\t\tif (agents) {\n\t\t\t\toptions.agent = agents.http2;\n\t\t\t}\n\n\t\t\treturn new Http2ClientRequest(options, callback);\n\t\t}\n\t}\n\n\treturn http.request(options, callback);\n};\n\nmodule.exports.protocolCache = cache;\n","'use strict';\nconst http2 = require('http2');\nconst {Writable} = require('stream');\nconst {Agent, globalAgent} = require('./agent');\nconst IncomingMessage = require('./incoming-message');\nconst urlToOptions = require('./utils/url-to-options');\nconst proxyEvents = require('./utils/proxy-events');\nconst isRequestPseudoHeader = require('./utils/is-request-pseudo-header');\nconst {\n\tERR_INVALID_ARG_TYPE,\n\tERR_INVALID_PROTOCOL,\n\tERR_HTTP_HEADERS_SENT,\n\tERR_INVALID_HTTP_TOKEN,\n\tERR_HTTP_INVALID_HEADER_VALUE,\n\tERR_INVALID_CHAR\n} = require('./utils/errors');\n\nconst {\n\tHTTP2_HEADER_STATUS,\n\tHTTP2_HEADER_METHOD,\n\tHTTP2_HEADER_PATH,\n\tHTTP2_METHOD_CONNECT\n} = http2.constants;\n\nconst kHeaders = Symbol('headers');\nconst kOrigin = Symbol('origin');\nconst kSession = Symbol('session');\nconst kOptions = Symbol('options');\nconst kFlushedHeaders = Symbol('flushedHeaders');\nconst kJobs = Symbol('jobs');\n\nconst isValidHttpToken = /^[\\^`\\-\\w!#$%&*+.|~]+$/;\nconst isInvalidHeaderValue = /[^\\t\\u0020-\\u007E\\u0080-\\u00FF]/;\n\nclass ClientRequest extends Writable {\n\tconstructor(input, options, callback) {\n\t\tsuper({\n\t\t\tautoDestroy: false\n\t\t});\n\n\t\tconst hasInput = typeof input === 'string' || input instanceof URL;\n\t\tif (hasInput) {\n\t\t\tinput = urlToOptions(input instanceof URL ? input : new URL(input));\n\t\t}\n\n\t\tif (typeof options === 'function' || options === undefined) {\n\t\t\t// (options, callback)\n\t\t\tcallback = options;\n\t\t\toptions = hasInput ? input : {...input};\n\t\t} else {\n\t\t\t// (input, options, callback)\n\t\t\toptions = {...input, ...options};\n\t\t}\n\n\t\tif (options.h2session) {\n\t\t\tthis[kSession] = options.h2session;\n\t\t} else if (options.agent === false) {\n\t\t\tthis.agent = new Agent({maxFreeSessions: 0});\n\t\t} else if (typeof options.agent === 'undefined' || options.agent === null) {\n\t\t\tif (typeof options.createConnection === 'function') {\n\t\t\t\t// This is a workaround - we don't have to create the session on our own.\n\t\t\t\tthis.agent = new Agent({maxFreeSessions: 0});\n\t\t\t\tthis.agent.createConnection = options.createConnection;\n\t\t\t} else {\n\t\t\t\tthis.agent = globalAgent;\n\t\t\t}\n\t\t} else if (typeof options.agent.request === 'function') {\n\t\t\tthis.agent = options.agent;\n\t\t} else {\n\t\t\tthrow new ERR_INVALID_ARG_TYPE('options.agent', ['Agent-like Object', 'undefined', 'false'], options.agent);\n\t\t}\n\n\t\tif (options.protocol && options.protocol !== 'https:') {\n\t\t\tthrow new ERR_INVALID_PROTOCOL(options.protocol, 'https:');\n\t\t}\n\n\t\tconst port = options.port || options.defaultPort || (this.agent && this.agent.defaultPort) || 443;\n\t\tconst host = options.hostname || options.host || 'localhost';\n\n\t\t// Don't enforce the origin via options. It may be changed in an Agent.\n\t\tdelete options.hostname;\n\t\tdelete options.host;\n\t\tdelete options.port;\n\n\t\tconst {timeout} = options;\n\t\toptions.timeout = undefined;\n\n\t\tthis[kHeaders] = Object.create(null);\n\t\tthis[kJobs] = [];\n\n\t\tthis.socket = null;\n\t\tthis.connection = null;\n\n\t\tthis.method = options.method || 'GET';\n\t\tthis.path = options.path;\n\n\t\tthis.res = null;\n\t\tthis.aborted = false;\n\t\tthis.reusedSocket = false;\n\n\t\tif (options.headers) {\n\t\t\tfor (const [header, value] of Object.entries(options.headers)) {\n\t\t\t\tthis.setHeader(header, value);\n\t\t\t}\n\t\t}\n\n\t\tif (options.auth && !('authorization' in this[kHeaders])) {\n\t\t\tthis[kHeaders].authorization = 'Basic ' + Buffer.from(options.auth).toString('base64');\n\t\t}\n\n\t\toptions.session = options.tlsSession;\n\t\toptions.path = options.socketPath;\n\n\t\tthis[kOptions] = options;\n\n\t\t// Clients that generate HTTP/2 requests directly SHOULD use the :authority pseudo-header field instead of the Host header field.\n\t\tif (port === 443) {\n\t\t\tthis[kOrigin] = `https://${host}`;\n\n\t\t\tif (!(':authority' in this[kHeaders])) {\n\t\t\t\tthis[kHeaders][':authority'] = host;\n\t\t\t}\n\t\t} else {\n\t\t\tthis[kOrigin] = `https://${host}:${port}`;\n\n\t\t\tif (!(':authority' in this[kHeaders])) {\n\t\t\t\tthis[kHeaders][':authority'] = `${host}:${port}`;\n\t\t\t}\n\t\t}\n\n\t\tif (timeout) {\n\t\t\tthis.setTimeout(timeout);\n\t\t}\n\n\t\tif (callback) {\n\t\t\tthis.once('response', callback);\n\t\t}\n\n\t\tthis[kFlushedHeaders] = false;\n\t}\n\n\tget method() {\n\t\treturn this[kHeaders][HTTP2_HEADER_METHOD];\n\t}\n\n\tset method(value) {\n\t\tif (value) {\n\t\t\tthis[kHeaders][HTTP2_HEADER_METHOD] = value.toUpperCase();\n\t\t}\n\t}\n\n\tget path() {\n\t\treturn this[kHeaders][HTTP2_HEADER_PATH];\n\t}\n\n\tset path(value) {\n\t\tif (value) {\n\t\t\tthis[kHeaders][HTTP2_HEADER_PATH] = value;\n\t\t}\n\t}\n\n\tget _mustNotHaveABody() {\n\t\treturn this.method === 'GET' || this.method === 'HEAD' || this.method === 'DELETE';\n\t}\n\n\t_write(chunk, encoding, callback) {\n\t\t// https://github.com/nodejs/node/blob/654df09ae0c5e17d1b52a900a545f0664d8c7627/lib/internal/http2/util.js#L148-L156\n\t\tif (this._mustNotHaveABody) {\n\t\t\tcallback(new Error('The GET, HEAD and DELETE methods must NOT have a body'));\n\t\t\t/* istanbul ignore next: Node.js 12 throws directly */\n\t\t\treturn;\n\t\t}\n\n\t\tthis.flushHeaders();\n\n\t\tconst callWrite = () => this._request.write(chunk, encoding, callback);\n\t\tif (this._request) {\n\t\t\tcallWrite();\n\t\t} else {\n\t\t\tthis[kJobs].push(callWrite);\n\t\t}\n\t}\n\n\t_final(callback) {\n\t\tif (this.destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.flushHeaders();\n\n\t\tconst callEnd = () => {\n\t\t\t// For GET, HEAD and DELETE\n\t\t\tif (this._mustNotHaveABody) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._request.end(callback);\n\t\t};\n\n\t\tif (this._request) {\n\t\t\tcallEnd();\n\t\t} else {\n\t\t\tthis[kJobs].push(callEnd);\n\t\t}\n\t}\n\n\tabort() {\n\t\tif (this.res && this.res.complete) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.aborted) {\n\t\t\tprocess.nextTick(() => this.emit('abort'));\n\t\t}\n\n\t\tthis.aborted = true;\n\n\t\tthis.destroy();\n\t}\n\n\t_destroy(error, callback) {\n\t\tif (this.res) {\n\t\t\tthis.res._dump();\n\t\t}\n\n\t\tif (this._request) {\n\t\t\tthis._request.destroy();\n\t\t}\n\n\t\tcallback(error);\n\t}\n\n\tasync flushHeaders() {\n\t\tif (this[kFlushedHeaders] || this.destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis[kFlushedHeaders] = true;\n\n\t\tconst isConnectMethod = this.method === HTTP2_METHOD_CONNECT;\n\n\t\t// The real magic is here\n\t\tconst onStream = stream => {\n\t\t\tthis._request = stream;\n\n\t\t\tif (this.destroyed) {\n\t\t\t\tstream.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Forwards `timeout`, `continue`, `close` and `error` events to this instance.\n\t\t\tif (!isConnectMethod) {\n\t\t\t\tproxyEvents(stream, this, ['timeout', 'continue', 'close', 'error']);\n\t\t\t}\n\n\t\t\t// Wait for the `finish` event. We don't want to emit the `response` event\n\t\t\t// before `request.end()` is called.\n\t\t\tconst waitForEnd = fn => {\n\t\t\t\treturn (...args) => {\n\t\t\t\t\tif (!this.writable && !this.destroyed) {\n\t\t\t\t\t\tfn(...args);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.once('finish', () => {\n\t\t\t\t\t\t\tfn(...args);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t\t// This event tells we are ready to listen for the data.\n\t\t\tstream.once('response', waitForEnd((headers, flags, rawHeaders) => {\n\t\t\t\t// If we were to emit raw request stream, it would be as fast as the native approach.\n\t\t\t\t// Note that wrapping the raw stream in a Proxy instance won't improve the performance (already tested it).\n\t\t\t\tconst response = new IncomingMessage(this.socket, stream.readableHighWaterMark);\n\t\t\t\tthis.res = response;\n\n\t\t\t\tresponse.req = this;\n\t\t\t\tresponse.statusCode = headers[HTTP2_HEADER_STATUS];\n\t\t\t\tresponse.headers = headers;\n\t\t\t\tresponse.rawHeaders = rawHeaders;\n\n\t\t\t\tresponse.once('end', () => {\n\t\t\t\t\tif (this.aborted) {\n\t\t\t\t\t\tresponse.aborted = true;\n\t\t\t\t\t\tresponse.emit('aborted');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.complete = true;\n\n\t\t\t\t\t\t// Has no effect, just be consistent with the Node.js behavior\n\t\t\t\t\t\tresponse.socket = null;\n\t\t\t\t\t\tresponse.connection = null;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (isConnectMethod) {\n\t\t\t\t\tresponse.upgrade = true;\n\n\t\t\t\t\t// The HTTP1 API says the socket is detached here,\n\t\t\t\t\t// but we can't do that so we pass the original HTTP2 request.\n\t\t\t\t\tif (this.emit('connect', response, stream, Buffer.alloc(0))) {\n\t\t\t\t\t\tthis.emit('close');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No listeners attached, destroy the original request.\n\t\t\t\t\t\tstream.destroy();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Forwards data\n\t\t\t\t\tstream.on('data', chunk => {\n\t\t\t\t\t\tif (!response._dumped && !response.push(chunk)) {\n\t\t\t\t\t\t\tstream.pause();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tstream.once('end', () => {\n\t\t\t\t\t\tresponse.push(null);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!this.emit('response', response)) {\n\t\t\t\t\t\t// No listeners attached, dump the response.\n\t\t\t\t\t\tresponse._dump();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}));\n\n\t\t\t// Emits `information` event\n\t\t\tstream.once('headers', waitForEnd(\n\t\t\t\theaders => this.emit('information', {statusCode: headers[HTTP2_HEADER_STATUS]})\n\t\t\t));\n\n\t\t\tstream.once('trailers', waitForEnd((trailers, flags, rawTrailers) => {\n\t\t\t\tconst {res} = this;\n\n\t\t\t\t// Assigns trailers to the response object.\n\t\t\t\tres.trailers = trailers;\n\t\t\t\tres.rawTrailers = rawTrailers;\n\t\t\t}));\n\n\t\t\tconst {socket} = stream.session;\n\t\t\tthis.socket = socket;\n\t\t\tthis.connection = socket;\n\n\t\t\tfor (const job of this[kJobs]) {\n\t\t\t\tjob();\n\t\t\t}\n\n\t\t\tthis.emit('socket', this.socket);\n\t\t};\n\n\t\t// Makes a HTTP2 request\n\t\tif (this[kSession]) {\n\t\t\ttry {\n\t\t\t\tonStream(this[kSession].request(this[kHeaders]));\n\t\t\t} catch (error) {\n\t\t\t\tthis.emit('error', error);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.reusedSocket = true;\n\n\t\t\ttry {\n\t\t\t\tonStream(await this.agent.request(this[kOrigin], this[kOptions], this[kHeaders]));\n\t\t\t} catch (error) {\n\t\t\t\tthis.emit('error', error);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetHeader(name) {\n\t\tif (typeof name !== 'string') {\n\t\t\tthrow new ERR_INVALID_ARG_TYPE('name', 'string', name);\n\t\t}\n\n\t\treturn this[kHeaders][name.toLowerCase()];\n\t}\n\n\tget headersSent() {\n\t\treturn this[kFlushedHeaders];\n\t}\n\n\tremoveHeader(name) {\n\t\tif (typeof name !== 'string') {\n\t\t\tthrow new ERR_INVALID_ARG_TYPE('name', 'string', name);\n\t\t}\n\n\t\tif (this.headersSent) {\n\t\t\tthrow new ERR_HTTP_HEADERS_SENT('remove');\n\t\t}\n\n\t\tdelete this[kHeaders][name.toLowerCase()];\n\t}\n\n\tsetHeader(name, value) {\n\t\tif (this.headersSent) {\n\t\t\tthrow new ERR_HTTP_HEADERS_SENT('set');\n\t\t}\n\n\t\tif (typeof name !== 'string' || (!isValidHttpToken.test(name) && !isRequestPseudoHeader(name))) {\n\t\t\tthrow new ERR_INVALID_HTTP_TOKEN('Header name', name);\n\t\t}\n\n\t\tif (typeof value === 'undefined') {\n\t\t\tthrow new ERR_HTTP_INVALID_HEADER_VALUE(value, name);\n\t\t}\n\n\t\tif (isInvalidHeaderValue.test(value)) {\n\t\t\tthrow new ERR_INVALID_CHAR('header content', name);\n\t\t}\n\n\t\tthis[kHeaders][name.toLowerCase()] = value;\n\t}\n\n\tsetNoDelay() {\n\t\t// HTTP2 sockets cannot be malformed, do nothing.\n\t}\n\n\tsetSocketKeepAlive() {\n\t\t// HTTP2 sockets cannot be malformed, do nothing.\n\t}\n\n\tsetTimeout(ms, callback) {\n\t\tconst applyTimeout = () => this._request.setTimeout(ms, callback);\n\n\t\tif (this._request) {\n\t\t\tapplyTimeout();\n\t\t} else {\n\t\t\tthis[kJobs].push(applyTimeout);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tget maxHeadersCount() {\n\t\tif (!this.destroyed && this._request) {\n\t\t\treturn this._request.session.localSettings.maxHeaderListSize;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tset maxHeadersCount(_value) {\n\t\t// Updating HTTP2 settings would affect all requests, do nothing.\n\t}\n}\n\nmodule.exports = ClientRequest;\n","'use strict';\nconst {Readable} = require('stream');\n\nclass IncomingMessage extends Readable {\n\tconstructor(socket, highWaterMark) {\n\t\tsuper({\n\t\t\thighWaterMark,\n\t\t\tautoDestroy: false\n\t\t});\n\n\t\tthis.statusCode = null;\n\t\tthis.statusMessage = '';\n\t\tthis.httpVersion = '2.0';\n\t\tthis.httpVersionMajor = 2;\n\t\tthis.httpVersionMinor = 0;\n\t\tthis.headers = {};\n\t\tthis.trailers = {};\n\t\tthis.req = null;\n\n\t\tthis.aborted = false;\n\t\tthis.complete = false;\n\t\tthis.upgrade = null;\n\n\t\tthis.rawHeaders = [];\n\t\tthis.rawTrailers = [];\n\n\t\tthis.socket = socket;\n\t\tthis.connection = socket;\n\n\t\tthis._dumped = false;\n\t}\n\n\t_destroy(error) {\n\t\tthis.req._request.destroy(error);\n\t}\n\n\tsetTimeout(ms, callback) {\n\t\tthis.req.setTimeout(ms, callback);\n\t\treturn this;\n\t}\n\n\t_dump() {\n\t\tif (!this._dumped) {\n\t\t\tthis._dumped = true;\n\n\t\t\tthis.removeAllListeners('data');\n\t\t\tthis.resume();\n\t\t}\n\t}\n\n\t_read() {\n\t\tif (this.req) {\n\t\t\tthis.req._request.resume();\n\t\t}\n\t}\n}\n\nmodule.exports = IncomingMessage;\n","'use strict';\nconst http2 = require('http2');\nconst agent = require('./agent');\nconst ClientRequest = require('./client-request');\nconst IncomingMessage = require('./incoming-message');\nconst auto = require('./auto');\n\nconst request = (url, options, callback) => {\n\treturn new ClientRequest(url, options, callback);\n};\n\nconst get = (url, options, callback) => {\n\t// eslint-disable-next-line unicorn/prevent-abbreviations\n\tconst req = new ClientRequest(url, options, callback);\n\treq.end();\n\n\treturn req;\n};\n\nmodule.exports = {\n\t...http2,\n\tClientRequest,\n\tIncomingMessage,\n\t...agent,\n\trequest,\n\tget,\n\tauto\n};\n","'use strict';\nconst net = require('net');\n/* istanbul ignore file: https://github.com/nodejs/node/blob/v13.0.1/lib/_http_agent.js */\n\nmodule.exports = options => {\n\tlet servername = options.host;\n\tconst hostHeader = options.headers && options.headers.host;\n\n\tif (hostHeader) {\n\t\tif (hostHeader.startsWith('[')) {\n\t\t\tconst index = hostHeader.indexOf(']');\n\t\t\tif (index === -1) {\n\t\t\t\tservername = hostHeader;\n\t\t\t} else {\n\t\t\t\tservername = hostHeader.slice(1, -1);\n\t\t\t}\n\t\t} else {\n\t\t\tservername = hostHeader.split(':', 1)[0];\n\t\t}\n\t}\n\n\tif (net.isIP(servername)) {\n\t\treturn '';\n\t}\n\n\treturn servername;\n};\n","'use strict';\n/* istanbul ignore file: https://github.com/nodejs/node/blob/master/lib/internal/errors.js */\n\nconst makeError = (Base, key, getMessage) => {\n\tmodule.exports[key] = class NodeError extends Base {\n\t\tconstructor(...args) {\n\t\t\tsuper(typeof getMessage === 'string' ? getMessage : getMessage(args));\n\t\t\tthis.name = `${super.name} [${key}]`;\n\t\t\tthis.code = key;\n\t\t}\n\t};\n};\n\nmakeError(TypeError, 'ERR_INVALID_ARG_TYPE', args => {\n\tconst type = args[0].includes('.') ? 'property' : 'argument';\n\n\tlet valid = args[1];\n\tconst isManyTypes = Array.isArray(valid);\n\n\tif (isManyTypes) {\n\t\tvalid = `${valid.slice(0, -1).join(', ')} or ${valid.slice(-1)}`;\n\t}\n\n\treturn `The \"${args[0]}\" ${type} must be ${isManyTypes ? 'one of' : 'of'} type ${valid}. Received ${typeof args[2]}`;\n});\n\nmakeError(TypeError, 'ERR_INVALID_PROTOCOL', args => {\n\treturn `Protocol \"${args[0]}\" not supported. Expected \"${args[1]}\"`;\n});\n\nmakeError(Error, 'ERR_HTTP_HEADERS_SENT', args => {\n\treturn `Cannot ${args[0]} headers after they are sent to the client`;\n});\n\nmakeError(TypeError, 'ERR_INVALID_HTTP_TOKEN', args => {\n\treturn `${args[0]} must be a valid HTTP token [${args[1]}]`;\n});\n\nmakeError(TypeError, 'ERR_HTTP_INVALID_HEADER_VALUE', args => {\n\treturn `Invalid value \"${args[0]} for header \"${args[1]}\"`;\n});\n\nmakeError(TypeError, 'ERR_INVALID_CHAR', args => {\n\treturn `Invalid character in ${args[0]} [${args[1]}]`;\n});\n","'use strict';\n\nmodule.exports = header => {\n\tswitch (header) {\n\t\tcase ':method':\n\t\tcase ':scheme':\n\t\tcase ':authority':\n\t\tcase ':path':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n","'use strict';\n\nmodule.exports = (from, to, events) => {\n\tfor (const event of events) {\n\t\tfrom.on(event, (...args) => to.emit(event, ...args));\n\t}\n};\n","'use strict';\n/* istanbul ignore file: https://github.com/nodejs/node/blob/a91293d4d9ab403046ab5eb022332e4e3d249bd3/lib/internal/url.js#L1257 */\n\nmodule.exports = url => {\n\tconst options = {\n\t\tprotocol: url.protocol,\n\t\thostname: typeof url.hostname === 'string' && url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname,\n\t\thost: url.host,\n\t\thash: url.hash,\n\t\tsearch: url.search,\n\t\tpathname: url.pathname,\n\t\thref: url.href,\n\t\tpath: `${url.pathname || ''}${url.search || ''}`\n\t};\n\n\tif (typeof url.port === 'string' && url.port.length !== 0) {\n\t\toptions.port = Number(url.port);\n\t}\n\n\tif (url.username || url.password) {\n\t\toptions.auth = `${url.username || ''}:${url.password || ''}`;\n\t}\n\n\treturn options;\n};\n","/*!\n * is-extglob \n *\n * Copyright (c) 2014-2016, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nmodule.exports = function isExtglob(str) {\n if (typeof str !== 'string' || str === '') {\n return false;\n }\n\n var match;\n while ((match = /(\\\\).|([@?!+*]\\(.*\\))/g.exec(str))) {\n if (match[2]) return true;\n str = str.slice(match.index + match[0].length);\n }\n\n return false;\n};\n","/*!\n * is-glob \n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nvar isExtglob = require('is-extglob');\nvar chars = { '{': '}', '(': ')', '[': ']'};\nvar strictRegex = /\\\\(.)|(^!|\\*|[\\].+)]\\?|\\[[^\\\\\\]]+\\]|\\{[^\\\\}]+\\}|\\(\\?[:!=][^\\\\)]+\\)|\\([^|]+\\|[^\\\\)]+\\))/;\nvar relaxedRegex = /\\\\(.)|(^!|[*?{}()[\\]]|\\(\\?)/;\n\nmodule.exports = function isGlob(str, options) {\n if (typeof str !== 'string' || str === '') {\n return false;\n }\n\n if (isExtglob(str)) {\n return true;\n }\n\n var regex = strictRegex;\n var match;\n\n // optionally relax regex\n if (options && options.strict === false) {\n regex = relaxedRegex;\n }\n\n while ((match = regex.exec(str))) {\n if (match[2]) return true;\n var idx = match.index + match[0].length;\n\n // if an open bracket/brace/paren is escaped,\n // set the index to the next closing character\n var open = match[1];\n var close = open ? chars[open] : null;\n if (open && close) {\n var n = str.indexOf(close, idx);\n if (n !== -1) {\n idx = n + 1;\n }\n }\n\n str = str.slice(idx);\n }\n return false;\n};\n","//TODO: handle reviver/dehydrate function like normal\n//and handle indentation, like normal.\n//if anyone needs this... please send pull request.\n\nexports.stringify = function stringify (o) {\n if('undefined' == typeof o) return o\n\n if(o && Buffer.isBuffer(o))\n return JSON.stringify(':base64:' + o.toString('base64'))\n\n if(o && o.toJSON)\n o = o.toJSON()\n\n if(o && 'object' === typeof o) {\n var s = ''\n var array = Array.isArray(o)\n s = array ? '[' : '{'\n var first = true\n\n for(var k in o) {\n var ignore = 'function' == typeof o[k] || (!array && 'undefined' === typeof o[k])\n if(Object.hasOwnProperty.call(o, k) && !ignore) {\n if(!first)\n s += ','\n first = false\n if (array) {\n if(o[k] == undefined)\n s += 'null'\n else\n s += stringify(o[k])\n } else if (o[k] !== void(0)) {\n s += stringify(k) + ':' + stringify(o[k])\n }\n }\n }\n\n s += array ? ']' : '}'\n\n return s\n } else if ('string' === typeof o) {\n return JSON.stringify(/^:/.test(o) ? ':' + o : o)\n } else if ('undefined' === typeof o) {\n return 'null';\n } else\n return JSON.stringify(o)\n}\n\nexports.parse = function (s) {\n return JSON.parse(s, function (key, value) {\n if('string' === typeof value) {\n if(/^:base64:/.test(value))\n return Buffer.from(value.substring(8), 'base64')\n else\n return /^:/.test(value) ? value.substring(1) : value \n }\n return value\n })\n}\n",null,"'use strict';\nmodule.exports = object => {\n\tconst result = {};\n\n\tfor (const [key, value] of Object.entries(object)) {\n\t\tresult[key.toLowerCase()] = value;\n\t}\n\n\treturn result;\n};\n","'use strict'\n/*\n * merge2\n * https://github.com/teambition/merge2\n *\n * Copyright (c) 2014-2020 Teambition\n * Licensed under the MIT license.\n */\nconst Stream = require('stream')\nconst PassThrough = Stream.PassThrough\nconst slice = Array.prototype.slice\n\nmodule.exports = merge2\n\nfunction merge2 () {\n const streamsQueue = []\n const args = slice.call(arguments)\n let merging = false\n let options = args[args.length - 1]\n\n if (options && !Array.isArray(options) && options.pipe == null) {\n args.pop()\n } else {\n options = {}\n }\n\n const doEnd = options.end !== false\n const doPipeError = options.pipeError === true\n if (options.objectMode == null) {\n options.objectMode = true\n }\n if (options.highWaterMark == null) {\n options.highWaterMark = 64 * 1024\n }\n const mergedStream = PassThrough(options)\n\n function addStream () {\n for (let i = 0, len = arguments.length; i < len; i++) {\n streamsQueue.push(pauseStreams(arguments[i], options))\n }\n mergeStream()\n return this\n }\n\n function mergeStream () {\n if (merging) {\n return\n }\n merging = true\n\n let streams = streamsQueue.shift()\n if (!streams) {\n process.nextTick(endStream)\n return\n }\n if (!Array.isArray(streams)) {\n streams = [streams]\n }\n\n let pipesCount = streams.length + 1\n\n function next () {\n if (--pipesCount > 0) {\n return\n }\n merging = false\n mergeStream()\n }\n\n function pipe (stream) {\n function onend () {\n stream.removeListener('merge2UnpipeEnd', onend)\n stream.removeListener('end', onend)\n if (doPipeError) {\n stream.removeListener('error', onerror)\n }\n next()\n }\n function onerror (err) {\n mergedStream.emit('error', err)\n }\n // skip ended stream\n if (stream._readableState.endEmitted) {\n return next()\n }\n\n stream.on('merge2UnpipeEnd', onend)\n stream.on('end', onend)\n\n if (doPipeError) {\n stream.on('error', onerror)\n }\n\n stream.pipe(mergedStream, { end: false })\n // compatible for old stream\n stream.resume()\n }\n\n for (let i = 0; i < streams.length; i++) {\n pipe(streams[i])\n }\n\n next()\n }\n\n function endStream () {\n merging = false\n // emit 'queueDrain' when all streams merged.\n mergedStream.emit('queueDrain')\n if (doEnd) {\n mergedStream.end()\n }\n }\n\n mergedStream.setMaxListeners(0)\n mergedStream.add = addStream\n mergedStream.on('unpipe', function (stream) {\n stream.emit('merge2UnpipeEnd')\n })\n\n if (args.length) {\n addStream.apply(null, args)\n }\n return mergedStream\n}\n\n// check and pause streams for pipe.\nfunction pauseStreams (streams, options) {\n if (!Array.isArray(streams)) {\n // Backwards-compat with old-style streams\n if (!streams._readableState && streams.pipe) {\n streams = streams.pipe(PassThrough(options))\n }\n if (!streams._readableState || !streams.pause || !streams.pipe) {\n throw new Error('Only readable stream can be merged.')\n }\n streams.pause()\n } else {\n for (let i = 0, len = streams.length; i < len; i++) {\n streams[i] = pauseStreams(streams[i], options)\n }\n }\n return streams\n}\n","'use strict';\n\n// We define these manually to ensure they're always copied\n// even if they would move up the prototype chain\n// https://nodejs.org/api/http.html#http_class_http_incomingmessage\nconst knownProps = [\n\t'destroy',\n\t'setTimeout',\n\t'socket',\n\t'headers',\n\t'trailers',\n\t'rawHeaders',\n\t'statusCode',\n\t'httpVersion',\n\t'httpVersionMinor',\n\t'httpVersionMajor',\n\t'rawTrailers',\n\t'statusMessage'\n];\n\nmodule.exports = (fromStream, toStream) => {\n\tconst fromProps = new Set(Object.keys(fromStream).concat(knownProps));\n\n\tfor (const prop of fromProps) {\n\t\t// Don't overwrite existing properties\n\t\tif (prop in toStream) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttoStream[prop] = typeof fromStream[prop] === 'function' ? fromStream[prop].bind(fromStream) : fromStream[prop];\n\t}\n};\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar Stream = _interopDefault(require('stream'));\nvar http = _interopDefault(require('http'));\nvar Url = _interopDefault(require('url'));\nvar https = _interopDefault(require('https'));\nvar zlib = _interopDefault(require('zlib'));\n\n// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js\n\n// fix for \"Readable\" isn't a named export issue\nconst Readable = Stream.Readable;\n\nconst BUFFER = Symbol('buffer');\nconst TYPE = Symbol('type');\n\nclass Blob {\n\tconstructor() {\n\t\tthis[TYPE] = '';\n\n\t\tconst blobParts = arguments[0];\n\t\tconst options = arguments[1];\n\n\t\tconst buffers = [];\n\t\tlet size = 0;\n\n\t\tif (blobParts) {\n\t\t\tconst a = blobParts;\n\t\t\tconst length = Number(a.length);\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tconst element = a[i];\n\t\t\t\tlet buffer;\n\t\t\t\tif (element instanceof Buffer) {\n\t\t\t\t\tbuffer = element;\n\t\t\t\t} else if (ArrayBuffer.isView(element)) {\n\t\t\t\t\tbuffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);\n\t\t\t\t} else if (element instanceof ArrayBuffer) {\n\t\t\t\t\tbuffer = Buffer.from(element);\n\t\t\t\t} else if (element instanceof Blob) {\n\t\t\t\t\tbuffer = element[BUFFER];\n\t\t\t\t} else {\n\t\t\t\t\tbuffer = Buffer.from(typeof element === 'string' ? element : String(element));\n\t\t\t\t}\n\t\t\t\tsize += buffer.length;\n\t\t\t\tbuffers.push(buffer);\n\t\t\t}\n\t\t}\n\n\t\tthis[BUFFER] = Buffer.concat(buffers);\n\n\t\tlet type = options && options.type !== undefined && String(options.type).toLowerCase();\n\t\tif (type && !/[^\\u0020-\\u007E]/.test(type)) {\n\t\t\tthis[TYPE] = type;\n\t\t}\n\t}\n\tget size() {\n\t\treturn this[BUFFER].length;\n\t}\n\tget type() {\n\t\treturn this[TYPE];\n\t}\n\ttext() {\n\t\treturn Promise.resolve(this[BUFFER].toString());\n\t}\n\tarrayBuffer() {\n\t\tconst buf = this[BUFFER];\n\t\tconst ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n\t\treturn Promise.resolve(ab);\n\t}\n\tstream() {\n\t\tconst readable = new Readable();\n\t\treadable._read = function () {};\n\t\treadable.push(this[BUFFER]);\n\t\treadable.push(null);\n\t\treturn readable;\n\t}\n\ttoString() {\n\t\treturn '[object Blob]';\n\t}\n\tslice() {\n\t\tconst size = this.size;\n\n\t\tconst start = arguments[0];\n\t\tconst end = arguments[1];\n\t\tlet relativeStart, relativeEnd;\n\t\tif (start === undefined) {\n\t\t\trelativeStart = 0;\n\t\t} else if (start < 0) {\n\t\t\trelativeStart = Math.max(size + start, 0);\n\t\t} else {\n\t\t\trelativeStart = Math.min(start, size);\n\t\t}\n\t\tif (end === undefined) {\n\t\t\trelativeEnd = size;\n\t\t} else if (end < 0) {\n\t\t\trelativeEnd = Math.max(size + end, 0);\n\t\t} else {\n\t\t\trelativeEnd = Math.min(end, size);\n\t\t}\n\t\tconst span = Math.max(relativeEnd - relativeStart, 0);\n\n\t\tconst buffer = this[BUFFER];\n\t\tconst slicedBuffer = buffer.slice(relativeStart, relativeStart + span);\n\t\tconst blob = new Blob([], { type: arguments[2] });\n\t\tblob[BUFFER] = slicedBuffer;\n\t\treturn blob;\n\t}\n}\n\nObject.defineProperties(Blob.prototype, {\n\tsize: { enumerable: true },\n\ttype: { enumerable: true },\n\tslice: { enumerable: true }\n});\n\nObject.defineProperty(Blob.prototype, Symbol.toStringTag, {\n\tvalue: 'Blob',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\n/**\n * fetch-error.js\n *\n * FetchError interface for operational errors\n */\n\n/**\n * Create FetchError instance\n *\n * @param String message Error message for human\n * @param String type Error type for machine\n * @param String systemError For Node.js system error\n * @return FetchError\n */\nfunction FetchError(message, type, systemError) {\n Error.call(this, message);\n\n this.message = message;\n this.type = type;\n\n // when err.type is `system`, err.code contains system error code\n if (systemError) {\n this.code = this.errno = systemError.code;\n }\n\n // hide custom error implementation details from end-users\n Error.captureStackTrace(this, this.constructor);\n}\n\nFetchError.prototype = Object.create(Error.prototype);\nFetchError.prototype.constructor = FetchError;\nFetchError.prototype.name = 'FetchError';\n\nlet convert;\ntry {\n\tconvert = require('encoding').convert;\n} catch (e) {}\n\nconst INTERNALS = Symbol('Body internals');\n\n// fix an issue where \"PassThrough\" isn't a named export for node <10\nconst PassThrough = Stream.PassThrough;\n\n/**\n * Body mixin\n *\n * Ref: https://fetch.spec.whatwg.org/#body\n *\n * @param Stream body Readable stream\n * @param Object opts Response options\n * @return Void\n */\nfunction Body(body) {\n\tvar _this = this;\n\n\tvar _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n\t _ref$size = _ref.size;\n\n\tlet size = _ref$size === undefined ? 0 : _ref$size;\n\tvar _ref$timeout = _ref.timeout;\n\tlet timeout = _ref$timeout === undefined ? 0 : _ref$timeout;\n\n\tif (body == null) {\n\t\t// body is undefined or null\n\t\tbody = null;\n\t} else if (isURLSearchParams(body)) {\n\t\t// body is a URLSearchParams\n\t\tbody = Buffer.from(body.toString());\n\t} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {\n\t\t// body is ArrayBuffer\n\t\tbody = Buffer.from(body);\n\t} else if (ArrayBuffer.isView(body)) {\n\t\t// body is ArrayBufferView\n\t\tbody = Buffer.from(body.buffer, body.byteOffset, body.byteLength);\n\t} else if (body instanceof Stream) ; else {\n\t\t// none of the above\n\t\t// coerce to string then buffer\n\t\tbody = Buffer.from(String(body));\n\t}\n\tthis[INTERNALS] = {\n\t\tbody,\n\t\tdisturbed: false,\n\t\terror: null\n\t};\n\tthis.size = size;\n\tthis.timeout = timeout;\n\n\tif (body instanceof Stream) {\n\t\tbody.on('error', function (err) {\n\t\t\tconst error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);\n\t\t\t_this[INTERNALS].error = error;\n\t\t});\n\t}\n}\n\nBody.prototype = {\n\tget body() {\n\t\treturn this[INTERNALS].body;\n\t},\n\n\tget bodyUsed() {\n\t\treturn this[INTERNALS].disturbed;\n\t},\n\n\t/**\n * Decode response as ArrayBuffer\n *\n * @return Promise\n */\n\tarrayBuffer() {\n\t\treturn consumeBody.call(this).then(function (buf) {\n\t\t\treturn buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n\t\t});\n\t},\n\n\t/**\n * Return raw response as Blob\n *\n * @return Promise\n */\n\tblob() {\n\t\tlet ct = this.headers && this.headers.get('content-type') || '';\n\t\treturn consumeBody.call(this).then(function (buf) {\n\t\t\treturn Object.assign(\n\t\t\t// Prevent copying\n\t\t\tnew Blob([], {\n\t\t\t\ttype: ct.toLowerCase()\n\t\t\t}), {\n\t\t\t\t[BUFFER]: buf\n\t\t\t});\n\t\t});\n\t},\n\n\t/**\n * Decode response as json\n *\n * @return Promise\n */\n\tjson() {\n\t\tvar _this2 = this;\n\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buffer.toString());\n\t\t\t} catch (err) {\n\t\t\t\treturn Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n * Decode response as text\n *\n * @return Promise\n */\n\ttext() {\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\treturn buffer.toString();\n\t\t});\n\t},\n\n\t/**\n * Decode response as buffer (non-spec api)\n *\n * @return Promise\n */\n\tbuffer() {\n\t\treturn consumeBody.call(this);\n\t},\n\n\t/**\n * Decode response as text, while automatically detecting the encoding and\n * trying to decode to UTF-8 (non-spec api)\n *\n * @return Promise\n */\n\ttextConverted() {\n\t\tvar _this3 = this;\n\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\treturn convertBody(buffer, _this3.headers);\n\t\t});\n\t}\n};\n\n// In browsers, all properties are enumerable.\nObject.defineProperties(Body.prototype, {\n\tbody: { enumerable: true },\n\tbodyUsed: { enumerable: true },\n\tarrayBuffer: { enumerable: true },\n\tblob: { enumerable: true },\n\tjson: { enumerable: true },\n\ttext: { enumerable: true }\n});\n\nBody.mixIn = function (proto) {\n\tfor (const name of Object.getOwnPropertyNames(Body.prototype)) {\n\t\t// istanbul ignore else: future proof\n\t\tif (!(name in proto)) {\n\t\t\tconst desc = Object.getOwnPropertyDescriptor(Body.prototype, name);\n\t\t\tObject.defineProperty(proto, name, desc);\n\t\t}\n\t}\n};\n\n/**\n * Consume and convert an entire Body to a Buffer.\n *\n * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body\n *\n * @return Promise\n */\nfunction consumeBody() {\n\tvar _this4 = this;\n\n\tif (this[INTERNALS].disturbed) {\n\t\treturn Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));\n\t}\n\n\tthis[INTERNALS].disturbed = true;\n\n\tif (this[INTERNALS].error) {\n\t\treturn Body.Promise.reject(this[INTERNALS].error);\n\t}\n\n\tlet body = this.body;\n\n\t// body is null\n\tif (body === null) {\n\t\treturn Body.Promise.resolve(Buffer.alloc(0));\n\t}\n\n\t// body is blob\n\tif (isBlob(body)) {\n\t\tbody = body.stream();\n\t}\n\n\t// body is buffer\n\tif (Buffer.isBuffer(body)) {\n\t\treturn Body.Promise.resolve(body);\n\t}\n\n\t// istanbul ignore if: should never happen\n\tif (!(body instanceof Stream)) {\n\t\treturn Body.Promise.resolve(Buffer.alloc(0));\n\t}\n\n\t// body is stream\n\t// get ready to actually consume the body\n\tlet accum = [];\n\tlet accumBytes = 0;\n\tlet abort = false;\n\n\treturn new Body.Promise(function (resolve, reject) {\n\t\tlet resTimeout;\n\n\t\t// allow timeout on slow response body\n\t\tif (_this4.timeout) {\n\t\t\tresTimeout = setTimeout(function () {\n\t\t\t\tabort = true;\n\t\t\t\treject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));\n\t\t\t}, _this4.timeout);\n\t\t}\n\n\t\t// handle stream errors\n\t\tbody.on('error', function (err) {\n\t\t\tif (err.name === 'AbortError') {\n\t\t\t\t// if the request was aborted, reject with this Error\n\t\t\t\tabort = true;\n\t\t\t\treject(err);\n\t\t\t} else {\n\t\t\t\t// other errors, such as incorrect content-encoding\n\t\t\t\treject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));\n\t\t\t}\n\t\t});\n\n\t\tbody.on('data', function (chunk) {\n\t\t\tif (abort || chunk === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (_this4.size && accumBytes + chunk.length > _this4.size) {\n\t\t\t\tabort = true;\n\t\t\t\treject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\taccumBytes += chunk.length;\n\t\t\taccum.push(chunk);\n\t\t});\n\n\t\tbody.on('end', function () {\n\t\t\tif (abort) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tclearTimeout(resTimeout);\n\n\t\t\ttry {\n\t\t\t\tresolve(Buffer.concat(accum, accumBytes));\n\t\t\t} catch (err) {\n\t\t\t\t// handle streams that have accumulated too much data (issue #414)\n\t\t\t\treject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect buffer encoding and convert to target encoding\n * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding\n *\n * @param Buffer buffer Incoming buffer\n * @param String encoding Target encoding\n * @return String\n */\nfunction convertBody(buffer, headers) {\n\tif (typeof convert !== 'function') {\n\t\tthrow new Error('The package `encoding` must be installed to use the textConverted() function');\n\t}\n\n\tconst ct = headers.get('content-type');\n\tlet charset = 'utf-8';\n\tlet res, str;\n\n\t// header\n\tif (ct) {\n\t\tres = /charset=([^;]*)/i.exec(ct);\n\t}\n\n\t// no charset in content type, peek at response body for at most 1024 bytes\n\tstr = buffer.slice(0, 1024).toString();\n\n\t// html5\n\tif (!res && str) {\n\t\tres = / 0 && arguments[0] !== undefined ? arguments[0] : undefined;\n\n\t\tthis[MAP] = Object.create(null);\n\n\t\tif (init instanceof Headers) {\n\t\t\tconst rawHeaders = init.raw();\n\t\t\tconst headerNames = Object.keys(rawHeaders);\n\n\t\t\tfor (const headerName of headerNames) {\n\t\t\t\tfor (const value of rawHeaders[headerName]) {\n\t\t\t\t\tthis.append(headerName, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// We don't worry about converting prop to ByteString here as append()\n\t\t// will handle it.\n\t\tif (init == null) ; else if (typeof init === 'object') {\n\t\t\tconst method = init[Symbol.iterator];\n\t\t\tif (method != null) {\n\t\t\t\tif (typeof method !== 'function') {\n\t\t\t\t\tthrow new TypeError('Header pairs must be iterable');\n\t\t\t\t}\n\n\t\t\t\t// sequence>\n\t\t\t\t// Note: per spec we have to first exhaust the lists then process them\n\t\t\t\tconst pairs = [];\n\t\t\t\tfor (const pair of init) {\n\t\t\t\t\tif (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {\n\t\t\t\t\t\tthrow new TypeError('Each header pair must be iterable');\n\t\t\t\t\t}\n\t\t\t\t\tpairs.push(Array.from(pair));\n\t\t\t\t}\n\n\t\t\t\tfor (const pair of pairs) {\n\t\t\t\t\tif (pair.length !== 2) {\n\t\t\t\t\t\tthrow new TypeError('Each header pair must be a name/value tuple');\n\t\t\t\t\t}\n\t\t\t\t\tthis.append(pair[0], pair[1]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// record\n\t\t\t\tfor (const key of Object.keys(init)) {\n\t\t\t\t\tconst value = init[key];\n\t\t\t\t\tthis.append(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('Provided initializer must be an object');\n\t\t}\n\t}\n\n\t/**\n * Return combined header value given name\n *\n * @param String name Header name\n * @return Mixed\n */\n\tget(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this[MAP][key].join(', ');\n\t}\n\n\t/**\n * Iterate over all headers\n *\n * @param Function callback Executed for each item with parameters (value, name, thisArg)\n * @param Boolean thisArg `this` context for callback function\n * @return Void\n */\n\tforEach(callback) {\n\t\tlet thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;\n\n\t\tlet pairs = getHeaders(this);\n\t\tlet i = 0;\n\t\twhile (i < pairs.length) {\n\t\t\tvar _pairs$i = pairs[i];\n\t\t\tconst name = _pairs$i[0],\n\t\t\t value = _pairs$i[1];\n\n\t\t\tcallback.call(thisArg, value, name, this);\n\t\t\tpairs = getHeaders(this);\n\t\t\ti++;\n\t\t}\n\t}\n\n\t/**\n * Overwrite header values given name\n *\n * @param String name Header name\n * @param String value Header value\n * @return Void\n */\n\tset(name, value) {\n\t\tname = `${name}`;\n\t\tvalue = `${value}`;\n\t\tvalidateName(name);\n\t\tvalidateValue(value);\n\t\tconst key = find(this[MAP], name);\n\t\tthis[MAP][key !== undefined ? key : name] = [value];\n\t}\n\n\t/**\n * Append a value onto existing header\n *\n * @param String name Header name\n * @param String value Header value\n * @return Void\n */\n\tappend(name, value) {\n\t\tname = `${name}`;\n\t\tvalue = `${value}`;\n\t\tvalidateName(name);\n\t\tvalidateValue(value);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key !== undefined) {\n\t\t\tthis[MAP][key].push(value);\n\t\t} else {\n\t\t\tthis[MAP][name] = [value];\n\t\t}\n\t}\n\n\t/**\n * Check for header name existence\n *\n * @param String name Header name\n * @return Boolean\n */\n\thas(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\treturn find(this[MAP], name) !== undefined;\n\t}\n\n\t/**\n * Delete all header values given name\n *\n * @param String name Header name\n * @return Void\n */\n\tdelete(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key !== undefined) {\n\t\t\tdelete this[MAP][key];\n\t\t}\n\t}\n\n\t/**\n * Return raw headers (non-spec api)\n *\n * @return Object\n */\n\traw() {\n\t\treturn this[MAP];\n\t}\n\n\t/**\n * Get an iterator on keys.\n *\n * @return Iterator\n */\n\tkeys() {\n\t\treturn createHeadersIterator(this, 'key');\n\t}\n\n\t/**\n * Get an iterator on values.\n *\n * @return Iterator\n */\n\tvalues() {\n\t\treturn createHeadersIterator(this, 'value');\n\t}\n\n\t/**\n * Get an iterator on entries.\n *\n * This is the default iterator of the Headers object.\n *\n * @return Iterator\n */\n\t[Symbol.iterator]() {\n\t\treturn createHeadersIterator(this, 'key+value');\n\t}\n}\nHeaders.prototype.entries = Headers.prototype[Symbol.iterator];\n\nObject.defineProperty(Headers.prototype, Symbol.toStringTag, {\n\tvalue: 'Headers',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nObject.defineProperties(Headers.prototype, {\n\tget: { enumerable: true },\n\tforEach: { enumerable: true },\n\tset: { enumerable: true },\n\tappend: { enumerable: true },\n\thas: { enumerable: true },\n\tdelete: { enumerable: true },\n\tkeys: { enumerable: true },\n\tvalues: { enumerable: true },\n\tentries: { enumerable: true }\n});\n\nfunction getHeaders(headers) {\n\tlet kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';\n\n\tconst keys = Object.keys(headers[MAP]).sort();\n\treturn keys.map(kind === 'key' ? function (k) {\n\t\treturn k.toLowerCase();\n\t} : kind === 'value' ? function (k) {\n\t\treturn headers[MAP][k].join(', ');\n\t} : function (k) {\n\t\treturn [k.toLowerCase(), headers[MAP][k].join(', ')];\n\t});\n}\n\nconst INTERNAL = Symbol('internal');\n\nfunction createHeadersIterator(target, kind) {\n\tconst iterator = Object.create(HeadersIteratorPrototype);\n\titerator[INTERNAL] = {\n\t\ttarget,\n\t\tkind,\n\t\tindex: 0\n\t};\n\treturn iterator;\n}\n\nconst HeadersIteratorPrototype = Object.setPrototypeOf({\n\tnext() {\n\t\t// istanbul ignore if\n\t\tif (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {\n\t\t\tthrow new TypeError('Value of `this` is not a HeadersIterator');\n\t\t}\n\n\t\tvar _INTERNAL = this[INTERNAL];\n\t\tconst target = _INTERNAL.target,\n\t\t kind = _INTERNAL.kind,\n\t\t index = _INTERNAL.index;\n\n\t\tconst values = getHeaders(target, kind);\n\t\tconst len = values.length;\n\t\tif (index >= len) {\n\t\t\treturn {\n\t\t\t\tvalue: undefined,\n\t\t\t\tdone: true\n\t\t\t};\n\t\t}\n\n\t\tthis[INTERNAL].index = index + 1;\n\n\t\treturn {\n\t\t\tvalue: values[index],\n\t\t\tdone: false\n\t\t};\n\t}\n}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));\n\nObject.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {\n\tvalue: 'HeadersIterator',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\n/**\n * Export the Headers object in a form that Node.js can consume.\n *\n * @param Headers headers\n * @return Object\n */\nfunction exportNodeCompatibleHeaders(headers) {\n\tconst obj = Object.assign({ __proto__: null }, headers[MAP]);\n\n\t// http.request() only supports string as Host header. This hack makes\n\t// specifying custom Host header possible.\n\tconst hostHeaderKey = find(headers[MAP], 'Host');\n\tif (hostHeaderKey !== undefined) {\n\t\tobj[hostHeaderKey] = obj[hostHeaderKey][0];\n\t}\n\n\treturn obj;\n}\n\n/**\n * Create a Headers object from an object of headers, ignoring those that do\n * not conform to HTTP grammar productions.\n *\n * @param Object obj Object of headers\n * @return Headers\n */\nfunction createHeadersLenient(obj) {\n\tconst headers = new Headers();\n\tfor (const name of Object.keys(obj)) {\n\t\tif (invalidTokenRegex.test(name)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(obj[name])) {\n\t\t\tfor (const val of obj[name]) {\n\t\t\t\tif (invalidHeaderCharRegex.test(val)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (headers[MAP][name] === undefined) {\n\t\t\t\t\theaders[MAP][name] = [val];\n\t\t\t\t} else {\n\t\t\t\t\theaders[MAP][name].push(val);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (!invalidHeaderCharRegex.test(obj[name])) {\n\t\t\theaders[MAP][name] = [obj[name]];\n\t\t}\n\t}\n\treturn headers;\n}\n\nconst INTERNALS$1 = Symbol('Response internals');\n\n// fix an issue where \"STATUS_CODES\" aren't a named export for node <10\nconst STATUS_CODES = http.STATUS_CODES;\n\n/**\n * Response class\n *\n * @param Stream body Readable stream\n * @param Object opts Response options\n * @return Void\n */\nclass Response {\n\tconstructor() {\n\t\tlet body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\t\tlet opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tBody.call(this, body, opts);\n\n\t\tconst status = opts.status || 200;\n\t\tconst headers = new Headers(opts.headers);\n\n\t\tif (body != null && !headers.has('Content-Type')) {\n\t\t\tconst contentType = extractContentType(body);\n\t\t\tif (contentType) {\n\t\t\t\theaders.append('Content-Type', contentType);\n\t\t\t}\n\t\t}\n\n\t\tthis[INTERNALS$1] = {\n\t\t\turl: opts.url,\n\t\t\tstatus,\n\t\t\tstatusText: opts.statusText || STATUS_CODES[status],\n\t\t\theaders,\n\t\t\tcounter: opts.counter\n\t\t};\n\t}\n\n\tget url() {\n\t\treturn this[INTERNALS$1].url || '';\n\t}\n\n\tget status() {\n\t\treturn this[INTERNALS$1].status;\n\t}\n\n\t/**\n * Convenience property representing if the request ended normally\n */\n\tget ok() {\n\t\treturn this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;\n\t}\n\n\tget redirected() {\n\t\treturn this[INTERNALS$1].counter > 0;\n\t}\n\n\tget statusText() {\n\t\treturn this[INTERNALS$1].statusText;\n\t}\n\n\tget headers() {\n\t\treturn this[INTERNALS$1].headers;\n\t}\n\n\t/**\n * Clone this response\n *\n * @return Response\n */\n\tclone() {\n\t\treturn new Response(clone(this), {\n\t\t\turl: this.url,\n\t\t\tstatus: this.status,\n\t\t\tstatusText: this.statusText,\n\t\t\theaders: this.headers,\n\t\t\tok: this.ok,\n\t\t\tredirected: this.redirected\n\t\t});\n\t}\n}\n\nBody.mixIn(Response.prototype);\n\nObject.defineProperties(Response.prototype, {\n\turl: { enumerable: true },\n\tstatus: { enumerable: true },\n\tok: { enumerable: true },\n\tredirected: { enumerable: true },\n\tstatusText: { enumerable: true },\n\theaders: { enumerable: true },\n\tclone: { enumerable: true }\n});\n\nObject.defineProperty(Response.prototype, Symbol.toStringTag, {\n\tvalue: 'Response',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nconst INTERNALS$2 = Symbol('Request internals');\n\n// fix an issue where \"format\", \"parse\" aren't a named export for node <10\nconst parse_url = Url.parse;\nconst format_url = Url.format;\n\nconst streamDestructionSupported = 'destroy' in Stream.Readable.prototype;\n\n/**\n * Check if a value is an instance of Request.\n *\n * @param Mixed input\n * @return Boolean\n */\nfunction isRequest(input) {\n\treturn typeof input === 'object' && typeof input[INTERNALS$2] === 'object';\n}\n\nfunction isAbortSignal(signal) {\n\tconst proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);\n\treturn !!(proto && proto.constructor.name === 'AbortSignal');\n}\n\n/**\n * Request class\n *\n * @param Mixed input Url or Request instance\n * @param Object init Custom options\n * @return Void\n */\nclass Request {\n\tconstructor(input) {\n\t\tlet init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tlet parsedURL;\n\n\t\t// normalize input\n\t\tif (!isRequest(input)) {\n\t\t\tif (input && input.href) {\n\t\t\t\t// in order to support Node.js' Url objects; though WHATWG's URL objects\n\t\t\t\t// will fall into this branch also (since their `toString()` will return\n\t\t\t\t// `href` property anyway)\n\t\t\t\tparsedURL = parse_url(input.href);\n\t\t\t} else {\n\t\t\t\t// coerce input to a string before attempting to parse\n\t\t\t\tparsedURL = parse_url(`${input}`);\n\t\t\t}\n\t\t\tinput = {};\n\t\t} else {\n\t\t\tparsedURL = parse_url(input.url);\n\t\t}\n\n\t\tlet method = init.method || input.method || 'GET';\n\t\tmethod = method.toUpperCase();\n\n\t\tif ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {\n\t\t\tthrow new TypeError('Request with GET/HEAD method cannot have body');\n\t\t}\n\n\t\tlet inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;\n\n\t\tBody.call(this, inputBody, {\n\t\t\ttimeout: init.timeout || input.timeout || 0,\n\t\t\tsize: init.size || input.size || 0\n\t\t});\n\n\t\tconst headers = new Headers(init.headers || input.headers || {});\n\n\t\tif (inputBody != null && !headers.has('Content-Type')) {\n\t\t\tconst contentType = extractContentType(inputBody);\n\t\t\tif (contentType) {\n\t\t\t\theaders.append('Content-Type', contentType);\n\t\t\t}\n\t\t}\n\n\t\tlet signal = isRequest(input) ? input.signal : null;\n\t\tif ('signal' in init) signal = init.signal;\n\n\t\tif (signal != null && !isAbortSignal(signal)) {\n\t\t\tthrow new TypeError('Expected signal to be an instanceof AbortSignal');\n\t\t}\n\n\t\tthis[INTERNALS$2] = {\n\t\t\tmethod,\n\t\t\tredirect: init.redirect || input.redirect || 'follow',\n\t\t\theaders,\n\t\t\tparsedURL,\n\t\t\tsignal\n\t\t};\n\n\t\t// node-fetch-only options\n\t\tthis.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;\n\t\tthis.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;\n\t\tthis.counter = init.counter || input.counter || 0;\n\t\tthis.agent = init.agent || input.agent;\n\t}\n\n\tget method() {\n\t\treturn this[INTERNALS$2].method;\n\t}\n\n\tget url() {\n\t\treturn format_url(this[INTERNALS$2].parsedURL);\n\t}\n\n\tget headers() {\n\t\treturn this[INTERNALS$2].headers;\n\t}\n\n\tget redirect() {\n\t\treturn this[INTERNALS$2].redirect;\n\t}\n\n\tget signal() {\n\t\treturn this[INTERNALS$2].signal;\n\t}\n\n\t/**\n * Clone this request\n *\n * @return Request\n */\n\tclone() {\n\t\treturn new Request(this);\n\t}\n}\n\nBody.mixIn(Request.prototype);\n\nObject.defineProperty(Request.prototype, Symbol.toStringTag, {\n\tvalue: 'Request',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nObject.defineProperties(Request.prototype, {\n\tmethod: { enumerable: true },\n\turl: { enumerable: true },\n\theaders: { enumerable: true },\n\tredirect: { enumerable: true },\n\tclone: { enumerable: true },\n\tsignal: { enumerable: true }\n});\n\n/**\n * Convert a Request to Node.js http request options.\n *\n * @param Request A Request instance\n * @return Object The options object to be passed to http.request\n */\nfunction getNodeRequestOptions(request) {\n\tconst parsedURL = request[INTERNALS$2].parsedURL;\n\tconst headers = new Headers(request[INTERNALS$2].headers);\n\n\t// fetch step 1.3\n\tif (!headers.has('Accept')) {\n\t\theaders.set('Accept', '*/*');\n\t}\n\n\t// Basic fetch\n\tif (!parsedURL.protocol || !parsedURL.hostname) {\n\t\tthrow new TypeError('Only absolute URLs are supported');\n\t}\n\n\tif (!/^https?:$/.test(parsedURL.protocol)) {\n\t\tthrow new TypeError('Only HTTP(S) protocols are supported');\n\t}\n\n\tif (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {\n\t\tthrow new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');\n\t}\n\n\t// HTTP-network-or-cache fetch steps 2.4-2.7\n\tlet contentLengthValue = null;\n\tif (request.body == null && /^(POST|PUT)$/i.test(request.method)) {\n\t\tcontentLengthValue = '0';\n\t}\n\tif (request.body != null) {\n\t\tconst totalBytes = getTotalBytes(request);\n\t\tif (typeof totalBytes === 'number') {\n\t\t\tcontentLengthValue = String(totalBytes);\n\t\t}\n\t}\n\tif (contentLengthValue) {\n\t\theaders.set('Content-Length', contentLengthValue);\n\t}\n\n\t// HTTP-network-or-cache fetch step 2.11\n\tif (!headers.has('User-Agent')) {\n\t\theaders.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');\n\t}\n\n\t// HTTP-network-or-cache fetch step 2.15\n\tif (request.compress && !headers.has('Accept-Encoding')) {\n\t\theaders.set('Accept-Encoding', 'gzip,deflate');\n\t}\n\n\tlet agent = request.agent;\n\tif (typeof agent === 'function') {\n\t\tagent = agent(parsedURL);\n\t}\n\n\tif (!headers.has('Connection') && !agent) {\n\t\theaders.set('Connection', 'close');\n\t}\n\n\t// HTTP-network fetch step 4.2\n\t// chunked encoding is handled by Node.js\n\n\treturn Object.assign({}, parsedURL, {\n\t\tmethod: request.method,\n\t\theaders: exportNodeCompatibleHeaders(headers),\n\t\tagent\n\t});\n}\n\n/**\n * abort-error.js\n *\n * AbortError interface for cancelled requests\n */\n\n/**\n * Create AbortError instance\n *\n * @param String message Error message for human\n * @return AbortError\n */\nfunction AbortError(message) {\n Error.call(this, message);\n\n this.type = 'aborted';\n this.message = message;\n\n // hide custom error implementation details from end-users\n Error.captureStackTrace(this, this.constructor);\n}\n\nAbortError.prototype = Object.create(Error.prototype);\nAbortError.prototype.constructor = AbortError;\nAbortError.prototype.name = 'AbortError';\n\n// fix an issue where \"PassThrough\", \"resolve\" aren't a named export for node <10\nconst PassThrough$1 = Stream.PassThrough;\nconst resolve_url = Url.resolve;\n\n/**\n * Fetch function\n *\n * @param Mixed url Absolute url or Request instance\n * @param Object opts Fetch options\n * @return Promise\n */\nfunction fetch(url, opts) {\n\n\t// allow custom promise\n\tif (!fetch.Promise) {\n\t\tthrow new Error('native promise missing, set fetch.Promise to your favorite alternative');\n\t}\n\n\tBody.Promise = fetch.Promise;\n\n\t// wrap http.request into fetch\n\treturn new fetch.Promise(function (resolve, reject) {\n\t\t// build request object\n\t\tconst request = new Request(url, opts);\n\t\tconst options = getNodeRequestOptions(request);\n\n\t\tconst send = (options.protocol === 'https:' ? https : http).request;\n\t\tconst signal = request.signal;\n\n\t\tlet response = null;\n\n\t\tconst abort = function abort() {\n\t\t\tlet error = new AbortError('The user aborted a request.');\n\t\t\treject(error);\n\t\t\tif (request.body && request.body instanceof Stream.Readable) {\n\t\t\t\trequest.body.destroy(error);\n\t\t\t}\n\t\t\tif (!response || !response.body) return;\n\t\t\tresponse.body.emit('error', error);\n\t\t};\n\n\t\tif (signal && signal.aborted) {\n\t\t\tabort();\n\t\t\treturn;\n\t\t}\n\n\t\tconst abortAndFinalize = function abortAndFinalize() {\n\t\t\tabort();\n\t\t\tfinalize();\n\t\t};\n\n\t\t// send request\n\t\tconst req = send(options);\n\t\tlet reqTimeout;\n\n\t\tif (signal) {\n\t\t\tsignal.addEventListener('abort', abortAndFinalize);\n\t\t}\n\n\t\tfunction finalize() {\n\t\t\treq.abort();\n\t\t\tif (signal) signal.removeEventListener('abort', abortAndFinalize);\n\t\t\tclearTimeout(reqTimeout);\n\t\t}\n\n\t\tif (request.timeout) {\n\t\t\treq.once('socket', function (socket) {\n\t\t\t\treqTimeout = setTimeout(function () {\n\t\t\t\t\treject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));\n\t\t\t\t\tfinalize();\n\t\t\t\t}, request.timeout);\n\t\t\t});\n\t\t}\n\n\t\treq.on('error', function (err) {\n\t\t\treject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));\n\t\t\tfinalize();\n\t\t});\n\n\t\treq.on('response', function (res) {\n\t\t\tclearTimeout(reqTimeout);\n\n\t\t\tconst headers = createHeadersLenient(res.headers);\n\n\t\t\t// HTTP fetch step 5\n\t\t\tif (fetch.isRedirect(res.statusCode)) {\n\t\t\t\t// HTTP fetch step 5.2\n\t\t\t\tconst location = headers.get('Location');\n\n\t\t\t\t// HTTP fetch step 5.3\n\t\t\t\tconst locationURL = location === null ? null : resolve_url(request.url, location);\n\n\t\t\t\t// HTTP fetch step 5.5\n\t\t\t\tswitch (request.redirect) {\n\t\t\t\t\tcase 'error':\n\t\t\t\t\t\treject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase 'manual':\n\t\t\t\t\t\t// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.\n\t\t\t\t\t\tif (locationURL !== null) {\n\t\t\t\t\t\t\t// handle corrupted header\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\theaders.set('Location', locationURL);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'follow':\n\t\t\t\t\t\t// HTTP-redirect fetch step 2\n\t\t\t\t\t\tif (locationURL === null) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 5\n\t\t\t\t\t\tif (request.counter >= request.follow) {\n\t\t\t\t\t\t\treject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));\n\t\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 6 (counter increment)\n\t\t\t\t\t\t// Create a new Request object.\n\t\t\t\t\t\tconst requestOpts = {\n\t\t\t\t\t\t\theaders: new Headers(request.headers),\n\t\t\t\t\t\t\tfollow: request.follow,\n\t\t\t\t\t\t\tcounter: request.counter + 1,\n\t\t\t\t\t\t\tagent: request.agent,\n\t\t\t\t\t\t\tcompress: request.compress,\n\t\t\t\t\t\t\tmethod: request.method,\n\t\t\t\t\t\t\tbody: request.body,\n\t\t\t\t\t\t\tsignal: request.signal,\n\t\t\t\t\t\t\ttimeout: request.timeout,\n\t\t\t\t\t\t\tsize: request.size\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 9\n\t\t\t\t\t\tif (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {\n\t\t\t\t\t\t\treject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));\n\t\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 11\n\t\t\t\t\t\tif (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {\n\t\t\t\t\t\t\trequestOpts.method = 'GET';\n\t\t\t\t\t\t\trequestOpts.body = undefined;\n\t\t\t\t\t\t\trequestOpts.headers.delete('content-length');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 15\n\t\t\t\t\t\tresolve(fetch(new Request(locationURL, requestOpts)));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// prepare response\n\t\t\tres.once('end', function () {\n\t\t\t\tif (signal) signal.removeEventListener('abort', abortAndFinalize);\n\t\t\t});\n\t\t\tlet body = res.pipe(new PassThrough$1());\n\n\t\t\tconst response_options = {\n\t\t\t\turl: request.url,\n\t\t\t\tstatus: res.statusCode,\n\t\t\t\tstatusText: res.statusMessage,\n\t\t\t\theaders: headers,\n\t\t\t\tsize: request.size,\n\t\t\t\ttimeout: request.timeout,\n\t\t\t\tcounter: request.counter\n\t\t\t};\n\n\t\t\t// HTTP-network fetch step 12.1.1.3\n\t\t\tconst codings = headers.get('Content-Encoding');\n\n\t\t\t// HTTP-network fetch step 12.1.1.4: handle content codings\n\n\t\t\t// in following scenarios we ignore compression support\n\t\t\t// 1. compression support is disabled\n\t\t\t// 2. HEAD request\n\t\t\t// 3. no Content-Encoding header\n\t\t\t// 4. no content response (204)\n\t\t\t// 5. content not modified response (304)\n\t\t\tif (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// For Node v6+\n\t\t\t// Be less strict when decoding compressed responses, since sometimes\n\t\t\t// servers send slightly invalid responses that are still accepted\n\t\t\t// by common browsers.\n\t\t\t// Always using Z_SYNC_FLUSH is what cURL does.\n\t\t\tconst zlibOptions = {\n\t\t\t\tflush: zlib.Z_SYNC_FLUSH,\n\t\t\t\tfinishFlush: zlib.Z_SYNC_FLUSH\n\t\t\t};\n\n\t\t\t// for gzip\n\t\t\tif (codings == 'gzip' || codings == 'x-gzip') {\n\t\t\t\tbody = body.pipe(zlib.createGunzip(zlibOptions));\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// for deflate\n\t\t\tif (codings == 'deflate' || codings == 'x-deflate') {\n\t\t\t\t// handle the infamous raw deflate response from old servers\n\t\t\t\t// a hack for old IIS and Apache servers\n\t\t\t\tconst raw = res.pipe(new PassThrough$1());\n\t\t\t\traw.once('data', function (chunk) {\n\t\t\t\t\t// see http://stackoverflow.com/questions/37519828\n\t\t\t\t\tif ((chunk[0] & 0x0F) === 0x08) {\n\t\t\t\t\t\tbody = body.pipe(zlib.createInflate());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbody = body.pipe(zlib.createInflateRaw());\n\t\t\t\t\t}\n\t\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\t\tresolve(response);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// for br\n\t\t\tif (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {\n\t\t\t\tbody = body.pipe(zlib.createBrotliDecompress());\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// otherwise, use response as-is\n\t\t\tresponse = new Response(body, response_options);\n\t\t\tresolve(response);\n\t\t});\n\n\t\twriteToStream(req, request);\n\t});\n}\n/**\n * Redirect code matching\n *\n * @param Number code Status code\n * @return Boolean\n */\nfetch.isRedirect = function (code) {\n\treturn code === 301 || code === 302 || code === 303 || code === 307 || code === 308;\n};\n\n// expose Promise\nfetch.Promise = global.Promise;\n\nmodule.exports = exports = fetch;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = exports;\nexports.Headers = Headers;\nexports.Request = Request;\nexports.Response = Response;\nexports.FetchError = FetchError;\n","'use strict';\n// TODO: Use the `URL` global when targeting Node.js 10\nconst URLParser = typeof URL === 'undefined' ? require('url').URL : URL;\n\n// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\nconst DATA_URL_DEFAULT_MIME_TYPE = 'text/plain';\nconst DATA_URL_DEFAULT_CHARSET = 'us-ascii';\n\nconst testParameter = (name, filters) => {\n\treturn filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);\n};\n\nconst normalizeDataURL = (urlString, {stripHash}) => {\n\tconst parts = urlString.match(/^data:(.*?),(.*?)(?:#(.*))?$/);\n\n\tif (!parts) {\n\t\tthrow new Error(`Invalid URL: ${urlString}`);\n\t}\n\n\tconst mediaType = parts[1].split(';');\n\tconst body = parts[2];\n\tconst hash = stripHash ? '' : parts[3];\n\n\tlet base64 = false;\n\n\tif (mediaType[mediaType.length - 1] === 'base64') {\n\t\tmediaType.pop();\n\t\tbase64 = true;\n\t}\n\n\t// Lowercase MIME type\n\tconst mimeType = (mediaType.shift() || '').toLowerCase();\n\tconst attributes = mediaType\n\t\t.map(attribute => {\n\t\t\tlet [key, value = ''] = attribute.split('=').map(string => string.trim());\n\n\t\t\t// Lowercase `charset`\n\t\t\tif (key === 'charset') {\n\t\t\t\tvalue = value.toLowerCase();\n\n\t\t\t\tif (value === DATA_URL_DEFAULT_CHARSET) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn `${key}${value ? `=${value}` : ''}`;\n\t\t})\n\t\t.filter(Boolean);\n\n\tconst normalizedMediaType = [\n\t\t...attributes\n\t];\n\n\tif (base64) {\n\t\tnormalizedMediaType.push('base64');\n\t}\n\n\tif (normalizedMediaType.length !== 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) {\n\t\tnormalizedMediaType.unshift(mimeType);\n\t}\n\n\treturn `data:${normalizedMediaType.join(';')},${base64 ? body.trim() : body}${hash ? `#${hash}` : ''}`;\n};\n\nconst normalizeUrl = (urlString, options) => {\n\toptions = {\n\t\tdefaultProtocol: 'http:',\n\t\tnormalizeProtocol: true,\n\t\tforceHttp: false,\n\t\tforceHttps: false,\n\t\tstripAuthentication: true,\n\t\tstripHash: false,\n\t\tstripWWW: true,\n\t\tremoveQueryParameters: [/^utm_\\w+/i],\n\t\tremoveTrailingSlash: true,\n\t\tremoveDirectoryIndex: false,\n\t\tsortQueryParameters: true,\n\t\t...options\n\t};\n\n\t// TODO: Remove this at some point in the future\n\tif (Reflect.has(options, 'normalizeHttps')) {\n\t\tthrow new Error('options.normalizeHttps is renamed to options.forceHttp');\n\t}\n\n\tif (Reflect.has(options, 'normalizeHttp')) {\n\t\tthrow new Error('options.normalizeHttp is renamed to options.forceHttps');\n\t}\n\n\tif (Reflect.has(options, 'stripFragment')) {\n\t\tthrow new Error('options.stripFragment is renamed to options.stripHash');\n\t}\n\n\turlString = urlString.trim();\n\n\t// Data URL\n\tif (/^data:/i.test(urlString)) {\n\t\treturn normalizeDataURL(urlString, options);\n\t}\n\n\tconst hasRelativeProtocol = urlString.startsWith('//');\n\tconst isRelativeUrl = !hasRelativeProtocol && /^\\.*\\//.test(urlString);\n\n\t// Prepend protocol\n\tif (!isRelativeUrl) {\n\t\turlString = urlString.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//, options.defaultProtocol);\n\t}\n\n\tconst urlObj = new URLParser(urlString);\n\n\tif (options.forceHttp && options.forceHttps) {\n\t\tthrow new Error('The `forceHttp` and `forceHttps` options cannot be used together');\n\t}\n\n\tif (options.forceHttp && urlObj.protocol === 'https:') {\n\t\turlObj.protocol = 'http:';\n\t}\n\n\tif (options.forceHttps && urlObj.protocol === 'http:') {\n\t\turlObj.protocol = 'https:';\n\t}\n\n\t// Remove auth\n\tif (options.stripAuthentication) {\n\t\turlObj.username = '';\n\t\turlObj.password = '';\n\t}\n\n\t// Remove hash\n\tif (options.stripHash) {\n\t\turlObj.hash = '';\n\t}\n\n\t// Remove duplicate slashes if not preceded by a protocol\n\tif (urlObj.pathname) {\n\t\t// TODO: Use the following instead when targeting Node.js 10\n\t\t// `urlObj.pathname = urlObj.pathname.replace(/(? {\n\t\t\tif (/^(?!\\/)/g.test(p1)) {\n\t\t\t\treturn `${p1}/`;\n\t\t\t}\n\n\t\t\treturn '/';\n\t\t});\n\t}\n\n\t// Decode URI octets\n\tif (urlObj.pathname) {\n\t\turlObj.pathname = decodeURI(urlObj.pathname);\n\t}\n\n\t// Remove directory index\n\tif (options.removeDirectoryIndex === true) {\n\t\toptions.removeDirectoryIndex = [/^index\\.[a-z]+$/];\n\t}\n\n\tif (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) {\n\t\tlet pathComponents = urlObj.pathname.split('/');\n\t\tconst lastComponent = pathComponents[pathComponents.length - 1];\n\n\t\tif (testParameter(lastComponent, options.removeDirectoryIndex)) {\n\t\t\tpathComponents = pathComponents.slice(0, pathComponents.length - 1);\n\t\t\turlObj.pathname = pathComponents.slice(1).join('/') + '/';\n\t\t}\n\t}\n\n\tif (urlObj.hostname) {\n\t\t// Remove trailing dot\n\t\turlObj.hostname = urlObj.hostname.replace(/\\.$/, '');\n\n\t\t// Remove `www.`\n\t\tif (options.stripWWW && /^www\\.([a-z\\-\\d]{2,63})\\.([a-z.]{2,5})$/.test(urlObj.hostname)) {\n\t\t\t// Each label should be max 63 at length (min: 2).\n\t\t\t// The extension should be max 5 at length (min: 2).\n\t\t\t// Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names\n\t\t\turlObj.hostname = urlObj.hostname.replace(/^www\\./, '');\n\t\t}\n\t}\n\n\t// Remove query unwanted parameters\n\tif (Array.isArray(options.removeQueryParameters)) {\n\t\tfor (const key of [...urlObj.searchParams.keys()]) {\n\t\t\tif (testParameter(key, options.removeQueryParameters)) {\n\t\t\t\turlObj.searchParams.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Sort query parameters\n\tif (options.sortQueryParameters) {\n\t\turlObj.searchParams.sort();\n\t}\n\n\tif (options.removeTrailingSlash) {\n\t\turlObj.pathname = urlObj.pathname.replace(/\\/$/, '');\n\t}\n\n\t// Take advantage of many of the Node `url` normalizations\n\turlString = urlObj.toString();\n\n\t// Remove ending `/`\n\tif ((options.removeTrailingSlash || urlObj.pathname === '/') && urlObj.hash === '') {\n\t\turlString = urlString.replace(/\\/$/, '');\n\t}\n\n\t// Restore relative protocol, if applicable\n\tif (hasRelativeProtocol && !options.normalizeProtocol) {\n\t\turlString = urlString.replace(/^http:\\/\\//, '//');\n\t}\n\n\t// Remove http/https\n\tif (options.stripProtocol) {\n\t\turlString = urlString.replace(/^(?:https?:)?\\/\\//, '');\n\t}\n\n\treturn urlString;\n};\n\nmodule.exports = normalizeUrl;\n// TODO: Remove this for the next major release\nmodule.exports.default = normalizeUrl;\n","var wrappy = require('wrappy')\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n Object.defineProperty(Function.prototype, 'once', {\n value: function () {\n return once(this)\n },\n configurable: true\n })\n\n Object.defineProperty(Function.prototype, 'onceStrict', {\n value: function () {\n return onceStrict(this)\n },\n configurable: true\n })\n})\n\nfunction once (fn) {\n var f = function () {\n if (f.called) return f.value\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n f.called = false\n return f\n}\n\nfunction onceStrict (fn) {\n var f = function () {\n if (f.called)\n throw new Error(f.onceError)\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n var name = fn.name || 'Function wrapped with `once`'\n f.onceError = name + \" shouldn't be called more than once\"\n f.called = false\n return f\n}\n","'use strict';\n\nclass CancelError extends Error {\n\tconstructor(reason) {\n\t\tsuper(reason || 'Promise was canceled');\n\t\tthis.name = 'CancelError';\n\t}\n\n\tget isCanceled() {\n\t\treturn true;\n\t}\n}\n\nclass PCancelable {\n\tstatic fn(userFn) {\n\t\treturn (...arguments_) => {\n\t\t\treturn new PCancelable((resolve, reject, onCancel) => {\n\t\t\t\targuments_.push(onCancel);\n\t\t\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\t\t\tuserFn(...arguments_).then(resolve, reject);\n\t\t\t});\n\t\t};\n\t}\n\n\tconstructor(executor) {\n\t\tthis._cancelHandlers = [];\n\t\tthis._isPending = true;\n\t\tthis._isCanceled = false;\n\t\tthis._rejectOnCancel = true;\n\n\t\tthis._promise = new Promise((resolve, reject) => {\n\t\t\tthis._reject = reject;\n\n\t\t\tconst onResolve = value => {\n\t\t\t\tthis._isPending = false;\n\t\t\t\tresolve(value);\n\t\t\t};\n\n\t\t\tconst onReject = error => {\n\t\t\t\tthis._isPending = false;\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tconst onCancel = handler => {\n\t\t\t\tif (!this._isPending) {\n\t\t\t\t\tthrow new Error('The `onCancel` handler was attached after the promise settled.');\n\t\t\t\t}\n\n\t\t\t\tthis._cancelHandlers.push(handler);\n\t\t\t};\n\n\t\t\tObject.defineProperties(onCancel, {\n\t\t\t\tshouldReject: {\n\t\t\t\t\tget: () => this._rejectOnCancel,\n\t\t\t\t\tset: boolean => {\n\t\t\t\t\t\tthis._rejectOnCancel = boolean;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn executor(onResolve, onReject, onCancel);\n\t\t});\n\t}\n\n\tthen(onFulfilled, onRejected) {\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\treturn this._promise.then(onFulfilled, onRejected);\n\t}\n\n\tcatch(onRejected) {\n\t\treturn this._promise.catch(onRejected);\n\t}\n\n\tfinally(onFinally) {\n\t\treturn this._promise.finally(onFinally);\n\t}\n\n\tcancel(reason) {\n\t\tif (!this._isPending || this._isCanceled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._cancelHandlers.length > 0) {\n\t\t\ttry {\n\t\t\t\tfor (const handler of this._cancelHandlers) {\n\t\t\t\t\thandler();\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis._reject(error);\n\t\t\t}\n\t\t}\n\n\t\tthis._isCanceled = true;\n\t\tif (this._rejectOnCancel) {\n\t\t\tthis._reject(new CancelError(reason));\n\t\t}\n\t}\n\n\tget isCanceled() {\n\t\treturn this._isCanceled;\n\t}\n}\n\nObject.setPrototypeOf(PCancelable.prototype, Promise.prototype);\n\nmodule.exports = PCancelable;\nmodule.exports.CancelError = CancelError;\n","'use strict';\n\nmodule.exports = require('./lib/picomatch');\n","'use strict';\n\nconst path = require('path');\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\n/**\n * Posix glob regex\n */\n\nconst DOT_LITERAL = '\\\\.';\nconst PLUS_LITERAL = '\\\\+';\nconst QMARK_LITERAL = '\\\\?';\nconst SLASH_LITERAL = '\\\\/';\nconst ONE_CHAR = '(?=.)';\nconst QMARK = '[^/]';\nconst END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;\nconst START_ANCHOR = `(?:^|${SLASH_LITERAL})`;\nconst DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;\nconst NO_DOT = `(?!${DOT_LITERAL})`;\nconst NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;\nconst NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;\nconst NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;\nconst QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;\nconst STAR = `${QMARK}*?`;\n\nconst POSIX_CHARS = {\n DOT_LITERAL,\n PLUS_LITERAL,\n QMARK_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n QMARK,\n END_ANCHOR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n};\n\n/**\n * Windows glob regex\n */\n\nconst WINDOWS_CHARS = {\n ...POSIX_CHARS,\n\n SLASH_LITERAL: `[${WIN_SLASH}]`,\n QMARK: WIN_NO_SLASH,\n STAR: `${WIN_NO_SLASH}*?`,\n DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,\n NO_DOT: `(?!${DOT_LITERAL})`,\n NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,\n NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n QMARK_NO_DOT: `[^.${WIN_SLASH}]`,\n START_ANCHOR: `(?:^|[${WIN_SLASH}])`,\n END_ANCHOR: `(?:[${WIN_SLASH}]|$)`\n};\n\n/**\n * POSIX Bracket Regex\n */\n\nconst POSIX_REGEX_SOURCE = {\n alnum: 'a-zA-Z0-9',\n alpha: 'a-zA-Z',\n ascii: '\\\\x00-\\\\x7F',\n blank: ' \\\\t',\n cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n digit: '0-9',\n graph: '\\\\x21-\\\\x7E',\n lower: 'a-z',\n print: '\\\\x20-\\\\x7E ',\n punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n upper: 'A-Z',\n word: 'A-Za-z0-9_',\n xdigit: 'A-Fa-f0-9'\n};\n\nmodule.exports = {\n MAX_LENGTH: 1024 * 64,\n POSIX_REGEX_SOURCE,\n\n // regular expressions\n REGEX_BACKSLASH: /\\\\(?![*+?^${}(|)[\\]])/g,\n REGEX_NON_SPECIAL_CHARS: /^[^@![\\].,$*+?^{}()|\\\\/]+/,\n REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\\]]/,\n REGEX_SPECIAL_CHARS_BACKREF: /(\\\\?)((\\W)(\\3*))/g,\n REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\\]])/g,\n REGEX_REMOVE_BACKSLASH: /(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,\n\n // Replace globs with equivalent patterns to reduce parsing time.\n REPLACEMENTS: {\n '***': '*',\n '**/**': '**',\n '**/**/**': '**'\n },\n\n // Digits\n CHAR_0: 48, /* 0 */\n CHAR_9: 57, /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 65, /* A */\n CHAR_LOWERCASE_A: 97, /* a */\n CHAR_UPPERCASE_Z: 90, /* Z */\n CHAR_LOWERCASE_Z: 122, /* z */\n\n CHAR_LEFT_PARENTHESES: 40, /* ( */\n CHAR_RIGHT_PARENTHESES: 41, /* ) */\n\n CHAR_ASTERISK: 42, /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: 38, /* & */\n CHAR_AT: 64, /* @ */\n CHAR_BACKWARD_SLASH: 92, /* \\ */\n CHAR_CARRIAGE_RETURN: 13, /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */\n CHAR_COLON: 58, /* : */\n CHAR_COMMA: 44, /* , */\n CHAR_DOT: 46, /* . */\n CHAR_DOUBLE_QUOTE: 34, /* \" */\n CHAR_EQUAL: 61, /* = */\n CHAR_EXCLAMATION_MARK: 33, /* ! */\n CHAR_FORM_FEED: 12, /* \\f */\n CHAR_FORWARD_SLASH: 47, /* / */\n CHAR_GRAVE_ACCENT: 96, /* ` */\n CHAR_HASH: 35, /* # */\n CHAR_HYPHEN_MINUS: 45, /* - */\n CHAR_LEFT_ANGLE_BRACKET: 60, /* < */\n CHAR_LEFT_CURLY_BRACE: 123, /* { */\n CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */\n CHAR_LINE_FEED: 10, /* \\n */\n CHAR_NO_BREAK_SPACE: 160, /* \\u00A0 */\n CHAR_PERCENT: 37, /* % */\n CHAR_PLUS: 43, /* + */\n CHAR_QUESTION_MARK: 63, /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */\n CHAR_RIGHT_CURLY_BRACE: 125, /* } */\n CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */\n CHAR_SEMICOLON: 59, /* ; */\n CHAR_SINGLE_QUOTE: 39, /* ' */\n CHAR_SPACE: 32, /* */\n CHAR_TAB: 9, /* \\t */\n CHAR_UNDERSCORE: 95, /* _ */\n CHAR_VERTICAL_LINE: 124, /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \\uFEFF */\n\n SEP: path.sep,\n\n /**\n * Create EXTGLOB_CHARS\n */\n\n extglobChars(chars) {\n return {\n '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },\n '?': { type: 'qmark', open: '(?:', close: ')?' },\n '+': { type: 'plus', open: '(?:', close: ')+' },\n '*': { type: 'star', open: '(?:', close: ')*' },\n '@': { type: 'at', open: '(?:', close: ')' }\n };\n },\n\n /**\n * Create GLOB_CHARS\n */\n\n globChars(win32) {\n return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;\n }\n};\n","'use strict';\n\nconst constants = require('./constants');\nconst utils = require('./utils');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n POSIX_REGEX_SOURCE,\n REGEX_NON_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_BACKREF,\n REPLACEMENTS\n} = constants;\n\n/**\n * Helpers\n */\n\nconst expandRange = (args, options) => {\n if (typeof options.expandRange === 'function') {\n return options.expandRange(...args, options);\n }\n\n args.sort();\n const value = `[${args.join('-')}]`;\n\n try {\n /* eslint-disable-next-line no-new */\n new RegExp(value);\n } catch (ex) {\n return args.map(v => utils.escapeRegex(v)).join('..');\n }\n\n return value;\n};\n\n/**\n * Create the message for a syntax error\n */\n\nconst syntaxError = (type, char) => {\n return `Missing ${type}: \"${char}\" - use \"\\\\\\\\${char}\" to match literal characters`;\n};\n\n/**\n * Parse the given input string.\n * @param {String} input\n * @param {Object} options\n * @return {Object}\n */\n\nconst parse = (input, options) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n input = REPLACEMENTS[input] || input;\n\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n\n let len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n const bos = { type: 'bos', value: '', output: opts.prepend || '' };\n const tokens = [bos];\n\n const capture = opts.capture ? '' : '?:';\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const PLATFORM_CHARS = constants.globChars(win32);\n const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);\n\n const {\n DOT_LITERAL,\n PLUS_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n } = PLATFORM_CHARS;\n\n const globstar = (opts) => {\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const nodot = opts.dot ? '' : NO_DOT;\n const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;\n let star = opts.bash === true ? globstar(opts) : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n // minimatch options support\n if (typeof opts.noext === 'boolean') {\n opts.noextglob = opts.noext;\n }\n\n const state = {\n input,\n index: -1,\n start: 0,\n dot: opts.dot === true,\n consumed: '',\n output: '',\n prefix: '',\n backtrack: false,\n negated: false,\n brackets: 0,\n braces: 0,\n parens: 0,\n quotes: 0,\n globstar: false,\n tokens\n };\n\n input = utils.removePrefix(input, state);\n len = input.length;\n\n const extglobs = [];\n const braces = [];\n const stack = [];\n let prev = bos;\n let value;\n\n /**\n * Tokenizing helpers\n */\n\n const eos = () => state.index === len - 1;\n const peek = state.peek = (n = 1) => input[state.index + n];\n const advance = state.advance = () => input[++state.index];\n const remaining = () => input.slice(state.index + 1);\n const consume = (value = '', num = 0) => {\n state.consumed += value;\n state.index += num;\n };\n const append = token => {\n state.output += token.output != null ? token.output : token.value;\n consume(token.value);\n };\n\n const negate = () => {\n let count = 1;\n\n while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {\n advance();\n state.start++;\n count++;\n }\n\n if (count % 2 === 0) {\n return false;\n }\n\n state.negated = true;\n state.start++;\n return true;\n };\n\n const increment = type => {\n state[type]++;\n stack.push(type);\n };\n\n const decrement = type => {\n state[type]--;\n stack.pop();\n };\n\n /**\n * Push tokens onto the tokens array. This helper speeds up\n * tokenizing by 1) helping us avoid backtracking as much as possible,\n * and 2) helping us avoid creating extra tokens when consecutive\n * characters are plain text. This improves performance and simplifies\n * lookbehinds.\n */\n\n const push = tok => {\n if (prev.type === 'globstar') {\n const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');\n const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));\n\n if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {\n state.output = state.output.slice(0, -prev.output.length);\n prev.type = 'star';\n prev.value = '*';\n prev.output = star;\n state.output += prev.output;\n }\n }\n\n if (extglobs.length && tok.type !== 'paren' && !EXTGLOB_CHARS[tok.value]) {\n extglobs[extglobs.length - 1].inner += tok.value;\n }\n\n if (tok.value || tok.output) append(tok);\n if (prev && prev.type === 'text' && tok.type === 'text') {\n prev.value += tok.value;\n prev.output = (prev.output || '') + tok.value;\n return;\n }\n\n tok.prev = prev;\n tokens.push(tok);\n prev = tok;\n };\n\n const extglobOpen = (type, value) => {\n const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };\n\n token.prev = prev;\n token.parens = state.parens;\n token.output = state.output;\n const output = (opts.capture ? '(' : '') + token.open;\n\n increment('parens');\n push({ type, value, output: state.output ? '' : ONE_CHAR });\n push({ type: 'paren', extglob: true, value: advance(), output });\n extglobs.push(token);\n };\n\n const extglobClose = token => {\n let output = token.close + (opts.capture ? ')' : '');\n\n if (token.type === 'negate') {\n let extglobStar = star;\n\n if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {\n extglobStar = globstar(opts);\n }\n\n if (extglobStar !== star || eos() || /^\\)+$/.test(remaining())) {\n output = token.close = `)$))${extglobStar}`;\n }\n\n if (token.prev.type === 'bos' && eos()) {\n state.negatedExtglob = true;\n }\n }\n\n push({ type: 'paren', extglob: true, value, output });\n decrement('parens');\n };\n\n /**\n * Fast paths\n */\n\n if (opts.fastpaths !== false && !/(^[*!]|[/()[\\]{}\"])/.test(input)) {\n let backslashes = false;\n\n let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {\n if (first === '\\\\') {\n backslashes = true;\n return m;\n }\n\n if (first === '?') {\n if (esc) {\n return esc + first + (rest ? QMARK.repeat(rest.length) : '');\n }\n if (index === 0) {\n return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');\n }\n return QMARK.repeat(chars.length);\n }\n\n if (first === '.') {\n return DOT_LITERAL.repeat(chars.length);\n }\n\n if (first === '*') {\n if (esc) {\n return esc + first + (rest ? star : '');\n }\n return star;\n }\n return esc ? m : `\\\\${m}`;\n });\n\n if (backslashes === true) {\n if (opts.unescape === true) {\n output = output.replace(/\\\\/g, '');\n } else {\n output = output.replace(/\\\\+/g, m => {\n return m.length % 2 === 0 ? '\\\\\\\\' : (m ? '\\\\' : '');\n });\n }\n }\n\n if (output === input && opts.contains === true) {\n state.output = input;\n return state;\n }\n\n state.output = utils.wrapOutput(output, state, options);\n return state;\n }\n\n /**\n * Tokenize input until we reach end-of-string\n */\n\n while (!eos()) {\n value = advance();\n\n if (value === '\\u0000') {\n continue;\n }\n\n /**\n * Escaped characters\n */\n\n if (value === '\\\\') {\n const next = peek();\n\n if (next === '/' && opts.bash !== true) {\n continue;\n }\n\n if (next === '.' || next === ';') {\n continue;\n }\n\n if (!next) {\n value += '\\\\';\n push({ type: 'text', value });\n continue;\n }\n\n // collapse slashes to reduce potential for exploits\n const match = /^\\\\+/.exec(remaining());\n let slashes = 0;\n\n if (match && match[0].length > 2) {\n slashes = match[0].length;\n state.index += slashes;\n if (slashes % 2 !== 0) {\n value += '\\\\';\n }\n }\n\n if (opts.unescape === true) {\n value = advance() || '';\n } else {\n value += advance() || '';\n }\n\n if (state.brackets === 0) {\n push({ type: 'text', value });\n continue;\n }\n }\n\n /**\n * If we're inside a regex character class, continue\n * until we reach the closing bracket.\n */\n\n if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {\n if (opts.posix !== false && value === ':') {\n const inner = prev.value.slice(1);\n if (inner.includes('[')) {\n prev.posix = true;\n\n if (inner.includes(':')) {\n const idx = prev.value.lastIndexOf('[');\n const pre = prev.value.slice(0, idx);\n const rest = prev.value.slice(idx + 2);\n const posix = POSIX_REGEX_SOURCE[rest];\n if (posix) {\n prev.value = pre + posix;\n state.backtrack = true;\n advance();\n\n if (!bos.output && tokens.indexOf(prev) === 1) {\n bos.output = ONE_CHAR;\n }\n continue;\n }\n }\n }\n }\n\n if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {\n value = `\\\\${value}`;\n }\n\n if (value === ']' && (prev.value === '[' || prev.value === '[^')) {\n value = `\\\\${value}`;\n }\n\n if (opts.posix === true && value === '!' && prev.value === '[') {\n value = '^';\n }\n\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * If we're inside a quoted string, continue\n * until we reach the closing double quote.\n */\n\n if (state.quotes === 1 && value !== '\"') {\n value = utils.escapeRegex(value);\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * Double quotes\n */\n\n if (value === '\"') {\n state.quotes = state.quotes === 1 ? 0 : 1;\n if (opts.keepQuotes === true) {\n push({ type: 'text', value });\n }\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === '(') {\n increment('parens');\n push({ type: 'paren', value });\n continue;\n }\n\n if (value === ')') {\n if (state.parens === 0 && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '('));\n }\n\n const extglob = extglobs[extglobs.length - 1];\n if (extglob && state.parens === extglob.parens + 1) {\n extglobClose(extglobs.pop());\n continue;\n }\n\n push({ type: 'paren', value, output: state.parens ? ')' : '\\\\)' });\n decrement('parens');\n continue;\n }\n\n /**\n * Square brackets\n */\n\n if (value === '[') {\n if (opts.nobracket === true || !remaining().includes(']')) {\n if (opts.nobracket !== true && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('closing', ']'));\n }\n\n value = `\\\\${value}`;\n } else {\n increment('brackets');\n }\n\n push({ type: 'bracket', value });\n continue;\n }\n\n if (value === ']') {\n if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n if (state.brackets === 0) {\n if (opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '['));\n }\n\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n decrement('brackets');\n\n const prevValue = prev.value.slice(1);\n if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {\n value = `/${value}`;\n }\n\n prev.value += value;\n append({ value });\n\n // when literal brackets are explicitly disabled\n // assume we should match with a regex character class\n if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {\n continue;\n }\n\n const escaped = utils.escapeRegex(prev.value);\n state.output = state.output.slice(0, -prev.value.length);\n\n // when literal brackets are explicitly enabled\n // assume we should escape the brackets to match literal characters\n if (opts.literalBrackets === true) {\n state.output += escaped;\n prev.value = escaped;\n continue;\n }\n\n // when the user specifies nothing, try to match both\n prev.value = `(${capture}${escaped}|${prev.value})`;\n state.output += prev.value;\n continue;\n }\n\n /**\n * Braces\n */\n\n if (value === '{' && opts.nobrace !== true) {\n increment('braces');\n\n const open = {\n type: 'brace',\n value,\n output: '(',\n outputIndex: state.output.length,\n tokensIndex: state.tokens.length\n };\n\n braces.push(open);\n push(open);\n continue;\n }\n\n if (value === '}') {\n const brace = braces[braces.length - 1];\n\n if (opts.nobrace === true || !brace) {\n push({ type: 'text', value, output: value });\n continue;\n }\n\n let output = ')';\n\n if (brace.dots === true) {\n const arr = tokens.slice();\n const range = [];\n\n for (let i = arr.length - 1; i >= 0; i--) {\n tokens.pop();\n if (arr[i].type === 'brace') {\n break;\n }\n if (arr[i].type !== 'dots') {\n range.unshift(arr[i].value);\n }\n }\n\n output = expandRange(range, opts);\n state.backtrack = true;\n }\n\n if (brace.comma !== true && brace.dots !== true) {\n const out = state.output.slice(0, brace.outputIndex);\n const toks = state.tokens.slice(brace.tokensIndex);\n brace.value = brace.output = '\\\\{';\n value = output = '\\\\}';\n state.output = out;\n for (const t of toks) {\n state.output += (t.output || t.value);\n }\n }\n\n push({ type: 'brace', value, output });\n decrement('braces');\n braces.pop();\n continue;\n }\n\n /**\n * Pipes\n */\n\n if (value === '|') {\n if (extglobs.length > 0) {\n extglobs[extglobs.length - 1].conditions++;\n }\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Commas\n */\n\n if (value === ',') {\n let output = value;\n\n const brace = braces[braces.length - 1];\n if (brace && stack[stack.length - 1] === 'braces') {\n brace.comma = true;\n output = '|';\n }\n\n push({ type: 'comma', value, output });\n continue;\n }\n\n /**\n * Slashes\n */\n\n if (value === '/') {\n // if the beginning of the glob is \"./\", advance the start\n // to the current index, and don't add the \"./\" characters\n // to the state. This greatly simplifies lookbehinds when\n // checking for BOS characters like \"!\" and \".\" (not \"./\")\n if (prev.type === 'dot' && state.index === state.start + 1) {\n state.start = state.index + 1;\n state.consumed = '';\n state.output = '';\n tokens.pop();\n prev = bos; // reset \"prev\" to the first token\n continue;\n }\n\n push({ type: 'slash', value, output: SLASH_LITERAL });\n continue;\n }\n\n /**\n * Dots\n */\n\n if (value === '.') {\n if (state.braces > 0 && prev.type === 'dot') {\n if (prev.value === '.') prev.output = DOT_LITERAL;\n const brace = braces[braces.length - 1];\n prev.type = 'dots';\n prev.output += value;\n prev.value += value;\n brace.dots = true;\n continue;\n }\n\n if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {\n push({ type: 'text', value, output: DOT_LITERAL });\n continue;\n }\n\n push({ type: 'dot', value, output: DOT_LITERAL });\n continue;\n }\n\n /**\n * Question marks\n */\n\n if (value === '?') {\n const isGroup = prev && prev.value === '(';\n if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('qmark', value);\n continue;\n }\n\n if (prev && prev.type === 'paren') {\n const next = peek();\n let output = value;\n\n if (next === '<' && !utils.supportsLookbehinds()) {\n throw new Error('Node.js v10 or higher is required for regex lookbehinds');\n }\n\n if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\\w+>)/.test(remaining()))) {\n output = `\\\\${value}`;\n }\n\n push({ type: 'text', value, output });\n continue;\n }\n\n if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {\n push({ type: 'qmark', value, output: QMARK_NO_DOT });\n continue;\n }\n\n push({ type: 'qmark', value, output: QMARK });\n continue;\n }\n\n /**\n * Exclamation\n */\n\n if (value === '!') {\n if (opts.noextglob !== true && peek() === '(') {\n if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {\n extglobOpen('negate', value);\n continue;\n }\n }\n\n if (opts.nonegate !== true && state.index === 0) {\n negate();\n continue;\n }\n }\n\n /**\n * Plus\n */\n\n if (value === '+') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('plus', value);\n continue;\n }\n\n if ((prev && prev.value === '(') || opts.regex === false) {\n push({ type: 'plus', value, output: PLUS_LITERAL });\n continue;\n }\n\n if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {\n push({ type: 'plus', value });\n continue;\n }\n\n push({ type: 'plus', value: PLUS_LITERAL });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value === '@') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n push({ type: 'at', extglob: true, value, output: '' });\n continue;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value !== '*') {\n if (value === '$' || value === '^') {\n value = `\\\\${value}`;\n }\n\n const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());\n if (match) {\n value += match[0];\n state.index += match[0].length;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Stars\n */\n\n if (prev && (prev.type === 'globstar' || prev.star === true)) {\n prev.type = 'star';\n prev.star = true;\n prev.value += value;\n prev.output = star;\n state.backtrack = true;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n let rest = remaining();\n if (opts.noextglob !== true && /^\\([^?]/.test(rest)) {\n extglobOpen('star', value);\n continue;\n }\n\n if (prev.type === 'star') {\n if (opts.noglobstar === true) {\n consume(value);\n continue;\n }\n\n const prior = prev.prev;\n const before = prior.prev;\n const isStart = prior.type === 'slash' || prior.type === 'bos';\n const afterStar = before && (before.type === 'star' || before.type === 'globstar');\n\n if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');\n const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');\n if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n // strip consecutive `/**/`\n while (rest.slice(0, 3) === '/**') {\n const after = input[state.index + 4];\n if (after && after !== '/') {\n break;\n }\n rest = rest.slice(3);\n consume('/**', 3);\n }\n\n if (prior.type === 'bos' && eos()) {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = globstar(opts);\n state.output = prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');\n prev.value += value;\n state.globstar = true;\n state.output += prior.output + prev.output;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {\n const end = rest[1] !== void 0 ? '|$' : '';\n\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;\n prev.value += value;\n\n state.output += prior.output + prev.output;\n state.globstar = true;\n\n consume(value + advance());\n\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n if (prior.type === 'bos' && rest[0] === '/') {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;\n state.output = prev.output;\n state.globstar = true;\n consume(value + advance());\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n // remove single star from output\n state.output = state.output.slice(0, -prev.output.length);\n\n // reset previous token to globstar\n prev.type = 'globstar';\n prev.output = globstar(opts);\n prev.value += value;\n\n // reset output with globstar\n state.output += prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n const token = { type: 'star', value, output: star };\n\n if (opts.bash === true) {\n token.output = '.*?';\n if (prev.type === 'bos' || prev.type === 'slash') {\n token.output = nodot + token.output;\n }\n push(token);\n continue;\n }\n\n if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {\n token.output = value;\n push(token);\n continue;\n }\n\n if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {\n if (prev.type === 'dot') {\n state.output += NO_DOT_SLASH;\n prev.output += NO_DOT_SLASH;\n\n } else if (opts.dot === true) {\n state.output += NO_DOTS_SLASH;\n prev.output += NO_DOTS_SLASH;\n\n } else {\n state.output += nodot;\n prev.output += nodot;\n }\n\n if (peek() !== '*') {\n state.output += ONE_CHAR;\n prev.output += ONE_CHAR;\n }\n }\n\n push(token);\n }\n\n while (state.brackets > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));\n state.output = utils.escapeLast(state.output, '[');\n decrement('brackets');\n }\n\n while (state.parens > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));\n state.output = utils.escapeLast(state.output, '(');\n decrement('parens');\n }\n\n while (state.braces > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));\n state.output = utils.escapeLast(state.output, '{');\n decrement('braces');\n }\n\n if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {\n push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });\n }\n\n // rebuild the output if we had to backtrack at any point\n if (state.backtrack === true) {\n state.output = '';\n\n for (const token of state.tokens) {\n state.output += token.output != null ? token.output : token.value;\n\n if (token.suffix) {\n state.output += token.suffix;\n }\n }\n }\n\n return state;\n};\n\n/**\n * Fast paths for creating regular expressions for common glob patterns.\n * This can significantly speed up processing and has very little downside\n * impact when none of the fast paths match.\n */\n\nparse.fastpaths = (input, options) => {\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n const len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n input = REPLACEMENTS[input] || input;\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const {\n DOT_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOTS_SLASH,\n STAR,\n START_ANCHOR\n } = constants.globChars(win32);\n\n const nodot = opts.dot ? NO_DOTS : NO_DOT;\n const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;\n const capture = opts.capture ? '' : '?:';\n const state = { negated: false, prefix: '' };\n let star = opts.bash === true ? '.*?' : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n const globstar = (opts) => {\n if (opts.noglobstar === true) return star;\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const create = str => {\n switch (str) {\n case '*':\n return `${nodot}${ONE_CHAR}${star}`;\n\n case '.*':\n return `${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*.*':\n return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*/*':\n return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;\n\n case '**':\n return nodot + globstar(opts);\n\n case '**/*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;\n\n case '**/*.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '**/.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n default: {\n const match = /^(.*?)\\.(\\w+)$/.exec(str);\n if (!match) return;\n\n const source = create(match[1]);\n if (!source) return;\n\n return source + DOT_LITERAL + match[2];\n }\n }\n };\n\n const output = utils.removePrefix(input, state);\n let source = create(output);\n\n if (source && opts.strictSlashes !== true) {\n source += `${SLASH_LITERAL}?`;\n }\n\n return source;\n};\n\nmodule.exports = parse;\n","'use strict';\n\nconst path = require('path');\nconst scan = require('./scan');\nconst parse = require('./parse');\nconst utils = require('./utils');\nconst constants = require('./constants');\nconst isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\n/**\n * Creates a matcher function from one or more glob patterns. The\n * returned function takes a string to match as its first argument,\n * and returns true if the string is a match. The returned matcher\n * function also takes a boolean as the second argument that, when true,\n * returns an object with additional information.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch(glob[, options]);\n *\n * const isMatch = picomatch('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @name picomatch\n * @param {String|Array} `globs` One or more glob patterns.\n * @param {Object=} `options`\n * @return {Function=} Returns a matcher function.\n * @api public\n */\n\nconst picomatch = (glob, options, returnState = false) => {\n if (Array.isArray(glob)) {\n const fns = glob.map(input => picomatch(input, options, returnState));\n const arrayMatcher = str => {\n for (const isMatch of fns) {\n const state = isMatch(str);\n if (state) return state;\n }\n return false;\n };\n return arrayMatcher;\n }\n\n const isState = isObject(glob) && glob.tokens && glob.input;\n\n if (glob === '' || (typeof glob !== 'string' && !isState)) {\n throw new TypeError('Expected pattern to be a non-empty string');\n }\n\n const opts = options || {};\n const posix = utils.isWindows(options);\n const regex = isState\n ? picomatch.compileRe(glob, options)\n : picomatch.makeRe(glob, options, false, true);\n\n const state = regex.state;\n delete regex.state;\n\n let isIgnored = () => false;\n if (opts.ignore) {\n const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };\n isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);\n }\n\n const matcher = (input, returnObject = false) => {\n const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });\n const result = { glob, state, regex, posix, input, output, match, isMatch };\n\n if (typeof opts.onResult === 'function') {\n opts.onResult(result);\n }\n\n if (isMatch === false) {\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (isIgnored(input)) {\n if (typeof opts.onIgnore === 'function') {\n opts.onIgnore(result);\n }\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (typeof opts.onMatch === 'function') {\n opts.onMatch(result);\n }\n return returnObject ? result : true;\n };\n\n if (returnState) {\n matcher.state = state;\n }\n\n return matcher;\n};\n\n/**\n * Test `input` with the given `regex`. This is used by the main\n * `picomatch()` function to test the input string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.test(input, regex[, options]);\n *\n * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\\/([^/]*?))$/));\n * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp} `regex`\n * @return {Object} Returns an object with matching info.\n * @api public\n */\n\npicomatch.test = (input, regex, options, { glob, posix } = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected input to be a string');\n }\n\n if (input === '') {\n return { isMatch: false, output: '' };\n }\n\n const opts = options || {};\n const format = opts.format || (posix ? utils.toPosixSlashes : null);\n let match = input === glob;\n let output = (match && format) ? format(input) : input;\n\n if (match === false) {\n output = format ? format(input) : input;\n match = output === glob;\n }\n\n if (match === false || opts.capture === true) {\n if (opts.matchBase === true || opts.basename === true) {\n match = picomatch.matchBase(input, regex, options, posix);\n } else {\n match = regex.exec(output);\n }\n }\n\n return { isMatch: Boolean(match), match, output };\n};\n\n/**\n * Match the basename of a filepath.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.matchBase(input, glob[, options]);\n * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).\n * @return {Boolean}\n * @api public\n */\n\npicomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => {\n const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);\n return regex.test(path.basename(input));\n};\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.isMatch(string, patterns[, options]);\n *\n * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String|Array} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\npicomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const result = picomatch.parse(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as a regex source string.\n * @api public\n */\n\npicomatch.parse = (pattern, options) => {\n if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));\n return parse(pattern, { ...options, fastpaths: false });\n};\n\n/**\n * Scan a glob pattern to separate the pattern into segments.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.scan(input[, options]);\n *\n * const result = picomatch.scan('!./foo/*.js');\n * console.log(result);\n * { prefix: '!./',\n * input: '!./foo/*.js',\n * start: 3,\n * base: 'foo',\n * glob: '*.js',\n * isBrace: false,\n * isBracket: false,\n * isGlob: true,\n * isExtglob: false,\n * isGlobstar: false,\n * negated: true }\n * ```\n * @param {String} `input` Glob pattern to scan.\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\npicomatch.scan = (input, options) => scan(input, options);\n\n/**\n * Create a regular expression from a parsed glob pattern.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const state = picomatch.parse('*.js');\n * // picomatch.compileRe(state[, options]);\n *\n * console.log(picomatch.compileRe(state));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `state` The object returned from the `.parse` method.\n * @param {Object} `options`\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\npicomatch.compileRe = (parsed, options, returnOutput = false, returnState = false) => {\n if (returnOutput === true) {\n return parsed.output;\n }\n\n const opts = options || {};\n const prepend = opts.contains ? '' : '^';\n const append = opts.contains ? '' : '$';\n\n let source = `${prepend}(?:${parsed.output})${append}`;\n if (parsed && parsed.negated === true) {\n source = `^(?!${source}).*$`;\n }\n\n const regex = picomatch.toRegex(source, options);\n if (returnState === true) {\n regex.state = parsed;\n }\n\n return regex;\n};\n\npicomatch.makeRe = (input, options, returnOutput = false, returnState = false) => {\n if (!input || typeof input !== 'string') {\n throw new TypeError('Expected a non-empty string');\n }\n\n const opts = options || {};\n let parsed = { negated: false, fastpaths: true };\n let prefix = '';\n let output;\n\n if (input.startsWith('./')) {\n input = input.slice(2);\n prefix = parsed.prefix = './';\n }\n\n if (opts.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {\n output = parse.fastpaths(input, options);\n }\n\n if (output === undefined) {\n parsed = parse(input, options);\n parsed.prefix = prefix + (parsed.prefix || '');\n } else {\n parsed.output = output;\n }\n\n return picomatch.compileRe(parsed, options, returnOutput, returnState);\n};\n\n/**\n * Create a regular expression from the given regex source string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.toRegex(source[, options]);\n *\n * const { output } = picomatch.parse('*.js');\n * console.log(picomatch.toRegex(output));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `source` Regular expression source string.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\npicomatch.toRegex = (source, options) => {\n try {\n const opts = options || {};\n return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));\n } catch (err) {\n if (options && options.debug === true) throw err;\n return /$^/;\n }\n};\n\n/**\n * Picomatch constants.\n * @return {Object}\n */\n\npicomatch.constants = constants;\n\n/**\n * Expose \"picomatch\"\n */\n\nmodule.exports = picomatch;\n","'use strict';\n\nconst utils = require('./utils');\nconst {\n CHAR_ASTERISK, /* * */\n CHAR_AT, /* @ */\n CHAR_BACKWARD_SLASH, /* \\ */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_EXCLAMATION_MARK, /* ! */\n CHAR_FORWARD_SLASH, /* / */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_PLUS, /* + */\n CHAR_QUESTION_MARK, /* ? */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_RIGHT_SQUARE_BRACKET /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n if (token.isPrefix !== true) {\n token.depth = token.isGlobstar ? Infinity : 1;\n }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), and `negated` (true if the path starts with `!`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n const opts = options || {};\n\n const length = input.length - 1;\n const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n const slashes = [];\n const tokens = [];\n const parts = [];\n\n let str = input;\n let index = -1;\n let start = 0;\n let lastIndex = 0;\n let isBrace = false;\n let isBracket = false;\n let isGlob = false;\n let isExtglob = false;\n let isGlobstar = false;\n let braceEscaped = false;\n let backslashes = false;\n let negated = false;\n let finished = false;\n let braces = 0;\n let prev;\n let code;\n let token = { value: '', depth: 0, isGlob: false };\n\n const eos = () => index >= length;\n const peek = () => str.charCodeAt(index + 1);\n const advance = () => {\n prev = code;\n return str.charCodeAt(++index);\n };\n\n while (index < length) {\n code = advance();\n let next;\n\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braceEscaped = true;\n }\n continue;\n }\n\n if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n continue;\n }\n\n if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (braceEscaped !== true && code === CHAR_COMMA) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_RIGHT_CURLY_BRACE) {\n braces--;\n\n if (braces === 0) {\n braceEscaped = false;\n isBrace = token.isBrace = true;\n finished = true;\n break;\n }\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_FORWARD_SLASH) {\n slashes.push(index);\n tokens.push(token);\n token = { value: '', depth: 0, isGlob: false };\n\n if (finished === true) continue;\n if (prev === CHAR_DOT && index === (start + 1)) {\n start += 2;\n continue;\n }\n\n lastIndex = index + 1;\n continue;\n }\n\n if (opts.noext !== true) {\n const isExtglobChar = code === CHAR_PLUS\n || code === CHAR_AT\n || code === CHAR_ASTERISK\n || code === CHAR_QUESTION_MARK\n || code === CHAR_EXCLAMATION_MARK;\n\n if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n isExtglob = token.isExtglob = true;\n finished = true;\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n }\n\n if (code === CHAR_ASTERISK) {\n if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_QUESTION_MARK) {\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_LEFT_SQUARE_BRACKET) {\n while (eos() !== true && (next = advance())) {\n if (next === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n isBracket = token.isBracket = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n }\n }\n\n if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n negated = token.negated = true;\n start++;\n continue;\n }\n\n if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_LEFT_PARENTHESES) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n\n if (isGlob === true) {\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n }\n\n if (opts.noext === true) {\n isExtglob = false;\n isGlob = false;\n }\n\n let base = str;\n let prefix = '';\n let glob = '';\n\n if (start > 0) {\n prefix = str.slice(0, start);\n str = str.slice(start);\n lastIndex -= start;\n }\n\n if (base && isGlob === true && lastIndex > 0) {\n base = str.slice(0, lastIndex);\n glob = str.slice(lastIndex);\n } else if (isGlob === true) {\n base = '';\n glob = str;\n } else {\n base = str;\n }\n\n if (base && base !== '' && base !== '/' && base !== str) {\n if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n base = base.slice(0, -1);\n }\n }\n\n if (opts.unescape === true) {\n if (glob) glob = utils.removeBackslashes(glob);\n\n if (base && backslashes === true) {\n base = utils.removeBackslashes(base);\n }\n }\n\n const state = {\n prefix,\n input,\n start,\n base,\n glob,\n isBrace,\n isBracket,\n isGlob,\n isExtglob,\n isGlobstar,\n negated\n };\n\n if (opts.tokens === true) {\n state.maxDepth = 0;\n if (!isPathSeparator(code)) {\n tokens.push(token);\n }\n state.tokens = tokens;\n }\n\n if (opts.parts === true || opts.tokens === true) {\n let prevIndex;\n\n for (let idx = 0; idx < slashes.length; idx++) {\n const n = prevIndex ? prevIndex + 1 : start;\n const i = slashes[idx];\n const value = input.slice(n, i);\n if (opts.tokens) {\n if (idx === 0 && start !== 0) {\n tokens[idx].isPrefix = true;\n tokens[idx].value = prefix;\n } else {\n tokens[idx].value = value;\n }\n depth(tokens[idx]);\n state.maxDepth += tokens[idx].depth;\n }\n if (idx !== 0 || value !== '') {\n parts.push(value);\n }\n prevIndex = i;\n }\n\n if (prevIndex && prevIndex + 1 < input.length) {\n const value = input.slice(prevIndex + 1);\n parts.push(value);\n\n if (opts.tokens) {\n tokens[tokens.length - 1].value = value;\n depth(tokens[tokens.length - 1]);\n state.maxDepth += tokens[tokens.length - 1].depth;\n }\n }\n\n state.slashes = slashes;\n state.parts = parts;\n }\n\n return state;\n};\n\nmodule.exports = scan;\n","'use strict';\n\nconst path = require('path');\nconst win32 = process.platform === 'win32';\nconst {\n REGEX_BACKSLASH,\n REGEX_REMOVE_BACKSLASH,\n REGEX_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.removeBackslashes = str => {\n return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n return match === '\\\\' ? '' : match;\n });\n};\n\nexports.supportsLookbehinds = () => {\n const segs = process.version.slice(1).split('.').map(Number);\n if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {\n return true;\n }\n return false;\n};\n\nexports.isWindows = options => {\n if (options && typeof options.windows === 'boolean') {\n return options.windows;\n }\n return win32 === true || path.sep === '\\\\';\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n const idx = input.lastIndexOf(char, lastIdx);\n if (idx === -1) return input;\n if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n let output = input;\n if (output.startsWith('./')) {\n output = output.slice(2);\n state.prefix = './';\n }\n return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n const prepend = options.contains ? '' : '^';\n const append = options.contains ? '' : '$';\n\n let output = `${prepend}(?:${input})${append}`;\n if (state.negated === true) {\n output = `(?:^(?!${output}).*$)`;\n }\n return output;\n};\n","var once = require('once')\nvar eos = require('end-of-stream')\nvar fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes\n\nvar noop = function () {}\nvar ancient = /^v?\\.0/.test(process.version)\n\nvar isFn = function (fn) {\n return typeof fn === 'function'\n}\n\nvar isFS = function (stream) {\n if (!ancient) return false // newer node version do not need to care about fs is a special way\n if (!fs) return false // browser\n return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)\n}\n\nvar isRequest = function (stream) {\n return stream.setHeader && isFn(stream.abort)\n}\n\nvar destroyer = function (stream, reading, writing, callback) {\n callback = once(callback)\n\n var closed = false\n stream.on('close', function () {\n closed = true\n })\n\n eos(stream, {readable: reading, writable: writing}, function (err) {\n if (err) return callback(err)\n closed = true\n callback()\n })\n\n var destroyed = false\n return function (err) {\n if (closed) return\n if (destroyed) return\n destroyed = true\n\n if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks\n if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want\n\n if (isFn(stream.destroy)) return stream.destroy()\n\n callback(err || new Error('stream was destroyed'))\n }\n}\n\nvar call = function (fn) {\n fn()\n}\n\nvar pipe = function (from, to) {\n return from.pipe(to)\n}\n\nvar pump = function () {\n var streams = Array.prototype.slice.call(arguments)\n var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop\n\n if (Array.isArray(streams[0])) streams = streams[0]\n if (streams.length < 2) throw new Error('pump requires two streams per minimum')\n\n var error\n var destroys = streams.map(function (stream, i) {\n var reading = i < streams.length - 1\n var writing = i > 0\n return destroyer(stream, reading, writing, function (err) {\n if (!error) error = err\n if (err) destroys.forEach(call)\n if (reading) return\n destroys.forEach(call)\n callback(error)\n })\n })\n\n return streams.reduce(pipe)\n}\n\nmodule.exports = pump\n","'use strict';\n\nclass QuickLRU {\n\tconstructor(options = {}) {\n\t\tif (!(options.maxSize && options.maxSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tthis.maxSize = options.maxSize;\n\t\tthis.onEviction = options.onEviction;\n\t\tthis.cache = new Map();\n\t\tthis.oldCache = new Map();\n\t\tthis._size = 0;\n\t}\n\n\t_set(key, value) {\n\t\tthis.cache.set(key, value);\n\t\tthis._size++;\n\n\t\tif (this._size >= this.maxSize) {\n\t\t\tthis._size = 0;\n\n\t\t\tif (typeof this.onEviction === 'function') {\n\t\t\t\tfor (const [key, value] of this.oldCache.entries()) {\n\t\t\t\t\tthis.onEviction(key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.oldCache = this.cache;\n\t\t\tthis.cache = new Map();\n\t\t}\n\t}\n\n\tget(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this.cache.get(key);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\tconst value = this.oldCache.get(key);\n\t\t\tthis.oldCache.delete(key);\n\t\t\tthis._set(key, value);\n\t\t\treturn value;\n\t\t}\n\t}\n\n\tset(key, value) {\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.set(key, value);\n\t\t} else {\n\t\t\tthis._set(key, value);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\thas(key) {\n\t\treturn this.cache.has(key) || this.oldCache.has(key);\n\t}\n\n\tpeek(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this.cache.get(key);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn this.oldCache.get(key);\n\t\t}\n\t}\n\n\tdelete(key) {\n\t\tconst deleted = this.cache.delete(key);\n\t\tif (deleted) {\n\t\t\tthis._size--;\n\t\t}\n\n\t\treturn this.oldCache.delete(key) || deleted;\n\t}\n\n\tclear() {\n\t\tthis.cache.clear();\n\t\tthis.oldCache.clear();\n\t\tthis._size = 0;\n\t}\n\n\t* keys() {\n\t\tfor (const [key] of this) {\n\t\t\tyield key;\n\t\t}\n\t}\n\n\t* values() {\n\t\tfor (const [, value] of this) {\n\t\t\tyield value;\n\t\t}\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tfor (const item of this.cache) {\n\t\t\tyield item;\n\t\t}\n\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tyield item;\n\t\t\t}\n\t\t}\n\t}\n\n\tget size() {\n\t\tlet oldCacheSize = 0;\n\t\tfor (const key of this.oldCache.keys()) {\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\toldCacheSize++;\n\t\t\t}\n\t\t}\n\n\t\treturn Math.min(this._size + oldCacheSize, this.maxSize);\n\t}\n}\n\nmodule.exports = QuickLRU;\n","'use strict';\nconst tls = require('tls');\n\nmodule.exports = (options = {}) => new Promise((resolve, reject) => {\n\tconst socket = tls.connect(options, () => {\n\t\tif (options.resolveSocket) {\n\t\t\tsocket.off('error', reject);\n\t\t\tresolve({alpnProtocol: socket.alpnProtocol, socket});\n\t\t} else {\n\t\t\tsocket.destroy();\n\t\t\tresolve({alpnProtocol: socket.alpnProtocol});\n\t\t}\n\t});\n\n\tsocket.on('error', reject);\n});\n","'use strict';\n\nconst Readable = require('stream').Readable;\nconst lowercaseKeys = require('lowercase-keys');\n\nclass Response extends Readable {\n\tconstructor(statusCode, headers, body, url) {\n\t\tif (typeof statusCode !== 'number') {\n\t\t\tthrow new TypeError('Argument `statusCode` should be a number');\n\t\t}\n\t\tif (typeof headers !== 'object') {\n\t\t\tthrow new TypeError('Argument `headers` should be an object');\n\t\t}\n\t\tif (!(body instanceof Buffer)) {\n\t\t\tthrow new TypeError('Argument `body` should be a buffer');\n\t\t}\n\t\tif (typeof url !== 'string') {\n\t\t\tthrow new TypeError('Argument `url` should be a string');\n\t\t}\n\n\t\tsuper();\n\t\tthis.statusCode = statusCode;\n\t\tthis.headers = lowercaseKeys(headers);\n\t\tthis.body = body;\n\t\tthis.url = url;\n\t}\n\n\t_read() {\n\t\tthis.push(this.body);\n\t\tthis.push(null);\n\t}\n}\n\nmodule.exports = Response;\n","'use strict'\n\nfunction reusify (Constructor) {\n var head = new Constructor()\n var tail = head\n\n function get () {\n var current = head\n\n if (current.next) {\n head = current.next\n } else {\n head = new Constructor()\n tail = head\n }\n\n current.next = null\n\n return current\n }\n\n function release (obj) {\n tail.next = obj\n tail = obj\n }\n\n return {\n get: get,\n release: release\n }\n}\n\nmodule.exports = reusify\n","/*! run-parallel. MIT License. Feross Aboukhadijeh */\nmodule.exports = runParallel\n\nfunction runParallel (tasks, cb) {\n var results, pending, keys\n var isSync = true\n\n if (Array.isArray(tasks)) {\n results = []\n pending = tasks.length\n } else {\n keys = Object.keys(tasks)\n results = {}\n pending = keys.length\n }\n\n function done (err) {\n function end () {\n if (cb) cb(err, results)\n cb = null\n }\n if (isSync) process.nextTick(end)\n else end()\n }\n\n function each (i, err, result) {\n results[i] = result\n if (--pending === 0 || err) {\n done(err)\n }\n }\n\n if (!pending) {\n // empty\n done(null)\n } else if (keys) {\n // object\n keys.forEach(function (key) {\n tasks[key](function (err, result) { each(key, err, result) })\n })\n } else {\n // array\n tasks.forEach(function (task, i) {\n task(function (err, result) { each(i, err, result) })\n })\n }\n\n isSync = false\n}\n",";(function (sax) { // wrapper for non-node envs\n sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }\n sax.SAXParser = SAXParser\n sax.SAXStream = SAXStream\n sax.createStream = createStream\n\n // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.\n // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),\n // since that's the earliest that a buffer overrun could occur. This way, checks are\n // as rare as required, but as often as necessary to ensure never crossing this bound.\n // Furthermore, buffers are only tested at most once per write(), so passing a very\n // large string into write() might have undesirable effects, but this is manageable by\n // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme\n // edge case, result in creating at most one complete copy of the string passed in.\n // Set to Infinity to have unlimited buffers.\n sax.MAX_BUFFER_LENGTH = 64 * 1024\n\n var buffers = [\n 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',\n 'procInstName', 'procInstBody', 'entity', 'attribName',\n 'attribValue', 'cdata', 'script'\n ]\n\n sax.EVENTS = [\n 'text',\n 'processinginstruction',\n 'sgmldeclaration',\n 'doctype',\n 'comment',\n 'opentagstart',\n 'attribute',\n 'opentag',\n 'closetag',\n 'opencdata',\n 'cdata',\n 'closecdata',\n 'error',\n 'end',\n 'ready',\n 'script',\n 'opennamespace',\n 'closenamespace'\n ]\n\n function SAXParser (strict, opt) {\n if (!(this instanceof SAXParser)) {\n return new SAXParser(strict, opt)\n }\n\n var parser = this\n clearBuffers(parser)\n parser.q = parser.c = ''\n parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH\n parser.opt = opt || {}\n parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags\n parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'\n parser.tags = []\n parser.closed = parser.closedRoot = parser.sawRoot = false\n parser.tag = parser.error = null\n parser.strict = !!strict\n parser.noscript = !!(strict || parser.opt.noscript)\n parser.state = S.BEGIN\n parser.strictEntities = parser.opt.strictEntities\n parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)\n parser.attribList = []\n\n // namespaces form a prototype chain.\n // it always points at the current tag,\n // which protos to its parent tag.\n if (parser.opt.xmlns) {\n parser.ns = Object.create(rootNS)\n }\n\n // mostly just for error reporting\n parser.trackPosition = parser.opt.position !== false\n if (parser.trackPosition) {\n parser.position = parser.line = parser.column = 0\n }\n emit(parser, 'onready')\n }\n\n if (!Object.create) {\n Object.create = function (o) {\n function F () {}\n F.prototype = o\n var newf = new F()\n return newf\n }\n }\n\n if (!Object.keys) {\n Object.keys = function (o) {\n var a = []\n for (var i in o) if (o.hasOwnProperty(i)) a.push(i)\n return a\n }\n }\n\n function checkBufferLength (parser) {\n var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)\n var maxActual = 0\n for (var i = 0, l = buffers.length; i < l; i++) {\n var len = parser[buffers[i]].length\n if (len > maxAllowed) {\n // Text/cdata nodes can get big, and since they're buffered,\n // we can get here under normal conditions.\n // Avoid issues by emitting the text node now,\n // so at least it won't get any bigger.\n switch (buffers[i]) {\n case 'textNode':\n closeText(parser)\n break\n\n case 'cdata':\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n break\n\n case 'script':\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n break\n\n default:\n error(parser, 'Max buffer length exceeded: ' + buffers[i])\n }\n }\n maxActual = Math.max(maxActual, len)\n }\n // schedule the next check for the earliest possible buffer overrun.\n var m = sax.MAX_BUFFER_LENGTH - maxActual\n parser.bufferCheckPosition = m + parser.position\n }\n\n function clearBuffers (parser) {\n for (var i = 0, l = buffers.length; i < l; i++) {\n parser[buffers[i]] = ''\n }\n }\n\n function flushBuffers (parser) {\n closeText(parser)\n if (parser.cdata !== '') {\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n }\n if (parser.script !== '') {\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n }\n }\n\n SAXParser.prototype = {\n end: function () { end(this) },\n write: write,\n resume: function () { this.error = null; return this },\n close: function () { return this.write(null) },\n flush: function () { flushBuffers(this) }\n }\n\n var Stream\n try {\n Stream = require('stream').Stream\n } catch (ex) {\n Stream = function () {}\n }\n\n var streamWraps = sax.EVENTS.filter(function (ev) {\n return ev !== 'error' && ev !== 'end'\n })\n\n function createStream (strict, opt) {\n return new SAXStream(strict, opt)\n }\n\n function SAXStream (strict, opt) {\n if (!(this instanceof SAXStream)) {\n return new SAXStream(strict, opt)\n }\n\n Stream.apply(this)\n\n this._parser = new SAXParser(strict, opt)\n this.writable = true\n this.readable = true\n\n var me = this\n\n this._parser.onend = function () {\n me.emit('end')\n }\n\n this._parser.onerror = function (er) {\n me.emit('error', er)\n\n // if didn't throw, then means error was handled.\n // go ahead and clear error, so we can write again.\n me._parser.error = null\n }\n\n this._decoder = null\n\n streamWraps.forEach(function (ev) {\n Object.defineProperty(me, 'on' + ev, {\n get: function () {\n return me._parser['on' + ev]\n },\n set: function (h) {\n if (!h) {\n me.removeAllListeners(ev)\n me._parser['on' + ev] = h\n return h\n }\n me.on(ev, h)\n },\n enumerable: true,\n configurable: false\n })\n })\n }\n\n SAXStream.prototype = Object.create(Stream.prototype, {\n constructor: {\n value: SAXStream\n }\n })\n\n SAXStream.prototype.write = function (data) {\n if (typeof Buffer === 'function' &&\n typeof Buffer.isBuffer === 'function' &&\n Buffer.isBuffer(data)) {\n if (!this._decoder) {\n var SD = require('string_decoder').StringDecoder\n this._decoder = new SD('utf8')\n }\n data = this._decoder.write(data)\n }\n\n this._parser.write(data.toString())\n this.emit('data', data)\n return true\n }\n\n SAXStream.prototype.end = function (chunk) {\n if (chunk && chunk.length) {\n this.write(chunk)\n }\n this._parser.end()\n return true\n }\n\n SAXStream.prototype.on = function (ev, handler) {\n var me = this\n if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {\n me._parser['on' + ev] = function () {\n var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)\n args.splice(0, 0, ev)\n me.emit.apply(me, args)\n }\n }\n\n return Stream.prototype.on.call(me, ev, handler)\n }\n\n // this really needs to be replaced with character classes.\n // XML allows all manner of ridiculous numbers and digits.\n var CDATA = '[CDATA['\n var DOCTYPE = 'DOCTYPE'\n var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'\n var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'\n var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }\n\n // http://www.w3.org/TR/REC-xml/#NT-NameStartChar\n // This implementation works on strings, a single character at a time\n // as such, it cannot ever support astral-plane characters (10000-EFFFF)\n // without a significant breaking change to either this parser, or the\n // JavaScript language. Implementation of an emoji-capable xml parser\n // is left as an exercise for the reader.\n 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]/\n\n 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-]/\n\n 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]/\n 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-]/\n\n function isWhitespace (c) {\n return c === ' ' || c === '\\n' || c === '\\r' || c === '\\t'\n }\n\n function isQuote (c) {\n return c === '\"' || c === '\\''\n }\n\n function isAttribEnd (c) {\n return c === '>' || isWhitespace(c)\n }\n\n function isMatch (regex, c) {\n return regex.test(c)\n }\n\n function notMatch (regex, c) {\n return !isMatch(regex, c)\n }\n\n var S = 0\n sax.STATE = {\n BEGIN: S++, // leading byte order mark or whitespace\n BEGIN_WHITESPACE: S++, // leading whitespace\n TEXT: S++, // general stuff\n TEXT_ENTITY: S++, // & and such.\n OPEN_WAKA: S++, // <\n SGML_DECL: S++, // \n SCRIPT: S++, //