From 3381bdfa27ed2ad5d69b149e6e41e37aabcfbde9 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Wed, 13 Sep 2023 15:30:26 -0400 Subject: [PATCH 1/5] WIP: ESLint 8 --- README.md | 22 +- lib/index.js | 39 +- lib/rules/order-properties.js | 9 +- lib/rules/sort-collections.js | 17 +- lib/rules/valid-package-def.js | 10 +- package-lock.json | 1155 +++++++++++++++------------ package.json | 9 +- tests/lib/index.js | 157 ---- tests/lib/rules/order-properties.js | 291 +++---- 9 files changed, 825 insertions(+), 884 deletions(-) delete mode 100644 tests/lib/index.js diff --git a/README.md b/README.md index 78e90df3..e29b66bd 100644 --- a/README.md +++ b/README.md @@ -4,27 +4,27 @@ Rules for valid, consistent, and readable package.json files ## Installation -You'll first need to install [ESLint](http://eslint.org): +You'll first need to install [ESLint](http://eslint.org) and `eslint-plugin-package-json`: -``` -$ npm i eslint --save-dev -``` - -Next, install `eslint-plugin-package-json`: - -``` -$ npm install eslint-plugin-package-json --save-dev +```shell +$ npm install eslint eslint-plugin-package-json --save-dev ``` **Note:** If you installed ESLint globally (using the `-g` flag) then you must also install `eslint-plugin-package-json` globally. ## Usage -Add `package-json` to the plugins section of your `.eslintrc` configuration file. You can omit the `eslint-plugin-` prefix: +Add an override to your ESLint configuration file that specifies this plugin and its processor for your `package.json` file: ```json { - "plugins": ["package-json"] + "overrides": [ + { + "files": ["package.json"], + "plugins": ["package-json"], + "processor": ["package-json/processor"] + } + ] } ``` diff --git a/lib/index.js b/lib/index.js index 0770fa7a..844ec52c 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,33 +1,22 @@ 'use strict'; -//------------------------------------------------------------------------------ -// Requirements -//------------------------------------------------------------------------------ +const orderProperties = require('./rules/order-properties'); +const sortCollections = require('./rules/sort-collections'); +const validPackageDef = require('./rules/valid-package-def'); -var requireIndex = require('requireindex'); - -//------------------------------------------------------------------------------ -// Plugin Definition -//------------------------------------------------------------------------------ - -// import all rules in lib/rules -module.exports.rules = requireIndex(__dirname + '/rules'); - -// import processors const PackageJsonProcessor = require('./processors/PackageJsonProcessor'); -module.exports.processors = { - // adapted from https://github.com/godaddy/eslint-plugin-i18n-json - // thank you! - '.json': PackageJsonProcessor - // add your processors here -}; -module.exports.configs = { - recommended: { - rules: { - 'package-json/sort-collections': 'error', - 'package-json/order-properties': 'warn', - 'package-json/valid-package-def': 'error' +module.exports = { + configs: { + recommended: { + rules: { + 'order-properties': orderProperties, + 'sort-collections': sortCollections, + 'valid-package-def': validPackageDef + } } + }, + processors: { + processor: PackageJsonProcessor } }; diff --git a/lib/rules/order-properties.js b/lib/rules/order-properties.js index 544dd23f..bf3ec9be 100644 --- a/lib/rules/order-properties.js +++ b/lib/rules/order-properties.js @@ -40,7 +40,7 @@ const standardOrder = [ 'cpu' ]; -const toIndexMap = (arr) => +const toIndexMap = arr => arr.reduce((indexMap, value, index) => { indexMap[value] = index; return indexMap; @@ -67,7 +67,7 @@ module.exports = { create(context) { return { - 'Program:exit': (node) => { + 'Program:exit': node => { if (!isPackageJson(context.getFilename())) { return; } @@ -121,7 +121,10 @@ module.exports = { message: 'Package top-level properties are not ordered in the NPM standard way:\n\n{{ diff }}', data: { - diff: diff.split('\n').slice(3).join('\n') + diff: diff + .split('\n') + .slice(3) + .join('\n') }, fix(fixer) { return fixer.replaceText(node, orderedSource); diff --git a/lib/rules/sort-collections.js b/lib/rules/sort-collections.js index cea67e32..875fe059 100644 --- a/lib/rules/sort-collections.js +++ b/lib/rules/sort-collections.js @@ -30,10 +30,10 @@ module.exports = { ] }, - create: function (context) { + create: function(context) { const toSort = context.options[0] || defaultCollections; return { - 'Property:exit': (node) => { + 'Property:exit': node => { if (!isPackageJson(context.getFilename())) { return; } @@ -63,12 +63,13 @@ module.exports = { collection, JSON.stringify( desiredOrder.reduce((out, property) => { - out[property.key.value] = - JSON.parse( - context - .getSourceCode() - .getText(property.value) - ); + out[ + property.key.value + ] = JSON.parse( + context + .getSourceCode() + .getText(property.value) + ); return out; }, {}), null, diff --git a/lib/rules/valid-package-def.js b/lib/rules/valid-package-def.js index f6ae5312..25c6ad84 100644 --- a/lib/rules/valid-package-def.js +++ b/lib/rules/valid-package-def.js @@ -18,8 +18,8 @@ const unusedErrorPatterns = [ /^author field should have name/i ]; -const isUsableError = (errorText) => - unusedErrorPatterns.every((pattern) => !pattern.test(errorText)); +const isUsableError = errorText => + unusedErrorPatterns.every(pattern => !pattern.test(errorText)); module.exports = { meta: { @@ -32,9 +32,9 @@ module.exports = { fixable: null // or "code" or "whitespace" }, - create: function (context) { + create: function(context) { return { - 'Program:exit': (node) => { + 'Program:exit': node => { if (!isPackageJson(context.getFilename())) { return; } @@ -47,7 +47,7 @@ module.exports = { if (critical || errors) { const allErrors = [...(critical || []), ...errors]; allErrors.filter(isUsableError).forEach( - (message) => + message => message && context.report({ node: packageRoot, diff --git a/package-lock.json b/package-lock.json index e9883927..740735ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,12 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@babel/code-frame": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", @@ -159,25 +165,194 @@ "to-fast-properties": "^2.0.0" } }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, + "@eslint/js": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, "acorn-jsx": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz", - "integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, "ajv": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", - "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -189,12 +364,6 @@ "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, - "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -222,7 +391,7 @@ "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true }, "argparse": { @@ -234,27 +403,6 @@ "sprintf-js": "~1.0.2" } }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -289,19 +437,10 @@ "write-file-atomic": "^2.4.2" } }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { @@ -321,33 +460,6 @@ "supports-color": "^5.3.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", @@ -390,13 +502,13 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "convert-source-map": { @@ -466,9 +578,9 @@ "dev": true }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "default-require-extensions": { @@ -489,21 +601,6 @@ "object-keys": "^1.0.12" } }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -548,9 +645,9 @@ } }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" @@ -618,85 +715,279 @@ "dev": true }, "eslint": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.8.0.tgz", - "integrity": "sha512-Zok6Bru3y2JprqTNm14mgQ15YQu/SMDkWdnmHfFg770DIUlmMFd/gqqzCHekxzjHZJxXv3tmTpH0C1icaYJsRQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.5.3", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", - "esquery": "^1.0.1", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.1.0", - "is-resolvable": "^1.1.0", - "js-yaml": "^3.12.0", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.0.2", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", - "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^6.0.2", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" } }, "esprima": { @@ -706,27 +997,27 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "esutils": { @@ -750,52 +1041,40 @@ "strip-eof": "^1.0.0" } }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "reusify": "^1.0.4" } }, "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "^3.0.4" } }, "find-cache-dir": { @@ -828,17 +1107,33 @@ } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", @@ -864,7 +1159,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "function-bind": { @@ -873,12 +1168,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -908,32 +1197,33 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, "globals": { "version": "11.8.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", "dev": true }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -1002,31 +1292,32 @@ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -1039,27 +1330,6 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, - "inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.0", - "figures": "^2.0.0", - "lodash": "^4.17.10", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.1.0", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", @@ -1090,40 +1360,31 @@ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { - "is-path-inside": "^1.0.0" + "is-extglob": "^2.1.1" } }, "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, "is-regex": { @@ -1135,12 +1396,6 @@ "has": "^1.0.1" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -1159,7 +1414,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "istanbul-lib-coverage": { @@ -1286,6 +1541,12 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -1301,9 +1562,18 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -1314,13 +1584,13 @@ } }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "load-json-file": { @@ -1362,7 +1632,13 @@ "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "log-symbols": { @@ -1447,12 +1723,6 @@ } } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1533,16 +1803,10 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "neo-async": { @@ -1658,12 +1922,6 @@ } } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -1695,21 +1953,12 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" } }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -1727,17 +1976,17 @@ } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" } }, "os-homedir": { @@ -1757,12 +2006,6 @@ "mem": "^4.0.0" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -1833,6 +2076,15 @@ "optimist": "~0.6.0" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -1852,13 +2104,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { @@ -1890,27 +2136,6 @@ } } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -1920,16 +2145,10 @@ "find-up": "^3.0.0" } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prettier": { @@ -1938,12 +2157,6 @@ "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", "dev": true }, - "progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", - "dev": true - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -1961,9 +2174,15 @@ } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, "read-pkg": { @@ -1987,16 +2206,10 @@ "read-pkg": "^3.0.0" } }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, "requires": { "es6-error": "^4.0.1" @@ -2005,7 +2218,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "require-main-filename": { @@ -2014,16 +2227,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, "requireindex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", @@ -2039,20 +2242,16 @@ } }, "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true }, "rimraf": { "version": "2.6.2", @@ -2063,22 +2262,13 @@ "glob": "^7.0.5" } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "requires": { - "tslib": "^1.9.0" + "queue-microtask": "^1.2.2" } }, "safe-buffer": { @@ -2087,12 +2277,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", @@ -2102,7 +2286,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, "shebang-command": { @@ -2126,15 +2310,6 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -2190,7 +2365,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "string-width": { @@ -2239,18 +2414,6 @@ "has-flag": "^3.0.0" } }, - "table": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", - "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", - "dev": true, - "requires": { - "ajv": "^6.5.3", - "lodash": "^4.17.10", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - } - }, "test-exclude": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", @@ -2266,28 +2429,13 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "through": { - "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, "trim-right": { @@ -2296,21 +2444,21 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, "uglify-js": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", @@ -2332,9 +2480,9 @@ } }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -2380,12 +2528,6 @@ "string-width": "^1.0.2 || 2" } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -2436,18 +2578,9 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, "write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", @@ -2582,6 +2715,12 @@ } } } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 6528a244..d4a41c4e 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "format": "prettier --ignore-path .gitignore --write \"**/*.{js,css,md}\" && eslint ./**/*.js" }, "devDependencies": { - "eslint": "^5.8.0", + "eslint": "^8.49.0", "lodash": "^4.17.15", "mocha": "^6.2.0", "nyc": "^14.1.1", @@ -35,14 +35,13 @@ }, "dependencies": { "disparity": "^3.2.0", - "package-json-validator": "^0.6.3", - "requireindex": "^1.2.0" + "package-json-validator": "^0.6.3" }, "peerDependencies": { - "eslint": ">=4.7.0" + "eslint": ">=8.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=18.0.0" }, "nyc": { "include": [ diff --git a/tests/lib/index.js b/tests/lib/index.js deleted file mode 100644 index 718613d4..00000000 --- a/tests/lib/index.js +++ /dev/null @@ -1,157 +0,0 @@ -const assert = require('assert'); -const { CLIEngine } = require('eslint'); -const { includes, keys } = require('lodash'); -const path = require('path'); - -const plugin = require('../../lib'); - -function execute(scenario, rules, options) { - const cli = new CLIEngine( - Object.assign( - { - extensions: ['.json'], - baseConfig: { - rules - }, - ignore: false, - useEslintrc: false - }, - options - ) - ); - cli.addPlugin('eslint-plugin-package-json', plugin); - return cli.executeOnFiles([ - path.join(__dirname, '__fixtures__', scenario, 'package.json') - ]); -} - -describe('plugin exports', () => { - it('should define json processor', () => { - const extensions = keys(plugin.processors); - assert(includes(extensions, '.json')); - }); - - describe('should define rules', () => { - it('catches unalphabetized collections', () => { - const { errorCount, fixableErrorCount, results } = execute( - 'unalphabetized-collections', - { - 'package-json/sort-collections': 'error' - } - ); - assert.equal(errorCount, 2, 'errorCount === 2'); - assert.equal(fixableErrorCount, 2, 'fixableErrorCount === 2'); - assert.equal(results.length, 1); - const { messages } = results[0]; - const [scriptsMessage, depsMessage] = messages; - assert.equal( - scriptsMessage.ruleId, - 'package-json/sort-collections' - ); - assert.equal( - scriptsMessage.message, - 'Package scripts are not alphabetized' - ); - assert(scriptsMessage.fix); - assert.equal(depsMessage.ruleId, 'package-json/sort-collections'); - assert.equal( - depsMessage.message, - 'Package dependencies are not alphabetized' - ); - assert(depsMessage.fix); - }); - it('autofixes unalphabetized collections', () => { - const { errorCount, fixableErrorCount, results } = execute( - 'unalphabetized-collections', - { - 'package-json/sort-collections': 'error' - }, - { fix: true } - ); - assert.equal(errorCount, 0, 'errorCount === 0'); - assert.equal(fixableErrorCount, 0, 'fixableErrorCount === 0'); - let fixed; - assert.doesNotThrow(() => { - fixed = JSON.parse(results[0].output); - }); - const scriptsOrder = Object.keys(fixed.scripts); - const scriptsDesiredOrder = scriptsOrder.slice().sort(); - assert.deepEqual(scriptsOrder, scriptsDesiredOrder); - const depsOrder = Object.keys(fixed.dependencies); - const depsDesiredOrder = depsOrder.slice().sort(); - assert.deepEqual(depsOrder, depsDesiredOrder); - }); - it('sorts top-level properties by convention', () => { - const { errorCount, fixableErrorCount, results } = execute( - 'invalid-top-level-property-order', - { - 'package-json/order-properties': 'error' - } - ); - assert.equal(errorCount, 1, 'errorCount === 1'); - assert.equal(fixableErrorCount, 1, 'fixableErrorCount === 1'); - assert.equal(results.length, 1); - const { ruleId, message, fix } = results[0].messages[0]; - assert.equal(ruleId, 'package-json/order-properties'); - assert( - new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: - - \\{ - "name": "invalid\\-top\\-level\\-property\\-order", -.*\\+ "scripts": \\{.* -.*\\+ "test": "tape".* -.*\\+ \\},.* - "version": "1\\.0\\.0", - "description": "npm made me this way", - "main": "index\\.js", -.*\\- "scripts": \\{.* -.*\\- "test": "tape".* -.*\\- \\},.* - "repository": \\{ - "type": "git", - "url": "git\\+https://github\\.com/fake/github\\.git" - \\} -`).test(message), - 'Matches error message: ' + message - ); - assert(fix); - }); - it('autofixes out-of-order top-level properties', () => { - const { errorCount, fixableErrorCount, results } = execute( - 'invalid-top-level-property-order', - { - 'package-json/order-properties': 'error' - }, - { - fix: true - } - ); - assert.equal(errorCount, 0, 'errorCount === 0'); - assert.equal(fixableErrorCount, 0, 'fixableErrorCount === 0'); - let fixedString = results[0].output; - assert.doesNotThrow(() => { - JSON.parse(fixedString); - }); - assert.equal( - fixedString, - JSON.stringify( - { - name: 'invalid-top-level-property-order', - version: '1.0.0', - description: 'npm made me this way', - main: 'index.js', - scripts: { - test: 'tape' - }, - repository: { - type: 'git', - url: 'git+https://github.com/fake/github.git' - } - }, - null, - 2 - ) + '\n' - ); - }); - }); -}); diff --git a/tests/lib/rules/order-properties.js b/tests/lib/rules/order-properties.js index d0f0a924..4eaedd2f 100644 --- a/tests/lib/rules/order-properties.js +++ b/tests/lib/rules/order-properties.js @@ -1,195 +1,162 @@ 'use strict'; -//------------------------------------------------------------------------------ -// Requirements -//------------------------------------------------------------------------------ - var rule = require('../../../lib/rules/order-properties'), + processor = require('../../lib/processors/PackageJsonProcessor'), RuleTester = require('eslint').RuleTester; -//------------------------------------------------------------------------------ -// Valid test cases -//------------------------------------------------------------------------------ - -const valid = [ - { - code: `module.exports = { - "name": "treat-yo-self", - "version": "1.1.1", - "description": "Once a year.", - "keywords": [ - "modern", - "master" - ] -}`, - filename: 'package.json' - }, - { - code: `module.exports = { - "name": "treat-yo-self", - "version": "0.1.0", - "private": true, - "description": "Once a year.", - "keywords": [ - "modern", - "master" - ] -} -`, - filename: '/path/to/package.json' - }, - { - code: `doStuff({ "not-a-package-json": "so who cares" })`, - filename: 'package-lock.json' - }, - { - code: `module.exports = { - "version": "1.1.1", - "name": "treat-yo-self", - "keywords": [ - "modern", - "master" - ], - "description": "Once a year." -} -`, - filename: 'package.json', - options: [['version', 'name']] - } -]; - -//------------------------------------------------------------------------------ -// Invalid test cases -//------------------------------------------------------------------------------ - -const invalid = [ - { - code: `module.exports = { - "name": "invalid-top-level-property-order", - "scripts": { - "test": "tape" - }, - "version": "1.0.0", - "description": "npm made me this way", - "main": "index.js", - "repository": { - "type": "git", - "url": "git+https://github.com/fake/github.git" - } -}`, - filename: 'path/to/some/package.json', - errors: [ - { - message: - new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: +var ruleTester = new RuleTester({ + processor: 'plugin-json/processor' +}); +ruleTester.run('order-properties', rule, { + valid: [ + { + code: `{ + "name": "treat-yo-self", + "version": "1.1.1", + "description": "Once a year.", + "keywords": [ + "modern", + "master" + ] + }`, + filename: 'package.json' + }, + { + code: `{ + "name": "treat-yo-self", + "version": "0.1.0", + "private": true, + "description": "Once a year.", + "keywords": ["modern", "master"] + }`, + filename: '/path/to/package.json' + }, + { + code: `doStuff({ "not-a-package-json": "so who cares" })`, + filename: 'package-lock.json' + }, + { + code: `{ + "version": "1.1.1", + "name": "treat-yo-self", + "keywords": ["modern", "master"] + "description": "Once a year." + }`, + filename: 'package.json', + options: [['version', 'name']] + } + ], + invalid: [ + { + code: `{ + "name": "invalid-top-level-property-order", + "scripts": { + "test": "tape" + }, + "version": "1.0.0", + "description": "npm made me this way", + "main": "index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/fake/github.git" + } + }`, + filename: 'path/to/some/package.json', + errors: [ + { + message: + new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: - \\{ - "name": "invalid\\-top\\-level\\-property\\-order", +\\{ +"name": "invalid\\-top\\-level\\-property\\-order", .*\\+ "scripts": \\{.* .*\\+ "test": "tape".* .*\\+ \\},.* - "version": "1\\.0\\.0", - "description": "npm made me this way", - "main": "index\\.js", +"version": "1\\.0\\.0", +"description": "npm made me this way", +"main": "index\\.js", .*\\- "scripts": \\{.* .*\\- "test": "tape".* .*\\- \\},.* - "repository": \\{ - "type": "git", - "url": "git\\+https://github\\.com/fake/github\\.git" - \\} +"repository": \\{ +"type": "git", +"url": "git\\+https://github\\.com/fake/github\\.git" +\\} `) - } - ] - }, - { - code: `module.exports = { - "version": "1.1.1", - "name": "treat-yo-self", - "keywords": [ - "modern", - "master" - ], - "description": "Once a year." -}`, - filename: '/path/to/package.json', - errors: [ - { - message: - new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: + } + ] + }, + { + code: `{ + "version": "1.1.1", + "name": "treat-yo-self", + "keywords": ["modern", "master"], + "description": "Once a year." + }`, + filename: '/path/to/package.json', + errors: [ + { + message: + new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: - \\{ +\\{ .*\\+ "version": "1\\.1\\.1",.* - "name": "treat\\-yo\\-self", +"name": "treat\\-yo\\-self", .*\\- "version": "1\\.1\\.1",.* .*\\- "description": "Once a year\\.",.* - "keywords": \\[ - "modern", - "master" +"keywords": \\[ +"modern", +"master" .*\\- \\].* .*\\+ \\],.* .*\\+ "description": "Once a year\\.".* - \\} +\\} `) - } - ], - output: `{ - "name": "treat-yo-self", - "version": "1.1.1", - "description": "Once a year.", - "keywords": [ - "modern", - "master" - ] -} -` - }, - { - code: `module.exports = { + } + ], + output: `{ + "name": "treat-yo-self", + "version": "1.1.1", + "description": "Once a year.", + "keywords": ["modern", "master"] + }` + }, + { + code: `{ "version": "2.0.0", "devDependencies": {}, "keywords": ["lol"], "name": "sort-only-some", "description": "unsorted properties left in place" }`, + filename: '/another/path/to/package.json', + options: [['name', 'devDependencies']], + errors: [ + { + message: + new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: - filename: '/another/path/to/package.json', - options: [['name', 'devDependencies']], - errors: [ - { - message: - new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: - - \\{ +\\{ .*\\- "name": "sort\\-only\\-some",.* .*\\+ "version": "2\\.0\\.0",.* - "devDependencies": \\{\\}, +"devDependencies": \\{\\}, .*\\- "version": "2\\.0\\.0",.* - "keywords": \\[ - "lol" - \\], +"keywords": \\[ +"lol" +\\], .*\\+ "name": "sort-only-some",.* - "description": "unsorted properties left in place" - \\} +"description": "unsorted properties left in place" +\\} `) - } - ], - output: `{ - "name": "sort-only-some", - "devDependencies": {}, - "version": "2.0.0", - "keywords": [ - "lol" - ], - "description": "unsorted properties left in place" -} -` - } -]; - -//------------------------------------------------------------------------------ -// Run tests -//------------------------------------------------------------------------------ - -var ruleTester = new RuleTester(); -ruleTester.run('order-properties', rule, { valid, invalid }); + } + ], + output: `{ + "name": "sort-only-some", + "devDependencies": {}, + "version": "2.0.0", + "keywords": ["lol"], + "description": "unsorted properties left in place" + }` + } + ] +}); From 22018ca5deb5b45a37d5ea6123b561325e8688e4 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Wed, 20 Sep 2023 04:40:50 -0400 Subject: [PATCH 2/5] Moved to jsonc-eslint-parser --- .eslintrc | 2 +- README.md | 47 +++--- lib/createRule.js | 17 ++ lib/index.js | 5 - lib/processors/PackageJsonProcessor.js | 64 -------- lib/rules/order-properties.js | 27 ++-- lib/rules/sort-collections.js | 16 +- lib/rules/valid-package-def.js | 42 ++--- package-lock.json | 81 +++++++--- package.json | 4 +- tests/lib/processors/PackageJsonProcessor.js | 132 ---------------- tests/lib/rules/order-properties.js | 155 ++++++++++--------- tests/lib/rules/sort-collections.js | 27 ++-- tests/lib/rules/valid-package-def.js | 12 +- 14 files changed, 242 insertions(+), 389 deletions(-) create mode 100644 lib/createRule.js delete mode 100644 lib/processors/PackageJsonProcessor.js delete mode 100644 tests/lib/processors/PackageJsonProcessor.js diff --git a/.eslintrc b/.eslintrc index a3197e91..191d1d54 100644 --- a/.eslintrc +++ b/.eslintrc @@ -5,7 +5,7 @@ }, "extends": ["eslint:recommended"], "parserOptions": { - "ecmaVersion": 6, + "ecmaVersion": 2021, "sourceType": "module" } } diff --git a/README.md b/README.md index e29b66bd..c9e4e90e 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Rules for valid, consistent, and readable package.json files ## Installation -You'll first need to install [ESLint](http://eslint.org) and `eslint-plugin-package-json`: +You'll first need to install [ESLint](http://eslint.org) >=8 and `eslint-plugin-package-json`: ```shell $ npm install eslint eslint-plugin-package-json --save-dev @@ -14,37 +14,36 @@ $ npm install eslint eslint-plugin-package-json --save-dev ## Usage -Add an override to your ESLint configuration file that specifies this plugin and its processor for your `package.json` file: +Add an override to your ESLint configuration file that specifies this plugin, [`jsonc-eslint-parser`](https://github.com/ota-meshi/jsonc-eslint-parser) and its recommended rules for your `package.json` file: -```json -{ - "overrides": [ +```js +module.exports = { + overrides: [ { - "files": ["package.json"], - "plugins": ["package-json"], - "processor": ["package-json/processor"] + extends: ['plugin:package-json/recommended'], + files: ['package.json'], + parser: 'jsonc-eslint-parser' + plugins: ['package-json'] } ] -} -``` - -Use the prepackaged config by adding an "extends" property, or appending to an existing "extends" property: - -```json -{ - "extends": ["eslint:recommended", "plugin:package-json/recommended"], - "plugins": ["package-json"] -} +}; ``` Or, individually configure the rules you want to use under the rules section. -```json -{ - "rules": { - "package-json/rule-name": 2 - } -} +```js +module.exports = { + overrides: [ + { + files: ['package.json'], + parser: 'jsonc-eslint-parser' + plugins: ['package-json'], + rules: { + 'package-json/valid-package-def': 'error' + } + } + ] +}; ``` ## Supported Rules diff --git a/lib/createRule.js b/lib/createRule.js new file mode 100644 index 00000000..81cc5a37 --- /dev/null +++ b/lib/createRule.js @@ -0,0 +1,17 @@ +const isPackageJson = filePath => + filePath.endsWith('/package.json') || filePath === 'package.json'; + +function createRule(rule) { + return { + ...rule, + create(context) { + if (!isPackageJson(context.filename)) { + return {}; + } + + return rule.create(context); + } + }; +} + +module.exports.createRule = createRule; diff --git a/lib/index.js b/lib/index.js index 844ec52c..41adeb66 100644 --- a/lib/index.js +++ b/lib/index.js @@ -4,8 +4,6 @@ const orderProperties = require('./rules/order-properties'); const sortCollections = require('./rules/sort-collections'); const validPackageDef = require('./rules/valid-package-def'); -const PackageJsonProcessor = require('./processors/PackageJsonProcessor'); - module.exports = { configs: { recommended: { @@ -15,8 +13,5 @@ module.exports = { 'valid-package-def': validPackageDef } } - }, - processors: { - processor: PackageJsonProcessor } }; diff --git a/lib/processors/PackageJsonProcessor.js b/lib/processors/PackageJsonProcessor.js deleted file mode 100644 index 7a15caa4..00000000 --- a/lib/processors/PackageJsonProcessor.js +++ /dev/null @@ -1,64 +0,0 @@ -const parseErrors = {}; - -const isPackageJson = filePath => - filePath.endsWith('/package.json') || filePath === 'package.json'; - -const forPackageJsonOnly = fn => (source, filePath) => - isPackageJson(filePath) ? fn(source, filePath) : []; - -const leader = `module.exports = `; - -// turn package.json into a legal JS file -function preprocess(source, filePath) { - try { - JSON.parse(source); - } catch (e) { - let line = 0; - let column = 0; - const posDescription = e.message.match(/position\s+(\d+)/); - if (posDescription) { - const pos = Number(posDescription[1]); - const lines = source.slice(0, pos).split('\n'); - line += lines.length; - const previousLinesLength = lines.slice(0, -1).join('\n').length; - column = pos - previousLinesLength; - } - parseErrors[filePath] = { - ruleId: 'package-json/valid-package-def', - severity: 2, - message: e.message, - line, - column, - nodeType: 'Program' - }; - - // so eslint can point to the line in its own message, put the invalid - // JSON in a comment (escaping comment-closing characters!) - return ['/*' + source.replace(/\*\//g, '*\\/') + '*/']; - } - return [leader + source.trim() + ';']; -} - -// the reverse of preprocess: extract AST node representing package object -function extractPackageObjectFromAST(ast) { - return ast.body[0].expression.right; -} - -function postprocess(errors, filePath) { - if (parseErrors[filePath]) { - return [parseErrors[filePath]]; - } - const flat = [].concat(...errors); - flat.forEach(({ fix }) => { - if (fix) { - fix.range = fix.range.map(i => i - leader.length); - } - }); - return flat; -} - -module.exports.preprocess = forPackageJsonOnly(preprocess); -module.exports.postprocess = forPackageJsonOnly(postprocess); -module.exports.supportsAutofix = true; -module.exports.isPackageJson = isPackageJson; -module.exports.extractPackageObjectFromAST = extractPackageObjectFromAST; diff --git a/lib/rules/order-properties.js b/lib/rules/order-properties.js index bf3ec9be..8f4123fa 100644 --- a/lib/rules/order-properties.js +++ b/lib/rules/order-properties.js @@ -1,9 +1,6 @@ 'use strict'; const disparity = require('disparity'); -const { - isPackageJson, - extractPackageObjectFromAST -} = require('../processors/PackageJsonProcessor'); +const { createRule } = require('../createRule'); //------------------------------------------------------------------------------ // Rule Definition @@ -46,7 +43,7 @@ const toIndexMap = arr => return indexMap; }, {}); -module.exports = { +module.exports = createRule({ meta: { docs: { description: @@ -54,7 +51,7 @@ module.exports = { category: 'Best Practices', recommended: true }, - fixable: 'code', // or "code" or "whitespace" + fixable: 'code', schema: [ { type: 'array', @@ -67,13 +64,8 @@ module.exports = { create(context) { return { - 'Program:exit': node => { - if (!isPackageJson(context.getFilename())) { - return; - } - const sourceCode = context.getSourceCode(); - const packageRoot = extractPackageObjectFromAST(node); - const original = JSON.parse(sourceCode.getText(packageRoot)); + 'Program:exit'() { + const original = JSON.parse(context.sourceCode.text); const originalIndexMap = toIndexMap(Object.keys(original)); const requiredOrder = context.options[0] || standardOrder; const requiredIndexMap = toIndexMap(requiredOrder); @@ -117,7 +109,7 @@ module.exports = { ); if (diff) { context.report({ - node: packageRoot, + node: context.sourceCode.ast, message: 'Package top-level properties are not ordered in the NPM standard way:\n\n{{ diff }}', data: { @@ -127,11 +119,14 @@ module.exports = { .join('\n') }, fix(fixer) { - return fixer.replaceText(node, orderedSource); + return fixer.replaceText( + context.sourceCode.ast, + orderedSource + ); } }); } } }; } -}; +}); diff --git a/lib/rules/sort-collections.js b/lib/rules/sort-collections.js index 875fe059..cccd6d63 100644 --- a/lib/rules/sort-collections.js +++ b/lib/rules/sort-collections.js @@ -1,5 +1,6 @@ 'use strict'; -const { isPackageJson } = require('../processors/PackageJsonProcessor'); + +const { createRule } = require('../createRule'); //------------------------------------------------------------------------------ // Rule Definition @@ -11,7 +12,7 @@ const defaultCollections = [ 'peerDependencies', 'config' ]; -module.exports = { +module.exports = createRule({ meta: { docs: { description: @@ -30,16 +31,13 @@ module.exports = { ] }, - create: function(context) { + create(context) { const toSort = context.options[0] || defaultCollections; return { - 'Property:exit': node => { - if (!isPackageJson(context.getFilename())) { - return; - } + 'JSONProperty:exit'(node) { const collection = node.value; if ( - collection.type === 'ObjectExpression' && + collection.type === 'JSONObjectExpression' && toSort.includes(node.key.value) ) { const currentOrder = collection.properties; @@ -85,4 +83,4 @@ module.exports = { } }; } -}; +}); diff --git a/lib/rules/valid-package-def.js b/lib/rules/valid-package-def.js index 25c6ad84..1ae9b0bf 100644 --- a/lib/rules/valid-package-def.js +++ b/lib/rules/valid-package-def.js @@ -1,9 +1,6 @@ 'use strict'; const { PJV: PackageValidator } = require('package-json-validator'); -const { - isPackageJson, - extractPackageObjectFromAST -} = require('../processors/PackageJsonProcessor'); +const { createRule } = require('../createRule'); //------------------------------------------------------------------------------ // Rule Definition @@ -21,41 +18,32 @@ const unusedErrorPatterns = [ const isUsableError = errorText => unusedErrorPatterns.every(pattern => !pattern.test(errorText)); -module.exports = { +module.exports = createRule({ meta: { docs: { description: 'Enforce that package.json has all properties required by NPM spec', category: 'Best Practices', recommended: true - }, - fixable: null // or "code" or "whitespace" + } }, create: function(context) { return { - 'Program:exit': node => { - if (!isPackageJson(context.getFilename())) { - return; - } - const packageRoot = extractPackageObjectFromAST(node); - - const { critical, errors } = PackageValidator.validate( - context.getSourceCode().getText(packageRoot) + 'Program:exit'() { + const { errors } = PackageValidator.validate( + context.sourceCode.text ); - if (critical || errors) { - const allErrors = [...(critical || []), ...errors]; - allErrors.filter(isUsableError).forEach( - message => - message && - context.report({ - node: packageRoot, - message - }) - ); - } + (errors || []).filter(isUsableError).forEach( + message => + message && + context.report({ + node: context.sourceCode.ast, + message + }) + ); } }; } -}; +}); diff --git a/package-lock.json b/package-lock.json index 740735ea..b1fee31c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -391,7 +391,7 @@ "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, "argparse": { @@ -502,13 +502,13 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "convert-source-map": { @@ -1129,9 +1129,9 @@ } }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "foreground-child": { @@ -1159,7 +1159,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "function-bind": { @@ -1311,13 +1311,13 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -1414,7 +1414,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "istanbul-lib-coverage": { @@ -1565,6 +1565,44 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "jsonc-eslint-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.3.0.tgz", + "integrity": "sha512-9xZPKVYp9DxnM3sd1yAsh/d59iIaswDkai8oTxbursfKYbg/ibjX0IzFt35+VZ8iEW453TVTXztnRvYUQlAfUQ==", + "dev": true, + "requires": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "keyv": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", @@ -1632,7 +1670,7 @@ "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, "lodash.merge": { @@ -1953,7 +1991,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" @@ -2104,7 +2142,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { @@ -2209,7 +2247,7 @@ "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", "dev": true, "requires": { "es6-error": "^4.0.1" @@ -2218,7 +2256,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { @@ -2227,11 +2265,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==" - }, "resolve": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", @@ -2286,7 +2319,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "shebang-command": { @@ -2365,7 +2398,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "string-width": { @@ -2435,7 +2468,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, "trim-right": { @@ -2578,7 +2611,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { diff --git a/package.json b/package.json index d4a41c4e..e57c6956 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ }, "devDependencies": { "eslint": "^8.49.0", + "jsonc-eslint-parser": "^2.3.0", "lodash": "^4.17.15", "mocha": "^6.2.0", "nyc": "^14.1.1", @@ -38,7 +39,8 @@ "package-json-validator": "^0.6.3" }, "peerDependencies": { - "eslint": ">=8.0.0" + "eslint": ">=8.0.0", + "jsonc-eslint-parser": "^2.0.0" }, "engines": { "node": ">=18.0.0" diff --git a/tests/lib/processors/PackageJsonProcessor.js b/tests/lib/processors/PackageJsonProcessor.js deleted file mode 100644 index 04ca6d77..00000000 --- a/tests/lib/processors/PackageJsonProcessor.js +++ /dev/null @@ -1,132 +0,0 @@ -const assert = require('assert'); - -const processor = require('../../../lib/processors/PackageJsonProcessor'); - -const { preprocess, postprocess } = processor; - -describe('preprocess', () => { - it('only returns lintable strings when filename is package.json', () => { - const result = preprocess('{ "nmae": "invalid" }', 'package-lock.json'); - assert.deepEqual(result, []); - }); - - it('should turn root package.json file into JS file exporting object', () => { - const json = '{ "nmae": "invalid" }'; - const expected = ['module.exports = { "nmae": "invalid" };']; - const result = preprocess(json, 'package.json'); - assert.deepEqual(result, expected); - }); - - it('should turn deeply nested package.json file into JS file exporting object', () => { - const json = '{ "nmae": "invalid" }'; - const expected = ['module.exports = { "nmae": "invalid" };']; - const result = preprocess(json, '/packages/subpackage/package.json'); - assert.deepEqual(result, expected); - }); -}); - -describe('postprocess', () => { - it('should return informative validity errors on unparseable json', () => { - const badJson = `{ - "florp": [], - "glorp": [ - "foon", - "zune", - { - "rune" - - ], - "spoon": 4 - }`; - const commented = preprocess(badJson, 'package.json')[0]; - assert( - commented.startsWith('/*') && commented.endsWith('*/'), - `unparseable JSON wrapped in multiline comment: ${commented}` - ); - assert.deepEqual(postprocess([], 'package.json'), [ - { - ruleId: 'package-json/valid-package-def', - severity: 2, - message: 'Unexpected token ] in JSON at position 130', - line: 9, - column: 11, - nodeType: 'Program' - } - ]); - - preprocess('{', 'nested/package.json'); - assert.deepEqual(postprocess([], 'nested/package.json'), [ - { - ruleId: 'package-json/valid-package-def', - severity: 2, - message: 'Unexpected end of JSON input', - line: 0, - column: 0, - nodeType: 'Program' - } - ]); - }); - - it('should pass flattened error collection if there were no parse errors', () => { - const errors2d = [ - [ - { - ruleId: 'package-json/order-properties', - severity: 2, - message: 'Whatever', - line: 0, - column: 0, - nodeType: 'Property' - }, - { - ruleId: 'package-json/order-properties', - severity: 2, - message: 'And Ever', - line: 16, - column: 0, - nodeType: 'Property' - } - ], - [ - { - ruleId: 'package-json/sort-collections', - severity: 2, - message: 'whomever', - line: 15, - column: 4, - nodeType: 'Program' - } - ] - ]; - const errors1d = [ - { - ruleId: 'package-json/order-properties', - severity: 2, - message: 'Whatever', - line: 0, - column: 0, - nodeType: 'Property' - }, - { - ruleId: 'package-json/order-properties', - severity: 2, - message: 'And Ever', - line: 16, - column: 0, - nodeType: 'Property' - }, - { - ruleId: 'package-json/sort-collections', - severity: 2, - message: 'whomever', - line: 15, - column: 4, - nodeType: 'Program' - } - ]; - assert.deepEqual( - postprocess(errors2d, 'further/nested/package.json'), - errors1d - ); - }); -}); diff --git a/tests/lib/rules/order-properties.js b/tests/lib/rules/order-properties.js index 4eaedd2f..e78a1e48 100644 --- a/tests/lib/rules/order-properties.js +++ b/tests/lib/rules/order-properties.js @@ -1,12 +1,12 @@ 'use strict'; var rule = require('../../../lib/rules/order-properties'), - processor = require('../../lib/processors/PackageJsonProcessor'), RuleTester = require('eslint').RuleTester; var ruleTester = new RuleTester({ - processor: 'plugin-json/processor' + parser: require.resolve('jsonc-eslint-parser') }); + ruleTester.run('order-properties', rule, { valid: [ { @@ -31,15 +31,11 @@ ruleTester.run('order-properties', rule, { }`, filename: '/path/to/package.json' }, - { - code: `doStuff({ "not-a-package-json": "so who cares" })`, - filename: 'package-lock.json' - }, { code: `{ "version": "1.1.1", "name": "treat-yo-self", - "keywords": ["modern", "master"] + "keywords": ["modern", "master"], "description": "Once a year." }`, filename: 'package.json', @@ -49,114 +45,135 @@ ruleTester.run('order-properties', rule, { invalid: [ { code: `{ - "name": "invalid-top-level-property-order", - "scripts": { - "test": "tape" - }, - "version": "1.0.0", - "description": "npm made me this way", - "main": "index.js", - "repository": { - "type": "git", - "url": "git+https://github.com/fake/github.git" - } + "name": "invalid-top-level-property-order", + "scripts": { + "test": "tape" + }, + "version": "1.0.0", + "description": "npm made me this way", + "main": "index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/fake/github.git" + } }`, filename: 'path/to/some/package.json', errors: [ { - message: - new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: + message: new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: -\\{ -"name": "invalid\\-top\\-level\\-property\\-order", + \\{ + "name": "invalid\\-top\\-level\\-property\\-order", .*\\+ "scripts": \\{.* .*\\+ "test": "tape".* .*\\+ \\},.* -"version": "1\\.0\\.0", -"description": "npm made me this way", -"main": "index\\.js", + "version": "1\\.0\\.0", + "description": "npm made me this way", + "main": "index\\.js", .*\\- "scripts": \\{.* .*\\- "test": "tape".* .*\\- \\},.* -"repository": \\{ -"type": "git", -"url": "git\\+https://github\\.com/fake/github\\.git" -\\} + "repository": \\{ + "type": "git", + "url": "git\\+https://github\\.com/fake/github\\.git" + \\} `) } - ] + ], + output: `{ + "name": "invalid-top-level-property-order", + "version": "1.0.0", + "description": "npm made me this way", + "main": "index.js", + "scripts": { + "test": "tape" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/fake/github.git" + } +} +` }, { code: `{ - "version": "1.1.1", - "name": "treat-yo-self", - "keywords": ["modern", "master"], - "description": "Once a year." - }`, + "version": "1.1.1", + "name": "treat-yo-self", + "keywords": [ + "modern", + "master" + ], + "description": "Once a year." +}`, filename: '/path/to/package.json', errors: [ { - message: - new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: + message: new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: -\\{ + \\{ .*\\+ "version": "1\\.1\\.1",.* -"name": "treat\\-yo\\-self", + "name": "treat\\-yo\\-self", .*\\- "version": "1\\.1\\.1",.* .*\\- "description": "Once a year\\.",.* -"keywords": \\[ -"modern", -"master" + "keywords": \\[ + "modern", + "master" .*\\- \\].* .*\\+ \\],.* .*\\+ "description": "Once a year\\.".* -\\} + \\} `) } ], output: `{ - "name": "treat-yo-self", - "version": "1.1.1", - "description": "Once a year.", - "keywords": ["modern", "master"] - }` + "name": "treat-yo-self", + "version": "1.1.1", + "description": "Once a year.", + "keywords": [ + "modern", + "master" + ] +} +` }, { code: `{ - "version": "2.0.0", - "devDependencies": {}, - "keywords": ["lol"], - "name": "sort-only-some", - "description": "unsorted properties left in place" - }`, + "version": "2.0.0", + "devDependencies": {}, + "keywords": ["lol"], + "name": "sort-only-some", + "description": "unsorted properties left in place" +}`, filename: '/another/path/to/package.json', options: [['name', 'devDependencies']], errors: [ { - message: - new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: + message: new RegExp(`Package top\\-level properties are not ordered in the NPM standard way: -\\{ + \\{ .*\\- "name": "sort\\-only\\-some",.* .*\\+ "version": "2\\.0\\.0",.* -"devDependencies": \\{\\}, + "devDependencies": \\{\\}, .*\\- "version": "2\\.0\\.0",.* -"keywords": \\[ -"lol" -\\], + "keywords": \\[ + "lol" + \\], .*\\+ "name": "sort-only-some",.* -"description": "unsorted properties left in place" -\\} + "description": "unsorted properties left in place" + \\} `) } ], output: `{ - "name": "sort-only-some", - "devDependencies": {}, - "version": "2.0.0", - "keywords": ["lol"], - "description": "unsorted properties left in place" - }` + "name": "sort-only-some", + "devDependencies": {}, + "version": "2.0.0", + "keywords": [ + "lol" + ], + "description": "unsorted properties left in place" +} +` } ] }); diff --git a/tests/lib/rules/sort-collections.js b/tests/lib/rules/sort-collections.js index 9235f929..fb37e47a 100644 --- a/tests/lib/rules/sort-collections.js +++ b/tests/lib/rules/sort-collections.js @@ -11,33 +11,36 @@ var rule = require('../../../lib/rules/sort-collections'), // Tests //------------------------------------------------------------------------------ -var ruleTester = new RuleTester(); +var ruleTester = new RuleTester({ + parser: require.resolve('jsonc-eslint-parser') +}); + ruleTester.run('sort-collections', rule, { valid: [ { - code: `({ + code: `{ "scripts": { "build": "webpack", "watch": "webpack-dev-server" } -})`, +}`, filename: 'package.json' }, // ignore if custom include rule { - code: `({ + code: `{ "scripts": { "build": "webpack", "watch": "webpack-dev-server" } -})`, +}`, filename: 'package.json', options: [['devDependencies']] }, { - code: `({ + code: `{ "scripts": { "watch": "out of order...", "build": "but okay" } -})`, +}`, filename: 'not-a-package.json', options: [['devDependencies']] } @@ -45,25 +48,25 @@ ruleTester.run('sort-collections', rule, { invalid: [ { - code: `({ + code: `{ "scripts": { "watch": "webpack-dev-server", "build": "webpack" } -})`, +}`, filename: 'package.json', errors: [ { message: 'Package scripts are not alphabetized', - type: 'Property' + type: 'JSONProperty' } ], - output: `({ + output: `{ "scripts": { "build": "webpack", "watch": "webpack-dev-server" } -})` +}` } ] }); diff --git a/tests/lib/rules/valid-package-def.js b/tests/lib/rules/valid-package-def.js index a431ddbe..d6ce2b9f 100644 --- a/tests/lib/rules/valid-package-def.js +++ b/tests/lib/rules/valid-package-def.js @@ -11,11 +11,13 @@ var rule = require('../../../lib/rules/valid-package-def'), // Tests //------------------------------------------------------------------------------ -var ruleTester = new RuleTester(); +var ruleTester = new RuleTester({ + parser: require.resolve('jsonc-eslint-parser') +}); ruleTester.run('valid-package-def', rule, { valid: [ { - code: `module.exports = { + code: `{ "name": "pandages", "version": "1.0.0", "description": "", @@ -27,7 +29,7 @@ ruleTester.run('valid-package-def', rule, { filename: 'package.json' }, { - code: `module.export = { + code: `{ "name": "pandages-subpackage", "version": "1.0.0", "description": "", @@ -47,7 +49,7 @@ ruleTester.run('valid-package-def', rule, { invalid: [ { - code: `module.exports = { "nmae": "invalid-package" }`, + code: `{ "nmae": "invalid-package" }`, filename: 'package.json', errors: [ @@ -60,7 +62,7 @@ ruleTester.run('valid-package-def', rule, { ] }, { - code: `module.exports = { "verison": "wireless" }`, + code: `{ "verison": "wireless" }`, filename: 'packages/nested/package.json', errors: [ From 0bf6fd3fa9b90fb8abd0304186ab41d34af0aadf Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Wed, 20 Sep 2023 09:09:27 -0400 Subject: [PATCH 3/5] Remove test file --- tests/lib/processors/PackageJsonProcessor.js | 159 ------------------- 1 file changed, 159 deletions(-) delete mode 100644 tests/lib/processors/PackageJsonProcessor.js diff --git a/tests/lib/processors/PackageJsonProcessor.js b/tests/lib/processors/PackageJsonProcessor.js deleted file mode 100644 index 7d6db5e9..00000000 --- a/tests/lib/processors/PackageJsonProcessor.js +++ /dev/null @@ -1,159 +0,0 @@ -const assert = require('assert'); - -const processor = require('../../../lib/processors/PackageJsonProcessor'); - -const { preprocess, postprocess } = processor; - -describe('isPackageJson', () => { - for (const [input, expected] of [ - ['', false], - ['-', false], - ['other', false], - ['package.js', false], - ['package.jsx', false], - ['-package.json', false], - ['prefix-package.json', false], - ['package.json.json', false], - ['package.package.json', false], - ['package.json.package.json', false], - ['package.json-package.json', false], - ['package.json', true], - ['/package.json', true], - ['\\package.json', true], - ['prefix/package.json', true], - ['prefix\\package.json', true], - ['mixed\\prefix/package.json', true], - ['mixed/prefix\\package.json', true] - ]) { - it(input, () => { - assert.equal(processor.isPackageJson(input), expected); - }); - } -}); - -describe('preprocess', () => { - it('only returns lintable strings when filename is package.json', () => { - const result = preprocess('{ "nmae": "invalid" }', 'package-lock.json'); - assert.deepEqual(result, []); - }); - - it('should turn root package.json file into JS file exporting object', () => { - const json = '{ "nmae": "invalid" }'; - const expected = ['module.exports = { "nmae": "invalid" };']; - const result = preprocess(json, 'package.json'); - assert.deepEqual(result, expected); - }); - - it('should turn deeply nested package.json file into JS file exporting object', () => { - const json = '{ "nmae": "invalid" }'; - const expected = ['module.exports = { "nmae": "invalid" };']; - const result = preprocess(json, '/packages/subpackage/package.json'); - assert.deepEqual(result, expected); - }); -}); - -describe('postprocess', () => { - it('should return informative validity errors on unparseable json', () => { - const badJson = `{ - "florp": [], - "glorp": [ - "foon", - "zune", - { - "rune" - - ], - "spoon": 4 - }`; - const commented = preprocess(badJson, 'package.json')[0]; - assert( - commented.startsWith('/*') && commented.endsWith('*/'), - `unparseable JSON wrapped in multiline comment: ${commented}` - ); - assert.deepEqual(postprocess([], 'package.json'), [ - { - ruleId: 'package-json/valid-package-def', - severity: 2, - message: 'Unexpected token ] in JSON at position 130', - line: 9, - column: 11, - nodeType: 'Program' - } - ]); - - preprocess('{', 'nested/package.json'); - assert.deepEqual(postprocess([], 'nested/package.json'), [ - { - ruleId: 'package-json/valid-package-def', - severity: 2, - message: 'Unexpected end of JSON input', - line: 0, - column: 0, - nodeType: 'Program' - } - ]); - }); - - it('should pass flattened error collection if there were no parse errors', () => { - const errors2d = [ - [ - { - ruleId: 'package-json/order-properties', - severity: 2, - message: 'Whatever', - line: 0, - column: 0, - nodeType: 'Property' - }, - { - ruleId: 'package-json/order-properties', - severity: 2, - message: 'And Ever', - line: 16, - column: 0, - nodeType: 'Property' - } - ], - [ - { - ruleId: 'package-json/sort-collections', - severity: 2, - message: 'whomever', - line: 15, - column: 4, - nodeType: 'Program' - } - ] - ]; - const errors1d = [ - { - ruleId: 'package-json/order-properties', - severity: 2, - message: 'Whatever', - line: 0, - column: 0, - nodeType: 'Property' - }, - { - ruleId: 'package-json/order-properties', - severity: 2, - message: 'And Ever', - line: 16, - column: 0, - nodeType: 'Property' - }, - { - ruleId: 'package-json/sort-collections', - severity: 2, - message: 'whomever', - line: 15, - column: 4, - nodeType: 'Program' - } - ]; - assert.deepEqual( - postprocess(errors2d, 'further/nested/package.json'), - errors1d - ); - }); -}); From 32cea762cccd764d98cbbfcd6c30ee72b9f6f884 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Wed, 20 Sep 2023 09:10:05 -0400 Subject: [PATCH 4/5] Remove console logs --- lib/rules/valid-local-dependency.js | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/lib/rules/valid-local-dependency.js b/lib/rules/valid-local-dependency.js index ed70ef69..525daf8c 100644 --- a/lib/rules/valid-local-dependency.js +++ b/lib/rules/valid-local-dependency.js @@ -47,31 +47,21 @@ module.exports = createRule({ '/package.json' ); - console.log({ filePath }); try { - console.log('a'); - const wat = require.resolve(filePath); - console.log({ wat }); - if (!wat) { - console.log('b'); + if (!require.resolve(filePath)) { context.report({ node: context.sourceCode.ast, message: `The package ${key} does not exist given the specified path: ${value}.` }); - console.log('c'); } - console.log('a.5'); } catch (e) { - console.log('d'); context.report({ node: context.sourceCode.ast, message: `The package ${key} does not exist given the specified path: ${value}.` }); - console.log('e'); } }; - console.log({ value }); if (value.startsWith('link:')) { response('link:'); } From df57f738f206e351d1e2c154228d0bfdf6aa51dd Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Tue, 17 Oct 2023 12:30:33 -0400 Subject: [PATCH 5/5] Unified ruleTester.js --- tests/lib/rules/order-properties.js | 6 +----- tests/lib/rules/ruleTester.js | 7 +++++++ tests/lib/rules/sort-collections.js | 6 +----- tests/lib/rules/valid-local-dependency.js | 6 +----- tests/lib/rules/valid-package-def.js | 5 +---- 5 files changed, 11 insertions(+), 19 deletions(-) create mode 100644 tests/lib/rules/ruleTester.js diff --git a/tests/lib/rules/order-properties.js b/tests/lib/rules/order-properties.js index d4143b3d..bdc28309 100644 --- a/tests/lib/rules/order-properties.js +++ b/tests/lib/rules/order-properties.js @@ -1,11 +1,7 @@ 'use strict'; var rule = require('../../../lib/rules/order-properties'), - RuleTester = require('eslint').RuleTester; - -var ruleTester = new RuleTester({ - parser: require.resolve('jsonc-eslint-parser') -}); + { ruleTester } = require('./ruleTester'); ruleTester.run('order-properties', rule, { invalid: [ diff --git a/tests/lib/rules/ruleTester.js b/tests/lib/rules/ruleTester.js new file mode 100644 index 00000000..35f0ad16 --- /dev/null +++ b/tests/lib/rules/ruleTester.js @@ -0,0 +1,7 @@ +const { RuleTester } = require('eslint'); + +const ruleTester = new RuleTester({ + parser: require.resolve('jsonc-eslint-parser') +}); + +module.exports.ruleTester = ruleTester; diff --git a/tests/lib/rules/sort-collections.js b/tests/lib/rules/sort-collections.js index fb37e47a..16c13d8f 100644 --- a/tests/lib/rules/sort-collections.js +++ b/tests/lib/rules/sort-collections.js @@ -5,16 +5,12 @@ //------------------------------------------------------------------------------ var rule = require('../../../lib/rules/sort-collections'), - RuleTester = require('eslint').RuleTester; + { ruleTester } = require('./ruleTester'); //------------------------------------------------------------------------------ // Tests //------------------------------------------------------------------------------ -var ruleTester = new RuleTester({ - parser: require.resolve('jsonc-eslint-parser') -}); - ruleTester.run('sort-collections', rule, { valid: [ { diff --git a/tests/lib/rules/valid-local-dependency.js b/tests/lib/rules/valid-local-dependency.js index cd22a11d..c79febe6 100644 --- a/tests/lib/rules/valid-local-dependency.js +++ b/tests/lib/rules/valid-local-dependency.js @@ -9,7 +9,7 @@ //------------------------------------------------------------------------------ const path = require('path'); var rule = require('../../../lib/rules/valid-local-dependency'), - RuleTester = require('eslint').RuleTester; + { ruleTester } = require('./ruleTester'); //------------------------------------------------------------------------------ // Tests @@ -19,10 +19,6 @@ const fileName = partialPath => { return path.join(process.cwd(), partialPath); }; -var ruleTester = new RuleTester({ - parser: require.resolve('jsonc-eslint-parser') -}); - ruleTester.run('valid-local-dependency', rule, { valid: [ { diff --git a/tests/lib/rules/valid-package-def.js b/tests/lib/rules/valid-package-def.js index d6ce2b9f..3cc67f58 100644 --- a/tests/lib/rules/valid-package-def.js +++ b/tests/lib/rules/valid-package-def.js @@ -5,15 +5,12 @@ //------------------------------------------------------------------------------ var rule = require('../../../lib/rules/valid-package-def'), - RuleTester = require('eslint').RuleTester; + { ruleTester } = require('./ruleTester'); //------------------------------------------------------------------------------ // Tests //------------------------------------------------------------------------------ -var ruleTester = new RuleTester({ - parser: require.resolve('jsonc-eslint-parser') -}); ruleTester.run('valid-package-def', rule, { valid: [ {