diff --git a/.babelrc b/.babelrc
deleted file mode 100644
index b0b9a96..0000000
--- a/.babelrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "stage": 0
-}
diff --git a/.editorconfig b/.editorconfig
index dffb18a..e06d798 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,13 +1,15 @@
-# editorconfig.org
root = true
[*]
charset = utf-8
-indent_style = space
-indent_size = 2
end_of_line = lf
-trim_trailing_whitespace = true
+indent_style = tab
insert_final_newline = true
+trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
+
+[*.{json,md,yml}]
+indent_size = 2
+indent_style = space
diff --git a/.eslintignore b/.eslintignore
deleted file mode 120000
index 3e4e48b..0000000
--- a/.eslintignore
+++ /dev/null
@@ -1 +0,0 @@
-.gitignore
\ No newline at end of file
diff --git a/.eslintrc b/.eslintrc
deleted file mode 100644
index db21f05..0000000
--- a/.eslintrc
+++ /dev/null
@@ -1,42 +0,0 @@
----
-# babel support more syntax stuff than eslint for now
-parser: babel-eslint
-
-root: true
-extends: eslint:recommended
-
-ecmaFeatures:
- modules: true
-
-env:
- es6: true
- browser: true
- node: true
-
-rules:
- indent: [2, 2] # 2 spaces indentation
- max-len: [2, 80, 4]
- quotes: [2, "double"]
- semi: [2, "never"]
- no-multiple-empty-lines: [2, {"max": 1}]
-
- brace-style: [2, "stroustrup"]
- comma-dangle: [2, "always-multiline"]
- comma-style: [2, "last"]
- dot-location: [2, "property"]
-
- one-var: [2, "never"]
- no-var: [2]
- prefer-const: [2]
- no-bitwise: [2]
-
- object-curly-spacing: [2, "never"]
- array-bracket-spacing: [2, "never"]
- computed-property-spacing: [2, "never"]
-
- space-unary-ops: [2, {"words": true, "nonwords": false}]
- space-after-keywords: [2, "always"]
- space-before-blocks: [2, "always"]
- space-before-function-paren: [2, "never"]
- space-in-parens: [2, "never"]
- spaced-comment: [2, "always"]
diff --git a/.gitignore b/.gitignore
index 9d0bd2b..d920b78 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,11 @@
-.DS_Store
-*.sublime-workspace
-
node_modules
-test/fixtures/*/actual.css
-dist
+index.*.*
+package-lock.json
+*.log*
+*.result.css
+.*
+!.editorconfig
+!.gitignore
+!.rollup.js
+!.tape.js
+!.travis.yml
diff --git a/.rollup.js b/.rollup.js
new file mode 100644
index 0000000..c1e55b1
--- /dev/null
+++ b/.rollup.js
@@ -0,0 +1,26 @@
+import babel from '@rollup/plugin-babel';
+
+export default {
+ input: 'index.js',
+ output: [
+ { file: 'index.cjs.js', format: 'cjs', sourcemap: true, exports: 'default' },
+ { file: 'index.es.mjs', format: 'es', sourcemap: true, exports: 'default' }
+ ],
+ plugins: [
+ babel({
+ babelHelpers: 'bundled',
+ plugins: [
+ '@babel/plugin-syntax-dynamic-import'
+ ],
+ presets: [
+ ['@babel/preset-env', {
+ corejs: 3,
+ loose: true,
+ modules: false,
+ targets: { node: 10 },
+ useBuiltIns: 'entry'
+ }]
+ ]
+ })
+ ]
+};
diff --git a/.tape.js b/.tape.js
new file mode 100644
index 0000000..e17e504
--- /dev/null
+++ b/.tape.js
@@ -0,0 +1,247 @@
+module.exports = {
+ 'basic': {
+ message: 'supports basic usage'
+ },
+ 'basic:preserve': {
+ message: 'supports { preserve: true } usage',
+ options: {
+ preserve: true
+ }
+ },
+ 'safety': {
+ message: 'supports safe tag ordering (.foo:--h1 becomes h1.foo instead of .fooh1)'
+ },
+ 'basic:import': {
+ message: 'supports { importFrom: { customSelectors: { ... } } } usage',
+ options: {
+ importFrom: {
+ customSelectors: {
+ ':--heading': 'h1, h2, h3'
+ }
+ }
+ }
+ },
+ 'basic:import-fn': {
+ message: 'supports { importFrom() } usage',
+ options: {
+ importFrom() {
+ return {
+ customSelectors: {
+ ':--heading': 'h1, h2, h3'
+ }
+ };
+ }
+ },
+ expect: 'basic.import.expect.css',
+ result: 'basic.import.result.css'
+ },
+ 'basic:import-fn-promise': {
+ message: 'supports { async importFrom() } usage',
+ options: {
+ importFrom() {
+ return new Promise(resolve => {
+ resolve({
+ customSelectors: {
+ ':--heading': 'h1, h2, h3'
+ }
+ })
+ });
+ }
+ },
+ expect: 'basic.import.expect.css',
+ result: 'basic.import.result.css'
+ },
+ 'basic:import-json': {
+ message: 'supports { importFrom: "test/import-selectors.json" } usage',
+ options: {
+ importFrom: 'test/import-selectors.json'
+ },
+ expect: 'basic.import.expect.css',
+ result: 'basic.import.result.css'
+ },
+ 'basic:import-js': {
+ message: 'supports { importFrom: "test/import-selectors.js" } usage',
+ options: {
+ importFrom: 'test/import-selectors.js'
+ },
+ expect: 'basic.import.expect.css',
+ result: 'basic.import.result.css'
+ },
+ 'basic:import-css': {
+ message: 'supports { importFrom: "test/import-selectors.css" } usage',
+ options: {
+ importFrom: 'test/import-selectors.css'
+ },
+ expect: 'basic.import.expect.css',
+ result: 'basic.import.result.css'
+ },
+ 'basic:import-css-from': {
+ message: 'supports { importFrom: { from: "test/import-selectors.css" } } usage',
+ options: {
+ importFrom: { from: 'test/import-selectors.css' }
+ },
+ expect: 'basic.import.expect.css',
+ result: 'basic.import.result.css'
+ },
+ 'basic:import-css-from-multiple-files': {
+ message: 'supports { importFrom: ["test/empty.css", "test/import-selectors.css"] } usage',
+ options: {
+ importFrom: ["test/empty.css", "test/import-selectors.css"]
+ },
+ expect: 'basic.import.expect.css',
+ result: 'basic.import.result.css'
+ },
+ 'basic:import-css-from-type': {
+ message: 'supports { importFrom: [ { from: "test/import-selectors.css", type: "css" } ] } usage',
+ options: {
+ importFrom: [ { from: 'test/import-selectors.css', type: 'css' } ]
+ },
+ expect: 'basic.import.expect.css',
+ result: 'basic.import.result.css'
+ },
+ 'basic:import-empty': {
+ message: 'supports { importFrom: {} } usage',
+ options: {
+ importFrom: {}
+ }
+ },
+ 'basic:export': {
+ message: 'supports { exportTo: { customSelectors: { ... } } } usage',
+ options: {
+ exportTo: (global.__exportSelectorObject = global.__exportSelectorObject || {
+ customSelectors: null
+ })
+ },
+ expect: 'basic.expect.css',
+ result: 'basic.result.css',
+ after() {
+ if (__exportSelectorObject.customSelectors[':--foo'] !== '.foo') {
+ throw new Error('The exportTo function failed');
+ }
+ }
+ },
+ 'basic:export-fn': {
+ message: 'supports { exportTo() } usage',
+ options: {
+ exportTo(customProperties) {
+ if (customProperties[':--foo'] !== '.foo') {
+ throw new Error('The exportTo function failed');
+ }
+ }
+ },
+ expect: 'basic.expect.css',
+ result: 'basic.result.css'
+ },
+ 'basic:export-fn-promise': {
+ message: 'supports { async exportTo() } usage',
+ options: {
+ exportTo(customProperties) {
+ return new Promise((resolve, reject) => {
+ if (customProperties[':--foo'] !== '.foo') {
+ reject('The exportTo function failed');
+ } else {
+ resolve();
+ }
+ });
+ }
+ },
+ expect: 'basic.expect.css',
+ result: 'basic.result.css'
+ },
+ 'basic:export-json': {
+ message: 'supports { exportTo: "test/export-selectors.json" } usage',
+ options: {
+ exportTo: 'test/export-selectors.json'
+ },
+ expect: 'basic.expect.css',
+ result: 'basic.result.css',
+ before() {
+ global.__exportSelectorsString = require('fs').readFileSync('test/export-selectors.json', 'utf8');
+ },
+ after() {
+ if (global.__exportSelectorsString !== require('fs').readFileSync('test/export-selectors.json', 'utf8')) {
+ throw new Error('The original file did not match the freshly exported copy');
+ }
+ }
+ },
+ 'basic:export-js': {
+ message: 'supports { exportTo: "test/export-selectors.js" } usage',
+ options: {
+ exportTo: 'test/export-selectors.js'
+ },
+ expect: 'basic.expect.css',
+ result: 'basic.result.css',
+ before() {
+ global.__exportSelectorsString = require('fs').readFileSync('test/export-selectors.js', 'utf8');
+ },
+ after() {
+ if (global.__exportSelectorsString !== require('fs').readFileSync('test/export-selectors.js', 'utf8')) {
+ throw new Error('The original file did not match the freshly exported copy');
+ }
+ }
+ },
+ 'basic:export-mjs': {
+ message: 'supports { exportTo: "test/export-selectors.mjs" } usage',
+ options: {
+ exportTo: 'test/export-selectors.mjs'
+ },
+ expect: 'basic.expect.css',
+ result: 'basic.result.css',
+ before() {
+ global.__exportSelectorsString = require('fs').readFileSync('test/export-selectors.mjs', 'utf8');
+ },
+ after() {
+ if (global.__exportSelectorsString !== require('fs').readFileSync('test/export-selectors.mjs', 'utf8')) {
+ throw new Error('The original file did not match the freshly exported copy');
+ }
+ }
+ },
+ 'basic:export-css': {
+ message: 'supports { exportTo: "test/export-selectors.css" } usage',
+ options: {
+ exportTo: 'test/export-selectors.css'
+ },
+ expect: 'basic.expect.css',
+ result: 'basic.result.css',
+ before() {
+ global.__exportSelectorsString = require('fs').readFileSync('test/export-selectors.css', 'utf8');
+ },
+ after() {
+ if (global.__exportSelectorsString !== require('fs').readFileSync('test/export-selectors.css', 'utf8')) {
+ throw new Error('The original file did not match the freshly exported copy');
+ }
+ }
+ },
+ 'basic:export-css-to': {
+ message: 'supports { exportTo: { to: "test/export-selectors.css" } } usage',
+ options: {
+ exportTo: { to: 'test/export-selectors.css' }
+ },
+ expect: 'basic.expect.css',
+ result: 'basic.result.css',
+ before() {
+ global.__exportSelectorsString = require('fs').readFileSync('test/export-selectors.css', 'utf8');
+ },
+ after() {
+ if (global.__exportSelectorsString !== require('fs').readFileSync('test/export-selectors.css', 'utf8')) {
+ throw new Error('The original file did not match the freshly exported copy');
+ }
+ }
+ },
+ 'basic:export-css-to-type': {
+ message: 'supports { exportTo: { to: "test/export-selectors.css", type: "css" } } usage',
+ options: {
+ exportTo: { to: 'test/export-selectors.css', type: 'css' }
+ },
+ expect: 'basic.expect.css',
+ result: 'basic.result.css',
+ before() {
+ global.__exportSelectorsString = require('fs').readFileSync('test/export-selectors.css', 'utf8');
+ },
+ after() {
+ if (global.__exportSelectorsString !== require('fs').readFileSync('test/export-selectors.css', 'utf8')) {
+ throw new Error('The original file did not match the freshly exported copy');
+ }
+ }
+ }
+};
diff --git a/.travis.yml b/.travis.yml
index ffb8b39..a9e32cd 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,9 @@
-sudo: false
+# https://docs.travis-ci.com/user/travis-lint
+
language: node_js
+
node_js:
- - iojs
- - "0.12"
- - "0.10"
+ - 10
+
+install:
+ - npm install --ignore-scripts
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 53643bc..d4adb24 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,39 +1,75 @@
-# 3.0.0 - 2015-08-25
+# Changes to PostCSS Custom Selectors
+
+### 6.0.0 (January 12, 2021)
+
+- Added: Support for PostCSS v8
+- Added: Support for Node v10+
+- Fixed: importing from multiple sources ([#42](https://github.com/postcss/postcss-custom-selectors/pull/42))
+
+### 5.1.2 (September 20, 2018)
+
+- Fixed: Do not break on an empty `importFrom` object
+
+### 5.1.1 (September 18, 2018)
+
+- Fixed: Selectors like `.foo:--h1` become `h1.foo` instead of `.fooh1`
+
+### 5.1.0 (September 12, 2018)
+
+- Added: New `exportTo` function to specify where to export custom selectors
+- Updated: `importFrom` option to support passing it a function
+
+### 5.0.0 (September 7, 2018)
+
+- Added: New `preserve` option to preserve custom selectors and rules using them
+- Added: New `importFrom` option to specify where to import custom selectors
+- Added: Support for PostCSS v7
+- Added: Support for Node v6+
+
+### 4.0.1 (May 15, 2017)
+
+- Fixed: incorrect export
+
+### 4.0.0 (May 12, 2017)
+
+- Added: compatibility with postcss v6.x
+
+### 3.0.0 (August 25, 2015)
- Removed: compatibility with postcss v4.x
- Added: compatibility with postcss v5.x
-# 2.3.0 - 2015-07-14
+### 2.3.0 (July 14, 2015)
* Fixed: Nested/mixed selectors now works correctly
([#19](https://github.com/postcss/postcss-custom-selectors/issues/19))
* Added: `transformMatches` option to limit transformation to :matches()
replacements.
-# 2.2.0 - 2015-06-30
+### 2.2.0 (June 30, 2015)
* Fixed: No more useless warnings for undefined non custom selectors
([#22](https://github.com/postcss/postcss-custom-selectors/issues/22))
* Changed: warnings now use PostCSS message API
-# 2.1.1 - 2015-06-30
+### 2.1.1 (June 30, 2015)
* Fixed: the lineBreak option keeping the selectors indent
([#18](https://github.com/postcss/postcss-custom-selectors/issues/18))
* Fixed: the tip of an undefined selector
([#20](https://github.com/postcss/postcss-custom-selectors/issues/20))
-# 2.1.0 - 2015-06-04
+### 2.1.0 (June 4, 2015)
* Changed: use PostCSS 4.1 plugin API
([#13](https://github.com/postcss/postcss-custom-selectors/issues/13))
-# 2.0.1 - 2015-06-03
+### 2.0.1 (June 3, 2015)
* Fixed: `(foo, bar)` conversion error exists in the selector
(See also [:matches() test](test/fixtures/matches/input.css))
-# 2.0.0 - 2015-05-29
+### 2.0.0 (May 29, 2015)
* Removed: no longer support `::` or `--` to defined a custom selectors,
you must use the syntax `:--` to define it.
@@ -42,14 +78,14 @@ you must use the syntax `:--` to define it.
([#14](https://github.com/postcss/postcss-custom-selectors/issues/14))
-# 1.1.1 - 2015-04-06
+### 1.1.1 (April 6, 2015)
* Fixed: add support for multilines definition
-# 1.1.0 - 2014-12-06
+### 1.1.0 (December 6, 2014)
* Added: "lineBreak" option
-# 1.0.0 - 2014-12-06
+### 1.0.0 (December 6, 2014)
* First release
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..02d0608
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,65 @@
+# Contributing to PostCSS Custom Selectors
+
+You want to help? You rock! Now, take a moment to be sure your contributions
+make sense to everyone else.
+
+## Reporting Issues
+
+Found a problem? Want a new feature?
+
+- See if your issue or idea has [already been reported].
+- Provide a [reduced test case] or a [live example].
+
+Remember, a bug is a _demonstrable problem_ caused by _our_ code.
+
+## Submitting Pull Requests
+
+Pull requests are the greatest contributions, so be sure they are focused in
+scope and avoid unrelated commits.
+
+1. To begin; [fork this project], clone your fork, and add our upstream.
+ ```bash
+ # Clone your fork of the repo into the current directory
+ git clone git@github.com:YOUR_USER/postcss-custom-selectors.git
+
+ # Navigate to the newly cloned directory
+ cd postcss-custom-selectors
+
+ # Assign the original repo to a remote called "upstream"
+ git remote add upstream git@github.com:postcss/postcss-custom-selectors.git
+
+ # Install the tools necessary for testing
+ npm install
+ ```
+
+2. Create a branch for your feature or fix:
+ ```bash
+ # Move into a new branch for your feature
+ git checkout -b feature/thing
+ ```
+ ```bash
+ # Move into a new branch for your fix
+ git checkout -b fix/something
+ ```
+
+3. If your code follows our practices, then push your feature branch:
+ ```bash
+ # Test current code
+ npm test
+ ```
+ ```bash
+ # Push the branch for your new feature
+ git push origin feature/thing
+ ```
+ ```bash
+ # Or, push the branch for your update
+ git push origin update/something
+ ```
+
+That’s it! Now [open a pull request] with a clear title and description.
+
+[already been reported]: issues
+[fork this project]: fork
+[live example]: https://codepen.io/pen
+[open a pull request]: https://help.github.com/articles/using-pull-requests/
+[reduced test case]: https://css-tricks.com/reduced-test-cases/
diff --git a/INSTALL.md b/INSTALL.md
new file mode 100644
index 0000000..6cd5dbf
--- /dev/null
+++ b/INSTALL.md
@@ -0,0 +1,170 @@
+# Installing PostCSS Custom Selectors
+
+[PostCSS Custom Selectors] runs in all Node environments, with special instructions for:
+
+| [Node](#node) | [PostCSS CLI](#postcss-cli) | [Webpack](#webpack) | [Create React App](#create-react-app) | [Gulp](#gulp) | [Grunt](#grunt) |
+| --- | --- | --- | --- | --- | --- |
+
+## Node
+
+Add [PostCSS Custom Selectors] to your project:
+
+```bash
+npm install postcss-custom-selectors --save-dev
+```
+
+Use [PostCSS Custom Selectors] to process your CSS:
+
+```js
+const postcssCustomSelectors = require('postcss-custom-selectors');
+
+postcssCustomSelectors.process(YOUR_CSS /*, processOptions, pluginOptions */);
+```
+
+Or use it as a [PostCSS] plugin:
+
+```js
+const postcss = require('postcss');
+const postcssCustomSelectors = require('postcss-custom-selectors');
+
+postcss([
+ postcssCustomSelectors(/* pluginOptions */)
+]).process(YOUR_CSS /*, processOptions */);
+```
+
+## PostCSS CLI
+
+Add [PostCSS CLI] to your project:
+
+```bash
+npm install postcss-cli --save-dev
+```
+
+Use [PostCSS Custom Selectors] in your `postcss.config.js` configuration file:
+
+```js
+const postcssCustomSelectors = require('postcss-custom-selectors');
+
+module.exports = {
+ plugins: [
+ postcssCustomSelectors(/* pluginOptions */)
+ ]
+}
+```
+
+## Webpack
+
+Add [PostCSS Loader] to your project:
+
+```bash
+npm install postcss-loader --save-dev
+```
+
+Use [PostCSS Custom Selectors] in your Webpack configuration:
+
+```js
+const postcssCustomSelectors = require('postcss-custom-selectors');
+
+module.exports = {
+ module: {
+ rules: [
+ {
+ test: /\.css$/,
+ use: [
+ 'style-loader',
+ { loader: 'css-loader', options: { importLoaders: 1 } },
+ { loader: 'postcss-loader', options: {
+ ident: 'postcss',
+ plugins: () => [
+ postcssCustomSelectors(/* pluginOptions */)
+ ]
+ } }
+ ]
+ }
+ ]
+ }
+}
+```
+
+## Create React App
+
+Add [React App Rewired] and [React App Rewire PostCSS] to your project:
+
+```bash
+npm install react-app-rewired react-app-rewire-postcss --save-dev
+```
+
+Use [React App Rewire PostCSS] and [PostCSS Custom Selectors] in your
+`config-overrides.js` file:
+
+```js
+const reactAppRewirePostcss = require('react-app-rewire-postcss');
+const postcssCustomSelectors = require('postcss-custom-selectors');
+
+module.exports config => reactAppRewirePostcss(config, {
+ plugins: () => [
+ postcssCustomSelectors(/* pluginOptions */)
+ ]
+});
+```
+
+## Gulp
+
+Add [Gulp PostCSS] to your project:
+
+```bash
+npm install gulp-postcss --save-dev
+```
+
+Use [PostCSS Custom Selectors] in your Gulpfile:
+
+```js
+const postcss = require('gulp-postcss');
+const postcssCustomSelectors = require('postcss-custom-selectors');
+
+gulp.task('css', () => gulp.src('./src/*.css').pipe(
+ postcss([
+ postcssCustomSelectors(/* pluginOptions */)
+ ])
+).pipe(
+ gulp.dest('.')
+));
+```
+
+## Grunt
+
+Add [Grunt PostCSS] to your project:
+
+```bash
+npm install grunt-postcss --save-dev
+```
+
+Use [PostCSS Custom Selectors] in your Gruntfile:
+
+```js
+const postcssCustomSelectors = require('postcss-custom-selectors');
+
+grunt.loadNpmTasks('grunt-postcss');
+
+grunt.initConfig({
+ postcss: {
+ options: {
+ use: [
+ postcssCustomSelectors(/* pluginOptions */)
+ ]
+ },
+ dist: {
+ src: '*.css'
+ }
+ }
+});
+```
+
+[Gulp PostCSS]: https://github.com/postcss/gulp-postcss
+[Grunt PostCSS]: https://github.com/nDmitry/grunt-postcss
+[PostCSS]: https://github.com/postcss/postcss
+[PostCSS CLI]: https://github.com/postcss/postcss-cli
+[PostCSS Custom Selectors]: https://github.com/postcss/postcss-custom-selectors
+[PostCSS Loader]: https://github.com/postcss/postcss-loader
+[React App Rewire PostCSS]: https://github.com/csstools/react-app-rewire-postcss
+[React App Rewired]: https://github.com/timarney/react-app-rewired
diff --git a/LICENSE b/LICENSE.md
similarity index 61%
rename from LICENSE
rename to LICENSE.md
index 9d10f01..6d70470 100644
--- a/LICENSE
+++ b/LICENSE.md
@@ -1,13 +1,13 @@
-The MIT License (MIT)
+# The MIT License (MIT)
-Copyright (c) 2014 PostCSS
+Copyright © PostCSS
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
@@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-
diff --git a/README.md b/README.md
index 4f09621..956b72c 100644
--- a/README.md
+++ b/README.md
@@ -1,308 +1,169 @@
-# PostCSS Custom Selectors
+
-[](https://travis-ci.org/postcss/postcss-custom-selectors)
-[](https://www.npmjs.com/package/postcss-custom-selectors)
-[](https://www.npmjs.com/package/postcss-custom-selectors)
-[](http://opensource.org/licenses/MIT)
+# PostCSS Custom Selectors [
][postcss]
-> [PostCSS](https://github.com/postcss/postcss) plugin to transform [W3C CSS Extensions(Custom Selectors)](http://dev.w3.org/csswg/css-extensions/#custom-selectors) to more compatible CSS.
+[![NPM Version][npm-img]][npm-url]
+[![CSS Standard Status][css-img]][css-url]
+[![Build Status][cli-img]][cli-url]
+[![Support Chat][git-img]][git-url]
-[简体中文](README-zh.md)
+[PostCSS Custom Selectors] lets you use Custom Selectors in CSS, following the
+[CSS Extensions] specification.
-
-
-## Installation
-
-```console
-$ npm install postcss-custom-selectors
-```
-
-## Quick Start
-
-```js
-// dependencies
-var fs = require('fs')
-var postcss = require('postcss')
-var selector = require('postcss-custom-selectors')
-
-// css to be processed
-var css = fs.readFileSync('input.css', 'utf8')
-
-// process css using postcss-custom-selectors
-var output = postcss()
- .use(selector())
- .process(css)
- .css
-
-console.log('\n====>Output CSS:\n', output)
-```
-
-Or just:
-
-```js
-var output = postcss(selector())
- .process(css)
- .css
-```
-
-input:
-
-```css
-@custom-selector :--heading h1, h2, h3, h4, h5, h6;
+```pcss
+@custom-selector :--heading h1, h2, h3;
article :--heading + p {
margin-top: 0;
}
-```
-You will get:
+/* becomes */
-```css
-article h1 + p,
-article h2 + p,
-article h3 + p,
-article h4 + p,
-article h5 + p,
-article h6 + p {
- margin-top: 0;
-}
+article h1 + p, article h2 + p, article h3 + p {}
```
-## CSS syntax
-
-```css
-@custom-selector = @custom-selector : ;
-```
-
-## How to use
-
-The custom selector is a pseudo-class, so you must use `:--` to define it.
-
-For example to simulate [:any-link](http://dev.w3.org/csswg/selectors/#the-any-link-pseudo) selector:
+## Usage
-```css
-@custom-selector :--any-link :link, :visited;
+Add [PostCSS Custom Selectors] to your project:
-a:--any-link {
- color: blue;
-}
+```bash
+npm install postcss-custom-selectors --save-dev
```
-output:
+Use [PostCSS Custom Selectors] to process your CSS:
-```css
-a:link,
-a:visited {
- color: blue;
-}
-```
+```js
+const postcssCustomSelectors = require('postcss-custom-selectors');
-You can even make some smart use like this:
+postcssCustomSelectors.process(YOUR_CSS /*, processOptions, pluginOptions */);
+```
-```css
-@custom-selector :--button button, .button;
-@custom-selector :--enter :hover, :focus;
+Or use it as a [PostCSS] plugin:
-:--button:--enter {
+```js
+const postcss = require('postcss');
+const postcssCustomSelectors = require('postcss-custom-selectors');
-}
+postcss([
+ postcssCustomSelectors(/* pluginOptions */)
+]).process(YOUR_CSS /*, processOptions */);
```
-output
-
-```css
-button:hover,
-.button:hover,
-button:focus,
-.button:focus {
+[PostCSS Custom Selectors] runs in all Node environments, with special instructions for:
-}
-```
+| [Node](INSTALL.md#node) | [PostCSS CLI](INSTALL.md#postcss-cli) | [Webpack](INSTALL.md#webpack) | [Create React App](INSTALL.md#create-react-app) | [Gulp](INSTALL.md#gulp) | [Grunt](INSTALL.md#grunt) |
+| --- | --- | --- | --- | --- | --- |
## Options
-### `lineBreak`
+### preserve
-_(default: `true`)_
+The `preserve` option determines whether custom selectors and rules using
+custom selectors should be preserved in their original form.
-Set whether multiple selector wrap.The default is turning on to be a newline.
+```pcss
+@custom-selector :--heading h1, h2, h3;
-Close the line breaks.
-
-```js
-var options = {
- lineBreak: false
+article :--heading + p {
+ margin-top: 0;
}
-var output = postcss(selector(options))
- .process(css)
- .css
-```
+/* becomes */
-With the first example, the output will be:
+article h1 + p, article h2 + p, article h3 + p {}
-```css
-article h1 + p, article h2 + p, article h3 + p, article h4 + p, article h5 + p, article h6 + p {
- margin-top: 0;
-}
+article :--heading + p {}
```
-### `extensions`
+### importFrom
-_(default: `{}`)_
-
-This option allows you to customize an object to set the `` (selector alias) and ``, these definitions will cover the same alias of `@custom-selector` in CSS.
+The `importFrom` option specifies sources where custom selectors can be
+imported from, which might be CSS, JS, and JSON files, functions, and directly
+passed objects.
```js
-var options = {
- extensions: {
- ':--any' : 'section, article, aside, nav'
- }
-}
-
-var output = postcss(selector(options))
- .process(css)
- .css;
-```
-
-input.css
-
-```css
-@custom-selector :--any .foo, .bar; /* No effect */
-:--any h1 {
- margin-top: 16px;
-}
+postcssCustomSelectors({
+ importFrom: 'path/to/file.css' // => @custom-selector :--heading h1, h2, h3;
+});
```
-output:
-
-```css
-/* No effect */
-section h1,
-article h1,
-aside h1,
-nav h1 {
- margin-top: 16px;
+```pcss
+article :--heading + p {
+ margin-top: 0;
}
-```
-### `transformMatches`
+/* becomes */
-_(default: `true`)_
-
-Allows you to limit transformation to `:matches()` usage
-If set to false:
-
-input
-
-```css
-@custom-selector :--foo .bar, .baz;
-.foo:--foo {
- margin-top: 16px;
-}
+article h1 + p, article h2 + p, article h3 + p {}
```
-output
+Multiple sources can be passed into this option, and they will be parsed in the
+order they are received. JavaScript files, JSON files, functions, and objects
+will need to namespace custom selectors using the `customProperties` or
+`custom-properties` key.
-```css
-.foo:matches(.bar, .baz) {
- margin-top: 16px;
-}
+```js
+postcssCustomSelectors({
+ importFrom: [
+ 'path/to/file.css',
+ 'and/then/this.js',
+ 'and/then/that.json',
+ {
+ customSelectors: { ':--heading': 'h1, h2, h3' }
+ },
+ () => {
+ const customProperties = { ':--heading': 'h1, h2, h3' };
+
+ return { customProperties };
+ }
+ ]
+});
```
+### exportTo
-## Usage
-
-### Node Watch
-
-Dependence [chokidar](https://github.com/paulmillr/chokidar) module.
+The `exportTo` option specifies destinations where custom selectors can be
+exported to, which might be CSS, JS, and JSON files, functions, and directly
+passed objects.
```js
-var fs = require('fs')
-var chokidar = require('chokidar')
-var postcss = require('postcss')
-var selector = require('postcss-custom-selectors')
-
-var src = 'input.css'
-
-console.info('Watching…\nModify the input.css and save.')
-
-chokidar.watch(src, {
- ignored: /[\/\\]\./,
- persistent: true
-}).on('all',
- function(event, path, stats) {
- var css = fs.readFileSync(src, 'utf8')
- var output = postcss(selector())
- .process(css)
- .css
- fs.writeFileSync('output.css', output)
- })
+postcssCustomSelectors({
+ exportTo: 'path/to/file.css' // @custom-selector :--heading h1, h2, h3;
+});
```
-### Grunt
+Multiple destinations can be passed into this option, and they will be parsed
+in the order they are received. JavaScript files, JSON files, and objects will
+need to namespace custom selectors using the `customProperties` or
+`custom-properties` key.
```js
-module.exports = function(grunt) {
- grunt.initConfig({
- pkg: grunt.file.readJSON('package.json'),
- postcss: {
- options: {
- processors: [
- require('autoprefixer-core')({ browsers: ['> 0%'] }).postcss, //Other plugin
- require('postcss-custom-selectors')(),
- ]
- },
- dist: {
- src: ['src/*.css'],
- dest: 'build/grunt.css'
- }
+const cachedObject = { customSelectors: {} };
+
+postcssCustomSelectors({
+ exportTo: [
+ 'path/to/file.css', // @custom-selector :--heading h1, h2, h3;
+ 'and/then/this.js', // module.exports = { customSelectors: { ':--heading': 'h1, h2, h3' } }
+ 'and/then/this.mjs', // export const customSelectors = { ':--heading': 'h1, h2, h3' } }
+ 'and/then/that.json', // { "custom-selectors": { ":--heading": "h1, h2, h3" } }
+ cachedObject,
+ customProperties => {
+ customProperties // { ':--heading': 'h1, h2, h3' }
}
- });
-
- grunt.loadNpmTasks('grunt-contrib-uglify');
- grunt.loadNpmTasks('grunt-postcss');
-
- grunt.registerTask('default', ['postcss']);
-}
-```
-
-### Gulp
-
-```js
-var gulp = require('gulp');
-var rename = require('gulp-rename');
-var postcss = require('gulp-postcss');
-var selector = require('postcss-custom-selectors')
-var autoprefixer = require('autoprefixer-core')
-
-gulp.task('default', function () {
- var processors = [
- autoprefixer({ browsers: ['> 0%'] }), //Other plugin
- selector()
- ];
- gulp.src('src/*.css')
- .pipe(postcss(processors))
- .pipe(rename('gulp.css'))
- .pipe(gulp.dest('build'))
+ ]
});
-gulp.watch('src/*.css', ['default']);
-```
-
-## Contributing
-
-* Install the relevant dependent module.
-* Respect coding style(Install [EditorConfig](http://editorconfig.org/)).
-* Add test cases in the [test](test) directory.
-* Run test.
-
-```console
-$ git clone https://github.com/postcss/postcss-custom-selectors.git
-$ git checkout -b patch
-$ npm install
-$ npm test
```
-## [Changelog](CHANGELOG.md)
+[cli-img]: https://img.shields.io/travis/postcss/postcss-custom-selectors.svg
+[cli-url]: https://travis-ci.org/postcss/postcss-custom-selectors
+[css-img]: https://cssdb.org/badge/custom-selectors.svg
+[css-url]: https://cssdb.org/#custom-selectors
+[git-img]: https://img.shields.io/badge/support-chat-blue.svg
+[git-url]: https://gitter.im/postcss/postcss
+[npm-img]: https://img.shields.io/npm/v/postcss-custom-selectors.svg
+[npm-url]: https://www.npmjs.com/package/postcss-custom-selectors
-## [License](LICENSE)
+[CSS Extensions]: https://drafts.csswg.org/css-extensions/#custom-selectors
+[PostCSS]: https://github.com/postcss/postcss
+[PostCSS Custom Selectors]: https://github.com/postcss/postcss-custom-selectors
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..31c6602
--- /dev/null
+++ b/index.js
@@ -0,0 +1,36 @@
+import getCustomSelectors from './lib/custom-selectors-from-root';
+import transformRules from './lib/transform-rules';
+import importCustomSelectorsFromSources from './lib/import-from';
+import exportCustomSelectorsToDestinations from './lib/export-to';
+
+const postcssCustomSelectors = (opts) => {
+ // whether to preserve custom selectors and rules using them
+ const preserve = Boolean(Object(opts).preserve);
+
+ // sources to import custom selectors from
+ const importFrom = [].concat(Object(opts).importFrom || []);
+
+ // destinations to export custom selectors to
+ const exportTo = [].concat(Object(opts).exportTo || []);
+
+ // promise any custom selectors are imported
+ const customSelectorsPromise = importCustomSelectorsFromSources(importFrom);
+ return {
+ postcssPlugin: 'postcss-custom-selectors',
+ async Once(root) {
+ const customProperties = Object.assign(
+ {},
+ await customSelectorsPromise,
+ getCustomSelectors(root, { preserve })
+ );
+
+ await exportCustomSelectorsToDestinations(customProperties, exportTo);
+
+ transformRules(root, customProperties, { preserve });
+ },
+ }
+};
+
+postcssCustomSelectors.postcss = true;
+
+export default postcssCustomSelectors;
diff --git a/lib/custom-selectors-from-root.js b/lib/custom-selectors-from-root.js
new file mode 100644
index 0000000..7a4bf42
--- /dev/null
+++ b/lib/custom-selectors-from-root.js
@@ -0,0 +1,34 @@
+import getASTFromSelectors from './selectors-ast-from-selectors-string';
+
+// return custom selectors from the css root, conditionally removing them
+export default (root, opts) => {
+ // initialize custom selectors
+ const customSelectors = {};
+
+ // for each custom selector atrule that is a child of the css root
+ root.nodes.slice().forEach(node => {
+ if (isCustomSelector(node)) {
+ // extract the name and selectors from the params of the custom selector
+ const [, name, selectors] = node.params.match(customSelectorParamsRegExp);
+
+ // write the parsed selectors to the custom selector
+ customSelectors[name] = getASTFromSelectors(selectors);
+
+ // conditionally remove the custom selector atrule
+ if (!Object(opts).preserve) {
+ node.remove();
+ }
+ }
+ });
+
+ return customSelectors;
+};
+
+// match the custom selector name
+const customSelectorNameRegExp = /^custom-selector$/i;
+
+// match the custom selector params
+const customSelectorParamsRegExp = /^(:--[A-z][\w-]*)\s+([\W\w]+)\s*$/;
+
+// whether the atrule is a custom selector
+const isCustomSelector = node => node.type === 'atrule' && customSelectorNameRegExp.test(node.name) && customSelectorParamsRegExp.test(node.params);
diff --git a/lib/export-to.js b/lib/export-to.js
new file mode 100644
index 0000000..f589f5d
--- /dev/null
+++ b/lib/export-to.js
@@ -0,0 +1,129 @@
+import fs from 'fs';
+import path from 'path';
+
+/* Import Custom Selectors from CSS File
+/* ========================================================================== */
+
+async function exportCustomSelectorsToCssFile(to, customSelectors) {
+ const cssContent = Object.keys(customSelectors).reduce((cssLines, name) => {
+ cssLines.push(`@custom-selector ${name} ${customSelectors[name]};`);
+
+ return cssLines;
+ }, []).join('\n');
+ const css = `${cssContent}\n`;
+
+ await writeFile(to, css);
+}
+
+/* Import Custom Selectors from JSON file
+/* ========================================================================== */
+
+async function exportCustomSelectorsToJsonFile(to, customSelectors) {
+ const jsonContent = JSON.stringify({
+ 'custom-selectors': customSelectors
+ }, null, ' ');
+ const json = `${jsonContent}\n`;
+
+ await writeFile(to, json);
+}
+
+/* Import Custom Selectors from Common JS file
+/* ========================================================================== */
+
+async function exportCustomSelectorsToCjsFile(to, customSelectors) {
+ const jsContents = Object.keys(customSelectors).reduce((jsLines, name) => {
+ jsLines.push(`\t\t'${escapeForJS(name)}': '${escapeForJS(customSelectors[name])}'`);
+
+ return jsLines;
+ }, []).join(',\n');
+ const js = `module.exports = {\n\tcustomSelectors: {\n${jsContents}\n\t}\n};\n`;
+
+ await writeFile(to, js);
+}
+
+/* Import Custom Selectors from Module JS file
+/* ========================================================================== */
+
+async function exportCustomSelectorsToMjsFile(to, customSelectors) {
+ const mjsContents = Object.keys(customSelectors).reduce((mjsLines, name) => {
+ mjsLines.push(`\t'${escapeForJS(name)}': '${escapeForJS(customSelectors[name])}'`);
+
+ return mjsLines;
+ }, []).join(',\n');
+ const mjs = `export const customSelectors = {\n${mjsContents}\n};\n`;
+
+ await writeFile(to, mjs);
+}
+
+/* Export Custom Selectors to Destinations
+/* ========================================================================== */
+
+export default function exportCustomSelectorsToDestinations(customSelectors, destinations) {
+ return Promise.all(destinations.map(async destination => {
+ if (destination instanceof Function) {
+ await destination(defaultCustomSelectorsToJSON(customSelectors));
+ } else {
+ // read the destination as an object
+ const opts = destination === Object(destination) ? destination : { to: String(destination) };
+
+ // transformer for custom selectors into a JSON-compatible object
+ const toJSON = opts.toJSON || defaultCustomSelectorsToJSON;
+
+ if ('customSelectors' in opts) {
+ // write directly to an object as customSelectors
+ opts.customSelectors = toJSON(customSelectors);
+ } else if ('custom-selectors' in opts) {
+ // write directly to an object as custom-selectors
+ opts['custom-selectors'] = toJSON(customSelectors);
+ } else {
+ // destination pathname
+ const to = String(opts.to || '');
+
+ // type of file being written to
+ const type = (opts.type || path.extname(opts.to).slice(1)).toLowerCase();
+
+ // transformed custom selectors
+ const customSelectorsJSON = toJSON(customSelectors);
+
+ if (type === 'css') {
+ await exportCustomSelectorsToCssFile(to, customSelectorsJSON);
+ }
+
+ if (type === 'js') {
+ await exportCustomSelectorsToCjsFile(to, customSelectorsJSON);
+ }
+
+ if (type === 'json') {
+ await exportCustomSelectorsToJsonFile(to, customSelectorsJSON);
+ }
+
+ if (type === 'mjs') {
+ await exportCustomSelectorsToMjsFile(to, customSelectorsJSON);
+ }
+ }
+ }
+ }));
+}
+
+/* Helper utilities
+/* ========================================================================== */
+
+const defaultCustomSelectorsToJSON = customSelectors => {
+ return Object.keys(customSelectors).reduce((customSelectorsJSON, key) => {
+ customSelectorsJSON[key] = String(customSelectors[key]);
+
+ return customSelectorsJSON;
+ }, {});
+};
+
+const writeFile = (to, text) => new Promise((resolve, reject) => {
+ fs.writeFile(to, text, error => {
+ if (error) {
+ reject(error);
+ } else {
+ resolve();
+ }
+ });
+});
+
+const escapeForJS = string => string.replace(/\\([\s\S])|(')/g, '\\$1$2').replace(/\n/g, '\\n').replace(/\r/g, '\\r');
diff --git a/lib/import-from.js b/lib/import-from.js
new file mode 100644
index 0000000..558c0a4
--- /dev/null
+++ b/lib/import-from.js
@@ -0,0 +1,121 @@
+import fs from 'fs';
+import path from 'path';
+import postcss from 'postcss';
+import getSelectorsAstFromSelectorsString from './selectors-ast-from-selectors-string';
+import getCustomSelectors from './custom-selectors-from-root';
+
+/* Import Custom Selectors from CSS AST
+/* ========================================================================== */
+
+function importCustomSelectorsFromCSSAST(root) {
+ return getCustomSelectors(root);
+}
+
+/* Import Custom Selectors from CSS File
+/* ========================================================================== */
+
+async function importCustomSelectorsFromCSSFile(from) {
+ const css = await readFile(path.resolve(from));
+ const root = postcss.parse(css, { from: path.resolve(from) });
+
+ return importCustomSelectorsFromCSSAST(root);
+}
+
+/* Import Custom Selectors from Object
+/* ========================================================================== */
+
+function importCustomSelectorsFromObject(object) {
+ const customSelectors = Object.assign(
+ {},
+ Object(object).customSelectors || Object(object)['custom-selectors']
+ );
+
+ for (const key in customSelectors) {
+ customSelectors[key] = getSelectorsAstFromSelectorsString(customSelectors[key]);
+ }
+
+ return customSelectors;
+}
+
+/* Import Custom Selectors from JSON file
+/* ========================================================================== */
+
+async function importCustomSelectorsFromJSONFile(from) {
+ const object = await readJSON(path.resolve(from));
+
+ return importCustomSelectorsFromObject(object);
+}
+
+/* Import Custom Selectors from JS file
+/* ========================================================================== */
+
+async function importCustomSelectorsFromJSFile(from) {
+ const object = await import(path.resolve(from));
+
+ return importCustomSelectorsFromObject(object);
+}
+
+/* Import Custom Selectors from Sources
+/* ========================================================================== */
+
+export default function importCustomSelectorsFromSources(sources) {
+ return sources.map(source => {
+ if (source instanceof Promise) {
+ return source;
+ } else if (source instanceof Function) {
+ return source();
+ }
+
+ // read the source as an object
+ const opts = source === Object(source) ? source : { from: String(source) };
+
+ // skip objects with custom selectors
+ if (Object(opts).customSelectors || Object(opts)['custom-selectors']) {
+ return opts
+ }
+
+ // source pathname
+ const from = String(opts.from || '');
+
+ // type of file being read from
+ const type = (opts.type || path.extname(from).slice(1)).toLowerCase();
+
+ return { type, from };
+ }).reduce(async (customSelectorsPromise, source) => {
+ const customSelectors = await customSelectorsPromise
+ const { type, from } = await source;
+
+ if (type === 'ast') {
+ return Object.assign(customSelectors, importCustomSelectorsFromCSSAST(from));
+ }
+
+ if (type === 'css') {
+ return Object.assign(customSelectors, await importCustomSelectorsFromCSSFile(from));
+ }
+
+ if (type === 'js') {
+ return Object.assign(customSelectors, await importCustomSelectorsFromJSFile(from));
+ }
+
+ if (type === 'json') {
+ return Object.assign(customSelectors, await importCustomSelectorsFromJSONFile(from));
+ }
+
+ return Object.assign(customSelectors, importCustomSelectorsFromObject(await source));
+ }, Promise.resolve({}));
+}
+
+/* Helper utilities
+/* ========================================================================== */
+
+const readFile = from => new Promise((resolve, reject) => {
+ fs.readFile(from, 'utf8', (error, result) => {
+ if (error) {
+ reject(error);
+ } else {
+ resolve(result);
+ }
+ });
+});
+
+const readJSON = async from => JSON.parse(await readFile(from));
diff --git a/lib/selectors-ast-from-selectors-string.js b/lib/selectors-ast-from-selectors-string.js
new file mode 100644
index 0000000..e3fdfd0
--- /dev/null
+++ b/lib/selectors-ast-from-selectors-string.js
@@ -0,0 +1,14 @@
+import parser from 'postcss-selector-parser';
+
+/* Return a Selectors AST from a Selectors String
+/* ========================================================================== */
+
+export default selectorString => {
+ let selectorAST;
+
+ parser(selectors => {
+ selectorAST = selectors
+ }).processSync(selectorString);
+
+ return selectorAST;
+};
diff --git a/lib/transform-rules.js b/lib/transform-rules.js
new file mode 100644
index 0000000..a13d285
--- /dev/null
+++ b/lib/transform-rules.js
@@ -0,0 +1,19 @@
+import parser from 'postcss-selector-parser';
+import transformSelectorsByCustomSelectors from './transform-selectors-by-custom-selectors';
+
+// transform custom pseudo selectors with custom selectors
+export default (root, customSelectors, opts) => {
+ root.walkRules(customPseudoRegExp, rule => {
+ const selector = parser(selectors => {
+ transformSelectorsByCustomSelectors(selectors, customSelectors, opts)
+ }).processSync(rule.selector);
+
+ if (opts.preserve) {
+ rule.cloneBefore({ selector });
+ } else {
+ rule.selector = selector;
+ }
+ });
+};
+
+const customPseudoRegExp = /:--[A-z][\w-]*/;
diff --git a/lib/transform-selectors-by-custom-selectors.js b/lib/transform-selectors-by-custom-selectors.js
new file mode 100644
index 0000000..2a3daf2
--- /dev/null
+++ b/lib/transform-selectors-by-custom-selectors.js
@@ -0,0 +1,87 @@
+// return transformed selectors, replacing custom pseudo selectors with custom selectors
+export default function transformSelectorList(selectorList, customSelectors) {
+ let index = selectorList.nodes.length - 1;
+
+ while (index >= 0) {
+ const transformedSelectors = transformSelector(selectorList.nodes[index], customSelectors);
+
+ if (transformedSelectors.length) {
+ selectorList.nodes.splice(index, 1, ...transformedSelectors);
+ }
+
+ --index;
+ }
+
+ return selectorList;
+}
+
+// return custom pseudo selectors replaced with custom selectors
+function transformSelector(selector, customSelectors) {
+ const transpiledSelectors = [];
+
+ for (const index in selector.nodes) {
+ const { value, nodes } = selector.nodes[index];
+
+ if (value in customSelectors) {
+ for (const replacementSelector of customSelectors[value].nodes) {
+ const selectorClone = selector.clone();
+
+ selectorClone.nodes.splice(index, 1, ...replacementSelector.clone().nodes.map(node => {
+ // use spacing from the current usage
+ node.spaces = { ...selector.nodes[index].spaces };
+
+ return node;
+ }));
+
+ const retranspiledSelectors = transformSelector(selectorClone, customSelectors);
+
+ adjustNodesBySelectorEnds(selectorClone.nodes, Number(index));
+
+ if (retranspiledSelectors.length) {
+ transpiledSelectors.push(...retranspiledSelectors);
+ } else {
+ transpiledSelectors.push(selectorClone);
+ }
+ }
+
+ return transpiledSelectors;
+ } else if (nodes && nodes.length) {
+ transformSelectorList(selector.nodes[index], customSelectors);
+ }
+ }
+
+ return transpiledSelectors;
+}
+
+// match selectors by difficult-to-separate ends
+const withoutSelectorStartMatch = /^(tag|universal)$/;
+const withoutSelectorEndMatch = /^(class|id|pseudo|tag|universal)$/;
+
+const isWithoutSelectorStart = node => withoutSelectorStartMatch.test(Object(node).type);
+const isWithoutSelectorEnd = node => withoutSelectorEndMatch.test(Object(node).type);
+
+// adjust nodes by selector ends (so that .class:--h1 becomes h1.class rather than .classh1)
+const adjustNodesBySelectorEnds = (nodes, index) => {
+ if (index && isWithoutSelectorStart(nodes[index]) && isWithoutSelectorEnd(nodes[index - 1])) {
+ let safeIndex = index - 1;
+
+ while (safeIndex && isWithoutSelectorEnd(nodes[safeIndex])) {
+ --safeIndex;
+ }
+
+ if (safeIndex < index) {
+ const node = nodes.splice(index, 1)[0];
+
+ nodes.splice(safeIndex, 0, node);
+
+ nodes[safeIndex].spaces.before = nodes[safeIndex + 1].spaces.before;
+ nodes[safeIndex + 1].spaces.before = '';
+
+ if (nodes[index]) {
+ nodes[index].spaces.after = nodes[safeIndex].spaces.after;
+ nodes[safeIndex].spaces.after = '';
+ }
+ }
+ }
+};
+
diff --git a/package.json b/package.json
index 12c204c..0599ea1 100644
--- a/package.json
+++ b/package.json
@@ -1,44 +1,70 @@
{
"name": "postcss-custom-selectors",
- "version": "3.0.0",
- "description": "PostCSS plugin to transform W3C CSS Extensions(Custom Selectors) to more compatible CSS",
- "keywords": [
- "postcss",
- "postcss-plugin",
- "css",
- "selector",
- "custom-selector"
- ],
- "authors": [
+ "version": "6.0.0",
+ "description": "Use Custom Selectors in CSS",
+ "author": "Jonathan Neal ",
+ "contributors": [
"yisi",
"Maxime Thirouin"
],
"license": "MIT",
- "repository": {
- "type": "git",
- "url": "https://github.com/postcss/postcss-custom-selectors.git"
- },
- "main": "dist/index.js",
+ "repository": "postcss/postcss-custom-selectors",
+ "homepage": "https://github.com/postcss/postcss-custom-selectors#readme",
+ "bugs": "https://github.com/postcss/postcss-custom-selectors/issues",
+ "main": "index.cjs.js",
+ "module": "index.es.mjs",
"files": [
- "dist",
- "README-zh.md"
+ "index.cjs.js",
+ "index.cjs.js.map",
+ "index.es.mjs",
+ "index.es.mjs.map"
],
+ "scripts": {
+ "prepublishOnly": "npm test",
+ "pretest": "rollup -c .rollup.js --silent",
+ "test": "echo 'Running tests...'; npm run test:js && npm run test:tape",
+ "test:js": "eslint *.js lib/*.js --cache --ignore-path .gitignore --quiet",
+ "test:tape": "postcss-tape"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
"dependencies": {
- "balanced-match": "^0.2.0",
- "postcss": "^5.0.0",
- "postcss-selector-matches": "^2.0.0"
+ "postcss-selector-parser": "^6.0.4"
},
"devDependencies": {
- "babel": "^5.5.8",
- "babel-eslint": "^3.1.15",
- "babel-tape-runner": "^1.1.0",
- "eslint": "^1.0.0",
- "tape": "^4.0.0"
+ "@babel/core": "^7.1.0",
+ "@babel/plugin-syntax-dynamic-import": "^7.0.0",
+ "@babel/preset-env": "^7.1.0",
+ "@rollup/plugin-babel": "^5.2.1",
+ "babel-eslint": "^10.0.0",
+ "eslint": "^7.0.0",
+ "eslint-config-dev": "^2.0.0",
+ "postcss": "^8.1.2",
+ "postcss-tape": "^6.0.0",
+ "pre-commit": "^1.2.2",
+ "rollup": "^2.0.0"
},
- "scripts": {
- "prepublish": "babel src --out-dir dist",
- "lint": "eslint .",
- "tape": "babel-tape-runner 'test/*.js'",
- "test": "npm run lint && npm run tape"
- }
+ "peerDependencies": {
+ "postcss": "^8.1.2"
+ },
+ "eslintConfig": {
+ "extends": "dev",
+ "parser": "babel-eslint"
+ },
+ "keywords": [
+ "postcss",
+ "css",
+ "postcss-plugin",
+ "custom",
+ "selectors",
+ "w3c",
+ "csswg",
+ "extensions",
+ "declarative",
+ "rule",
+ "atrule",
+ "at-rule",
+ "specification"
+ ]
}
diff --git a/src/index.js b/src/index.js
deleted file mode 100644
index bed1731..0000000
--- a/src/index.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import postcss from "postcss"
-import replaceRuleSelector
- from "postcss-selector-matches/dist/replaceRuleSelector"
-
-const CUSTOM_SELECTOR_RE = /:--[\w-]+/g
-
-export default postcss.plugin("postcss-custom-selectors", function(options) {
- const {
- extensions,
- lineBreak,
- transformMatches,
- } = {
- extensions: {},
- lineBreak: true,
- transformMatches: true,
- ...options || {},
- }
-
- const transformMatchesOnRule = transformMatches
- ? (rule) => replaceRuleSelector(rule, {
- lineBreak,
- })
- : (rule) => rule.selector
-
- return function(css, result) {
- const toRemove = []
- const customSelectors = {}
-
- // first, read custom selectors
- css.walkAtRules(function(rule) {
- if (rule.name !== "custom-selector") {
- return
- }
-
- // @custom-selector = @custom-selector
- const params = rule.params.split(/\s/)
- const customName = params.shift()
- const customList = rule.params.replace(customName, "").trim()
- customSelectors[customName] = customList
-
- toRemove.push(rule)
- })
-
- // Add JS defined selectors
- Object.keys(extensions).forEach(function(extension) {
- customSelectors[extension] = extensions[extension]
- })
-
- // Convert those selectors to :matches()
- css.walkRules(function(rule) {
- if (rule.selector.indexOf(":--") > -1) {
- rule.selector = rule.selector.replace(
- CUSTOM_SELECTOR_RE,
- function(extensionName, matches, selector) {
-
- if (!customSelectors[extensionName]) {
- result.warn(
- "The selector '" + rule.selector + "' is undefined",
- {node: rule}
- )
-
- return selector
- }
-
- return ":matches(" + customSelectors[extensionName] + ")"
- }
- )
-
- rule.selector = transformMatchesOnRule(rule)
- }
- })
-
- toRemove.forEach(function(rule) {
- rule.remove()
- })
-
- }
-})
diff --git a/test/basic.css b/test/basic.css
new file mode 100644
index 0000000..bc702aa
--- /dev/null
+++ b/test/basic.css
@@ -0,0 +1,94 @@
+@custom-selector :--foo .bar, .baz;
+
+.foo:--foo {
+ margin-top: 16px;
+}
+
+@custom-selector :--any-heading h1, h2, h3, h4, h5, h6;
+
+:--any-heading + p {}
+
+@custom-selector :--foobar .foo, .bar;
+@custom-selector :--baz .baz;
+@custom-selector :--fizzbuzz .fizz, .buzz;
+@custom-selector :--button-types
+ .btn-primary,
+ .btn-success,
+ .btn-info,
+ .btn-warning,
+ .btn-danger;
+
+:--foobar > :--baz {}
+:--fizzbuzz > :--foobar {}
+:--button-types, :--button-types:active {}
+
+@custom-selector :--commented-foo
+ /* comment */
+ .foo,
+ .bar > .baz;
+
+:--commented-foo + p {
+ display: block;
+}
+
+@custom-selector :--pseudo ::before, ::after;
+
+.foo > a:--pseudo img {
+ display: block;
+}
+
+@custom-selector :--foo .foo;
+
+:--foo, :--foo.bar {
+ color: white;
+}
+
+:--foo :--foo:hover {
+ color: white;
+}
+
+@custom-selector :--fo-----o h1, h2, h3;
+@custom-selector :--ba-----r h4, h5, h6;
+
+.fo--oo > :--fo-----o {
+ margin: auto;
+}
+
+:--ba-----r:hover .ba--z {
+ display: block;
+}
+
+/* comment */
+
+article :--heading + p {
+ margin-top: 0;
+}
+
+@custom-selector :--multiline
+ .foo,
+ .bar > .baz;
+
+:--multiline {
+ display: block;
+}
+
+/* should works with collapsed custom selectors */
+
+@custom-selector :--button button, .button;
+@custom-selector :--enter :hover, :focus;
+
+:--button:--enter {}
+
+@custom-selector :--any-foobar .foo, .bar;
+
+:--any-foobar h1 {
+ margin-top: 16px;
+}
+
+main :--foo + p {
+ margin-top: 16px;
+}
+
+@custom-selector :--foobar .foo;
+
+:--foobar {}
diff --git a/test/basic.expect.css b/test/basic.expect.css
new file mode 100644
index 0000000..c473452
--- /dev/null
+++ b/test/basic.expect.css
@@ -0,0 +1,57 @@
+.foo.foo {
+ margin-top: 16px;
+}
+
+h1 + p,h2 + p,h3 + p,h4 + p,h5 + p,h6 + p {}
+
+.foo > .baz {}
+.fizz > .foo,.buzz > .foo {}
+.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active {}
+
+.foo + p,.bar>.baz + p {
+ display: block;
+}
+
+.foo > a::before img,.foo > a::after img {
+ display: block;
+}
+
+.foo, .foo.bar {
+ color: white;
+}
+
+.foo .foo:hover {
+ color: white;
+}
+
+.fo--oo > h1,.fo--oo > h2,.fo--oo > h3 {
+ margin: auto;
+}
+
+h4:hover .ba--z,h5:hover .ba--z,h6:hover .ba--z {
+ display: block;
+}
+
+/* comment */
+
+article :--heading + p {
+ margin-top: 0;
+}
+
+.foo,.bar>.baz {
+ display: block;
+}
+
+/* should works with collapsed custom selectors */
+
+button:hover,button:focus,.button:hover,.button:focus {}
+
+.foo h1,.bar h1 {
+ margin-top: 16px;
+}
+
+main .foo + p {
+ margin-top: 16px;
+}
+
+.foo {}
diff --git a/test/basic.import-empty.expect.css b/test/basic.import-empty.expect.css
new file mode 100644
index 0000000..c473452
--- /dev/null
+++ b/test/basic.import-empty.expect.css
@@ -0,0 +1,57 @@
+.foo.foo {
+ margin-top: 16px;
+}
+
+h1 + p,h2 + p,h3 + p,h4 + p,h5 + p,h6 + p {}
+
+.foo > .baz {}
+.fizz > .foo,.buzz > .foo {}
+.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active {}
+
+.foo + p,.bar>.baz + p {
+ display: block;
+}
+
+.foo > a::before img,.foo > a::after img {
+ display: block;
+}
+
+.foo, .foo.bar {
+ color: white;
+}
+
+.foo .foo:hover {
+ color: white;
+}
+
+.fo--oo > h1,.fo--oo > h2,.fo--oo > h3 {
+ margin: auto;
+}
+
+h4:hover .ba--z,h5:hover .ba--z,h6:hover .ba--z {
+ display: block;
+}
+
+/* comment */
+
+article :--heading + p {
+ margin-top: 0;
+}
+
+.foo,.bar>.baz {
+ display: block;
+}
+
+/* should works with collapsed custom selectors */
+
+button:hover,button:focus,.button:hover,.button:focus {}
+
+.foo h1,.bar h1 {
+ margin-top: 16px;
+}
+
+main .foo + p {
+ margin-top: 16px;
+}
+
+.foo {}
diff --git a/test/basic.import.expect.css b/test/basic.import.expect.css
new file mode 100644
index 0000000..46a68c7
--- /dev/null
+++ b/test/basic.import.expect.css
@@ -0,0 +1,57 @@
+.foo.foo {
+ margin-top: 16px;
+}
+
+h1 + p,h2 + p,h3 + p,h4 + p,h5 + p,h6 + p {}
+
+.foo > .baz {}
+.fizz > .foo,.buzz > .foo {}
+.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active {}
+
+.foo + p,.bar>.baz + p {
+ display: block;
+}
+
+.foo > a::before img,.foo > a::after img {
+ display: block;
+}
+
+.foo, .foo.bar {
+ color: white;
+}
+
+.foo .foo:hover {
+ color: white;
+}
+
+.fo--oo > h1,.fo--oo > h2,.fo--oo > h3 {
+ margin: auto;
+}
+
+h4:hover .ba--z,h5:hover .ba--z,h6:hover .ba--z {
+ display: block;
+}
+
+/* comment */
+
+article h1 + p,article h2 + p,article h3 + p {
+ margin-top: 0;
+}
+
+.foo,.bar>.baz {
+ display: block;
+}
+
+/* should works with collapsed custom selectors */
+
+button:hover,button:focus,.button:hover,.button:focus {}
+
+.foo h1,.bar h1 {
+ margin-top: 16px;
+}
+
+main .foo + p {
+ margin-top: 16px;
+}
+
+.foo {}
diff --git a/test/basic.preserve.expect.css b/test/basic.preserve.expect.css
new file mode 100644
index 0000000..6727460
--- /dev/null
+++ b/test/basic.preserve.expect.css
@@ -0,0 +1,148 @@
+@custom-selector :--foo .bar, .baz;
+
+.foo.foo {
+ margin-top: 16px;
+}
+
+.foo:--foo {
+ margin-top: 16px;
+}
+
+@custom-selector :--any-heading h1, h2, h3, h4, h5, h6;
+
+h1 + p,h2 + p,h3 + p,h4 + p,h5 + p,h6 + p {}
+
+:--any-heading + p {}
+
+@custom-selector :--foobar .foo, .bar;
+@custom-selector :--baz .baz;
+@custom-selector :--fizzbuzz .fizz, .buzz;
+@custom-selector :--button-types
+ .btn-primary,
+ .btn-success,
+ .btn-info,
+ .btn-warning,
+ .btn-danger;
+
+.foo > .baz {}
+
+:--foobar > :--baz {}
+.fizz > .foo,.buzz > .foo {}
+:--fizzbuzz > :--foobar {}
+.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active {}
+:--button-types, :--button-types:active {}
+
+@custom-selector :--commented-foo
+ /* comment */
+ .foo,
+ .bar > .baz;
+
+.foo + p,.bar>.baz + p {
+ display: block;
+}
+
+:--commented-foo + p {
+ display: block;
+}
+
+@custom-selector :--pseudo ::before, ::after;
+
+.foo > a::before img,.foo > a::after img {
+ display: block;
+}
+
+.foo > a:--pseudo img {
+ display: block;
+}
+
+@custom-selector :--foo .foo;
+
+.foo, .foo.bar {
+ color: white;
+}
+
+:--foo, :--foo.bar {
+ color: white;
+}
+
+.foo .foo:hover {
+ color: white;
+}
+
+:--foo :--foo:hover {
+ color: white;
+}
+
+@custom-selector :--fo-----o h1, h2, h3;
+@custom-selector :--ba-----r h4, h5, h6;
+
+.fo--oo > h1,.fo--oo > h2,.fo--oo > h3 {
+ margin: auto;
+}
+
+.fo--oo > :--fo-----o {
+ margin: auto;
+}
+
+h4:hover .ba--z,h5:hover .ba--z,h6:hover .ba--z {
+ display: block;
+}
+
+:--ba-----r:hover .ba--z {
+ display: block;
+}
+
+/* comment */
+
+article :--heading + p {
+ margin-top: 0;
+}
+
+article :--heading + p {
+ margin-top: 0;
+}
+
+@custom-selector :--multiline
+ .foo,
+ .bar > .baz;
+
+.foo,.bar>.baz {
+ display: block;
+}
+
+:--multiline {
+ display: block;
+}
+
+/* should works with collapsed custom selectors */
+
+@custom-selector :--button button, .button;
+@custom-selector :--enter :hover, :focus;
+
+button:hover,button:focus,.button:hover,.button:focus {}
+
+:--button:--enter {}
+
+@custom-selector :--any-foobar .foo, .bar;
+
+.foo h1,.bar h1 {
+ margin-top: 16px;
+}
+
+:--any-foobar h1 {
+ margin-top: 16px;
+}
+
+main .foo + p {
+ margin-top: 16px;
+}
+
+main :--foo + p {
+ margin-top: 16px;
+}
+
+@custom-selector :--foobar .foo;
+
+.foo {}
+
+:--foobar {}
diff --git a/test/empty.css b/test/empty.css
new file mode 100644
index 0000000..e69de29
diff --git a/test/export-selectors.css b/test/export-selectors.css
new file mode 100644
index 0000000..7973b78
--- /dev/null
+++ b/test/export-selectors.css
@@ -0,0 +1,20 @@
+@custom-selector :--foo .foo;
+@custom-selector :--any-heading h1, h2, h3, h4, h5, h6;
+@custom-selector :--foobar .foo;
+@custom-selector :--baz .baz;
+@custom-selector :--fizzbuzz .fizz, .buzz;
+@custom-selector :--button-types .btn-primary,
+ .btn-success,
+ .btn-info,
+ .btn-warning,
+ .btn-danger;
+@custom-selector :--commented-foo .foo,
+ .bar > .baz;
+@custom-selector :--pseudo ::before, ::after;
+@custom-selector :--fo-----o h1, h2, h3;
+@custom-selector :--ba-----r h4, h5, h6;
+@custom-selector :--multiline .foo,
+ .bar > .baz;
+@custom-selector :--button button, .button;
+@custom-selector :--enter :hover, :focus;
+@custom-selector :--any-foobar .foo, .bar;
diff --git a/test/export-selectors.js b/test/export-selectors.js
new file mode 100644
index 0000000..e6ed9f0
--- /dev/null
+++ b/test/export-selectors.js
@@ -0,0 +1,18 @@
+module.exports = {
+ customSelectors: {
+ ':--foo': '.foo',
+ ':--any-heading': 'h1, h2, h3, h4, h5, h6',
+ ':--foobar': '.foo',
+ ':--baz': '.baz',
+ ':--fizzbuzz': '.fizz, .buzz',
+ ':--button-types': '.btn-primary,\n .btn-success,\n .btn-info,\n .btn-warning,\n .btn-danger',
+ ':--commented-foo': '.foo,\n .bar > .baz',
+ ':--pseudo': '::before, ::after',
+ ':--fo-----o': 'h1, h2, h3',
+ ':--ba-----r': 'h4, h5, h6',
+ ':--multiline': '.foo,\n .bar > .baz',
+ ':--button': 'button, .button',
+ ':--enter': ':hover, :focus',
+ ':--any-foobar': '.foo, .bar'
+ }
+};
diff --git a/test/export-selectors.json b/test/export-selectors.json
new file mode 100644
index 0000000..089840c
--- /dev/null
+++ b/test/export-selectors.json
@@ -0,0 +1,18 @@
+{
+ "custom-selectors": {
+ ":--foo": ".foo",
+ ":--any-heading": "h1, h2, h3, h4, h5, h6",
+ ":--foobar": ".foo",
+ ":--baz": ".baz",
+ ":--fizzbuzz": ".fizz, .buzz",
+ ":--button-types": ".btn-primary,\n\t.btn-success,\n\t.btn-info,\n\t.btn-warning,\n\t.btn-danger",
+ ":--commented-foo": ".foo,\n\t.bar > .baz",
+ ":--pseudo": "::before, ::after",
+ ":--fo-----o": "h1, h2, h3",
+ ":--ba-----r": "h4, h5, h6",
+ ":--multiline": ".foo,\n\t.bar > .baz",
+ ":--button": "button, .button",
+ ":--enter": ":hover, :focus",
+ ":--any-foobar": ".foo, .bar"
+ }
+}
diff --git a/test/export-selectors.mjs b/test/export-selectors.mjs
new file mode 100644
index 0000000..f445eb2
--- /dev/null
+++ b/test/export-selectors.mjs
@@ -0,0 +1,16 @@
+export const customSelectors = {
+ ':--foo': '.foo',
+ ':--any-heading': 'h1, h2, h3, h4, h5, h6',
+ ':--foobar': '.foo',
+ ':--baz': '.baz',
+ ':--fizzbuzz': '.fizz, .buzz',
+ ':--button-types': '.btn-primary,\n .btn-success,\n .btn-info,\n .btn-warning,\n .btn-danger',
+ ':--commented-foo': '.foo,\n .bar > .baz',
+ ':--pseudo': '::before, ::after',
+ ':--fo-----o': 'h1, h2, h3',
+ ':--ba-----r': 'h4, h5, h6',
+ ':--multiline': '.foo,\n .bar > .baz',
+ ':--button': 'button, .button',
+ ':--enter': ':hover, :focus',
+ ':--any-foobar': '.foo, .bar'
+};
diff --git a/test/import-selectors.css b/test/import-selectors.css
new file mode 100644
index 0000000..6926002
--- /dev/null
+++ b/test/import-selectors.css
@@ -0,0 +1 @@
+@custom-selector :--heading h1, h2, h3;
diff --git a/test/import-selectors.js b/test/import-selectors.js
new file mode 100644
index 0000000..71d4556
--- /dev/null
+++ b/test/import-selectors.js
@@ -0,0 +1,5 @@
+module.exports = {
+ customSelectors: {
+ ':--heading': 'h1, h2, h3'
+ }
+}
diff --git a/test/import-selectors.json b/test/import-selectors.json
new file mode 100644
index 0000000..1c3b8bc
--- /dev/null
+++ b/test/import-selectors.json
@@ -0,0 +1,5 @@
+{
+ "custom-selectors": {
+ ":--heading": "h1, h2, h3"
+ }
+}
diff --git a/test/index.js b/test/index.js
deleted file mode 100644
index 9c7fac8..0000000
--- a/test/index.js
+++ /dev/null
@@ -1,283 +0,0 @@
-import test from "tape"
-import postcss from "postcss"
-import plugin from "../src"
-
-function transform(input, opts = {}, postcssOpts = {}) {
- return postcss()
- .use(plugin(opts))
- .process(input, postcssOpts)
-}
-
-test("@custom-selector", function(t) {
- t.equal(
- transform(
- ``
- ).css,
- ``,
- "should works with nothing"
- )
-
- const undefinedResult = transform(":--undef {}")
- t.ok(
- undefinedResult.messages && undefinedResult.messages.length === 1,
- "should add a message when a custom selectors is undefined"
- )
-
- t.equal(
- transform(
- `@custom-selector :--foo .bar, .baz;
-.foo:--foo {
- margin-top: 16px;
-}`,
- {transformMatches: false}
- ).css,
- `.foo:matches(.bar, .baz) {
- margin-top: 16px;
-}`,
- "should works be able to limit transformation to :matches()"
- )
-
- t.equal(
- transform(
- `@custom-selector :--heading h1, h2, h3, h4, h5, h6;
-
-article :--heading + p {}`
- ).css,
- `article h1 + p,
-article h2 + p,
-article h3 + p,
-article h4 + p,
-article h5 + p,
-article h6 + p {}`,
- "should transform heading"
- )
-
- t.equal(
- transform(
- `@custom-selector :--foobar .foo, .bar;
-@custom-selector :--baz .baz;
-@custom-selector :--fizzbuzz .fizz, .buzz;
-@custom-selector :--button-types
- .btn-primary,
- .btn-success,
- .btn-info,
- .btn-warning,
- .btn-danger;
-
-:--foobar > :--baz {}
-
-:--fizzbuzz > :--foobar {}
-
-:--button-types, :--button-types:active {}`
- ).css,
- `.foo > .baz,
-.bar > .baz {}
-
-.fizz > .foo,
-.buzz > .foo,
-.fizz > .bar,
-.buzz > .bar {}
-
-.btn-primary,
-.btn-success,
-.btn-info,
-.btn-warning,
-.btn-danger,
-.btn-primary:active,
-.btn-success:active,
-.btn-info:active,
-.btn-warning:active,
-.btn-danger:active {}`,
- "should work with a complicated example"
- )
-
- t.equal(
- transform(
- `/* comment */
-@custom-selector :--foo
- /* comment */
- .foo,
- .bar > .baz;
-
-
-/* comment */
- :--foo + p {
- display: block;
- }`
- ).css,
- `/* comment */
-
-
-/* comment */
- .foo + p,
- .bar > .baz + p {
- display: block;
- }`,
- "should works with comments"
- )
-
- t.equal(
- transform(
- `@custom-selector :--pseudo ::before, ::after;
-
-.foo > a:--pseudo img {
- display: block;
-}
-`
- ).css,
- `.foo > a::before img,
-.foo > a::after img {
- display: block;
-}
-`,
- "should works with pseudo elements"
- )
-
- t.equal(
- transform(
- `@custom-selector :--foo .foo;
-
-:--foo, :--foo.bar {
- color: white;
-}
-`
- ).css,
- `.foo,
-.foo.bar {
- color: white;
-}
-`,
- "should works handle multiples combined selectors"
- )
-
- t.equal(
- transform(
- `@custom-selector :--foo h1, h2, h3;
-@custom-selector :--ba-----r h4, h5, h6;
-
-.fo--oo > :--foo {
- margin: auto;
-}
-
-:--ba-----r:hover .ba--z {
- display: block;
-}
-`
- ).css,
- `.fo--oo > h1,
-.fo--oo > h2,
-.fo--oo > h3 {
- margin: auto;
-}
-
-h4:hover .ba--z,
-h5:hover .ba--z,
-h6:hover .ba--z {
- display: block;
-}
-`,
- "should works with weird identifiers"
- )
-
- t.equal(
- transform(
- `@custom-selector :--heading h1, h2, h3, h4, h5, h6;
-/* comment */
-
- article :--heading + p {
- margin-top: 0;
- }
-`,
- {lineBreak: false}
- ).css,
- `/* comment */
-
- article h1 + p, article h2 + p, article h3 + p, article h4 + p, ` +
- `article h5 + p, article h6 + p {
- margin-top: 0;
- }
-`,
- "should works works with no line breaks"
- )
-
- t.equal(
- transform(
- `@custom-selector :--multiline
- .foo,
- .bar > .baz;
-
-:--multiline {
- display: block;
-}
-`
- ).css,
- `.foo,
-.bar > .baz {
- display: block;
-}
-`,
- "should works with multilines definition"
- )
-
- t.equal(
- transform(
- `@custom-selector :--button button, .button;
-@custom-selector :--enter :hover, :focus;
-
-:--button:--enter {}`
- ).css,
- `button:hover,
-.button:hover,
-button:focus,
-.button:focus {}`,
- "should works with collapsed custom selectors"
- )
-
- t.equal(
- transform(
- `@custom-selector :--any .foo, .bar;
-@custom-selector :--foo .baz;
-
-:--any h1 {
- margin-top: 16px;
-}
-
-main :--foo + p {
- margin-top: 16px;
-}
-`,
- {
- extensions: {
- ":--any": "section, article, aside, nav",
- ":--foo": "input[type=\"text\"] > section, #nav .bar",
- },
- }
- ).css,
- `section h1,
-article h1,
-aside h1,
-nav h1 {
- margin-top: 16px;
-}
-
-main input[type="text"] > section + p,
-main #nav .bar + p {
- margin-top: 16px;
-}
-`,
- "should transform local extensions"
- )
-
- const postcssPlugin = postcss().use(plugin())
- t.ok(
- postcssPlugin.process("@custom-selector :--foobar .foo;:--foobar{}").css,
- "should not create a memory"
- )
- t.equal(
- postcssPlugin.process(":--foobar{}").css,
- ":--foobar{}",
- "should have no memory about previous processing"
- )
-
- t.end()
-})
diff --git a/test/safety.css b/test/safety.css
new file mode 100644
index 0000000..7dc80f7
--- /dev/null
+++ b/test/safety.css
@@ -0,0 +1,13 @@
+@custom-selector :--h1 h1;
+
+.class:--h1, #id:--h1, ::before:--h1, *:--h1 {
+ order: 1;
+}
+
+.foo.class:--h1 , .foo#id:--h1 , .foo::before:--h1 {
+ order: 2;
+}
+
+.foo.class:--h1 , .foo#id:--h1 , .foo::before:--h1 {
+ order: 3;
+}
diff --git a/test/safety.expect.css b/test/safety.expect.css
new file mode 100644
index 0000000..2184ce4
--- /dev/null
+++ b/test/safety.expect.css
@@ -0,0 +1,11 @@
+h1.class, h1#id, h1::before, h1* {
+ order: 1;
+}
+
+h1.foo.class , h1.foo#id , h1.foo::before {
+ order: 2;
+}
+
+h1.foo.class , h1.foo#id , h1.foo::before {
+ order: 3;
+}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..35174c2
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,2025 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
+ integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
+ dependencies:
+ "@babel/highlight" "^7.10.4"
+
+"@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7":
+ version "7.12.7"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41"
+ integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==
+
+"@babel/core@^7.1.0":
+ version "7.12.10"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd"
+ integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/generator" "^7.12.10"
+ "@babel/helper-module-transforms" "^7.12.1"
+ "@babel/helpers" "^7.12.5"
+ "@babel/parser" "^7.12.10"
+ "@babel/template" "^7.12.7"
+ "@babel/traverse" "^7.12.10"
+ "@babel/types" "^7.12.10"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.1"
+ json5 "^2.1.2"
+ lodash "^4.17.19"
+ semver "^5.4.1"
+ source-map "^0.5.0"
+
+"@babel/generator@^7.12.10", "@babel/generator@^7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af"
+ integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==
+ dependencies:
+ "@babel/types" "^7.12.11"
+ jsesc "^2.5.1"
+ source-map "^0.5.0"
+
+"@babel/helper-annotate-as-pure@^7.10.4":
+ version "7.12.10"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d"
+ integrity sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==
+ dependencies:
+ "@babel/types" "^7.12.10"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3"
+ integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-compilation-targets@^7.12.5":
+ version "7.12.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831"
+ integrity sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==
+ dependencies:
+ "@babel/compat-data" "^7.12.5"
+ "@babel/helper-validator-option" "^7.12.1"
+ browserslist "^4.14.5"
+ semver "^5.5.0"
+
+"@babel/helper-create-class-features-plugin@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e"
+ integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==
+ dependencies:
+ "@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-create-regexp-features-plugin@^7.12.1":
+ version "7.12.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz#2084172e95443fa0a09214ba1bb328f9aea1278f"
+ integrity sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.10.4"
+ regexpu-core "^4.7.1"
+
+"@babel/helper-define-map@^7.10.4":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30"
+ integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==
+ dependencies:
+ "@babel/helper-function-name" "^7.10.4"
+ "@babel/types" "^7.10.5"
+ lodash "^4.17.19"
+
+"@babel/helper-explode-assignable-expression@^7.10.4":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633"
+ integrity sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==
+ dependencies:
+ "@babel/types" "^7.12.1"
+
+"@babel/helper-function-name@^7.10.4", "@babel/helper-function-name@^7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz#1fd7738aee5dcf53c3ecff24f1da9c511ec47b42"
+ integrity sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.12.10"
+ "@babel/template" "^7.12.7"
+ "@babel/types" "^7.12.11"
+
+"@babel/helper-get-function-arity@^7.12.10":
+ version "7.12.10"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf"
+ integrity sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==
+ dependencies:
+ "@babel/types" "^7.12.10"
+
+"@babel/helper-hoist-variables@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e"
+ integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==
+ dependencies:
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-member-expression-to-functions@^7.12.1", "@babel/helper-member-expression-to-functions@^7.12.7":
+ version "7.12.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855"
+ integrity sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==
+ dependencies:
+ "@babel/types" "^7.12.7"
+
+"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5":
+ version "7.12.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb"
+ integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==
+ dependencies:
+ "@babel/types" "^7.12.5"
+
+"@babel/helper-module-transforms@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c"
+ integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==
+ dependencies:
+ "@babel/helper-module-imports" "^7.12.1"
+ "@babel/helper-replace-supers" "^7.12.1"
+ "@babel/helper-simple-access" "^7.12.1"
+ "@babel/helper-split-export-declaration" "^7.11.0"
+ "@babel/helper-validator-identifier" "^7.10.4"
+ "@babel/template" "^7.10.4"
+ "@babel/traverse" "^7.12.1"
+ "@babel/types" "^7.12.1"
+ lodash "^4.17.19"
+
+"@babel/helper-optimise-call-expression@^7.10.4", "@babel/helper-optimise-call-expression@^7.12.10":
+ version "7.12.10"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d"
+ integrity sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==
+ dependencies:
+ "@babel/types" "^7.12.10"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375"
+ integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==
+
+"@babel/helper-remap-async-to-generator@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd"
+ integrity sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.10.4"
+ "@babel/helper-wrap-function" "^7.10.4"
+ "@babel/types" "^7.12.1"
+
+"@babel/helper-replace-supers@^7.12.1":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz#ea511658fc66c7908f923106dd88e08d1997d60d"
+ integrity sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.12.7"
+ "@babel/helper-optimise-call-expression" "^7.12.10"
+ "@babel/traverse" "^7.12.10"
+ "@babel/types" "^7.12.11"
+
+"@babel/helper-simple-access@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136"
+ integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==
+ dependencies:
+ "@babel/types" "^7.12.1"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf"
+ integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==
+ dependencies:
+ "@babel/types" "^7.12.1"
+
+"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0", "@babel/helper-split-export-declaration@^7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz#1b4cc424458643c47d37022223da33d76ea4603a"
+ integrity sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==
+ dependencies:
+ "@babel/types" "^7.12.11"
+
+"@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
+ integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
+
+"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz#d66cb8b7a3e7fe4c6962b32020a131ecf0847f4f"
+ integrity sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==
+
+"@babel/helper-wrap-function@^7.10.4":
+ version "7.12.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9"
+ integrity sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==
+ dependencies:
+ "@babel/helper-function-name" "^7.10.4"
+ "@babel/template" "^7.10.4"
+ "@babel/traverse" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/helpers@^7.12.5":
+ version "7.12.5"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e"
+ integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==
+ dependencies:
+ "@babel/template" "^7.10.4"
+ "@babel/traverse" "^7.12.5"
+ "@babel/types" "^7.12.5"
+
+"@babel/highlight@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
+ integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.10.4"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.7.0":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79"
+ integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==
+
+"@babel/plugin-proposal-async-generator-functions@^7.12.1":
+ version "7.12.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz#04b8f24fd4532008ab4e79f788468fd5a8476566"
+ integrity sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-remap-async-to-generator" "^7.12.1"
+ "@babel/plugin-syntax-async-generators" "^7.8.0"
+
+"@babel/plugin-proposal-class-properties@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de"
+ integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.12.1"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-proposal-dynamic-import@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc"
+ integrity sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+
+"@babel/plugin-proposal-export-namespace-from@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4"
+ integrity sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-proposal-json-strings@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c"
+ integrity sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-json-strings" "^7.8.0"
+
+"@babel/plugin-proposal-logical-assignment-operators@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751"
+ integrity sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c"
+ integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
+
+"@babel/plugin-proposal-numeric-separator@^7.12.7":
+ version "7.12.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz#8bf253de8139099fea193b297d23a9d406ef056b"
+ integrity sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-proposal-object-rest-spread@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069"
+ integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+ "@babel/plugin-transform-parameters" "^7.12.1"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942"
+ integrity sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
+
+"@babel/plugin-proposal-optional-chaining@^7.12.7":
+ version "7.12.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c"
+ integrity sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.0"
+
+"@babel/plugin-proposal-private-methods@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389"
+ integrity sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.12.1"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072"
+ integrity sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.12.1"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-async-generators@^7.8.0":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978"
+ integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+ integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
+ integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-json-strings@^7.8.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-top-level-await@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0"
+ integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-arrow-functions@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3"
+ integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-async-to-generator@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1"
+ integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==
+ dependencies:
+ "@babel/helper-module-imports" "^7.12.1"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-remap-async-to-generator" "^7.12.1"
+
+"@babel/plugin-transform-block-scoped-functions@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9"
+ integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-block-scoping@^7.12.11":
+ version "7.12.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz#d93a567a152c22aea3b1929bb118d1d0a175cdca"
+ integrity sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-classes@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6"
+ integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==
+ dependencies:
+ "@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"
+
+"@babel/plugin-transform-computed-properties@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852"
+ integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-destructuring@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847"
+ integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975"
+ integrity sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.12.1"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-duplicate-keys@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228"
+ integrity sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-exponentiation-operator@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0"
+ integrity sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-for-of@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa"
+ integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-function-name@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667"
+ integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==
+ dependencies:
+ "@babel/helper-function-name" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-literals@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57"
+ integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-member-expression-literals@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad"
+ integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-modules-amd@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9"
+ integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.12.1"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-commonjs@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648"
+ integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.12.1"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-simple-access" "^7.12.1"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-systemjs@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086"
+ integrity sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.10.4"
+ "@babel/helper-module-transforms" "^7.12.1"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-validator-identifier" "^7.10.4"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-umd@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902"
+ integrity sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.12.1"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753"
+ integrity sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.12.1"
+
+"@babel/plugin-transform-new-target@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0"
+ integrity sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-object-super@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e"
+ integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-replace-supers" "^7.12.1"
+
+"@babel/plugin-transform-parameters@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d"
+ integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-property-literals@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd"
+ integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-regenerator@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753"
+ integrity sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==
+ dependencies:
+ regenerator-transform "^0.14.2"
+
+"@babel/plugin-transform-reserved-words@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8"
+ integrity sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-shorthand-properties@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3"
+ integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-spread@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e"
+ integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
+
+"@babel/plugin-transform-sticky-regex@^7.12.7":
+ version "7.12.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz#560224613ab23987453948ed21d0b0b193fa7fad"
+ integrity sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-template-literals@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843"
+ integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-typeof-symbol@^7.12.10":
+ version "7.12.10"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz#de01c4c8f96580bd00f183072b0d0ecdcf0dec4b"
+ integrity sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-unicode-escapes@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709"
+ integrity sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-unicode-regex@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb"
+ integrity sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.12.1"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/preset-env@^7.1.0":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.11.tgz#55d5f7981487365c93dbbc84507b1c7215e857f9"
+ integrity sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==
+ dependencies:
+ "@babel/compat-data" "^7.12.7"
+ "@babel/helper-compilation-targets" "^7.12.5"
+ "@babel/helper-module-imports" "^7.12.5"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-validator-option" "^7.12.11"
+ "@babel/plugin-proposal-async-generator-functions" "^7.12.1"
+ "@babel/plugin-proposal-class-properties" "^7.12.1"
+ "@babel/plugin-proposal-dynamic-import" "^7.12.1"
+ "@babel/plugin-proposal-export-namespace-from" "^7.12.1"
+ "@babel/plugin-proposal-json-strings" "^7.12.1"
+ "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1"
+ "@babel/plugin-proposal-numeric-separator" "^7.12.7"
+ "@babel/plugin-proposal-object-rest-spread" "^7.12.1"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.12.1"
+ "@babel/plugin-proposal-optional-chaining" "^7.12.7"
+ "@babel/plugin-proposal-private-methods" "^7.12.1"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.12.1"
+ "@babel/plugin-syntax-async-generators" "^7.8.0"
+ "@babel/plugin-syntax-class-properties" "^7.12.1"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-json-strings" "^7.8.0"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.0"
+ "@babel/plugin-syntax-top-level-await" "^7.12.1"
+ "@babel/plugin-transform-arrow-functions" "^7.12.1"
+ "@babel/plugin-transform-async-to-generator" "^7.12.1"
+ "@babel/plugin-transform-block-scoped-functions" "^7.12.1"
+ "@babel/plugin-transform-block-scoping" "^7.12.11"
+ "@babel/plugin-transform-classes" "^7.12.1"
+ "@babel/plugin-transform-computed-properties" "^7.12.1"
+ "@babel/plugin-transform-destructuring" "^7.12.1"
+ "@babel/plugin-transform-dotall-regex" "^7.12.1"
+ "@babel/plugin-transform-duplicate-keys" "^7.12.1"
+ "@babel/plugin-transform-exponentiation-operator" "^7.12.1"
+ "@babel/plugin-transform-for-of" "^7.12.1"
+ "@babel/plugin-transform-function-name" "^7.12.1"
+ "@babel/plugin-transform-literals" "^7.12.1"
+ "@babel/plugin-transform-member-expression-literals" "^7.12.1"
+ "@babel/plugin-transform-modules-amd" "^7.12.1"
+ "@babel/plugin-transform-modules-commonjs" "^7.12.1"
+ "@babel/plugin-transform-modules-systemjs" "^7.12.1"
+ "@babel/plugin-transform-modules-umd" "^7.12.1"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1"
+ "@babel/plugin-transform-new-target" "^7.12.1"
+ "@babel/plugin-transform-object-super" "^7.12.1"
+ "@babel/plugin-transform-parameters" "^7.12.1"
+ "@babel/plugin-transform-property-literals" "^7.12.1"
+ "@babel/plugin-transform-regenerator" "^7.12.1"
+ "@babel/plugin-transform-reserved-words" "^7.12.1"
+ "@babel/plugin-transform-shorthand-properties" "^7.12.1"
+ "@babel/plugin-transform-spread" "^7.12.1"
+ "@babel/plugin-transform-sticky-regex" "^7.12.7"
+ "@babel/plugin-transform-template-literals" "^7.12.1"
+ "@babel/plugin-transform-typeof-symbol" "^7.12.10"
+ "@babel/plugin-transform-unicode-escapes" "^7.12.1"
+ "@babel/plugin-transform-unicode-regex" "^7.12.1"
+ "@babel/preset-modules" "^0.1.3"
+ "@babel/types" "^7.12.11"
+ core-js-compat "^3.8.0"
+ semver "^5.5.0"
+
+"@babel/preset-modules@^0.1.3":
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
+ integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
+ "@babel/plugin-transform-dotall-regex" "^7.4.4"
+ "@babel/types" "^7.4.4"
+ esutils "^2.0.2"
+
+"@babel/runtime@^7.8.4":
+ version "7.12.5"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e"
+ integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.10.4", "@babel/template@^7.12.7":
+ version "7.12.7"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc"
+ integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/parser" "^7.12.7"
+ "@babel/types" "^7.12.7"
+
+"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5", "@babel/traverse@^7.7.0":
+ version "7.12.12"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376"
+ integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==
+ dependencies:
+ "@babel/code-frame" "^7.12.11"
+ "@babel/generator" "^7.12.11"
+ "@babel/helper-function-name" "^7.12.11"
+ "@babel/helper-split-export-declaration" "^7.12.11"
+ "@babel/parser" "^7.12.11"
+ "@babel/types" "^7.12.12"
+ debug "^4.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.19"
+
+"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
+ version "7.12.12"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299"
+ integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.12.11"
+ lodash "^4.17.19"
+ to-fast-properties "^2.0.0"
+
+"@eslint/eslintrc@^0.2.2":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76"
+ integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.1.1"
+ espree "^7.3.0"
+ globals "^12.1.0"
+ ignore "^4.0.6"
+ import-fresh "^3.2.1"
+ js-yaml "^3.13.1"
+ lodash "^4.17.19"
+ minimatch "^3.0.4"
+ strip-json-comments "^3.1.1"
+
+"@rollup/plugin-babel@^5.2.1":
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.2.2.tgz#e5623a01dd8e37e004ba87f2de218c611727d9b2"
+ integrity sha512-MjmH7GvFT4TW8xFdIeFS3wqIX646y5tACdxkTO+khbHvS3ZcVJL6vkAHLw2wqPmkhwCfWHoNsp15VYNwW6JEJA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.10.4"
+ "@rollup/pluginutils" "^3.1.0"
+
+"@rollup/pluginutils@^3.1.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b"
+ integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==
+ dependencies:
+ "@types/estree" "0.0.39"
+ estree-walker "^1.0.1"
+ picomatch "^2.2.2"
+
+"@types/estree@0.0.39":
+ version "0.0.39"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
+
+acorn-jsx@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
+ integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
+
+acorn@^7.4.0:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+ajv@^6.10.0, ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ajv@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.3.tgz#13ae747eff125cafb230ac504b2406cf371eece2"
+ integrity sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+ uri-js "^4.2.2"
+
+ansi-colors@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+astral-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+ integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+babel-eslint@^10.0.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
+ integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/parser" "^7.7.0"
+ "@babel/traverse" "^7.7.0"
+ "@babel/types" "^7.7.0"
+ eslint-visitor-keys "^1.0.0"
+ resolve "^1.12.0"
+
+babel-plugin-dynamic-import-node@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
+ integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
+ dependencies:
+ object.assign "^4.1.0"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+ integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+browserslist@^4.14.5, browserslist@^4.16.0:
+ version "4.16.6"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
+ integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==
+ dependencies:
+ caniuse-lite "^1.0.30001219"
+ colorette "^1.2.2"
+ electron-to-chromium "^1.3.723"
+ escalade "^3.1.1"
+ node-releases "^1.1.71"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+call-bind@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+caniuse-lite@^1.0.30001219:
+ version "1.0.30001230"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71"
+ integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==
+
+chalk@^2.0.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
+ integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+colorette@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
+ integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.4.7:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+convert-source-map@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+core-js-compat@^3.8.0:
+ version "3.8.2"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.2.tgz#3717f51f6c3d2ebba8cbf27619b57160029d1d4c"
+ integrity sha512-LO8uL9lOIyRRrQmZxHZFl1RV+ZbcsAkFWTktn5SmH40WgLtSNYN4m4W2v9ONT147PxBY/XrRhrWq8TlvObyUjQ==
+ dependencies:
+ browserslist "^4.16.0"
+ semver "7.0.0"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cross-spawn@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cross-spawn@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+deep-is@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+ integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
+define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+electron-to-chromium@^1.3.723:
+ version "1.3.739"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz#f07756aa92cabd5a6eec6f491525a64fe62f98b9"
+ integrity sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+enquirer@^2.3.5:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+ integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+ dependencies:
+ ansi-colors "^4.1.1"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+eslint-config-dev@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-dev/-/eslint-config-dev-2.0.0.tgz#82e5ca313449af7b12bbfd4e9733eb286f0f43b7"
+ integrity sha1-guXKMTRJr3sSu/1OlzPrKG8PQ7c=
+
+eslint-scope@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
+eslint-utils@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
+ integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+ dependencies:
+ eslint-visitor-keys "^1.1.0"
+
+eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
+ integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+
+eslint-visitor-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
+ integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
+
+eslint@^7.0.0:
+ version "7.17.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.17.0.tgz#4ccda5bf12572ad3bf760e6f195886f50569adb0"
+ integrity sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@eslint/eslintrc" "^0.2.2"
+ 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.1"
+ eslint-utils "^2.1.0"
+ eslint-visitor-keys "^2.0.0"
+ espree "^7.3.1"
+ esquery "^1.2.0"
+ esutils "^2.0.2"
+ file-entry-cache "^6.0.0"
+ functional-red-black-tree "^1.0.1"
+ glob-parent "^5.0.0"
+ globals "^12.1.0"
+ ignore "^4.0.6"
+ import-fresh "^3.0.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ js-yaml "^3.13.1"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.4.1"
+ lodash "^4.17.19"
+ minimatch "^3.0.4"
+ natural-compare "^1.4.0"
+ optionator "^0.9.1"
+ progress "^2.0.0"
+ regexpp "^3.1.0"
+ semver "^7.2.1"
+ strip-ansi "^6.0.0"
+ strip-json-comments "^3.1.0"
+ table "^6.0.4"
+ text-table "^0.2.0"
+ v8-compile-cache "^2.0.3"
+
+espree@^7.3.0, espree@^7.3.1:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
+ integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==
+ dependencies:
+ acorn "^7.4.0"
+ acorn-jsx "^5.3.1"
+ eslint-visitor-keys "^1.3.0"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
+ integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880"
+ integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==
+
+estree-walker@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700"
+ integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+file-entry-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a"
+ integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==
+ dependencies:
+ flat-cache "^3.0.4"
+
+flat-cache@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+ integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+ dependencies:
+ flatted "^3.1.0"
+ rimraf "^3.0.2"
+
+flatted@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067"
+ integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.1.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+ integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+gensync@^1.0.0-beta.1:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-intrinsic@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49"
+ integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+glob-parent@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
+ integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@^7.1.3:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^12.1.0:
+ version "12.4.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
+ integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
+ dependencies:
+ type-fest "^0.8.1"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbols@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
+ integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+ignore@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
+ integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+
+import-fresh@^3.0.0, import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+indexes-of@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+ integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.3, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+is-core-module@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a"
+ integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==
+ dependencies:
+ has "^1.0.3"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^4.0.0, is-glob@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+
+json5@^2.1.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
+ integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
+ dependencies:
+ minimist "^1.2.5"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+lodash@^4.17.19, lodash@^4.17.20:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+lru-cache@^4.0.1:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+ integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+nanoid@^3.1.22:
+ version "3.1.23"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81"
+ integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
+node-releases@^1.1.71:
+ version "1.1.72"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe"
+ integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==
+
+object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+optionator@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
+ integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+ dependencies:
+ 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"
+
+os-shim@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917"
+ integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+ integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+
+picomatch@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
+ integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
+
+postcss-selector-parser@^6.0.4:
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3"
+ integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==
+ dependencies:
+ cssesc "^3.0.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+ util-deprecate "^1.0.2"
+
+postcss-tape@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-tape/-/postcss-tape-6.0.0.tgz#7d351d507bebdff95ecbda0802dc82e394eeab83"
+ integrity sha512-gfwBh9NPzeSSTWwNnkhtPAtTGSr70/3zLyzIdjB54LwaKBe//QjlmX7PBsUN3EVRNIBhghAESQ+ugkUjLiCQVw==
+
+postcss@^8.1.2:
+ version "8.2.10"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.10.tgz#ca7a042aa8aff494b334d0ff3e9e77079f6f702b"
+ integrity sha512-b/h7CPV7QEdrqIxtAf2j31U5ef05uBDuvoXv6L51Q4rcS1jdlXAVKJv+atCFdUXYl9dyTHGyoMzIepwowRJjFw==
+ dependencies:
+ colorette "^1.2.2"
+ nanoid "^3.1.22"
+ source-map "^0.6.1"
+
+pre-commit@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.2.2.tgz#dbcee0ee9de7235e57f79c56d7ce94641a69eec6"
+ integrity sha1-287g7p3nI15X95xW186UZBpp7sY=
+ dependencies:
+ cross-spawn "^5.0.1"
+ spawn-sync "^1.0.15"
+ which "1.2.x"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+progress@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+readable-stream@^2.2.2:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+regenerate-unicode-properties@^8.2.0:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
+ integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==
+ dependencies:
+ regenerate "^1.4.0"
+
+regenerate@^1.4.0:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.13.4:
+ version "0.13.7"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
+ integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
+
+regenerator-transform@^0.14.2:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
+ integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+
+regexpp@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
+ integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
+
+regexpu-core@^4.7.1:
+ version "4.7.1"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6"
+ integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==
+ dependencies:
+ 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"
+
+regjsgen@^0.5.1:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
+ integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
+
+regjsparser@^0.6.4:
+ version "0.6.6"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.6.tgz#6d8c939d1a654f78859b08ddcc4aa777f3fa800a"
+ integrity sha512-jjyuCp+IEMIm3N1H1LLTJW1EISEJV9+5oHdEyrt43Pg9cDSb6rrLZei2cVWpl0xTjmmlpec/lEQGYgM7xfpGCQ==
+ dependencies:
+ jsesc "~0.5.0"
+
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve@^1.12.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c"
+ integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==
+ dependencies:
+ is-core-module "^2.1.0"
+ path-parse "^1.0.6"
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+rollup@^2.0.0:
+ version "2.36.1"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.36.1.tgz#2174f0c25c7b400d57b05628d0e732c7ae8d2178"
+ integrity sha512-eAfqho8dyzuVvrGqpR0ITgEdq0zG2QJeWYh+HeuTbpcaXk8vNFc48B7bJa1xYosTCKx0CuW+447oQOW8HgBIZQ==
+ optionalDependencies:
+ fsevents "~2.1.2"
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+semver@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+ integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+semver@^5.4.1, semver@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^7.2.1:
+ version "7.3.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97"
+ integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==
+ dependencies:
+ lru-cache "^6.0.0"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+slice-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+ integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+source-map@^0.5.0:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spawn-sync@^1.0.15:
+ version "1.0.15"
+ resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476"
+ integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY=
+ dependencies:
+ concat-stream "^1.4.7"
+ os-shim "^0.1.2"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+string-width@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
+ integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+table@^6.0.4:
+ version "6.0.7"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34"
+ integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==
+ dependencies:
+ ajv "^7.0.2"
+ lodash "^4.17.20"
+ slice-ansi "^4.0.0"
+ string-width "^4.2.0"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-fest@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+ integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+unicode-canonical-property-names-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
+ integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
+
+unicode-match-property-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
+ integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^1.0.4"
+ unicode-property-aliases-ecmascript "^1.0.4"
+
+unicode-match-property-value-ecmascript@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531"
+ integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==
+
+unicode-property-aliases-ecmascript@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4"
+ integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==
+
+uniq@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+ integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+v8-compile-cache@^2.0.3:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132"
+ integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==
+
+which@1.2.x:
+ version "1.2.14"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
+ integrity sha1-mofEN48D6CfOyvGs31bHNsAcFOU=
+ dependencies:
+ isexe "^2.0.0"
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+ integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==