From b5d2ec0696d007c38cac73294c54e24add96ce99 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:18:01 -0700 Subject: [PATCH 01/30] Remove non-existent file from .eslintignore --- .eslintignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.eslintignore b/.eslintignore index a36cf5da5..3dddf3f67 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,2 @@ dist/* node_modules/* -dev-server.js From 7878ac4164ea56739e818cf48d5420dc438c86cc Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:09:35 -0700 Subject: [PATCH 02/30] Clarify existing scope of ESLint Currently, the ESLint configuration file is top-level but only files under src/ are linted according to the npm script. This is a bit disjoint. Two options: 1. Move all usage of ESLint to src/. 2. Work towards applying ESLint to all files in this project. I'm going with (2) since there are some unlinted files that could benefit from linting. The first step, done by this commit, is to update the npm script and specify the unlinted files explicitly in .eslintignore (also removing unused ESLint exceptions from these files). Future commits will continue in this direction. --- .eslintignore | 5 +++++ cli/server/convertJsonSchemas.js | 2 +- cli/server/getDataset.js | 2 +- cli/view.js | 2 +- package.json | 4 ++-- scripts/extract-release-notes.js | 2 +- webpack.config.js | 2 +- 7 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.eslintignore b/.eslintignore index 3dddf3f67..6460be53e 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,7 @@ +cli/* dist/* +docs/* node_modules/* +scripts/* +test/* +webpack.config.js diff --git a/cli/server/convertJsonSchemas.js b/cli/server/convertJsonSchemas.js index a389f4738..e4a804828 100644 --- a/cli/server/convertJsonSchemas.js +++ b/cli/server/convertJsonSchemas.js @@ -169,7 +169,7 @@ const setAuthorInfoOnTree = (v2, meta) => { * The feature information was an object with properties `start`, `end` and `strand` */ const convertToGffFormat = (annotations) => { - for (const name in annotations) { // eslint-disable-line + for (const name in annotations) { // Convert from 0-based BED format to 1-based GFF format for start position annotations[name].start += 1; // half-open 0-based BED end position is the same as 1-based closed ended GFF position. diff --git a/cli/server/getDataset.js b/cli/server/getDataset.js index 1bc433166..a7965bee3 100644 --- a/cli/server/getDataset.js +++ b/cli/server/getDataset.js @@ -2,7 +2,7 @@ const getAvailable = require("./getAvailable"); const helpers = require("./getDatasetHelpers"); const setUpGetDatasetHandler = ({datasetsPath}) => { - return async (req, res) => { // eslint-disable-line consistent-return + return async (req, res) => { try { const availableDatasets = await getAvailable.getAvailableDatasets(datasetsPath); const info = helpers.interpretRequest(req, datasetsPath); diff --git a/cli/view.js b/cli/view.js index fa765333d..1aaf11552 100644 --- a/cli/view.js +++ b/cli/view.js @@ -45,7 +45,7 @@ const loadAndAddHandlers = ({app, handlersArg, datasetDir, narrativeDir}) => { if (handlersArg) { const handlersPath = path.resolve(handlersArg); utils.verbose(`Loading handlers from ${handlersPath}`); - const inject = require(handlersPath); // eslint-disable-line + const inject = require(handlersPath); handlers.getAvailable = inject.getAvailable; handlers.getDataset = inject.getDataset; handlers.getNarrative = inject.getNarrative; diff --git a/package.json b/package.json index 31600e638..4851161b3 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,8 @@ "server": "npm run view", "build": "node auspice.js build --verbose", "prepare": "npm run build", - "lint": "eslint src", - "lint:fix": "eslint --fix src", + "lint": "eslint .", + "lint:fix": "eslint --fix .", "get-data": "env bash ./scripts/get-data.sh", "heroku-postbuild": "npm run build && npm run get-data", "gzip-and-upload": "env bash ./scripts/gzip-and-upload.sh", diff --git a/scripts/extract-release-notes.js b/scripts/extract-release-notes.js index 9e4abc4c3..52d00fe69 100644 --- a/scripts/extract-release-notes.js +++ b/scripts/extract-release-notes.js @@ -24,7 +24,7 @@ function main() { releaseNotes.push(content[i]); } } - console.log(releaseNotes.join("\n")); // eslint-disable-line no-console + console.log(releaseNotes.join("\n")); } main(); diff --git a/webpack.config.js b/webpack.config.js index 5f24c84ab..26aef17f0 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -99,7 +99,7 @@ const generateConfig = ({extensionPath, devMode=false, customOutputPath, analyze ]; if (analyzeBundle) { - const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; // eslint-disable-line + const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; plugins.push(new BundleAnalyzerPlugin()); } From d5217e71967bd9964deb0b0f8a209a47e7399ede Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Thu, 13 Apr 2023 15:28:00 -0700 Subject: [PATCH 03/30] eslint: Remove stale comment This was added in 55f4842c8f4218f6a6a60b472bc7724a16330241 for context of where the initial rules came from. The rules have since deviated from the linked configuration file. --- .eslintrc | 1 - 1 file changed, 1 deletion(-) diff --git a/.eslintrc b/.eslintrc index f1db3eb25..85e94998d 100644 --- a/.eslintrc +++ b/.eslintrc @@ -103,4 +103,3 @@ env: es6: true browser: true jest: true -# https://gist.github.com/odedw/cf14a55aa154adbc3bf7#file-eslintrc-yaml-L4 From cbb40e53d51b0d10aa3a3fae88f3903fcd5089c0 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Fri, 21 Apr 2023 18:43:10 -0700 Subject: [PATCH 04/30] eslint: Add extension to config file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The extension-less configuration file name was deprecated more than 5 years ago¹, and the deprecation message is no longer present in the official documentation. Even though the extension-less file still works fine, the rename serves to keep up-to-date with documented formats and make it clear to some text editors that YAML is the format used in this file. ¹ https://dev.to/ohbarye/eslintrc-without-file-extension-is-deprecated-3ngg --- .eslintrc => .eslintrc.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .eslintrc => .eslintrc.yaml (100%) diff --git a/.eslintrc b/.eslintrc.yaml similarity index 100% rename from .eslintrc rename to .eslintrc.yaml From b3cedb712c1fdb38b4e6e759e2652376075ea0a6 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Fri, 21 Apr 2023 11:23:31 -0700 Subject: [PATCH 05/30] eslint: Replace Airbnb base config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Airbnb base config was presumably adopted early on with good intents, but over time the ESLint config file has become littered with overrides to disable many rules enabled by this base config. To me, it seems the main reason is that the Airbnb base config includes both code-quality rules and code-style rules, while we have chosen to ignore most code-style rules. The "recommended" base configs mostly¹ set code-quality rules. Using these as a replacement for the Airbnb base config means much of the rule overrides are no longer necessary. Note: some new overrides were added to avoid code changes. These will be addressed in subsequent commits. ¹ eslint:recommended enables `no-mixed-spaces-and-tabs`, which is probably fine. https://eslint.org/docs/latest/rules --- .eslintrc.yaml | 96 +-- package-lock.json | 740 +----------------- package.json | 3 - src/actions/loadData.js | 4 +- src/actions/navigation.js | 4 +- src/actions/recomputeReduxState.js | 10 +- src/actions/tree.js | 4 +- .../controls/choose-explode-attr.js | 2 +- src/components/controls/color-by.js | 2 +- src/components/controls/language.js | 2 +- src/components/controls/slider.js | 2 +- src/components/download/helperFunctions.js | 4 +- src/components/entropy/entropyD3.js | 4 +- src/components/framework/spinner.js | 2 +- src/components/framework/title.js | 2 +- src/components/info/datasetSummary.js | 8 +- src/components/markdownDisplay/index.js | 2 +- src/components/splash/splash.js | 2 +- src/components/tree/infoPanels/click.js | 2 +- src/components/tree/legend/legend.js | 2 +- src/components/tree/phyloTree/change.js | 2 +- src/components/tree/phyloTree/grid.js | 2 +- src/components/tree/phyloTree/renderers.js | 2 +- src/components/tree/tangle/index.js | 2 +- src/components/tree/tree.js | 2 +- src/index.js | 10 +- src/middleware/logActions.js | 2 +- src/reducers/narrative.js | 2 +- src/store/index.js | 8 +- src/util/colorScale.js | 2 +- src/util/entropy.js | 2 +- src/util/extensions.js | 2 +- src/util/getGenotype.js | 4 +- src/util/googleAnalytics.js | 2 +- src/util/parseNarrative.js | 2 +- src/util/treeMiscHelpers.js | 4 +- src/util/treeVisibilityHelpers.js | 2 +- 37 files changed, 74 insertions(+), 875 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 85e94998d..ae1b14d20 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -1,6 +1,11 @@ --- -extends: "airbnb" -plugins: ["react-hooks"] +extends: + - eslint:recommended + - plugin:react/recommended + - plugin:react-hooks/recommended +plugins: + - react + - react-hooks parser: "@babel/eslint-parser" globals: page: true @@ -9,91 +14,15 @@ globals: jestPuppeteer: true BASE_URL: true rules: - camelcase: off # require camel case names - prefer-template: off - object-shorthand: off - quotes: off # ', ", ` no one cares - max-len: off # be sensible - no-mixed-operators: off # allow 1 + 1 * 3 - no-confusing-arrow: off # allow (a) => a ? 1 : 2; - no-useless-constructor: off - no-nested-ternary: off - object-curly-spacing: off # allow { a: 1 } and {a: 1} - block-spacing: off # same as above for function blocks on a single line - dot-notation: off # allows someObject["a"] as well as someObject.a - comma-dangle: ["error", "never"] - padded-blocks: off - no-plusplus: off # we are old enought to use i++ - arrow-body-style: off - arrow-parens: ["error", "always"] # use brackets always, (a) => body // () => body // (a, b) => body - no-case-declarations: off # we don't surround case blocks with { } in our switch statements as we use fallthroughs deliberately - one-var: off - one-var-declaration-per-line: off - no-console: [1, { "allow": ["warn", "error"] }] - space-infix-ops: off - no-param-reassign: [1, { "props": false }] - no-underscore-dangle: off - no-unused-expressions: ['error', {"allowTernary": true }] - no-restricted-syntax: ['error', 'ForInStatement', 'WithStatement'] # allow ForOfStatement & LabeledStatement - class-methods-use-this: off - react/jsx-tag-spacing: ["error", { "closingSlash": "never", "beforeSelfClosing": "allow", "afterOpening": "never" }] - react/forbid-prop-types: off react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] - react/jsx-first-prop-new-line: off - react/no-did-mount-set-state: off - react/no-did-update-set-state: off - react/prop-types: off # possibly reinstate - react/sort-comp: off # possibly reinstate - jsx-a11y/no-static-element-interactions: off - jsx-a11y/anchor-has-content: off - jsx-a11y/heading-has-content: off - import/prefer-default-export: off - no-multi-spaces: ["error", { ignoreEOLComments: true }] - no-labels: off - no-unused-labels: off - no-continue: off - no-unneeded-ternary: ["error", { "defaultAssignment": true }] - quote-props: ["error", "as-needed"] - prefer-const: ["error", {"destructuring": "all"}] - indent: ["error", 2, {"MemberExpression": "off", "SwitchCase": 1}] - react-hooks/rules-of-hooks: "error" - react-hooks/exhaustive-deps: "warn" - object-curly-newline: off - operator-linebreak: ["error", "after", { "overrides": { "?": "ignore", ":": "ignore" } }] - react/destructuring-assignment: off - prefer-destructuring: off - implicit-arrow-linebreak: off - jsx-quotes: off - no-use-before-define: ["error", { "functions": false }] - no-return-await: off - # <<< These were enabled by extension and plugin upgrades in https://github.com/nextstrain/auspice/pull/1602. Disabling for now. - function-paren-newline: off - import/no-cycle: off - import/no-useless-path-segments: off - import/order: off - jsx-a11y/anchor-is-valid: off - jsx-a11y/click-events-have-key-events: off - lines-between-class-members: off - max-classes-per-file: off + no-case-declarations: off no-compare-neg-zero: off - no-else-return: off - no-multiple-empty-lines: off - no-restricted-globals: off + no-cond-assign: off + no-prototype-builtins: off no-unused-vars: off - prefer-object-spread: off - react/button-has-type: off - react/default-props-match-prop-types: off - react/jsx-closing-tag-location: off - react/jsx-curly-brace-presence: off - react/jsx-curly-newline: off - react/jsx-one-expression-per-line: off - react/jsx-props-no-spreading: off - react/jsx-wrap-multilines: off - react/no-access-state-in-setstate: off react/no-deprecated: off - react/no-unused-state: off - react/static-property-placement: off - # >>> + react/no-direct-mutation-state: off + react/prop-types: off parserOptions: ecmaVersion: 6 sourceType: module @@ -102,4 +31,5 @@ parserOptions: env: es6: true browser: true + node: true jest: true diff --git a/package-lock.json b/package-lock.json index d638b1929..3f58715d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -100,9 +100,6 @@ "chai": "^4.1.2", "chai-http": "^4.0.0", "eslint": "^7.5.0", - "eslint-config-airbnb": "^18.2.0", - "eslint-plugin-import": "^2.13.0", - "eslint-plugin-jsx-a11y": "^6.3.0", "eslint-plugin-react": "^7.2.1", "eslint-plugin-react-hooks": "^4.0.1", "jest": "^25.1.0", @@ -1699,19 +1696,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz", - "integrity": "sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ==", - "dev": true, - "dependencies": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", @@ -3007,12 +2991,6 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, "node_modules/@types/mime-types": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.1.tgz", @@ -3529,19 +3507,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -3627,23 +3592,6 @@ "node": ">=0.10.0" } }, - "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flatmap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", @@ -3954,12 +3902,6 @@ "node": ">=0.10.0" } }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, "node_modules/astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -4007,15 +3949,6 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, - "node_modules/axe-core": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.6.tgz", - "integrity": "sha512-LEUDjgmdJoA3LqklSTwKYqkjcZ4HKc4ddIYGSAiSkr46NTjzg2L9RNB+lekO9P7Dlpa87+hBtzc2Fzn/+GUWMQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", @@ -4025,12 +3958,6 @@ "follow-redirects": "^1.14.0" } }, - "node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, "node_modules/babel-jest": { "version": "25.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", @@ -5236,12 +5163,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, "node_modules/content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -5342,17 +5263,6 @@ "semver": "bin/semver.js" } }, - "node_modules/core-js-pure": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", - "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -5690,12 +5600,6 @@ "d3-transition": "1" } }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -6342,251 +6246,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-config-airbnb": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz", - "integrity": "sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==", - "dev": true, - "dependencies": { - "eslint-config-airbnb-base": "^14.2.0", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", - "eslint-plugin-import": "^2.21.2", - "eslint-plugin-jsx-a11y": "^6.3.0", - "eslint-plugin-react": "^7.20.0", - "eslint-plugin-react-hooks": "^4 || ^3 || ^2.3.0 || ^1.7.0" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", - "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.2" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", - "eslint-plugin-import": "^2.22.1" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", - "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0", - "pkg-dir": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.25.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz", - "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.1", - "has": "^1.0.3", - "is-core-module": "^2.8.0", - "is-glob": "^4.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.0.tgz", - "integrity": "sha512-tHSWX2jXlAaiI45YuEPi3KXJ7MihvQWUZMR9UNB4bUVYvAamwr6AwCm5dgOZOV2rC2qVMjBtjNshBE46n4IG6w==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.2", - "aria-query": "^4.2.0", - "array-includes": "^3.1.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^3.5.4", - "axobject-query": "^2.1.2", - "damerau-levenshtein": "^1.0.6", - "emoji-regex": "^9.0.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1", - "language-tags": "^1.0.5" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, "node_modules/eslint-plugin-react": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz", @@ -6616,15 +6275,15 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.1.tgz", - "integrity": "sha512-toTyfu0gFyZD9Ru3QEeVwfeK8T0lf31bZaknmbFRSDbiJdrzHKNBOh2NIwlepLLpvnhwMWWNbq3t+x0VoyQ1iw==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "dev": true, "engines": { "node": ">=10" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, "node_modules/eslint-plugin-react/node_modules/doctrine": { @@ -11888,19 +11547,6 @@ "verror": "1.10.0" } }, - "node_modules/jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" - }, - "engines": { - "node": ">=4.0" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -11919,21 +11565,6 @@ "node": ">=6" } }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dev": true, - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, "node_modules/lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -15706,15 +15337,6 @@ "node": ">=0.10.0" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -16269,30 +15891,6 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, - "node_modules/tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", @@ -18246,16 +17844,6 @@ "regenerator-runtime": "^0.13.4" } }, - "@babel/runtime-corejs3": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz", - "integrity": "sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ==", - "dev": true, - "requires": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - } - }, "@babel/template": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", @@ -19318,12 +18906,6 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, "@types/mime-types": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.1.tgz", @@ -19778,16 +19360,6 @@ "sprintf-js": "~1.0.2" } }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -19849,17 +19421,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - } - }, "array.prototype.flatmap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", @@ -20079,12 +19640,6 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -20120,12 +19675,6 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, - "axe-core": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.6.tgz", - "integrity": "sha512-LEUDjgmdJoA3LqklSTwKYqkjcZ4HKc4ddIYGSAiSkr46NTjzg2L9RNB+lekO9P7Dlpa87+hBtzc2Fzn/+GUWMQ==", - "dev": true - }, "axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", @@ -20135,12 +19684,6 @@ "follow-redirects": "^1.14.0" } }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, "babel-jest": { "version": "25.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", @@ -21091,12 +20634,6 @@ "typedarray": "^0.0.6" } }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -21174,12 +20711,6 @@ } } }, - "core-js-pure": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", - "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", - "dev": true - }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -21479,12 +21010,6 @@ "d3-transition": "1" } }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -22203,203 +21728,6 @@ } } }, - "eslint-config-airbnb": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz", - "integrity": "sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "^14.2.0", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2" - } - }, - "eslint-config-airbnb-base": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", - "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.2" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", - "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.25.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz", - "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.1", - "has": "^1.0.3", - "is-core-module": "^2.8.0", - "is-glob": "^4.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.0.tgz", - "integrity": "sha512-tHSWX2jXlAaiI45YuEPi3KXJ7MihvQWUZMR9UNB4bUVYvAamwr6AwCm5dgOZOV2rC2qVMjBtjNshBE46n4IG6w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "aria-query": "^4.2.0", - "array-includes": "^3.1.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^3.5.4", - "axobject-query": "^2.1.2", - "damerau-levenshtein": "^1.0.6", - "emoji-regex": "^9.0.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1", - "language-tags": "^1.0.5" - }, - "dependencies": { - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - } - } - }, "eslint-plugin-react": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz", @@ -22460,9 +21788,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.1.tgz", - "integrity": "sha512-toTyfu0gFyZD9Ru3QEeVwfeK8T0lf31bZaknmbFRSDbiJdrzHKNBOh2NIwlepLLpvnhwMWWNbq3t+x0VoyQ1iw==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "dev": true, "requires": {} }, @@ -26247,16 +25575,6 @@ "verror": "1.10.0" } }, - "jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" - } - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -26269,21 +25587,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dev": true, - "requires": { - "language-subtag-registry": "~0.3.2" - } - }, "lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -29231,12 +28534,6 @@ "ansi-regex": "^2.0.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -29657,29 +28954,6 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, - "tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", diff --git a/package.json b/package.json index 4851161b3..670cf8a37 100644 --- a/package.json +++ b/package.json @@ -125,9 +125,6 @@ "chai": "^4.1.2", "chai-http": "^4.0.0", "eslint": "^7.5.0", - "eslint-config-airbnb": "^18.2.0", - "eslint-plugin-import": "^2.13.0", - "eslint-plugin-jsx-a11y": "^6.3.0", "eslint-plugin-react": "^7.2.1", "eslint-plugin-react-hooks": "^4.0.1", "jest": "^25.1.0", diff --git a/src/actions/loadData.js b/src/actions/loadData.js index 3b01ec55e..de5d215a0 100644 --- a/src/actions/loadData.js +++ b/src/actions/loadData.js @@ -20,10 +20,10 @@ export function getDatasetNamesFromUrl(url) { const parts = url.replace(/^\//, '') .replace(/\/$/, '') .split(":"); - url = parts[0]; // eslint-disable-line no-param-reassign + url = parts[0]; secondTreeUrl = parts[1]; } - if (url.startsWith('/')) url = url.slice(1); // eslint-disable-line no-param-reassign + if (url.startsWith('/')) url = url.slice(1); if (secondTreeUrl && secondTreeUrl.startsWith('/')) { secondTreeUrl = secondTreeUrl.slice(1); } diff --git a/src/actions/navigation.js b/src/actions/navigation.js index 1221c77c9..04a43bd71 100644 --- a/src/actions/navigation.js +++ b/src/actions/navigation.js @@ -90,8 +90,8 @@ export const changePage = ({ const oldState = getState(); /* set some defaults */ - if (!path) path = window.location.pathname; // eslint-disable-line - if (!query) query = queryString.parse(window.location.search); // eslint-disable-line + if (!path) path = window.location.pathname; + if (!query) query = queryString.parse(window.location.search); /* some booleans */ const pathHasChanged = oldState.general.pathname !== path; diff --git a/src/actions/recomputeReduxState.js b/src/actions/recomputeReduxState.js index cdda54227..7d967c5f5 100644 --- a/src/actions/recomputeReduxState.js +++ b/src/actions/recomputeReduxState.js @@ -237,11 +237,11 @@ const modifyStateViaMetadata = (state, metadata) => { state.filters[genotypeSymbol] = []; // this doesn't necessitate that mutations are defined if (metadata.displayDefaults) { const keysToCheckFor = ["geoResolution", "colorBy", "distanceMeasure", "layout", "mapTriplicate", "selectedBranchLabel", 'sidebar', "showTransmissionLines", "normalizeFrequencies"]; - const expectedTypes = ["string", "string", "string", "string", "boolean", "string", 'string', "boolean" , "boolean"]; // eslint-disable-line + const expectedTypes = ["string", "string", "string", "string", "boolean", "string", 'string', "boolean" , "boolean"]; for (let i = 0; i < keysToCheckFor.length; i += 1) { if (Object.hasOwnProperty.call(metadata.displayDefaults, keysToCheckFor[i])) { - if (typeof metadata.displayDefaults[keysToCheckFor[i]] === expectedTypes[i]) { // eslint-disable-line valid-typeof + if (typeof metadata.displayDefaults[keysToCheckFor[i]] === expectedTypes[i]) { if (keysToCheckFor[i] === "sidebar") { if (metadata.displayDefaults[keysToCheckFor[i]] === "open") { state.defaults.sidebarOpen = true; @@ -627,7 +627,7 @@ const modifyTreeStateVisAndBranchThickness = (oldState, zoomSelected, controlsSt newState.stateCountAttrs = Object.keys(controlsState.filters); newState.idxOfInViewRootNode = newIdxRoot; newState.visibleStateCounts = countTraitsAcrossTree(newState.nodes, newState.stateCountAttrs, newState.visibility, true); - newState.totalStateCounts = countTraitsAcrossTree(newState.nodes, newState.stateCountAttrs, false, true); // eslint-disable-line + newState.totalStateCounts = countTraitsAcrossTree(newState.nodes, newState.stateCountAttrs, false, true); return newState; }; @@ -808,7 +808,7 @@ export const createStateFromQueryOrJSONs = ({ narrative = narrativeBlocks; narrativeSlideIdx = getNarrativePageFromQuery(query, narrative); /* replace the query with the information which can guide the view */ - query = queryString.parse(narrative[narrativeSlideIdx].query); // eslint-disable-line no-param-reassign + query = queryString.parse(narrative[narrativeSlideIdx].query); } controls = modifyStateViaURLQuery(controls, query); @@ -910,7 +910,7 @@ export const createStateFromQueryOrJSONs = ({ } /* if narratives then switch the query back to ?n= for display */ - if (narrativeBlocks) query = {n: narrativeSlideIdx}; // eslint-disable-line no-param-reassign + if (narrativeBlocks) query = {n: narrativeSlideIdx}; return {tree, treeToo, metadata, entropy, controls, narrative, frequencies, query}; }; diff --git a/src/actions/tree.js b/src/actions/tree.js index 498588ed7..fd2a8badf 100644 --- a/src/actions/tree.js +++ b/src/actions/tree.js @@ -74,7 +74,7 @@ export const updateVisibleTipsAndBranchThicknesses = ( const { tree, treeToo, controls, frequencies } = getState(); if (root[0] === undefined && !cladeSelected && tree.selectedClade) { /* if not resetting tree to root, maintain previous selectedClade if one exists */ - cladeSelected = tree.selectedClade; // eslint-disable-line no-param-reassign + cladeSelected = tree.selectedClade; } if (!tree.nodes) {return;} @@ -309,7 +309,7 @@ export const toggleTemporalConfidence = () => ({ */ const _resetExpodedTree = (nodes) => { nodes.forEach((n) => { - if (n.hasOwnProperty('unexplodedChildren')) { // eslint-disable-line + if (n.hasOwnProperty('unexplodedChildren')) { n.children = n.unexplodedChildren; n.hasChildren = true; delete n.unexplodedChildren; diff --git a/src/components/controls/choose-explode-attr.js b/src/components/controls/choose-explode-attr.js index ebd307513..8916d0148 100644 --- a/src/components/controls/choose-explode-attr.js +++ b/src/components/controls/choose-explode-attr.js @@ -24,7 +24,7 @@ class ChooseExplodeAttr extends React.Component { } gatherAttrs() { const options = Object.entries(this.props.available) - .filter(([key, value]) => value.type !== "continuous") // eslint-disable-line no-unused-vars + .filter(([key, value]) => value.type !== "continuous") .filter(([key]) => key !== "gt") .map(([key, value]) => ({value: key, label: value.title || key})); if (this.props.selected) { diff --git a/src/components/controls/color-by.js b/src/components/controls/color-by.js index 5170e4d24..c45f1222e 100644 --- a/src/components/controls/color-by.js +++ b/src/components/controls/color-by.js @@ -58,7 +58,7 @@ class ColorBy extends React.Component { // Applies the given state to the immutable blank state and replaces the // current state with the result. replaceState(state) { - this.setState((oldState, props) => this.newState(state)); // eslint-disable-line no-unused-vars + this.setState((oldState, props) => this.newState(state)); } newState(state) { diff --git a/src/components/controls/language.js b/src/components/controls/language.js index d7435ac68..48b529aa8 100644 --- a/src/components/controls/language.js +++ b/src/components/controls/language.js @@ -20,7 +20,7 @@ class Language extends React.Component { for (const ns of ["language", "sidebar", "translation"]) { if (!i18n.hasResourceBundle(lang, ns)) { try { - const res = await import(/* webpackMode: "lazy-once" */ `../../locales/${lang}/${ns}.json`); // eslint-disable-line + const res = await import(/* webpackMode: "lazy-once" */ `../../locales/${lang}/${ns}.json`); i18n.addResourceBundle(lang, ns, res.default); } catch (err) { console.error(`Language ${lang} not found!`); diff --git a/src/components/controls/slider.js b/src/components/controls/slider.js index 2181908dc..0160f9beb 100644 --- a/src/components/controls/slider.js +++ b/src/components/controls/slider.js @@ -110,7 +110,7 @@ function undoEnsureArray(x) { // TB: I tried to convert this to a proper "class Slider extends React.Component" // but ran into difficulties with this bindings in functions like _getMousePosition // So, leaving as createReactClass for the time being. -const Slider = createReactClass({ // eslint-disable-line react/prefer-es6-class +const Slider = createReactClass({ propTypes: { diff --git a/src/components/download/helperFunctions.js b/src/components/download/helperFunctions.js index f988f4182..f266d3c7b 100644 --- a/src/components/download/helperFunctions.js +++ b/src/components/download/helperFunctions.js @@ -445,7 +445,7 @@ const createBoundingDimensionsAndPositionPanels = (panels, panelLayout, numLines } /* add top&left padding */ - for (let key in panels) { // eslint-disable-line + for (let key in panels) { if (panels[key]) { panels[key].x += padding; panels[key].y += padding; @@ -535,7 +535,7 @@ const writeSVGPossiblyIncludingMap = (dispatch, filePrefix, panelsInDOM, panelLa /* logic for extracting the overall width etc */ const overallDimensions = createBoundingDimensionsAndPositionPanels(panels, panelLayout, textStrings.length); output.push(``); - for (let key in panels) { // eslint-disable-line + for (let key in panels) { if (panels[key]) { injectAsSVGStrings(output, key, panels[key]); // modifies output in place } diff --git a/src/components/entropy/entropyD3.js b/src/components/entropy/entropyD3.js index 1e2305a1e..cb60cfe83 100644 --- a/src/components/entropy/entropyD3.js +++ b/src/components/entropy/entropyD3.js @@ -218,7 +218,7 @@ EntropyChart.prototype._drawZoomGenes = function _drawZoomGenes(annotations) { /* draw the genes (annotations) */ EntropyChart.prototype._drawGenes = function _drawGenes(annotations) { const geneHeight = 20; - const readingFrameOffset = (frame) => 5; // eslint-disable-line no-unused-vars + const readingFrameOffset = (frame) => 5; const posInSequence = this.scales.xNav.domain()[1] - this.scales.xNav.domain()[0]; const strokeCol = posInSequence < 1e6 ? "white" : "black"; const startG = (d) => d.start > this.scales.xNav.domain()[0] ? this.scales.xNav(d.start) : this.offsets.x1; @@ -286,7 +286,7 @@ EntropyChart.prototype._drawBars = function _drawBars() { barWidth = (d) => this.scales.xMain(this._aaToNtCoord(d.prot, d.codon)+2.6) - this.scales.xMain(this._aaToNtCoord(d.prot, d.codon)); } } else { - if (posInView > 1000) { // eslint-disable-line no-lonely-if + if (posInView > 1000) { barWidth = 2; } else if (posInView > 250) { barWidth = 3; diff --git a/src/components/framework/spinner.js b/src/components/framework/spinner.js index 1467d7ea8..f100841e4 100644 --- a/src/components/framework/spinner.js +++ b/src/components/framework/spinner.js @@ -5,7 +5,7 @@ const nextstrainLogo = require("../../images/nextstrain-logo-small.png"); const Spinner = ({availableHeight=false}) => { if (!availableHeight) { - availableHeight = isNaN(window.innerHeight) ? window.clientHeight : window.innerHeight; // eslint-disable-line + availableHeight = isNaN(window.innerHeight) ? window.clientHeight : window.innerHeight; } const style = { marginTop: `${availableHeight / 2 - 100}px` diff --git a/src/components/framework/title.js b/src/components/framework/title.js index 5b4ce5a9e..651e99e92 100644 --- a/src/components/framework/title.js +++ b/src/components/framework/title.js @@ -39,7 +39,7 @@ class Title extends React.Component { const title = "nextstrain"; return title.split("").map((letter, i) => ( {letter} diff --git a/src/components/info/datasetSummary.js b/src/components/info/datasetSummary.js index 47eb9907f..01672c04b 100644 --- a/src/components/info/datasetSummary.js +++ b/src/components/info/datasetSummary.js @@ -9,12 +9,12 @@ const plurals = { export const pluralise = (word, n) => { if (n === 1) { - if (word === "authors") word = "author"; // eslint-disable-line + if (word === "authors") word = "author"; } else { - if (word in plurals) word = plurals[word]; // eslint-disable-line - if (word.slice(-1).toLowerCase() !== "s") word+="s"; // eslint-disable-line + if (word in plurals) word = plurals[word]; + if (word.slice(-1).toLowerCase() !== "s") word+="s"; } - word = word.replace(/_/g, " "); // eslint-disable-line + word = word.replace(/_/g, " "); return word; }; diff --git a/src/components/markdownDisplay/index.js b/src/components/markdownDisplay/index.js index 0737a04e8..26b7a95ff 100644 --- a/src/components/markdownDisplay/index.js +++ b/src/components/markdownDisplay/index.js @@ -12,7 +12,7 @@ export default function MarkdownDisplay({ mdstring, ...props }) { return (
); } diff --git a/src/components/splash/splash.js b/src/components/splash/splash.js index 23e2aff55..cfe77b45a 100644 --- a/src/components/splash/splash.js +++ b/src/components/splash/splash.js @@ -46,7 +46,7 @@ const SplashContent = ({available, browserDimensions, dispatch, errorMessage, ch alt="logo" width="102" src={ - require("../../images/logo-light.svg") // eslint-disable-line global-require + require("../../images/logo-light.svg") } /> diff --git a/src/components/tree/infoPanels/click.js b/src/components/tree/infoPanels/click.js index eff75e5f2..27c53a281 100644 --- a/src/components/tree/infoPanels/click.js +++ b/src/components/tree/infoPanels/click.js @@ -26,7 +26,7 @@ export const styles = { }; export const stopProp = (e) => { - if (!e) {e = window.event;} // eslint-disable-line no-param-reassign + if (!e) {e = window.event;} e.cancelBubble = true; if (e.stopPropagation) {e.stopPropagation();} }; diff --git a/src/components/tree/legend/legend.js b/src/components/tree/legend/legend.js index c2554c62a..fba71883d 100644 --- a/src/components/tree/legend/legend.js +++ b/src/components/tree/legend/legend.js @@ -135,7 +135,7 @@ class Legend extends React.Component { ) { return parseInt(label, 10); } - const [yyyy, mm, dd] = numericToCalendar(label).split('-'); // eslint-disable-line + const [yyyy, mm, dd] = numericToCalendar(label).split('-'); return `${months[mm]} ${yyyy}`; } return label; diff --git a/src/components/tree/phyloTree/change.js b/src/components/tree/phyloTree/change.js index 8a57335db..0f9acea3c 100644 --- a/src/components/tree/phyloTree/change.js +++ b/src/components/tree/phyloTree/change.js @@ -15,7 +15,7 @@ const updateNodesWithNewData = (nodes, newNodeProps) => { // let tmp = 0; nodes.forEach((d, i) => { d.update = false; - for (let key in newNodeProps) { // eslint-disable-line + for (let key in newNodeProps) { const val = newNodeProps[key][i]; if (val !== d[key]) { d[key] = val; diff --git a/src/components/tree/phyloTree/grid.js b/src/components/tree/phyloTree/grid.js index 43cfc3ff4..3451de7df 100644 --- a/src/components/tree/phyloTree/grid.js +++ b/src/components/tree/phyloTree/grid.js @@ -58,7 +58,7 @@ const calculateNumericGridSeparation = (range, minorTicks) => { /* make an informed guess of the step size to start with. E.g. 0.07 => step of 0.01, 70 => step size of 10 */ const logRange = Math.floor(Math.log10(range)); - let majorStep = Math.pow(10, logRange); // eslint-disable-line no-restricted-properties + let majorStep = Math.pow(10, logRange); if (range/majorStep < 2) { // if step > 0.5*range then make more fine-grained steps majorStep /= 5; } else if (range/majorStep <5) { // if step > 0.2*range then make more fine grained steps diff --git a/src/components/tree/phyloTree/renderers.js b/src/components/tree/phyloTree/renderers.js index 1e5e6f9de..ec291690f 100644 --- a/src/components/tree/phyloTree/renderers.js +++ b/src/components/tree/phyloTree/renderers.js @@ -150,7 +150,7 @@ export const getBranchVisibility = (d) => { * @param {obj} d node * @param {string} b branch type -- either "T" (tee) or "S" (stem) */ -export const strokeForBranch = (d, b) => { // eslint-disable-line +export const strokeForBranch = (d, b) => { /* Due to errors rendering gradients on SVG branches on some browsers/OSs which would cause the branches to not appear, we're falling back to the previous solution which doesn't use gradients. The commented code remains & hopefully a solution can be diff --git a/src/components/tree/tangle/index.js b/src/components/tree/tangle/index.js index c7df2a5a0..bb3fc43ea 100644 --- a/src/components/tree/tangle/index.js +++ b/src/components/tree/tangle/index.js @@ -30,7 +30,7 @@ class Tangle extends React.Component { ); } drawLines(props) { - if (!props) props = this.props; // eslint-disable-line + if (!props) props = this.props; const thickness = props.lookup.length > 750 ? 0.25 : props.lookup.length > 100 ? 0.5 : 1; select(this.d3ref).selectAll("*").remove(); const makeTipPath = makeTipPathGenerator(props); diff --git a/src/components/tree/tree.js b/src/components/tree/tree.js index e342a373a..8c25b7673 100644 --- a/src/components/tree/tree.js +++ b/src/components/tree/tree.js @@ -91,7 +91,7 @@ class Tree extends React.Component { if (this.tangleRef) this.tangleRef.drawLines(); } } else if (this.state.treeToo) { /* the tree hasn't just been swapped, but it does exist and may need updating */ - let unusedNewState; // eslint-disable-line + let unusedNewState; [unusedNewState, rightTreeUpdated] = changePhyloTreeViaPropsComparison(false, this.state.treeToo, prevProps, this.props); /* note, we don't incorporate unusedNewState into the state? why not? */ } diff --git a/src/index.js b/src/index.js index 9c3c6a623..5d756b7a9 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,5 @@ -/* eslint-disable import/first */ - /* P O L Y F I L L S */ -import "whatwg-fetch"; // eslint-disable-line +import "whatwg-fetch"; import "core-js"; import "regenerator-runtime"; import "css.escape"; @@ -26,7 +24,7 @@ import "./css/notifications.css"; import "./css/select.css"; /* FONTS */ -import 'typeface-lato'; // eslint-disable-line import/extensions +import 'typeface-lato'; const store = configureStore(); @@ -39,12 +37,12 @@ initialiseGoogleAnalyticsIfRequired(); i18n .use(initReactI18next) .init({ - resources: {}, // eslint-disable-line + resources: {}, lng: "en", fallbackLng: "en", /* To debug any errors w.r.t. i18n, swith the second `false` to `true` (and this can be kept even after deployment if needed) */ - debug: process.env.NODE_ENV === 'production' ? false : false, // eslint-disable-line + debug: process.env.NODE_ENV === 'production' ? false : false, interpolation: { escapeValue: false }, diff --git a/src/middleware/logActions.js b/src/middleware/logActions.js index fa33a94cb..97b710098 100644 --- a/src/middleware/logActions.js +++ b/src/middleware/logActions.js @@ -6,7 +6,7 @@ Disable / Enable via apply middleware in src/store/index.js // eslint-disable-next-line export const loggingMiddleware = (store) => (next) => (action) => { // const state = store.getState(); // this is "old" state, i.e. before the reducers have updated by this action - console.log("Action: ", action.type); // eslint-disable-line + console.log("Action: ", action.type); const result = next(action); // send action to other middleware / reducers return result; }; diff --git a/src/reducers/narrative.js b/src/reducers/narrative.js index 2145d3bd5..f161f0bce 100644 --- a/src/reducers/narrative.js +++ b/src/reducers/narrative.js @@ -28,7 +28,7 @@ const narrative = (state = { } return state; case types.URL_QUERY_CHANGE_WITH_COMPUTED_STATE: - if (action.query.hasOwnProperty("n")) { // eslint-disable-line + if (action.query.hasOwnProperty("n")) { return Object.assign({}, state, {blockIdx: action.query.n}); } return state; diff --git a/src/store/index.js b/src/store/index.js index 31560da01..a3f552b2f 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2,14 +2,14 @@ import { createStore, applyMiddleware, compose } from "redux"; import thunk from "redux-thunk"; import { changeURLMiddleware } from "../middleware/changeURL"; import rootReducer from "../reducers"; -import { loggingMiddleware } from "../middleware/logActions"; // eslint-disable-line no-unused-vars +import { loggingMiddleware } from "../middleware/logActions"; import { keepScatterplotStateInSync } from "../middleware/scatterplot"; const configureStore = (initialState) => { const middleware = [ thunk, keepScatterplotStateInSync, - changeURLMiddleware, // eslint-disable-line comma-dangle + changeURLMiddleware, // loggingMiddleware ]; const composedEnhancers = compose( @@ -18,9 +18,9 @@ const configureStore = (initialState) => { ); const store = createStore(rootReducer, initialState, composedEnhancers); if (process.env.NODE_ENV !== 'production' && module.hot) { - // console.log("hot reducer reload"); // eslint-disable-line + // console.log("hot reducer reload"); module.hot.accept('../reducers', () => { - const nextRootReducer = require('../reducers/index'); // eslint-disable-line global-require + const nextRootReducer = require('../reducers/index'); store.replaceReducer(nextRootReducer); }); } diff --git a/src/util/colorScale.js b/src/util/colorScale.js index b1f2d309a..e7ac1000e 100644 --- a/src/util/colorScale.js +++ b/src/util/colorScale.js @@ -221,7 +221,7 @@ function createContinuousScale(colorBy, providedScale, t1nodes, t2nodes, isTempo // console.log("making a continuous color scale for ", colorBy); if (colorBy==="num_date") { /* before numeric scales were a definable type, num_date was specified as continuous */ - isTemporal = true; // eslint-disable-line no-param-reassign + isTemporal = true; } let minMax; if (isTemporal) { diff --git a/src/util/entropy.js b/src/util/entropy.js index 0b0861945..45a2831c4 100644 --- a/src/util/entropy.js +++ b/src/util/entropy.js @@ -59,7 +59,7 @@ const calcMutationCounts = (nodes, visibility, geneMap, isAA) => { if (isAA) { const prots = Object.keys(sparse); for (let i = 0; i < prots.length; i++) { - for (const k in sparse[prots[i]]) { // eslint-disable-line + for (const k in sparse[prots[i]]) { const numK = parseInt(k, 10); if (sparse[prots[i]][numK] > m) {m = sparse[prots[i]][numK];} counts[j] = { diff --git a/src/util/extensions.js b/src/util/extensions.js index 515918410..6eafc77df 100644 --- a/src/util/extensions.js +++ b/src/util/extensions.js @@ -12,7 +12,7 @@ const registry = (() => { if (key.endsWith("Component")) { // console.log("loading component", key); /* "@extensions" is a webpack alias */ - extensions[key] = require(`@extensions/${extensions[key]}`).default; // eslint-disable-line + extensions[key] = require(`@extensions/${extensions[key]}`).default; } }); // console.log("extensions", extensions); diff --git a/src/util/getGenotype.js b/src/util/getGenotype.js index 99dcb144d..64e1d0a02 100644 --- a/src/util/getGenotype.js +++ b/src/util/getGenotype.js @@ -9,7 +9,7 @@ export const isColorByGenotype = (colorBy) => colorBy === "gt" || colorBy.starts */ export const encodeColorByGenotype = ({ gene, positions }) => { if (!gene) { - gene = nucleotide_gene; // eslint-disable-line no-param-reassign + gene = nucleotide_gene; } if (!positions || !positions.length) { @@ -42,7 +42,7 @@ export const decodeColorByGenotype = (colorBy, geneLengths) => { return null; } - const positions = decodePositions(encodedPositions, geneLength); // eslint-disable-line no-use-before-define + const positions = decodePositions(encodedPositions, geneLength); if (!positions.length) { console.error("decodeColorByGenotype failed: no valid positions", colorBy, encodedPositions, geneLength); diff --git a/src/util/googleAnalytics.js b/src/util/googleAnalytics.js index a4f6e5ed2..5b8f2e3bd 100644 --- a/src/util/googleAnalytics.js +++ b/src/util/googleAnalytics.js @@ -40,6 +40,6 @@ export const triggerOutboundEvent = async (address) => { else return; ReactGA.outboundLink( {label: address}, - () => console.log("outbound event triggered", address) // eslint-disable-line no-console + () => console.log("outbound event triggered", address) ); }; diff --git a/src/util/parseNarrative.js b/src/util/parseNarrative.js index 5dac28277..2a8f87341 100644 --- a/src/util/parseNarrative.js +++ b/src/util/parseNarrative.js @@ -114,7 +114,7 @@ function* parseNarrativeBody(markdown, fallbackDataset, markdownParser) { * slide's title (or the end of the document). */ let sibling; - while (sibling = slide.nextSibling) { // eslint-disable-line no-cond-assign + while (sibling = slide.nextSibling) { if (isTitle(sibling)) break; slide.appendChild(sibling); } diff --git a/src/util/treeMiscHelpers.js b/src/util/treeMiscHelpers.js index 4cc24ef02..9cd7cfaa0 100644 --- a/src/util/treeMiscHelpers.js +++ b/src/util/treeMiscHelpers.js @@ -96,8 +96,8 @@ function validateUrl(url) { if (url===undefined) return undefined; // urls are optional, so return early to avoid the console warning try { if (typeof url !== "string") throw new Error(); - if (url.startsWith("http_")) url = url.replace("http_", "http:"); // eslint-disable-line no-param-reassign - if (url.startsWith("https_")) url = url.replace("https_", "https:"); // eslint-disable-line no-param-reassign + if (url.startsWith("http_")) url = url.replace("http_", "http:"); + if (url.startsWith("https_")) url = url.replace("https_", "https:"); const urlObj = new URL(url); return urlObj.href; } catch (err) { diff --git a/src/util/treeVisibilityHelpers.js b/src/util/treeVisibilityHelpers.js index a16552b34..adbe272fe 100644 --- a/src/util/treeVisibilityHelpers.js +++ b/src/util/treeVisibilityHelpers.js @@ -287,7 +287,7 @@ function performGenotypeFilterMatch(filtered, filters, nodes) { // todo: the entropy view is sometimes broken after filtering by genotype, but this shouldn't be the case (we can filter by other traits which are homoplasic and it works) if (!filtered) { // happens if there are no other filters in play - filtered = Array.from({length: nodes.length}, () => true); // eslint-disable-line no-param-reassign + filtered = Array.from({length: nodes.length}, () => true); } const filterConstellationLong = createFilterConstellation(genotypeFilters); const nGt = filterConstellationLong.length; // Note: may not be the same as genotypeFilters.length From 7c42bc8a31ec4cb6d3ff2a2c0c3ee539c474dc27 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:24:31 -0700 Subject: [PATCH 06/30] Run ESLint on cli/, scripts/, test/ Files in these directories should be held to the same standards as files in src/. --- .eslintignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.eslintignore b/.eslintignore index 6460be53e..af4752078 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,7 +1,4 @@ -cli/* dist/* docs/* node_modules/* -scripts/* -test/* webpack.config.js From 103e527ff0d849369d185200d7fcff276fd295bc Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Fri, 21 Apr 2023 18:22:36 -0700 Subject: [PATCH 07/30] Upgrade to ESLint 8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I can no longer find ESLint 7 rules documentation on the official website¹. The upgrade doesn't introduce any breaking changes for current usage, and now (while going through rules) would be a good time to upgrade. This will make it easier to reference rule doc pages in subsequent commits. ¹ https://eslint.org/docs --- package-lock.json | 1518 +++++++++++++++++++++++++++------------------ package.json | 2 +- 2 files changed, 907 insertions(+), 613 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f58715d2..0d20bf63e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -99,7 +99,7 @@ "@babel/eslint-parser": "^7.16.3", "chai": "^4.1.2", "chai-http": "^4.0.0", - "eslint": "^7.5.0", + "eslint": "^8.39.0", "eslint-plugin-react": "^7.2.1", "eslint-plugin-react-hooks": "^4.0.1", "jest": "^25.1.0", @@ -1899,6 +1899,119 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, + "node_modules/@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, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.1", + "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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/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 + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/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, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -1957,6 +2070,39 @@ "react": "^16.14.0" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@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, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@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 + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2817,6 +2963,41 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@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, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@sideway/address": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", @@ -4156,21 +4337,6 @@ "node": ">=8" } }, - "node_modules/babel-plugin-macros/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/babel-plugin-macros/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -4188,14 +4354,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-macros/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", @@ -6033,27 +6191,6 @@ "node": ">=6" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/enquirer/node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", @@ -6194,53 +6331,57 @@ } }, "node_modules/eslint": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.5.0.tgz", - "integrity": "sha512-vlUP10xse9sWt9SGRtcr1LAC67BENcQMFeV+w5EvLEoFe3xJ8cF1Skd0msziRx/VMC+72B4DxreCE+OR12OA6Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", - "espree": "^7.2.0", - "esquery": "^1.2.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", + "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", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -6345,30 +6486,6 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -6402,6 +6519,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/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 + }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -6450,22 +6573,78 @@ "node": ">= 8" } }, + "node_modules/eslint/node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" @@ -6483,20 +6662,25 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/eslint/node_modules/is-path-inside": { + "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, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/eslint/node_modules/levn": { @@ -6512,16 +6696,19 @@ "node": ">= 0.8.0" } }, - "node_modules/eslint/node_modules/lru-cache": { + "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "p-locate": "^5.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/optionator": { @@ -6541,6 +6728,36 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -6559,30 +6776,6 @@ "node": ">= 0.8.0" } }, - "node_modules/eslint/node_modules/resolve-from": { - "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, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6616,18 +6809,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/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, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6652,6 +6833,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint/node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6668,38 +6861,32 @@ } }, "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -6715,9 +6902,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -7194,6 +7381,15 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "node_modules/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, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -7218,15 +7414,15 @@ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" }, "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "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, "dependencies": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=4" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/filesize": { @@ -7508,35 +7704,37 @@ } }, "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=4" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flat-cache/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "node_modules/follow-redirects": { @@ -7727,12 +7925,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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 - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -7863,15 +8055,15 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "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, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/glob-to-regexp": { @@ -7930,6 +8122,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -8328,14 +8526,29 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" } }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -8595,7 +8808,7 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -11352,6 +11565,16 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -11692,6 +11915,12 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, + "node_modules/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 + }, "node_modules/lodash.range": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/lodash.range/-/lodash.range-3.1.7.tgz", @@ -11942,9 +12171,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -13456,6 +13685,26 @@ "node": ">=0.10.0" } }, + "node_modules/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/quoted-printable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/quoted-printable/-/quoted-printable-1.0.1.tgz", @@ -13926,18 +14175,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", @@ -14178,6 +14415,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -14194,6 +14439,16 @@ "node": ">=0.12" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -14214,6 +14469,29 @@ "node": "6.* || >= 7.*" } }, + "node_modules/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -14577,29 +14855,6 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -15355,6 +15610,18 @@ "node": ">=6" } }, + "node_modules/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/style-loader": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.2.tgz", @@ -15483,71 +15750,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/table/node_modules/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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -16178,12 +16380,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/v8-to-istanbul": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", @@ -16678,18 +16874,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -16790,6 +16974,18 @@ "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } + }, + "node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { @@ -17995,25 +18191,103 @@ "csstype": "^3.0.2" } }, - "@emotion/sheet": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", - "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" - }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "@emotion/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" - }, - "@emotion/weak-memoize": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + "@emotion/sheet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", + "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "@emotion/utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" + }, + "@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + }, + "@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" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "dev": true + } + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.1", + "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 + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "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" + } + }, + "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 + } + } + }, + "@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "dev": true }, "@hapi/address": { "version": "2.1.4", @@ -18065,6 +18339,29 @@ "scheduler": "^0.19.1" } }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@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 + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -18730,6 +19027,32 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@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" + } + }, "@sideway/address": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", @@ -19843,15 +20166,6 @@ "yaml": "^1.7.2" } }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -19862,11 +20176,6 @@ "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" } } }, @@ -21361,23 +21670,6 @@ } } }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - } - } - }, "entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", @@ -21484,47 +21776,51 @@ } }, "eslint": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.5.0.tgz", - "integrity": "sha512-vlUP10xse9sWt9SGRtcr1LAC67BENcQMFeV+w5EvLEoFe3xJ8cF1Skd0msziRx/VMC+72B4DxreCE+OR12OA6Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", - "espree": "^7.2.0", - "esquery": "^1.2.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", + "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", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { "ansi-regex": { @@ -21542,6 +21838,12 @@ "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", @@ -21578,19 +21880,51 @@ "which": "^2.0.1" } }, + "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 + }, + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "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": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } }, "has-flag": { @@ -21599,14 +21933,19 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "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==", + "is-path-inside": { + "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 + }, + "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": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "argparse": "^2.0.1" } }, "levn": { @@ -21619,13 +21958,13 @@ "type-check": "~0.4.0" } }, - "lru-cache": { + "locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "yallist": "^4.0.0" + "p-locate": "^5.0.0" } }, "optionator": { @@ -21642,6 +21981,24 @@ "word-wrap": "^1.2.3" } }, + "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-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -21654,21 +22011,6 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "resolve-from": { - "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 - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -21693,12 +22035,6 @@ "ansi-regex": "^5.0.1" } }, - "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 - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -21717,6 +22053,12 @@ "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 + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -21803,23 +22145,6 @@ "estraverse": "^4.1.1" } }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -21827,26 +22152,20 @@ "dev": true }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.0" }, "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true } } @@ -21857,9 +22176,9 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -22262,6 +22581,15 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "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": { + "reusify": "^1.0.4" + } + }, "fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -22286,12 +22614,12 @@ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "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": "^2.0.1" + "flat-cache": "^3.0.4" } }, "filesize": { @@ -22512,20 +22840,19 @@ } }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "dependencies": { "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "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" @@ -22534,9 +22861,9 @@ } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "follow-redirects": { @@ -22666,12 +22993,6 @@ "functions-have-names": "^1.2.2" } }, - "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 - }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -22763,12 +23084,12 @@ } }, "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "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.1" + "is-glob": "^4.0.3" } }, "glob-to-regexp": { @@ -22820,6 +23141,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -23115,11 +23442,20 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "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==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -23313,7 +23649,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { @@ -25427,6 +25763,12 @@ } } }, + "js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -25689,6 +26031,12 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, + "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 + }, "lodash.range": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/lodash.range/-/lodash.range-3.1.7.tgz", @@ -25895,9 +26243,9 @@ } }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -27046,6 +27394,12 @@ "strict-uri-encode": "^1.0.0" } }, + "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 + }, "quoted-printable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/quoted-printable/-/quoted-printable-1.0.1.tgz", @@ -27406,12 +27760,6 @@ "define-properties": "^1.1.3" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, "regexpu-core": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", @@ -27601,6 +27949,11 @@ "path-parse": "^1.0.6" } }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -27613,6 +27966,12 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "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.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -27627,6 +27986,15 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, + "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": { + "queue-microtask": "^1.2.2" + } + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -27934,25 +28302,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - } - } - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -28546,6 +28895,12 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "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 + }, "style-loader": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.2.tgz", @@ -28655,58 +29010,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -29187,12 +29490,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==" }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "v8-to-istanbul": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", @@ -29593,15 +29890,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -29689,6 +29977,12 @@ "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } + }, + "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 670cf8a37..8473a5a9e 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "@babel/eslint-parser": "^7.16.3", "chai": "^4.1.2", "chai-http": "^4.0.0", - "eslint": "^7.5.0", + "eslint": "^8.39.0", "eslint-plugin-react": "^7.2.1", "eslint-plugin-react-hooks": "^4.0.1", "jest": "^25.1.0", From 3964bf97c437d1c165eb045d6527d091094a48fa Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Fri, 21 Apr 2023 18:56:28 -0700 Subject: [PATCH 08/30] Add whitespace for readability --- .eslintrc.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index ae1b14d20..62fb2cb51 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -3,16 +3,20 @@ extends: - eslint:recommended - plugin:react/recommended - plugin:react-hooks/recommended + plugins: - react - react-hooks + parser: "@babel/eslint-parser" + globals: page: true browser: true context: true jestPuppeteer: true BASE_URL: true + rules: react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] no-case-declarations: off @@ -23,11 +27,13 @@ rules: react/no-deprecated: off react/no-direct-mutation-state: off react/prop-types: off + parserOptions: ecmaVersion: 6 sourceType: module ecmaFeatures: modules: true + env: es6: true browser: true From 1e22f41aaf480cc6ce08d943b242c92d63acebff Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Fri, 21 Apr 2023 14:21:08 -0700 Subject: [PATCH 09/30] eslint: Address no-case-declarations violations Lexical declarations (let/const/etc.) are discouraged in case blocks since they are accessible to the entire switch block (unless scoped by curly brackets). None of the impacted declarations are currently used outside of their case block scopes, so all that's needed here is to add curly brackets. Rule doc page: https://eslint.org/docs/latest/rules/no-case-declarations --- .eslintrc.yaml | 1 - src/actions/tree.js | 3 ++- src/middleware/changeURL.js | 3 ++- src/reducers/controls.js | 11 +++++++---- src/reducers/general.js | 6 ++++-- src/reducers/metadata.js | 6 ++++-- src/reducers/tree.js | 3 ++- src/util/dateHelpers.js | 3 ++- 8 files changed, 23 insertions(+), 13 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 62fb2cb51..60563c9ab 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -19,7 +19,6 @@ globals: rules: react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] - no-case-declarations: off no-compare-neg-zero: off no-cond-assign: off no-prototype-builtins: off diff --git a/src/actions/tree.js b/src/actions/tree.js index fd2a8badf..d09945be9 100644 --- a/src/actions/tree.js +++ b/src/actions/tree.js @@ -269,7 +269,7 @@ export const applyFilter = (mode, trait, values) => { } break; case "remove": // fallthrough - case "inactivate": + case "inactivate": { if (currentlyFilteredTraits.indexOf(trait) === -1) { console.error(`trying to ${mode} values from an un-initialised filter!`); return; @@ -289,6 +289,7 @@ export const applyFilter = (mode, trait, values) => { } } break; + } default: console.error(`applyFilter called with invalid mode: ${mode}`); return; // don't dispatch diff --git a/src/middleware/changeURL.js b/src/middleware/changeURL.js index dfa33896b..105af27b9 100644 --- a/src/middleware/changeURL.js +++ b/src/middleware/changeURL.js @@ -174,7 +174,7 @@ export const changeURLMiddleware = (store) => (next) => (action) => { query.dmax = state.controls.dateMax === state.controls.absoluteDateMax ? undefined : state.controls.dateMax; } break; - case types.MIDDLEWARE_ONLY_ANIMATION_STARTED: + case types.MIDDLEWARE_ONLY_ANIMATION_STARTED: { /* animation started - format: start bound, end bound, loop 0|1, cumulative 0|1, speed in ms */ const a = numericToCalendar(window.NEXTSTRAIN.animationStartPoint); const b = numericToCalendar(window.NEXTSTRAIN.animationEndPoint); @@ -183,6 +183,7 @@ export const changeURLMiddleware = (store) => (next) => (action) => { const e = state.controls.mapAnimationDurationInMilliseconds; query.animate = `${a},${b},${c},${d},${e}`; break; + } case types.PAGE_CHANGE: if (action.query) { query = action.query; diff --git a/src/reducers/controls.js b/src/reducers/controls.js index 64825eaed..bb0378949 100644 --- a/src/reducers/controls.js +++ b/src/reducers/controls.js @@ -143,7 +143,7 @@ const Controls = (state = getDefaultControlsState(), action) => { on: false }) }); - case types.CHANGE_DISTANCE_MEASURE: + case types.CHANGE_DISTANCE_MEASURE: { const updatesToState = { distanceMeasure: action.data, branchLengthsToDisplay: state.branchLengthsToDisplay @@ -161,7 +161,8 @@ const Controls = (state = getDefaultControlsState(), action) => { }); } return Object.assign({}, state, updatesToState); - case types.CHANGE_DATES_VISIBILITY_THICKNESS: { + } + case types.CHANGE_DATES_VISIBILITY_THICKNESS: { const newDates = { quickdraw: action.quickdraw }; if (action.dateMin) { newDates.dateMin = action.dateMin; @@ -276,7 +277,7 @@ const Controls = (state = getDefaultControlsState(), action) => { return Object.assign({}, state, { sidebarOpen: action.value }); case types.TOGGLE_LEGEND: return Object.assign({}, state, { legendOpen: action.value }); - case types.ADD_EXTRA_METADATA: + case types.ADD_EXTRA_METADATA: { for (const colorBy of Object.keys(action.newColorings)) { state.filters[colorBy] = []; state.coloringsPresentOnTree.add(colorBy); @@ -292,9 +293,11 @@ const Controls = (state = getDefaultControlsState(), action) => { }; } return newState; - case types.UPDATE_VISIBILITY_AND_BRANCH_THICKNESS: + } + case types.UPDATE_VISIBILITY_AND_BRANCH_THICKNESS: { const colorScale = Object.assign({}, state.colorScale, { visibleLegendValues: action.visibleLegendValues }); return Object.assign({}, state, { colorScale: colorScale }); + } case types.TOGGLE_TRANSMISSION_LINES: return Object.assign({}, state, { showTransmissionLines: action.data }); diff --git a/src/reducers/general.js b/src/reducers/general.js index 09a799302..02b922b41 100644 --- a/src/reducers/general.js +++ b/src/reducers/general.js @@ -29,7 +29,7 @@ const general = (state = { language: query.lang ? query.lang : defaults.language }, action) => { switch (action.type) { - case types.PAGE_CHANGE: + case types.PAGE_CHANGE: { const stateUpdate = { displayComponent: action.displayComponent, errorMessage: action.errorMessage @@ -38,6 +38,7 @@ const general = (state = { stateUpdate.pathname = action.path; } return Object.assign({}, state, stateUpdate); + } case types.UPDATE_PATHNAME: return Object.assign({}, state, { pathname: action.pathname @@ -46,12 +47,13 @@ const general = (state = { return Object.assign({}, state, { language: action.data }); - case types.CLEAN_START: + case types.CLEAN_START: { const defaultLanguage = action.metadata.displayDefaults["language"] || defaults.language; return Object.assign({}, state, { defaults: Object.assign({}, state.defaults, {language: defaultLanguage}), language: query.lang ? query.lang : defaultLanguage }); + } default: return state; } diff --git a/src/reducers/metadata.js b/src/reducers/metadata.js index 73262dbea..959fe89f7 100644 --- a/src/reducers/metadata.js +++ b/src/reducers/metadata.js @@ -20,7 +20,7 @@ const Metadata = (state = { case types.URL_QUERY_CHANGE_WITH_COMPUTED_STATE: case types.CLEAN_START: return action.metadata; - case types.ADD_EXTRA_METADATA: + case types.ADD_EXTRA_METADATA: { const colorings = Object.assign({}, state.colorings, action.newColorings); let geoResolutions = state.geoResolutions; if (action.newGeoResolution) { @@ -28,7 +28,8 @@ const Metadata = (state = { else geoResolutions = [...geoResolutions, action.newGeoResolution]; } return Object.assign({}, state, {colorings, geoResolutions}); - case types.SET_AVAILABLE: + } + case types.SET_AVAILABLE: { if (state.buildUrl) { return state; // do not use data from getAvailable to overwrite a buildUrl set from a dataset JSON } @@ -37,6 +38,7 @@ const Metadata = (state = { return Object.assign({}, state, {buildUrl}); } return state; + } case types.SET_ROOT_SEQUENCE: return {...state, rootSequence: action.data}; default: diff --git a/src/reducers/tree.js b/src/reducers/tree.js index eb1ed6d74..34e04968f 100644 --- a/src/reducers/tree.js +++ b/src/reducers/tree.js @@ -42,7 +42,7 @@ const Tree = (state = getDefaultTreeState(), action) => { }); case types.CHANGE_EXPLODE_ATTR: /* fallthrough */ case types.CHANGE_DATES_VISIBILITY_THICKNESS: /* fallthrough */ - case types.UPDATE_VISIBILITY_AND_BRANCH_THICKNESS: + case types.UPDATE_VISIBILITY_AND_BRANCH_THICKNESS: { const newStates = { visibility: action.visibility, visibilityVersion: action.visibilityVersion, @@ -56,6 +56,7 @@ const Tree = (state = getDefaultTreeState(), action) => { selectedStrain: action.selectedStrain }; return Object.assign({}, state, newStates); + } case types.UPDATE_TIP_RADII: return Object.assign({}, state, { tipRadii: action.data, diff --git a/src/util/dateHelpers.js b/src/util/dateHelpers.js index 77b5a9727..dd2d6b550 100644 --- a/src/util/dateHelpers.js +++ b/src/util/dateHelpers.js @@ -87,11 +87,12 @@ export const getPreviousDate = (unit, date) => { switch (unit) { case "DAY": return dateClone; - case "WEEK": + case "WEEK": { const dayIdx = date.getDay(); // 0 is sunday if (dayIdx===1) return dateClone; dateClone.setDate(date.getDate() + (8-dayIdx)%7 - 7); return dateClone; + } case "MONTH": if (date.getDate()===1) return dateClone; // i.e. 1st of the month return new Date(date.getFullYear(), date.getMonth(), 1, 12); From 94bea96447e69c27da61597c942ca8b8d3110f3b Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Fri, 21 Apr 2023 17:45:24 -0700 Subject: [PATCH 10/30] eslint: Address no-compare-neg-zero violations This is scoped to usages of the same pattern in one file. Two options: 1. Ignore the lines explicitly rather than across the whole project. 2. Apply the alternative from the rule doc page. Going with (2) since it seems reasonable. Also added a link to the actual bug since it took some time to dig that up. Rule doc page: https://eslint.org/docs/latest/rules/no-compare-neg-zero --- .eslintrc.yaml | 1 - src/util/colorScale.js | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 60563c9ab..4a1038d56 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -19,7 +19,6 @@ globals: rules: react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] - no-compare-neg-zero: off no-cond-assign: off no-prototype-builtins: off no-unused-vars: off diff --git a/src/util/colorScale.js b/src/util/colorScale.js index e7ac1000e..224e097ae 100644 --- a/src/util/colorScale.js +++ b/src/util/colorScale.js @@ -203,7 +203,8 @@ function createOrdinalScale(colorBy, t1nodes, t2nodes) { const spread = minMax[1] - minMax[0]; const dp = spread > 5 ? 2 : 3; legendValues = genericDomain.map((d) => parseFloat((minMax[0] + d*spread).toFixed(dp))); - if (legendValues[0] === -0) legendValues[0] = 0; /* hack to avoid bugs */ + // Hack to avoid a bug: https://github.com/nextstrain/auspice/issues/540 + if (Object.is(legendValues[0], -0)) legendValues[0] = 0; legendBounds = createLegendBounds(legendValues); } } else { @@ -282,7 +283,8 @@ function createContinuousScale(colorBy, providedScale, t1nodes, t2nodes, isTempo .map((d) => parseFloat((minMax[0] + d*spread).toFixed(dp))) .filter((el, idx, values) => values.indexOf(el)===idx); } - if (legendValues[0] === -0) legendValues[0] = 0; /* hack to avoid bugs */ + // Hack to avoid a bug: https://github.com/nextstrain/auspice/issues/540 + if (Object.is(legendValues[0], -0)) legendValues[0] = 0; return { continuous: true, From 0b84281dd8c49f1d658f0bb31e9254382b163a11 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Fri, 21 Apr 2023 17:55:38 -0700 Subject: [PATCH 11/30] eslint: Address no-cond-assign violations There is just one, which can be wrapped in parentheses to make it valid. Rule doc page: https://eslint.org/docs/latest/rules/no-cond-assign --- .eslintrc.yaml | 1 - src/util/parseNarrative.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 4a1038d56..1ccefa545 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -19,7 +19,6 @@ globals: rules: react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] - no-cond-assign: off no-prototype-builtins: off no-unused-vars: off react/no-deprecated: off diff --git a/src/util/parseNarrative.js b/src/util/parseNarrative.js index 2a8f87341..d426a35a7 100644 --- a/src/util/parseNarrative.js +++ b/src/util/parseNarrative.js @@ -114,7 +114,7 @@ function* parseNarrativeBody(markdown, fallbackDataset, markdownParser) { * slide's title (or the end of the document). */ let sibling; - while (sibling = slide.nextSibling) { + while ((sibling = slide.nextSibling)) { if (isTitle(sibling)) break; slide.appendChild(sibling); } From b0809d301cfd446aab69089def3235c4b9ed392f Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Fri, 21 Apr 2023 18:02:09 -0700 Subject: [PATCH 12/30] eslint: Address no-prototype-builtins violations The recommendation to use `Object.prototype.hasOwnProperty.call()` is already used elsewhere in this codebase, so I assume these deviations were due to unintentional oversight. Rule doc page: https://eslint.org/docs/latest/rules/no-prototype-builtins --- .eslintrc.yaml | 1 - src/actions/tree.js | 2 +- src/reducers/narrative.js | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 1ccefa545..5be0f8a5a 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -19,7 +19,6 @@ globals: rules: react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] - no-prototype-builtins: off no-unused-vars: off react/no-deprecated: off react/no-direct-mutation-state: off diff --git a/src/actions/tree.js b/src/actions/tree.js index d09945be9..bdce4fa83 100644 --- a/src/actions/tree.js +++ b/src/actions/tree.js @@ -310,7 +310,7 @@ export const toggleTemporalConfidence = () => ({ */ const _resetExpodedTree = (nodes) => { nodes.forEach((n) => { - if (n.hasOwnProperty('unexplodedChildren')) { + if (Object.prototype.hasOwnProperty.call(n, 'unexplodedChildren')) { n.children = n.unexplodedChildren; n.hasChildren = true; delete n.unexplodedChildren; diff --git a/src/reducers/narrative.js b/src/reducers/narrative.js index f161f0bce..935f81f29 100644 --- a/src/reducers/narrative.js +++ b/src/reducers/narrative.js @@ -28,7 +28,7 @@ const narrative = (state = { } return state; case types.URL_QUERY_CHANGE_WITH_COMPUTED_STATE: - if (action.query.hasOwnProperty("n")) { + if (Object.prototype.hasOwnProperty.call(action.query, "n")) { return Object.assign({}, state, {blockIdx: action.query.n}); } return state; From f8bca60c5cc03fc18a657b5214e3652681d4bc2d Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:34:11 -0700 Subject: [PATCH 13/30] eslint: Partially address no-unused-vars violations Since the existing unused variables have somewhat meaningful names, add underscores to these names and configure the rule to allow underscore-prefixed names to be unused. This commit does not address unused imports and functions - those are temporarily disabled by line and will be addressed in following commits. --- .eslintrc.yaml | 2 +- cli/server/getNarrative.js | 2 +- cli/utils.js | 2 +- src/components/controls/choose-explode-attr.js | 2 +- src/components/controls/color-by.js | 2 +- src/components/entropy/entropyD3.js | 2 +- src/components/tree/legend/legend.js | 2 +- src/components/tree/phyloTree/renderers.js | 2 +- src/components/tree/tree.js | 6 +++--- src/store/index.js | 2 +- test/request_urls.js | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 5be0f8a5a..43e5943a8 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -19,7 +19,7 @@ globals: rules: react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] - no-unused-vars: off + no-unused-vars: ["error", { "argsIgnorePattern": "^_", "destructuredArrayIgnorePattern": "^_" }] react/no-deprecated: off react/no-direct-mutation-state: off react/prop-types: off diff --git a/cli/server/getNarrative.js b/cli/server/getNarrative.js index f66dfdda1..75b1b2cf1 100644 --- a/cli/server/getNarrative.js +++ b/cli/server/getNarrative.js @@ -2,7 +2,7 @@ const queryString = require("query-string"); const path = require("path"); const fs = require("fs"); const utils = require("../utils"); -const marked = require('marked'); +const marked = require('marked'); // eslint-disable-line no-unused-vars const setUpGetNarrativeHandler = ({narrativesPath}) => { return async (req, res) => { diff --git a/cli/utils.js b/cli/utils.js index 90c696523..5c6215c43 100644 --- a/cli/utils.js +++ b/cli/utils.js @@ -2,7 +2,7 @@ const fs = require('fs'); const chalk = require('chalk'); const path = require("path"); -const fetch = require('node-fetch'); +const fetch = require('node-fetch'); // eslint-disable-line no-unused-vars const verbose = (msg) => { if (global.AUSPICE_VERBOSE) { diff --git a/src/components/controls/choose-explode-attr.js b/src/components/controls/choose-explode-attr.js index 8916d0148..db201a08e 100644 --- a/src/components/controls/choose-explode-attr.js +++ b/src/components/controls/choose-explode-attr.js @@ -24,7 +24,7 @@ class ChooseExplodeAttr extends React.Component { } gatherAttrs() { const options = Object.entries(this.props.available) - .filter(([key, value]) => value.type !== "continuous") + .filter(([_key, value]) => value.type !== "continuous") .filter(([key]) => key !== "gt") .map(([key, value]) => ({value: key, label: value.title || key})); if (this.props.selected) { diff --git a/src/components/controls/color-by.js b/src/components/controls/color-by.js index c45f1222e..43f3240e1 100644 --- a/src/components/controls/color-by.js +++ b/src/components/controls/color-by.js @@ -58,7 +58,7 @@ class ColorBy extends React.Component { // Applies the given state to the immutable blank state and replaces the // current state with the result. replaceState(state) { - this.setState((oldState, props) => this.newState(state)); + this.setState((_oldState, _props) => this.newState(state)); } newState(state) { diff --git a/src/components/entropy/entropyD3.js b/src/components/entropy/entropyD3.js index cb60cfe83..30e3621fd 100644 --- a/src/components/entropy/entropyD3.js +++ b/src/components/entropy/entropyD3.js @@ -218,7 +218,7 @@ EntropyChart.prototype._drawZoomGenes = function _drawZoomGenes(annotations) { /* draw the genes (annotations) */ EntropyChart.prototype._drawGenes = function _drawGenes(annotations) { const geneHeight = 20; - const readingFrameOffset = (frame) => 5; + const readingFrameOffset = (_frame) => 5; const posInSequence = this.scales.xNav.domain()[1] - this.scales.xNav.domain()[0]; const strokeCol = posInSequence < 1e6 ? "white" : "black"; const startG = (d) => d.start > this.scales.xNav.domain()[0] ? this.scales.xNav(d.start) : this.offsets.x1; diff --git a/src/components/tree/legend/legend.js b/src/components/tree/legend/legend.js index fba71883d..6bc7358af 100644 --- a/src/components/tree/legend/legend.js +++ b/src/components/tree/legend/legend.js @@ -135,7 +135,7 @@ class Legend extends React.Component { ) { return parseInt(label, 10); } - const [yyyy, mm, dd] = numericToCalendar(label).split('-'); + const [yyyy, mm, _dd] = numericToCalendar(label).split('-'); return `${months[mm]} ${yyyy}`; } return label; diff --git a/src/components/tree/phyloTree/renderers.js b/src/components/tree/phyloTree/renderers.js index ec291690f..eb3503907 100644 --- a/src/components/tree/phyloTree/renderers.js +++ b/src/components/tree/phyloTree/renderers.js @@ -150,7 +150,7 @@ export const getBranchVisibility = (d) => { * @param {obj} d node * @param {string} b branch type -- either "T" (tee) or "S" (stem) */ -export const strokeForBranch = (d, b) => { +export const strokeForBranch = (d, _b) => { /* Due to errors rendering gradients on SVG branches on some browsers/OSs which would cause the branches to not appear, we're falling back to the previous solution which doesn't use gradients. The commented code remains & hopefully a solution can be diff --git a/src/components/tree/tree.js b/src/components/tree/tree.js index 8c25b7673..e89b96c55 100644 --- a/src/components/tree/tree.js +++ b/src/components/tree/tree.js @@ -91,9 +91,9 @@ class Tree extends React.Component { if (this.tangleRef) this.tangleRef.drawLines(); } } else if (this.state.treeToo) { /* the tree hasn't just been swapped, but it does exist and may need updating */ - let unusedNewState; - [unusedNewState, rightTreeUpdated] = changePhyloTreeViaPropsComparison(false, this.state.treeToo, prevProps, this.props); - /* note, we don't incorporate unusedNewState into the state? why not? */ + let _unusedNewState; + [_unusedNewState, rightTreeUpdated] = changePhyloTreeViaPropsComparison(false, this.state.treeToo, prevProps, this.props); + /* note, we don't incorporate _unusedNewState into the state? why not? */ } /* we may need to (imperatively) tell the tangle to redraw */ diff --git a/src/store/index.js b/src/store/index.js index a3f552b2f..7358cfe6e 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2,7 +2,7 @@ import { createStore, applyMiddleware, compose } from "redux"; import thunk from "redux-thunk"; import { changeURLMiddleware } from "../middleware/changeURL"; import rootReducer from "../reducers"; -import { loggingMiddleware } from "../middleware/logActions"; +import { loggingMiddleware } from "../middleware/logActions"; // eslint-disable-line no-unused-vars import { keepScatterplotStateInSync } from "../middleware/scatterplot"; const configureStore = (initialState) => { diff --git a/test/request_urls.js b/test/request_urls.js index 650d55eec..8688b9846 100644 --- a/test/request_urls.js +++ b/test/request_urls.js @@ -9,7 +9,7 @@ chai.use(require('chai-http')); const expect = chai.expect; -const isValidJSONCallback = (url) => { +const isValidJSONCallback = (url) => { // eslint-disable-line no-unused-vars return (done) => { chai.request(url) .get('') From 98ae4d9c54f94d41c7ca7dcebc8e6bbb2abf2af9 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:37:17 -0700 Subject: [PATCH 14/30] Remove unused node-fetch import node-fetch is no longer necessary as a direct dependency. Move it to devDependencies since it is still used in a test. --- cli/utils.js | 1 - package-lock.json | 2 +- package.json | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cli/utils.js b/cli/utils.js index 5c6215c43..ea27efa46 100644 --- a/cli/utils.js +++ b/cli/utils.js @@ -2,7 +2,6 @@ const fs = require('fs'); const chalk = require('chalk'); const path = require("path"); -const fetch = require('node-fetch'); // eslint-disable-line no-unused-vars const verbose = (msg) => { if (global.AUSPICE_VERBOSE) { diff --git a/package-lock.json b/package-lock.json index 0d20bf63e..806189fc5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,7 +59,6 @@ "lodash-webpack-plugin": "^0.11.6", "marked": "^0.7.0", "mousetrap": "^1.6.2", - "node-fetch": "^2.6.1", "null-loader": "^4.0.0", "outer-product": "0.0.4", "papaparse": "^5.3.1", @@ -106,6 +105,7 @@ "jest-circus": "^25.3.0", "jest-image-snapshot": "^3.0.1", "jest-puppeteer": "^4.4.0", + "node-fetch": "^2.6.1", "puppeteer": "^2.1.1", "quoted-printable": "^1.0.1", "start-server-and-test": "^1.14.0" diff --git a/package.json b/package.json index 8473a5a9e..6f72b89c2 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,6 @@ "lodash-webpack-plugin": "^0.11.6", "marked": "^0.7.0", "mousetrap": "^1.6.2", - "node-fetch": "^2.6.1", "null-loader": "^4.0.0", "outer-product": "0.0.4", "papaparse": "^5.3.1", @@ -131,6 +130,7 @@ "jest-circus": "^25.3.0", "jest-image-snapshot": "^3.0.1", "jest-puppeteer": "^4.4.0", + "node-fetch": "^2.6.1", "puppeteer": "^2.1.1", "quoted-printable": "^1.0.1", "start-server-and-test": "^1.14.0" From 57769cfa83b51742b60e0d441fc08944631c30fb Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:40:02 -0700 Subject: [PATCH 15/30] Remove unused marked import Keep the direct dependency since it is still used in src/util/parseMarkdown.js. --- cli/server/getNarrative.js | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/server/getNarrative.js b/cli/server/getNarrative.js index 75b1b2cf1..e3112bdc6 100644 --- a/cli/server/getNarrative.js +++ b/cli/server/getNarrative.js @@ -2,7 +2,6 @@ const queryString = require("query-string"); const path = require("path"); const fs = require("fs"); const utils = require("../utils"); -const marked = require('marked'); // eslint-disable-line no-unused-vars const setUpGetNarrativeHandler = ({narrativesPath}) => { return async (req, res) => { From c9cea8d229389628a4384f95967050d1a7aa424e Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:42:36 -0700 Subject: [PATCH 16/30] Remove unused function isValidJSONCallback The only usage was removed in a7bfd624a6b302f348b828eae5c533a00c6dc160. --- test/request_urls.js | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/test/request_urls.js b/test/request_urls.js index 8688b9846..8b96b1d0f 100644 --- a/test/request_urls.js +++ b/test/request_urls.js @@ -9,19 +9,6 @@ chai.use(require('chai-http')); const expect = chai.expect; -const isValidJSONCallback = (url) => { // eslint-disable-line no-unused-vars - return (done) => { - chai.request(url) - .get('') - .end((err, res) => { - expect(err).to.be.null; - expect(res).to.have.status(200); - expect(res).to.be.json; - done(); - }); - }; -}; - const isValidURLCallback = (url) => { return (done) => { chai.request(url) From 53dc6aaf4fe41fa66227b7c9444e565c7f698130 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Fri, 21 Apr 2023 19:00:19 -0700 Subject: [PATCH 17/30] eslint: Address react/no-deprecated violations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are better ways to address these (componentWillMount¹, componentWillReceiveProps²). I opted for the rename to avoid complex code changes. ¹ https://legacy.reactjs.org/docs/react-component.html#unsafe_componentwillmount ² https://legacy.reactjs.org/docs/react-component.html#unsafe_componentwillreceiveprops --- .eslintrc.yaml | 1 - src/components/controls/color-by.js | 2 +- src/components/controls/language.js | 2 +- src/components/controls/slider.js | 2 +- src/components/datasetLoader/index.js | 2 +- src/components/entropy/index.js | 2 +- src/components/frequencies/index.js | 2 +- src/components/main/index.js | 2 +- src/components/map/map.js | 6 +++--- src/components/tree/tangle/index.js | 2 +- 10 files changed, 11 insertions(+), 12 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 43e5943a8..22369a271 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -20,7 +20,6 @@ globals: rules: react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] no-unused-vars: ["error", { "argsIgnorePattern": "^_", "destructuredArrayIgnorePattern": "^_" }] - react/no-deprecated: off react/no-direct-mutation-state: off react/prop-types: off diff --git a/src/components/controls/color-by.js b/src/components/controls/color-by.js index 43f3240e1..9a5599a9b 100644 --- a/src/components/controls/color-by.js +++ b/src/components/controls/color-by.js @@ -69,7 +69,7 @@ class ColorBy extends React.Component { } // State from the outside world enters via props. - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { if (this.props.colorBy !== nextProps.colorBy) { if (isColorByGenotype(nextProps.colorBy)) { const genotype = decodeColorByGenotype(nextProps.colorBy); diff --git a/src/components/controls/language.js b/src/components/controls/language.js index 48b529aa8..e1d163eda 100644 --- a/src/components/controls/language.js +++ b/src/components/controls/language.js @@ -29,7 +29,7 @@ class Language extends React.Component { } } - async componentWillMount() { + async UNSAFE_componentWillMount() { if (!this.props.language || this.props.language === "en") return; await this.ensureLanguageResources(this.props.language); i18n.changeLanguage(this.props.language); diff --git a/src/components/controls/slider.js b/src/components/controls/slider.js index 0160f9beb..e5583e034 100644 --- a/src/components/controls/slider.js +++ b/src/components/controls/slider.js @@ -281,7 +281,7 @@ const Slider = createReactClass({ // Keep the internal `value` consistent with an outside `value` if present. // This basically allows the slider to be a controlled component. - componentWillReceiveProps(newProps) { + UNSAFE_componentWillReceiveProps(newProps) { const value = this._or(ensureArray(newProps.value), this.state.value); // ensure the array keeps the same size as `value` diff --git a/src/components/datasetLoader/index.js b/src/components/datasetLoader/index.js index 5af1ed4e4..7950b2a7f 100644 --- a/src/components/datasetLoader/index.js +++ b/src/components/datasetLoader/index.js @@ -12,7 +12,7 @@ class DatasetLoader extends React.Component { constructor(props) { super(props); } - componentWillMount() { + UNSAFE_componentWillMount() { this.props.dispatch(loadJSONs()); // choose via URL this.props.dispatch({type: PAGE_CHANGE, displayComponent: "main"}); } diff --git a/src/components/entropy/index.js b/src/components/entropy/index.js index 67345948d..353683237 100644 --- a/src/components/entropy/index.js +++ b/src/components/entropy/index.js @@ -182,7 +182,7 @@ class Entropy extends React.Component { this.setUp(this.props); } } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { if (!nextProps.loaded) { this.setState({chart: false}); } diff --git a/src/components/frequencies/index.js b/src/components/frequencies/index.js index 3aa4833fe..276712e1e 100644 --- a/src/components/frequencies/index.js +++ b/src/components/frequencies/index.js @@ -78,7 +78,7 @@ class Frequencies extends React.Component { } this.setState(newState); } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { if (this.props.version === nextProps.version) { // no-op } else if (!this.props.loaded && nextProps.loaded) { diff --git a/src/components/main/index.js b/src/components/main/index.js index 3f2aee5a9..2b7a8ca77 100644 --- a/src/components/main/index.js +++ b/src/components/main/index.js @@ -74,7 +74,7 @@ class Main extends React.Component { static propTypes = { dispatch: PropTypes.func.isRequired } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { if (this.state.showSpinner && nextProps.metadataLoaded && nextProps.treeLoaded) { this.setState({showSpinner: false}); } diff --git a/src/components/map/map.js b/src/components/map/map.js index 699000333..a1a1e3485 100644 --- a/src/components/map/map.js +++ b/src/components/map/map.js @@ -84,7 +84,7 @@ class Map extends React.Component { this.fitMapBoundsToData = this.fitMapBoundsToData.bind(this); } - componentWillMount() { + UNSAFE_componentWillMount() { if (!window.L) { leaflet(); /* this sets up window.L */ } @@ -120,7 +120,7 @@ class Map extends React.Component { } this.maybeInvalidateMapSize(this.props); } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { this.modulateInterfaceForNarrativeMode(nextProps); this.maybeChangeSize(nextProps); const removed = this.maybeRemoveAllDemesAndTransmissions(nextProps); /* geographic resolution just changed (ie., country to division), remove everything. this change is upstream of maybeDraw */ @@ -580,7 +580,7 @@ class Map extends React.Component { } fitMapBoundsToData(demeData, demeIndices) { const SWNE = this.getGeoRange(demeData, demeIndices); - // window.L available because leaflet() was called in componentWillMount + // window.L available because leaflet() was called in UNSAFE_componentWillMount this.state.currentBounds = window.L.latLngBounds(SWNE[0], SWNE[1]); const maxZoom = this.getMaxZoomForFittingMapToData(); // first, clear any existing timeout diff --git a/src/components/tree/tangle/index.js b/src/components/tree/tangle/index.js index bb3fc43ea..dca845432 100644 --- a/src/components/tree/tangle/index.js +++ b/src/components/tree/tangle/index.js @@ -56,7 +56,7 @@ class Tangle extends React.Component { // .transition().duration(500) // .attr("d", makeTipPath); // } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { if (!this.state.drawn && nextProps.rightNodes[0].shell) { this.drawLines(nextProps); this.setState({drawn: true}); From 7c7cdcefe0043f88dd7faa7b5523b1e4550e9b7d Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Fri, 21 Apr 2023 19:50:05 -0700 Subject: [PATCH 18/30] eslint: Address react/no-direct-mutation-state violations There is only one, so disable it for the specific line. A proper fix will come in the following commit. --- .eslintrc.yaml | 1 - src/components/map/map.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 22369a271..2968cd127 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -20,7 +20,6 @@ globals: rules: react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] no-unused-vars: ["error", { "argsIgnorePattern": "^_", "destructuredArrayIgnorePattern": "^_" }] - react/no-direct-mutation-state: off react/prop-types: off parserOptions: diff --git a/src/components/map/map.js b/src/components/map/map.js index a1a1e3485..6106627d6 100644 --- a/src/components/map/map.js +++ b/src/components/map/map.js @@ -581,7 +581,7 @@ class Map extends React.Component { fitMapBoundsToData(demeData, demeIndices) { const SWNE = this.getGeoRange(demeData, demeIndices); // window.L available because leaflet() was called in UNSAFE_componentWillMount - this.state.currentBounds = window.L.latLngBounds(SWNE[0], SWNE[1]); + this.state.currentBounds = window.L.latLngBounds(SWNE[0], SWNE[1]); // eslint-disable-line react/no-direct-mutation-state const maxZoom = this.getMaxZoomForFittingMapToData(); // first, clear any existing timeout if (this.bounds_timeout) { From f80a98e81a8e2b5f6b440faa2a523987a7ca3c00 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Mon, 24 Apr 2023 22:09:24 -0700 Subject: [PATCH 19/30] Remove unused currentBounds state This was added in 8a213ac8976c34df1182a441336bc18cc48401e2 but the usage was removed in 43ee2ed6220944f57b5cc2f1eecaaa639f0e208b. Move other lines closer to where they are used. --- src/components/map/map.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/map/map.js b/src/components/map/map.js index 6106627d6..2283cc08e 100644 --- a/src/components/map/map.js +++ b/src/components/map/map.js @@ -579,10 +579,6 @@ class Map extends React.Component { } } fitMapBoundsToData(demeData, demeIndices) { - const SWNE = this.getGeoRange(demeData, demeIndices); - // window.L available because leaflet() was called in UNSAFE_componentWillMount - this.state.currentBounds = window.L.latLngBounds(SWNE[0], SWNE[1]); // eslint-disable-line react/no-direct-mutation-state - const maxZoom = this.getMaxZoomForFittingMapToData(); // first, clear any existing timeout if (this.bounds_timeout) { window.clearTimeout(this.bounds_timeout); @@ -590,6 +586,9 @@ class Map extends React.Component { // delay to change map bounds this.bounds_timeout = window.setTimeout( (map) => { + const SWNE = this.getGeoRange(demeData, demeIndices); + const maxZoom = this.getMaxZoomForFittingMapToData(); + // window.L available because leaflet() was called in UNSAFE_componentWillMount map.fitBounds(window.L.latLngBounds(SWNE[0], SWNE[1]), {maxZoom}); }, this.props.narrativeMode ? 100 : 750, From 9d5db4415c0326bbf96bd80546e487af16cf9ac7 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Fri, 21 Apr 2023 18:55:52 -0700 Subject: [PATCH 20/30] Add a note for react/prop-types --- .eslintrc.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 2968cd127..184657935 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -20,6 +20,8 @@ globals: rules: react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] no-unused-vars: ["error", { "argsIgnorePattern": "^_", "destructuredArrayIgnorePattern": "^_" }] + + # Remove this override once all props have been typed using PropTypes or TypeScript. react/prop-types: off parserOptions: From 902895a79e0cd6d7b390461c518b170034b99a3f Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Tue, 2 May 2023 13:55:28 -0700 Subject: [PATCH 21/30] eslint-plugin-react: Detect React version Previously when missing, it defaulted to "latest" and showed a warning. --- .eslintrc.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 184657935..4dbf400d3 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -35,3 +35,7 @@ env: browser: true node: true jest: true + +settings: + react: + version: detect From 74f76adcea42fd2b150561b14aeefb57512bc687 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Thu, 4 May 2023 12:33:31 -0700 Subject: [PATCH 22/30] eslint: Section by "code quality" and "code style" rules No code style rules yet but they will be added in subsequent commits. --- .eslintrc.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 4dbf400d3..aa8032d10 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -19,10 +19,12 @@ globals: rules: react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] + + # Code quality rules no-unused-vars: ["error", { "argsIgnorePattern": "^_", "destructuredArrayIgnorePattern": "^_" }] + react/prop-types: off # Remove this override once all props have been typed using PropTypes or TypeScript. - # Remove this override once all props have been typed using PropTypes or TypeScript. - react/prop-types: off + # Code style rules parserOptions: ecmaVersion: 6 From a9aab1d473893caf3a0bb0d64a11b420833cf06b Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Thu, 4 May 2023 13:25:07 -0700 Subject: [PATCH 23/30] Use a src-specific ESLint config file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This takes advantage of configuration cascading¹ so rules that only apply within src aren't applied elsewhere. ¹ https://eslint.org/docs/latest/use/configure/configuration-files#cascading-and-hierarchy --- .eslintrc.yaml | 2 -- src/.eslintrc.yaml | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 src/.eslintrc.yaml diff --git a/.eslintrc.yaml b/.eslintrc.yaml index aa8032d10..88a28e88a 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -18,8 +18,6 @@ globals: BASE_URL: true rules: - react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] - # Code quality rules no-unused-vars: ["error", { "argsIgnorePattern": "^_", "destructuredArrayIgnorePattern": "^_" }] react/prop-types: off # Remove this override once all props have been typed using PropTypes or TypeScript. diff --git a/src/.eslintrc.yaml b/src/.eslintrc.yaml new file mode 100644 index 000000000..add6edb73 --- /dev/null +++ b/src/.eslintrc.yaml @@ -0,0 +1,4 @@ +--- + +rules: + react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] From 71c0709765484e968ed8bcf2d6614ac6f350d7dd Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Thu, 4 May 2023 13:25:48 -0700 Subject: [PATCH 24/30] eslint: Add custom rules James went through all the rules that we had custom-enabled prior to b3cedb712c1fdb38b4e6e759e2652376075ea0a6. These are the ones that were flagged to be re-added. Some are commented out since there are existing violations. Subsequent commits will un-comment the rules and address violations. Co-authored-by: James Hadfield --- .eslintrc.yaml | 6 ++++++ src/.eslintrc.yaml | 3 +++ 2 files changed, 9 insertions(+) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 88a28e88a..061503271 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -20,9 +20,15 @@ globals: rules: # Code quality rules no-unused-vars: ["error", { "argsIgnorePattern": "^_", "destructuredArrayIgnorePattern": "^_" }] + # no-use-before-define: ["error", { "functions": false }] + # prefer-const: ["error", {"destructuring": "all"}] react/prop-types: off # Remove this override once all props have been typed using PropTypes or TypeScript. # Code style rules + arrow-parens: ["error", "always"] + # no-unneeded-ternary: ["error", { "defaultAssignment": true }] + operator-linebreak: ["error", "after", { "overrides": { "?": "ignore", ":": "ignore" } }] + quote-props: ["error", "as-needed"] parserOptions: ecmaVersion: 6 diff --git a/src/.eslintrc.yaml b/src/.eslintrc.yaml index add6edb73..4ab649eb2 100644 --- a/src/.eslintrc.yaml +++ b/src/.eslintrc.yaml @@ -2,3 +2,6 @@ rules: react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] + + # Code quality rules + # no-console: [1, { "allow": ["warn", "error"] }] From 9fc42f01ee6609631a9d864da7e8c4da5cf5e583 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Thu, 4 May 2023 13:37:59 -0700 Subject: [PATCH 25/30] eslint: Address no-use-before-define violations There is only one, and it is because a function expression is used before it is defined. Changing to a function declaration solves this because those are hoisted to the top-level (function expressions are not). Rule doc page: https://eslint.org/docs/latest/rules/no-use-before-define --- .eslintrc.yaml | 2 +- src/util/getGenotype.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 061503271..8246fb083 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -20,7 +20,7 @@ globals: rules: # Code quality rules no-unused-vars: ["error", { "argsIgnorePattern": "^_", "destructuredArrayIgnorePattern": "^_" }] - # no-use-before-define: ["error", { "functions": false }] + no-use-before-define: ["error", { "functions": false }] # prefer-const: ["error", {"destructuring": "all"}] react/prop-types: off # Remove this override once all props have been typed using PropTypes or TypeScript. diff --git a/src/util/getGenotype.js b/src/util/getGenotype.js index 64e1d0a02..acdc1b418 100644 --- a/src/util/getGenotype.js +++ b/src/util/getGenotype.js @@ -60,12 +60,12 @@ export const decodeColorByGenotype = (colorBy, geneLengths) => { return null; }; -export const decodePositions = (positions, geneLength = 'Infinity') => { +export function decodePositions(positions, geneLength = 'Infinity') { return positions .split(",") .map((x) => parseInt(x, 10)) .filter((x) => x > 0 && x <= Math.floor(geneLength)); -}; +} /** * Encode genotype filters for storage in URL query state. From 93ee800cb0c41b82de1dce70e54bfb2b54a0abd9 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Thu, 4 May 2023 13:46:25 -0700 Subject: [PATCH 26/30] eslint: Address prefer-const violations As the rule doc page says, if a variable is never reassigned, using the const declaration is better. Rule doc page: https://eslint.org/docs/latest/rules/prefer-const --- .eslintrc.yaml | 2 +- src/components/download/helperFunctions.js | 4 ++-- src/components/tree/phyloTree/change.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 8246fb083..493dfc924 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -21,7 +21,7 @@ rules: # Code quality rules no-unused-vars: ["error", { "argsIgnorePattern": "^_", "destructuredArrayIgnorePattern": "^_" }] no-use-before-define: ["error", { "functions": false }] - # prefer-const: ["error", {"destructuring": "all"}] + prefer-const: ["error", {"destructuring": "all"}] react/prop-types: off # Remove this override once all props have been typed using PropTypes or TypeScript. # Code style rules diff --git a/src/components/download/helperFunctions.js b/src/components/download/helperFunctions.js index f266d3c7b..dd891c64f 100644 --- a/src/components/download/helperFunctions.js +++ b/src/components/download/helperFunctions.js @@ -445,7 +445,7 @@ const createBoundingDimensionsAndPositionPanels = (panels, panelLayout, numLines } /* add top&left padding */ - for (let key in panels) { + for (const key in panels) { if (panels[key]) { panels[key].x += padding; panels[key].y += padding; @@ -535,7 +535,7 @@ const writeSVGPossiblyIncludingMap = (dispatch, filePrefix, panelsInDOM, panelLa /* logic for extracting the overall width etc */ const overallDimensions = createBoundingDimensionsAndPositionPanels(panels, panelLayout, textStrings.length); output.push(``); - for (let key in panels) { + for (const key in panels) { if (panels[key]) { injectAsSVGStrings(output, key, panels[key]); // modifies output in place } diff --git a/src/components/tree/phyloTree/change.js b/src/components/tree/phyloTree/change.js index 0f9acea3c..a3a0c4277 100644 --- a/src/components/tree/phyloTree/change.js +++ b/src/components/tree/phyloTree/change.js @@ -15,7 +15,7 @@ const updateNodesWithNewData = (nodes, newNodeProps) => { // let tmp = 0; nodes.forEach((d, i) => { d.update = false; - for (let key in newNodeProps) { + for (const key in newNodeProps) { const val = newNodeProps[key][i]; if (val !== d[key]) { d[key] = val; From eb0c592880c9d863ba2881a4a8800e714e92e346 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Thu, 4 May 2023 13:50:28 -0700 Subject: [PATCH 27/30] eslint: Address no-unneeded-ternary violations This was already disabled from 910e5678e2461f53a354ce6281b08bc4859e7cdd and it looks like there's enough context to keep it as-is. Rule doc page: https://eslint.org/docs/latest/rules/no-unneeded-ternary --- .eslintrc.yaml | 2 +- src/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 493dfc924..af61b8484 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -26,7 +26,7 @@ rules: # Code style rules arrow-parens: ["error", "always"] - # no-unneeded-ternary: ["error", { "defaultAssignment": true }] + no-unneeded-ternary: ["error", { "defaultAssignment": true }] operator-linebreak: ["error", "after", { "overrides": { "?": "ignore", ":": "ignore" } }] quote-props: ["error", "as-needed"] diff --git a/src/index.js b/src/index.js index 5d756b7a9..050bd95a4 100644 --- a/src/index.js +++ b/src/index.js @@ -42,7 +42,7 @@ i18n fallbackLng: "en", /* To debug any errors w.r.t. i18n, swith the second `false` to `true` (and this can be kept even after deployment if needed) */ - debug: process.env.NODE_ENV === 'production' ? false : false, + debug: process.env.NODE_ENV === 'production' ? false : false, // eslint-disable-line no-unneeded-ternary interpolation: { escapeValue: false }, From cf2b541648dbbfec5b7c5e19da7f7563ecbb31a1 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Thu, 4 May 2023 13:57:16 -0700 Subject: [PATCH 28/30] eslint: Address no-console violations These seem fine to have, so disable the rule per-line. Rule doc page: https://eslint.org/docs/latest/rules/no-console --- src/.eslintrc.yaml | 2 +- src/middleware/logActions.js | 2 +- src/util/googleAnalytics.js | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/.eslintrc.yaml b/src/.eslintrc.yaml index 4ab649eb2..44a6a69fa 100644 --- a/src/.eslintrc.yaml +++ b/src/.eslintrc.yaml @@ -4,4 +4,4 @@ rules: react/jsx-filename-extension: [1, { "extensions": [".js", ".jsx"] }] # Code quality rules - # no-console: [1, { "allow": ["warn", "error"] }] + no-console: [1, { "allow": ["warn", "error"] }] diff --git a/src/middleware/logActions.js b/src/middleware/logActions.js index 97b710098..83243f85a 100644 --- a/src/middleware/logActions.js +++ b/src/middleware/logActions.js @@ -6,7 +6,7 @@ Disable / Enable via apply middleware in src/store/index.js // eslint-disable-next-line export const loggingMiddleware = (store) => (next) => (action) => { // const state = store.getState(); // this is "old" state, i.e. before the reducers have updated by this action - console.log("Action: ", action.type); + console.log("Action: ", action.type); // eslint-disable-line no-console const result = next(action); // send action to other middleware / reducers return result; }; diff --git a/src/util/googleAnalytics.js b/src/util/googleAnalytics.js index 5b8f2e3bd..736532d72 100644 --- a/src/util/googleAnalytics.js +++ b/src/util/googleAnalytics.js @@ -11,7 +11,7 @@ export const initialiseGoogleAnalyticsIfRequired = async () => { importReactGa = import("react-ga"); ReactGA = (await importReactGa).default; if (process.env.NODE_ENV !== "production") { - // eslint-disable-next-line + // eslint-disable-next-line no-console console.log("Not setting up Google Analytics as we are not in production mode"); return; } @@ -40,6 +40,7 @@ export const triggerOutboundEvent = async (address) => { else return; ReactGA.outboundLink( {label: address}, + // eslint-disable-next-line no-console () => console.log("outbound event triggered", address) ); }; From 5c9c8caf697703e692a6d5b90d8513ac65c7bac3 Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Thu, 4 May 2023 14:01:27 -0700 Subject: [PATCH 29/30] Remove unused triggerOutboundEvent The last reference was removed in 5d636821da1b72490df96aade0d2a6649e2d35d3. This doesn't show up as "unused" during linting since it's possible that downstream code could import this function, but I don't think we have to worry about that for this specific function. --- src/util/googleAnalytics.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/util/googleAnalytics.js b/src/util/googleAnalytics.js index 736532d72..e1398a167 100644 --- a/src/util/googleAnalytics.js +++ b/src/util/googleAnalytics.js @@ -34,13 +34,3 @@ export const analyticsControlsEvent = async (action) => { action }); }; - -export const triggerOutboundEvent = async (address) => { - if (importReactGa) await importReactGa; - else return; - ReactGA.outboundLink( - {label: address}, - // eslint-disable-next-line no-console - () => console.log("outbound event triggered", address) - ); -}; From 09b5f3f4b1020deb104c2fe8257483187ab3ac3d Mon Sep 17 00:00:00 2001 From: Victor Lin <13424970+victorlin@users.noreply.github.com> Date: Thu, 4 May 2023 14:17:33 -0700 Subject: [PATCH 30/30] eslint: Enable react/no-array-index-key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is enabled in the Airbnb base config¹ that we previously used. It's still useful to have around. It can be disabled for the violation in title.js since using indexes as keys is only discouraged if the order of items may change² (not applicable here). ¹ https://github.com/airbnb/javascript/blob/7982931ba745c0f57ba6934fc7e6cc43901dac76/packages/eslint-config-airbnb/rules/react.js#L388 ² https://legacy.reactjs.org/docs/lists-and-keys.html#keys --- .eslintrc.yaml | 1 + src/components/framework/title.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index af61b8484..3dcaa3f5f 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -22,6 +22,7 @@ rules: no-unused-vars: ["error", { "argsIgnorePattern": "^_", "destructuredArrayIgnorePattern": "^_" }] no-use-before-define: ["error", { "functions": false }] prefer-const: ["error", {"destructuring": "all"}] + react/no-array-index-key: error react/prop-types: off # Remove this override once all props have been typed using PropTypes or TypeScript. # Code style rules diff --git a/src/components/framework/title.js b/src/components/framework/title.js index 651e99e92..5b4ce5a9e 100644 --- a/src/components/framework/title.js +++ b/src/components/framework/title.js @@ -39,7 +39,7 @@ class Title extends React.Component { const title = "nextstrain"; return title.split("").map((letter, i) => ( {letter}