diff --git a/.dependabot/config.yml b/.dependabot/config.yml deleted file mode 100644 index b4b28aad7f..0000000000 --- a/.dependabot/config.yml +++ /dev/null @@ -1,9 +0,0 @@ -# https://dependabot.com/docs/config-file/ -version: 1 -update_configs: - - package_manager: 'javascript' - directory: '/' - update_schedule: 'weekly' - version_requirement_updates: 'increase_versions' - default_labels: - - 'pr: dependencies' diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..51c9edbfb8 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: npm + directory: '/' + schedule: + interval: weekly + open-pull-requests-limit: 5 + labels: + - 'pr: dependencies' + versioning-strategy: increase diff --git a/.github/workflows/code-scanning.yml b/.github/workflows/code-scanning.yml index 3f811bc964..ff827220a1 100644 --- a/.github/workflows/code-scanning.yml +++ b/.github/workflows/code-scanning.yml @@ -27,7 +27,6 @@ jobs: - name: Initialize CodeQL uses: github/codeql-action/init@v1 - # Override language selection by uncommenting this and choosing your languages # with: # languages: go, javascript, csharp, python, cpp, java diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 4bf520e85c..ffdac5fc42 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: - node: [12] + node: [14] os: [ubuntu-latest] steps: diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 4cd17afc4e..2083db4aaa 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -21,11 +21,11 @@ jobs: strategy: fail-fast: false matrix: - node: [10, 12] + node: [10, 12, 14] os: [ubuntu-latest, windows-latest, macos-latest] exclude: - os: ubuntu-latest - node: 12 + node: 14 steps: - uses: actions/checkout@v2 @@ -51,7 +51,7 @@ jobs: strategy: matrix: - node: [12] + node: [14] os: [ubuntu-latest] steps: diff --git a/CHANGELOG.md b/CHANGELOG.md index 6be16ab022..39494e6eb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project are documented in this file. ## Head +- Added: disable comments that are reported as errors for various reasons are now reported as standard lint errors rather than a separate class of errors that must be handled specially ([#4973](https://github.com/stylelint/stylelint/pull/4973)). +- Added: configured pattern in `*-pattern` rules violation message ([#4975](https://github.com/stylelint/stylelint/pull/4975)). +- Added: `comment-pattern` rule ([#4962](https://github.com/stylelint/stylelint/pull/4962)). +- Added: `ignoreAtRules[]` to `property-no-unknown` ([#4965](https://github.com/stylelint/stylelint/pull/4965)). +- Deprecated: `StylelintStandaloneReturnValue.reportedDisables`, `.descriptionlessDisables`, `.needlessDisables`, and `.invalidScopeDisables`. `.reportedDisables` will always be empty and the other properties will always be undefined, since these errors now show up in `.results` instead ([#4973](https://github.com/stylelint/stylelint/pull/4973)). + +## 13.7.2 + +- Fixed: regression for disable commands and adjacent double-slash comments ([#4950](https://github.com/stylelint/stylelint/pull/4950)). +- Fixed: use of full file path without converting it to glob ([#4931](https://github.com/stylelint/stylelint/pull/4931)). + +## 13.7.1 + - Fixed: double-slash disable comments when followed by another comment ([#4913](https://github.com/stylelint/stylelint/pull/4913)). ## 13.7.0 diff --git a/docs/developer-guide/formatters.md b/docs/developer-guide/formatters.md index ad1b2f280d..75099772a9 100644 --- a/docs/developer-guide/formatters.md +++ b/docs/developer-guide/formatters.md @@ -50,30 +50,6 @@ And the second argument (`returnValue`) is an object (type `StylelintStandaloneR ```js { "errored": false, // `true` if there were any warnings with "error" severity - "needlessDisables": [ - // Present if stylelint was configured with `reportNeedlessDisables: true` - { - "source": "path/to/file.css", - "ranges": [ - { - "start": 10, - "rule": "indentation" - } - ] - } - ], - "invalidScopeDisables": [ - // Present if stylelint was configured with `reportInvalidScopeDisables: true` - { - "source": "path/to/file.css", - "ranges": [ - { - "start": 1, - "rule": "color-named" - } - ] - } - ], "maxWarningsExceeded": { // Present if stylelint was configured with a `maxWarnings` count "maxWarnings": 10, diff --git a/docs/user-guide/configure.md b/docs/user-guide/configure.md index 4811b02908..9c380e808c 100644 --- a/docs/user-guide/configure.md +++ b/docs/user-guide/configure.md @@ -137,7 +137,7 @@ Reporters may use these severity levels to display violations or exit the proces ### `reportDisables` -You can set the `reportDisables` secondary option to report any disable comments for this rule, effectively disallowing authors to opt out of it. +You can set the `reportDisables` secondary option to report any `stylelint-disable` comments for this rule, effectively disallowing authors to opt out of it. For example: @@ -155,6 +155,8 @@ For example: } ``` +The report is considered to be a lint error. + ## `defaultSeverity` You can set the default severity level for all rules that do not have a severity specified in their secondary options. For example, you can set the default severity to `"warning"`: diff --git a/docs/user-guide/rules/list.md b/docs/user-guide/rules/list.md index 9c4f023149..fb3b6f7d1a 100644 --- a/docs/user-guide/rules/list.md +++ b/docs/user-guide/rules/list.md @@ -209,6 +209,7 @@ Grouped first by the following categories and then by the [_thing_](http://apps. - [`media-feature-name-disallowed-list`](../../../lib/rules/media-feature-name-disallowed-list/README.md): Specify a list of disallowed media feature names. - [`media-feature-name-no-vendor-prefix`](../../../lib/rules/media-feature-name-no-vendor-prefix/README.md): Disallow vendor prefixes for media feature names (Autofixable). - [`media-feature-name-value-allowed-list`](../../../lib/rules/media-feature-name-value-allowed-list/README.md): Specify a list of allowed media feature name and value pairs. +- [`media-feature-name-value-whitelist`](../../../lib/rules/media-feature-name-value-whitelist/README.md): Specify a list of allowed media feature name and value pairs. **(deprecated)** - [`media-feature-name-whitelist`](../../../lib/rules/media-feature-name-whitelist/README.md): Specify a list of allowed media feature names. **(deprecated)** ### Custom media @@ -227,6 +228,7 @@ Grouped first by the following categories and then by the [_thing_](http://apps. ### Comment +- [`comment-pattern`](../../../lib/rules/comment-pattern/README.md): Specify a pattern for comments. - [`comment-word-blacklist`](../../../lib/rules/comment-word-blacklist/README.md): Specify a list of disallowed words within comments. **(deprecated)** - [`comment-word-disallowed-list`](../../../lib/rules/comment-word-disallowed-list/README.md): Specify a list of disallowed words within comments. diff --git a/docs/user-guide/usage/cli.md b/docs/user-guide/usage/cli.md index 75bdcb45fb..b7c7e2a89d 100644 --- a/docs/user-guide/usage/cli.md +++ b/docs/user-guide/usage/cli.md @@ -114,6 +114,14 @@ Recursively linting all `.css` files in the `foo` directory using a custom synta stylelint "foo/**/*.css" --customSyntax path/to/my-custom-syntax.js ``` +### Example I - print on success + +Ensure output on successful runs: + +```shell +stylelint -f verbose "foo/**/*.css" +``` + ## Exit codes The CLI can exit the process with the following exit codes: diff --git a/docs/user-guide/usage/node-api.md b/docs/user-guide/usage/node-api.md index 635b998b0d..055daa10e4 100644 --- a/docs/user-guide/usage/node-api.md +++ b/docs/user-guide/usage/node-api.md @@ -66,14 +66,6 @@ An array containing all the stylelint result objects (the objects that formatter An object containing the maximum number of warnings and the amount found, e.g. `{ maxWarnings: 0, foundWarnings: 12 }`. -### `needlessDisables` - -An array of objects, one for each source, with tells you which stylelint-disable comments are not blocking a lint violation - -### `invalidScopeDisables` - -An array of objects, one for each source, with tells you which rule in `stylelint-disable ` comment don't exist within the configuration object. - ## Syntax errors `stylelint.lint()` does not reject the Promise when your CSS contains syntax errors. diff --git a/docs/user-guide/usage/options.md b/docs/user-guide/usage/options.md index c4df930e30..f4850701a8 100644 --- a/docs/user-guide/usage/options.md +++ b/docs/user-guide/usage/options.md @@ -141,23 +141,62 @@ You can use this option to see what your linting results would be like without t CLI flags: `--report-needless-disables, --rd` -Produce a report to clean up your codebase, keeping only the stylelint-disable comments that serve a purpose. +Produce a report to clean up your codebase, keeping only the `stylelint-disable` comments that serve a purpose. If needless disables are found, the: - CLI process exits with code `2` -- Node.js API adds a [`needlessDisables`](node-api.md#needlessdisables) property to the returned data +- Node.js API adds errors to the returned data ## `reportInvalidScopeDisables` CLI flags: `--report-invalid-scope-disables, --risd` -Produce a report of the stylelint-disable comments that used for rules that don't exist within the configuration object. +Produce a report of the `stylelint-disable` comments that used for rules that don't exist within the configuration object. If invalid scope disables are found, the: - CLI process exits with code `2` -- Node.js API adds a [`invalidScopeDisables`](node-api.md#invalidscopedisables) property to the returned data +- Node.js API adds errors to the returned data + +## `reportDescriptionlessDisables` + +CLI flags: `--report-descriptionless-disables, --rdd` + +Produce a report of the `stylelint-disable` comments without a description. + +For example, when the configuration `{ block-no-empty: true }` is given, the following patterns are reported: + + +```css +/* stylelint-disable */ +a {} +``` + + +```css +/* stylelint-disable-next-line block-no-empty */ +a {} +``` + +But, the following patterns (`stylelint-disable -- `) are _not_ reported: + + +```css +/* stylelint-disable -- This violation is ignorable. */ +a {} +``` + + +```css +/* stylelint-disable-next-line block-no-empty -- This violation is ignorable. */ +a {} +``` + +If descriptionless disables are found, the: + +- CLI process exits with code `2` +- Node.js API adds errors to the returned data ## `codeFilename` diff --git a/lib/__tests__/cli.test.js b/lib/__tests__/cli.test.js index 9599f39d4e..99d5f2491d 100644 --- a/lib/__tests__/cli.test.js +++ b/lib/__tests__/cli.test.js @@ -232,14 +232,9 @@ describe('CLI', () => { expect(process.exitCode).toBe(2); - expect(process.stdout.write).toHaveBeenCalledTimes(2); - expect(process.stdout.write).toHaveBeenNthCalledWith( - 1, - expect.stringContaining('needless disable: color-named'), - ); - expect(process.stdout.write).toHaveBeenNthCalledWith( - 2, - expect.stringContaining('Unexpected empty block'), + expect(process.stdout.write).toHaveBeenCalledTimes(1); + expect(process.stdout.write).toHaveBeenCalledWith( + expect.stringMatching(/Needless disable for "color-named".*Unexpected empty block/s), ); }); @@ -253,9 +248,8 @@ describe('CLI', () => { expect(process.exitCode).toBe(2); expect(process.stdout.write).toHaveBeenCalledTimes(1); - expect(process.stdout.write).toHaveBeenNthCalledWith( - 1, - expect.stringContaining('forbidden disable: block-no-empty'), + expect(process.stdout.write).toHaveBeenCalledWith( + expect.stringContaining('Rule "block-no-empty" may not be disabled'), ); }); @@ -270,9 +264,8 @@ describe('CLI', () => { expect(process.exitCode).toBe(2); expect(process.stdout.write).toHaveBeenCalledTimes(1); - expect(process.stdout.write).toHaveBeenNthCalledWith( - 1, - expect.stringContaining('descriptionless disable: block-no-empty'), + expect(process.stdout.write).toHaveBeenCalledWith( + expect.stringContaining('Disable for "block-no-empty" is missing a description'), ); }); diff --git a/lib/__tests__/descriptionlessDisables.test.js b/lib/__tests__/descriptionlessDisables.test.js index d1983b83f3..b515bc79d7 100644 --- a/lib/__tests__/descriptionlessDisables.test.js +++ b/lib/__tests__/descriptionlessDisables.test.js @@ -14,7 +14,7 @@ it('descriptionlessDisables', () => { /* stylelint-enable */ a { b {} /* stylelint-disable-line block-no-empty -- Description */ - } + } /* stylelint-disable-next-line block-no-empty * -- * Description */ @@ -35,27 +35,34 @@ it('descriptionlessDisables', () => { code: css, reportDescriptionlessDisables: true, }).then((linted) => { - const report = linted.descriptionlessDisables; + const results = linted.results; + + expect(results).toHaveLength(1); + const warnings = results[0].warnings.filter( + (warning) => warning.rule === '--report-descriptionless-disables', + ); - expect(report).toHaveLength(1); - expect(report[0].ranges).toEqual([ + expect(warnings).toEqual([ { - start: 12, - end: 14, - rule: 'all', - unusedRule: 'all', + line: 12, + column: 1, + rule: '--report-descriptionless-disables', + severity: 'error', + text: 'Disable for "all" is missing a description', }, { - start: 16, - end: 16, - rule: 'block-no-empty', - unusedRule: 'block-no-empty', + line: 16, + column: 8, + rule: '--report-descriptionless-disables', + severity: 'error', + text: 'Disable for "block-no-empty" is missing a description', }, { - start: 19, - end: 19, - rule: 'block-no-empty', - unusedRule: 'block-no-empty', + line: 18, + column: 1, + rule: '--report-descriptionless-disables', + severity: 'error', + text: 'Disable for "block-no-empty" is missing a description', }, ]); }); diff --git a/lib/__tests__/disableRanges.test.js b/lib/__tests__/disableRanges.test.js index cef906a581..e309f1884e 100644 --- a/lib/__tests__/disableRanges.test.js +++ b/lib/__tests__/disableRanges.test.js @@ -1,10 +1,13 @@ 'use strict'; +const _ = require('lodash'); const assignDisabledRanges = require('../assignDisabledRanges'); const less = require('postcss-less'); const postcss = require('postcss'); const scss = require('postcss-scss'); +/* eslint jest/expect-expect: ["error", { "assertFunctionNames": ["expect*"] }] */ + it('no disabling', () => { return testDisableRanges('a {}').then((result) => { expect(result.stylelint.disabledRanges).toEqual({ all: [] }); @@ -13,7 +16,7 @@ it('no disabling', () => { it('disable without re-enabling', () => { return testDisableRanges('/* stylelint-disable */\na {}').then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [ { start: 1, @@ -30,7 +33,7 @@ it('disable and re-enable', () => { b {} /* stylelint-enable */ .foo {}`).then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [ { start: 2, @@ -53,7 +56,7 @@ it('disable and re-enable twice', () => { b {} /* stylelint-enable */ .foo {}`).then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [ { start: 2, @@ -75,7 +78,7 @@ it('disable and re-enable twice', () => { it('disable rule without re-enabling', () => { return testDisableRanges('/* stylelint-disable foo-bar */\na {}') .then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'foo-bar': [ { @@ -91,7 +94,7 @@ it('disable rule without re-enabling', () => { return testDisableRanges( '/* stylelint-disable selector-combinator-space-before */\n' + 'a {}', ).then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'selector-combinator-space-before': [ { @@ -116,7 +119,7 @@ it('mixed disabling of specific and all rules, enabling of all', () => { b {} /* stylelint-enable */ .foo {}`).then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'foo-bar': [ { @@ -147,7 +150,7 @@ it('mixed disabling of specific and all rules, enabling of all', () => { it('disable rules with newline in rule list', () => { return testDisableRanges('/* stylelint-disable foo-bar, hoo-hah,\n\tslime */\n' + 'b {}\n').then( (result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'foo-bar': [ { @@ -174,66 +177,57 @@ it('disable rules with newline in rule list', () => { it('disable single line all rules', () => { return testDisableRanges('a {} /* stylelint-disable-line */').then((result) => { - expect(result.stylelint.disabledRanges).toEqual( - { - all: [ - { - start: 1, - end: 1, - strictStart: true, - strictEnd: true, - }, - ], - }, - 'disabling all rules', - ); + expectDisableRanges(result, { + all: [ + { + start: 1, + end: 1, + strictStart: true, + strictEnd: true, + }, + ], + }); }); }); it('disable single line one rule', () => { return testDisableRanges('a {} /* stylelint-disable-line block-no-empty */').then((result) => { - expect(result.stylelint.disabledRanges).toEqual( - { + expectDisableRanges(result, { + all: [], + 'block-no-empty': [ + { + start: 1, + end: 1, + strictStart: true, + strictEnd: true, + }, + ], + }); + }); +}); + +it('disable single line multiple rules', () => { + return testDisableRanges('b {}\n\na {} /* stylelint-disable-line block-no-empty, blergh */').then( + (result) => { + expectDisableRanges(result, { all: [], 'block-no-empty': [ { - start: 1, - end: 1, + start: 3, + end: 3, strictStart: true, strictEnd: true, }, ], - }, - 'disabling a single rule', - ); - }); -}); - -it('disable single line multiple rules', () => { - return testDisableRanges('b {}\n\na {} /* stylelint-disable-line block-no-empty, blergh */').then( - (result) => { - expect(result.stylelint.disabledRanges).toEqual( - { - all: [], - 'block-no-empty': [ - { - start: 3, - end: 3, - strictStart: true, - strictEnd: true, - }, - ], - blergh: [ - { - start: 3, - end: 3, - strictStart: true, - strictEnd: true, - }, - ], - }, - 'disabling multiple specific rules', - ); + blergh: [ + { + start: 3, + end: 3, + strictStart: true, + strictEnd: true, + }, + ], + }); }, ); }); @@ -251,9 +245,25 @@ it('disable single line one rule and re-enable all', () => { it('disable next line all rules', () => { return testDisableRanges('/* stylelint-disable-next-line */\na {} ').then((result) => { - expect(result.stylelint.disabledRanges).toEqual( - { - all: [ + expectDisableRanges(result, { + all: [ + { + start: 2, + end: 2, + strictStart: true, + strictEnd: true, + }, + ], + }); + }); +}); + +it('disable next line one rule', () => { + return testDisableRanges('/* stylelint-disable-next-line block-no-empty */\na {}').then( + (result) => { + expectDisableRanges(result, { + all: [], + 'block-no-empty': [ { start: 2, end: 2, @@ -261,29 +271,7 @@ it('disable next line all rules', () => { strictEnd: true, }, ], - }, - 'disabling all rules', - ); - }); -}); - -it('disable next line one rule', () => { - return testDisableRanges('/* stylelint-disable-next-line block-no-empty */\na {}').then( - (result) => { - expect(result.stylelint.disabledRanges).toEqual( - { - all: [], - 'block-no-empty': [ - { - start: 2, - end: 2, - strictStart: true, - strictEnd: true, - }, - ], - }, - 'disabling a single rule', - ); + }); }, ); }); @@ -296,28 +284,25 @@ it('disable next line multiple rules', () => { /* stylelint-disable-next-line block-no-empty, blergh */ a {}`, (result) => { - expect(result.stylelint.disabledRanges).toEqual( - { - all: [], - 'block-no-empty': [ - { - start: 5, - end: 5, - strictStart: true, - strictEnd: true, - }, - ], - blergh: [ - { - start: 5, - end: 5, - strictStart: true, - strictEnd: true, - }, - ], - }, - 'disabling multiple specific rules', - ); + expectDisableRanges(result, { + all: [], + 'block-no-empty': [ + { + start: 5, + end: 5, + strictStart: true, + strictEnd: true, + }, + ], + blergh: [ + { + start: 5, + end: 5, + strictStart: true, + strictEnd: true, + }, + ], + }); }, ); }); @@ -331,7 +316,7 @@ it('SCSS // line-disabling comment', () => { .use(assignDisabledRanges) .process(scssSource, { syntax: scss, from: undefined }) .then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'declaration-no-important': [ { @@ -354,7 +339,7 @@ it('Less // line-disabling comment', () => { .use(assignDisabledRanges) .process(lessSource, { syntax: less, from: undefined }) .then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'declaration-no-important': [ { @@ -375,7 +360,7 @@ it('nested ranges all rule-specific', () => { /* stylelint-enable bar */ /* stylelint-enable foo, hop */ /* stylelint-enable baz */`).then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], foo: [ { @@ -418,7 +403,7 @@ it('nested ranges all for all rules', () => { /* stylelint-enable bar */ /* stylelint-disable bar */ /* stylelint-enable */`).then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [ { start: 1, @@ -449,7 +434,7 @@ it('nested ranges disable rules enable all', () => { return testDisableRanges(`/* stylelint-disable foo */ /* stylelint-disable bar, baz */ /* stylelint-enable */`).then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], foo: [ { @@ -484,7 +469,7 @@ it('nested ranges mix disabling enabling all rules and specific rules', () => { /* stylelint-enable foo */ /* stylelint-enable */ /* stylelint-disable bar */`).then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [ { start: 1, @@ -525,7 +510,7 @@ it('nested ranges another mix', () => { /* stylelint-enable foo */ /* stylelint-disable foo */ /* stylelint-enable */`).then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [ { start: 1, @@ -534,6 +519,14 @@ it('nested ranges another mix', () => { strictEnd: true, }, ], + bar: [ + { + start: 1, + end: 2, + strictStart: false, + strictEnd: true, + }, + ], foo: [ { start: 1, @@ -548,14 +541,6 @@ it('nested ranges another mix', () => { strictEnd: false, }, ], - bar: [ - { - start: 1, - end: 2, - strictStart: false, - strictEnd: true, - }, - ], }); }); }); @@ -648,7 +633,7 @@ it('enable rule without disabling rule', () => { it('disable (with description) without re-enabling', () => { return testDisableRanges('/* stylelint-disable -- Description */\na {}').then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [ { start: 1, @@ -666,7 +651,7 @@ it('disable and re-enable (with descriptions)', () => { b {} /* stylelint-enable -- Description */ .foo {}`).then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [ { start: 2, @@ -683,7 +668,7 @@ it('disable and re-enable (with descriptions)', () => { it('disable rule (with description) without re-enabling', () => { return testDisableRanges('/* stylelint-disable foo-bar -- Description */\na {}').then( (result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'foo-bar': [ { @@ -703,7 +688,7 @@ it('disable rules (with description) with newline in rule list', () => { return testDisableRanges( '/* stylelint-disable foo-bar, hoo-hah,\n\tslime -- Description */\n' + 'b {}\n', ).then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'foo-bar': [ { @@ -739,7 +724,7 @@ it('SCSS // line-disabling comment (with description)', () => { .use(assignDisabledRanges) .process(scssSource, { syntax: scss, from: undefined }) .then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'declaration-no-important': [ { @@ -766,7 +751,7 @@ it('SCSS // disable next-line comment (with multi-line description)', () => { .use(assignDisabledRanges) .process(scssSource, { syntax: scss, from: undefined }) .then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'declaration-no-important': [ { @@ -793,7 +778,30 @@ it('SCSS // disable comment (with // comment after blank line)', () => { .use(assignDisabledRanges) .process(scssSource, { syntax: scss, from: undefined }) .then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { + all: [], + 'declaration-no-important': [ + { + start: 2, + strictStart: true, + }, + ], + }); + }); +}); + +it('SCSS // disable comment (with // comment immediately after)', () => { + const scssSource = `a { + // stylelint-disable declaration-no-important + // Unrelated + color: pink !important; + }`; + + return postcss() + .use(assignDisabledRanges) + .process(scssSource, { syntax: scss, from: undefined }) + .then((result) => { + expectDisableRanges(result, { all: [], 'declaration-no-important': [ { @@ -817,7 +825,7 @@ it('SCSS /* disable comment (with // comment after blank line)', () => { .use(assignDisabledRanges) .process(scssSource, { syntax: scss, from: undefined }) .then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'declaration-no-important': [ { @@ -829,6 +837,122 @@ it('SCSS /* disable comment (with // comment after blank line)', () => { }); }); +it('SCSS // disable comment (with // comment immediately before)', () => { + const scssSource = `a { + // Unrelated + // stylelint-disable declaration-no-important + color: pink !important; + }`; + + return postcss() + .use(assignDisabledRanges) + .process(scssSource, { syntax: scss, from: undefined }) + .then((result) => { + expectDisableRanges(result, { + all: [], + 'declaration-no-important': [ + { + start: 3, + strictStart: true, + }, + ], + }); + }); +}); + +it('SCSS two adjacent // disable comments', () => { + const scssSource = `a { + // stylelint-disable declaration-no-important + // stylelint-disable foo-bar + color: pink !important; + }`; + + return postcss() + .use(assignDisabledRanges) + .process(scssSource, { syntax: scss, from: undefined }) + .then((result) => { + expectDisableRanges(result, { + all: [], + 'declaration-no-important': [ + { + start: 2, + strictStart: true, + }, + ], + 'foo-bar': [ + { + start: 3, + strictStart: true, + }, + ], + }); + }); +}); + +it('SCSS two adjacent // disable comments with multi-line descriptions', () => { + const scssSource = `a { + // stylelint-disable declaration-no-important -- + // Description 1 + // stylelint-disable foo-bar + // -- + // Description 2 + color: pink !important; + }`; + + return postcss() + .use(assignDisabledRanges) + .process(scssSource, { syntax: scss, from: undefined }) + .then((result) => { + expectDisableRanges(result, { + all: [], + 'declaration-no-important': [ + { + start: 2, + strictStart: true, + description: 'Description 1', + }, + ], + 'foo-bar': [ + { + start: 4, + strictStart: true, + description: 'Description 2', + }, + ], + }); + }); +}); + +it('SCSS two // disable comments with an unrelated comment between them', () => { + const scssSource = `a { + // stylelint-disable declaration-no-important + // Unrelated + // stylelint-disable foo-bar + color: pink !important; + }`; + + return postcss() + .use(assignDisabledRanges) + .process(scssSource, { syntax: scss, from: undefined }) + .then((result) => { + expectDisableRanges(result, { + all: [], + 'declaration-no-important': [ + { + start: 2, + strictStart: true, + }, + ], + 'foo-bar': [ + { + start: 4, + strictStart: true, + }, + ], + }); + }); +}); + it('Less // line-disabling comment (with description)', () => { const lessSource = `a { color: pink !important; // stylelint-disable-line declaration-no-important -- Description @@ -838,7 +962,7 @@ it('Less // line-disabling comment (with description)', () => { .use(assignDisabledRanges) .process(lessSource, { syntax: less, from: undefined }) .then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'declaration-no-important': [ { @@ -865,7 +989,7 @@ it('Less // disable next-line comment (with multi-line description)', () => { .use(assignDisabledRanges) .process(lessSource, { syntax: less, from: undefined }) .then((result) => { - expect(result.stylelint.disabledRanges).toEqual({ + expectDisableRanges(result, { all: [], 'declaration-no-important': [ { @@ -880,6 +1004,29 @@ it('Less // disable next-line comment (with multi-line description)', () => { }); }); +function expectDisableRanges(result, expected) { + const actual = result.stylelint.disabledRanges; + + expect(Object.keys(actual)).toEqual(Object.keys(expected)); + + for (const [name, expectedRanges] of Object.entries(expected)) { + const actualRanges = actual[name]; + + expect(actualRanges).toHaveLength(expectedRanges.length); + + for (let i = 0; i < expectedRanges.length; i++) { + expectDisableRange(actualRanges[i], expectedRanges[i]); + } + } +} + +function expectDisableRange(actual, expected) { + const actualMutable = _.cloneDeep(actual); + + delete actualMutable.comment; + expect(actualMutable).toEqual(expected); +} + function testDisableRanges(source, cb) { return postcss().use(assignDisabledRanges).process(source, { from: undefined }).then(cb); } diff --git a/lib/__tests__/fixtures/globs/a(b)/styles.css b/lib/__tests__/fixtures/globs/a(b)/styles.css new file mode 100644 index 0000000000..077f6dd7c0 --- /dev/null +++ b/lib/__tests__/fixtures/globs/a(b)/styles.css @@ -0,0 +1 @@ +a {} diff --git a/lib/__tests__/invalidScopeDisables.test.js b/lib/__tests__/invalidScopeDisables.test.js index f3a06bc03a..ffd888b73b 100644 --- a/lib/__tests__/invalidScopeDisables.test.js +++ b/lib/__tests__/invalidScopeDisables.test.js @@ -1,6 +1,5 @@ 'use strict'; -const invalidScopeDisables = require('../invalidScopeDisables'); const path = require('path'); const replaceBackslashes = require('../testUtils/replaceBackslashes'); const standalone = require('../standalone'); @@ -10,10 +9,6 @@ function fixture(name) { return replaceBackslashes(path.join(__dirname, './fixtures/disableOptions', name)); } -function source(name) { - return path.join(__dirname, './fixtures/disableOptions', name); -} - it('invalidScopeDisables simple case', () => { const config = { rules: { @@ -34,14 +29,27 @@ it('invalidScopeDisables simple case', () => { return standalone({ config, code: css, + reportInvalidScopeDisables: true, }).then((linted) => { - const report = invalidScopeDisables(linted.results, config); + const results = linted.results; - expect(report).toHaveLength(1); - expect(report[0].ranges).toHaveLength(2); - expect(report[0].ranges).toEqual([ - { end: 3, start: 1, rule: 'block-no-empty', unusedRule: 'block-no-empty' }, - { end: 5, start: 5, rule: 'block-no-empty', unusedRule: 'block-no-empty' }, + expect(results).toHaveLength(1); + + expect(invalidScopeDisables(results[0].warnings)).toEqual([ + { + line: 1, + column: 1, + rule: '--report-invalid-scope-disables', + text: 'Rule "block-no-empty" isn\'t enabled', + severity: 'error', + }, + { + line: 5, + column: 8, + rule: '--report-invalid-scope-disables', + text: 'Rule "block-no-empty" isn\'t enabled', + severity: 'error', + }, ]); }); }); @@ -61,17 +69,31 @@ it('invalidScopeDisables complex case', () => { // ignore files contain `CssSyntaxError` fixture('disabled-ranges-3.css'), ], + reportInvalidScopeDisables: true, }).then((linted) => { - expect(invalidScopeDisables(linted.results, config)).toEqual([ + const results = linted.results; + + expect(results).toHaveLength(3); + + expect(invalidScopeDisables(results[0].warnings)).toEqual([ { - source: source('disabled-ranges-1.css'), - ranges: [{ start: 1, end: 3, rule: 'color-named', unusedRule: 'color-named' }], + line: 1, + column: 1, + rule: '--report-invalid-scope-disables', + text: 'Rule "color-named" isn\'t enabled', + severity: 'error', }, + ]); + expect(invalidScopeDisables(results[1].warnings)).toEqual([ { - source: source('disabled-ranges-2.css'), - ranges: [{ start: 5, end: 5, rule: 'color-named', unusedRule: 'color-named' }], + line: 5, + column: 6, + rule: '--report-invalid-scope-disables', + text: 'Rule "color-named" isn\'t enabled', + severity: 'error', }, ]); + expect(invalidScopeDisables(results[2].warnings)).toHaveLength(0); }); }); @@ -87,11 +109,19 @@ it('invalidScopeDisables ignored case', () => { files: [fixture('disabled-ranges-1.css'), fixture('ignored-file.css')], ignoreDisables: true, ignorePath: fixture('.stylelintignore'), + reportInvalidScopeDisables: true, }).then((linted) => { - expect(invalidScopeDisables(linted.results, config)).toEqual([ + const results = linted.results; + + expect(results).toHaveLength(1); + + expect(invalidScopeDisables(results[0].warnings)).toEqual([ { - source: source('disabled-ranges-1.css'), - ranges: [{ start: 5, end: 7, rule: 'block-no-empty', unusedRule: 'block-no-empty' }], + line: 5, + column: 1, + rule: '--report-invalid-scope-disables', + text: 'Rule "block-no-empty" isn\'t enabled', + severity: 'error', }, ]); }); @@ -104,8 +134,12 @@ it('invalidScopeDisables without config', () => { }, code: 'a {}', ignoreDisables: true, + reportInvalidScopeDisables: true, }).then((linted) => { - expect(invalidScopeDisables(linted.results)).toEqual([]); + const results = linted.results; + + expect(results).toHaveLength(1); + expect(invalidScopeDisables(results[0].warnings)).toHaveLength(0); }); }); @@ -114,14 +148,22 @@ it('invalidScopeDisables for config file', () => { files: [fixture('file-config/disabled-ranges-1.css')], reportInvalidScopeDisables: true, }).then((linted) => { - expect(linted.invalidScopeDisables).toHaveLength(1); - expect(linted.invalidScopeDisables[0].ranges).toEqual([ + const results = linted.results; + + expect(results).toHaveLength(1); + + expect(invalidScopeDisables(results[0].warnings)).toEqual([ { - end: undefined, - start: 4, - rule: 'foo', - unusedRule: 'foo', + line: 4, + column: 1, + rule: '--report-invalid-scope-disables', + text: 'Rule "foo" isn\'t enabled', + severity: 'error', }, ]); }); }); + +function invalidScopeDisables(warnings) { + return warnings.filter((warning) => warning.rule === '--report-invalid-scope-disables'); +} diff --git a/lib/__tests__/needlessDisables.test.js b/lib/__tests__/needlessDisables.test.js index 2a0b7380e4..dc222bb624 100644 --- a/lib/__tests__/needlessDisables.test.js +++ b/lib/__tests__/needlessDisables.test.js @@ -5,10 +5,6 @@ const replaceBackslashes = require('../testUtils/replaceBackslashes'); const standalone = require('../standalone'); const stripIndent = require('common-tags').stripIndent; -function source(name) { - return path.join(__dirname, './fixtures/disableOptions', name); -} - function fixture(name) { return replaceBackslashes(path.join(__dirname, './fixtures/disableOptions', name)); } @@ -38,12 +34,58 @@ it('needlessDisables simple case', () => { code: css, reportNeedlessDisables: true, }).then((linted) => { - const report = linted.needlessDisables; + const results = linted.results; + + expect(results).toHaveLength(1); + const warnings = results[0].warnings; - expect(report).toHaveLength(1); - expect(report[0].ranges).toEqual([ - { start: 7, end: 9, rule: 'all', unusedRule: 'all' }, - { start: 11, end: 11, rule: 'block-no-empty', unusedRule: 'block-no-empty' }, + expect(warnings).toEqual([ + { + line: 7, + column: 1, + text: 'Needless disable for "all"', + rule: '--report-needless-disables', + severity: 'error', + }, + { + line: 11, + column: 22, + text: 'Needless disable for "block-no-empty"', + rule: '--report-needless-disables', + severity: 'error', + }, + ]); + }); +}); + +it('needlessDisables with multiple rules', () => { + const config = { + rules: { 'block-no-empty': true, 'color-named': true }, + }; + + const css = stripIndent` + /* stylelint-disable-next-line block-no-empty, color-named */ + a {} + `; + + return standalone({ + config, + code: css, + reportNeedlessDisables: true, + }).then((linted) => { + const results = linted.results; + + expect(results).toHaveLength(1); + const warnings = results[0].warnings; + + expect(warnings).toEqual([ + { + line: 1, + column: 1, + text: 'Needless disable for "color-named"', + rule: '--report-needless-disables', + severity: 'error', + }, ]); }); }); @@ -66,24 +108,51 @@ it('needlessDisables complex case', () => { ], reportNeedlessDisables: true, }).then((linted) => { - expect(linted.needlessDisables).toEqual([ + const results = linted.results; + + expect(results).toHaveLength(3); + expect(needlessDisables(results[0].warnings)).toEqual([ + { + line: 1, + column: 1, + text: 'Needless disable for "color-named"', + rule: '--report-needless-disables', + severity: 'error', + }, + { + line: 5, + column: 1, + text: 'Needless disable for "block-no-empty"', + rule: '--report-needless-disables', + severity: 'error', + }, + ]); + + expect(needlessDisables(results[1].warnings)).toEqual([ { - source: source('disabled-ranges-1.css'), - ranges: [ - { start: 1, end: 3, rule: 'color-named', unusedRule: 'color-named' }, - { start: 5, end: 7, rule: 'block-no-empty', unusedRule: 'block-no-empty' }, - { start: 10, end: 10, rule: 'block-no-empty', unusedRule: 'block-no-empty' }, - ], + line: 6, + column: 19, + text: 'Needless disable for "block-no-empty"', + rule: '--report-needless-disables', + severity: 'error', }, { - source: source('disabled-ranges-2.css'), - ranges: [ - { start: 5, end: 5, rule: 'color-named', unusedRule: 'color-named' }, - { start: 6, end: 6, rule: 'block-no-empty', unusedRule: 'block-no-empty' }, - { start: 8, end: 10, rule: 'block-no-empty', unusedRule: 'block-no-empty' }, - ], + line: 8, + column: 1, + text: 'Needless disable for "block-no-empty"', + rule: '--report-needless-disables', + severity: 'error', + }, + { + line: 5, + column: 6, + text: 'Needless disable for "color-named"', + rule: '--report-needless-disables', + severity: 'error', }, ]); + + expect(needlessDisables(results[2].warnings)).toHaveLength(0); }); }); @@ -100,15 +169,37 @@ it('needlessDisables ignored case', () => { reportNeedlessDisables: true, ignorePath: fixture('.stylelintignore'), }).then((linted) => { - expect(linted.needlessDisables).toEqual([ + const results = linted.results; + + expect(results).toHaveLength(1); + const warnings = results[0].warnings; + + expect(needlessDisables(warnings)).toEqual([ { - source: source('disabled-ranges-1.css'), - ranges: [ - { start: 1, end: 3, rule: 'color-named', unusedRule: 'color-named' }, - { start: 5, end: 7, rule: 'block-no-empty', unusedRule: 'block-no-empty' }, - { start: 10, end: 10, rule: 'all', unusedRule: 'all' }, - ], + line: 10, + column: 19, + text: 'Needless disable for "all"', + rule: '--report-needless-disables', + severity: 'error', + }, + { + line: 1, + column: 1, + text: 'Needless disable for "color-named"', + rule: '--report-needless-disables', + severity: 'error', + }, + { + line: 5, + column: 1, + text: 'Needless disable for "block-no-empty"', + rule: '--report-needless-disables', + severity: 'error', }, ]); }); }); + +function needlessDisables(warnings) { + return warnings.filter((warning) => warning.rule === '--report-needless-disables'); +} diff --git a/lib/__tests__/reportDisables.test.js b/lib/__tests__/reportDisables.test.js index c04d529c19..af682574c6 100644 --- a/lib/__tests__/reportDisables.test.js +++ b/lib/__tests__/reportDisables.test.js @@ -19,17 +19,27 @@ describe('reportDisables', () => { `; return standalone({ config, code: css }).then((linted) => { - const report = linted.reportedDisables; - - expect(report).toHaveLength(1); - expect(report[0].ranges).toEqual([ - { start: 1, end: 3, rule: 'block-no-empty', unusedRule: 'block-no-empty' }, - { start: 5, end: 5, rule: 'block-no-empty', unusedRule: 'block-no-empty' }, + const results = linted.results; + + expect(results).toHaveLength(1); + const warnings = results[0].warnings; + + expect(warnings).toEqual([ + { + line: 1, + column: 1, + text: 'Rule "block-no-empty" may not be disabled', + rule: 'reportDisables', + severity: 'error', + }, + { + line: 5, + column: 8, + text: 'Rule "block-no-empty" may not be disabled', + rule: 'reportDisables', + severity: 'error', + }, ]); - - // Although these disables are reported as issues, they're still in effect - // so the underlying lint issues are not reported. - expect(linted.results[0].warnings).toHaveLength(0); }); }); @@ -52,15 +62,27 @@ describe('reportDisables', () => { code: css, ignoreDisables: true, }).then((linted) => { - const report = linted.reportedDisables; - - expect(report).toHaveLength(1); - expect(report[0].ranges).toEqual([ - { start: 1, end: 3, rule: 'block-no-empty', unusedRule: 'block-no-empty' }, - { start: 5, end: 5, rule: 'block-no-empty', unusedRule: 'block-no-empty' }, + const results = linted.results; + + expect(results).toHaveLength(1); + const warnings = results[0].warnings; + + expect(warnings.filter((warning) => warning.rule === 'reportDisables')).toEqual([ + { + line: 1, + column: 1, + text: 'Rule "block-no-empty" may not be disabled', + rule: 'reportDisables', + severity: 'error', + }, + { + line: 5, + column: 8, + text: 'Rule "block-no-empty" may not be disabled', + rule: 'reportDisables', + severity: 'error', + }, ]); - - expect(linted.results[0].warnings).toHaveLength(2); }); }); @@ -79,9 +101,10 @@ describe('reportDisables', () => { `; return standalone({ config, code: css }).then((linted) => { - const report = linted.reportedDisables; + const results = linted.results; - expect(report).toHaveLength(0); + expect(results).toHaveLength(1); + expect(results[0].warnings).toHaveLength(0); }); }); @@ -96,10 +119,10 @@ describe('reportDisables', () => { `; return standalone({ config, code: css }).then((linted) => { - const report = linted.reportedDisables; + const results = linted.results; - expect(report).toHaveLength(1); - expect(report[0].ranges).toHaveLength(0); + expect(results).toHaveLength(1); + expect(results[0].warnings).toHaveLength(0); }); }); }); diff --git a/lib/__tests__/standalone-formatter.test.js b/lib/__tests__/standalone-formatter.test.js index 31cf06f66e..19ab9dfef2 100644 --- a/lib/__tests__/standalone-formatter.test.js +++ b/lib/__tests__/standalone-formatter.test.js @@ -50,53 +50,3 @@ it('standalone with invalid formatter option', () => { ); }); }); - -it('standalone formatter receives {needlessDisables} as second argument', () => { - const formatter = jest.fn((results, { needlessDisables }) => { - return JSON.stringify({ results, needlessDisables }, null, 2); - }); - - return standalone({ - code: ` - /* stylelint-disable yo */ - a {} - `, - config: configBlockNoEmpty, - reportNeedlessDisables: true, - formatter, - }).then((linted) => { - const { output, results, needlessDisables } = linted; - - expect(needlessDisables).not.toBeUndefined(); - expect(needlessDisables).toHaveLength(1); - - expect(typeof output).toBe('string'); - expect(formatter).toHaveBeenCalledTimes(1); - expect(output).toBe(JSON.stringify({ results, needlessDisables }, null, 2)); - }); -}); - -it('standalone formatter receives {invalidScopeDisables} as second argument', () => { - const formatter = jest.fn((results, { invalidScopeDisables }) => { - return JSON.stringify({ results, invalidScopeDisables }, null, 2); - }); - - return standalone({ - code: ` - /* stylelint-disable indentation */ - a { color: red; } - `, - config: configBlockNoEmpty, - reportInvalidScopeDisables: true, - formatter, - }).then((linted) => { - const { output, results, invalidScopeDisables } = linted; - - expect(invalidScopeDisables).not.toBeUndefined(); - expect(invalidScopeDisables).toHaveLength(1); - - expect(typeof output).toBe('string'); - expect(formatter).toHaveBeenCalledTimes(1); - expect(output).toBe(JSON.stringify({ results, invalidScopeDisables }, null, 2)); - }); -}); diff --git a/lib/__tests__/standalone-globs.test.js b/lib/__tests__/standalone-globs.test.js index 2f3f486287..0d9d2c8255 100644 --- a/lib/__tests__/standalone-globs.test.js +++ b/lib/__tests__/standalone-globs.test.js @@ -21,6 +21,7 @@ describe('standalone globbing', () => { // ref https://github.com/micromatch/micromatch#matching-features const fixtureDirs = [ `[digit]/not-digits`, + `a(b)`, `with spaces`, `extglob!(s)`, `got!negate/negate`, diff --git a/lib/__tests__/standalone-invalidScopeDisables.test.js b/lib/__tests__/standalone-invalidScopeDisables.test.js deleted file mode 100644 index 220baff965..0000000000 --- a/lib/__tests__/standalone-invalidScopeDisables.test.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -const path = require('path'); -const replaceBackslashes = require('../testUtils/replaceBackslashes'); -const standalone = require('../standalone'); - -const fixturesPath = replaceBackslashes(path.join(__dirname, 'fixtures')); -const config = { - quiet: true, - rules: { - 'block-no-empty': true, - }, -}; - -it('standalone with input css and `reportInvalidScopeDisables`', () => { - return standalone({ - code: '/* stylelint-disable color-named */\na {}', - config, - reportInvalidScopeDisables: true, - }).then((linted) => { - const invalidScopeDisables = linted.invalidScopeDisables; - - expect(typeof invalidScopeDisables).toBe('object'); - expect(invalidScopeDisables).toHaveLength(1); - expect(invalidScopeDisables[0].ranges).toHaveLength(1); - expect(invalidScopeDisables[0].ranges[0]).toEqual({ - start: 1, - rule: 'color-named', - unusedRule: 'color-named', - }); - }); -}); - -it('standalone with input file(s) and `reportInvalidScopeDisables`', () => { - return standalone({ - files: replaceBackslashes(path.join(fixturesPath, 'empty-block-with-disables.css')), - config, - reportInvalidScopeDisables: true, - }).then((linted) => { - const invalidScopeDisables = linted.invalidScopeDisables; - - expect(typeof invalidScopeDisables).toBe('object'); - expect(invalidScopeDisables).toHaveLength(1); - expect(invalidScopeDisables[0].source).toBe( - path.join(fixturesPath, 'empty-block-with-disables.css'), - ); - expect(invalidScopeDisables[0].ranges[0]).toEqual({ - start: 1, - rule: 'color-named', - unusedRule: 'color-named', - }); - }); -}); diff --git a/lib/__tests__/standalone-needlessDisables.test.js b/lib/__tests__/standalone-needlessDisables.test.js deleted file mode 100644 index b3559e463a..0000000000 --- a/lib/__tests__/standalone-needlessDisables.test.js +++ /dev/null @@ -1,138 +0,0 @@ -'use strict'; - -const path = require('path'); -const replaceBackslashes = require('../testUtils/replaceBackslashes'); -const standalone = require('../standalone'); - -const fixturesPath = replaceBackslashes(path.join(__dirname, 'fixtures')); - -it('standalone with input css and `reportNeedlessDisables`', () => { - const config = { - quiet: true, - rules: { - 'block-no-empty': true, - 'color-named': 'never', - }, - }; - - return standalone({ - code: '/* stylelint-disable color-named */\na {}', - config, - reportNeedlessDisables: true, - }).then((linted) => { - const needlessDisables = linted.needlessDisables; - - expect(typeof needlessDisables).toBe('object'); - expect(needlessDisables).toHaveLength(1); - expect(needlessDisables[0].ranges).toHaveLength(1); - expect(needlessDisables[0].ranges[0]).toEqual({ - start: 1, - rule: 'color-named', - unusedRule: 'color-named', - }); - - expect(linted.results).toHaveLength(1); - const warnings = linted.results[0].warnings; - - expect(typeof warnings).toBe('object'); - expect(warnings).toHaveLength(1); - expect(warnings[0]).toEqual({ - line: 2, - column: 3, - rule: 'block-no-empty', - severity: 'error', - text: 'Unexpected empty block (block-no-empty)', - }); - }); -}); - -it('standalone with `reportNeedlessDisables` and correctly `stylelint-disable`', () => { - const config = { - quiet: true, - rules: { - 'color-named': 'never', - }, - }; - - return standalone({ - code: '/* stylelint-disable color-named */\na { color: black; }', - config, - reportNeedlessDisables: true, - }).then((linted) => { - const needlessDisables = linted.needlessDisables; - - expect(typeof needlessDisables).toBe('object'); - expect(needlessDisables).toHaveLength(1); - expect(needlessDisables[0].ranges).toHaveLength(0); - - expect(linted.results).toHaveLength(1); - const warnings = linted.results[0].warnings; - - expect(typeof warnings).toBe('object'); - expect(warnings).toHaveLength(0); - }); -}); - -it('standalone with `reportNeedlessDisables` and `ignoreDisables`', () => { - const config = { - quiet: true, - rules: { - 'color-named': 'never', - }, - }; - - return standalone({ - code: '/* stylelint-disable color-named */\na { color: black; }', - config, - reportNeedlessDisables: true, - ignoreDisables: true, - }).then((linted) => { - const needlessDisables = linted.needlessDisables; - - expect(typeof needlessDisables).toBe('object'); - expect(needlessDisables).toHaveLength(1); - expect(needlessDisables[0].ranges).toHaveLength(0); - - expect(linted.results).toHaveLength(1); - const warnings = linted.results[0].warnings; - - expect(typeof warnings).toBe('object'); - expect(warnings).toHaveLength(1); - expect(warnings[0]).toEqual({ - line: 2, - column: 12, - rule: 'color-named', - severity: 'error', - text: 'Unexpected named color "black" (color-named)', - }); - }); -}); - -it('standalone with input file(s) and `reportNeedlessDisables`', () => { - const config = { - quiet: true, - rules: { - 'block-no-empty': true, - 'color-named': 'never', - }, - }; - - return standalone({ - files: replaceBackslashes(path.join(fixturesPath, 'empty-block-with-disables.css')), - config, - reportNeedlessDisables: true, - }).then((linted) => { - const needlessDisables = linted.needlessDisables; - - expect(typeof needlessDisables).toBe('object'); - expect(needlessDisables).toHaveLength(1); - expect(needlessDisables[0].source).toBe( - path.join(fixturesPath, 'empty-block-with-disables.css'), - ); - expect(needlessDisables[0].ranges[0]).toEqual({ - start: 1, - rule: 'color-named', - unusedRule: 'color-named', - }); - }); -}); diff --git a/lib/__tests__/standalone.test.js b/lib/__tests__/standalone.test.js index 523ff0b928..d5fca2a58b 100644 --- a/lib/__tests__/standalone.test.js +++ b/lib/__tests__/standalone.test.js @@ -31,40 +31,46 @@ describe('standalone with one input file', () => { }); }); -describe('standalone with two file-specific globs', () => { - const twoCsses = [`${fixturesPath}/e*y-block.*`, `${fixturesPath}/invalid-h*.css`]; - - let output; - let results; - - beforeEach(() => { - return standalone({ - files: twoCsses, - config: { - rules: { 'block-no-empty': true, 'color-no-invalid-hex': true }, - }, - }).then((data) => { - output = data.output; - results = data.results; - }); - }); - - it('triggers warnings', () => { - expect(output).toContain('block-no-empty'); - expect(output).toContain('color-no-invalid-hex'); - expect(results).toHaveLength(2); - expect(results[0].warnings).toHaveLength(1); - expect(results[1].warnings).toHaveLength(1); - - // Ordering of the files is non-deterministic, I believe - if (results[0].source.includes('empty-block')) { - expect(results[0].warnings[0].rule).toBe('block-no-empty'); - expect(results[1].warnings[0].rule).toBe('color-no-invalid-hex'); - } else { - expect(results[1].warnings[0].rule).toBe('block-no-empty'); - expect(results[0].warnings[0].rule).toBe('color-no-invalid-hex'); - } - }); +it('standalone with two file-specific globs', async () => { + const { output, results } = await standalone({ + files: [`${fixturesPath}/e*y-block.*`, `${fixturesPath}/invalid-h*.css`], + config: { + rules: { 'block-no-empty': true, 'color-no-invalid-hex': true }, + }, + }); + + expect(output).toContain('block-no-empty'); + expect(output).toContain('color-no-invalid-hex'); + expect(results).toHaveLength(2); + expect(results[0].warnings).toHaveLength(1); + expect(results[1].warnings).toHaveLength(1); + + /** + * Expecting warnings for these two rules, and order of warnings is not important, + * because files could be linted in any order + * [ + * { warnings: [{ rule: 'block-no-empty' }] }, + * { warnings: [{ rule: 'color-no-invalid-hex' }] }, + * ] + */ + expect(results).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + warnings: expect.arrayContaining([ + expect.objectContaining({ + rule: 'block-no-empty', + }), + ]), + }), + expect.objectContaining({ + warnings: expect.arrayContaining([ + expect.objectContaining({ + rule: 'color-no-invalid-hex', + }), + ]), + }), + ]), + ); }); describe('standalone with files and globbyOptions', () => { diff --git a/lib/assignDisabledRanges.js b/lib/assignDisabledRanges.js index d57043e059..71f81af761 100644 --- a/lib/assignDisabledRanges.js +++ b/lib/assignDisabledRanges.js @@ -16,6 +16,7 @@ const ALL_RULES = 'all'; /** @typedef {import('stylelint').DisabledRange} DisabledRange */ /** + * @param {PostcssComment} comment * @param {number} start * @param {boolean} strictStart * @param {string|undefined} description @@ -23,8 +24,9 @@ const ALL_RULES = 'all'; * @param {boolean} [strictEnd] * @returns {DisabledRange} */ -function createDisableRange(start, strictStart, description, end, strictEnd) { +function createDisableRange(comment, start, strictStart, description, end, strictEnd) { return { + comment, start, end: end || undefined, strictStart, @@ -66,35 +68,55 @@ module.exports = function (root, result) { if (inlineEnd) { // Ignore comments already processed by grouping with a previous one. if (inlineEnd === comment) inlineEnd = null; - } else if (isInlineComment(comment)) { - const fullComment = comment.clone(); - let next = comment.next(); - let lastLine = (comment.source && comment.source.end && comment.source.end.line) || 0; - while (next && next.type === 'comment') { - /** @type {PostcssComment} */ - const current = next; + return; + } - if (!isInlineComment(current)) break; + const next = comment.next(); + + // If any of these conditions are not met, do not merge comments. + if ( + !( + isInlineComment(comment) && + isStylelintCommand(comment) && + next && + next.type === 'comment' && + (comment.text.includes('--') || next.text.startsWith('--')) + ) + ) { + checkComment(comment); - const currentLine = (current.source && current.source.end && current.source.end.line) || 0; + return; + } - if (lastLine + 1 !== currentLine) break; + let lastLine = (comment.source && comment.source.end && comment.source.end.line) || 0; + const fullComment = comment.clone(); - fullComment.text += `\n${current.text}`; + /** @type {PostcssComment} */ + let current = next; - if (fullComment.source && current.source) { - fullComment.source.end = current.source.end; - } + while (isInlineComment(current) && !isStylelintCommand(current)) { + const currentLine = (current.source && current.source.end && current.source.end.line) || 0; - inlineEnd = current; - next = current.next(); - lastLine = currentLine; + if (lastLine + 1 !== currentLine) break; + + fullComment.text += `\n${current.text}`; + + if (fullComment.source && current.source) { + fullComment.source.end = current.source.end; } - checkComment(fullComment); - } else { - checkComment(comment); + + inlineEnd = current; + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow + const next = current.next(); + + if (!next || next.type !== 'comment') break; + + current = next; + lastLine = currentLine; } + checkComment(fullComment); }); return result; @@ -108,6 +130,13 @@ module.exports = function (root, result) { return comment.inline || comment.raws.inline; } + /** + * @param {PostcssComment} comment + */ + function isStylelintCommand(comment) { + return comment.text.startsWith(disableCommand) || comment.text.startsWith(enableCommand); + } + /** * @param {PostcssComment} comment */ @@ -117,7 +146,7 @@ module.exports = function (root, result) { const description = getDescription(comment.text); getCommandRules(disableLineCommand, comment.text).forEach((ruleName) => { - disableLine(line, ruleName, comment, description); + disableLine(comment, line, ruleName, description); }); } } @@ -131,18 +160,18 @@ module.exports = function (root, result) { const description = getDescription(comment.text); getCommandRules(disableNextLineCommand, comment.text).forEach((ruleName) => { - disableLine(line + 1, ruleName, comment, description); + disableLine(comment, line + 1, ruleName, description); }); } } /** + * @param {PostcssComment} comment * @param {number} line * @param {string} ruleName - * @param {PostcssComment} comment * @param {string|undefined} description */ - function disableLine(line, ruleName, comment, description) { + function disableLine(comment, line, ruleName, description) { if (ruleIsDisabled(ALL_RULES)) { throw comment.error('All rules have already been disabled', { plugin: 'stylelint', @@ -155,7 +184,7 @@ module.exports = function (root, result) { const strict = disabledRuleName === ALL_RULES; - startDisabledRange(line, disabledRuleName, strict, description); + startDisabledRange(comment, line, disabledRuleName, strict, description); endDisabledRange(line, disabledRuleName, strict); }); } else { @@ -165,7 +194,7 @@ module.exports = function (root, result) { }); } - startDisabledRange(line, ruleName, true, description); + startDisabledRange(comment, line, ruleName, true, description); endDisabledRange(line, ruleName, true); } } @@ -195,10 +224,10 @@ module.exports = function (root, result) { if (isAllRules) { Object.keys(disabledRanges).forEach((ruleName) => { - startDisabledRange(line, ruleName, ruleName === ALL_RULES, description); + startDisabledRange(comment, line, ruleName, ruleName === ALL_RULES, description); }); } else { - startDisabledRange(line, ruleToDisable, true, description); + startDisabledRange(comment, line, ruleToDisable, true, description); } } }); @@ -239,7 +268,7 @@ module.exports = function (root, result) { // Get a starting point from the where all rules were disabled if (!disabledRanges[ruleToEnable]) { disabledRanges[ruleToEnable] = disabledRanges.all.map(({ start, end, description }) => - createDisableRange(start, false, description, end, false), + createDisableRange(comment, start, false, description, end, false), ); } else { const range = _.last(disabledRanges[ALL_RULES]); @@ -323,13 +352,14 @@ module.exports = function (root, result) { } /** + * @param {PostcssComment} comment * @param {number} line * @param {string} ruleName * @param {boolean} strict * @param {string|undefined} description */ - function startDisabledRange(line, ruleName, strict, description) { - const rangeObj = createDisableRange(line, strict, description); + function startDisabledRange(comment, line, ruleName, strict, description) { + const rangeObj = createDisableRange(comment, line, strict, description); ensureRuleRanges(ruleName); disabledRanges[ruleName].push(rangeObj); @@ -357,8 +387,8 @@ module.exports = function (root, result) { */ function ensureRuleRanges(ruleName) { if (!disabledRanges[ruleName]) { - disabledRanges[ruleName] = disabledRanges.all.map(({ start, end, description }) => - createDisableRange(start, false, description, end, false), + disabledRanges[ruleName] = disabledRanges.all.map(({ comment, start, end, description }) => + createDisableRange(comment, start, false, description, end, false), ); } } diff --git a/lib/cli.js b/lib/cli.js index 80189a7759..dc87a9f53e 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -505,6 +505,8 @@ module.exports = (argv) => { if (report) reports.push(report); if (reportNeedlessDisables) { + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow const report = disableOptionsReportStringFormatter( linted.needlessDisables || [], 'needless disable', @@ -516,6 +518,8 @@ module.exports = (argv) => { } if (reportInvalidScopeDisables) { + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow const report = disableOptionsReportStringFormatter( linted.invalidScopeDisables || [], 'disable with invalid scope', @@ -527,6 +531,8 @@ module.exports = (argv) => { } if (reportDescriptionlessDisables) { + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow const report = disableOptionsReportStringFormatter( linted.descriptionlessDisables || [], 'descriptionless disable', @@ -538,6 +544,8 @@ module.exports = (argv) => { } if (reports.length > 0) { + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow reports.forEach((report) => process.stdout.write(report)); process.exitCode = EXIT_CODE_ERROR; } diff --git a/lib/descriptionlessDisables.js b/lib/descriptionlessDisables.js index 6bfb634cce..545722d7b1 100644 --- a/lib/descriptionlessDisables.js +++ b/lib/descriptionlessDisables.js @@ -1,17 +1,14 @@ 'use strict'; +/** @typedef {import('postcss/lib/comment')} PostcssComment */ /** @typedef {import('stylelint').RangeType} RangeType */ /** @typedef {import('stylelint').DisableReportRange} DisableReportRange */ /** @typedef {import('stylelint').StylelintDisableOptionsReport} StylelintDisableOptionsReport */ /** * @param {import('stylelint').StylelintResult[]} results - * @returns {StylelintDisableOptionsReport} */ module.exports = function (results) { - /** @type {StylelintDisableOptionsReport} */ - const report = []; - results.forEach((result) => { // File with `CssSyntaxError` have not `_postcssResult` if (!result._postcssResult) { @@ -20,33 +17,29 @@ module.exports = function (results) { const rangeData = result._postcssResult.stylelint.disabledRanges; - /** @type {import('stylelint').StylelintDisableReportEntry} */ - const entry = { source: result.source, ranges: [] }; + /** @type {Set} */ + const alreadyReported = new Set(); Object.keys(rangeData).forEach((rule) => { rangeData[rule].forEach((range) => { if (range.description) return; - // Avoid duplicates from stylelint-disable comments with multiple rules. - const alreadyReported = entry.ranges.find((existing) => { - return existing.start === range.start && existing.end === range.end; - }); + if (alreadyReported.has(range.comment)) return; + + alreadyReported.add(range.comment); - if (alreadyReported) return; + // If the comment doesn't have a location, we can't report a useful error. + // In practice we expect all comments to have locations, though. + if (!range.comment.source || !range.comment.source.start) return; - entry.ranges.push({ - rule, - start: range.start, - end: range.end, - unusedRule: rule, + result.warnings.push({ + text: `Disable for "${rule}" is missing a description`, + rule: '--report-descriptionless-disables', + line: range.comment.source.start.line, + column: range.comment.source.start.column, + severity: 'error', }); }); }); - - if (entry.ranges.length > 0) { - report.push(entry); - } }); - - return report; }; diff --git a/lib/formatters/__tests__/compactFormatter.test.js b/lib/formatters/__tests__/compactFormatter.test.js index e99cc9d80b..e8bb1521b8 100644 --- a/lib/formatters/__tests__/compactFormatter.test.js +++ b/lib/formatters/__tests__/compactFormatter.test.js @@ -2,7 +2,6 @@ const compactFormatter = require('../compactFormatter'); const prepareFormatterOutput = require('./prepareFormatterOutput'); -const stripIndent = require('common-tags').stripIndent; describe('compactFormatter', () => { let actualTTY; @@ -55,9 +54,7 @@ describe('compactFormatter', () => { const output = prepareFormatterOutput(results, compactFormatter); - expect(output).toBe(stripIndent` - path/to/file.css: line 1, col 1, error - Unexpected foo - `); + expect(output).toBe('path/to/file.css: line 1, col 1, error - Unexpected foo'); }); it('outputs warnings without stdout `TTY`', () => { @@ -83,9 +80,7 @@ describe('compactFormatter', () => { const output = prepareFormatterOutput(results, compactFormatter); - expect(output).toBe(stripIndent` - path/to/file.css: line 1, col 1, error - Unexpected foo - `); + expect(output).toBe('path/to/file.css: line 1, col 1, error - Unexpected foo'); }); it('output warnings with more than 80 characters and `process.stdout.columns` equal 90 characters', () => { @@ -114,9 +109,9 @@ describe('compactFormatter', () => { const output = prepareFormatterOutput(results, compactFormatter); - expect(output).toBe(stripIndent` - path/to/file.css: line 1, col 1, error - Unexpected very very very very very very very very very very very very very long foo - `); + expect(output).toBe( + 'path/to/file.css: line 1, col 1, error - Unexpected very very very very very very very very very very very very very long foo', + ); }); it('handles ignored file', () => { diff --git a/lib/formatters/__tests__/disableOptionsReportStringFormatter.test.js b/lib/formatters/__tests__/disableOptionsReportStringFormatter.test.js index 28f336e465..a55249e46c 100644 --- a/lib/formatters/__tests__/disableOptionsReportStringFormatter.test.js +++ b/lib/formatters/__tests__/disableOptionsReportStringFormatter.test.js @@ -2,7 +2,6 @@ const disableOptionsReportStringFormatterTest = require('../disableOptionsReportStringFormatter'); const stripAnsi = require('strip-ansi'); -const stripIndent = require('common-tags').stripIndent; describe('disableOptionsReportStringFormatter', () => { it('formatter stringified', () => { @@ -32,16 +31,15 @@ describe('disableOptionsReportStringFormatter', () => { ), ); - let expected = stripIndent` - foo - wrong disable: baz, start line: 1, end line: 3 - wrong disable: all, start line: 7 + const expected = ` +foo +wrong disable: baz, start line: 1, end line: 3 +wrong disable: all, start line: 7 - bar - wrong disable: all, start line: 19, end line: 33 - wrong disable: baz, start line: 99, end line: 102`; - - expected = `\n${expected}\n`; +bar +wrong disable: all, start line: 19, end line: 33 +wrong disable: baz, start line: 99, end line: 102 +`; expect(actual).toBe(expected); }); diff --git a/lib/formatters/__tests__/stringFormatter.test.js b/lib/formatters/__tests__/stringFormatter.test.js index dc28fa89f0..393b43ea19 100644 --- a/lib/formatters/__tests__/stringFormatter.test.js +++ b/lib/formatters/__tests__/stringFormatter.test.js @@ -2,7 +2,6 @@ const prepareFormatterOutput = require('./prepareFormatterOutput'); const stringFormatter = require('../stringFormatter'); -const stripIndent = require('common-tags').stripIndent; describe('stringFormatter', () => { let actualTTY; @@ -55,10 +54,11 @@ describe('stringFormatter', () => { const output = prepareFormatterOutput(results, stringFormatter); - expect(output).toBe(stripIndent` - path/to/file.css - 1:1 × Unexpected foo bar - `); + expect(output).toBe( + ` +path/to/file.css + 1:1 × Unexpected foo bar`.trimStart(), + ); }); it('outputs warnings without stdout `TTY`', () => { @@ -84,9 +84,11 @@ describe('stringFormatter', () => { const output = prepareFormatterOutput(results, stringFormatter); - expect(output).toBe(stripIndent` - path/to/file.css - 1:1 × Unexpected foo bar`); + expect(output).toBe( + ` +path/to/file.css + 1:1 × Unexpected foo bar`.trimStart(), + ); }); it('output warnings with more than 80 characters and `process.stdout.columns` equal 90 characters', () => { @@ -115,11 +117,12 @@ describe('stringFormatter', () => { const output = prepareFormatterOutput(results, stringFormatter); - expect(output).toBe(stripIndent` - path/to/file.css - 1:1 × Unexpected very very very very very very very bar-very-very-very-very-very-long - very very very very very very long foo - `); + expect(output).toBe( + ` +path/to/file.css + 1:1 × Unexpected very very very very very very very bar-very-very-very-very-very-long + very very very very very very long foo`.trimStart(), + ); }); it('condenses deprecations and invalid option warnings', () => { @@ -160,11 +163,12 @@ describe('stringFormatter', () => { const output = prepareFormatterOutput(results, stringFormatter); - expect(output).toBe(stripIndent` - Invalid Option: Unexpected option for baz + expect(output).toBe( + ` +Invalid Option: Unexpected option for baz - Deprecation Warning: Deprecated foo See: bar - `); +Deprecation Warning: Deprecated foo See: bar`.trimStart(), + ); }); it('handles ignored file', () => { @@ -204,8 +208,10 @@ describe('stringFormatter', () => { const output = prepareFormatterOutput(results, stringFormatter); - expect(output).toBe(stripIndent` - path/to/file.css - 1:1 × bar`); + expect(output).toBe( + ` +path/to/file.css + 1:1 × bar`.trimStart(), + ); }); }); diff --git a/lib/formatters/__tests__/unixFormatter.test.js b/lib/formatters/__tests__/unixFormatter.test.js index b07156a1e7..92e0ae3a1f 100644 --- a/lib/formatters/__tests__/unixFormatter.test.js +++ b/lib/formatters/__tests__/unixFormatter.test.js @@ -1,7 +1,6 @@ 'use strict'; const prepareFormatterOutput = require('./prepareFormatterOutput'); -const stripIndent = require('common-tags').stripIndent; const unixFormatter = require('../unixFormatter'); describe('unixFormatter', () => { @@ -62,12 +61,13 @@ describe('unixFormatter', () => { const output = prepareFormatterOutput(results, unixFormatter); - expect(output).toBe(stripIndent` - path/to/file.css:1:1: Unexpected foo [error] - path/to/file.css:10:1: Unexpected foo 2 [error] + expect(output).toBe( + ` +path/to/file.css:1:1: Unexpected foo [error] +path/to/file.css:10:1: Unexpected foo 2 [error] - 2 problems - `); +2 problems`.trimStart(), + ); }); it('outputs warnings without stdout `TTY`', () => { @@ -93,11 +93,12 @@ describe('unixFormatter', () => { const output = prepareFormatterOutput(results, unixFormatter); - expect(output).toBe(stripIndent` - path/to/file.css:1:1: Unexpected foo [error] + expect(output).toBe( + ` +path/to/file.css:1:1: Unexpected foo [error] - 1 problem - `); +1 problem`.trimStart(), + ); }); it('output warnings with more than 80 characters and `process.stdout.columns` equal 90 characters', () => { @@ -126,11 +127,12 @@ describe('unixFormatter', () => { const output = prepareFormatterOutput(results, unixFormatter); - expect(output).toBe(stripIndent` - path/to/file.css:1:1: Unexpected very very very very very very very very very very very very very long foo [error] + expect(output).toBe( + ` +path/to/file.css:1:1: Unexpected very very very very very very very very very very very very very long foo [error] - 1 problem - `); +1 problem`.trimStart(), + ); }); it('handles ignored file', () => { diff --git a/lib/formatters/__tests__/verboseFormatter.test.js b/lib/formatters/__tests__/verboseFormatter.test.js index 6a98b8c4b8..4d021cd032 100644 --- a/lib/formatters/__tests__/verboseFormatter.test.js +++ b/lib/formatters/__tests__/verboseFormatter.test.js @@ -1,7 +1,6 @@ 'use strict'; const prepareFormatterOutput = require('./prepareFormatterOutput'); -const stripIndent = require('common-tags').stripIndent; const verboseFormatter = require('../verboseFormatter'); describe('verboseFormatter', () => { @@ -18,12 +17,13 @@ describe('verboseFormatter', () => { const output = prepareFormatterOutput(results, verboseFormatter); - expect(output).toBe(stripIndent` - 1 source checked - path/to/file.css + expect(output).toBe( + ` +1 source checked + path/to/file.css - 0 problems found - `); +0 problems found`.trimStart(), + ); }); it("outputs one warnings (of severity 'error')", () => { @@ -47,17 +47,18 @@ describe('verboseFormatter', () => { const output = prepareFormatterOutput(results, verboseFormatter); - expect(output).toBe(stripIndent` - path/to/file.css - 1:2 × Unexpected foo bar + expect(output).toBe( + ` +path/to/file.css + 1:2 × Unexpected foo bar - 1 source checked - path/to/file.css +1 source checked + path/to/file.css - 1 problem found - severity level "error": 1 - bar: 1 - `); +1 problem found + severity level "error": 1 + bar: 1`.trimStart(), + ); }); it('outputs 0 stdout column', () => { @@ -85,17 +86,18 @@ describe('verboseFormatter', () => { const output = prepareFormatterOutput(results, verboseFormatter); - expect(output).toBe(stripIndent` - path/to/file.css - 1:2 × Unexpected foo bar + expect(output).toBe( + ` +path/to/file.css + 1:2 × Unexpected foo bar - 1 source checked - path/to/file.css +1 source checked + path/to/file.css - 1 problem found - severity level "error": 1 - bar: 1 - `); +1 problem found + severity level "error": 1 + bar: 1`.trimStart(), + ); process.stdout.columns = stdoutColumn; }); @@ -125,17 +127,18 @@ describe('verboseFormatter', () => { const output = prepareFormatterOutput(results, verboseFormatter); - expect(output).toBe(stripIndent` - path/to/file.css - 1:2 × Unexpected foo bar + expect(output).toBe( + ` +path/to/file.css + 1:2 × Unexpected foo bar - 1 source checked - path/to/file.css +1 source checked + path/to/file.css - 1 problem found - severity level "error": 1 - bar: 1 - `); +1 problem found + severity level "error": 1 + bar: 1`.trimStart(), + ); process.stdout.columns = stdoutColumn; }); @@ -183,24 +186,25 @@ describe('verboseFormatter', () => { const output = prepareFormatterOutput(results, verboseFormatter); - expect(output).toBe(stripIndent` - path/to/file.css - 1:2 × Unexpected foo bar - 2:3 × Unexpected foo bar - - file2.css - 3:1 ‼ Expected cat baz - - 2 sources checked - path/to/file.css - file2.css - - 3 problems found - severity level "error": 2 - bar: 2 - severity level "warning": 1 - baz: 1 - `); + expect(output).toBe( + ` +path/to/file.css + 1:2 × Unexpected foo bar + 2:3 × Unexpected foo bar + +file2.css + 3:1 ‼ Expected cat baz + +2 sources checked + path/to/file.css + file2.css + +3 problems found + severity level "error": 2 + bar: 2 + severity level "warning": 1 + baz: 1`.trimStart(), + ); }); it('outputs lineless syntax error', () => { @@ -222,17 +226,18 @@ describe('verboseFormatter', () => { const output = prepareFormatterOutput(results, verboseFormatter); - expect(output).toBe(stripIndent` - path/to/file.css - × Unexpected foo SyntaxError + expect(output).toBe( + ` +path/to/file.css + × Unexpected foo SyntaxError - 1 source checked - path/to/file.css +1 source checked + path/to/file.css - 1 problem found - severity level "error": 1 - SyntaxError: 1 - `); +1 problem found + severity level "error": 1 + SyntaxError: 1`.trimStart(), + ); }); it('outputs one ignored file', () => { @@ -248,11 +253,12 @@ describe('verboseFormatter', () => { const output = prepareFormatterOutput(results, verboseFormatter); - expect(output).toBe(stripIndent` - 0 of 1 source checked - file.css (ignored) + expect(output).toBe( + ` +0 of 1 source checked + file.css (ignored) - 0 problems found - `); +0 problems found`.trimStart(), + ); }); }); diff --git a/lib/formatters/stringFormatter.js b/lib/formatters/stringFormatter.js index 5896827be8..0ae0cdbd48 100644 --- a/lib/formatters/stringFormatter.js +++ b/lib/formatters/stringFormatter.js @@ -195,6 +195,8 @@ module.exports = function (results) { output += deprecationsFormatter(results); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow output = results.reduce((output, result) => { // Treat parseErrors as warnings if (result.parseErrors) { diff --git a/lib/invalidScopeDisables.js b/lib/invalidScopeDisables.js index 1249284cb0..401e2fd42f 100644 --- a/lib/invalidScopeDisables.js +++ b/lib/invalidScopeDisables.js @@ -1,16 +1,11 @@ 'use strict'; /** @typedef {import('stylelint').RangeType} RangeType */ -/** @typedef {import('stylelint').StylelintDisableOptionsReport} StylelintDisableOptionsReport */ /** * @param {import('stylelint').StylelintResult[]} results - * @returns {StylelintDisableOptionsReport} */ module.exports = function (results) { - /** @type {StylelintDisableOptionsReport} */ - const report = []; - results.forEach((result) => { // File with `CssSyntaxError` have not `_postcssResult` if (!result._postcssResult) { @@ -28,8 +23,6 @@ module.exports = function (results) { usedRules.add('all'); - /** @type {import('stylelint').StylelintDisableReportEntry} */ - const sourceReport = { source: result.source, ranges: [] }; const rangeData = result._postcssResult.stylelint.disabledRanges; const disabledRules = Object.keys(rangeData); @@ -43,19 +36,18 @@ module.exports = function (results) { return; } - sourceReport.ranges.push({ - rule, - start: range.start, - end: range.end, - unusedRule: rule, + // If the comment doesn't have a location, we can't report a useful error. + // In practice we expect all comments to have locations, though. + if (!range.comment.source || !range.comment.source.start) return; + + result.warnings.push({ + text: `Rule "${rule}" isn't enabled`, + rule: '--report-invalid-scope-disables', + line: range.comment.source.start.line, + column: range.comment.source.start.column, + severity: 'error', }); }); }); - - if (sourceReport.ranges.length > 0) { - report.push(sourceReport); - } }); - - return report; }; diff --git a/lib/needlessDisables.js b/lib/needlessDisables.js index 70eae0f92a..62c7815d15 100644 --- a/lib/needlessDisables.js +++ b/lib/needlessDisables.js @@ -1,29 +1,24 @@ 'use strict'; const _ = require('lodash'); +const putIfAbsent = require('./utils/putIfAbsent'); +/** @typedef {import('postcss/lib/comment')} PostcssComment */ +/** @typedef {import('stylelint').DisabledRange} DisabledRange */ /** @typedef {import('stylelint').RangeType} RangeType */ /** @typedef {import('stylelint').DisableReportRange} DisableReportRange */ -/** @typedef {import('stylelint').StylelintDisableOptionsReport} StylelintDisableOptionsReport */ /** * @param {import('stylelint').StylelintResult[]} results - * @returns {StylelintDisableOptionsReport} */ module.exports = function (results) { - /** @type {StylelintDisableOptionsReport} */ - const report = []; - results.forEach((result) => { // File with `CssSyntaxError` have not `_postcssResult` if (!result._postcssResult) { return; } - /** @type {{ranges: DisableReportRange[], source: string}} */ - const unused = { source: result.source || '', ranges: [] }; - - /** @type {{[ruleName: string]: Array}} */ + /** @type {{[ruleName: string]: Array}} */ const rangeData = _.cloneDeep(result._postcssResult.stylelint.disabledRanges); if (!rangeData) { @@ -32,64 +27,68 @@ module.exports = function (results) { const disabledWarnings = result._postcssResult.stylelint.disabledWarnings || []; - disabledWarnings.forEach((warning) => { - const rule = warning.rule; + // A map from `stylelint-disable` comments to the set of rules that + // are usefully disabled by each comment. We track this + // comment-by-comment rather than range-by-range because ranges that + // disable *all* rules are duplicated for each rule they apply to in + // practice. + /** @type {Map>}} */ + const usefulDisables = new Map(); + for (const warning of disabledWarnings) { + const rule = warning.rule; const ruleRanges = rangeData[rule]; if (ruleRanges) { - // Back to front so we get the *last* range that applies to the warning - for (const range of ruleRanges.reverse()) { + for (const range of ruleRanges) { if (isWarningInRange(warning, range)) { - range.used = true; - - return; + putIfAbsent(usefulDisables, range.comment, () => new Set()).add(rule); } } } - for (const range of rangeData.all.reverse()) { + for (const range of rangeData.all) { if (isWarningInRange(warning, range)) { - range.used = true; - - return; + putIfAbsent(usefulDisables, range.comment, () => new Set()).add(rule); } } - }); + } - Object.keys(rangeData).forEach((rule) => { - rangeData[rule].forEach((range) => { - // Is an equivalent range already marked as unused? - const alreadyMarkedUnused = unused.ranges.find((unusedRange) => { - return unusedRange.start === range.start && unusedRange.end === range.end; - }); + const rangeEntries = Object.entries(rangeData); - // If this range is unused and no equivalent is marked, - // mark this range as unused - if (!range.used && !alreadyMarkedUnused) { - unused.ranges.push({ - rule, - start: range.start, - end: range.end, - unusedRule: rule, - }); - } + // Get rid of the duplicated ranges for each `all` rule. We only care + // if the entire `all` rule is useful as a whole or not. + for (const range of rangeData.all) { + for (const [rule, ranges] of rangeEntries) { + if (rule === 'all') continue; - // If this range is used but an equivalent has been marked as unused, - // remove that equivalent. This can happen because of the duplication - // of ranges in rule-specific range sets and the "all" range set - if (range.used && alreadyMarkedUnused) { - _.remove(unused.ranges, alreadyMarkedUnused); - } - }); - }); - - unused.ranges = _.sortBy(unused.ranges, ['start', 'end']); + _.remove(ranges, (otherRange) => range.comment === otherRange.comment); + } + } - report.push(unused); + for (const [rule, ranges] of rangeEntries) { + for (const range of ranges) { + const useful = usefulDisables.get(range.comment) || new Set(); + + // Only emit a warning if this range's comment isn't useful for this rule. + // For the special rule "all", only emit a warning if it's not useful for + // *any* // rules, becuase it covers all of them. + if (rule === 'all' ? useful.size !== 0 : useful.has(rule)) continue; + + // If the comment doesn't have a location, we can't report a useful error. + // In practice we expect all comments to have locations, though. + if (!range.comment.source || !range.comment.source.start) continue; + + result.warnings.push({ + text: `Needless disable for "${rule}"`, + rule: '--report-needless-disables', + line: range.comment.source.start.line, + column: range.comment.source.start.column, + severity: 'error', + }); + } + } }); - - return report; }; /** diff --git a/lib/prepareReturnValue.js b/lib/prepareReturnValue.js index 9319433cb2..a533f5dd7f 100644 --- a/lib/prepareReturnValue.js +++ b/lib/prepareReturnValue.js @@ -25,6 +25,14 @@ function prepareReturnValue(stylelintResults, options, formatter) { maxWarnings, } = options; + reportDisables(stylelintResults); + + if (reportNeedlessDisables) needlessDisables(stylelintResults); + + if (reportInvalidScopeDisables) invalidScopeDisables(stylelintResults); + + if (reportDescriptionlessDisables) descriptionlessDisables(stylelintResults); + const errored = stylelintResults.some( (result) => result.errored || result.parseErrors.length > 0, ); @@ -34,21 +42,9 @@ function prepareReturnValue(stylelintResults, options, formatter) { errored, results: [], output: '', - reportedDisables: reportDisables(stylelintResults), + reportedDisables: [], }; - if (reportNeedlessDisables) { - returnValue.needlessDisables = needlessDisables(stylelintResults); - } - - if (reportInvalidScopeDisables) { - returnValue.invalidScopeDisables = invalidScopeDisables(stylelintResults); - } - - if (reportDescriptionlessDisables) { - returnValue.descriptionlessDisables = descriptionlessDisables(stylelintResults); - } - if (maxWarnings !== undefined) { const foundWarnings = stylelintResults.reduce((count, file) => { return count + file.warnings.length; diff --git a/lib/reportDisables.js b/lib/reportDisables.js index a528fe7640..36ac5a109a 100644 --- a/lib/reportDisables.js +++ b/lib/reportDisables.js @@ -4,28 +4,20 @@ const _ = require('lodash'); /** @typedef {import('stylelint').RangeType} RangeType */ /** @typedef {import('stylelint').DisableReportRange} DisabledRange */ -/** @typedef {import('stylelint').StylelintDisableOptionsReport} StylelintDisableOptionsReport */ /** * Returns a report describing which `results` (if any) contain disabled ranges * for rules that disallow disables via `reportDisables: true`. * * @param {import('stylelint').StylelintResult[]} results - * @returns {StylelintDisableOptionsReport} */ module.exports = function (results) { - /** @type {StylelintDisableOptionsReport} */ - const report = []; - results.forEach((result) => { // File with `CssSyntaxError` don't have `_postcssResult`s. if (!result._postcssResult) { return; } - /** @type {{ranges: DisabledRange[], source: string}} */ - const reported = { source: result.source || '', ranges: [] }; - /** @type {{[ruleName: string]: Array}} */ const rangeData = result._postcssResult.stylelint.disabledRanges; @@ -43,21 +35,20 @@ module.exports = function (results) { rangeData[rule].forEach((range) => { if (!reportDisablesForRule(_.get(config, ['rules', rule], []))) return; - reported.ranges.push({ - rule, - start: range.start, - end: range.end, - unusedRule: rule, + // If the comment doesn't have a location, we can't report a useful error. + // In practice we expect all comments to have locations, though. + if (!range.comment.source || !range.comment.source.start) return; + + result.warnings.push({ + text: `Rule "${rule}" may not be disabled`, + rule: 'reportDisables', + line: range.comment.source.start.line, + column: range.comment.source.start.column, + severity: 'error', }); }); }); - - reported.ranges = _.sortBy(reported.ranges, ['start', 'end']); - - report.push(reported); }); - - return report; }; /** diff --git a/lib/rules/at-rule-allowed-list/index.js b/lib/rules/at-rule-allowed-list/index.js index 65f950d34c..6f0ec3a717 100644 --- a/lib/rules/at-rule-allowed-list/index.js +++ b/lib/rules/at-rule-allowed-list/index.js @@ -4,10 +4,10 @@ const _ = require('lodash'); const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'at-rule-allowed-list'; @@ -36,7 +36,7 @@ function rule(listInput) { return; } - if (list.includes(postcss.vendor.unprefixed(name).toLowerCase())) { + if (list.includes(vendor.unprefixed(name).toLowerCase())) { return; } diff --git a/lib/rules/at-rule-blacklist/__tests__/index.js b/lib/rules/at-rule-blacklist/__tests__/index.js index b7a1af7846..d0900a78a7 100644 --- a/lib/rules/at-rule-blacklist/__tests__/index.js +++ b/lib/rules/at-rule-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/at-rule-blacklist/index.js b/lib/rules/at-rule-blacklist/index.js index 3e056130e4..ee90505aeb 100644 --- a/lib/rules/at-rule-blacklist/index.js +++ b/lib/rules/at-rule-blacklist/index.js @@ -4,10 +4,10 @@ const _ = require('lodash'); const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'at-rule-blacklist'; @@ -41,7 +41,7 @@ function rule(listInput) { return; } - if (!list.includes(postcss.vendor.unprefixed(name).toLowerCase())) { + if (!list.includes(vendor.unprefixed(name).toLowerCase())) { return; } @@ -59,4 +59,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/at-rule-disallowed-list/index.js b/lib/rules/at-rule-disallowed-list/index.js index f593ecdb29..48da6ebecf 100644 --- a/lib/rules/at-rule-disallowed-list/index.js +++ b/lib/rules/at-rule-disallowed-list/index.js @@ -4,10 +4,10 @@ const _ = require('lodash'); const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'at-rule-disallowed-list'; @@ -36,7 +36,7 @@ function rule(listInput) { return; } - if (!list.includes(postcss.vendor.unprefixed(name).toLowerCase())) { + if (!list.includes(vendor.unprefixed(name).toLowerCase())) { return; } diff --git a/lib/rules/at-rule-no-unknown/index.js b/lib/rules/at-rule-no-unknown/index.js index 6abe49baf2..b0dee3d3b2 100644 --- a/lib/rules/at-rule-no-unknown/index.js +++ b/lib/rules/at-rule-no-unknown/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule'); const keywordSets = require('../../reference/keywordSets'); const optionsMatches = require('../../utils/optionsMatches'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'at-rule-no-unknown'; @@ -48,7 +48,7 @@ function rule(actual, options) { return; } - if (postcss.vendor.prefix(name) || keywordSets.atRules.has(name.toLowerCase())) { + if (vendor.prefix(name) || keywordSets.atRules.has(name.toLowerCase())) { return; } diff --git a/lib/rules/at-rule-property-requirelist/__tests__/index.js b/lib/rules/at-rule-property-requirelist/__tests__/index.js index 183e7643b4..751f3ce403 100644 --- a/lib/rules/at-rule-property-requirelist/__tests__/index.js +++ b/lib/rules/at-rule-property-requirelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: { diff --git a/lib/rules/at-rule-property-requirelist/index.js b/lib/rules/at-rule-property-requirelist/index.js index e979f78b41..fec1038679 100644 --- a/lib/rules/at-rule-property-requirelist/index.js +++ b/lib/rules/at-rule-property-requirelist/index.js @@ -69,5 +69,6 @@ function rule(list) { rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; module.exports = rule; diff --git a/lib/rules/at-rule-whitelist/__tests__/index.js b/lib/rules/at-rule-whitelist/__tests__/index.js index 74f79a3e8c..cf2ca77dea 100644 --- a/lib/rules/at-rule-whitelist/__tests__/index.js +++ b/lib/rules/at-rule-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/at-rule-whitelist/index.js b/lib/rules/at-rule-whitelist/index.js index 716ee578b7..afba56047c 100644 --- a/lib/rules/at-rule-whitelist/index.js +++ b/lib/rules/at-rule-whitelist/index.js @@ -4,10 +4,10 @@ const _ = require('lodash'); const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'at-rule-whitelist'; @@ -41,7 +41,7 @@ function rule(listInput) { return; } - if (list.includes(postcss.vendor.unprefixed(name).toLowerCase())) { + if (list.includes(vendor.unprefixed(name).toLowerCase())) { return; } @@ -59,4 +59,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/comment-pattern/README.md b/lib/rules/comment-pattern/README.md new file mode 100644 index 0000000000..b0a276e225 --- /dev/null +++ b/lib/rules/comment-pattern/README.md @@ -0,0 +1,38 @@ +# comment-pattern + +Specify a pattern for comments. + + +```css +/* comment */ +/** ↑ + * The pattern of this */ +``` + +## Options + +`regex|string` + +A string will be translated into a RegExp like so `new RegExp(yourString)` — so be sure to escape properly. + +Given the string: + +``` +"foo .+" +``` + +The following patterns are considered violations: + + +```css +/*not starting with foo*/ +a { color: red; } +``` + +The following patterns are _not_ considered violations: + + +```css +/*foo at the beginning*/ +a { color: red; } +``` diff --git a/lib/rules/comment-pattern/__tests__/index.js b/lib/rules/comment-pattern/__tests__/index.js new file mode 100644 index 0000000000..c3ff4fcd43 --- /dev/null +++ b/lib/rules/comment-pattern/__tests__/index.js @@ -0,0 +1,90 @@ +'use strict'; + +const { messages, ruleName } = require('..'); + +testRule({ + ruleName, + config: [/foo-.+/], + + accept: [ + { + code: '/* foo-valid yay */', + }, + { + code: `/* foo-- + multi-line + \n + \r + \r\n + \n\r + \t + */`, + }, + ], + + reject: [ + { + code: '/* not foo- */', + message: messages.expected(/foo-.+/), + }, + { + code: '/**/', + message: messages.expected(/foo-.+/), + }, + ], +}); + +testRule({ + ruleName, + config: ['foo-.+'], + + accept: [ + { + code: '/* foo-valid yay */', + }, + { + code: `/* foo-- + multi-line + \n + \r + \r\n + \n\r + \t + */`, + }, + ], + + reject: [ + { + code: '/* not foo- */', + message: messages.expected('foo-.+'), + }, + { + code: '/**/', + message: messages.expected('foo-.+'), + }, + ], +}); + +testRule({ + ruleName, + config: [/foo-.+/], + syntax: 'scss', + + accept: [ + { + code: 'a {} // foo-ok', + }, + { + code: '// foo-ok', + }, + ], + + reject: [ + { + code: 'a {} // not-foo', + description: 'checks inline scss comments', + message: messages.expected(/foo-.+/), + }, + ], +}); diff --git a/lib/rules/comment-pattern/index.js b/lib/rules/comment-pattern/index.js new file mode 100644 index 0000000000..c78aa4aa45 --- /dev/null +++ b/lib/rules/comment-pattern/index.js @@ -0,0 +1,48 @@ +// @ts-nocheck + +'use strict'; + +const _ = require('lodash'); +const report = require('../../utils/report'); +const ruleMessages = require('../../utils/ruleMessages'); +const validateOptions = require('../../utils/validateOptions'); + +const ruleName = 'comment-pattern'; + +const messages = ruleMessages(ruleName, { + expected: (pattern) => `Expected comment to match pattern "${pattern}"`, +}); + +function rule(pattern) { + return (root, result) => { + const validOptions = validateOptions(result, ruleName, { + actual: pattern, + possible: [_.isRegExp, _.isString], + }); + + if (!validOptions) { + return; + } + + const normalizedPattern = _.isString(pattern) ? new RegExp(pattern) : pattern; + + root.walkComments((comment) => { + const text = comment.text; + + if (normalizedPattern.test(text)) { + return; + } + + report({ + message: messages.expected(pattern), + node: comment, + result, + ruleName, + }); + }); + }; +} + +rule.ruleName = ruleName; +rule.messages = messages; +module.exports = rule; diff --git a/lib/rules/comment-whitespace-inside/index.js b/lib/rules/comment-whitespace-inside/index.js index 0ab89fede8..059540ed67 100755 --- a/lib/rules/comment-whitespace-inside/index.js +++ b/lib/rules/comment-whitespace-inside/index.js @@ -65,6 +65,8 @@ function rule(expectation, options, context) { complain(messages.expectedClosing, comment.toString().length - closer.length - 1); } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function addWhitespaceBefore(comment) { if (comment.text.startsWith('*')) { comment.text = comment.text.replace(/^(\*+)/, `$1 `); @@ -73,6 +75,8 @@ function rule(expectation, options, context) { } } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function addWhitespaceAfter(comment) { if (_.last(comment.text) === '*') { comment.text = comment.text.replace(/(\*+)$/, ` $1`); diff --git a/lib/rules/comment-word-blacklist/__tests__/index.js b/lib/rules/comment-word-blacklist/__tests__/index.js index 70a331716c..2e5a7288c1 100644 --- a/lib/rules/comment-word-blacklist/__tests__/index.js +++ b/lib/rules/comment-word-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: ['bad-word'], diff --git a/lib/rules/comment-word-blacklist/index.js b/lib/rules/comment-word-blacklist/index.js index b58df52d93..ba75f9611e 100644 --- a/lib/rules/comment-word-blacklist/index.js +++ b/lib/rules/comment-word-blacklist/index.js @@ -61,4 +61,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/custom-media-pattern/__tests__/index.js b/lib/rules/custom-media-pattern/__tests__/index.js index 1c05705af3..92ba6904ad 100644 --- a/lib/rules/custom-media-pattern/__tests__/index.js +++ b/lib/rules/custom-media-pattern/__tests__/index.js @@ -27,25 +27,25 @@ testRule({ reject: [ { code: '@custom-media --foa-bar (min-width: 0);', - message: messages.expected, + message: messages.expected(/foo-.+/), line: 1, column: 15, }, { code: '@cUsToM-mEdIa --foa-bar (min-width: 0);', - message: messages.expected, + message: messages.expected(/foo-.+/), line: 1, column: 15, }, { code: '@CUSTOM-MEDIA --foa-bar (min-width: 0);', - message: messages.expected, + message: messages.expected(/foo-.+/), line: 1, column: 15, }, { code: '@custom-media --foa (min-width: 0);', - message: messages.expected, + message: messages.expected(/foo-.+/), line: 1, column: 15, }, @@ -71,13 +71,13 @@ testRule({ reject: [ { code: '@custom-media --foa-bar (min-width: 0);', - message: messages.expected, + message: messages.expected('foo-.+'), line: 1, column: 15, }, { code: '@custom-media --foa (min-width: 0);', - message: messages.expected, + message: messages.expected('foo-.+'), line: 1, column: 15, }, @@ -100,13 +100,13 @@ testRule({ reject: [ { code: '@custom-media --ape-ageLess', - message: messages.expected, + message: messages.expected(/^[A-Z][a-z]+-[a-z][a-zA-Z]+$/), line: 1, column: 15, }, { code: '@custom-media --Ape-AgeLess', - message: messages.expected, + message: messages.expected(/^[A-Z][a-z]+-[a-z][a-zA-Z]+$/), line: 1, column: 15, }, diff --git a/lib/rules/custom-media-pattern/index.js b/lib/rules/custom-media-pattern/index.js index c5d028b916..b57bb5458e 100644 --- a/lib/rules/custom-media-pattern/index.js +++ b/lib/rules/custom-media-pattern/index.js @@ -11,7 +11,7 @@ const validateOptions = require('../../utils/validateOptions'); const ruleName = 'custom-media-pattern'; const messages = ruleMessages(ruleName, { - expected: 'Expected custom media query name to match specified pattern', + expected: (pattern) => `Expected custom media query name to match pattern "${pattern}"`, }); function rule(pattern) { @@ -39,7 +39,7 @@ function rule(pattern) { } report({ - message: messages.expected, + message: messages.expected(pattern), node: atRule, index: atRuleParamIndex(atRule), result, diff --git a/lib/rules/custom-property-pattern/__tests__/index.js b/lib/rules/custom-property-pattern/__tests__/index.js index 00f887036e..7dd52973ac 100644 --- a/lib/rules/custom-property-pattern/__tests__/index.js +++ b/lib/rules/custom-property-pattern/__tests__/index.js @@ -18,11 +18,11 @@ testRule({ reject: [ { code: ':root { --boo-bar: 0; }', - message: messages.expected, + message: messages.expected(/foo-.+/), }, { code: ':root { --foo-: 0; }', - message: messages.expected, + message: messages.expected(/foo-.+/), }, ], }); @@ -43,11 +43,11 @@ testRule({ reject: [ { code: ':root { --boo-bar: 0; }', - message: messages.expected, + message: messages.expected('foo-.+'), }, { code: ':root { --foo-: 0; }', - message: messages.expected, + message: messages.expected('foo-.+'), }, ], }); @@ -68,15 +68,15 @@ testRule({ reject: [ { code: ':root { --boo-Foo-bar: 0; }', - message: messages.expected, + message: messages.expected(/^[A-Z][a-z]+-[a-z][a-zA-Z]+$/), }, { code: ':root { --foo-bar: 0; }', - message: messages.expected, + message: messages.expected(/^[A-Z][a-z]+-[a-z][a-zA-Z]+$/), }, { code: ':root { --Foo-Bar: 0; }', - message: messages.expected, + message: messages.expected(/^[A-Z][a-z]+-[a-z][a-zA-Z]+$/), }, ], }); diff --git a/lib/rules/custom-property-pattern/index.js b/lib/rules/custom-property-pattern/index.js index 76d9eb0496..57ccb3417a 100644 --- a/lib/rules/custom-property-pattern/index.js +++ b/lib/rules/custom-property-pattern/index.js @@ -11,7 +11,7 @@ const validateOptions = require('../../utils/validateOptions'); const ruleName = 'custom-property-pattern'; const messages = ruleMessages(ruleName, { - expected: 'Expected custom property name to match specified pattern', + expected: (pattern) => `Expected custom property name to match pattern "${pattern}"`, }); function rule(pattern) { @@ -39,7 +39,7 @@ function rule(pattern) { } report({ - message: messages.expected, + message: messages.expected(pattern), node: decl, result, ruleName, diff --git a/lib/rules/declaration-bang-space-after/index.js b/lib/rules/declaration-bang-space-after/index.js index 78d5075ab2..0b64cd4b91 100644 --- a/lib/rules/declaration-bang-space-after/index.js +++ b/lib/rules/declaration-bang-space-after/index.js @@ -42,6 +42,8 @@ function rule(expectation, options, context) { if (bangIndex < value.length) { target = value; + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow setFixed = (value) => { if (decl.raws.value) { decl.raws.value.raw = value; @@ -52,6 +54,8 @@ function rule(expectation, options, context) { } else if (decl.important) { target = decl.raws.important || ' !important'; bangIndex -= value.length; + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow setFixed = (value) => { decl.raws.important = value; }; diff --git a/lib/rules/declaration-bang-space-before/index.js b/lib/rules/declaration-bang-space-before/index.js index 40122e39f3..dc981427ca 100644 --- a/lib/rules/declaration-bang-space-before/index.js +++ b/lib/rules/declaration-bang-space-before/index.js @@ -42,6 +42,8 @@ function rule(expectation, options, context) { if (bangIndex < value.length) { target = value; + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow setFixed = (value) => { if (decl.raws.value) { decl.raws.value.raw = value; @@ -52,6 +54,8 @@ function rule(expectation, options, context) { } else if (decl.important) { target = decl.raws.important || ' !important'; bangIndex -= value.length; + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow setFixed = (value) => { decl.raws.important = value; }; diff --git a/lib/rules/declaration-block-no-redundant-longhand-properties/index.js b/lib/rules/declaration-block-no-redundant-longhand-properties/index.js index c8911d2e57..cd23887bc2 100644 --- a/lib/rules/declaration-block-no-redundant-longhand-properties/index.js +++ b/lib/rules/declaration-block-no-redundant-longhand-properties/index.js @@ -5,11 +5,11 @@ const _ = require('lodash'); const eachDeclarationBlock = require('../../utils/eachDeclarationBlock'); const optionsMatches = require('../../utils/optionsMatches'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const shorthandData = require('../../reference/shorthandData'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'declaration-block-no-redundant-longhand-properties'; @@ -36,6 +36,8 @@ function rule(actual, options) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow const longhandProperties = _.transform(shorthandData, (result, values, key) => { if (optionsMatches(options, 'ignoreShorthands', key)) { return; @@ -51,8 +53,8 @@ function rule(actual, options) { eachDecl((decl) => { const prop = decl.prop.toLowerCase(); - const unprefixedProp = postcss.vendor.unprefixed(prop); - const prefix = postcss.vendor.prefix(prop); + const unprefixedProp = vendor.unprefixed(prop); + const prefix = vendor.prefix(prop); const shorthandProperties = longhandProperties[unprefixedProp]; diff --git a/lib/rules/declaration-block-no-shorthand-property-overrides/index.js b/lib/rules/declaration-block-no-shorthand-property-overrides/index.js index 5fb62fd694..a40e26b3bb 100644 --- a/lib/rules/declaration-block-no-shorthand-property-overrides/index.js +++ b/lib/rules/declaration-block-no-shorthand-property-overrides/index.js @@ -3,11 +3,11 @@ 'use strict'; const eachDeclarationBlock = require('../../utils/eachDeclarationBlock'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const shorthandData = require('../../reference/shorthandData'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'declaration-block-no-shorthand-property-overrides'; @@ -28,8 +28,8 @@ function rule(actual) { eachDecl((decl) => { const prop = decl.prop; - const unprefixedProp = postcss.vendor.unprefixed(prop); - const prefix = postcss.vendor.prefix(prop).toLowerCase(); + const unprefixedProp = vendor.unprefixed(prop); + const prefix = vendor.prefix(prop).toLowerCase(); const overrideables = shorthandData[unprefixedProp.toLowerCase()]; diff --git a/lib/rules/declaration-block-single-line-max-declarations/index.js b/lib/rules/declaration-block-single-line-max-declarations/index.js index 7cf6f8ffaa..2d542e60bf 100644 --- a/lib/rules/declaration-block-single-line-max-declarations/index.js +++ b/lib/rules/declaration-block-single-line-max-declarations/index.js @@ -27,6 +27,8 @@ function rule(quantity) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isSingleLineString(blockString(rule))) { return; diff --git a/lib/rules/declaration-property-unit-allowed-list/index.js b/lib/rules/declaration-property-unit-allowed-list/index.js index f57ad17b66..9cec92b445 100644 --- a/lib/rules/declaration-property-unit-allowed-list/index.js +++ b/lib/rules/declaration-property-unit-allowed-list/index.js @@ -6,11 +6,11 @@ const _ = require('lodash'); const declarationValueIndex = require('../../utils/declarationValueIndex'); const getUnitFromValueNode = require('../../utils/getUnitFromValueNode'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); +const vendor = require('../../utils/vendor'); const ruleName = 'declaration-property-unit-allowed-list'; @@ -33,7 +33,7 @@ function rule(list) { const prop = decl.prop; const value = decl.value; - const unprefixedProp = postcss.vendor.unprefixed(prop); + const unprefixedProp = vendor.unprefixed(prop); const propList = _.find(list, (units, propIdentifier) => matchesStringOrRegExp(unprefixedProp, propIdentifier), diff --git a/lib/rules/declaration-property-unit-blacklist/__tests__/index.js b/lib/rules/declaration-property-unit-blacklist/__tests__/index.js index bf4f9a2fff..3e09c79fe8 100644 --- a/lib/rules/declaration-property-unit-blacklist/__tests__/index.js +++ b/lib/rules/declaration-property-unit-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/declaration-property-unit-blacklist/index.js b/lib/rules/declaration-property-unit-blacklist/index.js index db1d840dd2..15eaf928c5 100644 --- a/lib/rules/declaration-property-unit-blacklist/index.js +++ b/lib/rules/declaration-property-unit-blacklist/index.js @@ -6,11 +6,11 @@ const _ = require('lodash'); const declarationValueIndex = require('../../utils/declarationValueIndex'); const getUnitFromValueNode = require('../../utils/getUnitFromValueNode'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); +const vendor = require('../../utils/vendor'); const ruleName = 'declaration-property-unit-blacklist'; @@ -41,7 +41,7 @@ function rule(list) { const prop = decl.prop; const value = decl.value; - const unprefixedProp = postcss.vendor.unprefixed(prop); + const unprefixedProp = vendor.unprefixed(prop); const propList = _.find(list, (units, propIdentifier) => matchesStringOrRegExp(unprefixedProp, propIdentifier), @@ -81,4 +81,6 @@ function rule(list) { rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/declaration-property-unit-disallowed-list/index.js b/lib/rules/declaration-property-unit-disallowed-list/index.js index e4924d7be5..2f0f37cf12 100644 --- a/lib/rules/declaration-property-unit-disallowed-list/index.js +++ b/lib/rules/declaration-property-unit-disallowed-list/index.js @@ -6,11 +6,11 @@ const _ = require('lodash'); const declarationValueIndex = require('../../utils/declarationValueIndex'); const getUnitFromValueNode = require('../../utils/getUnitFromValueNode'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); +const vendor = require('../../utils/vendor'); const ruleName = 'declaration-property-unit-disallowed-list'; @@ -33,7 +33,7 @@ function rule(list) { const prop = decl.prop; const value = decl.value; - const unprefixedProp = postcss.vendor.unprefixed(prop); + const unprefixedProp = vendor.unprefixed(prop); const propList = _.find(list, (units, propIdentifier) => matchesStringOrRegExp(unprefixedProp, propIdentifier), diff --git a/lib/rules/declaration-property-unit-whitelist/__tests__/index.js b/lib/rules/declaration-property-unit-whitelist/__tests__/index.js index 9850fb4cfc..d37f31fe4d 100644 --- a/lib/rules/declaration-property-unit-whitelist/__tests__/index.js +++ b/lib/rules/declaration-property-unit-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/declaration-property-unit-whitelist/index.js b/lib/rules/declaration-property-unit-whitelist/index.js index cd2dc9eef0..a70bcfd512 100644 --- a/lib/rules/declaration-property-unit-whitelist/index.js +++ b/lib/rules/declaration-property-unit-whitelist/index.js @@ -6,11 +6,11 @@ const _ = require('lodash'); const declarationValueIndex = require('../../utils/declarationValueIndex'); const getUnitFromValueNode = require('../../utils/getUnitFromValueNode'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); +const vendor = require('../../utils/vendor'); const ruleName = 'declaration-property-unit-whitelist'; @@ -41,7 +41,7 @@ function rule(list) { const prop = decl.prop; const value = decl.value; - const unprefixedProp = postcss.vendor.unprefixed(prop); + const unprefixedProp = vendor.unprefixed(prop); const propList = _.find(list, (units, propIdentifier) => matchesStringOrRegExp(unprefixedProp, propIdentifier), @@ -81,4 +81,6 @@ function rule(list) { rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/declaration-property-value-allowed-list/index.js b/lib/rules/declaration-property-value-allowed-list/index.js index 227bad0f83..4985a2aaa3 100644 --- a/lib/rules/declaration-property-value-allowed-list/index.js +++ b/lib/rules/declaration-property-value-allowed-list/index.js @@ -4,10 +4,10 @@ const _ = require('lodash'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'declaration-property-value-allowed-list'; @@ -30,7 +30,7 @@ function rule(list) { const prop = decl.prop; const value = decl.value; - const unprefixedProp = postcss.vendor.unprefixed(prop); + const unprefixedProp = vendor.unprefixed(prop); const propList = _.find(list, (values, propIdentifier) => matchesStringOrRegExp(unprefixedProp, propIdentifier), ); diff --git a/lib/rules/declaration-property-value-blacklist/__tests__/index.js b/lib/rules/declaration-property-value-blacklist/__tests__/index.js index a1d3005a29..5526e3a659 100644 --- a/lib/rules/declaration-property-value-blacklist/__tests__/index.js +++ b/lib/rules/declaration-property-value-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/declaration-property-value-blacklist/index.js b/lib/rules/declaration-property-value-blacklist/index.js index 3550bf70e4..ced1e21978 100644 --- a/lib/rules/declaration-property-value-blacklist/index.js +++ b/lib/rules/declaration-property-value-blacklist/index.js @@ -4,10 +4,10 @@ const _ = require('lodash'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'declaration-property-value-blacklist'; @@ -38,7 +38,7 @@ function rule(list) { const prop = decl.prop; const value = decl.value; - const unprefixedProp = postcss.vendor.unprefixed(prop); + const unprefixedProp = vendor.unprefixed(prop); const propList = _.find(list, (values, propIdentifier) => matchesStringOrRegExp(unprefixedProp, propIdentifier), ); @@ -63,4 +63,6 @@ function rule(list) { rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/declaration-property-value-disallowed-list/index.js b/lib/rules/declaration-property-value-disallowed-list/index.js index 21f3b7f0c9..ad7e4de385 100644 --- a/lib/rules/declaration-property-value-disallowed-list/index.js +++ b/lib/rules/declaration-property-value-disallowed-list/index.js @@ -4,10 +4,10 @@ const _ = require('lodash'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'declaration-property-value-disallowed-list'; @@ -30,7 +30,7 @@ function rule(list) { const prop = decl.prop; const value = decl.value; - const unprefixedProp = postcss.vendor.unprefixed(prop); + const unprefixedProp = vendor.unprefixed(prop); const propList = _.find(list, (values, propIdentifier) => matchesStringOrRegExp(unprefixedProp, propIdentifier), ); diff --git a/lib/rules/declaration-property-value-whitelist/__tests__/index.js b/lib/rules/declaration-property-value-whitelist/__tests__/index.js index 7f674ab4b7..2daf53488e 100644 --- a/lib/rules/declaration-property-value-whitelist/__tests__/index.js +++ b/lib/rules/declaration-property-value-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/declaration-property-value-whitelist/index.js b/lib/rules/declaration-property-value-whitelist/index.js index 3a20e2b340..e6d95577e2 100644 --- a/lib/rules/declaration-property-value-whitelist/index.js +++ b/lib/rules/declaration-property-value-whitelist/index.js @@ -4,10 +4,10 @@ const _ = require('lodash'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'declaration-property-value-whitelist'; @@ -38,7 +38,7 @@ function rule(list) { const prop = decl.prop; const value = decl.value; - const unprefixedProp = postcss.vendor.unprefixed(prop); + const unprefixedProp = vendor.unprefixed(prop); const propList = _.find(list, (values, propIdentifier) => matchesStringOrRegExp(unprefixedProp, propIdentifier), ); @@ -63,4 +63,6 @@ function rule(list) { rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/function-allowed-list/index.js b/lib/rules/function-allowed-list/index.js index d162557a56..4ff2a0c067 100644 --- a/lib/rules/function-allowed-list/index.js +++ b/lib/rules/function-allowed-list/index.js @@ -6,11 +6,11 @@ const _ = require('lodash'); const declarationValueIndex = require('../../utils/declarationValueIndex'); const isStandardSyntaxFunction = require('../../utils/isStandardSyntaxFunction'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); +const vendor = require('../../utils/vendor'); const ruleName = 'function-allowed-list'; @@ -43,7 +43,7 @@ function rule(listInput) { return; } - if (matchesStringOrRegExp(postcss.vendor.unprefixed(node.value), list)) { + if (matchesStringOrRegExp(vendor.unprefixed(node.value), list)) { return; } diff --git a/lib/rules/function-blacklist/__tests__/index.js b/lib/rules/function-blacklist/__tests__/index.js index 7d7db8d4ff..77bb83177d 100644 --- a/lib/rules/function-blacklist/__tests__/index.js +++ b/lib/rules/function-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/function-blacklist/index.js b/lib/rules/function-blacklist/index.js index e26654a22d..1c1e09cdc9 100644 --- a/lib/rules/function-blacklist/index.js +++ b/lib/rules/function-blacklist/index.js @@ -6,11 +6,11 @@ const _ = require('lodash'); const declarationValueIndex = require('../../utils/declarationValueIndex'); const isStandardSyntaxFunction = require('../../utils/isStandardSyntaxFunction'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); +const vendor = require('../../utils/vendor'); const ruleName = 'function-blacklist'; @@ -46,7 +46,7 @@ function rule(list) { return; } - if (!matchesStringOrRegExp(postcss.vendor.unprefixed(node.value), list)) { + if (!matchesStringOrRegExp(vendor.unprefixed(node.value), list)) { return; } @@ -66,4 +66,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/function-disallowed-list/index.js b/lib/rules/function-disallowed-list/index.js index 5f30bb862a..5b7cdea5d2 100644 --- a/lib/rules/function-disallowed-list/index.js +++ b/lib/rules/function-disallowed-list/index.js @@ -6,11 +6,11 @@ const _ = require('lodash'); const declarationValueIndex = require('../../utils/declarationValueIndex'); const isStandardSyntaxFunction = require('../../utils/isStandardSyntaxFunction'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); +const vendor = require('../../utils/vendor'); const ruleName = 'function-disallowed-list'; @@ -41,7 +41,7 @@ function rule(list) { return; } - if (!matchesStringOrRegExp(postcss.vendor.unprefixed(node.value), list)) { + if (!matchesStringOrRegExp(vendor.unprefixed(node.value), list)) { return; } diff --git a/lib/rules/function-linear-gradient-no-nonstandard-direction/index.js b/lib/rules/function-linear-gradient-no-nonstandard-direction/index.js index 6476dde8ee..319b3b9c41 100644 --- a/lib/rules/function-linear-gradient-no-nonstandard-direction/index.js +++ b/lib/rules/function-linear-gradient-no-nonstandard-direction/index.js @@ -5,11 +5,11 @@ const declarationValueIndex = require('../../utils/declarationValueIndex'); const functionArgumentsSearch = require('../../utils/functionArgumentsSearch'); const isStandardSyntaxValue = require('../../utils/isStandardSyntaxValue'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); +const vendor = require('../../utils/vendor'); const ruleName = 'function-linear-gradient-no-nonstandard-direction'; @@ -83,7 +83,7 @@ function rule(actual) { return; } - const withToPrefix = !postcss.vendor.prefix(valueNode.value); + const withToPrefix = !vendor.prefix(valueNode.value); if (!isStandardDirection(firstArg, withToPrefix)) { complain(); diff --git a/lib/rules/function-url-scheme-blacklist/__tests__/index.js b/lib/rules/function-url-scheme-blacklist/__tests__/index.js index d4ec6f2dbc..fb0f9513a3 100644 --- a/lib/rules/function-url-scheme-blacklist/__tests__/index.js +++ b/lib/rules/function-url-scheme-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: [[]], diff --git a/lib/rules/function-url-scheme-blacklist/index.js b/lib/rules/function-url-scheme-blacklist/index.js index c85bb0f68a..9580add5cb 100644 --- a/lib/rules/function-url-scheme-blacklist/index.js +++ b/lib/rules/function-url-scheme-blacklist/index.js @@ -71,4 +71,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/function-url-scheme-whitelist/__tests__/index.js b/lib/rules/function-url-scheme-whitelist/__tests__/index.js index f6e3823f86..7cfe199c9b 100644 --- a/lib/rules/function-url-scheme-whitelist/__tests__/index.js +++ b/lib/rules/function-url-scheme-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: ['https', 'data'], diff --git a/lib/rules/function-url-scheme-whitelist/index.js b/lib/rules/function-url-scheme-whitelist/index.js index 320453c993..9bcadd8930 100644 --- a/lib/rules/function-url-scheme-whitelist/index.js +++ b/lib/rules/function-url-scheme-whitelist/index.js @@ -71,4 +71,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/function-whitelist/__tests__/index.js b/lib/rules/function-whitelist/__tests__/index.js index e2843265d8..5563c23f1f 100644 --- a/lib/rules/function-whitelist/__tests__/index.js +++ b/lib/rules/function-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/function-whitelist/index.js b/lib/rules/function-whitelist/index.js index 95627bb108..d64abb84df 100644 --- a/lib/rules/function-whitelist/index.js +++ b/lib/rules/function-whitelist/index.js @@ -6,11 +6,11 @@ const _ = require('lodash'); const declarationValueIndex = require('../../utils/declarationValueIndex'); const isStandardSyntaxFunction = require('../../utils/isStandardSyntaxFunction'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); +const vendor = require('../../utils/vendor'); const ruleName = 'function-whitelist'; @@ -48,7 +48,7 @@ function rule(listInput) { return; } - if (matchesStringOrRegExp(postcss.vendor.unprefixed(node.value), list)) { + if (matchesStringOrRegExp(vendor.unprefixed(node.value), list)) { return; } @@ -68,4 +68,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/indentation/index.js b/lib/rules/indentation/index.js index cab219334c..041637b2b8 100644 --- a/lib/rules/indentation/index.js +++ b/lib/rules/indentation/index.js @@ -186,6 +186,8 @@ function rule(space, options = {}, context) { checkMultilineBit(declString, valueLevel, decl); } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function checkSelector(rule, ruleLevel) { const selector = rule.selector; diff --git a/lib/rules/index.js b/lib/rules/index.js index a2ee0d5260..8d51bfd21c 100644 --- a/lib/rules/index.js +++ b/lib/rules/index.js @@ -61,6 +61,7 @@ const rules = { 'color-no-invalid-hex': importLazy(() => require('./color-no-invalid-hex'))(), 'comment-empty-line-before': importLazy(() => require('./comment-empty-line-before'))(), 'comment-no-empty': importLazy(() => require('./comment-no-empty'))(), + 'comment-pattern': importLazy(() => require('./comment-pattern'))(), 'comment-whitespace-inside': importLazy(() => require('./comment-whitespace-inside'))(), 'comment-word-blacklist': importLazy(() => require('./comment-word-blacklist'))(), 'comment-word-disallowed-list': importLazy(() => require('./comment-word-disallowed-list'))(), diff --git a/lib/rules/keyframes-name-pattern/__tests__/index.js b/lib/rules/keyframes-name-pattern/__tests__/index.js index 583c4e79cd..772fb47426 100644 --- a/lib/rules/keyframes-name-pattern/__tests__/index.js +++ b/lib/rules/keyframes-name-pattern/__tests__/index.js @@ -28,26 +28,26 @@ testRule({ reject: [ { code: '@keyframes foo {}', - message: messages.expected('foo'), + message: messages.expected('foo', 'foo-.+'), line: 1, column: 12, }, { code: '@keyframes bar {}', - message: messages.expected('bar'), + message: messages.expected('bar', 'foo-.+'), line: 1, column: 12, }, { code: '@keyframes FOO-bar {}', - message: messages.expected('FOO-bar'), + message: messages.expected('FOO-bar', 'foo-.+'), line: 1, column: 12, }, { code: '@-webkit-keyframes bar {}', description: 'Webkit prefix', - message: messages.expected('bar'), + message: messages.expected('bar', 'foo-.+'), line: 1, column: 20, }, @@ -69,7 +69,7 @@ testRule({ { code: '@keyframes foo-baz {}', description: 'Accepts pattern in RegExp notation', - message: messages.expected('foo-baz'), + message: messages.expected('foo-baz', /^foo-bar$/), line: 1, column: 12, }, diff --git a/lib/rules/keyframes-name-pattern/index.js b/lib/rules/keyframes-name-pattern/index.js index 0017c5bed7..3fbe55225e 100644 --- a/lib/rules/keyframes-name-pattern/index.js +++ b/lib/rules/keyframes-name-pattern/index.js @@ -11,7 +11,8 @@ const validateOptions = require('../../utils/validateOptions'); const ruleName = 'keyframes-name-pattern'; const messages = ruleMessages(ruleName, { - expected: (keyframeName) => `Expected keyframe name "${keyframeName}" to match specified pattern`, + expected: (keyframeName, pattern) => + `Expected keyframe name "${keyframeName}" to match pattern "${pattern}"`, }); function rule(pattern) { @@ -36,7 +37,7 @@ function rule(pattern) { report({ index: atRuleParamIndex(keyframesNode), - message: messages.expected(value), + message: messages.expected(value, pattern), node: keyframesNode, ruleName, result, diff --git a/lib/rules/length-zero-no-unit/index.js b/lib/rules/length-zero-no-unit/index.js index 6145771b27..99b78b5c6f 100644 --- a/lib/rules/length-zero-no-unit/index.js +++ b/lib/rules/length-zero-no-unit/index.js @@ -56,6 +56,8 @@ function rule(actual, secondary, context) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow const stringValue = valueParser.stringify(node); const ignoreFlag = isMathFunction(node); diff --git a/lib/rules/linebreaks/index.js b/lib/rules/linebreaks/index.js index 8e3bca461d..241eff77d0 100644 --- a/lib/rules/linebreaks/index.js +++ b/lib/rules/linebreaks/index.js @@ -58,6 +58,8 @@ function rule(actual, secondary, context) { } } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function hasError(dataToCheck, shouldHaveCR) { const hasNewlineToVerify = /[\r\n]/.test(dataToCheck); const hasCR = hasNewlineToVerify ? /\r/.test(dataToCheck) : false; @@ -65,8 +67,12 @@ function rule(actual, secondary, context) { return hasNewlineToVerify && hasCR !== shouldHaveCR; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function fixData(data, shouldHaveCR) { if (data) { + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow let result = data.replace(/\r/g, ''); if (shouldHaveCR) { @@ -91,6 +97,8 @@ function rule(actual, secondary, context) { }); } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function reportNewlineError(shouldHaveCR, lineNum, colNum, actual, result) { const reportNode = createReportNode(lineNum, colNum); diff --git a/lib/rules/max-empty-lines/index.js b/lib/rules/max-empty-lines/index.js index 4f7985db1d..85386641a0 100644 --- a/lib/rules/max-empty-lines/index.js +++ b/lib/rules/max-empty-lines/index.js @@ -151,6 +151,8 @@ function rule(max, options, context) { } } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function replaceEmptyLines(max, str, isSpecialCase = false) { const repeatTimes = isSpecialCase ? max : max + 1; @@ -161,6 +163,8 @@ function rule(max, options, context) { const emptyLFLines = '\n'.repeat(repeatTimes); const emptyCRLFLines = '\r\n'.repeat(repeatTimes); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow let result; if (/(\r\n)+/g.test(str)) { diff --git a/lib/rules/max-line-length/index.js b/lib/rules/max-line-length/index.js index 9740903e1a..65342c6ecb 100644 --- a/lib/rules/max-line-length/index.js +++ b/lib/rules/max-line-length/index.js @@ -72,6 +72,8 @@ function rule(maxLength, options, context) { checkNewline(rootString, match, root), ); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function complain(index, root) { report({ index, @@ -101,6 +103,8 @@ function rule(maxLength, options, context) { return excluded; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function checkNewline(rootString, match, root) { let nextNewlineIndex = rootString.indexOf('\n', match.endIndex); diff --git a/lib/rules/max-nesting-depth/index.js b/lib/rules/max-nesting-depth/index.js index c8f63a0bcf..9dc969a7c4 100644 --- a/lib/rules/max-nesting-depth/index.js +++ b/lib/rules/max-nesting-depth/index.js @@ -87,6 +87,8 @@ function rule(max, options) { const normalized = parser().processSync(selector, { lossless: false }); const selectors = normalized.split(','); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow return selectors.every((selector) => selector.startsWith('&:') && selector[2] !== ':'); } diff --git a/lib/rules/media-feature-name-blacklist/__tests__/index.js b/lib/rules/media-feature-name-blacklist/__tests__/index.js index bd28913d70..62855b5924 100644 --- a/lib/rules/media-feature-name-blacklist/__tests__/index.js +++ b/lib/rules/media-feature-name-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: ['max-width', '--wide-viewport', 'width', '/^my-/', 'color'], diff --git a/lib/rules/media-feature-name-blacklist/index.js b/lib/rules/media-feature-name-blacklist/index.js index 40f0a54db1..7dba881daa 100644 --- a/lib/rules/media-feature-name-blacklist/index.js +++ b/lib/rules/media-feature-name-blacklist/index.js @@ -81,4 +81,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/media-feature-name-no-unknown/index.js b/lib/rules/media-feature-name-no-unknown/index.js index 38b27b29e9..491542d9ad 100644 --- a/lib/rules/media-feature-name-no-unknown/index.js +++ b/lib/rules/media-feature-name-no-unknown/index.js @@ -10,11 +10,11 @@ const isStandardSyntaxMediaFeatureName = require('../../utils/isStandardSyntaxMe const keywordSets = require('../../reference/keywordSets'); const mediaParser = require('postcss-media-query-parser').default; const optionsMatches = require('../../utils/optionsMatches'); -const postcss = require('postcss'); const rangeContextNodeParser = require('../rangeContextNodeParser'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'media-feature-name-no-unknown'; @@ -67,10 +67,7 @@ function rule(actual, options) { return; } - if ( - postcss.vendor.prefix(value) || - keywordSets.mediaFeatureNames.has(value.toLowerCase()) - ) { + if (vendor.prefix(value) || keywordSets.mediaFeatureNames.has(value.toLowerCase())) { return; } diff --git a/lib/rules/media-feature-name-value-allowed-list/index.js b/lib/rules/media-feature-name-value-allowed-list/index.js index 60272c91af..801551a29a 100644 --- a/lib/rules/media-feature-name-value-allowed-list/index.js +++ b/lib/rules/media-feature-name-value-allowed-list/index.js @@ -7,11 +7,11 @@ const atRuleParamIndex = require('../../utils/atRuleParamIndex'); const isRangeContextMediaFeature = require('../../utils/isRangeContextMediaFeature'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); const mediaParser = require('postcss-media-query-parser').default; -const postcss = require('postcss'); const rangeContextNodeParser = require('../rangeContextNodeParser'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'media-feature-name-value-allowed-list'; @@ -57,7 +57,7 @@ function rule(list) { for (let i = 0; i < values.length; i++) { const valueNode = values[i]; const value = valueNode.value; - const unprefixedMediaFeatureName = postcss.vendor.unprefixed(mediaFeatureName); + const unprefixedMediaFeatureName = vendor.unprefixed(mediaFeatureName); const allowedValues = _.find(list, (v, featureName) => matchesStringOrRegExp(unprefixedMediaFeatureName, featureName), diff --git a/lib/rules/media-feature-name-value-whitelist/__tests__/index.js b/lib/rules/media-feature-name-value-whitelist/__tests__/index.js index e7d1f0baf2..4aadec3d88 100644 --- a/lib/rules/media-feature-name-value-whitelist/__tests__/index.js +++ b/lib/rules/media-feature-name-value-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: [ diff --git a/lib/rules/media-feature-name-value-whitelist/index.js b/lib/rules/media-feature-name-value-whitelist/index.js index 3eb18856e5..c410017924 100644 --- a/lib/rules/media-feature-name-value-whitelist/index.js +++ b/lib/rules/media-feature-name-value-whitelist/index.js @@ -7,11 +7,11 @@ const atRuleParamIndex = require('../../utils/atRuleParamIndex'); const isRangeContextMediaFeature = require('../../utils/isRangeContextMediaFeature'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); const mediaParser = require('postcss-media-query-parser').default; -const postcss = require('postcss'); const rangeContextNodeParser = require('../rangeContextNodeParser'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'media-feature-name-value-whitelist'; @@ -65,7 +65,7 @@ function rule(list) { for (let i = 0; i < values.length; i++) { const valueNode = values[i]; const value = valueNode.value; - const unprefixedMediaFeatureName = postcss.vendor.unprefixed(mediaFeatureName); + const unprefixedMediaFeatureName = vendor.unprefixed(mediaFeatureName); const allowedValues = _.find(list, (v, featureName) => matchesStringOrRegExp(unprefixedMediaFeatureName, featureName), @@ -94,4 +94,6 @@ function rule(list) { rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/media-feature-name-whitelist/__tests__/index.js b/lib/rules/media-feature-name-whitelist/__tests__/index.js index f0af8f625b..b711d1cbbb 100644 --- a/lib/rules/media-feature-name-whitelist/__tests__/index.js +++ b/lib/rules/media-feature-name-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: ['max-width', '/^my-/', 'color'], diff --git a/lib/rules/media-feature-name-whitelist/index.js b/lib/rules/media-feature-name-whitelist/index.js index ebfdff9fb6..6dfcb91ee8 100644 --- a/lib/rules/media-feature-name-whitelist/index.js +++ b/lib/rules/media-feature-name-whitelist/index.js @@ -81,4 +81,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/no-descending-specificity/index.js b/lib/rules/no-descending-specificity/index.js index 7357ef8d86..28089ea6c0 100644 --- a/lib/rules/no-descending-specificity/index.js +++ b/lib/rules/no-descending-specificity/index.js @@ -46,6 +46,8 @@ function rule(on, options) { const selectorContextLookup = nodeContextLookup(); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { // Ignore custom property set `--foo: {};` if (isCustomPropertySet(rule)) { @@ -88,6 +90,8 @@ function rule(on, options) { }); }); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function checkSelector(selectorNode, rule, sourceIndex, comparisonContext) { const selector = selectorNode.toString(); const referenceSelectorNode = lastCompoundSelectorWithoutPseudoClasses(selectorNode); diff --git a/lib/rules/no-duplicate-selectors/index.js b/lib/rules/no-duplicate-selectors/index.js index 02e8d4e566..0611e90f9c 100644 --- a/lib/rules/no-duplicate-selectors/index.js +++ b/lib/rules/no-duplicate-selectors/index.js @@ -47,12 +47,16 @@ function rule(actual, options) { // from other rules that share the same parent and the same source. const selectorContextLookup = nodeContextLookup(); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (isKeyframeRule(rule)) { return; } const contextSelectorSet = selectorContextLookup.getContext(rule, findAtRuleContext(rule)); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow const resolvedSelectors = rule.selectors.reduce((result, selector) => { return _.union(result, resolvedNestedSelector(selector, rule)); }, []); diff --git a/lib/rules/no-eol-whitespace/index.js b/lib/rules/no-eol-whitespace/index.js index d797fc40d1..054004f9c7 100644 --- a/lib/rules/no-eol-whitespace/index.js +++ b/lib/rules/no-eol-whitespace/index.js @@ -117,6 +117,8 @@ function rule(on, options, context) { comments: 'check', }, (match) => { + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow const errorIndex = findErrorStartIndex(match.startIndex, string, { ignoreEmptyLines, isRootFirst, @@ -129,6 +131,8 @@ function rule(on, options, context) { ); } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function fix(root) { let isRootFirst = true; @@ -227,6 +231,8 @@ function rule(on, options, context) { } } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function fixText(value, fix, isRootFirst) { if (!value) { return; diff --git a/lib/rules/no-invalid-double-slash-comments/index.js b/lib/rules/no-invalid-double-slash-comments/index.js index 4720b8142d..3661a391bb 100644 --- a/lib/rules/no-invalid-double-slash-comments/index.js +++ b/lib/rules/no-invalid-double-slash-comments/index.js @@ -30,6 +30,8 @@ function rule(actual) { }); } }); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { rule.selectors.forEach((selector) => { if (selector.startsWith('//')) { diff --git a/lib/rules/property-allowed-list/index.js b/lib/rules/property-allowed-list/index.js index 28f9df5be8..e94029db71 100644 --- a/lib/rules/property-allowed-list/index.js +++ b/lib/rules/property-allowed-list/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isCustomProperty = require('../../utils/isCustomProperty'); const isStandardSyntaxProperty = require('../../utils/isStandardSyntaxProperty'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'property-allowed-list'; @@ -39,7 +39,7 @@ function rule(list) { return; } - if (matchesStringOrRegExp(postcss.vendor.unprefixed(prop), list)) { + if (matchesStringOrRegExp(vendor.unprefixed(prop), list)) { return; } diff --git a/lib/rules/property-blacklist/__tests__/index.js b/lib/rules/property-blacklist/__tests__/index.js index 68a3c450aa..208fc96dc5 100644 --- a/lib/rules/property-blacklist/__tests__/index.js +++ b/lib/rules/property-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/property-blacklist/index.js b/lib/rules/property-blacklist/index.js index 6744c9dc16..f1584acf86 100644 --- a/lib/rules/property-blacklist/index.js +++ b/lib/rules/property-blacklist/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isCustomProperty = require('../../utils/isCustomProperty'); const isStandardSyntaxProperty = require('../../utils/isStandardSyntaxProperty'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'property-blacklist'; @@ -44,7 +44,7 @@ function rule(list) { return; } - if (!matchesStringOrRegExp(postcss.vendor.unprefixed(prop), list)) { + if (!matchesStringOrRegExp(vendor.unprefixed(prop), list)) { return; } @@ -62,4 +62,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/property-disallowed-list/index.js b/lib/rules/property-disallowed-list/index.js index 21aff9a130..ca4bf45ab2 100644 --- a/lib/rules/property-disallowed-list/index.js +++ b/lib/rules/property-disallowed-list/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isCustomProperty = require('../../utils/isCustomProperty'); const isStandardSyntaxProperty = require('../../utils/isStandardSyntaxProperty'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'property-disallowed-list'; @@ -39,7 +39,7 @@ function rule(list) { return; } - if (!matchesStringOrRegExp(postcss.vendor.unprefixed(prop), list)) { + if (!matchesStringOrRegExp(vendor.unprefixed(prop), list)) { return; } diff --git a/lib/rules/property-no-unknown/README.md b/lib/rules/property-no-unknown/README.md index 61a30ee911..f5f82d4e40 100644 --- a/lib/rules/property-no-unknown/README.md +++ b/lib/rules/property-no-unknown/README.md @@ -127,6 +127,27 @@ The following patterns are _not_ considered violations: } ``` +### `ignoreAtRules: ["/regex/", /regex/, "string"]` + +Ignores properties nested within specified at-rules. + +Given: + +``` +["supports"] +``` + +The following patterns are _not_ considered violations: + + +```css +@supports (display: grid) { + a { + my-property: 1; + } +} +``` + ### `checkPrefixed: true | false` (default: `false`) If `true`, this rule will check vendor-prefixed properties. diff --git a/lib/rules/property-no-unknown/__tests__/index.js b/lib/rules/property-no-unknown/__tests__/index.js index 2861598661..9e901babe5 100644 --- a/lib/rules/property-no-unknown/__tests__/index.js +++ b/lib/rules/property-no-unknown/__tests__/index.js @@ -360,3 +360,53 @@ testRule({ }, ], }); + +testRule({ + ruleName, + config: [true, { ignoreAtRules: ['supports', /^my-/] }], + + accept: [ + { + code: '@supports (display: grid) { my-property: 1; }', + }, + { + code: '@my-at-rule { foo: 1; }', + }, + { + code: '@supports (display:grid) { @media (min-width: 10px) { foo: 1; } }', + }, + { + code: '@supports (display:grid) { @media (min-width: 10px) { a { foo: 1; } } }', + }, + { + code: '@my-other-at-rule { a { foo: 1; } }', + }, + ], + + reject: [ + { + code: '@media screen { a { foo: 1; } }', + message: messages.rejected('foo'), + line: 1, + column: 21, + }, + { + code: '@not-my-at-rule { foo: 1; }', + message: messages.rejected('foo'), + line: 1, + column: 19, + }, + { + code: 'a { foo: 1; }', + message: messages.rejected('foo'), + line: 1, + column: 5, + }, + { + code: '@not-my-at-rule foobar { foo: 1; }', + message: messages.rejected('foo'), + line: 1, + column: 26, + }, + ], +}); diff --git a/lib/rules/property-no-unknown/index.js b/lib/rules/property-no-unknown/index.js index ec9045042c..3651a1bc27 100644 --- a/lib/rules/property-no-unknown/index.js +++ b/lib/rules/property-no-unknown/index.js @@ -7,11 +7,11 @@ const isCustomProperty = require('../../utils/isCustomProperty'); const isStandardSyntaxDeclaration = require('../../utils/isStandardSyntaxDeclaration'); const isStandardSyntaxProperty = require('../../utils/isStandardSyntaxProperty'); const optionsMatches = require('../../utils/optionsMatches'); -const postcss = require('postcss'); const properties = require('known-css-properties').all; const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'property-no-unknown'; @@ -33,6 +33,7 @@ function rule(actual, options) { ignoreProperties: [_.isString, _.isRegExp], checkPrefixed: _.isBoolean, ignoreSelectors: [_.isString, _.isRegExp], + ignoreAtRules: [_.isString, _.isRegExp], }, optional: true, }, @@ -44,7 +45,9 @@ function rule(actual, options) { const shouldCheckPrefixed = _.get(options, 'checkPrefixed'); - root.walkDecls((decl) => { + root.walkDecls(checkStatement); + + function checkStatement(decl) { const prop = decl.prop; if (!isStandardSyntaxProperty(prop)) { @@ -59,7 +62,7 @@ function rule(actual, options) { return; } - if (!shouldCheckPrefixed && postcss.vendor.prefix(prop)) { + if (!shouldCheckPrefixed && vendor.prefix(prop)) { return; } @@ -73,6 +76,18 @@ function rule(actual, options) { return; } + let node = decl.parent; + + while (node && node.type !== 'root') { + const { type, name } = node; + + if (type === 'atrule' && optionsMatches(options, 'ignoreAtRules', name)) { + return; + } + + node = node.parent; + } + if (allValidProperties.has(prop.toLowerCase())) { return; } @@ -83,7 +98,7 @@ function rule(actual, options) { result, ruleName, }); - }); + } }; } diff --git a/lib/rules/property-no-vendor-prefix/index.js b/lib/rules/property-no-vendor-prefix/index.js index d5fbcc0969..8dcfc3c565 100644 --- a/lib/rules/property-no-vendor-prefix/index.js +++ b/lib/rules/property-no-vendor-prefix/index.js @@ -5,10 +5,10 @@ const _ = require('lodash'); const isAutoprefixable = require('../../utils/isAutoprefixable'); const optionsMatches = require('../../utils/optionsMatches'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'property-no-vendor-prefix'; @@ -37,7 +37,7 @@ function rule(actual, options, context) { root.walkDecls((decl) => { const prop = decl.prop; - const unprefixedProp = postcss.vendor.unprefixed(prop); + const unprefixedProp = vendor.unprefixed(prop); //return early if property is to be ignored if (optionsMatches(options, 'ignoreProperties', unprefixedProp)) { diff --git a/lib/rules/property-whitelist/__tests__/index.js b/lib/rules/property-whitelist/__tests__/index.js index 65efbc1efb..f66c7fea86 100644 --- a/lib/rules/property-whitelist/__tests__/index.js +++ b/lib/rules/property-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/property-whitelist/index.js b/lib/rules/property-whitelist/index.js index 81f4fb0f8a..65904a4664 100644 --- a/lib/rules/property-whitelist/index.js +++ b/lib/rules/property-whitelist/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isCustomProperty = require('../../utils/isCustomProperty'); const isStandardSyntaxProperty = require('../../utils/isStandardSyntaxProperty'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'property-whitelist'; @@ -44,7 +44,7 @@ function rule(list) { return; } - if (matchesStringOrRegExp(postcss.vendor.unprefixed(prop), list)) { + if (matchesStringOrRegExp(vendor.unprefixed(prop), list)) { return; } @@ -62,4 +62,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/rule-empty-line-before/index.js b/lib/rules/rule-empty-line-before/index.js index a4ffe755a3..ded0db72d3 100644 --- a/lib/rules/rule-empty-line-before/index.js +++ b/lib/rules/rule-empty-line-before/index.js @@ -52,6 +52,8 @@ function rule(expectation, options, context) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -134,6 +136,8 @@ function rule(expectation, options, context) { }; } +// TODO: Issue #4985 +// eslint-disable-next-line no-shadow function isAfterRule(rule) { const prevNode = getPreviousNonSharedLineCommentNode(rule); diff --git a/lib/rules/selector-attribute-brackets-space-inside/index.js b/lib/rules/selector-attribute-brackets-space-inside/index.js index 884e0a2f0d..168ff5f3ec 100644 --- a/lib/rules/selector-attribute-brackets-space-inside/index.js +++ b/lib/rules/selector-attribute-brackets-space-inside/index.js @@ -30,6 +30,8 @@ function rule(expectation, options, context) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-attribute-operator-allowed-list/index.js b/lib/rules/selector-attribute-operator-allowed-list/index.js index ae31e7ec8d..46e7427495 100644 --- a/lib/rules/selector-attribute-operator-allowed-list/index.js +++ b/lib/rules/selector-attribute-operator-allowed-list/index.js @@ -28,6 +28,8 @@ function rule(listInput) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-attribute-operator-blacklist/__tests__/index.js b/lib/rules/selector-attribute-operator-blacklist/__tests__/index.js index e6d9f654d3..e36f2433a8 100644 --- a/lib/rules/selector-attribute-operator-blacklist/__tests__/index.js +++ b/lib/rules/selector-attribute-operator-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/selector-attribute-operator-blacklist/index.js b/lib/rules/selector-attribute-operator-blacklist/index.js index d28b3d09ea..82fb25db7c 100644 --- a/lib/rules/selector-attribute-operator-blacklist/index.js +++ b/lib/rules/selector-attribute-operator-blacklist/index.js @@ -36,6 +36,8 @@ function rule(listInput) { }, ); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -70,4 +72,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/selector-attribute-operator-disallowed-list/index.js b/lib/rules/selector-attribute-operator-disallowed-list/index.js index a48ae4a28d..2569897bcd 100644 --- a/lib/rules/selector-attribute-operator-disallowed-list/index.js +++ b/lib/rules/selector-attribute-operator-disallowed-list/index.js @@ -28,6 +28,8 @@ function rule(listInput) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-attribute-operator-space-after/index.js b/lib/rules/selector-attribute-operator-space-after/index.js index c63e385050..162e93a691 100644 --- a/lib/rules/selector-attribute-operator-space-after/index.js +++ b/lib/rules/selector-attribute-operator-space-after/index.js @@ -39,6 +39,8 @@ function rule(expectation, options, context) { const rawOperator = _.get(attributeNode, 'raws.operator'); if (rawOperator) { + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow const operatorAfter = rawOperator.slice(attributeNode.operator.length); return { diff --git a/lib/rules/selector-attribute-operator-whitelist/__tests__/index.js b/lib/rules/selector-attribute-operator-whitelist/__tests__/index.js index e43b0c1683..671b57e3e7 100644 --- a/lib/rules/selector-attribute-operator-whitelist/__tests__/index.js +++ b/lib/rules/selector-attribute-operator-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/selector-attribute-operator-whitelist/index.js b/lib/rules/selector-attribute-operator-whitelist/index.js index 34a39dfcc9..052cd5cf9f 100644 --- a/lib/rules/selector-attribute-operator-whitelist/index.js +++ b/lib/rules/selector-attribute-operator-whitelist/index.js @@ -36,6 +36,8 @@ function rule(listInput) { }, ); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -70,4 +72,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/selector-attribute-quotes/index.js b/lib/rules/selector-attribute-quotes/index.js index 25b6c1119a..ff66b314cb 100644 --- a/lib/rules/selector-attribute-quotes/index.js +++ b/lib/rules/selector-attribute-quotes/index.js @@ -26,6 +26,8 @@ function rule(expectation) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-class-pattern/__tests__/index.js b/lib/rules/selector-class-pattern/__tests__/index.js index a8b5e9700a..d2b7743170 100644 --- a/lib/rules/selector-class-pattern/__tests__/index.js +++ b/lib/rules/selector-class-pattern/__tests__/index.js @@ -1,10 +1,8 @@ 'use strict'; -const mergeTestDescriptions = require('../../../testUtils/mergeTestDescriptions'); - const { messages, ruleName } = require('..'); -const basicAZTests = { +const basicAZTestsAccept = { accept: [ { code: 'a {}', @@ -45,22 +43,51 @@ const basicAZTests = { message: 'Keyframes with decimal percentages', }, ], +}; + +testRule({ + ruleName, + config: [/^[A-Z]+$/], + + ...basicAZTestsAccept, reject: [ { code: 'a .foo {}', - message: messages.expected('foo'), + message: messages.expected('foo', /^[A-Z]+$/), line: 1, column: 3, }, { code: '.ABABA > .bar {}', - message: messages.expected('bar'), + message: messages.expected('bar', /^[A-Z]+$/), line: 1, column: 10, }, ], -}; +}); + +testRule({ + ruleName, + config: ['^[A-Z]+$'], + + ...basicAZTestsAccept, + + reject: [ + { + code: 'a .foo {}', + message: messages.expected('foo', '^[A-Z]+$'), + line: 1, + column: 3, + }, + { + code: '.ABABA > .bar {}', + message: messages.expected('bar', '^[A-Z]+$'), + line: 1, + column: 10, + }, + ], +}); const nestedAZTestsDefault = { accept: [ @@ -73,7 +100,19 @@ const nestedAZTestsDefault = { ], }; -const nestedAZTests = { +testRule({ + ruleName, + config: [/^[A-Z]+$/], + ...nestedAZTestsDefault, +}); + +testRule({ + ruleName, + config: ['^[A-Z]+$'], + ...nestedAZTestsDefault, +}); + +const nestedAZTestsAccept = { accept: [ { code: '.AB { }', @@ -91,58 +130,39 @@ const nestedAZTests = { code: '.A, .B { &C {} &D, &E {} }', }, ], +}; + +testRule({ + ruleName, + config: [/^[A-Z]+$/, { resolveNestedSelectors: true }], + + ...nestedAZTestsAccept, reject: [ { code: '.A { &__B { }}', - message: messages.expected('A__B'), + message: messages.expected('A__B', /^[A-Z]+$/), line: 1, column: 6, }, ], -}; +}); -testRule( - mergeTestDescriptions(basicAZTests, { - ruleName, - config: [/^[A-Z]+$/], - }), -); - -testRule( - mergeTestDescriptions(basicAZTests, { - ruleName, - config: ['^[A-Z]+$'], - }), -); - -testRule( - mergeTestDescriptions(nestedAZTestsDefault, { - ruleName, - config: [/^[A-Z]+$/], - }), -); - -testRule( - mergeTestDescriptions(nestedAZTestsDefault, { - ruleName, - config: ['^[A-Z]+$'], - }), -); - -testRule( - mergeTestDescriptions(nestedAZTests, { - ruleName, - config: [/^[A-Z]+$/, { resolveNestedSelectors: true }], - }), -); - -testRule( - mergeTestDescriptions(nestedAZTests, { - ruleName, - config: ['^[A-Z]+$', { resolveNestedSelectors: true }], - }), -); +testRule({ + ruleName, + config: ['^[A-Z]+$', { resolveNestedSelectors: true }], + + ...nestedAZTestsAccept, + + reject: [ + { + code: '.A { &__B { }}', + message: messages.expected('A__B', '^[A-Z]+$'), + line: 1, + column: 6, + }, + ], +}); testRule({ ruleName, @@ -151,15 +171,15 @@ testRule({ reject: [ { code: '.A { .B {} }', - message: messages.expected('A'), + message: messages.expected('A', /^B+$/), }, { code: '.A { & .B {} }', - message: messages.expected('A'), + message: messages.expected('A', /^B+$/), }, { code: '.A { &>.B {} }', - message: messages.expected('A'), + message: messages.expected('A', /^B+$/), }, ], }); diff --git a/lib/rules/selector-class-pattern/index.js b/lib/rules/selector-class-pattern/index.js index 150106b24d..1731ad3cd3 100644 --- a/lib/rules/selector-class-pattern/index.js +++ b/lib/rules/selector-class-pattern/index.js @@ -15,8 +15,8 @@ const validateOptions = require('../../utils/validateOptions'); const ruleName = 'selector-class-pattern'; const messages = ruleMessages(ruleName, { - expected: (selectorValue) => - `Expected class selector ".${selectorValue}" to match specified pattern`, + expected: (selectorValue, pattern) => + `Expected class selector ".${selectorValue}" to match pattern "${pattern}"`, }); function rule(pattern, options) { @@ -44,6 +44,8 @@ function rule(pattern, options) { const shouldResolveNestedSelectors = _.get(options, 'resolveNestedSelectors'); const normalizedPattern = _.isString(pattern) ? new RegExp(pattern) : pattern; + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { const selector = rule.selector; const selectors = rule.selectors; @@ -58,6 +60,8 @@ function rule(pattern, options) { // Only bother resolving selectors that have an interpolating & if (shouldResolveNestedSelectors && hasInterpolatingAmpersand(selector)) { + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow resolveNestedSelector(selector, rule).forEach((selector) => { if (!isStandardSyntaxSelector(selector)) { return; @@ -70,6 +74,8 @@ function rule(pattern, options) { } }); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function checkSelector(fullSelector, rule) { fullSelector.walkClasses((classNode) => { const value = classNode.value; @@ -82,7 +88,7 @@ function rule(pattern, options) { report({ result, ruleName, - message: messages.expected(value), + message: messages.expected(value, pattern), node: rule, index: sourceIndex, }); diff --git a/lib/rules/selector-combinator-allowed-list/index.js b/lib/rules/selector-combinator-allowed-list/index.js index 3b7f6b75a1..b26c67171b 100644 --- a/lib/rules/selector-combinator-allowed-list/index.js +++ b/lib/rules/selector-combinator-allowed-list/index.js @@ -27,6 +27,8 @@ function rule(list) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-combinator-blacklist/__tests__/index.js b/lib/rules/selector-combinator-blacklist/__tests__/index.js index e3ff4b7c43..7585ee6690 100644 --- a/lib/rules/selector-combinator-blacklist/__tests__/index.js +++ b/lib/rules/selector-combinator-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -24,6 +24,12 @@ it('warns that the rule is deprecated', () => { ); }); }); + +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: ['>', ' '], diff --git a/lib/rules/selector-combinator-blacklist/index.js b/lib/rules/selector-combinator-blacklist/index.js index 698dc7df4c..d55740c6b3 100644 --- a/lib/rules/selector-combinator-blacklist/index.js +++ b/lib/rules/selector-combinator-blacklist/index.js @@ -35,6 +35,8 @@ function rule(list) { }, ); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -75,4 +77,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/selector-combinator-disallowed-list/index.js b/lib/rules/selector-combinator-disallowed-list/index.js index c06631c3dc..0b38f47641 100644 --- a/lib/rules/selector-combinator-disallowed-list/index.js +++ b/lib/rules/selector-combinator-disallowed-list/index.js @@ -27,6 +27,8 @@ function rule(list) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-combinator-whitelist/__tests__/index.js b/lib/rules/selector-combinator-whitelist/__tests__/index.js index e08d23c145..cbfa4b6a5c 100644 --- a/lib/rules/selector-combinator-whitelist/__tests__/index.js +++ b/lib/rules/selector-combinator-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: ['>', ' '], diff --git a/lib/rules/selector-combinator-whitelist/index.js b/lib/rules/selector-combinator-whitelist/index.js index a2d28034c4..ca10eff01e 100644 --- a/lib/rules/selector-combinator-whitelist/index.js +++ b/lib/rules/selector-combinator-whitelist/index.js @@ -35,6 +35,8 @@ function rule(list) { }, ); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -75,4 +77,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/selector-descendant-combinator-no-non-space/index.js b/lib/rules/selector-descendant-combinator-no-non-space/index.js index 6835a1b4e9..78394fa0c8 100644 --- a/lib/rules/selector-descendant-combinator-no-non-space/index.js +++ b/lib/rules/selector-descendant-combinator-no-non-space/index.js @@ -24,6 +24,8 @@ function rule(expectation, options, context) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-id-pattern/__tests__/index.js b/lib/rules/selector-id-pattern/__tests__/index.js index 9b51713389..c265d37b6c 100644 --- a/lib/rules/selector-id-pattern/__tests__/index.js +++ b/lib/rules/selector-id-pattern/__tests__/index.js @@ -1,7 +1,5 @@ 'use strict'; -const mergeTestDescriptions = require('../../../testUtils/mergeTestDescriptions'); - const { messages, ruleName } = require('..'); const basicAZTests = { @@ -41,36 +39,51 @@ const basicAZTests = { description: 'custom property set in selector', }, ], +}; + +testRule({ + ruleName, + config: [/^[A-Z]+$/], + + ...basicAZTests, reject: [ { code: 'a #foo {}', - message: messages.expected('foo'), + message: messages.expected('foo', /^[A-Z]+$/), line: 1, column: 3, }, { code: '#ABABA > #bar {}', - message: messages.expected('bar'), + message: messages.expected('bar', /^[A-Z]+$/), line: 1, column: 10, }, ], -}; +}); + +testRule({ + ruleName, + config: ['^[A-Z]+$'], -testRule( - mergeTestDescriptions(basicAZTests, { - ruleName, - config: [/^[A-Z]+$/], - }), -); + ...basicAZTests, -testRule( - mergeTestDescriptions(basicAZTests, { - ruleName, - config: ['^[A-Z]+$'], - }), -); + reject: [ + { + code: 'a #foo {}', + message: messages.expected('foo', '^[A-Z]+$'), + line: 1, + column: 3, + }, + { + code: '#ABABA > #bar {}', + message: messages.expected('bar', '^[A-Z]+$'), + line: 1, + column: 10, + }, + ], +}); testRule({ ruleName, @@ -98,7 +111,7 @@ testRule({ reject: [ { code: 'a { #bar {} }', - message: messages.expected('bar'), + message: messages.expected('bar', /^[A-Z]+$/), line: 1, column: 5, }, diff --git a/lib/rules/selector-id-pattern/index.js b/lib/rules/selector-id-pattern/index.js index a79bf99756..659386e012 100644 --- a/lib/rules/selector-id-pattern/index.js +++ b/lib/rules/selector-id-pattern/index.js @@ -12,8 +12,8 @@ const validateOptions = require('../../utils/validateOptions'); const ruleName = 'selector-id-pattern'; const messages = ruleMessages(ruleName, { - expected: (selectorValue) => - `Expected ID selector "#${selectorValue}" to match specified pattern`, + expected: (selectorValue, pattern) => + `Expected ID selector "#${selectorValue}" to match pattern "${pattern}"`, }); function rule(pattern) { @@ -29,6 +29,8 @@ function rule(pattern) { const normalizedPattern = _.isString(pattern) ? new RegExp(pattern) : pattern; + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -52,7 +54,7 @@ function rule(pattern) { report({ result, ruleName, - message: messages.expected(value), + message: messages.expected(value, pattern), node: rule, index: sourceIndex, }); diff --git a/lib/rules/selector-list-comma-newline-after/index.js b/lib/rules/selector-list-comma-newline-after/index.js index 57defb08f5..022f1fcfba 100644 --- a/lib/rules/selector-list-comma-newline-after/index.js +++ b/lib/rules/selector-list-comma-newline-after/index.js @@ -30,6 +30,8 @@ function rule(expectation, options, context) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-max-attribute/index.js b/lib/rules/selector-max-attribute/index.js index f0a4f9c3c6..c6fa88ca62 100644 --- a/lib/rules/selector-max-attribute/index.js +++ b/lib/rules/selector-max-attribute/index.js @@ -29,6 +29,8 @@ function rule(max, options) { { actual: max, possible: [ + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function (max) { return typeof max === 'number' && max >= 0; }, diff --git a/lib/rules/selector-max-class/index.js b/lib/rules/selector-max-class/index.js index 8e08e1a4ed..ad1facac4e 100644 --- a/lib/rules/selector-max-class/index.js +++ b/lib/rules/selector-max-class/index.js @@ -22,6 +22,8 @@ function rule(max) { const validOptions = validateOptions(result, ruleName, { actual: max, possible: [ + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function (max) { return typeof max === 'number' && max >= 0; }, diff --git a/lib/rules/selector-max-combinators/index.js b/lib/rules/selector-max-combinators/index.js index bbb056d395..071fc44355 100644 --- a/lib/rules/selector-max-combinators/index.js +++ b/lib/rules/selector-max-combinators/index.js @@ -23,6 +23,8 @@ function rule(max) { const validOptions = validateOptions(result, ruleName, { actual: max, possible: [ + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function (max) { return typeof max === 'number' && max >= 0; }, diff --git a/lib/rules/selector-max-compound-selectors/index.js b/lib/rules/selector-max-compound-selectors/index.js index 92ed6145ec..0a59bf328c 100644 --- a/lib/rules/selector-max-compound-selectors/index.js +++ b/lib/rules/selector-max-compound-selectors/index.js @@ -24,6 +24,8 @@ function rule(max) { const validOptions = validateOptions(result, ruleName, { actual: max, possible: [ + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function (max) { return typeof max === 'number' && max > 0; }, @@ -35,6 +37,8 @@ function rule(max) { } // Finds actual selectors in selectorNode object and checks them + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function checkSelector(selectorNode, rule) { let compoundCount = 1; @@ -61,6 +65,8 @@ function rule(max) { } } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-max-empty-lines/index.js b/lib/rules/selector-max-empty-lines/index.js index 57b9c0fe39..27bb2a389a 100644 --- a/lib/rules/selector-max-empty-lines/index.js +++ b/lib/rules/selector-max-empty-lines/index.js @@ -31,6 +31,8 @@ function rule(max, options, context) { const allowedLFNewLinesString = context.fix ? '\n'.repeat(maxAdjacentNewlines) : ''; const allowedCRLFNewLinesString = context.fix ? '\r\n'.repeat(maxAdjacentNewlines) : ''; + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { const selector = rule.raws.selector ? rule.raws.selector.raw : rule.selector; diff --git a/lib/rules/selector-max-id/index.js b/lib/rules/selector-max-id/index.js index 91555fe03d..c38fae5507 100644 --- a/lib/rules/selector-max-id/index.js +++ b/lib/rules/selector-max-id/index.js @@ -27,6 +27,8 @@ function rule(max, options) { { actual: max, possible: [ + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function (max) { return typeof max === 'number' && max >= 0; }, @@ -70,6 +72,8 @@ function rule(max, options) { } } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function isIgnoredContextFunctionalPseudoClass(node, options) { return ( node.type === 'pseudo' && diff --git a/lib/rules/selector-max-pseudo-class/index.js b/lib/rules/selector-max-pseudo-class/index.js index fc8d581a98..d129232c50 100644 --- a/lib/rules/selector-max-pseudo-class/index.js +++ b/lib/rules/selector-max-pseudo-class/index.js @@ -23,6 +23,8 @@ function rule(max) { const validOptions = validateOptions(result, ruleName, { actual: max, possible: [ + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function (max) { return typeof max === 'number' && max >= 0; }, diff --git a/lib/rules/selector-max-specificity/index.js b/lib/rules/selector-max-specificity/index.js index d4268523d3..1fad08bbd4 100755 --- a/lib/rules/selector-max-specificity/index.js +++ b/lib/rules/selector-max-specificity/index.js @@ -17,6 +17,8 @@ const validateOptions = require('../../utils/validateOptions'); const ruleName = 'selector-max-specificity'; const messages = ruleMessages(ruleName, { + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow expected: (selector, specificity) => `Expected "${selector}" to have a specificity no more than "${specificity}"`, }); @@ -45,6 +47,8 @@ function rule(max, options) { { actual: max, possible: [ + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function (max) { // Check that the max specificity is in the form "a,b,c" return /^\d+,\d+,\d+$/.test(max); @@ -75,6 +79,8 @@ function rule(max, options) { // Calculate the the specificity of the most specific direct child const maxChildSpecificity = (node) => + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow node.reduce((max, child) => { const childSpecificity = nodeSpecificity(child); // eslint-disable-line no-use-before-define @@ -140,6 +146,8 @@ function rule(max, options) { const maxSpecificityArray = `0,${max}`.split(',').map(parseFloat); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-max-type/index.js b/lib/rules/selector-max-type/index.js index 0b4502c660..5a1a77037b 100644 --- a/lib/rules/selector-max-type/index.js +++ b/lib/rules/selector-max-type/index.js @@ -32,6 +32,8 @@ function rule(max, options) { ruleName, { actual: max, + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow possible(max) { return typeof max === 'number' && max >= 0; }, diff --git a/lib/rules/selector-max-universal/index.js b/lib/rules/selector-max-universal/index.js index d6b9219bec..5bac09ce7a 100644 --- a/lib/rules/selector-max-universal/index.js +++ b/lib/rules/selector-max-universal/index.js @@ -24,6 +24,8 @@ function rule(max) { const validOptions = validateOptions(result, ruleName, { actual: max, possible: [ + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function (max) { return typeof max === 'number' && max >= 0; }, diff --git a/lib/rules/selector-nested-pattern/__tests__/index.js b/lib/rules/selector-nested-pattern/__tests__/index.js index bd463cee4c..e05a21dff5 100644 --- a/lib/rules/selector-nested-pattern/__tests__/index.js +++ b/lib/rules/selector-nested-pattern/__tests__/index.js @@ -1,6 +1,5 @@ 'use strict'; -const mergeTestDescriptions = require('../../../testUtils/mergeTestDescriptions'); const stripIndent = require('common-tags').stripIndent; const { messages, ruleName } = require('..'); @@ -38,11 +37,18 @@ const basicAZTests = { description: 'custom property set in selector', }, ], +}; + +testRule({ + ruleName, + config: [/^[A-Z]+$/], + + ...basicAZTests, reject: [ { code: 'a { b {} }', - message: messages.expected('b'), + message: messages.expected('b', /^[A-Z]+$/), line: 1, column: 5, }, @@ -53,32 +59,51 @@ const basicAZTests = { span {} } }`, - message: messages.expected('span'), + message: messages.expected('span', /^[A-Z]+$/), line: 3, column: 5, }, { code: '@media print { a { b {} } }', - message: messages.expected('b'), + message: messages.expected('b', /^[A-Z]+$/), line: 1, column: 20, }, ], -}; +}); -testRule( - mergeTestDescriptions(basicAZTests, { - ruleName, - config: [/^[A-Z]+$/], - }), -); +testRule({ + ruleName, + config: ['^[A-Z]+$'], + + ...basicAZTests, -testRule( - mergeTestDescriptions(basicAZTests, { - ruleName, - config: ['^[A-Z]+$'], - }), -); + reject: [ + { + code: 'a { b {} }', + message: messages.expected('b', '^[A-Z]+$'), + line: 1, + column: 5, + }, + { + code: stripIndent` + a { + DIV { + span {} + } + }`, + message: messages.expected('span', '^[A-Z]+$'), + line: 3, + column: 5, + }, + { + code: '@media print { a { b {} } }', + message: messages.expected('b', '^[A-Z]+$'), + line: 1, + column: 20, + }, + ], +}); testRule({ ruleName, @@ -99,19 +124,19 @@ testRule({ reject: [ { code: '.foo { .bar {} }', - message: messages.expected('.bar'), + message: messages.expected('.bar', '^&:(?:hover|focus)$'), line: 1, column: 8, }, { code: '.foo { .bar:hover {} }', - message: messages.expected('.bar:hover'), + message: messages.expected('.bar:hover', '^&:(?:hover|focus)$'), line: 1, column: 8, }, { code: '.foo { &:hover, &focus {} }', - message: messages.expected('&:hover, &focus'), + message: messages.expected('&:hover, &focus', '^&:(?:hover|focus)$'), line: 1, column: 8, }, diff --git a/lib/rules/selector-nested-pattern/index.js b/lib/rules/selector-nested-pattern/index.js index 816499e769..11e0a8e4a3 100644 --- a/lib/rules/selector-nested-pattern/index.js +++ b/lib/rules/selector-nested-pattern/index.js @@ -11,7 +11,8 @@ const validateOptions = require('../../utils/validateOptions'); const ruleName = 'selector-nested-pattern'; const messages = ruleMessages(ruleName, { - expected: (selector) => `Expected nested selector "${selector}" to match specified pattern`, + expected: (selector, pattern) => + `Expected nested selector "${selector}" to match pattern "${pattern}"`, }); function rule(pattern) { @@ -27,6 +28,8 @@ function rule(pattern) { const normalizedPattern = _.isString(pattern) ? new RegExp(pattern) : pattern; + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (rule.parent.type !== 'rule') { return; @@ -45,7 +48,7 @@ function rule(pattern) { report({ result, ruleName, - message: messages.expected(selector), + message: messages.expected(selector, pattern), node: rule, }); }); diff --git a/lib/rules/selector-no-qualifying-type/index.js b/lib/rules/selector-no-qualifying-type/index.js index 75ee36e564..429755bec0 100644 --- a/lib/rules/selector-no-qualifying-type/index.js +++ b/lib/rules/selector-no-qualifying-type/index.js @@ -65,6 +65,8 @@ function rule(enabled, options) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-no-vendor-prefix/index.js b/lib/rules/selector-no-vendor-prefix/index.js index 9f768f586e..6f44df3960 100644 --- a/lib/rules/selector-no-vendor-prefix/index.js +++ b/lib/rules/selector-no-vendor-prefix/index.js @@ -36,6 +36,8 @@ function rule(actual, options, context) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-pseudo-class-allowed-list/index.js b/lib/rules/selector-pseudo-class-allowed-list/index.js index 55f3da6f6b..9810604fa8 100644 --- a/lib/rules/selector-pseudo-class-allowed-list/index.js +++ b/lib/rules/selector-pseudo-class-allowed-list/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); const parseSelector = require('../../utils/parseSelector'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'selector-pseudo-class-allowed-list'; @@ -28,6 +28,8 @@ function rule(list) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -50,7 +52,7 @@ function rule(list) { const name = value.slice(1); - if (matchesStringOrRegExp(postcss.vendor.unprefixed(name), list)) { + if (matchesStringOrRegExp(vendor.unprefixed(name), list)) { return; } diff --git a/lib/rules/selector-pseudo-class-blacklist/__tests__/index.js b/lib/rules/selector-pseudo-class-blacklist/__tests__/index.js index 9ee952df21..74a37f09a0 100644 --- a/lib/rules/selector-pseudo-class-blacklist/__tests__/index.js +++ b/lib/rules/selector-pseudo-class-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: ['focus', 'global', 'input-placeholder', 'not', 'nth-last-child', 'has'], diff --git a/lib/rules/selector-pseudo-class-blacklist/index.js b/lib/rules/selector-pseudo-class-blacklist/index.js index 73040ba475..693b57f621 100644 --- a/lib/rules/selector-pseudo-class-blacklist/index.js +++ b/lib/rules/selector-pseudo-class-blacklist/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); const parseSelector = require('../../utils/parseSelector'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'selector-pseudo-class-blacklist'; @@ -36,6 +36,8 @@ function rule(list) { }, ); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -59,7 +61,7 @@ function rule(list) { const name = value.slice(1); - if (!matchesStringOrRegExp(postcss.vendor.unprefixed(name), list)) { + if (!matchesStringOrRegExp(vendor.unprefixed(name), list)) { return; } @@ -80,4 +82,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/selector-pseudo-class-case/index.js b/lib/rules/selector-pseudo-class-case/index.js index 42b4443685..132031ed89 100644 --- a/lib/rules/selector-pseudo-class-case/index.js +++ b/lib/rules/selector-pseudo-class-case/index.js @@ -27,6 +27,8 @@ function rule(expectation, options, context) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-pseudo-class-disallowed-list/index.js b/lib/rules/selector-pseudo-class-disallowed-list/index.js index ff36ae15ce..a12e472be9 100644 --- a/lib/rules/selector-pseudo-class-disallowed-list/index.js +++ b/lib/rules/selector-pseudo-class-disallowed-list/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); const parseSelector = require('../../utils/parseSelector'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'selector-pseudo-class-disallowed-list'; @@ -28,6 +28,8 @@ function rule(list) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -51,7 +53,7 @@ function rule(list) { const name = value.slice(1); - if (!matchesStringOrRegExp(postcss.vendor.unprefixed(name), list)) { + if (!matchesStringOrRegExp(vendor.unprefixed(name), list)) { return; } diff --git a/lib/rules/selector-pseudo-class-no-unknown/index.js b/lib/rules/selector-pseudo-class-no-unknown/index.js index c00c0b7fdc..bb59f52480 100644 --- a/lib/rules/selector-pseudo-class-no-unknown/index.js +++ b/lib/rules/selector-pseudo-class-no-unknown/index.js @@ -11,10 +11,10 @@ const isStandardSyntaxSelector = require('../../utils/isStandardSyntaxSelector') const keywordSets = require('../../reference/keywordSets'); const optionsMatches = require('../../utils/optionsMatches'); const parseSelector = require('../../utils/parseSelector'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'selector-pseudo-class-no-unknown'; @@ -41,6 +41,8 @@ function rule(actual, options) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function check(selector, result, node) { parseSelector(selector, result, node, (selectorTree) => { selectorTree.walkPseudos((pseudoNode) => { @@ -74,7 +76,7 @@ function rule(actual, options) { index = atRuleParamIndex(node) + pseudoNode.sourceIndex; } else { if ( - postcss.vendor.prefix(name) || + vendor.prefix(name) || keywordSets.pseudoClasses.has(name) || keywordSets.pseudoElements.has(name) ) { @@ -92,7 +94,7 @@ function rule(actual, options) { } while (prevPseudoElement); if (prevPseudoElement) { - const prevPseudoElementValue = postcss.vendor.unprefixed( + const prevPseudoElementValue = vendor.unprefixed( prevPseudoElement.value.toLowerCase().slice(2), ); diff --git a/lib/rules/selector-pseudo-class-parentheses-space-inside/index.js b/lib/rules/selector-pseudo-class-parentheses-space-inside/index.js index 70cf7645fd..cc43a55ec6 100644 --- a/lib/rules/selector-pseudo-class-parentheses-space-inside/index.js +++ b/lib/rules/selector-pseudo-class-parentheses-space-inside/index.js @@ -28,6 +28,8 @@ function rule(expectation, options, context) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-pseudo-class-whitelist/__tests__/index.js b/lib/rules/selector-pseudo-class-whitelist/__tests__/index.js index 136f7392a1..46ca294a12 100644 --- a/lib/rules/selector-pseudo-class-whitelist/__tests__/index.js +++ b/lib/rules/selector-pseudo-class-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: ['hover', 'nth-child', 'root', 'placeholder', 'has'], diff --git a/lib/rules/selector-pseudo-class-whitelist/index.js b/lib/rules/selector-pseudo-class-whitelist/index.js index 8f9d8d8773..37fd432ec7 100644 --- a/lib/rules/selector-pseudo-class-whitelist/index.js +++ b/lib/rules/selector-pseudo-class-whitelist/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); const parseSelector = require('../../utils/parseSelector'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'selector-pseudo-class-whitelist'; @@ -36,6 +36,8 @@ function rule(list) { }, ); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -58,7 +60,7 @@ function rule(list) { const name = value.slice(1); - if (matchesStringOrRegExp(postcss.vendor.unprefixed(name), list)) { + if (matchesStringOrRegExp(vendor.unprefixed(name), list)) { return; } @@ -79,4 +81,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/selector-pseudo-element-allowed-list/index.js b/lib/rules/selector-pseudo-element-allowed-list/index.js index 3c39bf2e9d..5dc0b17ca3 100644 --- a/lib/rules/selector-pseudo-element-allowed-list/index.js +++ b/lib/rules/selector-pseudo-element-allowed-list/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); const parseSelector = require('../../utils/parseSelector'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'selector-pseudo-element-allowed-list'; @@ -28,6 +28,8 @@ function rule(list) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -50,7 +52,7 @@ function rule(list) { const name = value.slice(2); - if (matchesStringOrRegExp(postcss.vendor.unprefixed(name), list)) { + if (matchesStringOrRegExp(vendor.unprefixed(name), list)) { return; } diff --git a/lib/rules/selector-pseudo-element-blacklist/__tests__/index.js b/lib/rules/selector-pseudo-element-blacklist/__tests__/index.js index 77cf01b66b..ad20bc0bcd 100644 --- a/lib/rules/selector-pseudo-element-blacklist/__tests__/index.js +++ b/lib/rules/selector-pseudo-element-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: ['before', 'selection', /^my/i], diff --git a/lib/rules/selector-pseudo-element-blacklist/index.js b/lib/rules/selector-pseudo-element-blacklist/index.js index 8333f37bbb..2839755ba7 100644 --- a/lib/rules/selector-pseudo-element-blacklist/index.js +++ b/lib/rules/selector-pseudo-element-blacklist/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); const parseSelector = require('../../utils/parseSelector'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'selector-pseudo-element-blacklist'; @@ -36,6 +36,8 @@ function rule(list) { }, ); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -58,7 +60,7 @@ function rule(list) { const name = value.slice(2); - if (!matchesStringOrRegExp(postcss.vendor.unprefixed(name), list)) { + if (!matchesStringOrRegExp(vendor.unprefixed(name), list)) { return; } @@ -79,4 +81,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/selector-pseudo-element-case/index.js b/lib/rules/selector-pseudo-element-case/index.js index bb242bcc6a..26682ff091 100644 --- a/lib/rules/selector-pseudo-element-case/index.js +++ b/lib/rules/selector-pseudo-element-case/index.js @@ -27,6 +27,8 @@ function rule(expectation, options, context) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-pseudo-element-colon-notation/index.js b/lib/rules/selector-pseudo-element-colon-notation/index.js index 1ab178bef2..6b0043a922 100644 --- a/lib/rules/selector-pseudo-element-colon-notation/index.js +++ b/lib/rules/selector-pseudo-element-colon-notation/index.js @@ -26,6 +26,8 @@ function rule(expectation, options, context) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/selector-pseudo-element-disallowed-list/index.js b/lib/rules/selector-pseudo-element-disallowed-list/index.js index 0c9552b39b..578733d184 100644 --- a/lib/rules/selector-pseudo-element-disallowed-list/index.js +++ b/lib/rules/selector-pseudo-element-disallowed-list/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); const parseSelector = require('../../utils/parseSelector'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'selector-pseudo-element-disallowed-list'; @@ -28,6 +28,8 @@ function rule(list) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -50,7 +52,7 @@ function rule(list) { const name = value.slice(2); - if (!matchesStringOrRegExp(postcss.vendor.unprefixed(name), list)) { + if (!matchesStringOrRegExp(vendor.unprefixed(name), list)) { return; } diff --git a/lib/rules/selector-pseudo-element-no-unknown/index.js b/lib/rules/selector-pseudo-element-no-unknown/index.js index 54d2ecb570..055e72af54 100644 --- a/lib/rules/selector-pseudo-element-no-unknown/index.js +++ b/lib/rules/selector-pseudo-element-no-unknown/index.js @@ -8,10 +8,10 @@ const isStandardSyntaxSelector = require('../../utils/isStandardSyntaxSelector') const keywordSets = require('../../reference/keywordSets'); const optionsMatches = require('../../utils/optionsMatches'); const parseSelector = require('../../utils/parseSelector'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'selector-pseudo-element-no-unknown'; @@ -38,6 +38,8 @@ function rule(actual, options) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -70,7 +72,7 @@ function rule(actual, options) { const name = value.slice(2); - if (postcss.vendor.prefix(name) || keywordSets.pseudoElements.has(name.toLowerCase())) { + if (vendor.prefix(name) || keywordSets.pseudoElements.has(name.toLowerCase())) { return; } diff --git a/lib/rules/selector-pseudo-element-whitelist/__tests__/index.js b/lib/rules/selector-pseudo-element-whitelist/__tests__/index.js index 20823c8a20..95a1944a54 100644 --- a/lib/rules/selector-pseudo-element-whitelist/__tests__/index.js +++ b/lib/rules/selector-pseudo-element-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, config: ['before', 'selection', /^my/i], diff --git a/lib/rules/selector-pseudo-element-whitelist/index.js b/lib/rules/selector-pseudo-element-whitelist/index.js index 949785a55b..428a7a3c7f 100644 --- a/lib/rules/selector-pseudo-element-whitelist/index.js +++ b/lib/rules/selector-pseudo-element-whitelist/index.js @@ -6,10 +6,10 @@ const _ = require('lodash'); const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule'); const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp'); const parseSelector = require('../../utils/parseSelector'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'selector-pseudo-element-whitelist'; @@ -36,6 +36,8 @@ function rule(list) { }, ); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { if (!isStandardSyntaxRule(rule)) { return; @@ -58,7 +60,7 @@ function rule(list) { const name = value.slice(2); - if (matchesStringOrRegExp(postcss.vendor.unprefixed(name), list)) { + if (matchesStringOrRegExp(vendor.unprefixed(name), list)) { return; } @@ -79,4 +81,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/selector-type-case/index.js b/lib/rules/selector-type-case/index.js index de27df6308..8c371a6c80 100644 --- a/lib/rules/selector-type-case/index.js +++ b/lib/rules/selector-type-case/index.js @@ -40,6 +40,8 @@ function rule(expectation, options, context) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { let hasComments = _.get(rule, 'raws.selector.raw'); const selector = hasComments ? hasComments : rule.selector; diff --git a/lib/rules/selector-type-no-unknown/index.js b/lib/rules/selector-type-no-unknown/index.js index e65bea6c06..e2cf813da6 100644 --- a/lib/rules/selector-type-no-unknown/index.js +++ b/lib/rules/selector-type-no-unknown/index.js @@ -44,6 +44,8 @@ function rule(actual, options) { return; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow root.walkRules((rule) => { const selector = rule.selector; const selectors = rule.selectors; diff --git a/lib/rules/shorthand-property-no-redundant-values/index.js b/lib/rules/shorthand-property-no-redundant-values/index.js index aea549e688..5550d192fb 100644 --- a/lib/rules/shorthand-property-no-redundant-values/index.js +++ b/lib/rules/shorthand-property-no-redundant-values/index.js @@ -4,11 +4,11 @@ const isStandardSyntaxDeclaration = require('../../utils/isStandardSyntaxDeclaration'); const isStandardSyntaxProperty = require('../../utils/isStandardSyntaxProperty'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); +const vendor = require('../../utils/vendor'); const ruleName = 'shorthand-property-no-redundant-values'; @@ -90,7 +90,7 @@ function rule(actual, secondary, context) { const prop = decl.prop; const value = decl.value; - const normalizedProp = postcss.vendor.unprefixed(prop.toLowerCase()); + const normalizedProp = vendor.unprefixed(prop.toLowerCase()); if (hasIgnoredCharacters(value) || !isShorthandProperty(normalizedProp)) { return; @@ -111,6 +111,8 @@ function rule(actual, secondary, context) { } const shortestForm = canCondense(...valuesToShorthand); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow const shortestFormString = shortestForm.filter((value) => value).join(' '); const valuesFormString = valuesToShorthand.join(' '); diff --git a/lib/rules/string-no-newline/index.js b/lib/rules/string-no-newline/index.js index 357e8d7396..328d086087 100644 --- a/lib/rules/string-no-newline/index.js +++ b/lib/rules/string-no-newline/index.js @@ -40,6 +40,8 @@ function rule(actual) { } }); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function checkRule(rule) { // Get out quickly if there are no new line if (!reNewLine.test(rule.selector)) { diff --git a/lib/rules/string-quotes/index.js b/lib/rules/string-quotes/index.js index eb5793b527..076a5b8450 100644 --- a/lib/rules/string-quotes/index.js +++ b/lib/rules/string-quotes/index.js @@ -62,6 +62,8 @@ function rule(expectation, secondary, context) { } }); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow function checkRule(rule) { if (!isStandardSyntaxRule(rule)) { return; diff --git a/lib/rules/time-min-milliseconds/index.js b/lib/rules/time-min-milliseconds/index.js index 7971a757b1..0e36002d66 100644 --- a/lib/rules/time-min-milliseconds/index.js +++ b/lib/rules/time-min-milliseconds/index.js @@ -11,6 +11,7 @@ const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); +const vendor = require('../../utils/vendor'); const ruleName = 'time-min-milliseconds'; @@ -43,7 +44,7 @@ function rule(minimum, options) { } root.walkDecls((decl) => { - const propertyName = postcss.vendor.unprefixed(decl.prop.toLowerCase()); + const propertyName = vendor.unprefixed(decl.prop.toLowerCase()); if ( keywordSets.longhandTimeProperties.has(propertyName) && diff --git a/lib/rules/unit-blacklist/__tests__/index.js b/lib/rules/unit-blacklist/__tests__/index.js index 728701be94..20cb4bee23 100644 --- a/lib/rules/unit-blacklist/__tests__/index.js +++ b/lib/rules/unit-blacklist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/unit-blacklist/index.js b/lib/rules/unit-blacklist/index.js index b27a5ae3e7..dc8abc6465 100644 --- a/lib/rules/unit-blacklist/index.js +++ b/lib/rules/unit-blacklist/index.js @@ -127,4 +127,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/unit-case/index.js b/lib/rules/unit-case/index.js index 81df6675b4..6f97f3df8c 100644 --- a/lib/rules/unit-case/index.js +++ b/lib/rules/unit-case/index.js @@ -54,6 +54,8 @@ function rule(expectation, options, context) { const parsedValue = valueParser(value).walk((valueNode) => { // Ignore wrong units within `url` function let needFix = false; + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow const value = valueNode.value; if (valueNode.type === 'function' && value.toLowerCase() === 'url') { diff --git a/lib/rules/unit-no-unknown/index.js b/lib/rules/unit-no-unknown/index.js index a7378b3605..9375db59d1 100644 --- a/lib/rules/unit-no-unknown/index.js +++ b/lib/rules/unit-no-unknown/index.js @@ -10,11 +10,11 @@ const isMap = require('../../utils/isMap'); const keywordSets = require('../../reference/keywordSets'); const mediaParser = require('postcss-media-query-parser').default; const optionsMatches = require('../../utils/optionsMatches'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); const valueParser = require('postcss-value-parser'); +const vendor = require('../../utils/vendor'); const ruleName = 'unit-no-unknown'; @@ -65,6 +65,8 @@ function rule(actual, options) { } if (isMap(valueNode)) { + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow valueNode.nodes.forEach((node, index) => { if (!(index % mapPropertyNameIndexOffset)) { ignoredMapProperties.push(node.sourceIndex); @@ -121,7 +123,9 @@ function rule(actual, options) { if (/^(?:-webkit-)?image-set[\s(]/i.test(value)) { const imageSet = parsedValue.nodes.find( - (node) => postcss.vendor.unprefixed(node.value) === 'image-set', + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow + (node) => vendor.unprefixed(node.value) === 'image-set', ); const imageSetValueLastIndex = _.last(imageSet.nodes).sourceIndex; diff --git a/lib/rules/unit-whitelist/__tests__/index.js b/lib/rules/unit-whitelist/__tests__/index.js index 07ef614ca0..9c5f3f79d2 100644 --- a/lib/rules/unit-whitelist/__tests__/index.js +++ b/lib/rules/unit-whitelist/__tests__/index.js @@ -1,7 +1,7 @@ 'use strict'; const standalone = require('../../../standalone'); -const { messages, ruleName } = require('..'); +const { messages, ruleName, meta } = require('..'); it('warns that the rule is deprecated', () => { const config = { @@ -25,6 +25,11 @@ it('warns that the rule is deprecated', () => { }); }); +it('also warns that the rule is deprecated via a meta', () => { + expect(meta).not.toBeUndefined(); + expect(meta).toHaveProperty('deprecated', true); +}); + testRule({ ruleName, diff --git a/lib/rules/unit-whitelist/index.js b/lib/rules/unit-whitelist/index.js index b9f6b18b9f..86eea330e9 100644 --- a/lib/rules/unit-whitelist/index.js +++ b/lib/rules/unit-whitelist/index.js @@ -87,4 +87,6 @@ rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; +rule.meta = { deprecated: true }; + module.exports = rule; diff --git a/lib/rules/value-no-vendor-prefix/index.js b/lib/rules/value-no-vendor-prefix/index.js index ba4b3609c3..416b28c0f0 100644 --- a/lib/rules/value-no-vendor-prefix/index.js +++ b/lib/rules/value-no-vendor-prefix/index.js @@ -7,11 +7,11 @@ const isAutoprefixable = require('../../utils/isAutoprefixable'); const isStandardSyntaxDeclaration = require('../../utils/isStandardSyntaxDeclaration'); const isStandardSyntaxProperty = require('../../utils/isStandardSyntaxProperty'); const optionsMatches = require('../../utils/optionsMatches'); -const postcss = require('postcss'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const styleSearch = require('style-search'); const validateOptions = require('../../utils/validateOptions'); +const vendor = require('../../utils/vendor'); const ruleName = 'value-no-vendor-prefix'; @@ -51,7 +51,7 @@ function rule(actual, options, context) { const prop = decl.prop; const value = decl.value; - const unprefixedValue = postcss.vendor.unprefixed(value); + const unprefixedValue = vendor.unprefixed(value); //return early if value is to be ignored if (optionsMatches(options, 'ignoreValues', unprefixedValue)) { diff --git a/lib/standalone.js b/lib/standalone.js index 9674e2ff34..69d2d3c86e 100644 --- a/lib/standalone.js +++ b/lib/standalone.js @@ -179,14 +179,12 @@ module.exports = function (options) { } fileList = fileList.map((entry) => { - if (globby.hasMagic(entry)) { - const cwd = _.get(globbyOptions, 'cwd', process.cwd()); - const absolutePath = !path.isAbsolute(entry) ? path.join(cwd, entry) : path.normalize(entry); + const cwd = _.get(globbyOptions, 'cwd', process.cwd()); + const absolutePath = !path.isAbsolute(entry) ? path.join(cwd, entry) : path.normalize(entry); - if (fs.existsSync(absolutePath)) { - // This glob-like path points to a file. Return an escaped path to avoid globbing - return fastGlob.escapePath(entry); - } + if (fs.existsSync(absolutePath)) { + // This path points to a file. Return an escaped path to avoid globbing + return fastGlob.escapePath(entry); } return entry; diff --git a/lib/utils/__tests__/declarationValueIndex.test.js b/lib/utils/__tests__/declarationValueIndex.test.js index b6b0ed4dd8..464e9d3a82 100644 --- a/lib/utils/__tests__/declarationValueIndex.test.js +++ b/lib/utils/__tests__/declarationValueIndex.test.js @@ -28,6 +28,8 @@ describe('declarationValueIndex', () => { function decl(css) { const list = []; + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow postcss.parse(css).walkDecls((decl) => list.push(decl)); return list[0]; diff --git a/lib/utils/__tests__/findAtRuleContext.test.js b/lib/utils/__tests__/findAtRuleContext.test.js index 0d32536094..3718ec5914 100644 --- a/lib/utils/__tests__/findAtRuleContext.test.js +++ b/lib/utils/__tests__/findAtRuleContext.test.js @@ -5,31 +5,24 @@ const postcss = require('postcss'); it('findAtRuleContext', () => { const css = ` - a {} - @media print { - b {} - } - @media (min-width: 900px) { - c {} - } - d {} - `; + a {} + @media print { + b {} + } + @media (min-width: 900px) { + c {} + } + `; - postcss.parse(css).walkRules((rule) => { - switch (rule.selector) { - case 'a': - expect(findAtRuleContext(rule)).toBeNull(); - break; - case 'b': - expect(findAtRuleContext(rule).params).toBe('print'); - break; - case 'c': - expect(findAtRuleContext(rule).params).toBe('(min-width: 900px)'); - break; - case 'd': - expect(findAtRuleContext(rule)).toBeNull(); - break; - default: - } - }); + expect(findAtRuleContext(rule(css, 'a'))).toBeNull(); + expect(findAtRuleContext(rule(css, 'b'))).toHaveProperty('params', 'print'); + expect(findAtRuleContext(rule(css, 'c'))).toHaveProperty('params', '(min-width: 900px)'); }); + +function rule(css, selector) { + const rules = []; + + postcss.parse(css).walkRules(selector, (r) => rules.push(r)); + + return rules[0]; +} diff --git a/lib/utils/__tests__/isContextFunctionalPseudoClass.test.js b/lib/utils/__tests__/isContextFunctionalPseudoClass.test.js index f3f506128b..4c8b642df1 100644 --- a/lib/utils/__tests__/isContextFunctionalPseudoClass.test.js +++ b/lib/utils/__tests__/isContextFunctionalPseudoClass.test.js @@ -4,45 +4,33 @@ const isContextFunctionalPseudoClass = require('../isContextFunctionalPseudoClas const parseSelector = require('postcss-selector-parser'); const postcss = require('postcss'); -function selector(css, cb) { +function pseudo(css) { + const pseudos = []; + postcss.parse(css).walkRules((rule) => { parseSelector((selectorAST) => { - selectorAST.walkPseudos(cb); + selectorAST.walkPseudos((p) => pseudos.push(p)); }).processSync(rule.selector); }); + + return pseudos[0]; } describe('isContextFunctionalPseudoClass', () => { it('handles non-context-functional pseudo-classes, like hover', () => { - selector('a:hover {}', (selector) => { - expect(isContextFunctionalPseudoClass(selector)).toBe(false); - }); + expect(isContextFunctionalPseudoClass(pseudo('a:hover {}'))).toBe(false); }); - it('handles logical combinations, ', () => { - selector('a:has(.foo) {}', (selector) => { - expect(isContextFunctionalPseudoClass(selector)).toBe(true); - }); - selector('a:is(.foo) {}', (selector) => { - expect(isContextFunctionalPseudoClass(selector)).toBe(true); - }); - selector('a:matches(.foo) {}', (selector) => { - expect(isContextFunctionalPseudoClass(selector)).toBe(true); - }); - selector('a:not(.foo) {}', (selector) => { - expect(isContextFunctionalPseudoClass(selector)).toBe(true); - }); - selector('a:where(.foo) {}', (selector) => { - expect(isContextFunctionalPseudoClass(selector)).toBe(true); - }); + it('handles logical combinations', () => { + expect(isContextFunctionalPseudoClass(pseudo('a:has(.foo) {}'))).toBe(true); + expect(isContextFunctionalPseudoClass(pseudo('a:is(.foo) {}'))).toBe(true); + expect(isContextFunctionalPseudoClass(pseudo('a:matches(.foo) {}'))).toBe(true); + expect(isContextFunctionalPseudoClass(pseudo('a:not(.foo) {}'))).toBe(true); + expect(isContextFunctionalPseudoClass(pseudo('a:where(.foo) {}'))).toBe(true); }); it('handles tree structural/NPlusBOfSNotationPseudoClasses classes', () => { - selector('a:nth-child(n+7) {}', (selector) => { - expect(isContextFunctionalPseudoClass(selector)).toBe(true); - }); - selector('a:nth-last-child(n+7) {}', (selector) => { - expect(isContextFunctionalPseudoClass(selector)).toBe(true); - }); + expect(isContextFunctionalPseudoClass(pseudo('a:nth-child(n+7) {}'))).toBe(true); + expect(isContextFunctionalPseudoClass(pseudo('a:nth-last-child(n+7) {}'))).toBe(true); }); }); diff --git a/lib/utils/__tests__/isKeyframeRule.test.js b/lib/utils/__tests__/isKeyframeRule.test.js index d45875a212..15115f5ceb 100644 --- a/lib/utils/__tests__/isKeyframeRule.test.js +++ b/lib/utils/__tests__/isKeyframeRule.test.js @@ -5,66 +5,89 @@ const postcss = require('postcss'); describe('isKeyframeRule', () => { it('detects a standard keyframe rule', () => { - rules('@keyframes identifier { to {} }', (rule) => { - expect(isKeyframeRule(rule)).toBeTruthy(); - }); + const nodes = nodesIn('@keyframes identifier { to {} }'); + + expect(nodes).toHaveLength(2); + expect(isKeyframeRule(nodes[0])).toBeFalsy(); + expect(isKeyframeRule(nodes[1])).toBeTruthy(); }); it('detects a mixed-case keyframe rule', () => { - rules('@kEyFrAmEs identifier { to {} }', (rule) => { - expect(isKeyframeRule(rule)).toBeTruthy(); - }); + const nodes = nodesIn('@kEyFrAmEs identifier { to {} }'); + + expect(nodes).toHaveLength(2); + expect(isKeyframeRule(nodes[0])).toBeFalsy(); + expect(isKeyframeRule(nodes[1])).toBeTruthy(); }); it('detects an upper-case keyframe rule', () => { - rules('@KEYFRAMES identifier { to {} }', (rule) => { - expect(isKeyframeRule(rule)).toBeTruthy(); - }); + const nodes = nodesIn('@KEYFRAMES identifier { to {} }'); + + expect(nodes).toHaveLength(2); + expect(isKeyframeRule(nodes[0])).toBeFalsy(); + expect(isKeyframeRule(nodes[1])).toBeTruthy(); }); it('detects a keyframe rule with nested from decl', () => { - rules('@keyframes identifier { from {} }', (rule) => { - expect(isKeyframeRule(rule)).toBeTruthy(); - }); + const nodes = nodesIn('@keyframes identifier { from {} }'); + + expect(nodes).toHaveLength(2); + expect(isKeyframeRule(nodes[0])).toBeFalsy(); + expect(isKeyframeRule(nodes[1])).toBeTruthy(); }); it('detects a keyframe rule with nested percentage decl', () => { - rules('@keyframes identifier { 50% {} }', (rule) => { - expect(isKeyframeRule(rule)).toBeTruthy(); - }); + const nodes = nodesIn('@keyframes identifier { 50% {} }'); + + expect(nodes).toHaveLength(2); + expect(isKeyframeRule(nodes[0])).toBeFalsy(); + expect(isKeyframeRule(nodes[1])).toBeTruthy(); }); it('ignores a normal rule', () => { - rules('a {}', (rule) => { - expect(isKeyframeRule(rule)).toBeFalsy(); - }); + const nodes = nodesIn('a {}'); + + expect(nodes).toHaveLength(1); + expect(isKeyframeRule(nodes[0])).toBeFalsy(); }); it('ignores a normal rule with nested decl', () => { - rules('a { & b {} }', (rule) => { - expect(isKeyframeRule(rule)).toBeFalsy(); - }); + const nodes = nodesIn('a { & b {} }'); + + expect(nodes).toHaveLength(2); + expect(isKeyframeRule(nodes[0])).toBeFalsy(); + expect(isKeyframeRule(nodes[1])).toBeFalsy(); }); it('ignores a normal rule with nested at-rule decl', () => { - rules('a { @nest b & {} }', (rule) => { - expect(isKeyframeRule(rule)).toBeFalsy(); - }); + const nodes = nodesIn('a { @nest b & {} }'); + + expect(nodes).toHaveLength(2); + expect(isKeyframeRule(nodes[0])).toBeFalsy(); + expect(isKeyframeRule(nodes[1])).toBeFalsy(); }); it('ignores an @media', () => { - rules('@media print { a {} }', (rule) => { - expect(isKeyframeRule(rule)).toBeFalsy(); - }); + const nodes = nodesIn('@media print { a {} }'); + + expect(nodes).toHaveLength(2); + expect(isKeyframeRule(nodes[0])).toBeFalsy(); + expect(isKeyframeRule(nodes[1])).toBeFalsy(); }); it('ignores an @supports rule', () => { - rules('@supports (animation-name: test) { a {} }', (rule) => { - expect(isKeyframeRule(rule)).toBeFalsy(); - }); + const nodes = nodesIn('@supports (animation-name: test) { a {} }'); + + expect(nodes).toHaveLength(2); + expect(isKeyframeRule(nodes[0])).toBeFalsy(); + expect(isKeyframeRule(nodes[1])).toBeFalsy(); }); }); -function rules(css, cb) { - postcss.parse(css).walkDecls(cb); +function nodesIn(css) { + const nodes = []; + + postcss.parse(css).walk((node) => nodes.push(node)); + + return nodes; } diff --git a/lib/utils/__tests__/isLessVariable.test.js b/lib/utils/__tests__/isLessVariable.test.js index a49c83c7cc..09036a330b 100644 --- a/lib/utils/__tests__/isLessVariable.test.js +++ b/lib/utils/__tests__/isLessVariable.test.js @@ -5,42 +5,34 @@ const less = require('postcss-less'); describe('isLessVariable', () => { it('is less variable', () => { - lessAtRules('@var: 10px;', (atRule) => { - expect(isLessVariable(atRule)).toBeTruthy(); - }); + expect(isLessVariable(lessAtRule('@var: 10px;'))).toBeTruthy(); }); it('is less variable with function', () => { - lessAtRules('@hover-color: darken(@color, 10%);', (atRule) => { - expect(isLessVariable(atRule)).toBeTruthy(); - }); + expect(isLessVariable(lessAtRule('@hover-color: darken(@color, 10%);'))).toBeTruthy(); }); it('@charset is not a less variable', () => { - lessAtRules('@charset UTF-8;', (atRule) => { - expect(isLessVariable(atRule)).toBeFalsy(); - }); + expect(isLessVariable(lessAtRule('@charset UTF-8;'))).toBeFalsy(); }); it('@import is not a less variable', () => { - lessAtRules('@import url("some-styles.css");', (atRule) => { - expect(isLessVariable(atRule)).toBeFalsy(); - }); + expect(isLessVariable(lessAtRule('@import url("some-styles.css");'))).toBeFalsy(); }); it('@media is not a less variable', () => { - lessAtRules('@media (min-width: 100px) {};', (atRule) => { - expect(isLessVariable(atRule)).toBeFalsy(); - }); + expect(isLessVariable(lessAtRule('@media (min-width: 100px) {};'))).toBeFalsy(); }); it('detached ruleset is not a less variable', () => { - lessAtRules('@detached-ruleset: { margin: 0 };', (atRule) => { - expect(isLessVariable(atRule)).toBeFalsy(); - }); + expect(isLessVariable(lessAtRule('@detached-ruleset: { margin: 0 };'))).toBeFalsy(); }); }); -function lessAtRules(css, cb) { - less.parse(css).walkAtRules(cb); +function lessAtRule(css) { + const atRules = []; + + less.parse(css).walkAtRules((atRule) => atRules.push(atRule)); + + return atRules[0]; } diff --git a/lib/utils/__tests__/isMap.test.js b/lib/utils/__tests__/isMap.test.js index 99a950878f..126ef96276 100644 --- a/lib/utils/__tests__/isMap.test.js +++ b/lib/utils/__tests__/isMap.test.js @@ -19,7 +19,11 @@ describe('isMap', () => { ]; test.each(simpleMaps)('simple maps', (css, expected) => { - runTests(css, (decl) => { + const decls = declarations(css); + + expect(decls).toHaveLength(2); + + decls.forEach((decl) => { const parsedValue = valueParser(decl.value).nodes[0]; expect(isMap(parsedValue)).toBe(expected); @@ -27,10 +31,19 @@ describe('isMap', () => { }); test.each(nestedMaps)('nested maps', (css, expected) => { - runTests(css, (decl) => { + const decls = declarations(css); + + expect(decls).toHaveLength(2); + + decls.forEach((decl) => { const parsedValue = valueParser(decl.value); - parsedValue.walk((valueNode) => { + const valueNodes = []; + + parsedValue.walk((valueNode) => valueNodes.push(valueNode)); + + expect(valueNodes.length).toBeGreaterThan(0); + valueNodes.forEach((valueNode) => { if (expected.includes(valueNode.sourceIndex)) { expect(isMap(valueNode)).toBeTruthy(); } else { @@ -43,7 +56,11 @@ describe('isMap', () => { it('empty map returns `false`', () => { const emptyMap = '$map: ();'; - runTests(emptyMap, (decl) => { + const decls = declarations(emptyMap); + + expect(decls).toHaveLength(2); + + decls.forEach((decl) => { const parsedValue = valueParser(decl.value); expect(isMap(parsedValue)).toBeFalsy(); @@ -51,16 +68,11 @@ describe('isMap', () => { }); }); -function sassDecls(css, cb) { - sass.parse(css).walkDecls(cb); -} +function declarations(css) { + const list = []; -function scssDecls(css, cb) { - scss.parse(css).walkDecls(cb); -} + sass.parse(css).walkDecls((decl) => list.push(decl)); + scss.parse(css).walkDecls((decl) => list.push(decl)); -function runTests(css, cb) { - [sassDecls, scssDecls].forEach((fn) => { - fn(css, cb); - }); + return list; } diff --git a/lib/utils/__tests__/isSharedLineComment.test.js b/lib/utils/__tests__/isSharedLineComment.test.js index 435e29c34a..f0dffd4dc5 100644 --- a/lib/utils/__tests__/isSharedLineComment.test.js +++ b/lib/utils/__tests__/isSharedLineComment.test.js @@ -5,45 +5,45 @@ const postcss = require('postcss'); describe('isSharedLineComment', () => { it('returns false for the first node', () => { - const root = postcss.parse(` + const css = ` /* comment */ - `); + `; - expect(isSharedLineComment(root.nodes[0])).toBe(false); + expect(isSharedLineComment(comment(css))).toBe(false); }); it('returns false for a non-shared-line comment before a rule', () => { - const root = postcss.parse(` + const css = ` /* comment */ a {} - `); + `; - expect(isSharedLineComment(root.nodes[0])).toBe(false); + expect(isSharedLineComment(comment(css))).toBe(false); }); it('returns false for a non-shared-line comment after a rule', () => { - const root = postcss.parse(` + const css = ` a {} /* comment */ - `); + `; - expect(isSharedLineComment(root.nodes[1])).toBe(false); + expect(isSharedLineComment(comment(css))).toBe(false); }); it('returns true for a shared-line comment before a rule', () => { - const root = postcss.parse(` + const css = ` /* comment */ a {} - `); + `; - expect(isSharedLineComment(root.nodes[0])).toBe(true); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns true for a shared-line comment after a rule', () => { - const root = postcss.parse(` + const css = ` a {} /* comment */ - `); + `; - expect(isSharedLineComment(root.nodes[1])).toBe(true); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns false for a shared-line non-comment', () => { @@ -56,152 +56,146 @@ describe('isSharedLineComment', () => { }); it('returns true when comment shares a line with the start of a rule block, before it', () => { - const root = postcss.parse(` + const css = ` /* comment */ a { color: pink; } - `); + `; - expect(isSharedLineComment(root.nodes[0])).toBe(true); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns true when comment shares a line with the start of a rule block with a multiline selector, before it', () => { - const root = postcss.parse(` + const css = ` /* comment */ a, b { color: pink; } - `); + `; - root.walkComments((comment) => { - expect(isSharedLineComment(comment)).toBe(true); - }); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns true when comment shares a line with the start of a rule block, after it', () => { - const root = postcss.parse(` + const css = ` a { /* comment */ color: pink; } - `); + `; - root.walkComments((comment) => { - expect(isSharedLineComment(comment)).toBe(true); - }); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns true when comment shares a line with the start of a rule block with a multiline selector, after it', () => { - const root = postcss.parse(` + const css = ` a, b { /* comment */ color: pink; } - `); + `; - root.walkComments((comment) => { - expect(isSharedLineComment(comment)).toBe(true); - }); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns true when comment shares a line with the start of an at-rule block, before it', () => { - const root = postcss.parse(` + const css = ` /* comment */ @media (min-width: 0px) { a { color: pink; } } - `); + `; - expect(isSharedLineComment(root.nodes[0])).toBe(true); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns true when comment shares a line with the start of an at-rule block with a multiline selector, before it', () => { - const root = postcss.parse(` + const css = ` /* comment */ @media (min-width: 0px) { a { color: pink; } } - `); + `; - expect(isSharedLineComment(root.nodes[0])).toBe(true); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns true when comment shares a line with the start of an at-rule block, after it', () => { - const root = postcss.parse(` + const css = ` @media (min-width: 0px) { /* comment */ a { color: pink; } } - `); + `; - root.walkComments((comment) => { - expect(isSharedLineComment(comment)).toBe(true); - }); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns true when comment shares a line with the start of an at-rule block with a multiline selector, after it', () => { - const root = postcss.parse(` + const css = ` @media (min-width: 0px) { /* comment */ a { color: pink; } } - `); + `; - root.walkComments((comment) => { - expect(isSharedLineComment(comment)).toBe(true); - }); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns false when comment shares a line with only another comment', () => { - const root = postcss.parse(` + const css = ` /* comment */ /* comment */ - `); + `; - expect(isSharedLineComment(root.nodes[0])).toBe(false); + expect(isSharedLineComment(comment(css))).toBe(false); }); it('returns true when comment shares a line with another comment and a non-comment', () => { - const root = postcss.parse(` + const css = ` /* comment */ /* comment */ a {} - `); + `; - expect(isSharedLineComment(root.nodes[0])).toBe(true); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns true when comment shares a line with the end of a multi-line rule block, after it', () => { - const root = postcss.parse(` + const css = ` a { color: pink; } /* comment */ - `); + `; - root.walkComments((comment) => { - expect(isSharedLineComment(comment)).toBe(true); - }); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns true when comment shares a line with the end of a multi-line property declaration, after it', () => { - const root = postcss.parse(` + const css = ` a { border-radius: 1em 0; /* comment */ } - `); + `; - root.walkComments((comment) => { - expect(isSharedLineComment(comment)).toBe(true); - }); + expect(isSharedLineComment(comment(css))).toBe(true); }); it('returns true when comment shares a line with the start of a multi-line property declaration, before it', () => { - const root = postcss.parse(` + const css = ` a { /* comment */ border-radius: 1em 0; } - `); + `; - root.walkComments((comment) => { - expect(isSharedLineComment(comment)).toBe(true); - }); + expect(isSharedLineComment(comment(css))).toBe(true); }); }); + +function comment(css) { + const comments = []; + + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow + postcss.parse(css).walkComments((comment) => comments.push(comment)); + + return comments[0]; +} diff --git a/lib/utils/__tests__/isStandardSyntaxAtRule.test.js b/lib/utils/__tests__/isStandardSyntaxAtRule.test.js index edb0f3fa52..3244ccf732 100644 --- a/lib/utils/__tests__/isStandardSyntaxAtRule.test.js +++ b/lib/utils/__tests__/isStandardSyntaxAtRule.test.js @@ -1,136 +1,116 @@ 'use strict'; const isStandardSyntaxAtRule = require('../isStandardSyntaxAtRule'); -const less = require('postcss-less'); const postcss = require('postcss'); -const sass = require('postcss-sass'); -const scss = require('postcss-scss'); +const postcssLess = require('postcss-less'); +const postcssSass = require('postcss-sass'); +const postcssScss = require('postcss-scss'); describe('isStandardSyntaxAtRule', () => { it('non nested at-rules without quotes', () => { - atRules('@charset UTF-8;', (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeTruthy(); - }); + expect(isStandardSyntaxAtRule(atRule('@charset UTF-8;'))).toBeTruthy(); }); it("non nested at-rules with `'` quotes", () => { - atRules("@charset 'UTF-8';", (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeTruthy(); - }); + expect(isStandardSyntaxAtRule(atRule("@charset 'UTF-8';"))).toBeTruthy(); }); it('non nested at-rules with `"` quotes', () => { - atRules('@charset "UTF-8";', (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeTruthy(); - }); + expect(isStandardSyntaxAtRule(atRule('@charset "UTF-8";'))).toBeTruthy(); }); it("non nested at-rules with `'` quotes and without space after name", () => { - atRules("@charset'UTF-8';", (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeTruthy(); - }); + expect(isStandardSyntaxAtRule(atRule("@charset'UTF-8';"))).toBeTruthy(); }); it('non nested at-rules with `"` quotes and without space after name', () => { - atRules('@charset"UTF-8";', (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeTruthy(); - }); + expect(isStandardSyntaxAtRule(atRule('@charset"UTF-8";'))).toBeTruthy(); }); it('non nested at-rules with function and without space after name', () => { - atRules('@import url("fineprint.css") print;', (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeTruthy(); - }); + expect(isStandardSyntaxAtRule(atRule('@import url("fineprint.css") print;'))).toBeTruthy(); }); it('nested at-rules', () => { - atRules('@media (min-width: 100px) {};', (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeTruthy(); - }); + expect(isStandardSyntaxAtRule(atRule('@media (min-width: 100px) {};'))).toBeTruthy(); }); it('nested at-rules with newline after name', () => { - atRules('@media\n(min-width: 100px) {};', (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeTruthy(); - }); + expect(isStandardSyntaxAtRule(atRule('@media\n(min-width: 100px) {};'))).toBeTruthy(); }); it('nested at-rules with windows newline after name', () => { - atRules('@media\r\n(min-width: 100px) {};', (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeTruthy(); - }); + expect(isStandardSyntaxAtRule(atRule('@media\r\n(min-width: 100px) {};'))).toBeTruthy(); }); it('nested at-rules without space after name', () => { - atRules('@media(min-width: 100px) {};', (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeTruthy(); - }); + expect(isStandardSyntaxAtRule(atRule('@media(min-width: 100px) {};'))).toBeTruthy(); }); - it('ignore `@content` inside mixins newline', () => { - const sass = '@mixin mixin()\n @content'; + // eslint-disable-next-line jest/no-disabled-tests -- TODO: `postcss-sass` parser does not support `@mixin`. + it.skip('ignore `@content` inside mixins newline', () => { + const rules = sassAtRules('@mixin mixin()\n @content'); - sassAtRules(sass, (atRule) => { - if (atRule.name === 'mixin') { - return; - } - - expect(isStandardSyntaxAtRule(atRule)).toBeFalsy(); - }); + expect(rules).toHaveLength(2); + expect(rules.map((rule) => rule.name)).toEqual(['mixin', 'content']); + expect(isStandardSyntaxAtRule(rules[0])).toBeTruthy(); + expect(isStandardSyntaxAtRule(rules[1])).toBeFalsy(); }); it('ignore `@content` inside mixins space', () => { - const scss = '@mixin mixin() { @content; };'; - - scssAtRules(scss, (atRule) => { - if (atRule.name === 'mixin') { - return; - } + const rules = scssAtRules('@mixin mixin() { @content; };'); - expect(isStandardSyntaxAtRule(atRule)).toBeFalsy(); - }); + expect(rules).toHaveLength(2); + expect(rules.map((rule) => rule.name)).toEqual(['mixin', 'content']); + expect(isStandardSyntaxAtRule(rules[0])).toBeTruthy(); + expect(isStandardSyntaxAtRule(rules[1])).toBeFalsy(); }); it('ignore passing rulesets to mixins', () => { - const less = '@detached-ruleset: { background: red; }; .top { @detached-ruleset(); }'; + const rules = lessAtRules( + '@detached-ruleset: { background: red; }; .top { @detached-ruleset(); }', + ); - lessAtRules(less, (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeFalsy(); - }); + expect(rules).toHaveLength(2); + expect(isStandardSyntaxAtRule(rules[0])).toBeFalsy(); + expect(isStandardSyntaxAtRule(rules[1])).toBeFalsy(); }); it('ignore calling of mixins', () => { - const less = 'a { .mixin(); }'; + const rules = lessAtRules('a { .mixin(); }'); - lessAtRules(less, (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeFalsy(); - }); + expect(rules).toHaveLength(1); + expect(isStandardSyntaxAtRule(rules[0])).toBeFalsy(); }); it('ignore variables', () => { - const less = ` - @my-variable: 10px; - .top { margin-top: @my-variable; } - `; - - lessAtRules(less, (atRule) => { - expect(isStandardSyntaxAtRule(atRule)).toBeFalsy(); - }); + const rules = lessAtRules('@my-variable: 10px; .top { margin-top: @my-variable; }'); + + expect(rules).toHaveLength(1); + expect(isStandardSyntaxAtRule(rules[0])).toBeFalsy(); }); }); -function atRules(css, cb) { - postcss.parse(css).walkAtRules(cb); +function atRules(code, parser = postcss) { + const rules = []; + + parser.parse(code).walkAtRules((rule) => rules.push(rule)); + + return rules; +} + +function atRule(code) { + return atRules(code)[0]; } -function sassAtRules(css, cb) { - sass.parse(css).walkAtRules(cb); +function sassAtRules(code) { + return atRules(code, postcssSass); } -function scssAtRules(css, cb) { - scss.parse(css).walkAtRules(cb); +function scssAtRules(code) { + return atRules(code, postcssScss); } -function lessAtRules(css, cb) { - less.parse(css).walkAtRules(cb); +function lessAtRules(code) { + return atRules(code, postcssLess); } diff --git a/lib/utils/__tests__/isStandardSyntaxCombinator.test.js b/lib/utils/__tests__/isStandardSyntaxCombinator.test.js index 65b71d3454..4ade6bbc65 100644 --- a/lib/utils/__tests__/isStandardSyntaxCombinator.test.js +++ b/lib/utils/__tests__/isStandardSyntaxCombinator.test.js @@ -6,86 +6,62 @@ const selectorParser = require('postcss-selector-parser'); describe('isStandardSyntaxCombinator', () => { it('tag', () => { - rules('a {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeTruthy(); - }); + expect(isStandardSyntaxCombinator(postcss.parse('a {}').first)).toBeFalsy(); }); it('descendant', () => { - rules('a b {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeTruthy(); - }); + expect(isStandardSyntaxCombinator(combinator('a b {}'))).toBeTruthy(); }); it('descendant tab', () => { - rules('a\tb {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeTruthy(); - }); + expect(isStandardSyntaxCombinator(combinator('a\tb {}'))).toBeTruthy(); }); it('descendant newline', () => { - rules('a\nb {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeTruthy(); - }); + expect(isStandardSyntaxCombinator(combinator('a\nb {}'))).toBeTruthy(); }); it('descendant (double child)', () => { - rules('a >> b {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeTruthy(); - }); + expect(isStandardSyntaxCombinator(combinator('a >> b {}'))).toBeTruthy(); }); it('child', () => { - rules('a > b {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeTruthy(); - }); + expect(isStandardSyntaxCombinator(combinator('a > b {}'))).toBeTruthy(); }); it('next sibling', () => { - rules('a + b {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeTruthy(); - }); + expect(isStandardSyntaxCombinator(combinator('a + b {}'))).toBeTruthy(); }); it('subsequent-sibling', () => { - rules('a ~ b {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeTruthy(); - }); + expect(isStandardSyntaxCombinator(combinator('a ~ b {}'))).toBeTruthy(); }); it('lowercase reference', () => { - rules('a /for/ b {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeFalsy(); - }); + expect(isStandardSyntaxCombinator(combinator('a /for/ b {}'))).toBeFalsy(); }); it('mixedcase reference', () => { - rules('a /fOr/ b {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeFalsy(); - }); + expect(isStandardSyntaxCombinator(combinator('a /fOr/ b {}'))).toBeFalsy(); }); it('uppercase reference', () => { - rules('a /FOR/ b {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeFalsy(); - }); + expect(isStandardSyntaxCombinator(combinator('a /FOR/ b {}'))).toBeFalsy(); }); it('last node is combinator', () => { - rules('a ~, {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeFalsy(); - }); + expect(isStandardSyntaxCombinator(combinator('a ~, {}'))).toBeFalsy(); }); it('first node is combinator', () => { - rules('~ b {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeFalsy(); - }); + expect(isStandardSyntaxCombinator(combinator('~ b {}'))).toBeFalsy(); }); it('last node (in first container) is combinator', () => { - rules('a ~, b {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeFalsy(); - }); + expect(isStandardSyntaxCombinator(combinator('a ~, b {}'))).toBeFalsy(); }); it('first node (in second container) is combinator', () => { - rules('a, ~ b {}', (func) => { - expect(isStandardSyntaxCombinator(func)).toBeFalsy(); - }); + expect(isStandardSyntaxCombinator(combinator('a, ~ b {}'))).toBeFalsy(); }); }); -function rules(css, cb) { +function combinator(css) { + const list = []; + postcss.parse(css).walkRules((rule) => { selectorParser((selectorAST) => { - selectorAST.walkCombinators(cb); + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow + selectorAST.walkCombinators((combinator) => list.push(combinator)); }).processSync(rule.selector); }); + + return list[0]; } diff --git a/lib/utils/__tests__/isStandardSyntaxDeclaration.test.js b/lib/utils/__tests__/isStandardSyntaxDeclaration.test.js index c0a3fc5978..bfc969d712 100644 --- a/lib/utils/__tests__/isStandardSyntaxDeclaration.test.js +++ b/lib/utils/__tests__/isStandardSyntaxDeclaration.test.js @@ -1,241 +1,179 @@ 'use strict'; const isStandardSyntaxDeclaration = require('../isStandardSyntaxDeclaration'); -const less = require('postcss-less'); const postcss = require('postcss'); -const sass = require('postcss-sass'); -const scss = require('postcss-scss'); +const postcssLess = require('postcss-less'); +const postcssSass = require('postcss-sass'); +const postcssScss = require('postcss-scss'); describe('isStandardSyntaxDeclaration', () => { it('standard prop and value', () => { - decls('a { a: b }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(decl('a { a: b }'))).toBe(true); }); it('standard prop and scss var', () => { - decls('a { a: $b }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(decl('a { a: $b }'))).toBe(true); }); it('custom-property', () => { - decls('a { --custom-property: x }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(decl('a { --custom-property: x }'))).toBe(true); }); it('standard prop and calc value', () => { - decls('a { a : calc(b + c) }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(decl('a { a : calc(b + c) }'))).toBe(true); }); it('does not break @selector', () => { - decls('@page { size: A4 }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(decl('@page { size: A4 }'))).toBe(true); }); - it('custom property set in SASS paser', () => { - sassDecls('a\n\t--custom-property-set:\n\t\tcolor: blue', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + it('custom property set in SASS parser', () => { + expect( + isStandardSyntaxDeclaration(sassDecl('a\n\t--custom-property-set:\n\t\tcolor: blue')), + ).toBe(true); }); - it('custom property set in SCSS paser', () => { - scssDecls('a { --custom-property-set: { color: blue; } }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + it('custom property set in SCSS parser', () => { + expect( + isStandardSyntaxDeclaration(scssDecl('a { --custom-property-set: { color: blue; } }')), + ).toBe(true); }); - it('custom property set in LESS paser', () => { - lessDecls('a { --custom-property-set: { color: blue; } }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + it('custom property set in LESS parser', () => { + expect( + isStandardSyntaxDeclaration(lessDecl('a { --custom-property-set: { color: blue; } }')), + ).toBe(true); }); it('property with sass variable interpolation (only)', () => { - sassDecls('a\n\t#{$var}: 10px', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(sassDecl('a\n\t#{$var}: 10px'))).toBe(true); }); it('property with scss variable interpolation (only)', () => { - scssDecls('a { #{$var}: 10px; }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(scssDecl('a { #{$var}: 10px; }'))).toBe(true); }); it('property with sass variable interpolation (end)', () => { - sassDecls('a\n\tprop#{$var}: 10px', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(sassDecl('a\n\tprop#{$var}: 10px'))).toBe(true); }); it('property with scss variable interpolation (end)', () => { - scssDecls('a { prop#{$var}: 10px; }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(scssDecl('a { prop#{$var}: 10px; }'))).toBe(true); }); it('property with sass variable interpolation (middle)', () => { - sassDecls('a\n\tprop#{$var}erty: 10px', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(sassDecl('a\n\tprop#{$var}erty: 10px'))).toBe(true); }); it('property with scss variable interpolation (middle)', () => { - scssDecls('a { prop#{$var}erty: 10px; }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(scssDecl('a { prop#{$var}erty: 10px; }'))).toBe(true); }); it('property with less variable interpolation (only)', () => { - lessDecls('a { @{var}: 10px; }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(lessDecl('a { @{var}: 10px; }'))).toBe(true); }); it('property with less variable interpolation (end)', () => { - lessDecls('a { prop@{var}: 10px; }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(lessDecl('a { prop@{var}: 10px; }'))).toBe(true); }); it('property with less variable interpolation (middle)', () => { - lessDecls('a { prop@{var}erty: 10px; }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeTruthy(); - }); + expect(isStandardSyntaxDeclaration(lessDecl('a { prop@{var}erty: 10px; }'))).toBe(true); }); it('sass var', () => { - sassDecls('$var: b', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(sassDecl('$var: b'))).toBe(false); }); it('scss var', () => { - scssDecls('$var: b', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(scssDecl('$var: b'))).toBe(false); }); it('scss var within namespace', () => { - scssDecls('namespace.$var: b', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(scssDecl('namespace.$var: b'))).toBe(false); }); it('nested scss var within namespace', () => { - scssDecls('a { namespace.$var: b }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(scssDecl('a { namespace.$var: b }'))).toBe(false); }); it('sass list', () => { - sassDecls('$list: (key: value, key2: value2)', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(sassDecl('$list: (key: value, key2: value2)'))).toBe(false); }); it('scss list', () => { - scssDecls('$list: (key: value, key2: value2)', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(scssDecl('$list: (key: value, key2: value2)'))).toBe(false); }); it('sass map', () => { - sassDecls('$map: (value, value2)', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(sassDecl('$map: (value, value2)'))).toBe(false); }); it('scss map', () => { - scssDecls('$map: (value, value2)', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(scssDecl('$map: (value, value2)'))).toBe(false); }); it('nested sass var', () => { - sassDecls('a\n\t$var: b', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(sassDecl('a\n\t$var: b'))).toBe(false); }); it('nested scss var', () => { - scssDecls('a { $var: b }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(scssDecl('a { $var: b }'))).toBe(false); }); it('nested sass list', () => { - sassDecls('a\n\t$list: (key: value, key2: value2)', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(sassDecl('a\n\t$list: (key: value, key2: value2)'))).toBe( + false, + ); }); it('nested scss list', () => { - scssDecls('a { $list: (key: value, key2: value2) }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(scssDecl('a { $list: (key: value, key2: value2) }'))).toBe( + false, + ); }); it('sass nested property', () => { - sassDecls('a\n\tborder:\n\t\tstyle: solid\n\t\tcolor: red', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(sassDecl('a\n\tborder:\n\t\tstyle: solid'))).toBe(false); }); it('scss nested property', () => { - scssDecls('a { border: { style: solid; color: red; } }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(scssDecl('a { border: { style: solid; } }'))).toBe(false); }); it('nested sass map', () => { - sassDecls('a\n\t$map: (value, value2)', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(sassDecl('a\n\t$map: (value, value2)'))).toBe(false); }); it('nested scss map', () => { - scssDecls('a { $map: (value, value2) }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); - }); - - it('less var', () => { - lessDecls('@var: b', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); - }); - - it('nested less var', () => { - lessDecls('a { @var: b }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(scssDecl('a { $map: (value, value2) }'))).toBe(false); }); it('less &:extend', () => { - lessDecls('a { &:extend(b) }', (decl) => { - expect(isStandardSyntaxDeclaration(decl)).toBeFalsy(); - }); + expect(isStandardSyntaxDeclaration(lessDecl('a { &:extend(b) }'))).toBe(false); }); }); -function decls(css, cb) { - postcss.parse(css).walkDecls(cb); +function decl(css, parser = postcss) { + const list = []; + + parser.parse(css).walkDecls((d) => list.push(d)); + + if (list.length === 1) { + return list[0]; + } + + throw new Error(`Expected length 1, but ${list.length}`); } -function sassDecls(css, cb) { - sass.parse(css).walkDecls(cb); +function sassDecl(css) { + return decl(css, postcssSass); } -function scssDecls(css, cb) { - scss.parse(css).walkDecls(cb); +function scssDecl(css) { + return decl(css, postcssScss); } -function lessDecls(css, cb) { - less.parse(css).walkDecls(cb); +function lessDecl(css) { + return decl(css, postcssLess); } diff --git a/lib/utils/__tests__/isStandardSyntaxFunction.test.js b/lib/utils/__tests__/isStandardSyntaxFunction.test.js index 49136e94f4..28baa672a8 100644 --- a/lib/utils/__tests__/isStandardSyntaxFunction.test.js +++ b/lib/utils/__tests__/isStandardSyntaxFunction.test.js @@ -6,38 +6,32 @@ const valueParser = require('postcss-value-parser'); describe('isStandardSyntaxFunction', () => { it('calc', () => { - funcs('a { prop: calc(a + b) }', (func) => { - expect(isStandardSyntaxFunction(func)).toBeTruthy(); - }); + expect(isStandardSyntaxFunction(func('a { prop: calc(a + b) }'))).toBe(true); }); it('url', () => { - funcs("a { prop: url('x.css') }", (func) => { - expect(isStandardSyntaxFunction(func)).toBeTruthy(); - }); + expect(isStandardSyntaxFunction(func("a { prop: url('x.css') }"))).toBe(true); }); it('scss list', () => { - funcs('a { $list: (list) }', (func) => { - expect(isStandardSyntaxFunction(func)).toBeFalsy(); - }); + expect(isStandardSyntaxFunction(func('a { $list: (list) }'))).toBe(false); }); it('scss map', () => { - funcs('a { $map: (key: value) }', (func) => { - expect(isStandardSyntaxFunction(func)).toBeFalsy(); - }); + expect(isStandardSyntaxFunction(func('a { $map: (key: value) }'))).toBe(false); }); }); -function funcs(css, cb) { +function func(css) { + const functions = []; + postcss.parse(css).walkDecls((decl) => { valueParser(decl.value).walk((valueNode) => { - if (valueNode.type !== 'function') { - return; + if (valueNode.type === 'function') { + functions.push(valueNode); } - - cb(valueNode); }); }); + + return functions[0]; } diff --git a/lib/utils/__tests__/isStandardSyntaxMediaFeatureName.test.js b/lib/utils/__tests__/isStandardSyntaxMediaFeatureName.test.js index e05e4d9db9..061fddd8a6 100644 --- a/lib/utils/__tests__/isStandardSyntaxMediaFeatureName.test.js +++ b/lib/utils/__tests__/isStandardSyntaxMediaFeatureName.test.js @@ -24,7 +24,7 @@ describe('isStandardSyntaxMediaFeatureName', () => { it('scss var single quoted addition', () => { expect(isStandardSyntaxMediaFeatureName("'min-width + $value'")).toBeFalsy(); }); - it('scss var single quoted added to ', () => { + it('scss var single quoted added to', () => { expect(isStandardSyntaxMediaFeatureName("'$value + min-width'")).toBeFalsy(); }); it('scss var doubled quoted addition', () => { diff --git a/lib/utils/__tests__/isStandardSyntaxRule.test.js b/lib/utils/__tests__/isStandardSyntaxRule.test.js index 7134d0035d..025ab14a04 100644 --- a/lib/utils/__tests__/isStandardSyntaxRule.test.js +++ b/lib/utils/__tests__/isStandardSyntaxRule.test.js @@ -4,168 +4,105 @@ const isStandardSyntaxRule = require('../isStandardSyntaxRule'); const less = require('postcss-less'); const postcss = require('postcss'); +const node = (code, parser = postcss) => parser.parse(code).first; +const lessNode = (code) => node(code, less); + describe('isStandardSyntaxRule', () => { it('type', () => { - rules('a {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeTruthy(); - }); + expect(isStandardSyntaxRule(node('a {}'))).toBeTruthy(); }); it('when type selector before selector', () => { - rules('when a {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeTruthy(); - }); + expect(isStandardSyntaxRule(node('when a {}'))).toBeTruthy(); }); it('when type selector after selector', () => { - rules('a when {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeTruthy(); - }); + expect(isStandardSyntaxRule(node('a when {}'))).toBeTruthy(); }); it('pseudo-class', () => { - rules('a:last-child {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeTruthy(); - }); + expect(isStandardSyntaxRule(node('a:last-child {}'))).toBeTruthy(); }); it('pseudo-class not', () => { - rules('a:not(.a) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeTruthy(); - }); + expect(isStandardSyntaxRule(node('a:not(.a) {}'))).toBeTruthy(); }); it('pseudo-element', () => { - rules('a::after {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeTruthy(); - }); + expect(isStandardSyntaxRule(node('a::after {}'))).toBeTruthy(); }); it('custom-selector', () => { - rules(':--custom-selector {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeTruthy(); - }); + expect(isStandardSyntaxRule(node(':--custom-selector {}'))).toBeTruthy(); }); it('compound custom-selectors', () => { - rules(':--custom-selector:--custom-selector {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeTruthy(); - }); + expect(isStandardSyntaxRule(node(':--custom-selector:--custom-selector {}'))).toBeTruthy(); }); it('custom-property-set', () => { - rules('--custom-property-set: {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(node('--custom-property-set: {}'))).toBeFalsy(); }); it('Scss nested properties', () => { - rules('foo: {};', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(node('foo: {};'))).toBeFalsy(); }); it('called Less class parametric mixin', () => { - lessRules('.mixin-name(@var);', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('.mixin-name(@var);'))).toBeFalsy(); }); it('non-outputting parametric Less class mixin definition', () => { - lessRules('.mixin-name() {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('.mixin-name() {}'))).toBeFalsy(); }); it('non-outputting Less class mixin definition', () => { - lessRules('.mixin-name(@a, @b) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('.mixin-name(@a, @b) {}'))).toBeFalsy(); }); it('non-outputting parametric Less class mixin definition ending in number', () => { - lessRules('.mixin-name3(@a, @b) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('.mixin-name3(@a, @b) {}'))).toBeFalsy(); }); it('non-outputting Less ID mixin definition', () => { - lessRules('#mixin-name() {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('#mixin-name() {}'))).toBeFalsy(); }); it('called Less ID mixin', () => { - lessRules('#mixin-name;', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('#mixin-name;'))).toBeFalsy(); }); it('called namespaced Less mixin (child)', () => { - lessRules('#namespace > .mixin-name;', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('#namespace > .mixin-name;'))).toBeFalsy(); }); it('called namespaced Less mixin (descendant)', () => { - lessRules('#namespace .mixin-name;', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('#namespace .mixin-name;'))).toBeFalsy(); }); it('called namespaced Less mixin (compound)', () => { - lessRules('#namespace.mixin-name;', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('#namespace.mixin-name;'))).toBeFalsy(); }); it('less mixin', () => { - lessRules('.box-shadow(@style, @c) when (iscolor(@c)) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect( + isStandardSyntaxRule(lessNode('.box-shadow(@style, @c) when (iscolor(@c)) {}')), + ).toBeFalsy(); }); it('less extend', () => { - lessRules('&:extend(.inline);', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('&:extend(.inline);'))).toBeFalsy(); }); it('less detached rulesets', () => { - lessRules('@foo: {};', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('@foo: {};'))).toBeFalsy(); }); it('less guarded namespaces', () => { - lessRules('#namespace when (@mode=huge) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('#namespace when (@mode=huge) {}'))).toBeFalsy(); }); it('mixin guards', () => { - lessRules('.mixin (@variable) when (@variable = 10px) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect( + isStandardSyntaxRule(lessNode('.mixin (@variable) when (@variable = 10px) {}')), + ).toBeFalsy(); }); it('css guards', () => { - lessRules('.foo() when (@variable = true) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('.foo() when (@variable = true) {}'))).toBeFalsy(); }); it('css guards without spaces', () => { - lessRules('.foo()when(@variable = true) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('.foo()when(@variable = true) {}'))).toBeFalsy(); }); it('css guards with multiple spaces', () => { - lessRules('.foo() when (@variable = true) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('.foo() when (@variable = true) {}'))).toBeFalsy(); }); it('css guards with newlines', () => { - lessRules('.foo()\nwhen\n(@variable = true) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('.foo()\nwhen\n(@variable = true) {}'))).toBeFalsy(); }); - it('css guards with CLRF', () => { - lessRules('.foo()\r\nwhen\r\n(@variable = true) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + it('css guards with CRLF', () => { + expect(isStandardSyntaxRule(lessNode('.foo()\r\nwhen\r\n(@variable = true) {}'))).toBeFalsy(); }); it('css guards with parenthesis', () => { - lessRules('.foo() when (default()) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('.foo() when (default()) {}'))).toBeFalsy(); }); it('css guards with not', () => { - lessRules('.foo() when not (@variable = true) {}', (rule) => { - expect(isStandardSyntaxRule(rule)).toBeFalsy(); - }); + expect(isStandardSyntaxRule(lessNode('.foo() when not (@variable = true) {}'))).toBeFalsy(); }); }); - -function rules(css, cb) { - postcss.parse(css).walkRules(cb); -} - -function lessRules(css, cb) { - less.parse(css).walkRules(cb); -} diff --git a/lib/utils/__tests__/vendor.test.js b/lib/utils/__tests__/vendor.test.js new file mode 100644 index 0000000000..27e95f7bd7 --- /dev/null +++ b/lib/utils/__tests__/vendor.test.js @@ -0,0 +1,17 @@ +'use strict'; + +const vendor = require('../vendor'); + +const VALUE = '-1px -1px 1px rgba(0, 0, 0, 0.2) inset'; + +it('returns prefix', () => { + expect(vendor.prefix('-moz-color')).toEqual('-moz-'); + expect(vendor.prefix('color')).toEqual(''); + expect(vendor.prefix(VALUE)).toEqual(''); +}); + +it('returns unprefixed version', () => { + expect(vendor.unprefixed('-moz-color')).toEqual('color'); + expect(vendor.unprefixed('color')).toEqual('color'); + expect(vendor.unprefixed(VALUE)).toEqual(VALUE); +}); diff --git a/lib/utils/isLessVariable.js b/lib/utils/isLessVariable.js index 3231adaa05..aeb8ce3969 100644 --- a/lib/utils/isLessVariable.js +++ b/lib/utils/isLessVariable.js @@ -3,10 +3,12 @@ const hasBlock = require('./hasBlock'); /** - * @param {import('postcss').AtRule} atRule + * @param {import('postcss').AtRule | import('postcss-less').AtRule} atRule * @returns {boolean} */ module.exports = function (atRule) { - // @ts-ignore TODO TYPES LESS property variable does not exists in types - return (atRule.type === 'atrule' && atRule.variable && !hasBlock(atRule)) || false; + return ( + (atRule.type === 'atrule' && 'variable' in atRule && atRule.variable && !hasBlock(atRule)) || + false + ); }; diff --git a/lib/utils/isStandardSyntaxAtRule.js b/lib/utils/isStandardSyntaxAtRule.js index 98afdc6bf7..a874f40549 100644 --- a/lib/utils/isStandardSyntaxAtRule.js +++ b/lib/utils/isStandardSyntaxAtRule.js @@ -3,7 +3,7 @@ /** * Check whether a at-rule is standard * - * @param {import('postcss').AtRule} atRule postcss at-rule node + * @param {import('postcss').AtRule | import('postcss-less').AtRule} atRule postcss at-rule node * @return {boolean} If `true`, the declaration is standard */ module.exports = function (atRule) { @@ -13,15 +13,13 @@ module.exports = function (atRule) { } // Ignore Less mixins - // @ts-ignore TODO TYPES Is this property really exists? - if (atRule.mixin) { + if ('mixin' in atRule && atRule.mixin) { return false; } // Ignore Less detached ruleset `@detached-ruleset: { background: red; }; .top { @detached-ruleset(); }` if ( - // @ts-ignore TODO TYPES Is this property really exists? - atRule.variable || + ('variable' in atRule && atRule.variable) || (!atRule.nodes && atRule.raws.afterName === '' && atRule.params[0] === '(') ) { return false; diff --git a/lib/utils/isStandardSyntaxDeclaration.js b/lib/utils/isStandardSyntaxDeclaration.js index 7c6cc2e41e..7362513502 100644 --- a/lib/utils/isStandardSyntaxDeclaration.js +++ b/lib/utils/isStandardSyntaxDeclaration.js @@ -13,7 +13,7 @@ function isStandardSyntaxLang(lang) { /** * Check whether a declaration is standard * - * @param {import('postcss').Declaration} decl + * @param {import('postcss').Declaration | import('postcss-less').Declaration} decl */ module.exports = function (decl) { const prop = decl.prop; @@ -53,8 +53,7 @@ module.exports = function (decl) { } // Less &:extend - // @ts-ignore TODO TYPES extend does not exists - if (decl.extend) { + if ('extend' in decl && decl.extend) { return false; } diff --git a/lib/utils/isStandardSyntaxRule.js b/lib/utils/isStandardSyntaxRule.js index 038deeeecb..bca92da849 100644 --- a/lib/utils/isStandardSyntaxRule.js +++ b/lib/utils/isStandardSyntaxRule.js @@ -7,10 +7,14 @@ const isStandardSyntaxSelector = require('../utils/isStandardSyntaxSelector'); /** * Check whether a Node is a standard rule * - * @param {import('postcss').Rule} rule + * @param {import('postcss').Rule | import('postcss-less').Rule} rule * @returns {boolean} */ module.exports = function (rule) { + if (rule.type !== 'rule') { + return false; + } + // Get full selector const selector = _.get(rule, 'raws.selector.raw', rule.selector); @@ -35,8 +39,7 @@ module.exports = function (rule) { } // Ignore Less &:extend rule - // @ts-ignore TODO TYPES support LESS and SASS types somehow - if (rule.extend) { + if ('extend' in rule && rule.extend) { return false; } diff --git a/lib/utils/putIfAbsent.js b/lib/utils/putIfAbsent.js new file mode 100644 index 0000000000..aeb9eed5fd --- /dev/null +++ b/lib/utils/putIfAbsent.js @@ -0,0 +1,22 @@ +'use strict'; + +/** + * If `map` already has the given `key`, returns its value. Otherwise, calls + * `callback`, adds the result to `map` at `key`, and then returns it. + * + * @template K + * @template V + * @param {Map} map + * @param {K} key + * @param {() => V} callback + * @returns {V} + */ +module.exports = function (map, key, callback) { + if (map.has(key)) return /** @type {V} */ (map.get(key)); + + const value = callback(); + + map.set(key, value); + + return value; +}; diff --git a/lib/utils/validateObjectWithArrayProps.js b/lib/utils/validateObjectWithArrayProps.js index 067f2dc79f..7eee556098 100644 --- a/lib/utils/validateObjectWithArrayProps.js +++ b/lib/utils/validateObjectWithArrayProps.js @@ -24,6 +24,8 @@ module.exports = (validator) => (value) => { return false; } + // TODO: Issue #4985 + // eslint-disable-next-line no-shadow return Object.values(value).every((value) => { if (!Array.isArray(value)) { return false; diff --git a/lib/utils/vendor.js b/lib/utils/vendor.js new file mode 100644 index 0000000000..b56b180c0d --- /dev/null +++ b/lib/utils/vendor.js @@ -0,0 +1,45 @@ +'use strict'; + +/** + * Contains helpers for working with vendor prefixes. + * + * Copied from https://github.com/postcss/postcss/commit/777c55b5d2a10605313a4972888f4f32005f5ac2 + * + * @namespace vendor + */ +module.exports = { + /** + * Returns the vendor prefix extracted from an input string. + * + * @param {string} prop String with or without vendor prefix. + * + * @return {string} vendor prefix or empty string + * + * @example + * vendor.prefix('-moz-tab-size') //=> '-moz-' + * vendor.prefix('tab-size') //=> '' + */ + prefix(prop) { + let match = prop.match(/^(-\w+-)/); + + if (match) { + return match[0]; + } + + return ''; + }, + + /** + * Returns the input string stripped of its vendor prefix. + * + * @param {string} prop String with or without vendor prefix. + * + * @return {string} String name without vendor prefixes. + * + * @example + * vendor.unprefixed('-moz-tab-size') //=> 'tab-size' + */ + unprefixed(prop) { + return prop.replace(/^-\w+-/, ''); + }, +}; diff --git a/lib/utils/whitespaceChecker.js b/lib/utils/whitespaceChecker.js index 2402f42a9d..c7e7ca31de 100644 --- a/lib/utils/whitespaceChecker.js +++ b/lib/utils/whitespaceChecker.js @@ -225,7 +225,9 @@ module.exports = function (targetWhitespace, expectation, messages) { } } - activeArgs.err(messageFunc(activeArgs.errTarget ? activeArgs.errTarget : source[index])); + const msgFunc = assertFunction(messageFunc); + + activeArgs.err(msgFunc(activeArgs.errTarget ? activeArgs.errTarget : source[index])); } /** @@ -250,7 +252,9 @@ module.exports = function (targetWhitespace, expectation, messages) { continue; } - err(messageFunc(activeArgs.errTarget ? activeArgs.errTarget : source[index])); + const msgFunc = assertFunction(messageFunc); + + err(msgFunc(activeArgs.errTarget ? activeArgs.errTarget : source[index])); return; } @@ -267,7 +271,9 @@ module.exports = function (targetWhitespace, expectation, messages) { const oneCharBefore = source[index - 1]; if (isValue(oneCharBefore) && isWhitespace(oneCharBefore)) { - activeArgs.err(messageFunc(activeArgs.errTarget ? activeArgs.errTarget : source[index])); + const msgFunc = assertFunction(messageFunc); + + activeArgs.err(msgFunc(activeArgs.errTarget ? activeArgs.errTarget : source[index])); } } @@ -315,7 +321,9 @@ module.exports = function (targetWhitespace, expectation, messages) { } } - activeArgs.err(messageFunc(activeArgs.errTarget ? activeArgs.errTarget : source[index])); + const msgFunc = assertFunction(messageFunc); + + activeArgs.err(msgFunc(activeArgs.errTarget ? activeArgs.errTarget : source[index])); } /** @@ -329,7 +337,9 @@ module.exports = function (targetWhitespace, expectation, messages) { const oneCharAfter = source[index + 1]; if (isValue(oneCharAfter) && isWhitespace(oneCharAfter)) { - activeArgs.err(messageFunc(activeArgs.errTarget ? activeArgs.errTarget : source[index])); + const msgFunc = assertFunction(messageFunc); + + activeArgs.err(msgFunc(activeArgs.errTarget ? activeArgs.errTarget : source[index])); } } @@ -347,3 +357,14 @@ module.exports = function (targetWhitespace, expectation, messages) { function isValue(x) { return x !== undefined && x !== null; } + +/** + * @param {unknown} x + */ +function assertFunction(x) { + if (typeof x === 'function') { + return x; + } + + throw new Error(`\`${x}\` must be a function`); +} diff --git a/package-lock.json b/package-lock.json index 38a3e30479..854b9dbd31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "stylelint", - "version": "13.7.0", + "version": "13.7.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -232,45 +232,6 @@ } } }, - "@babel/helper-builder-react-jsx-experimental": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz", - "integrity": "sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/types": "^7.11.5" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, "@babel/helper-compilation-targets": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", @@ -508,6 +469,15 @@ } } }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, "@babel/helper-module-transforms": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", @@ -565,10 +535,19 @@ } } }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true }, "@babel/helper-regex": { @@ -580,144 +559,6 @@ "lodash": "^4.17.13" } }, - "@babel/helper-remap-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", - "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, "@babel/helper-replace-supers": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", @@ -834,64 +675,60 @@ } } }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", "dev": true, "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - } + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", "requires": { "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" }, "dependencies": { "@babel/generator": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.5.tgz", - "integrity": "sha512-9UqHWJ4IwRTy4l0o8gq2ef8ws8UPzvtMkVKjTLAiRmza9p9V6Z+OfuNd9fB1j5Q67F+dVJtPC2sZXI8NM9br4g==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", "requires": { - "@babel/types": "^7.11.5", + "@babel/types": "^7.12.5", "jsesc": "^2.5.1", - "source-map": "^0.6.1" + "source-map": "^0.5.0" } }, "@babel/helper-split-export-declaration": { @@ -918,42 +755,30 @@ } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.5", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" - } } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -967,268 +792,168 @@ "js-tokens": "^4.0.0" }, "dependencies": { - "@babel/code-frame": { + "@babel/helper-validator-identifier": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", - "requires": { - "@babel/types": "^7.10.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } } } }, "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + } } } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } } } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.5.tgz", + "integrity": "sha512-UiAnkKuOrCyjZ3sYNHlRlfuZJbBHknMQ9VMwVeX97Ofwx7RpD6gS2HfqTCh8KNUQgcOm8IKt103oR4KIjh7Q8g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/plugin-transform-parameters": "^7.12.1" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } } } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "@babel/plugin-proposal-optional-chaining": { @@ -1304,20 +1029,12 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "@babel/plugin-syntax-dynamic-import": { @@ -1329,23 +1046,6 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-flow": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz", - "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } - } - }, "@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -1353,14 +1053,6 @@ "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "@babel/plugin-syntax-json-strings": { @@ -1373,20 +1065,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -1396,14 +1080,6 @@ "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "@babel/plugin-syntax-nullish-coalescing-operator": { @@ -1422,14 +1098,6 @@ "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "@babel/plugin-syntax-object-rest-spread": { @@ -1450,327 +1118,19 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", - "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.4.tgz", - "integrity": "sha512-J3b5CluMg3hPUii2onJDRiaVbPtKFPLEaV5dOPY5OeAbDi1iU/UbbFFTgwb7WnanaDy7bjU35kc26W3eM5Qa0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } - } - }, - "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", - "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-computed-properties": { + "@babel/plugin-syntax-top-level-await": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -1784,10 +1144,10 @@ } } }, - "@babel/plugin-transform-destructuring": { + "@babel/plugin-syntax-typescript": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", + "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -1801,13 +1161,12 @@ } } }, - "@babel/plugin-transform-dotall-regex": { + "@babel/plugin-transform-arrow-functions": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { @@ -1819,74 +1178,189 @@ } } }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + }, + "dependencies": { + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + } + } + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } } } }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.1" + } + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } } } }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz", - "integrity": "sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", + "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-flow": "^7.10.4" + "@babel/plugin-syntax-flow": "^7.12.1" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true + "@babel/plugin-syntax-flow": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz", + "integrity": "sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } } } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "@babel/plugin-transform-function-name": { @@ -2094,12 +1568,39 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + }, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.1" + } + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + } } }, "@babel/plugin-transform-new-target": { @@ -2108,15 +1609,11 @@ "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" } }, "@babel/plugin-transform-object-super": { @@ -2290,166 +1787,56 @@ } } }, - "@babel/plugin-transform-parameters": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz", - "integrity": "sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", - "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", - "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz", - "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-self": { + "@babel/plugin-transform-parameters": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", - "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz", + "integrity": "sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, "@babel/helper-plugin-utils": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", - "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { + }, + "@babel/helper-validator-identifier": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } } } }, - "@babel/plugin-transform-react-pure-annotations": { + "@babel/plugin-transform-property-literals": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", - "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { @@ -2488,37 +1875,22 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "@babel/plugin-transform-spread": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz", - "integrity": "sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { @@ -2549,11 +1921,26 @@ "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" } } }, @@ -2766,25 +2153,90 @@ } }, "@babel/preset-react": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", - "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.5.tgz", + "integrity": "sha512-jcs++VPrgyFehkMezHtezS2BpnUlR7tQFAyesJn1vGTO9aTFZrgIQrA5YydlTwxbcjMwkFY6i04flCigRRr3GA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.10.4", - "@babel/plugin-transform-react-jsx": "^7.10.4", - "@babel/plugin-transform-react-jsx-development": "^7.10.4", - "@babel/plugin-transform-react-jsx-self": "^7.10.4", - "@babel/plugin-transform-react-jsx-source": "^7.10.4", - "@babel/plugin-transform-react-pure-annotations": "^7.10.4" + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.5", + "@babel/plugin-transform-react-jsx-development": "^7.12.5", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.12.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz", + "integrity": "sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.5.tgz", + "integrity": "sha512-2xkcPqqrYiOQgSlM/iwto1paPijjsDbUynN13tI6bosDz/jOW3CRzYguIE8wKX32h+msbBM22Dv5fwrFkUOZjQ==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.12.1" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.5.tgz", + "integrity": "sha512-1JJusg3iPgsZDthyWiCr3KQiGs31ikU/mSf2N2dSYEAO0GEImmVUbWf0VoSDGDFTAn5Dj4DUiR6SdIXHY7tELA==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx-experimental": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.12.1" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz", + "integrity": "sha512-FbpL0ieNWiiBB5tCldX17EtXgmzeEZjFrix72rQYeq9X6nUK38HCaxexzVQrZWXanxKJPKVVIU37gFjEQYkPkA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz", + "integrity": "sha512-keQ5kBfjJNRc6zZN1/nVHCd6LLIHq4aUKcVnvE/2l+ZZROSbqoiGFRtT5t3Is89XJxBQaP7NLZX2jgGHdZvvFQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } } } }, @@ -2798,41 +2250,54 @@ } }, "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", - "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.5", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.5", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + } } }, "@babel/types": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", - "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.5", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, @@ -2853,9 +2318,9 @@ } }, "@eslint/eslintrc": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", - "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", + "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -2870,18 +2335,6 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -2937,23 +2390,23 @@ "dev": true }, "@jest/console": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.3.0.tgz", - "integrity": "sha512-/5Pn6sJev0nPUcAdpJHMVIsA8sKizL2ZkcKPE5+dJrCccks7tcM7c9wbgHudBJbxXLoTbqsHkG1Dofoem4F09w==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.3.0", - "jest-util": "^26.3.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", "slash": "^3.0.0" }, "dependencies": { "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -2962,47 +2415,38 @@ "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } } } }, "@jest/core": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.4.2.tgz", - "integrity": "sha512-sDva7YkeNprxJfepOctzS8cAk9TOekldh+5FhVuXS40+94SHbiicRO1VV2tSoRtgIo+POs/Cdyf8p76vPTd6dg==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/reporters": "^26.4.1", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.3.0", - "jest-config": "^26.4.2", - "jest-haste-map": "^26.3.0", - "jest-message-util": "^26.3.0", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-resolve-dependencies": "^26.4.2", - "jest-runner": "^26.4.2", - "jest-runtime": "^26.4.2", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "jest-watcher": "^26.3.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -3010,55 +2454,22 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "@jest/reporters": { - "version": "26.4.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.4.1.tgz", - "integrity": "sha512-aROTkCLU8++yiRGVxLsuDmZsQEKO6LprlrxtAuzvtpbIFl3eIjgIf3EUxDKgomkS25R9ZzwGEdB5weCcBZlrpQ==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.3.0", - "jest-resolve": "^26.4.0", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^5.0.1" - } - }, "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -3068,66 +2479,59 @@ "chalk": "^4.0.0" } }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { - "@types/istanbul-lib-report": "*" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", "dev": true, "requires": { - "color-name": "~1.1.4" + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } }, "rimraf": { "version": "3.0.2", @@ -3135,7 +2539,67 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "glob": "^7.1.3" + "glob": "^7.1.3" + } + } + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "dependencies": { + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" } }, "source-map": { @@ -3147,9 +2611,9 @@ } }, "@jest/source-map": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.3.0.tgz", - "integrity": "sha512-hWX5IHmMDWe1kyrKl7IhFwqOuAreIwHhbe44+XH2ZRHjrKIh0LO5eLQ/vxHFeAfRwJapmxuqlGAEYLadDq6ZGQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -3157,11 +2621,6 @@ "source-map": "^0.6.0" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3171,21 +2630,21 @@ } }, "@jest/transform": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.3.0.tgz", - "integrity": "sha512-Isj6NB68QorGoFWvcOjlUhpkT56PqNIsXKR7XfvoDlCANn/IANlh8DrKAA2l2JKC3yWSMH5wS0GwuQM20w3b2A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.3.0", + "jest-haste-map": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-util": "^26.3.0", + "jest-util": "^26.6.2", "micromatch": "^4.0.2", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -3193,15 +2652,10 @@ "write-file-atomic": "^3.0.0" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -3211,15 +2665,6 @@ "chalk": "^4.0.0" } }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3320,8 +2765,7 @@ "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" }, "chalk": { "version": "2.4.2", @@ -3333,44 +2777,6 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - } - } } } }, @@ -3834,6 +3240,27 @@ "resolve": "^1.12.0", "semver": "^5.4.1", "split2": "^3.1.1" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + } } }, "@parcel/packager-css": { @@ -3950,12 +3377,11 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -3991,9 +3417,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -4531,42 +3957,18 @@ } }, "@sindresorhus/is": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.2.tgz", - "integrity": "sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.0.tgz", + "integrity": "sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ==", "dev": true }, "@sinonjs/commons": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", - "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", "dev": true, "requires": { - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.6.0", - "cosmiconfig": "^6.0.0", - "find-versions": "^3.2.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - } + "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { @@ -4626,9 +4028,9 @@ } }, "@types/babel__core": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", - "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -4639,18 +4041,18 @@ } }, "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", + "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -4658,9 +4060,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.11.tgz", - "integrity": "sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", + "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -4699,7 +4101,8 @@ "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true }, "@types/debug": { "version": "4.1.5", @@ -4707,6 +4110,12 @@ "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", "dev": true }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, "@types/file-entry-cache": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@types/file-entry-cache/-/file-entry-cache-5.0.1.tgz", @@ -4722,28 +4131,25 @@ "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", "dev": true, "requires": { - "chalk": "^2.4.1", - "inquirer": "^6.2.1", - "rxjs": "^6.3.3" + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" }, "dependencies": { "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4754,7 +4160,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, "requires": { "restore-cursor": "^2.0.0" } @@ -4762,14 +4167,12 @@ "cli-width": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } @@ -4778,7 +4181,6 @@ "version": "6.5.2", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, "requires": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -4798,26 +4200,22 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, "requires": { "mimic-fn": "^1.0.0" } @@ -4826,7 +4224,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -4836,7 +4233,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -4846,7 +4242,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -4857,7 +4252,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, "requires": { "ansi-regex": "^4.1.0" }, @@ -4865,8 +4259,7 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" } } } @@ -4885,9 +4278,9 @@ "dev": true }, "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", "dev": true, "requires": { "@types/node": "*" @@ -4906,9 +4299,9 @@ "dev": true }, "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", "dev": true }, "@types/istanbul-lib-report": { @@ -4930,9 +4323,9 @@ } }, "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, "@types/keyv": { @@ -4945,11 +4338,20 @@ } }, "@types/lodash": { - "version": "4.14.161", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.161.tgz", - "integrity": "sha512-EP6O3Jkr7bXvZZSZYlsgt5DIjiGr0dXP1/jVEwVLTFgg0d+3lWVQkRavYVQszV7dYUwvg0B8R0MBDpcmXg7XIA==", + "version": "4.14.162", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.162.tgz", + "integrity": "sha512-alvcho1kRUnnD1Gcl4J+hK0eencvzq9rmzvFPRmP5rPHx9VVsJj6bKLTATPVf9ktgv4ujzh7T+XWKp+jhuODig==", "dev": true }, + "@types/mdast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", + "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", + "dev": true, + "requires": { + "@types/unist": "*" + } + }, "@types/micromatch": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.1.tgz", @@ -4959,6 +4361,12 @@ "@types/braces": "*" } }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, "@types/minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", @@ -4980,6 +4388,15 @@ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, + "@types/postcss-less": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/postcss-less/-/postcss-less-3.1.1.tgz", + "integrity": "sha512-q2JTciLRkA5zHzChlfk0qRH5tMzIM7fmnfasiSNNjQbBtX8n3fx5OCokfltr9M87ZCpwklNFLN6v2MmKC6/dhg==", + "dev": true, + "requires": { + "postcss": "^7.0.32" + } + }, "@types/postcss-safe-parser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/postcss-safe-parser/-/postcss-safe-parser-4.0.0.tgz", @@ -4990,9 +4407,9 @@ } }, "@types/prettier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.0.tgz", - "integrity": "sha512-/rM+sWiuOZ5dvuVzV37sUuklsbg+JPOP8d+nNFlo2ZtfpzPiPvh1/gc8liWOLBqe+sR+ZM7guPaIcTt6UZTo7Q==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", "dev": true }, "@types/q": { @@ -5011,9 +4428,9 @@ } }, "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, "@types/style-search": { @@ -5029,9 +4446,9 @@ "dev": true }, "@types/table": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/table/-/table-5.0.0.tgz", - "integrity": "sha512-fQLtGLZXor264zUPWI95WNDsZ3QV43/c0lJpR/h1hhLJumXRmHNsrvBfEzW2YMhb0EWCsn4U6h82IgwsajAuTA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/table/-/table-6.0.0.tgz", + "integrity": "sha512-RSmRiYetRzpcZcgNo4x6C1VSsPGBHCGGDO7Rbnz5esVLbGONxBP1CUcn8JhAkVzUVLO+AY8yOSkb27jvfauLyg==", "dev": true }, "@types/unist": { @@ -5049,9 +4466,9 @@ } }, "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -5064,55 +4481,91 @@ "dev": true }, "@typescript-eslint/experimental-utils": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.27.0.tgz", - "integrity": "sha512-vOsYzjwJlY6E0NJRXPTeCGqjv5OHgRU1kzxHKWJVPjDYGbPgLudBXjIlc+OD1hDBZ4l1DLbOc5VjofKahsu9Jw==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.1.tgz", + "integrity": "sha512-qyPqCFWlHZXkEBoV56UxHSoXW2qnTr4JrWVXOh3soBP3q0o7p4pUEMfInDwIa0dB/ypdtm7gLOS0hg0a73ijfg==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.27.0", + "@typescript-eslint/scope-manager": "4.6.1", + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/typescript-estree": "4.6.1", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" }, "dependencies": { - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "@typescript-eslint/scope-manager": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.6.1.tgz", + "integrity": "sha512-f95+80r6VdINYscJY1KDUEDcxZ3prAWHulL4qRDfNVD0I5QAVSGqFkwHERDoLYJJWmEAkUMdQVvx7/c2Hp+Bjg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/visitor-keys": "4.6.1" + } + }, + "@typescript-eslint/types": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.6.1.tgz", + "integrity": "sha512-k2ZCHhJ96YZyPIsykickez+OMHkz06xppVLfJ+DY90i532/Cx2Z+HiRMH8YZQo7a4zVd/TwNBuRCdXlGK4yo8w==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.1.tgz", + "integrity": "sha512-owABze4toX7QXwOLT3/D5a8NecZEjEWU1srqxENTfqsY3bwVnl3YYbOh6s1rp2wQKO9RTHFGjKes08FgE7SVMw==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/types": "4.6.1", + "eslint-visitor-keys": "^2.0.0" } } } }, "@typescript-eslint/typescript-estree": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.27.0.tgz", - "integrity": "sha512-t2miCCJIb/FU8yArjAvxllxbTiyNqaXJag7UOpB5DVoM3+xnjeOngtqlJkLRnMtzaRcJhe3CIR9RmL40omubhg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.1.tgz", + "integrity": "sha512-/J/kxiyjQQKqEr5kuKLNQ1Finpfb8gf/NpbwqFFYEBjxOsZ621r9AqwS9UDRA1Rrr/eneX/YsbPAIhU2rFLjXQ==", "dev": true, "requires": { + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/visitor-keys": "4.6.1", "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", + "globby": "^11.0.1", "is-glob": "^4.0.1", "lodash": "^4.17.15", - "semver": "^6.3.0", + "semver": "^7.3.2", "tsutils": "^3.17.1" }, "dependencies": { + "@typescript-eslint/types": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.6.1.tgz", + "integrity": "sha512-k2ZCHhJ96YZyPIsykickez+OMHkz06xppVLfJ+DY90i532/Cx2Z+HiRMH8YZQo7a4zVd/TwNBuRCdXlGK4yo8w==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.1.tgz", + "integrity": "sha512-owABze4toX7QXwOLT3/D5a8NecZEjEWU1srqxENTfqsY3bwVnl3YYbOh6s1rp2wQKO9RTHFGjKes08FgE7SVMw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.6.1", + "eslint-visitor-keys": "^2.0.0" + } + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } }, "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, "abortcontroller-polyfill": { @@ -5122,9 +4575,9 @@ "dev": true }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-globals": { @@ -5146,9 +4599,9 @@ } }, "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, "acorn-walk": { @@ -5168,9 +4621,9 @@ } }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -5472,9 +4925,9 @@ "dev": true }, "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "babel-plugin-dynamic-import-node": { @@ -5499,6 +4952,48 @@ "test-exclude": "^6.0.0" } }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz", + "integrity": "sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, "bail": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", @@ -5532,35 +5027,6 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, @@ -5769,16 +5235,16 @@ } }, "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "dev": true, "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", + "elliptic": "^6.5.3", "inherits": "^2.0.4", "parse-asn1": "^5.1.5", "readable-stream": "^3.6.0", @@ -5803,14 +5269,31 @@ } }, "browserslist": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", - "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", + "version": "4.14.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.6.tgz", + "integrity": "sha512-zeFYcUo85ENhc/zxHbiIp0LGzzTrE2Pv2JhxvS7kpUb9Q9D38kUX6Bie7pGutJ/5iF5rOxE7CepAuWD56xJ33A==", "requires": { - "caniuse-lite": "^1.0.30001093", - "electron-to-chromium": "^1.3.488", - "escalade": "^3.0.1", - "node-releases": "^1.1.58" + "caniuse-lite": "^1.0.30001154", + "electron-to-chromium": "^1.3.585", + "escalade": "^3.1.1", + "node-releases": "^1.1.65" + }, + "dependencies": { + "electron-to-chromium": { + "version": "1.3.588", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.588.tgz", + "integrity": "sha512-0zr+ZfytnLeJZxGgmEpPTcItu5Mm4A5zHPZXLfHcGp0mdsk95rmD7ePNewYtK1yIdLbk8Z1U2oTRRfOtR4gbYg==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "node-releases": { + "version": "1.1.65", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.65.tgz", + "integrity": "sha512-YpzJOe2WFIW0V4ZkJQd/DGR/zdVwc/pI4Nl1CZrBO19FdRcSTmsuhdttw9rsTzzJLrNcSloLiBbEYx1C4f6gpA==" + } } }, "bser": { @@ -5823,13 +5306,13 @@ } }, "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-from": { @@ -5959,9 +5442,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001096", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001096.tgz", - "integrity": "sha512-PFTw9UyVfbkcMEFs82q8XVlRayj7HKvnhu5BLcmjGpv+SNyiWasCcWXPGJuO0rK0dhLRDJmtZcJ+LHUfypbw1w==" + "version": "1.0.30001156", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001156.tgz", + "integrity": "sha512-z7qztybA2eFZTB6Z3yvaQBIoJpQtsewRD74adw2UbRWwsRq3jIPvgrQGawBMbfafekQaD21FWuXNcywtTDGGCw==" }, "capture-exit": { "version": "2.0.0", @@ -5979,9 +5462,9 @@ "dev": true }, "ccount": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", - "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" }, "chalk": { "version": "4.1.0", @@ -5993,11 +5476,10 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -6020,9 +5502,9 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -6058,8 +5540,7 @@ "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "chokidar": { "version": "3.3.1", @@ -6075,6 +5556,17 @@ "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.3.0" + }, + "dependencies": { + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } + } } }, "chrome-trace-event": { @@ -6102,6 +5594,12 @@ "safe-buffer": "^5.0.1" } }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -6121,7 +5619,26 @@ "dev": true, "requires": { "is-descriptor": "^0.1.0" + }, + "dependencies": { + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + } } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -6132,9 +5649,9 @@ "dev": true }, "cli-boxes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true }, "cli-cursor": { @@ -6163,12 +5680,11 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -6241,15 +5757,9 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, "requires": { "mimic-response": "^1.0.0" - }, - "dependencies": { - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - } } }, "co": { @@ -6368,6 +5878,12 @@ "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", "dev": true }, + "commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "dev": true + }, "common-tags": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", @@ -6573,16 +6089,40 @@ } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "crypto-browserify": { @@ -6996,11 +6536,11 @@ "dev": true }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -7025,9 +6565,9 @@ } }, "decimal.js": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", - "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", "dev": true }, "decode-uri-component": { @@ -7043,6 +6583,14 @@ "dev": true, "requires": { "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } } }, "dedent": { @@ -7109,69 +6657,31 @@ "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } } }, "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dev": true, "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", "is-glob": "^4.0.1", "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", "slash": "^3.0.0" }, "dependencies": { - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" + "aggregate-error": "^3.0.0" } }, "rimraf": { @@ -7213,6 +6723,12 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -7316,9 +6832,9 @@ } }, "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { "is-obj": "^2.0.0" @@ -7372,11 +6888,6 @@ "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", "dev": true }, - "electron-to-chromium": { - "version": "1.3.492", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.492.tgz", - "integrity": "sha512-AD6v9Y2wN0HuoRH4LwCmlSHjkKq51D1U52bTuvM5uPzisbHVm3Hms15c42TBFLewxnSqxAynK/tbeaUi4Rnjqw==" - }, "elegant-spinner": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", @@ -7407,9 +6918,9 @@ } }, "emittery": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz", - "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", "dev": true }, "emoji-regex": { @@ -7513,11 +7024,6 @@ "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", "dev": true }, - "escalade": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", - "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==" - }, "escape-goat": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", @@ -7536,9 +7042,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, "requires": { "esprima": "^4.0.1", @@ -7548,32 +7054,71 @@ "source-map": "~0.6.1" }, "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } } } }, "eslint": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.8.1.tgz", - "integrity": "sha512-/2rX2pfhyUG0y+A123d0ccXtMm7DV7sH1m3lk9nk2DZ2LReq39FXHueR9xZwshE5MdfSf0xunSaMWRqyIA6M1w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.1.tgz", + "integrity": "sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.1.3", + "@eslint/eslintrc": "^0.2.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", + "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", + "eslint-visitor-keys": "^2.0.0", "espree": "^7.3.0", "esquery": "^1.2.0", "esutils": "^2.0.2", @@ -7608,29 +7153,12 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -7652,63 +7180,12 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", @@ -7753,31 +7230,13 @@ "slice-ansi": "^2.1.0", "string-width": "^3.0.0" } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, "eslint-config-prettier": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz", - "integrity": "sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -7792,49 +7251,32 @@ } }, "eslint-config-stylelint": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-stylelint/-/eslint-config-stylelint-12.0.0.tgz", - "integrity": "sha512-6Q9KCFShMFsYX7YzevtEdxWW8BMWo9M6kw0mdIsv9m/I6B7tFCNo9bYmF3khMQ/yN27Zy62ezRgr+lUHIhQUrA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-stylelint/-/eslint-config-stylelint-13.0.0.tgz", + "integrity": "sha512-EaaG/evY1UcoyB8nCp/Jz0EdNamOXPYbXDNwxyD7rNkVOCgBGRZgd0Dj8oYUMQCbLh8B749oI7pwgeGcdRSipw==", "dev": true, "requires": { "eslint-config-prettier": "^6.10.1", "eslint-plugin-eslint-comments": "^3.1.2", - "eslint-plugin-jest": "^23.8.2", + "eslint-plugin-jest": "^24.0.2", "eslint-plugin-node": "^11.1.0", "eslint-plugin-sort-requires": "^2.1.0" } }, "eslint-plugin-es": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", - "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", "dev": true, "requires": { "eslint-utils": "^2.0.0", "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - } } }, "eslint-plugin-eslint-comments": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz", - "integrity": "sha512-QexaqrNeteFfRTad96W+Vi4Zj1KFbkHHNMMaHZEYcovKav6gdomyGzaxSDSL3GoIyUOo078wRAdYlu1caiauIQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", + "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5", @@ -7842,12 +7284,12 @@ } }, "eslint-plugin-jest": { - "version": "23.8.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz", - "integrity": "sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.1.0.tgz", + "integrity": "sha512-827YJ+E8B9PvXu/0eiVSNFfxxndbKv+qE/3GSMhdorCaeaOehtqHGX2YDW9B85TEOre9n/zscledkFW/KbnyGg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "^2.5.0" + "@typescript-eslint/experimental-utils": "^4.0.1" } }, "eslint-plugin-node": { @@ -7864,15 +7306,6 @@ "semver": "^6.1.0" }, "dependencies": { - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -7888,12 +7321,12 @@ "dev": true }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -7904,12 +7337,20 @@ "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", "dev": true }, "espree": { @@ -7923,12 +7364,6 @@ "eslint-visitor-keys": "^1.3.0" }, "dependencies": { - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", - "dev": true - }, "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", @@ -7961,12 +7396,20 @@ } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "estraverse": { @@ -8024,6 +7467,19 @@ "strip-eof": "^1.0.0" }, "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -8032,6 +7488,12 @@ "requires": { "pump": "^3.0.0" } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true } } }, @@ -8091,6 +7553,23 @@ "is-extendable": "^0.1.0" } }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -8129,7 +7608,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -8169,35 +7647,6 @@ "requires": { "is-extendable": "^0.1.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, @@ -8660,12 +8109,12 @@ } }, "got": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-11.6.0.tgz", - "integrity": "sha512-ErhWb4IUjQzJ3vGs3+RR12NWlBDDkRciFpAkQ1LPUxi6OnwhGj07gQxjPsyIk69s7qMihwKrKquV6VQq7JNYLA==", + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.0.tgz", + "integrity": "sha512-k9noyoIIY9EejuhaBNLyZ31D5328LeqnyPNXJQb2XlJZcKakLqN5m6O/ikhq/0lw56kUYS54fVm+D1x57YC9oQ==", "dev": true, "requires": { - "@sindresorhus/is": "^3.1.1", + "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", @@ -8698,12 +8147,12 @@ "dev": true }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, @@ -8975,7 +8424,8 @@ "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true }, "http-proxy": { "version": "1.18.1", @@ -9153,43 +8603,27 @@ "dev": true }, "husky": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", - "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", + "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", "dev": true, "requires": { "chalk": "^4.0.0", "ci-info": "^2.0.0", "compare-versions": "^3.6.0", - "cosmiconfig": "^6.0.0", + "cosmiconfig": "^7.0.0", "find-versions": "^3.2.0", "opencollective-postinstall": "^2.0.2", "pkg-dir": "^4.2.0", "please-upgrade-node": "^3.2.0", "slash": "^3.0.0", "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - } } }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -9638,6 +9072,15 @@ "rgba-regex": "^1.0.0" } }, + "is-core-module": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", + "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -9676,21 +9119,33 @@ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" }, "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } } } }, @@ -10036,11 +9491,6 @@ "semver": "^6.3.0" }, "dependencies": { - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -10067,9 +9517,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -10107,297 +9557,135 @@ } }, "jest": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.4.2.tgz", - "integrity": "sha512-LLCjPrUh98Ik8CzW8LLVnSCfLaiY+wbK53U7VxnFSX7Q+kWC4noVeDvGWIFw0Amfq1lq2VfGm7YHWSLBV62MJw==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", "dev": true, "requires": { - "@jest/core": "^26.4.2", + "@jest/core": "^26.6.3", "import-local": "^3.0.2", - "jest-cli": "^26.4.2" + "jest-cli": "^26.6.3" }, "dependencies": { "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "jest-cli": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.4.2.tgz", - "integrity": "sha512-zb+lGd/SfrPvoRSC/0LWdaWCnscXc1mGYW//NP4/tmBvRPT3VntZ2jtKUONsRi59zc5JqmsSajA9ewJKFYp8Cw==", - "dev": true, - "requires": { - "@jest/core": "^26.4.2", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "prompts": "^2.0.1", - "yargs": "^15.3.1" - } - } - } - }, - "jest-changed-files": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.3.0.tgz", - "integrity": "sha512-1C4R4nijgPltX6fugKxM4oQ18zimS7LqQ+zTTY8lMCMFPrxqBFb7KJH0Z2fRQJvw2Slbaipsqq7s1mgX5Iot+g==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - } - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" } }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" } } } }, "jest-circus": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.4.2.tgz", - "integrity": "sha512-gzxoteivskdUTNxT7Jx6hrANsEm+x1wh8jaXmQCtzC7zoNWirk9chYdSosHFC4tJlfDZa0EsPreVAxLicLsV0w==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.3.tgz", + "integrity": "sha512-ACrpWZGcQMpbv13XbzRzpytEJlilP/Su0JtNCi5r/xLpOUhnaIJr8leYYpLEMgPFURZISEHrnnpmB54Q/UziPw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^26.4.2", + "expect": "^26.6.2", "is-generator-fn": "^2.0.0", - "jest-each": "^26.4.2", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-runner": "^26.4.2", - "jest-runtime": "^26.4.2", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "pretty-format": "^26.4.2", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", "stack-utils": "^2.0.2", "throat": "^5.0.0" }, "dependencies": { "@jest/environment": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz", - "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^26.3.0" + "jest-mock": "^26.6.2" } }, "@jest/fake-timers": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz", - "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -10408,12 +9696,11 @@ } }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -10439,76 +9726,76 @@ "dev": true }, "expect": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.2.tgz", - "integrity": "sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "ansi-styles": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0" } } } }, "jest-config": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.4.2.tgz", - "integrity": "sha512-QBf7YGLuToiM8PmTnJEdRxyYy3mHWLh24LJZKVdXZ2PNdizSe1B/E8bVm+HYcjbEzGuVXDv/di+EzdO/6Gq80A==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.4.2", - "@jest/types": "^26.3.0", - "babel-jest": "^26.3.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.3.0", - "jest-environment-node": "^26.3.0", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.4.2", + "jest-jasmine2": "^26.6.3", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", "micromatch": "^4.0.2", - "pretty-format": "^26.4.2" + "pretty-format": "^26.6.2" }, "dependencies": { "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.4.2.tgz", - "integrity": "sha512-83DRD8N3M0tOhz9h0bn6Kl6dSp+US6DazuVF8J9m21WAp5x7CqSMaNycMP0aemC/SH/pDQQddbsfHRTBXVUgog==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "dev": true, "requires": { - "@jest/test-result": "^26.3.0", + "@jest/test-result": "^26.6.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.3.0", - "jest-runner": "^26.4.2", - "jest-runtime": "^26.4.2" + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" } }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -10518,92 +9805,34 @@ "chalk": "^4.0.0" } }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, "babel-jest": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.3.0.tgz", - "integrity": "sha512-sxPnQGEyHAOPF8NcUsD0g7hDCnvLL2XyblRBcgrzTWBB/mAIpWow3n1bEL+VghnnZfreLhFSBsFluRoK2tRK4g==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "dev": true, "requires": { - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.3.0", + "babel-preset-jest": "^26.6.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" } - }, - "babel-plugin-jest-hoist": { - "version": "26.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz", - "integrity": "sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", - "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.3.0.tgz", - "integrity": "sha512-5WPdf7nyYi2/eRxCbVrE1kKCWxgWY4RsPEbdJWFm7QsesFGqjdkyLeu1zRkwM1cxK6EPIlNd6d2AxLk7J+t4pw==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.2.0", - "babel-preset-current-node-syntax": "^0.1.3" - } } } }, "jest-diff": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.2.tgz", - "integrity": "sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^26.3.0", + "diff-sequences": "^26.6.2", "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" - }, - "dependencies": { - "diff-sequences": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz", - "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==", - "dev": true - } + "pretty-format": "^26.6.2" } }, "jest-docblock": { @@ -10616,22 +9845,22 @@ } }, "jest-each": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.4.2.tgz", - "integrity": "sha512-p15rt8r8cUcRY0Mvo1fpkOGYm7iI8S6ySxgIdfh3oOIv+gHwrHTy5VWCGOecWUhDsit4Nz8avJWdT07WLpbwDA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-util": "^26.3.0", - "pretty-format": "^26.4.2" + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" }, "dependencies": { "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -10644,50 +9873,50 @@ } }, "jest-environment-jsdom": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.3.0.tgz", - "integrity": "sha512-zra8He2btIMJkAzvLaiZ9QwEPGEetbxqmjEBQwhH3CA+Hhhu0jSiEJxnJMbX28TGUvPLxBt/zyaTLrOPF4yMJA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "dev": true, "requires": { - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0", - "jsdom": "^16.2.2" + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" }, "dependencies": { "@jest/environment": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz", - "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^26.3.0" + "jest-mock": "^26.6.2" } }, "@jest/fake-timers": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz", - "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -10700,49 +9929,49 @@ } }, "jest-environment-node": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.3.0.tgz", - "integrity": "sha512-c9BvYoo+FGcMj5FunbBgtBnbR5qk3uky8PKyRVpSfe2/8+LrNQMiXX53z6q2kY+j15SkjQCOSL/6LHnCPLVHNw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "dev": true, "requires": { - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" }, "dependencies": { "@jest/environment": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz", - "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^26.3.0" + "jest-mock": "^26.6.2" } }, "@jest/fake-timers": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz", - "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -10761,12 +9990,12 @@ "dev": true }, "jest-haste-map": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.3.0.tgz", - "integrity": "sha512-DHWBpTJgJhLLGwE5Z1ZaqLTYqeODQIZpby0zMBsCU9iRFHYyhklYqP4EiG73j5dkbaAdSZhgB938mL51Q5LeZA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", @@ -10774,18 +10003,18 @@ "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.3.0", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" }, "dependencies": { "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -10794,86 +10023,77 @@ "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } } } }, "jest-jasmine2": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz", - "integrity": "sha512-z7H4EpCldHN1J8fNgsja58QftxBSL+JcwZmaXIvV9WKIM+x49F4GLHu/+BQh2kzRKHAgaN/E82od+8rTOBPyPA==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.3.0", - "@jest/source-map": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.4.2", + "expect": "^26.6.2", "is-generator-fn": "^2.0.0", - "jest-each": "^26.4.2", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-runtime": "^26.4.2", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "pretty-format": "^26.4.2", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", "throat": "^5.0.0" }, "dependencies": { "@jest/environment": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz", - "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^26.3.0" + "jest-mock": "^26.6.2" } }, "@jest/fake-timers": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz", - "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -10884,12 +10104,11 @@ } }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -10915,145 +10134,64 @@ "dev": true }, "expect": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.2.tgz", - "integrity": "sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "ansi-styles": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0" } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==" - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, "jest-leak-detector": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.4.2.tgz", - "integrity": "sha512-akzGcxwxtE+9ZJZRW+M2o+nTNnmQZxrHJxX/HjgDaU5+PLmY1qnQPnMjgADPGCRPhB+Yawe1iij0REe+k/aHoA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", "dev": true, "requires": { "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" + "pretty-format": "^26.6.2" } }, "jest-matcher-utils": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.4.2.tgz", - "integrity": "sha512-KcbNqWfWUG24R7tu9WcAOKKdiXiXCbMvQYT6iodZ9k1f7065k0keUOW6XpJMMvah+hTfqkhJhRXmA3r3zMAg0Q==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^26.4.2", + "jest-diff": "^26.6.2", "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" + "pretty-format": "^26.6.2" } }, "jest-message-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.3.0.tgz", - "integrity": "sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.3.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" }, "dependencies": { "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -11062,32 +10200,23 @@ "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } } } }, "jest-mock": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.3.0.tgz", - "integrity": "sha512-PeaRrg8Dc6mnS35gOo/CbZovoDPKAeB1FICZiuagAgGvbWdNNyjQjkOaGUa/3N3JtpQ/Mh9P4A2D4Fv51NnP8Q==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@types/node": "*" }, "dependencies": { "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -11096,15 +10225,6 @@ "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } } } }, @@ -11127,25 +10247,25 @@ "dev": true }, "jest-resolve": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.4.0.tgz", - "integrity": "sha512-bn/JoZTEXRSlEx3+SfgZcJAVuTMOksYq9xe9O6s4Ekg84aKBObEaVXKOEilULRqviSLAYJldnoWV9c07kwtiCg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.3.0", + "jest-util": "^26.6.2", "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", + "resolve": "^1.18.1", "slash": "^3.0.0" }, "dependencies": { "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -11155,122 +10275,88 @@ "chalk": "^4.0.0" } }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", "dev": true, "requires": { + "is-core-module": "^2.0.0", "path-parse": "^1.0.6" } } } }, - "jest-resolve-dependencies": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.2.tgz", - "integrity": "sha512-ADHaOwqEcVc71uTfySzSowA/RdxUpCxhxa2FNLiin9vWLB1uLPad3we+JSSROq5+SrL9iYPdZZF8bdKM7XABTQ==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.4.2" - }, - "dependencies": { - "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, "jest-runner": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.4.2.tgz", - "integrity": "sha512-FgjDHeVknDjw1gRAYaoUoShe1K3XUuFMkIaXbdhEys+1O4bEJS8Avmn4lBwoMfL8O5oFTdWYKcf3tEJyyYyk8g==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/environment": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.7.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.4.2", + "jest-config": "^26.6.3", "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.3.0", - "jest-leak-detector": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-resolve": "^26.4.0", - "jest-runtime": "^26.4.2", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "source-map-support": "^0.5.6", "throat": "^5.0.0" }, "dependencies": { "@jest/environment": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz", - "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^26.3.0" + "jest-mock": "^26.6.2" } }, "@jest/fake-timers": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz", - "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -11279,105 +10365,97 @@ "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } } } }, "jest-runtime": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.4.2.tgz", - "integrity": "sha512-4Pe7Uk5a80FnbHwSOk7ojNCJvz3Ks2CNQWT5Z7MJo4tX0jb3V/LThKvD9tKPNVNyeMH98J/nzGlcwc00R2dSHQ==", - "dev": true, - "requires": { - "@jest/console": "^26.3.0", - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/globals": "^26.4.2", - "@jest/source-map": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/yargs": "^15.0.0", "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.4.2", - "jest-haste-map": "^26.3.0", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", "slash": "^3.0.0", "strip-bom": "^4.0.0", - "yargs": "^15.3.1" + "yargs": "^15.4.1" }, "dependencies": { "@jest/environment": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz", - "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^26.3.0" + "jest-mock": "^26.6.2" } }, "@jest/fake-timers": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz", - "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "@jest/globals": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.4.2.tgz", - "integrity": "sha512-Ot5ouAlehhHLRhc+sDz2/9bmNv9p5ZWZ9LE1pXGGTCXBasmi5jnYjlgYcYt03FBwLmZXCZ7GrL29c33/XRQiow==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "dev": true, "requires": { - "@jest/environment": "^26.3.0", - "@jest/types": "^26.3.0", - "expect": "^26.4.2" + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" } }, "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -11388,12 +10466,11 @@ } }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -11413,25 +10490,25 @@ "dev": true }, "expect": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.2.tgz", - "integrity": "sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "ansi-styles": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0" } } } }, "jest-serializer": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.3.0.tgz", - "integrity": "sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { "@types/node": "*", @@ -11439,32 +10516,33 @@ } }, "jest-snapshot": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.4.2.tgz", - "integrity": "sha512-N6Uub8FccKlf5SBFnL2Ri/xofbaA68Cc3MGjP/NuwgnsvWh+9hLIR/DhrxbSiKXMY9vUW5dI6EW1eHaDHqe9sg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.0.0", "chalk": "^4.0.0", - "expect": "^26.4.2", + "expect": "^26.6.2", "graceful-fs": "^4.2.4", - "jest-diff": "^26.4.2", + "jest-diff": "^26.6.2", "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-resolve": "^26.4.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", "natural-compare": "^1.4.0", - "pretty-format": "^26.4.2", + "pretty-format": "^26.6.2", "semver": "^7.3.2" }, "dependencies": { "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -11475,12 +10553,11 @@ } }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -11500,16 +10577,16 @@ "dev": true }, "expect": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.2.tgz", - "integrity": "sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "ansi-styles": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0" } }, @@ -11522,12 +10599,12 @@ } }, "jest-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.3.0.tgz", - "integrity": "sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -11536,9 +10613,9 @@ }, "dependencies": { "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -11547,36 +10624,27 @@ "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } } } }, "jest-validate": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.4.2.tgz", - "integrity": "sha512-blft+xDX7XXghfhY0mrsBCYhX365n8K5wNDC4XAcNKqqjEzsRUSXP44m6PL0QJEW2crxQFLLztVnJ4j7oPlQrQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "camelcase": "^6.0.0", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^26.4.2" + "pretty-format": "^26.6.2" }, "dependencies": { "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -11587,59 +10655,59 @@ } }, "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true } } }, "jest-watch-typeahead": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.0.tgz", - "integrity": "sha512-mY0u5D1U/mEzeO/tpcDWnWaakuQiBp8gZY1K0HxduMeKSYm4WvbBVfU15a/hWMMs4J9FrXaYjAWs5XGlOpx5IQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", + "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", "dev": true, "requires": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", "jest-regex-util": "^26.0.0", - "jest-watcher": "^26.0.0", + "jest-watcher": "^26.3.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0" } }, "jest-watcher": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.3.0.tgz", - "integrity": "sha512-XnLdKmyCGJ3VoF6G/p5ohbJ04q/vv5aH9ENI+i6BL0uu9WWB6Z7Z2lhQQk0d2AVZcRGp1yW+/TsoToMhBFPRdQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", "dev": true, "requires": { - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.3.0", + "jest-util": "^26.6.2", "string-length": "^4.0.1" }, "dependencies": { "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -11652,9 +10720,9 @@ } }, "jest-worker": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", - "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { "@types/node": "*", @@ -11662,11 +10730,6 @@ "supports-color": "^7.0.0" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11814,7 +10877,8 @@ "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "json-parse-even-better-errors": { "version": "2.3.0", @@ -11891,9 +10955,9 @@ "dev": true }, "known-css-properties": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.19.0.tgz", - "integrity": "sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA==" + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.20.0.tgz", + "integrity": "sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw==" }, "latest-version": { "version": "5.1.0", @@ -11926,13 +10990,13 @@ "dev": true }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "libnpmconfig": { @@ -12003,20 +11067,20 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "lint-staged": { - "version": "10.2.13", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.13.tgz", - "integrity": "sha512-conwlukNV6aL9SiMWjFtDp5exeDnTMekdNPDZsKGnpfQuHcO0E3L3Bbf58lcR+M7vk6LpCilxDAVks/DDVBYlA==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.1.tgz", + "integrity": "sha512-fTkTGFtwFIJJzn/PbUO3RXyEBHIhbfYBE7+rJyLcOXabViaO/h6OslgeK6zpeUtzkDrzkgyAYDTLAwx6JzDTHw==", "dev": true, "requires": { "chalk": "^4.1.0", "cli-truncate": "^2.1.0", - "commander": "^6.0.0", + "commander": "^6.2.0", "cosmiconfig": "^7.0.0", - "debug": "^4.1.1", + "debug": "^4.2.0", "dedent": "^0.7.0", "enquirer": "^2.3.6", - "execa": "^4.0.3", - "listr2": "^2.6.0", + "execa": "^4.1.0", + "listr2": "^3.2.2", "log-symbols": "^4.0.0", "micromatch": "^4.0.2", "normalize-path": "^3.0.0", @@ -12025,27 +11089,10 @@ "stringify-object": "^3.3.0" }, "dependencies": { - "commander": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz", - "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -12066,42 +11113,12 @@ "dev": true }, "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "isexe": "^2.0.0" + "path-key": "^3.0.0" } } } @@ -12431,9 +11448,9 @@ } }, "listr2": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.2.tgz", - "integrity": "sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.2.tgz", + "integrity": "sha512-AajqcZEUikF2ioph6PfH3dIuxJclhr3i3kHgTOP0xeXdWQohrvJAAmqVcV43/GI987HFY/vzT73jYXoa4esDHg==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -12442,7 +11459,7 @@ "indent-string": "^4.0.0", "log-update": "^4.0.0", "p-map": "^4.0.0", - "rxjs": "^6.6.2", + "rxjs": "^6.6.3", "through": "^2.3.8" }, "dependencies": { @@ -12454,6 +11471,15 @@ "requires": { "aggregate-error": "^3.0.0" } + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } } } }, @@ -12745,12 +11771,39 @@ "unist-util-visit": "^2.0.0" } }, + "mdast-util-from-markdown": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.0.tgz", + "integrity": "sha512-x9b9ekG2IfeqHSUPhn4+o8SeXqual0/ZHzzugV/cC21L6s1KyKAwIHKBJ1NN9ZstIlY8YAefELRSWfJMby4a9Q==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^1.0.0", + "micromark": "~2.10.0", + "parse-entities": "^2.0.0" + } + }, "mdast-util-heading-style": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/mdast-util-heading-style/-/mdast-util-heading-style-1.0.6.tgz", "integrity": "sha512-8ZuuegRqS0KESgjAGW8zTx4tJ3VNIiIaGFNEzFpRSAQBavVc7AvOo9I4g3crcZBfYisHs4seYh0rAVimO6HyOw==", "dev": true }, + "mdast-util-to-markdown": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.5.1.tgz", + "integrity": "sha512-7WS59irdm7lwd8iyfu+kLF+ktfzlvxLJzI/SwysF1EFFGpkU/G60Q61k7xZ420gsMVkXZ3MlcL3bTYCz5QwDeg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "stringify-entities": "^3.0.0", + "zwitch": "^1.0.0" + } + }, "mdast-util-to-string": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", @@ -12825,6 +11878,16 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, + "micromark": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.10.1.tgz", + "integrity": "sha512-fUuVF8sC1X7wsCS29SYQ2ZfIZYbTymp0EYr6sab3idFjigFFjGa5UwoniPlV9tAgntjuapW1t9U+S0yDYeGKHQ==", + "dev": true, + "requires": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -12858,6 +11921,12 @@ "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, "mime-types": { "version": "2.1.27", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", @@ -12865,14 +11934,6 @@ "dev": true, "requires": { "mime-db": "1.44.0" - }, - "dependencies": { - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - } } }, "mimic-fn": { @@ -12882,9 +11943,9 @@ "dev": true }, "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true }, "min-indent": { @@ -13107,11 +12168,6 @@ } } }, - "node-releases": { - "version": "1.1.60", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", - "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==" - }, "normalize-html-whitespace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz", @@ -13148,7 +12204,8 @@ "normalize-url": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true }, "np": { "version": "6.5.0", @@ -13695,6 +12752,14 @@ "dev": true, "requires": { "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + } } }, "nth-check": { @@ -13759,6 +12824,25 @@ "dev": true, "requires": { "is-descriptor": "^0.1.0" + }, + "dependencies": { + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, "is-buffer": { @@ -13902,23 +12986,23 @@ } }, "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", "dev": true }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, "ora": { @@ -14065,8 +13149,7 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "ow": { "version": "0.15.1", @@ -14279,12 +13362,14 @@ "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, "requires": { "json-buffer": "3.0.0" } @@ -14294,13 +13379,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" + "p-locate": "^4.1.0" }, "dependencies": { "get-stream": { @@ -14321,7 +13400,8 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true }, "mimic-response": { "version": "1.0.1", @@ -14365,6 +13445,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, "requires": { "lowercase-keys": "^1.0.0" } @@ -14515,9 +13596,9 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -14651,9 +13732,9 @@ "dev": true }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -14680,20 +13761,14 @@ } } }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1" + } }, "source-map": { "version": "0.6.1", @@ -14707,11 +13782,6 @@ "requires": { "has-flag": "^3.0.0" } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" } } }, @@ -15059,18 +14129,46 @@ "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "dev": true, "requires": { - "find-up": "^4.0.0" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" }, "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -15365,13 +14463,14 @@ } }, "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "requires": { "cssesc": "^3.0.0", "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" } }, "postcss-svgo": { @@ -15441,9 +14540,9 @@ "dev": true }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prepend-http": { @@ -15453,9 +14552,9 @@ "dev": true }, "prettier": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.1.tgz", - "integrity": "sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", "dev": true }, "prettier-plugin-packagejson": { @@ -15468,21 +14567,21 @@ } }, "pretty-format": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", - "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" }, "dependencies": { "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -15490,26 +14589,14 @@ "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" - }, - "dependencies": { - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - } } }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -15549,13 +14636,13 @@ "dev": true }, "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "dev": true, "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.4" + "sisteransi": "^1.0.5" } }, "prop-types": { @@ -15567,6 +14654,14 @@ "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.8.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + } } }, "propose": { @@ -15826,9 +14921,9 @@ } }, "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", "dev": true }, "react-refresh": { @@ -15908,15 +15003,6 @@ "util-deprecate": "^1.0.1" } }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.7" - } - }, "redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -16038,14 +15124,45 @@ } }, "remark-cli": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/remark-cli/-/remark-cli-8.0.1.tgz", - "integrity": "sha512-UaYeFI5qUAzkthUd8/MLBQD5OKM6jLN8GRvF6v+KF7xO/i1jQ+X2VqUSQAxWFYxZ8R25gM56GVjeoKOZ0EIr8A==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-cli/-/remark-cli-9.0.0.tgz", + "integrity": "sha512-y6kCXdwZoMoh0Wo4Och1tDW50PmMc86gW6GpF08v9d+xUCEJE2wwXdQ+TnTaUamRnfFdU+fE+eNf2PJ53cyq8g==", "dev": true, "requires": { "markdown-extensions": "^1.1.0", - "remark": "^12.0.0", + "remark": "^13.0.0", "unified-args": "^8.0.0" + }, + "dependencies": { + "remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "dev": true, + "requires": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + } + }, + "remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dev": true, + "requires": { + "mdast-util-from-markdown": "^0.8.0" + } + }, + "remark-stringify": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.0.tgz", + "integrity": "sha512-8x29DpTbVzEc6Dwb90qhxCtbZ6hmj3BxWWDpMhA+1WM4dOEGH5U5/GFe3Be5Hns5MvPSFAr1e2KSVtKZkK5nUw==", + "dev": true, + "requires": { + "mdast-util-to-markdown": "^0.5.0" + } + } } }, "remark-frontmatter": { @@ -16581,8 +15698,7 @@ "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "run-parallel": { "version": "1.1.9", @@ -16593,7 +15709,6 @@ "version": "6.6.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", - "dev": true, "requires": { "tslib": "^1.9.0" } @@ -16615,8 +15730,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { "version": "4.1.0", @@ -16976,11 +16090,10 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -17053,6 +16166,23 @@ "is-extendable": "^0.1.0" } }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -17080,35 +16210,6 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, @@ -17344,7 +16445,26 @@ "dev": true, "requires": { "is-descriptor": "^0.1.0" + }, + "dependencies": { + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + } } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -17660,9 +16780,9 @@ "dev": true }, "table": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.1.tgz", - "integrity": "sha512-fmr6168splcy/3XIvhSm5w6hYYOqyr3plAsd7OqoerzyoMnIpoxYuwrpdO2Cm22dh6KCnvirvigPrFZp+tdWFA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.3.tgz", + "integrity": "sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==", "requires": { "ajv": "^6.12.4", "lodash": "^4.17.20", @@ -17750,8 +16870,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "timers-browserify": { "version": "2.0.11", @@ -17772,7 +16891,6 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -17893,8 +17011,7 @@ "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" }, "tsutils": { "version": "3.17.1", @@ -17927,14 +17044,20 @@ "dev": true }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -17956,9 +17079,9 @@ } }, "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", "dev": true }, "uncss": { @@ -18051,6 +17174,17 @@ "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, "saxes": { "version": "3.1.11", "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", @@ -18185,12 +17319,11 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -18597,9 +17730,9 @@ "dev": true }, "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", "dev": true, "optional": true }, @@ -18609,9 +17742,9 @@ "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" }, "v8-to-istanbul": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz", - "integrity": "sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz", + "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -18789,9 +17922,9 @@ "dev": true }, "whatwg-url": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.2.1.tgz", - "integrity": "sha512-ZmVCr6nfBeaMxEHALLEGy0LszYjpJqf6PVNQUQ1qd9Et+q7Jpygd4rGGDXgHjD8e99yLFseD69msHDM4YwPZ4A==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -18860,12 +17993,11 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -19002,14 +18134,20 @@ } }, "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "dev": true } } } diff --git a/package.json b/package.json index 971f430fc5..53b73c4ad0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "stylelint", - "version": "13.7.0", + "version": "13.7.2", "description": "A mighty, modern CSS linter.", "keywords": [ "css-in-js", @@ -117,7 +117,7 @@ "balanced-match": "^1.0.0", "chalk": "^4.1.0", "cosmiconfig": "^7.0.0", - "debug": "^4.1.1", + "debug": "^4.2.0", "execall": "^2.0.0", "fast-glob": "^3.2.4", "fastest-levenshtein": "^1.0.12", @@ -130,14 +130,14 @@ "ignore": "^5.1.8", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", - "known-css-properties": "^0.19.0", + "known-css-properties": "^0.20.0", "lodash": "^4.17.20", "log-symbols": "^4.0.0", "mathml-tag-names": "^2.1.3", "meow": "^7.1.1", "micromatch": "^4.0.2", "normalize-selector": "^0.2.0", - "postcss": "^7.0.32", + "postcss": "^7.0.35", "postcss-html": "^0.36.0", "postcss-less": "^3.1.4", "postcss-media-query-parser": "^0.2.3", @@ -145,7 +145,7 @@ "postcss-safe-parser": "^4.0.2", "postcss-sass": "^0.4.4", "postcss-scss": "^2.1.1", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^6.0.4", "postcss-syntax": "^0.36.2", "postcss-value-parser": "^4.1.0", "resolve-from": "^5.0.0", @@ -156,7 +156,7 @@ "style-search": "^0.1.0", "sugarss": "^2.0.0", "svg-tags": "^1.0.0", - "table": "^6.0.1", + "table": "^6.0.3", "v8-compile-cache": "^2.1.1", "write-file-atomic": "^3.0.3" }, @@ -170,32 +170,33 @@ "@types/global-modules": "^2.0.0", "@types/globjoin": "^0.1.0", "@types/imurmurhash": "^0.1.1", - "@types/lodash": "^4.14.161", + "@types/lodash": "^4.14.162", "@types/micromatch": "^4.0.1", + "@types/postcss-less": "^3.1.1", "@types/postcss-safe-parser": "^4.0.0", "@types/style-search": "^0.1.1", "@types/svg-tags": "^1.0.0", - "@types/table": "^5.0.0", + "@types/table": "^6.0.0", "@types/write-file-atomic": "^3.0.1", "benchmark": "^2.1.4", "common-tags": "^1.8.0", - "del": "^5.1.0", - "eslint": "^7.7.0", - "eslint-config-stylelint": "^12.0.0", - "got": "^11.5.2", - "husky": "^4.2.5", - "jest": "^26.4.2", - "jest-circus": "^26.4.2", + "del": "^6.0.0", + "eslint": "^7.12.1", + "eslint-config-stylelint": "^13.0.0", + "got": "^11.8.0", + "husky": "^4.3.0", + "jest": "^26.6.1", + "jest-circus": "^26.6.1", "jest-preset-stylelint": "^3.0.0", - "jest-watch-typeahead": "^0.6.0", - "lint-staged": "^10.2.13", + "jest-watch-typeahead": "^0.6.1", + "lint-staged": "^10.5.1", "np": "^6.5.0", "npm-run-all": "^4.1.5", "parcel": "^2.0.0-nightly.318", "postcss-import": "^12.0.1", - "prettier": "^2.1.1", - "remark-cli": "^8.0.1", - "typescript": "^3.9.6" + "prettier": "^2.1.2", + "remark-cli": "^9.0.0", + "typescript": "^4.0.5" }, "engines": { "node": ">=10.13.0" diff --git a/scripts/visual.css b/scripts/visual.css index d8e28debf6..3564d9623d 100644 --- a/scripts/visual.css +++ b/scripts/visual.css @@ -1,3 +1,4 @@ +/* stylelint-disable foo */ .baz { color: #4f; } diff --git a/types/global.d.ts b/types/global.d.ts index 57e1654f4c..ee9b8cd876 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -2,6 +2,5 @@ declare module '@stylelint/postcss-css-in-js'; declare module '@stylelint/postcss-markdown'; declare module 'import-lazy'; declare module 'postcss-html'; -declare module 'postcss-less'; declare module 'postcss-sass'; declare module 'sugarss'; diff --git a/types/stylelint/index.d.ts b/types/stylelint/index.d.ts index 800abaa67e..e24e2f65f1 100644 --- a/types/stylelint/index.d.ts +++ b/types/stylelint/index.d.ts @@ -1,5 +1,5 @@ declare module 'stylelint' { - import { Result, ResultMessage, Root, Syntax, WarningOptions, Warning } from 'postcss'; + import { Comment, Result, ResultMessage, Root, Syntax, WarningOptions, Warning } from 'postcss'; export type StylelintConfigExtends = string | Array; export type StylelintConfigPlugins = string | Array; @@ -31,6 +31,7 @@ declare module 'stylelint' { export type CosmiconfigResult = { config: StylelintConfig; filepath: string }; export type DisabledRange = { + comment: Comment; start: number; strictStart: boolean; end?: number;