From e0856dab1e4a58d9c0efb4c89011cac16a79ad56 Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Thu, 24 Sep 2020 16:58:49 +0200 Subject: [PATCH] feat(eslint6): Add new plugin for eslint6 --- packages/spire-plugin-eslint6/README.md | 42 ++++++ .../__tests__/index.spec.js | 112 +++++++++++++++ packages/spire-plugin-eslint6/config.js | 19 +++ packages/spire-plugin-eslint6/index.js | 124 ++++++++++++++++ packages/spire-plugin-eslint6/package.json | 24 ++++ yarn.lock | 132 ++++++++++++++---- 6 files changed, 427 insertions(+), 26 deletions(-) create mode 100644 packages/spire-plugin-eslint6/README.md create mode 100644 packages/spire-plugin-eslint6/__tests__/index.spec.js create mode 100644 packages/spire-plugin-eslint6/config.js create mode 100644 packages/spire-plugin-eslint6/index.js create mode 100644 packages/spire-plugin-eslint6/package.json diff --git a/packages/spire-plugin-eslint6/README.md b/packages/spire-plugin-eslint6/README.md new file mode 100644 index 00000000..c21340cc --- /dev/null +++ b/packages/spire-plugin-eslint6/README.md @@ -0,0 +1,42 @@ +# spire-plugin-eslint6 + +[ESLint](https://eslint.org/) version 6 plugin for +[Spire](https://github.com/researchgate/spire). + + + + +- [Hooks](#hooks) +- [Options](#options) + + + +## Hooks + +- `setup` Adds `lint` and prepares eslint arguments. +- `precommit` Adds eslint linter. +- `run` Runs eslint. + +## Options + +- Plugin `['spire-plugin-eslint', options]` + + - `command` \ Command name to run eslint on. Defaults to `lint`. + - `eslintConfig` \ Default [eslint] configuration. Defaults to + [`./config.js`](./config.js). + - `autosetEslintConfig` \ Decides if the plugin should automatically + create an `.eslintrc.js ` file. It will only create the file if there isn't + already a config present. Defaults to `true`. + - `allowCustomConfig` \ Whether to allow user-provided config. If + this option is `false` and there's custom eslint config found it will throw + an error. Defaults to `true`. + - `eslintIgnore` \ Path to default `.eslintignore`. Defaults to + `.gitignore`. + - `allowCustomIgnore` \ Whether to allow user-provided + `.eslintignore`. If this option is `false` and there's custom ignore file + found it will throw an error. Defaults to `true`. + - `fileExtensions` \ Extension of files eslint should scan. + Defaults to `['.js', '.jsx', '.mjs', '.ts', '.tsx']`. + +- CLI `npx spire lint [args]` + - Passes all arguments as-is to eslint. diff --git a/packages/spire-plugin-eslint6/__tests__/index.spec.js b/packages/spire-plugin-eslint6/__tests__/index.spec.js new file mode 100644 index 00000000..485b64d1 --- /dev/null +++ b/packages/spire-plugin-eslint6/__tests__/index.spec.js @@ -0,0 +1,112 @@ +const { createFixture } = require('spire-test-utils'); +const { stat, readFile } = require('fs-extra'); +const { join } = require('path'); + +const configWithEslintPlugin = (options = {}) => + JSON.stringify({ + name: 'spire-plugin-eslint6-test', + spire: { + plugins: [[require.resolve('spire-plugin-eslint6'), options]], + }, + }); + +describe('spire-plugin-eslint6', () => { + test('adds lint command', async () => { + const fixture = await createFixture({ + 'package.json': configWithEslintPlugin(), + }); + await expect(fixture.run('spire', ['--help'])).resolves.toMatchObject({ + stdout: /Commands:\s+spire lint/, + }); + await fixture.clean(); + }); + + test('adds eslint linter', async () => { + const fixture = await createFixture({ + 'package.json': configWithEslintPlugin(), + }); + const { stdout } = await fixture.run('spire', [ + 'hook', + 'precommit', + '--debug', + ]); + expect(stdout).toMatch(/Using linters:/); + expect(stdout).toMatch(/\*\.\(js\|jsx\|mjs\|ts\|tsx\)/); + await fixture.clean(); + }); + + test('passes custom arguments to eslint', async () => { + const fixture = await createFixture({ + 'package.json': configWithEslintPlugin(), + }); + await expect( + fixture.run('spire', ['lint', '--version']) + ).resolves.toMatchObject({ + stdout: /v\d\.\d\.\d/, + }); + await fixture.clean(); + }); + + test('creates default eslint config for editors', async () => { + const fixture = await createFixture({ + 'package.json': configWithEslintPlugin(), + }); + await fixture.run('spire', ['hook', 'postinstall']); + const eslintConfig = join(fixture.cwd, '.eslintrc.js'); + expect(await stat(eslintConfig)).toBeTruthy(); + expect(await readFile(eslintConfig, 'UTF-8')).toMatch( + /spire-plugin-eslint6\/config/ + ); + await fixture.clean(); + }); + + test('prints deprecation warning for glob option', async () => { + const fixture = await createFixture({ + 'package.json': configWithEslintPlugin({ glob: 'abc' }), + }); + await fixture.run('spire', ['hook', 'precommit']); + + await expect( + fixture.run('spire', ['hook', 'precommit']) + ).resolves.toMatchObject({ + stdout: /The glob option is deprecated\. Use the option `fileExtensions` instead\./, + }); + await fixture.clean(); + }); + + test('creates custom eslint config for editors', async () => { + const fixture = await createFixture({ + 'node_modules/eslint6-config-cool-test/package.json': JSON.stringify({ + name: 'eslint6-config-cool-test', + version: '1.0.0', + main: 'index.js', + }), + 'node_modules/eslint6-config-cool-test/index.js': 'module.exports = {};', + 'package.json': configWithEslintPlugin({ + config: 'eslint6-config-cool-test', + }), + }); + await fixture.run('spire', ['hook', 'postinstall']); + const eslintConfig = join(fixture.cwd, '.eslintrc.js'); + expect(await stat(eslintConfig)).toBeTruthy(); + expect(await readFile(eslintConfig, 'UTF-8')).toMatch( + /eslint6-config-cool-test/ + ); + await fixture.clean(); + }); + + test('warns about custom eslint config not extending default config', async () => { + const fixture = await createFixture({ + 'package.json': configWithEslintPlugin(), + '.eslintrc.json': '', + }); + await expect( + fixture.run('spire', ['hook', 'postinstall']) + ).resolves.toMatchObject({ + stdout: expect.stringMatching( + 'Attempted to set ESLint config but it already exists. Please ensure existing config re-exports' + ), + }); + await fixture.clean(); + }); +}); diff --git a/packages/spire-plugin-eslint6/config.js b/packages/spire-plugin-eslint6/config.js new file mode 100644 index 00000000..2a047f8c --- /dev/null +++ b/packages/spire-plugin-eslint6/config.js @@ -0,0 +1,19 @@ +module.exports = { + parserOptions: { + ecmaVersion: '2020', + sourceType: 'script', + }, + extends: ['eslint:recommended', 'plugin:prettier/recommended'], + env: { + es6: true, + node: true, + }, + overrides: [ + { + files: ['**.spec.js', '**.test.js', '**/__tests__/**.js'], + env: { + jest: true, + }, + }, + ], +}; diff --git a/packages/spire-plugin-eslint6/index.js b/packages/spire-plugin-eslint6/index.js new file mode 100644 index 00000000..2aa7f719 --- /dev/null +++ b/packages/spire-plugin-eslint6/index.js @@ -0,0 +1,124 @@ +const execa = require('execa'); +const SpireError = require('spire/error'); + +const SUPPORTED_CONFIG_FILES = [ + '.eslintrc', + '.eslintrc.js', + '.eslintrc.json', + '.eslintrc.yaml', + '.eslintrc.yml', +]; + +function eslint( + { setState, getState, hasFile, readFile, writeFile, hasPackageProp }, + { + command = 'lint', + config: defaultEslintConfig = 'spire-plugin-eslint6/config', + autosetEslintConfig = true, + allowCustomConfig = true, + eslintIgnore: defaultEslintIgnore = '.gitignore', + allowCustomIgnore = true, + fileExtensions = ['.js', '.jsx', '.mjs', '.ts', '.tsx'], + } +) { + async function hasCustomEslintConfig() { + for (const file of SUPPORTED_CONFIG_FILES) { + if (await hasFile(file)) { + return file; + } + } + + return hasPackageProp('eslintConfig'); + } + return { + name: 'spire-plugin-eslint6', + command, + description: 'lint files with ESLint', + async postinstall({ logger }) { + if (autosetEslintConfig) { + const hasCustomConfig = await hasCustomEslintConfig(); + if (hasCustomConfig && typeof hasCustomConfig === 'string') { + const currentContent = await readFile(hasCustomConfig, 'UTF-8'); + if (!currentContent.includes(defaultEslintConfig)) { + return logger.warn( + 'Attempted to set ESLint config but it already exists. ' + + 'Please ensure existing config re-exports `%s`.', + defaultEslintConfig + ); + } + } + if (!hasCustomConfig) { + await writeFile( + '.eslintrc.js', + "'use strict';\n" + + '// This file was created by spire-plugin-eslint for editor support\n' + + `module.exports = require('${defaultEslintConfig}');\n` + ); + } + } + }, + async setup({ argv, resolve }) { + const hasCustomConfig = + argv.includes('--config') || (await hasCustomEslintConfig()); + const eslintConfig = + allowCustomConfig && hasCustomConfig + ? [] + : ['--config', resolve(defaultEslintConfig)]; + const hasCustomIgnore = + argv.includes('--ignore-path') || + (await hasFile('.eslintignore')) || + (await hasPackageProp('eslintIgnore')); + const eslintIgnore = + allowCustomIgnore && hasCustomIgnore + ? [] + : (await hasFile(defaultEslintIgnore)) + ? ['--ignore-path', defaultEslintIgnore] + : []; + const eslintExtensions = ['--ext', fileExtensions.join(',')]; + setState({ + eslintArgs: [...eslintConfig, ...eslintIgnore, ...eslintExtensions], + }); + // Inform user about disallowed overrides + if (hasCustomConfig && !allowCustomConfig) { + throw new SpireError( + `Custom eslint config is not allowed, using ${defaultEslintConfig} instead` + ); + } + if (hasCustomIgnore && !allowCustomIgnore) { + throw new SpireError( + `Custom eslint ignore is not allowed, using ${defaultEslintIgnore} instead` + ); + } + }, + async precommit() { + setState((prev) => ({ + linters: [ + ...prev.linters, + { + [`*.(${fileExtensions.map((ext) => ext.substr(1)).join('|')})`]: [ + 'eslint', + ...prev.eslintArgs, + '--fix', + ], + }, + ], + })); + }, + async run({ options, logger, cwd }) { + const { eslintArgs } = getState(); + const [, ...userProvidedArgs] = options._; + const finalEslintArgs = [ + ...eslintArgs, + ...(userProvidedArgs.length ? userProvidedArgs : ['.']), + ]; + logger.debug('Using eslint arguments: %s', finalEslintArgs.join(' ')); + await execa('eslint', finalEslintArgs, { + cwd, + stdio: 'inherit', + preferLocal: true, + }); + }, + }; +} + +module.exports = eslint; diff --git a/packages/spire-plugin-eslint6/package.json b/packages/spire-plugin-eslint6/package.json new file mode 100644 index 00000000..4d44c05d --- /dev/null +++ b/packages/spire-plugin-eslint6/package.json @@ -0,0 +1,24 @@ +{ + "name": "spire-plugin-eslint6", + "version": "3.1.0", + "description": "ESLint v6 plugin for Spire", + "main": "index.js", + "repository": "researchgate/spire", + "author": "Daniel Tschinder ", + "license": "MIT", + "engines": { + "node": ">=10.18.0" + }, + "dependencies": { + "eslint": "^6.0.0", + "eslint-config-prettier": "^6.0.0", + "eslint-plugin-prettier": "^3.1.0", + "execa": "^4.0.0" + }, + "devDependencies": { + "spire-test-utils": "^3.0.0" + }, + "peerDependencies": { + "spire": "^3.0.0" + } +} diff --git a/yarn.lock b/yarn.lock index f3fc5a00..e6474a74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2474,7 +2474,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.1, chalk@^2.3.2, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.3.2, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2610,6 +2610,11 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -2980,7 +2985,7 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.0: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -3561,7 +3566,7 @@ eslint-plugin-prettier@^3.1.0: dependencies: prettier-linter-helpers "^1.0.0" -eslint-scope@^5.1.0: +eslint-scope@^5.0.0, eslint-scope@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -3569,6 +3574,13 @@ eslint-scope@^5.1.0: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" @@ -3581,6 +3593,49 @@ eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^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@^6.0.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + 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" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + eslint@^7.5.0: version "7.9.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.9.0.tgz#522aeccc5c3a19017cf0cb46ebfd660a79acf337" @@ -3624,6 +3679,15 @@ eslint@^7.5.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +espree@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + espree@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" @@ -3638,7 +3702,7 @@ esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.2.0: +esquery@^1.0.1, 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== @@ -4768,6 +4832,25 @@ inquirer@^6.2.0: strip-ansi "^5.1.0" through "^2.3.6" +inquirer@^7.0.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + into-stream@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-5.1.1.tgz#f9a20a348a11f3c13face22763f2d02e127f4db8" @@ -5808,6 +5891,14 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -5816,14 +5907,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - libcipm@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.8.tgz#dcea4919e10dfbce420327e63901613b9141bc89" @@ -6656,7 +6739,7 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -mute-stream@~0.0.4: +mute-stream@0.0.8, mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== @@ -6960,7 +7043,6 @@ npm@^6.13.0: cmd-shim "^3.0.3" columnify "~1.5.4" config-chain "^1.1.12" - debuglog "*" detect-indent "~5.0.0" detect-newline "^2.1.0" dezalgo "~1.0.3" @@ -6975,7 +7057,6 @@ npm@^6.13.0: has-unicode "~2.0.1" hosted-git-info "^2.8.8" iferr "^1.0.2" - imurmurhash "*" infer-owner "^1.0.4" inflight "~1.0.6" inherits "^2.0.4" @@ -6994,14 +7075,8 @@ npm@^6.13.0: libnpx "^10.2.4" lock-verify "^2.1.0" lockfile "^1.0.4" - lodash._baseindexof "*" lodash._baseuniq "~4.6.0" - lodash._bindcallback "*" - lodash._cacheindexof "*" - lodash._createcache "*" - lodash._getnative "*" lodash.clonedeep "~4.5.0" - lodash.restparam "*" lodash.union "~4.6.0" lodash.uniq "~4.5.0" lodash.without "~4.4.0" @@ -7178,7 +7253,7 @@ opener@^1.5.1: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -optionator@^0.8.1: +optionator@^0.8.1, optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -8053,6 +8128,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" @@ -8303,7 +8383,7 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.2.0: +run-async@^2.2.0, run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -8320,7 +8400,7 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.4.0, rxjs@^6.6.2: +rxjs@^6.4.0, rxjs@^6.6.0, rxjs@^6.6.2: version "6.6.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== @@ -8434,7 +8514,7 @@ semver-regex@^2.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -9006,7 +9086,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.0.1, 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==