From 4aa30709e79cda0dea6c2412dff576ecc41857b0 Mon Sep 17 00:00:00 2001 From: infctr Date: Fri, 24 Apr 2020 21:54:04 +0300 Subject: [PATCH 01/26] Move components to `src` folder, add tsc build --- .eslintignore | 1 + .gitignore | 3 ++ lint-staged.config.js | 5 +- package.json | 19 ++++--- {config => src/config}/recommended.js | 0 {lib => src}/index.js | 2 +- {lib => src}/plugin.js | 0 {lib => src}/rules/interface.js | 0 {lib => src}/rules/string-enum.js | 0 {lib => src}/utils/ast.js | 0 {lib => src}/utils/compareFunctions.js | 0 tests/autofix.spec.js | 4 +- tests/config.spec.js | 2 +- tests/lib/rules/interface.spec.js | 2 +- tests/lib/rules/string-enum.spec.js | 2 +- tsconfig.json | 68 ++++++++++++++++++++++++ tsconfig.prod.json | 4 ++ yarn.lock | 71 +++++++++++++++----------- 18 files changed, 137 insertions(+), 46 deletions(-) rename {config => src/config}/recommended.js (100%) rename {lib => src}/index.js (86%) rename {lib => src}/plugin.js (100%) rename {lib => src}/rules/interface.js (100%) rename {lib => src}/rules/string-enum.js (100%) rename {lib => src}/utils/ast.js (100%) rename {lib => src}/utils/compareFunctions.js (100%) create mode 100644 tsconfig.json create mode 100644 tsconfig.prod.json diff --git a/.eslintignore b/.eslintignore index 8cd209f..1739d64 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,2 @@ tests/fixtures/** +dist diff --git a/.gitignore b/.gitignore index 875d1f7..de558b4 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,6 @@ typings/ # DynamoDB Local files .dynamodb/ + +# Misc +dist diff --git a/lint-staged.config.js b/lint-staged.config.js index 80b3b7d..cfea9b6 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -1,3 +1,6 @@ module.exports = { - '*.js': ['prettier --write'], + '*.{js,ts}': [ + 'eslint --fix --ext js,jsx,tsx,ts --max-warnings 0 --no-ignore', + ], + '*.{md,yml,json}': ['prettier --write'], }; diff --git a/package.json b/package.json index b291c02..d21cff5 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,16 @@ "typescript" ], "author": "infctr ", - "main": "lib/index.js", + "main": "dist/index.js", "repository": "git@github.com:infctr/eslint-plugin-typescript-sort-keys.git", "scripts": { - "lint": "eslint lib/ tests/", - "lint:fix": "eslint lib/ tests/ --fix", + "prebuild": "yarn test", + "build": "rimraf dist && tsc --project ./tsconfig.prod.json", + "lint": "eslint src/ tests/", + "lint:fix": "eslint src/ tests/ --fix", "docs": "eslint-docs", "docs:check": "eslint-docs check", - "format": "prettier --write lib/**/*.js tests/**/*.js", + "format": "prettier --write src/**/*.{js,ts} tests/**/*.{js,ts}", "pretest": "yarn lint", "test": "jest --silent --runInBand", "posttest": "yarn docs:check" @@ -26,13 +28,13 @@ "requireindex": "~1.2.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^2.26.0", + "@infctr/eslint-docs": "~0.4.0", + "@typescript-eslint/eslint-plugin": "~2.26.0", "@typescript-eslint/parser": "~2.26.0", - "cross-spawn": "^7.0.1", + "cross-spawn": "~7.0.1", "eslint": "~6.8.0", "eslint-config-airbnb-base": "~14.1.0", "eslint-config-prettier": "~6.10.1", - "eslint-docs": "~0.4.0", "eslint-plugin-import": "~2.20.2", "eslint-plugin-node": "~11.1.0", "eslint-plugin-prettier": "~3.1.2", @@ -40,7 +42,8 @@ "jest": "~25.2.4", "lint-staged": "~10.1.1", "prettier": "~2.0.2", - "tmp": "^0.1.0", + "rimraf": "~3.0.2", + "tmp": "~0.1.0", "typescript": "~3.8.3" }, "peerDependencies": { diff --git a/config/recommended.js b/src/config/recommended.js similarity index 100% rename from config/recommended.js rename to src/config/recommended.js diff --git a/lib/index.js b/src/index.js similarity index 86% rename from lib/index.js rename to src/index.js index 589d814..bbcb862 100644 --- a/lib/index.js +++ b/src/index.js @@ -10,7 +10,7 @@ const requireIndex = require('requireindex'); const path = require('path'); -const recommended = require('../config/recommended'); // eslint-disable-line node/no-unpublished-require +const recommended = require('./config/recommended'); // eslint-disable-line node/no-unpublished-require //------------------------------------------------------------------------------ // Plugin Definition diff --git a/lib/plugin.js b/src/plugin.js similarity index 100% rename from lib/plugin.js rename to src/plugin.js diff --git a/lib/rules/interface.js b/src/rules/interface.js similarity index 100% rename from lib/rules/interface.js rename to src/rules/interface.js diff --git a/lib/rules/string-enum.js b/src/rules/string-enum.js similarity index 100% rename from lib/rules/string-enum.js rename to src/rules/string-enum.js diff --git a/lib/utils/ast.js b/src/utils/ast.js similarity index 100% rename from lib/utils/ast.js rename to src/utils/ast.js diff --git a/lib/utils/compareFunctions.js b/src/utils/compareFunctions.js similarity index 100% rename from lib/utils/compareFunctions.js rename to src/utils/compareFunctions.js diff --git a/tests/autofix.spec.js b/tests/autofix.spec.js index 10ba9c1..a0f8ef6 100644 --- a/tests/autofix.spec.js +++ b/tests/autofix.spec.js @@ -31,9 +31,9 @@ describe('autofix', () => { '--ext', '.ts', '--rulesdir', - 'lib/rules', + 'src/rules', '--config', - require.resolve('./fixtures/.eslintrc'), + require.resolve('./fixtures/.eslintrc.js'), testFilePath, '--fix', ], diff --git a/tests/config.spec.js b/tests/config.spec.js index 22b34ee..bdccff8 100644 --- a/tests/config.spec.js +++ b/tests/config.spec.js @@ -1,4 +1,4 @@ -const plugin = require('../lib/index'); +const plugin = require('../src/index'); const RULE_NAME_PREFIX = 'typescript-sort-keys/'; diff --git a/tests/lib/rules/interface.spec.js b/tests/lib/rules/interface.spec.js index 0637387..40a2e7f 100644 --- a/tests/lib/rules/interface.spec.js +++ b/tests/lib/rules/interface.spec.js @@ -1,6 +1,6 @@ const { RuleTester } = require('eslint'); -const rule = require('../../../lib/rules/interface'); +const rule = require('../../../src/rules/interface'); const ruleTester = new RuleTester({ parser: require.resolve('@typescript-eslint/parser'), diff --git a/tests/lib/rules/string-enum.spec.js b/tests/lib/rules/string-enum.spec.js index a918519..21cf746 100644 --- a/tests/lib/rules/string-enum.spec.js +++ b/tests/lib/rules/string-enum.spec.js @@ -1,6 +1,6 @@ const { RuleTester } = require('eslint'); -const rule = require('../../../lib/rules/string-enum'); +const rule = require('../../../src/rules/string-enum'); const ruleTester = new RuleTester({ parser: require.resolve('@typescript-eslint/parser'), diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ea108af --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,68 @@ +{ + "compilerOptions": { + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ES6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, + // "lib": [], /* Specify library files to be included in the compilation. */ + "allowJs": true /* Allow javascript files to be compiled. */, + // "checkJs": true /* Report errors in .js files. */, + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "dist" /* Redirect output structure to the directory. */, + "rootDir": "." /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, + "baseUrl": "src" /* Base directory to resolve non-absolute module names. */, + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + }, + "exclude": ["./node_modules", "src/tests/fixtures"], + "include": ["src", "tests"] +} diff --git a/tsconfig.prod.json b/tsconfig.prod.json new file mode 100644 index 0000000..077d0e1 --- /dev/null +++ b/tsconfig.prod.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["tests"] +} diff --git a/yarn.lock b/yarn.lock index aa8a469..c5cf1dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -232,6 +232,19 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@infctr/eslint-docs@~0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@infctr/eslint-docs/-/eslint-docs-0.4.0.tgz#1b368e1d7d12b0b943b8248e6a83e28723afddd2" + integrity sha512-QxHbn9BBIeaClgc5uZ1lOY3gMOW2u2junHAryHDYSTy8q58BwKEvGMMxJ16bz6mN5Oe18fcEmI7E2plg4w2xSw== + dependencies: + chalk "^2.4.1" + cli-diff "^1.0.0" + detect-newline "^2.1.0" + indent-string "^3.2.0" + mz "^2.7.0" + ora "^3.0.0" + read-pkg-up "^4.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" @@ -513,7 +526,7 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^2.26.0": +"@typescript-eslint/eslint-plugin@~2.26.0": version "2.26.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz#04c96560c8981421e5a9caad8394192363cc423f" integrity sha512-4yUnLv40bzfzsXcTAtZyTjbiGUXMrcIJcIMioI22tSOyAxpdXiZ4r7YQUU8Jj6XXrLz9d5aMHPQf5JFR7h27Nw== @@ -960,7 +973,7 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1019,10 +1032,10 @@ cli-diff@^1.0.0: chalk "^2.4.1" diff "^3.5.0" -cli-spinners@^1.1.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" - integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== +cli-spinners@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.3.0.tgz#0632239a4b5aa4c958610142c34bb7a651fc8df5" + integrity sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w== cli-truncate@^0.2.1: version "0.2.1" @@ -1174,7 +1187,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.1: +cross-spawn@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== @@ -1183,6 +1196,15 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@~7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" + integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + cssom@^0.4.1: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" @@ -1460,19 +1482,6 @@ eslint-config-prettier@~6.10.1: dependencies: get-stdin "^6.0.0" -eslint-docs@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/eslint-docs/-/eslint-docs-0.4.0.tgz#8b54e757f13cdf21f94809d91f5799d935e1dedc" - integrity sha512-UtiZabZ1TJ3sYoTdzgp89wy1CenaeSyuunFPK2+13HnnQ7cePT1LU5Ys0hgw9XfTE/nSh4XWyZqDCxN9xNVJlA== - dependencies: - chalk "^2.4.1" - cli-diff "^1.0.0" - detect-newline "^2.1.0" - indent-string "^3.2.0" - mz "^2.7.0" - ora "^3.0.0" - read-pkg-up "^4.0.0" - eslint-import-resolver-node@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" @@ -3551,15 +3560,15 @@ optionator@^0.8.1, optionator@^0.8.3: word-wrap "~1.2.3" ora@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-3.0.0.tgz#8179e3525b9aafd99242d63cc206fd64732741d0" - integrity sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg== + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== dependencies: - chalk "^2.3.1" + chalk "^2.4.2" cli-cursor "^2.1.0" - cli-spinners "^1.1.0" + cli-spinners "^2.0.0" log-symbols "^2.2.0" - strip-ansi "^4.0.0" + strip-ansi "^5.2.0" wcwidth "^1.0.1" os-tmpdir@~1.0.2: @@ -3590,9 +3599,9 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" - integrity sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g== + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" @@ -4078,7 +4087,7 @@ rimraf@^2.6.3: dependencies: glob "^7.1.3" -rimraf@^3.0.0: +rimraf@^3.0.0, rimraf@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -4656,7 +4665,7 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.1.0: +tmp@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== From aa6b16a089152f3b0d631a881f6bf1c46703636b Mon Sep 17 00:00:00 2001 From: infctr Date: Sat, 2 May 2020 11:08:46 +0300 Subject: [PATCH 02/26] Migrate to typescript with loose strict checks --- .eslintrc.js | 71 +- .gitignore | 7 +- .huskyrc.js | 5 + .prettierrc.js | 1 + babel.config.js | 6 + jest.config.js | 4 + lint-staged.config.js | 4 +- package.json | 33 +- src/common/options.ts | 35 + src/config/{recommended.js => recommended.ts} | 2 +- src/index.js | 26 - src/index.ts | 11 + src/rules/index.ts | 9 + src/rules/interface.js | 56 - src/rules/interface.ts | 72 + src/rules/string-enum.js | 59 - src/rules/string-enum.ts | 76 + src/utils/ast.js | 112 -- src/utils/ast.ts | 124 ++ src/utils/common.ts | 9 + src/utils/{compareFunctions.js => compare.ts} | 40 +- src/{plugin.js => utils/plugin.ts} | 32 +- src/utils/rule.ts | 46 + tests/{autofix.spec.js => autofix.spec.ts} | 30 +- tests/config.spec.js | 37 - tests/config.spec.ts | 52 + tests/{lib => }/rules/.eslintrc.js | 0 tests/{lib => }/rules/.prettierrc.js | 0 tests/{lib => }/rules/interface.spec.js | 4 +- tests/{lib => }/rules/string-enum.spec.js | 4 +- tests/tsconfig.json | 17 + tsconfig.json | 17 +- tsconfig.prod.json | 3 + yarn.lock | 1242 ++++++++++++++++- 34 files changed, 1795 insertions(+), 451 deletions(-) create mode 100644 .huskyrc.js create mode 100644 babel.config.js create mode 100644 jest.config.js create mode 100644 src/common/options.ts rename src/config/{recommended.js => recommended.ts} (88%) delete mode 100644 src/index.js create mode 100644 src/index.ts create mode 100644 src/rules/index.ts delete mode 100644 src/rules/interface.js create mode 100644 src/rules/interface.ts delete mode 100644 src/rules/string-enum.js create mode 100644 src/rules/string-enum.ts delete mode 100644 src/utils/ast.js create mode 100644 src/utils/ast.ts create mode 100644 src/utils/common.ts rename src/utils/{compareFunctions.js => compare.ts} (55%) rename src/{plugin.js => utils/plugin.ts} (88%) create mode 100644 src/utils/rule.ts rename tests/{autofix.spec.js => autofix.spec.ts} (74%) delete mode 100644 tests/config.spec.js create mode 100644 tests/config.spec.ts rename tests/{lib => }/rules/.eslintrc.js (100%) rename tests/{lib => }/rules/.prettierrc.js (100%) rename tests/{lib => }/rules/interface.spec.js (99%) rename tests/{lib => }/rules/string-enum.spec.js (99%) create mode 100644 tests/tsconfig.json diff --git a/.eslintrc.js b/.eslintrc.js index 8da9e14..18b6ad4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,15 +1,57 @@ module.exports = { - parserOptions: { - sourceType: 'module', + root: true, + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint', 'eslint-plugin', 'import', 'jest', 'prettier'], + env: { + es6: true, + node: true, }, extends: [ - 'airbnb-base', - 'prettier/standard', + 'eslint:recommended', + 'plugin:import/errors', + 'plugin:import/warnings', + 'plugin:import/typescript', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:eslint-plugin/recommended', 'plugin:prettier/recommended', - 'plugin:node/recommended', + 'prettier/@typescript-eslint', ], + parserOptions: { + ecmaVersion: 10, + project: ['./tsconfig.json', './tests/tsconfig.json'], + sourceType: 'module', + }, rules: { - 'object-shorthand': 0, + // Built in. + 'no-console': 'warn', + // 'no-param-reassign': 'error', + // 'no-var': 'error', + // Typescript eslint. + // '@typescript-eslint/array-type': ['error', { default: 'generic' }], + '@typescript-eslint/explicit-function-return-type': ['off'], + // '@typescript-eslint/prefer-interface': 'off', + // '@typescript-eslint/no-non-null-assertion': 'off', + // '@typescript-eslint/no-require-imports': 'error', + // '@typescript-eslint/no-unused-vars': [ + // 'error', + // { + // args: 'after-used', + // argsIgnorePattern: '^_', + // caughtErrors: 'none', + // ignoreRestSiblings: true, + // vars: 'all', + // }, + // ], + // '@typescript-eslint/no-use-before-define': [ + // 'error', + // { + // functions: true, + // classes: true, + // variables: true, + // typedefs: true, + // }, + // ], }, overrides: [ { @@ -17,6 +59,23 @@ module.exports = { env: { jest: true, }, + rules: { + 'jest/no-disabled-tests': 'warn', + 'jest/no-focused-tests': 'error', + 'jest/no-alias-methods': 'error', + 'jest/no-identical-title': 'error', + 'jest/no-jasmine-globals': 'error', + 'jest/no-jest-import': 'error', + 'jest/no-test-prefixes': 'error', + 'jest/no-test-callback': 'error', + 'jest/no-test-return-statement': 'error', + 'jest/prefer-to-have-length': 'warn', + 'jest/prefer-spy-on': 'error', + 'jest/valid-expect': 'error', + }, }, ], + settings: { + 'import/ignore': ['escape-string-regexp'], + }, }; diff --git a/.gitignore b/.gitignore index de558b4..43a3bfd 100644 --- a/.gitignore +++ b/.gitignore @@ -81,5 +81,10 @@ typings/ # DynamoDB Local files .dynamodb/ -# Misc +# IDE +.vscode + +# Build artifacts dist +build +lib diff --git a/.huskyrc.js b/.huskyrc.js new file mode 100644 index 0000000..d614502 --- /dev/null +++ b/.huskyrc.js @@ -0,0 +1,5 @@ +module.exports = { + hooks: { + 'pre-commit': 'lint-staged', + }, +}; diff --git a/.prettierrc.js b/.prettierrc.js index dfbd3b4..694e650 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,4 +1,5 @@ module.exports = { + printWidth: 90, trailingComma: 'all', arrowParens: 'avoid', }; diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..8165fe4 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,6 @@ +module.exports = { + presets: [ + ['@babel/preset-env', { targets: { node: 'current' } }], + '@babel/preset-typescript', + ], +}; diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..ac0b2a7 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,4 @@ +module.exports = { + testRegex: 'tests/.*\\.spec\\.(js|ts)$', + moduleDirectories: ['node_modules', 'src'], +}; diff --git a/lint-staged.config.js b/lint-staged.config.js index cfea9b6..d887e90 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -1,6 +1,4 @@ module.exports = { - '*.{js,ts}': [ - 'eslint --fix --ext js,jsx,tsx,ts --max-warnings 0 --no-ignore', - ], + '*.{js,ts}': ['eslint --fix --ext js,jsx,tsx,ts --max-warnings 0 --no-ignore'], '*.{md,yml,json}': ['prettier --write'], }; diff --git a/package.json b/package.json index d21cff5..08ec516 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "scripts": { "prebuild": "yarn test", "build": "rimraf dist && tsc --project ./tsconfig.prod.json", - "lint": "eslint src/ tests/", + "lint": "eslint --ext .js,.ts src/ tests/", "lint:fix": "eslint src/ tests/ --fix", "docs": "eslint-docs", "docs:check": "eslint-docs check", @@ -24,19 +24,32 @@ "posttest": "yarn docs:check" }, "dependencies": { - "natural-compare-lite": "~1.4.0", - "requireindex": "~1.2.0" + "natural-compare-lite": "~1.4.0" }, "devDependencies": { + "@babel/core": "~7.9.6", + "@babel/preset-env": "~7.9.6", + "@babel/preset-typescript": "~7.9.0", "@infctr/eslint-docs": "~0.4.0", + "@types/cross-spawn": "~6.0.1", + "@types/eslint": "~6.8.0", + "@types/eslint-plugin-prettier": "~3.1.0", + "@types/jest": "~25.2.1", + "@types/natural-compare-lite": "~1.4.0", + "@types/prettier": "~2.0.0", + "@types/requireindex": "~1.2.0", + "@types/rimraf": "~3.0.0", + "@types/tmp": "~0.1.0", "@typescript-eslint/eslint-plugin": "~2.26.0", + "@typescript-eslint/experimental-utils": "~2.29.0", "@typescript-eslint/parser": "~2.26.0", + "babel-jest": "~25.5.1", "cross-spawn": "~7.0.1", "eslint": "~6.8.0", - "eslint-config-airbnb-base": "~14.1.0", "eslint-config-prettier": "~6.10.1", + "eslint-plugin-eslint-plugin": "~2.2.1", "eslint-plugin-import": "~2.20.2", - "eslint-plugin-node": "~11.1.0", + "eslint-plugin-jest": "~23.8.2", "eslint-plugin-prettier": "~3.1.2", "husky": "~4.2.3", "jest": "~25.2.4", @@ -54,13 +67,5 @@ "engines": { "node": ">=8.3.0" }, - "jest": { - "testRegex": "tests/.*\\.spec\\.(js|ts)$" - }, - "license": "ISC", - "husky": { - "hooks": { - "pre-commit": "yarn test && lint-staged" - } - } + "license": "ISC" } diff --git a/src/common/options.ts b/src/common/options.ts new file mode 100644 index 0000000..be6d33b --- /dev/null +++ b/src/common/options.ts @@ -0,0 +1,35 @@ +import { JSONSchema4 } from 'json-schema'; + +export enum SortingOrder { + Ascending = 'asc', + Descending = 'desc', +} + +export const sortingOrderOptionSchema: JSONSchema4 = { + enum: [SortingOrder.Ascending, SortingOrder.Descending], +}; + +export type SortingOrderOption = SortingOrder; + +export const sortingParamsOptionSchema: JSONSchema4 = { + type: 'object', + properties: { + caseSensitive: { + type: 'boolean', + }, + natural: { + type: 'boolean', + }, + }, + additionalProperties: false, +}; + +export interface SortingParamsOption { + readonly caseSensitive: boolean; + readonly natural: boolean; +} + +export enum ErrorMessage { + InterfaceInvalidOrder = `Expected interface keys to be in {{ natural }}{{ insensitive }}{{ order }}ending order. '{{ thisName }}' should be before '{{ prevName }}'.`, + StringEnumInvalidOrder = `Expected string enum members to be in {{ natural }}{{ insensitive }}{{ order }}ending order. '{{ thisName }}' should be before '{{ prevName }}'.`, +} diff --git a/src/config/recommended.js b/src/config/recommended.ts similarity index 88% rename from src/config/recommended.js rename to src/config/recommended.ts index 8eb8f1d..e8ccd7a 100644 --- a/src/config/recommended.js +++ b/src/config/recommended.ts @@ -1,4 +1,4 @@ -module.exports = { +export default { plugins: ['typescript-sort-keys'], rules: { 'typescript-sort-keys/interface': 'error', diff --git a/src/index.js b/src/index.js deleted file mode 100644 index bbcb862..0000000 --- a/src/index.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @fileoverview Sort interface keys - * @author infctr - */ - -//------------------------------------------------------------------------------ -// Requirements -//------------------------------------------------------------------------------ - -const requireIndex = require('requireindex'); -const path = require('path'); - -const recommended = require('./config/recommended'); // eslint-disable-line node/no-unpublished-require - -//------------------------------------------------------------------------------ -// Plugin Definition -//------------------------------------------------------------------------------ - -// import all rules in lib/rules -module.exports = { - rules: requireIndex(path.join(__dirname, 'rules')), - - configs: { - recommended, - }, -}; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..1e176c3 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,11 @@ +import recommended from './config/recommended'; +import { rules } from './rules'; + +const config = { + rules, + configs: { + recommended, + }, +}; + +export default config; diff --git a/src/rules/index.ts b/src/rules/index.ts new file mode 100644 index 0000000..875d51a --- /dev/null +++ b/src/rules/index.ts @@ -0,0 +1,9 @@ +import { name as interfaceName, rule as interfaceRule } from './interface'; +import { name as stringEnumName, rule as stringEnumRule } from './string-enum'; + +export const rules = { + [interfaceName]: interfaceRule, + [stringEnumName]: stringEnumRule, +}; + +// export default rules; diff --git a/src/rules/interface.js b/src/rules/interface.js deleted file mode 100644 index cc0e250..0000000 --- a/src/rules/interface.js +++ /dev/null @@ -1,56 +0,0 @@ -const { getObjectBody } = require('../utils/ast'); -const createReporter = require('../plugin'); - -module.exports = { - meta: { - type: 'suggestion', - - fixable: 'code', - - docs: { - description: 'require interface keys to be sorted', - category: 'Stylistic Issues', - recommended: true, - url: - 'https://github.com/infctr/eslint-plugin-typescript-sort-keys/blob/master/docs/rules/interface.md', - }, - - schema: [ - { - enum: ['asc', 'desc'], - }, - { - type: 'object', - properties: { - caseSensitive: { - type: 'boolean', - }, - natural: { - type: 'boolean', - }, - }, - additionalProperties: false, - }, - ], - }, - - create(context) { - const compareNodeListAndReport = createReporter(context, currentNode => ({ - loc: currentNode.key ? currentNode.key.loc : currentNode.loc, - message: - 'Expected interface keys to be in {{ natural }}{{ insensitive }}{{ order }}ending order. ' + - `'{{ thisName }}' should be before '{{ prevName }}'.`, - })); - return { - TSInterfaceDeclaration(node) { - const body = getObjectBody(node); - return compareNodeListAndReport(body); - }, - - TSTypeLiteral(node) { - const body = getObjectBody(node); - return compareNodeListAndReport(body); - }, - }; - }, -}; diff --git a/src/rules/interface.ts b/src/rules/interface.ts new file mode 100644 index 0000000..6a3f456 --- /dev/null +++ b/src/rules/interface.ts @@ -0,0 +1,72 @@ +import { JSONSchema4 } from 'json-schema'; + +import { getObjectBody } from '../utils/ast'; +import { createReporter } from '../utils/plugin'; +import { createRule, RuleMetaData } from '../utils/rule'; +import { + sortingOrderOptionSchema, + sortingParamsOptionSchema, + SortingOrder, + SortingParamsOption, + SortingOrderOption, + ErrorMessage, +} from '../common/options'; + +// The name of this rule. +export const name = 'interface' as const; + +// The options this rule can take. +type Options = [SortingOrderOption] | [SortingOrderOption, Partial]; + +// The schema for the rule options. +const schema: JSONSchema4 = [sortingOrderOptionSchema, sortingParamsOptionSchema]; + +// The default options for the rule. +const defaultOptions: Options = [ + SortingOrder.Ascending, + { caseSensitive: true, natural: false }, +]; + +// The possible error messages. +const errorMessages = { + invalidOrder: ErrorMessage.InterfaceInvalidOrder, +} as const; + +// The meta data for this rule. +const meta: RuleMetaData = { + type: 'suggestion', + docs: { + description: 'require interface keys to be sorted', + category: 'Stylistic Issues', + recommended: 'warn', + }, + messages: errorMessages, + fixable: 'code', + schema, +}; + +// Create the rule. +export const rule = createRule({ + name, + meta, + defaultOptions, + + create(context) { + const compareNodeListAndReport = createReporter(context, currentNode => ({ + loc: currentNode.key ? currentNode.key.loc : currentNode.loc, + messageId: 'invalidOrder', + })); + + return { + TSInterfaceDeclaration(node) { + const body = getObjectBody(node); + return compareNodeListAndReport(body); + }, + + TSTypeLiteral(node) { + const body = getObjectBody(node); + return compareNodeListAndReport(body); + }, + }; + }, +}); diff --git a/src/rules/string-enum.js b/src/rules/string-enum.js deleted file mode 100644 index 4564b97..0000000 --- a/src/rules/string-enum.js +++ /dev/null @@ -1,59 +0,0 @@ -const { getObjectBody } = require('../utils/ast'); -const createReporter = require('../plugin'); - -module.exports = { - meta: { - type: 'suggestion', - - fixable: 'code', - - docs: { - description: 'require string enum members to be sorted', - category: 'Stylistic Issues', - recommended: true, - url: - 'https://github.com/infctr/eslint-plugin-typescript-sort-keys/blob/master/docs/rules/string-enum.md', - }, - - schema: [ - { - enum: ['asc', 'desc'], - }, - { - type: 'object', - properties: { - caseSensitive: { - type: 'boolean', - }, - natural: { - type: 'boolean', - }, - }, - additionalProperties: false, - }, - ], - }, - - create(context) { - const compareNodeListAndReport = createReporter(context, currentNode => ({ - loc: currentNode.loc, - message: - 'Expected string enum members to be in {{ natural }}{{ insensitive }}{{ order }}ending order. ' + - `'{{ thisName }}' should be before '{{ prevName }}'.`, - })); - return { - TSEnumDeclaration(node) { - const body = getObjectBody(node); - const isStringEnum = body.every( - member => - member.initializer && - member.initializer.type === 'Literal' && - typeof member.initializer.value === 'string', - ); - if (isStringEnum) { - compareNodeListAndReport(body); - } - }, - }; - }, -}; diff --git a/src/rules/string-enum.ts b/src/rules/string-enum.ts new file mode 100644 index 0000000..49d1d5c --- /dev/null +++ b/src/rules/string-enum.ts @@ -0,0 +1,76 @@ +import { JSONSchema4 } from 'json-schema'; + +import { getObjectBody } from '../utils/ast'; +import { createReporter } from '../utils/plugin'; +import { createRule, RuleMetaData } from '../utils/rule'; +import { + sortingOrderOptionSchema, + sortingParamsOptionSchema, + SortingOrder, + SortingParamsOption, + SortingOrderOption, + ErrorMessage, +} from '../common/options'; + +// The name of this rule. +export const name = 'string-enum' as const; + +// The options this rule can take. +type Options = [SortingOrderOption] | [SortingOrderOption, Partial]; + +// The schema for the rule options. +const schema: JSONSchema4 = [sortingOrderOptionSchema, sortingParamsOptionSchema]; + +// The default options for the rule. +const defaultOptions: Options = [ + SortingOrder.Ascending, + { caseSensitive: true, natural: false }, +]; + +// The possible error messages. +const errorMessages = { + invalidOrder: ErrorMessage.StringEnumInvalidOrder, +} as const; + +// The meta data for this rule. +const meta: RuleMetaData = { + type: 'suggestion', + docs: { + description: 'require string enum members to be sorted', + category: 'Stylistic Issues', + recommended: 'warn', + }, + messages: errorMessages, + fixable: 'code', + schema, +}; + +// Create the rule. +export const rule = createRule({ + name, + meta, + defaultOptions, + + create(context) { + const compareNodeListAndReport = createReporter(context, currentNode => ({ + loc: currentNode.key ? currentNode.key.loc : currentNode.loc, + messageId: 'invalidOrder', + })); + + return { + TSEnumDeclaration(node) { + const body = getObjectBody(node); + const isStringEnum = body.every( + member => + member.initializer && + member.initializer.type === 'Literal' && + typeof member.initializer.value === 'string', + ); + + if (isStringEnum) { + compareNodeListAndReport(body); + } + }, + }; + }, +}); diff --git a/src/utils/ast.js b/src/utils/ast.js deleted file mode 100644 index d17882a..0000000 --- a/src/utils/ast.js +++ /dev/null @@ -1,112 +0,0 @@ -module.exports = { - getObjectBody(node) { - switch (node.type) { - case 'TSInterfaceDeclaration': - return node.body.body; - case 'TSEnumDeclaration': - case 'TSTypeLiteral': - return node.members; - default: - return null; - } - }, - - /** - * Gets the property name of a given node. - * The node can be a TSPropertySignature, or a TSMethodSignature. - * - * If the name is dynamic, this returns `null`. - * - * For examples: - * - * a.b // => "b" - * a["b"] // => "b" - * a['b'] // => "b" - * a[`b`] // => "b" - * a[100] // => "100" - * a[b] // => null - * a["a" + "b"] // => null - * a[tag`b`] // => null - * a[`${b}`] // => null - * - * let a = {b: 1} // => "b" - * let a = {["b"]: 1} // => "b" - * let a = {['b']: 1} // => "b" - * let a = {[`b`]: 1} // => "b" - * let a = {[100]: 1} // => "100" - * let a = {[b]: 1} // => null - * let a = {["a" + "b"]: 1} // => null - * let a = {[tag`b`]: 1} // => null - * let a = {[`${b}`]: 1} // => null - * - * @param {ASTNode} node - The node to get. - * @returns {string|null} The property name if static. Otherwise, null. - */ - getStaticPropertyName(node) { - let prop; - - switch (node && node.type) { - case 'TSIndexSignature': - if (node.parameters.length > 0) { - const [identifier] = node.parameters; - prop = { - ...identifier, - name: `[index: ${identifier.name}]`, - }; - } - break; - - case 'TSPropertySignature': - case 'TSMethodSignature': - prop = node.key; - break; - - case 'TSEnumMember': - prop = node.id; - break; - - // no default - } - - switch (prop && prop.type) { - case 'Literal': - return String(prop.value); - - case 'TemplateLiteral': - if (prop.expressions.length === 0 && prop.quasis.length === 1) { - return prop.quasis[0].value.cooked; - } - break; - - case 'Identifier': - if (!node.computed) { - return prop.name; - } - break; - - // no default - } - - return null; - }, - - /** - * Gets the property name of the given `Property` node. - * - * - If the property's key is an `Identifier` node, this returns the key's name - * whether it's a computed property or not. - * - If the property has a static name, this returns the static name. - * - Otherwise, this returns null. - * - * @param {ASTNode} node - The `Property` node to get. - * @returns {string|null} The property name or null. - * @private - */ - getPropertyName(node) { - return ( - module.exports.getStaticPropertyName(node) || - (node.key && node.key.name) || - null - ); - }, -}; diff --git a/src/utils/ast.ts b/src/utils/ast.ts new file mode 100644 index 0000000..4acbb52 --- /dev/null +++ b/src/utils/ast.ts @@ -0,0 +1,124 @@ +import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils'; + +import { indexSignature } from './common'; + +export function getObjectBody( + node: + | TSESTree.TSEnumDeclaration + | TSESTree.TSInterfaceDeclaration + | TSESTree.TSTypeLiteral, +) { + switch (node.type) { + case AST_NODE_TYPES.TSInterfaceDeclaration: + return node.body.body; + case AST_NODE_TYPES.TSEnumDeclaration: + case AST_NODE_TYPES.TSTypeLiteral: + return node.members; + default: + return null; + } +} + +function getProperty(node: TSESTree.Node) { + switch (node.type) { + case AST_NODE_TYPES.TSIndexSignature: + if (node.parameters.length > 0) { + const [identifier] = node.parameters; + + return { + ...identifier, + // Override name for error message readability and weight calculation + name: indexSignature.create( + (identifier as TSESTree.Parameter & { name: string }).name, + ), + }; + } + + return null; + + case AST_NODE_TYPES.TSPropertySignature: + case AST_NODE_TYPES.TSMethodSignature: + return node.key; + + case AST_NODE_TYPES.TSEnumMember: + return node.id; + + default: + return null; + } +} + +/** + * Gets the property name of a given node. + * The node can be a TSPropertySignature, or a TSMethodSignature. + * + * If the name is dynamic, this returns `null`. + * + * For examples: + * + * a.b // => "b" + * a["b"] // => "b" + * a['b'] // => "b" + * a[`b`] // => "b" + * a[100] // => "100" + * a[b] // => null + * a["a" + "b"] // => null + * a[tag`b`] // => null + * a[`${b}`] // => null + * + * let a = {b: 1} // => "b" + * let a = {["b"]: 1} // => "b" + * let a = {['b']: 1} // => "b" + * let a = {[`b`]: 1} // => "b" + * let a = {[100]: 1} // => "100" + * let a = {[b]: 1} // => null + * let a = {["a" + "b"]: 1} // => null + * let a = {[tag`b`]: 1} // => null + * let a = {[`${b}`]: 1} // => null + */ +export function getStaticPropertyName(node: TSESTree.Node): string | null { + const property = getProperty(node); + + if (!property) return null; + + switch (property.type) { + case AST_NODE_TYPES.Literal: + return String(property.value); + + case AST_NODE_TYPES.TemplateLiteral: + return property.expressions.length === 0 && property.quasis.length === 1 + ? property.quasis[0].value.cooked + : null; + + case AST_NODE_TYPES.Identifier: + return (node as TSESTree.Node & { computed?: boolean }).computed + ? null + : property.name; + + default: + return null; + } +} + +/** + * Gets the property name of the given `Property` node. + * + * - If the property's key is an `Identifier` node, this returns the key's name + * whether it's a computed property or not. + * - If the property has a static name, this returns the static name. + * - Otherwise, this returns null. + */ +export function getPropertyName(node: TSESTree.Node): string | null { + if (node.type) { + return getStaticPropertyName(node); + } + + // if (node.key) { + // console.log('node.key', node.key); + // return node.key.name; + // } + + return null; + + // return getStaticPropertyName(node) || (node.key && node.key.name) || null; +} diff --git a/src/utils/common.ts b/src/utils/common.ts new file mode 100644 index 0000000..f10d6e5 --- /dev/null +++ b/src/utils/common.ts @@ -0,0 +1,9 @@ +const nameToIndexSignature = (x: string) => `[index: ${x}]`; +const indexSignatureRegexp = new RegExp( + `^${nameToIndexSignature('.+')}`.replace('[', '\\[').replace(']', '\\]'), +); + +export const indexSignature = { + create: nameToIndexSignature, + regex: indexSignatureRegexp, +}; diff --git a/src/utils/compareFunctions.js b/src/utils/compare.ts similarity index 55% rename from src/utils/compareFunctions.js rename to src/utils/compare.ts index e07b0cf..eb84105 100644 --- a/src/utils/compareFunctions.js +++ b/src/utils/compare.ts @@ -1,26 +1,34 @@ -const naturalCompare = require('natural-compare-lite'); +import naturalCompare from 'natural-compare-lite'; -function charCompare(a, b) { +import { indexSignature } from './common'; + +function charCompare(a: string, b: string) { if (a < b) { return -1; } + if (b < a) { return 1; } + return 0; } -function getWeight(value) { +function getWeight(value: string) { switch (true) { - // Index signature - case /^\[index:/.test(value): + // Custom name for index signature used here + case indexSignature.regex.test(value): return 100; default: return 0; } } -function weightedCompare(a, b, compareFn) { +function weightedCompare( + a: string, + b: string, + compareFn: (a: string, b: string) => number, +) { return compareFn(a, b) - getWeight(a) + getWeight(b); } @@ -30,31 +38,29 @@ function weightedCompare(a, b, compareFn) { * Postfix `I` is meant insensitive. * Postfix `N` is meant natural. */ -const compareFunctions = { - asc(a, b) { +export const compareFunctions = { + asc(a: string, b: string) { return weightedCompare(a, b, charCompare); }, - ascI(a, b) { + ascI(a: string, b: string) { return weightedCompare(a.toLowerCase(), b.toLowerCase(), charCompare); }, - ascN(a, b) { + ascN(a: string, b: string) { return weightedCompare(a, b, naturalCompare); }, - ascIN(a, b) { + ascIN(a: string, b: string) { return weightedCompare(a.toLowerCase(), b.toLowerCase(), naturalCompare); }, - desc(a, b) { + desc(a: string, b: string) { return compareFunctions.asc(b, a); }, - descI(a, b) { + descI(a: string, b: string) { return compareFunctions.ascI(b, a); }, - descN(a, b) { + descN(a: string, b: string) { return compareFunctions.ascN(b, a); }, - descIN(a, b) { + descIN(a: string, b: string) { return compareFunctions.ascIN(b, a); }, }; - -exports.compareFunctions = compareFunctions; diff --git a/src/plugin.js b/src/utils/plugin.ts similarity index 88% rename from src/plugin.js rename to src/utils/plugin.ts index 2372c70..61f00b6 100644 --- a/src/plugin.js +++ b/src/utils/plugin.ts @@ -1,7 +1,7 @@ -const assert = require('assert'); +import assert from 'assert'; -const { getPropertyName } = require('./utils/ast'); -const { compareFunctions } = require('./utils/compareFunctions'); +import { getPropertyName } from './ast'; +import { compareFunctions } from './compare'; function createNodeSwapper(context) { const sourceCode = context.getSourceCode(); @@ -66,9 +66,7 @@ function createNodeSwapper(context) { } // Check the punctuator value outside of filter because we // want to stop traversal on any terminating punctuator - return punctuator && /^[,;]$/.test(punctuator.value) - ? punctuator - : undefined; + return punctuator && /^[,;]$/.test(punctuator.value) ? punctuator : undefined; } return (fixer, nodePositions, currentNode, replaceNode) => @@ -80,9 +78,9 @@ function createNodeSwapper(context) { nodePositions.get(node).final === nodePositions.size - 1 && nodePositions.get(node).final === nodePositions.get(otherNode).initial; - let text = `${ - comments.length ? getIndentText(node) : '' - }${sourceCode.getText(node)}`; + let text = `${comments.length ? getIndentText(node) : ''}${sourceCode.getText( + node, + )}`; // If nextSibling is the node punctuator, remove it if (nextSibling === getNodePunctuator(node)) { @@ -125,7 +123,7 @@ function createNodeSwapper(context) { }, []); } -module.exports = function createReporter(context, createReportObject) { +export function createReporter(context, createReportObject) { // Parse options. const order = context.options[0] || 'asc'; const options = context.options[1]; @@ -144,10 +142,7 @@ module.exports = function createReporter(context, createReportObject) { }); const nodePositions = new Map( - body.map(n => [ - n, - { initial: body.indexOf(n), final: sortedBody.indexOf(n) }, - ]), + body.map(n => [n, { initial: body.indexOf(n), final: sortedBody.indexOf(n) }]), ); for (let i = 1; i < body.length; i += 1) { @@ -162,12 +157,9 @@ module.exports = function createReporter(context, createReportObject) { const { data, ...rest } = createReportObject(currentNode, replaceNode); // Sanity check + assert(rest.loc, 'createReportObject return value must include a node location'); assert( - rest.loc, - 'createReportObject return value must include a node location', - ); - assert( - rest.message, + rest.messageId, 'createReportObject return value must include a problem message', ); @@ -192,4 +184,4 @@ module.exports = function createReporter(context, createReportObject) { } } }; -}; +} diff --git a/src/utils/rule.ts b/src/utils/rule.ts new file mode 100644 index 0000000..0be2de8 --- /dev/null +++ b/src/utils/rule.ts @@ -0,0 +1,46 @@ +import { ESLintUtils } from '@typescript-eslint/experimental-utils'; +import { + ReportDescriptor, + RuleContext as UtilRuleContext, + RuleListener, + RuleMetaData as UtilRuleMetaData, + RuleMetaDataDocs as UtilRuleMetaDataDocs, + RuleModule, +} from '@typescript-eslint/experimental-utils/dist/ts-eslint'; + +export type BaseOptions = readonly unknown[]; + +// "url" will be set automatically. +export type RuleMetaDataDocs = Omit; + +// "docs.url" will be set automatically. +export type RuleMetaData = { + readonly docs: RuleMetaDataDocs; +} & Omit, 'docs'>; + +export type RuleResult = { + readonly context: UtilRuleContext; + readonly descriptors: ReadonlyArray>; +}; + +type Mutable = { + -readonly [P in keyof T]: T[P]; +}; + +/** + * Create a rule. + */ +export function createRule(data: { + readonly name: string; + readonly meta: RuleMetaData; + readonly defaultOptions: Options; + readonly create: ( + context: UtilRuleContext, + optionsWithDefault: Mutable, + ) => RuleListener; +}): RuleModule { + return ESLintUtils.RuleCreator( + name => + `https://github.com/infctr/eslint-plugin-typescript-sort-keys/blob/master/docs/rules/${name}.md`, + )(data); +} diff --git a/tests/autofix.spec.js b/tests/autofix.spec.ts similarity index 74% rename from tests/autofix.spec.js rename to tests/autofix.spec.ts index a0f8ef6..4e65a58 100644 --- a/tests/autofix.spec.js +++ b/tests/autofix.spec.ts @@ -1,13 +1,15 @@ -const assert = require('assert'); -const Path = require('path'); -const fs = require('fs'); +import assert from 'assert'; +import Path from 'path'; +import fs from 'fs'; -const spawn = require('cross-spawn'); -const tmp = require('tmp'); - -tmp.setGracefulCleanup(); +import spawn from 'cross-spawn'; +import tmp from 'tmp'; describe('autofix', () => { + beforeEach(() => { + tmp.setGracefulCleanup(); + }); + it('should properly format comments and indent level', () => { const { name: tmpDir } = tmp.dirSync({ prefix: 'typescript-sort-keys-', @@ -15,13 +17,8 @@ describe('autofix', () => { }); const testFilePath = Path.join(tmpDir, 'autofix.ts'); - const input = fs.readFileSync('tests/fixtures/autofix.input.ts', 'utf8'); - - const expected = fs.readFileSync( - 'tests/fixtures/autofix.output.ts', - 'utf8', - ); + const expected = fs.readFileSync('tests/fixtures/autofix.output.ts', 'utf8'); fs.writeFileSync(testFilePath, input); @@ -31,15 +28,14 @@ describe('autofix', () => { '--ext', '.ts', '--rulesdir', - 'src/rules', + // 'src/rules', + 'dist/rules', '--config', require.resolve('./fixtures/.eslintrc.js'), testFilePath, '--fix', ], - { - encoding: 'utf8', - }, + { encoding: 'utf8' }, ); if (result.status !== 0) { diff --git a/tests/config.spec.js b/tests/config.spec.js deleted file mode 100644 index bdccff8..0000000 --- a/tests/config.spec.js +++ /dev/null @@ -1,37 +0,0 @@ -const plugin = require('../src/index'); - -const RULE_NAME_PREFIX = 'typescript-sort-keys/'; - -// function entriesToObject(value: [string, T][]): Record { -// return value.reduce>((accum, [k, v]) => { -// accum[k] = v; -// return accum; -// }, {}); -// } - -const entriesToObject = value => - value.reduce((accum, [k, v]) => { - return { ...accum, [k]: v }; - }, {}); - -describe('recommended config', () => { - const { - rules, - configs: { - recommended: { rules: configRules }, - }, - } = plugin; - - const ruleConfigs = Object.entries(rules) - .filter( - ([, rule]) => rule.meta.docs && rule.meta.docs.recommended !== false, - ) - .map(([name, rule]) => [ - `${RULE_NAME_PREFIX}${name}`, - rule.meta.docs && rule.meta.docs.recommended ? 'error' : 'off', - ]); - - it('contains all recommended rules', () => { - expect(entriesToObject(ruleConfigs)).toEqual(configRules); - }); -}); diff --git a/tests/config.spec.ts b/tests/config.spec.ts new file mode 100644 index 0000000..9ece99b --- /dev/null +++ b/tests/config.spec.ts @@ -0,0 +1,52 @@ +import { readdirSync } from 'fs'; + +import plugin from '../src'; + +const RULE_NAME_PREFIX = 'typescript-sort-keys/'; + +function entriesToObject(value: readonly [string, T][]): Record { + return value.reduce>((accum, [k, v]) => { + accum[k] = v; + return accum; + }, {}); +} + +describe('recommended config', () => { + const { + rules, + configs: { + recommended: { rules: configRules }, + }, + } = plugin; + + const ruleConfigs = Object.entries(rules) + .filter(([, rule]) => rule.meta.docs && rule.meta.docs.recommended !== false) + .map<[string, string]>(([name, rule]) => [ + `${RULE_NAME_PREFIX}${name}`, + rule.meta.docs && rule.meta.docs.recommended ? 'error' : 'off', + ]); + + it('contains all recommended rules', () => { + expect(entriesToObject(ruleConfigs)).toEqual(configRules); + }); +}); + +describe('plugin', () => { + const ruleFiles: ReadonlyArray = readdirSync('./src/rules').filter( + file => file !== 'index.ts' && file.endsWith('.ts'), + ); + + const configFiles: ReadonlyArray = readdirSync('./src/config').filter( + file => file !== 'index.ts' && file.endsWith('.ts'), + ); + + it('should have all the rules', () => { + expect(plugin).toHaveProperty('rules'); + expect(Object.keys(plugin.rules)).toHaveLength(ruleFiles.length); + }); + + it('should have all the configs', () => { + expect(plugin).toHaveProperty('configs'); + expect(Object.keys(plugin.configs)).toHaveLength(configFiles.length); + }); +}); diff --git a/tests/lib/rules/.eslintrc.js b/tests/rules/.eslintrc.js similarity index 100% rename from tests/lib/rules/.eslintrc.js rename to tests/rules/.eslintrc.js diff --git a/tests/lib/rules/.prettierrc.js b/tests/rules/.prettierrc.js similarity index 100% rename from tests/lib/rules/.prettierrc.js rename to tests/rules/.prettierrc.js diff --git a/tests/lib/rules/interface.spec.js b/tests/rules/interface.spec.js similarity index 99% rename from tests/lib/rules/interface.spec.js rename to tests/rules/interface.spec.js index 40a2e7f..3f92fb1 100644 --- a/tests/lib/rules/interface.spec.js +++ b/tests/rules/interface.spec.js @@ -1,6 +1,6 @@ -const { RuleTester } = require('eslint'); +import { RuleTester } from 'eslint'; -const rule = require('../../../src/rules/interface'); +import { rule } from '../../src/rules/interface'; const ruleTester = new RuleTester({ parser: require.resolve('@typescript-eslint/parser'), diff --git a/tests/lib/rules/string-enum.spec.js b/tests/rules/string-enum.spec.js similarity index 99% rename from tests/lib/rules/string-enum.spec.js rename to tests/rules/string-enum.spec.js index 21cf746..c84fe88 100644 --- a/tests/lib/rules/string-enum.spec.js +++ b/tests/rules/string-enum.spec.js @@ -1,6 +1,6 @@ -const { RuleTester } = require('eslint'); +import { RuleTester } from 'eslint'; -const rule = require('../../../src/rules/string-enum'); +import { rule } from '../../src/rules/string-enum'; const ruleTester = new RuleTester({ parser: require.resolve('@typescript-eslint/parser'), diff --git a/tests/tsconfig.json b/tests/tsconfig.json new file mode 100644 index 0000000..0bc2cb2 --- /dev/null +++ b/tests/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "../build", + // Turn off checks to make debugging nicer. + "noFallthroughCasesInSwitch": false, + "noImplicitAny": false, + "noImplicitReturns": false, + "noImplicitThis": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "strictNullChecks": false + }, + "include": ["**/*.ts"], + "exclude": ["fixtures"] +} diff --git a/tsconfig.json b/tsconfig.json index ea108af..5d5eacf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,14 +6,14 @@ "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, // "lib": [], /* Specify library files to be included in the compilation. */ "allowJs": true /* Allow javascript files to be compiled. */, - // "checkJs": true /* Report errors in .js files. */, + "checkJs": true /* Report errors in .js files. */, // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ // "declaration": true, /* Generates corresponding '.d.ts' file. */ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ // "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "dist" /* Redirect output structure to the directory. */, - "rootDir": "." /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + "rootDir": "src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, // "composite": true, /* Enable project compilation */ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ // "removeComments": true, /* Do not emit comments to output. */ @@ -23,7 +23,7 @@ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ - "strict": true /* Enable all strict type-checking options. */, + "strict": false /* Enable all strict type-checking options. */, // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ @@ -33,10 +33,10 @@ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + "noUnusedLocals": true /* Report errors on unused locals. */, + "noUnusedParameters": true /* Report errors on unused parameters. */, + "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, + "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, /* Module Resolution Options */ "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, @@ -63,6 +63,5 @@ /* Advanced Options */ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ }, - "exclude": ["./node_modules", "src/tests/fixtures"], - "include": ["src", "tests"] + "exclude": ["./node_modules", "tests/fixtures"] } diff --git a/tsconfig.prod.json b/tsconfig.prod.json index 077d0e1..a09f44e 100644 --- a/tsconfig.prod.json +++ b/tsconfig.prod.json @@ -1,4 +1,7 @@ { "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "src" + }, "exclude": ["tests"] } diff --git a/yarn.lock b/yarn.lock index c5cf1dd..4740849 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,6 +16,15 @@ dependencies: "@babel/highlight" "^7.8.3" +"@babel/compat-data@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.6.tgz#3f604c40e420131affe6f2c8052e9a275ae2049b" + integrity sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g== + dependencies: + browserslist "^4.11.1" + invariant "^2.2.4" + semver "^5.5.0" + "@babel/core@^7.1.0", "@babel/core@^7.7.5": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" @@ -38,6 +47,28 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@~7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376" + integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.6" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.6" + "@babel/parser" "^7.9.6" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.9.0": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" @@ -48,6 +79,80 @@ lodash "^4.17.13" source-map "^0.5.0" +"@babel/generator@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" + integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ== + dependencies: + "@babel/types" "^7.9.6" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-compilation-targets@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz#1e05b7ccc9d38d2f8b40b458b380a04dcfadd38a" + integrity sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw== + dependencies: + "@babel/compat-data" "^7.9.6" + browserslist "^4.11.1" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz#965c8b0a9f051801fd9d3b372ca0ccf200a90897" + integrity sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow== + dependencies: + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.9.6" + "@babel/helper-split-export-declaration" "^7.8.3" + +"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" + integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== + dependencies: + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/helper-function-name@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" @@ -57,6 +162,15 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.9.5" + "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" @@ -64,6 +178,13 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-member-expression-to-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" @@ -98,11 +219,39 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-wrap-function" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444" + integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" + "@babel/helper-replace-supers@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" @@ -133,6 +282,21 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== +"@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + +"@babel/helper-wrap-function@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/helpers@^7.9.0": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" @@ -142,6 +306,15 @@ "@babel/traverse" "^7.9.0" "@babel/types" "^7.9.0" +"@babel/helpers@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580" + integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" + "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" @@ -165,20 +338,521 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== -"@babel/plugin-syntax-bigint@^7.0.0": +"@babel/parser@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" + integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== + +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" + integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63" + integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.9.5" + +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" + integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.8" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.0.0", "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-object-rest-spread@^7.0.0": +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" + integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" + integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" + integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-typescript@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc" + integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" + integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-destructuring@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" + integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" + integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-modules-amd@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz#8539ec42c153d12ea3836e0e3ac30d5aae7b258e" + integrity sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277" + integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz#207f1461c78a231d5337a92140e52422510d81a4" + integrity sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" + integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-regenerator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" + integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typescript@^7.9.0": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.6.tgz#2248971416a506fc78278fc0c0ea3179224af1e9" + integrity sha512-8OvsRdvpt3Iesf2qsAn+YdlwAJD7zJ+vhFZmDCa4b8dTp7MmHtKk5FF2mCsGxjZwuwsy/yIIay/nLmxST1ctVQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.9.6" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-typescript" "^7.8.3" + +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/preset-env@~7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6" + integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ== + dependencies: + "@babel/compat-data" "^7.9.6" + "@babel/helper-compilation-targets" "^7.9.6" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.6" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.5" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.9.5" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.9.0" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.6" + "@babel/plugin-transform-modules-commonjs" "^7.9.6" + "@babel/plugin-transform-modules-systemjs" "^7.9.6" + "@babel/plugin-transform-modules-umd" "^7.9.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.9.5" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.6" + browserslist "^4.11.1" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-typescript@~7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" + integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-typescript" "^7.9.0" + +"@babel/runtime@^7.8.4": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f" + integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.8.7": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" @@ -186,7 +860,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": +"@babel/template@^7.3.3", "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== @@ -210,6 +884,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.8.3", "@babel/traverse@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442" + integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.6" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.6" + "@babel/types" "^7.9.6" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" @@ -219,6 +908,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.9.5", "@babel/types@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" + integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== + dependencies: + "@babel/helper-validator-identifier" "^7.9.5" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -407,6 +1105,28 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" +"@jest/transform@^25.5.1": + version "25.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.5.1.tgz#0469ddc17699dd2bf985db55fa0fb9309f5c2db3" + integrity sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^25.5.0" + babel-plugin-istanbul "^6.0.0" + chalk "^3.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^25.5.1" + jest-regex-util "^25.2.6" + jest-util "^25.5.0" + micromatch "^4.0.2" + pirates "^4.0.1" + realpath-native "^2.0.0" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + "@jest/types@^25.2.3": version "25.2.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.2.3.tgz#035c4fb94e2da472f359ff9a211915d59987f6b6" @@ -417,6 +1137,16 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" @@ -431,7 +1161,7 @@ dependencies: type-detect "4.0.8" -"@types/babel__core@^7.1.0": +"@types/babel__core@^7.1.0", "@types/babel__core@^7.1.7": version "7.1.7" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== @@ -469,11 +1199,59 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/cross-spawn@~6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/cross-spawn/-/cross-spawn-6.0.1.tgz#60fa0c87046347c17d9735e5289e72b804ca9b63" + integrity sha512-MtN1pDYdI6D6QFDzy39Q+6c9rl2o/xN7aWGe6oZuzqq5N6+YuwFsWiEAv3dNzvzN9YzU+itpN8lBzFpphQKLAw== + dependencies: + "@types/node" "*" + +"@types/eslint-plugin-prettier@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz#451b5e1e5f148a38dc41e9c5b61d45cd2e97af2c" + integrity sha512-6/UIuz99F0IvtDez4U3bRwAmN4VKnuw10Ibblf0iZhtNbmbonMSLqs/qqsXrGIAWvjy+vXqYwOljgtLhrETSMg== + dependencies: + "@types/eslint" "*" + "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== +"@types/eslint@*", "@types/eslint@~6.8.0": + version "6.8.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-6.8.0.tgz#5f2289b9f01316da7cf31c9e63109a10602a23cb" + integrity sha512-hqzmggoxkOubpgTdcOltkfc5N8IftRJqU70d1jbOISjjZVPvjcr+CLi2CI70hx1SUIRkLgpglTy9w28nGe2Hsw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "0.0.44" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21" + integrity sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@*": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" + integrity sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ== + dependencies: + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -494,11 +1272,39 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/jest@~25.2.1": + version "25.2.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.1.tgz#9544cd438607955381c1bdbdb97767a249297db5" + integrity sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA== + dependencies: + jest-diff "^25.2.1" + pretty-format "^25.2.1" + +"@types/json-schema@*": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" + integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== + "@types/json-schema@^7.0.3": version "7.0.3" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/natural-compare-lite@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@types/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#90724682da3c304dd8d643b4e9ba00f53f29d454" + integrity sha512-ZDcj/yWsRPacqKPpCExWWFq9X1JQwEOfHsu8deN1Qfa6M02z6tN4DK6AMf2IkM7709gp3QW6Bo7m2NFDhA485w== + +"@types/node@*": + version "13.13.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.2.tgz#160d82623610db590a64e8ca81784e11117e5a54" + integrity sha512-LB2R1Oyhpg8gu4SON/mfforE525+Hi/M1ineICEDftqNVTyFg1aRIeGuTvXAoWHc4nbrFncWtJgMmoyRvuGh7A== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -509,11 +1315,34 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== +"@types/prettier@~2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.0.tgz#dc85454b953178cc6043df5208b9e949b54a3bc4" + integrity sha512-/rM+sWiuOZ5dvuVzV37sUuklsbg+JPOP8d+nNFlo2ZtfpzPiPvh1/gc8liWOLBqe+sR+ZM7guPaIcTt6UZTo7Q== + +"@types/requireindex@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/requireindex/-/requireindex-1.2.0.tgz#b31ed3719fe0a5824fef9a3165f7743560d26bd5" + integrity sha512-XgAXuN2bI/w2kAN6jwhb5jrrSznOsded+Fz5YC+3Vs3f8UyE3d8FnTvIWe6shZdpz9NMHY/wtEWk17yL0hCSmg== + +"@types/rimraf@~3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.0.tgz#b9d03f090ece263671898d57bb7bb007023ac19f" + integrity sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ== + dependencies: + "@types/glob" "*" + "@types/node" "*" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/tmp@~0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.1.0.tgz#19cf73a7bcf641965485119726397a096f0049bd" + integrity sha512-6IwZ9HzWbCq6XoQWhxLpDjuADodH/MKXRUIDFudvgjcVdjFknvmR+DNsoUeer4XPrEnrZs04Jj+kfV9pFsrhmA== + "@types/yargs-parser@*": version "15.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" @@ -546,6 +1375,26 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" +"@typescript-eslint/experimental-utils@^2.5.0": + version "2.30.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz#9845e868c01f3aed66472c561d4b6bac44809dd0" + integrity sha512-L3/tS9t+hAHksy8xuorhOzhdefN0ERPDWmR9CclsIGOUqGKy6tqc/P+SoXeJRye5gazkuPO0cK9MQRnolykzkA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.30.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/experimental-utils@~2.29.0": + version "2.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.29.0.tgz#3cb8060de9265ba131625a96bbfec31ba6d4a0fe" + integrity sha512-H/6VJr6eWYstyqjWXBP2Nn1hQJyvJoFdDtsHxGiD+lEP7piGnGpb/ZQd+z1ZSB1F7dN+WsxUDh8+S4LwI+f3jw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.29.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + "@typescript-eslint/parser@~2.26.0": version "2.26.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.26.0.tgz#385463615818b33acb72a25b39c03579df93d76f" @@ -569,6 +1418,32 @@ semver "^6.3.0" tsutils "^3.17.1" +"@typescript-eslint/typescript-estree@2.29.0": + version "2.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.29.0.tgz#1be6612bb02fc37ac9f466521c1459a4744e8d3a" + integrity sha512-3YGbtnWy4az16Egy5Fj5CckkVlpIh0MADtAQza+jiMADRSKkjdpzZp/5WuvwK/Qib3Z0HtzrDFeWanS99dNhnA== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^6.3.0" + tsutils "^3.17.1" + +"@typescript-eslint/typescript-estree@2.30.0": + version "2.30.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz#1b8e848b55144270255ffbfe4c63291f8f766615" + integrity sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^6.3.0" + tsutils "^3.17.1" + abab@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" @@ -813,6 +1688,27 @@ babel-jest@^25.2.4: chalk "^3.0.0" slash "^3.0.0" +babel-jest@~25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.5.1.tgz#bc2e6101f849d6f6aec09720ffc7bc5332e62853" + integrity sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ== + dependencies: + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.0" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^25.5.0" + chalk "^3.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + babel-plugin-istanbul@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" @@ -831,6 +1727,31 @@ babel-plugin-jest-hoist@^25.2.1: dependencies: "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz#129c80ba5c7fc75baf3a45b93e2e372d57ca2677" + integrity sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz#fb4a4c51fe38ca60fede1dc74ab35eb843cb41d6" + integrity sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + babel-preset-jest@^25.2.1: version "25.2.1" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.2.1.tgz#4ccd0e577f69aa11b71806edfe8b25a5c3ac93a2" @@ -840,6 +1761,14 @@ babel-preset-jest@^25.2.1: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" babel-plugin-jest-hoist "^25.2.1" +babel-preset-jest@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz#c1d7f191829487a907764c65307faa0e66590b49" + integrity sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw== + dependencies: + babel-plugin-jest-hoist "^25.5.0" + babel-preset-current-node-syntax "^0.1.2" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -908,6 +1837,16 @@ browser-resolve@^1.11.3: dependencies: resolve "1.1.7" +browserslist@^4.11.1, browserslist@^4.8.5: + version "4.12.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" + integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== + dependencies: + caniuse-lite "^1.0.30001043" + electron-to-chromium "^1.3.413" + node-releases "^1.1.53" + pkg-up "^2.0.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -950,6 +1889,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +caniuse-lite@^1.0.30001043: + version "1.0.30001048" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz#4bb4f1bc2eb304e5e1154da80b93dee3f1cf447e" + integrity sha512-g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -1138,11 +2082,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -confusing-browser-globals@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" - integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== - contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" @@ -1160,6 +2099,14 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +core-js-compat@^3.6.2: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== + dependencies: + browserslist "^4.8.5" + semver "7.0.0" + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1338,6 +2285,11 @@ diff-sequences@^25.2.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.1.tgz#fcfe8aa07dd9b0c648396a478dabca8e76c6ab27" integrity sha512-foe7dXnGlSh3jR1ovJmdv+77VQj98eKCHHwJPbZ2eEf0fHwKbkZicpPxEch9smZ+n2dnF6QFwkOQdLq9hpeJUg== +diff-sequences@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" + integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== + diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -1373,6 +2325,11 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +electron-to-chromium@^1.3.413: + version "1.3.426" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.426.tgz#d7301de9e40df83a40fe1f51b4463cfe170d1153" + integrity sha512-sdQ7CXQbFflKY5CU63ra+kIYq9F7d1OqI33856qJZxTrwo0sLASdmoRl9lWpGrQDS9Nk/RFliQWd3PPDrZ+Meg== + elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -1466,15 +2423,6 @@ escodegen@^1.11.1: optionalDependencies: source-map "~0.6.1" -eslint-config-airbnb-base@~14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz#2ba4592dd6843258221d9bff2b6831bd77c874e4" - integrity sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw== - dependencies: - confusing-browser-globals "^1.0.9" - object.assign "^4.1.0" - object.entries "^1.1.1" - eslint-config-prettier@~6.10.1: version "6.10.1" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz#129ef9ec575d5ddc0e269667bf09defcd898642a" @@ -1498,13 +2446,10 @@ eslint-module-utils@^2.4.1: debug "^2.6.9" pkg-dir "^2.0.0" -eslint-plugin-es@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz#98cb1bc8ab0aa807977855e11ad9d1c9422d014b" - integrity sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" +eslint-plugin-eslint-plugin@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-2.2.1.tgz#9d567f2bb6891935d5d3e741f66c9ac42dc688fd" + integrity sha512-nvmoefIqdFX+skyCt/dN9HaeSNyL8A9UvEtCqCFfJBjKpAR0uRL3SGPLlvDsnfXWtN72G/viowvpA33VjQkGCg== eslint-plugin-import@~2.20.2: version "2.20.2" @@ -1524,17 +2469,12 @@ eslint-plugin-import@~2.20.2: read-pkg-up "^2.0.0" resolve "^1.12.0" -eslint-plugin-node@~11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" - integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== +eslint-plugin-jest@~23.8.2: + version "23.8.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz#6f28b41c67ef635f803ebd9e168f6b73858eb8d4" + integrity sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg== dependencies: - eslint-plugin-es "^3.0.0" - eslint-utils "^2.0.0" - ignore "^5.1.1" - minimatch "^3.0.4" - resolve "^1.10.1" - semver "^6.1.0" + "@typescript-eslint/experimental-utils" "^2.5.0" eslint-plugin-prettier@~3.1.2: version "3.1.2" @@ -2039,6 +2979,11 @@ graceful-fs@^4.2.3: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -2181,11 +3126,6 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558" - integrity sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ== - import-fresh@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" @@ -2252,6 +3192,13 @@ inquirer@^7.0.0: strip-ansi "^5.1.0" through "^2.3.6" +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" @@ -2605,6 +3552,16 @@ jest-config@^25.2.4: pretty-format "^25.2.3" realpath-native "^2.0.0" +jest-diff@^25.2.1: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" + integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== + dependencies: + chalk "^3.0.0" + diff-sequences "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.5.0" + jest-diff@^25.2.3: version "25.2.3" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.2.3.tgz#54d601a0a754ef26e808a8c8dbadd278c215aa3f" @@ -2662,6 +3619,11 @@ jest-get-type@^25.2.1: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.1.tgz#6c83de603c41b1627e6964da2f5454e6aa3c13a6" integrity sha512-EYjTiqcDTCRJDcSNKbLTwn/LcDPEE7ITk8yRMNAOjEsN6yp+Uu+V1gx4djwnuj/DvWg0YGmqaBqPVGsPxlvE7w== +jest-get-type@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" + integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== + jest-haste-map@^25.2.3: version "25.2.3" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.2.3.tgz#2649392b5af191f0167a27bfb62e5d96d7eaaade" @@ -2681,6 +3643,26 @@ jest-haste-map@^25.2.3: optionalDependencies: fsevents "^2.1.2" +jest-haste-map@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.5.1.tgz#1df10f716c1d94e60a1ebf7798c9fb3da2620943" + integrity sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ== + dependencies: + "@jest/types" "^25.5.0" + "@types/graceful-fs" "^4.1.2" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-serializer "^25.5.0" + jest-util "^25.5.0" + jest-worker "^25.5.0" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + which "^2.0.2" + optionalDependencies: + fsevents "^2.1.2" + jest-jasmine2@^25.2.4: version "25.2.4" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.2.4.tgz#5f77de83e1027f0c7588137055a80da773872374" @@ -2753,6 +3735,11 @@ jest-regex-util@^25.2.1: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.1.tgz#db64b0d15cd3642c93b7b9627801d7c518600584" integrity sha512-wroFVJw62LdqTdkL508ZLV82FrJJWVJMIuYG7q4Uunl1WAPTf4ftPKrqqfec4SvOIlvRZUdEX2TFpWR356YG/w== +jest-regex-util@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" + integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== + jest-resolve-dependencies@^25.2.4: version "25.2.4" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.4.tgz#2d904400387d74a366dff54badb40a2b3210e733" @@ -2835,6 +3822,13 @@ jest-serializer@^25.2.1: resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.2.1.tgz#51727a5fc04256f461abe0fa024a022ba165877a" integrity sha512-fibDi7M5ffx6c/P66IkvR4FKkjG5ldePAK1WlbNoaU4GZmIAkS9Le/frAwRUFEX0KdnisSPWf+b1RC5jU7EYJQ== +jest-serializer@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.5.0.tgz#a993f484e769b4ed54e70e0efdb74007f503072b" + integrity sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA== + dependencies: + graceful-fs "^4.2.4" + jest-snapshot@^25.2.4: version "25.2.4" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.2.4.tgz#08d4517579c864df4280bcc948ceea34327a4ded" @@ -2865,6 +3859,17 @@ jest-util@^25.2.3: is-ci "^2.0.0" make-dir "^3.0.0" +jest-util@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.5.0.tgz#31c63b5d6e901274d264a4fec849230aa3fa35b0" + integrity sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA== + dependencies: + "@jest/types" "^25.5.0" + chalk "^3.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + make-dir "^3.0.0" + jest-validate@^25.2.3: version "25.2.3" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.2.3.tgz#ecb0f093cf8ae71d15075fb48439b6f78f1fcb5a" @@ -2897,6 +3902,14 @@ jest-worker@^25.2.1: merge-stream "^2.0.0" supports-color "^7.0.0" +jest-worker@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + jest@~25.2.4: version "25.2.4" resolved "https://registry.yarnpkg.com/jest/-/jest-25.2.4.tgz#d10941948a2b57eb7accc2e7ae78af4a0e11b40a" @@ -2906,7 +3919,7 @@ jest@~25.2.4: import-local "^3.0.2" jest-cli "^25.2.4" -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -2961,6 +3974,11 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -3037,6 +4055,13 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -3208,6 +4233,13 @@ lolex@^5.0.0: dependencies: "@sinonjs/commons" "^1.7.0" +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + make-dir@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" @@ -3397,6 +4429,11 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" +node-releases@^1.1.53: + version "1.1.53" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" + integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== + normalize-package-data@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -3494,16 +4531,6 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.entries@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" - integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -3785,6 +4812,13 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" @@ -3819,6 +4853,16 @@ prettier@~2.0.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.2.tgz#1ba8f3eb92231e769b7fcd7cb73ae1b6b74ade08" integrity sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg== +pretty-format@^25.2.1, pretty-format@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== + dependencies: + "@jest/types" "^25.5.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + pretty-format@^25.2.3: version "25.2.3" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.2.3.tgz#ba6e9603a0d80fa2e470b1fed55de1f9bfd81421" @@ -3829,6 +4873,11 @@ pretty-format@^25.2.3: ansi-styles "^4.0.0" react-is "^16.12.0" +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -3909,11 +4958,31 @@ realpath-native@^2.0.0: resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + regenerator-runtime@^0.13.4: version "0.13.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + dependencies: + "@babel/runtime" "^7.8.4" + private "^0.1.8" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -3932,6 +5001,30 @@ regexpp@^3.0.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -3999,11 +5092,6 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -requireindex@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" - integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -4031,13 +5119,6 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.10.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" - integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== - dependencies: - path-parse "^1.0.6" - resolve@^1.12.0, resolve@^1.15.1, resolve@^1.3.2: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" @@ -4179,6 +5260,11 @@ semver-regex@^2.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + semver@^5.4.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -4189,11 +5275,6 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" - integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== - set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -4801,6 +5882,29 @@ typescript@~3.8.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" From 1f95122d0c6a33bf2553ab448640660fe22da025 Mon Sep 17 00:00:00 2001 From: infctr Date: Sat, 2 May 2020 22:18:10 +0300 Subject: [PATCH 03/26] Update toolchain to run tests --- .eslintignore | 2 + .github/workflows/tests.yml | 23 ++- babel.config.js | 29 ++++ jest.config.js | 3 + package.json | 20 ++- src/rules/index.ts | 2 - src/rules/interface.ts | 8 +- src/rules/string-enum.ts | 8 +- tests/autofix.spec.ts | 4 +- tests/config.spec.ts | 6 +- tests/rules/interface.spec.js | 2 +- tests/rules/string-enum.spec.js | 2 +- tsconfig.json | 8 +- yarn.lock | 282 ++++++++++++++++++++++++++++++-- 14 files changed, 344 insertions(+), 55 deletions(-) diff --git a/.eslintignore b/.eslintignore index 1739d64..d3146c9 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,4 @@ tests/fixtures/** dist +lib +build diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cdd5bde..0a675dc 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -5,13 +5,12 @@ name: Tests on: push: - branches: [ master ] + branches: [master] pull_request: - branches: [ master ] + branches: [master] jobs: build: - runs-on: ubuntu-latest strategy: @@ -19,12 +18,12 @@ jobs: node-version: [10.x, 12.x] steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: yarn - - run: yarn test - env: - CI: true + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: yarn + - run: yarn verify + env: + CI: true diff --git a/babel.config.js b/babel.config.js index 8165fe4..ab5c600 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,6 +1,35 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const tsconfig = require('tsconfig'); +const fs = require('fs'); +const assert = require('assert'); + +const isTest = process.env.NODE_ENV === 'test'; +const filePath = tsconfig.resolveSync('.'); + +assert(filePath); + +// @ts-ignore +const config = tsconfig.readFileSync(filePath); +const baseUrl = config.compilerOptions.baseUrl; + +const moduleMappings = fs + .readdirSync(baseUrl, { withFileTypes: true }) + .filter(dirent => dirent.isDirectory()) + .map(dirent => dirent.name) + .reduce((memo, dir) => ({ ...memo, [dir]: ['./src/', dir].join('') }), {}); + module.exports = { presets: [ ['@babel/preset-env', { targets: { node: 'current' } }], '@babel/preset-typescript', ], + plugins: [ + !isTest && [ + 'module-resolver', + { + root: ['./src'], + alias: moduleMappings, + }, + ], + ].filter(Boolean), }; diff --git a/jest.config.js b/jest.config.js index ac0b2a7..0159876 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,4 +1,7 @@ +const shouldUseCompiled = process.env.USE_COMPILED; + module.exports = { testRegex: 'tests/.*\\.spec\\.(js|ts)$', moduleDirectories: ['node_modules', 'src'], + testPathIgnorePatterns: [!shouldUseCompiled && 'tests/autofix.spec.ts'].filter(Boolean), }; diff --git a/package.json b/package.json index 08ec516..010d107 100644 --- a/package.json +++ b/package.json @@ -12,21 +12,24 @@ "main": "dist/index.js", "repository": "git@github.com:infctr/eslint-plugin-typescript-sort-keys.git", "scripts": { - "prebuild": "yarn test", - "build": "rimraf dist && tsc --project ./tsconfig.prod.json", - "lint": "eslint --ext .js,.ts src/ tests/", - "lint:fix": "eslint src/ tests/ --fix", + "build": "yarn rimraf lib && yarn compile", + "build-tests": "yarn rimraf build && yarn compile-tests", + "compile": "yarn rollup -c", + "compile-tests": "yarn babel --extensions .ts src --out-dir build", "docs": "eslint-docs", "docs:check": "eslint-docs check", + "lint": "eslint --ext .js,.ts src/ tests/", + "postlint": "yarn docs:check", "format": "prettier --write src/**/*.{js,ts} tests/**/*.{js,ts}", - "pretest": "yarn lint", - "test": "jest --silent --runInBand", - "posttest": "yarn docs:check" + "test": "yarn jest --runInBand", + "test-compiled": "mv build/rules build/source && cp -r tests/fixtures/rulesdir build/rules && USE_COMPILED=1 yarn test", + "verify": "yarn build && yarn lint && yarn build-tests && yarn test-compiled && rimraf build" }, "dependencies": { "natural-compare-lite": "~1.4.0" }, "devDependencies": { + "@babel/cli": "~7.8.4", "@babel/core": "~7.9.6", "@babel/preset-env": "~7.9.6", "@babel/preset-typescript": "~7.9.0", @@ -44,6 +47,7 @@ "@typescript-eslint/experimental-utils": "~2.29.0", "@typescript-eslint/parser": "~2.26.0", "babel-jest": "~25.5.1", + "babel-plugin-module-resolver": "~4.0.0", "cross-spawn": "~7.0.1", "eslint": "~6.8.0", "eslint-config-prettier": "~6.10.1", @@ -53,10 +57,12 @@ "eslint-plugin-prettier": "~3.1.2", "husky": "~4.2.3", "jest": "~25.2.4", + "jsonc": "~2.0.0", "lint-staged": "~10.1.1", "prettier": "~2.0.2", "rimraf": "~3.0.2", "tmp": "~0.1.0", + "tsconfig": "~7.0.0", "typescript": "~3.8.3" }, "peerDependencies": { diff --git a/src/rules/index.ts b/src/rules/index.ts index 875d51a..15451fd 100644 --- a/src/rules/index.ts +++ b/src/rules/index.ts @@ -5,5 +5,3 @@ export const rules = { [interfaceName]: interfaceRule, [stringEnumName]: stringEnumRule, }; - -// export default rules; diff --git a/src/rules/interface.ts b/src/rules/interface.ts index 6a3f456..bec66e2 100644 --- a/src/rules/interface.ts +++ b/src/rules/interface.ts @@ -1,8 +1,8 @@ import { JSONSchema4 } from 'json-schema'; -import { getObjectBody } from '../utils/ast'; -import { createReporter } from '../utils/plugin'; -import { createRule, RuleMetaData } from '../utils/rule'; +import { getObjectBody } from 'utils/ast'; +import { createReporter } from 'utils/plugin'; +import { createRule, RuleMetaData } from 'utils/rule'; import { sortingOrderOptionSchema, sortingParamsOptionSchema, @@ -10,7 +10,7 @@ import { SortingParamsOption, SortingOrderOption, ErrorMessage, -} from '../common/options'; +} from 'common/options'; // The name of this rule. export const name = 'interface' as const; diff --git a/src/rules/string-enum.ts b/src/rules/string-enum.ts index 49d1d5c..c2ccb95 100644 --- a/src/rules/string-enum.ts +++ b/src/rules/string-enum.ts @@ -1,8 +1,8 @@ import { JSONSchema4 } from 'json-schema'; -import { getObjectBody } from '../utils/ast'; -import { createReporter } from '../utils/plugin'; -import { createRule, RuleMetaData } from '../utils/rule'; +import { getObjectBody } from 'utils/ast'; +import { createReporter } from 'utils/plugin'; +import { createRule, RuleMetaData } from 'utils/rule'; import { sortingOrderOptionSchema, sortingParamsOptionSchema, @@ -10,7 +10,7 @@ import { SortingParamsOption, SortingOrderOption, ErrorMessage, -} from '../common/options'; +} from 'common/options'; // The name of this rule. export const name = 'string-enum' as const; diff --git a/tests/autofix.spec.ts b/tests/autofix.spec.ts index 4e65a58..6338b98 100644 --- a/tests/autofix.spec.ts +++ b/tests/autofix.spec.ts @@ -1,7 +1,6 @@ import assert from 'assert'; import Path from 'path'; import fs from 'fs'; - import spawn from 'cross-spawn'; import tmp from 'tmp'; @@ -28,8 +27,7 @@ describe('autofix', () => { '--ext', '.ts', '--rulesdir', - // 'src/rules', - 'dist/rules', + 'build/rules', '--config', require.resolve('./fixtures/.eslintrc.js'), testFilePath, diff --git a/tests/config.spec.ts b/tests/config.spec.ts index 9ece99b..7a07b5f 100644 --- a/tests/config.spec.ts +++ b/tests/config.spec.ts @@ -5,9 +5,9 @@ import plugin from '../src'; const RULE_NAME_PREFIX = 'typescript-sort-keys/'; function entriesToObject(value: readonly [string, T][]): Record { - return value.reduce>((accum, [k, v]) => { - accum[k] = v; - return accum; + return value.reduce>((memo, [k, v]) => { + memo[k] = v; + return memo; }, {}); } diff --git a/tests/rules/interface.spec.js b/tests/rules/interface.spec.js index 3f92fb1..28f7f20 100644 --- a/tests/rules/interface.spec.js +++ b/tests/rules/interface.spec.js @@ -1,6 +1,6 @@ import { RuleTester } from 'eslint'; -import { rule } from '../../src/rules/interface'; +import { rule } from 'rules/interface'; const ruleTester = new RuleTester({ parser: require.resolve('@typescript-eslint/parser'), diff --git a/tests/rules/string-enum.spec.js b/tests/rules/string-enum.spec.js index c84fe88..e6a34c1 100644 --- a/tests/rules/string-enum.spec.js +++ b/tests/rules/string-enum.spec.js @@ -1,6 +1,6 @@ import { RuleTester } from 'eslint'; -import { rule } from '../../src/rules/string-enum'; +import { rule } from 'rules/string-enum'; const ruleTester = new RuleTester({ parser: require.resolve('@typescript-eslint/parser'), diff --git a/tsconfig.json b/tsconfig.json index 5d5eacf..56139bf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,14 +6,14 @@ "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, // "lib": [], /* Specify library files to be included in the compilation. */ "allowJs": true /* Allow javascript files to be compiled. */, - "checkJs": true /* Report errors in .js files. */, + "checkJs": false /* Report errors in .js files. */, // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ // "declaration": true, /* Generates corresponding '.d.ts' file. */ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ // "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "dist" /* Redirect output structure to the directory. */, - "rootDir": "src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + "outDir": "build" /* Redirect output structure to the directory. */, + // "rootDir": "src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, // "composite": true, /* Enable project compilation */ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ // "removeComments": true, /* Do not emit comments to output. */ @@ -63,5 +63,5 @@ /* Advanced Options */ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ }, - "exclude": ["./node_modules", "tests/fixtures"] + "exclude": ["./node_modules", "tests/fixtures", "dist", "lib"] } diff --git a/yarn.lock b/yarn.lock index 4740849..6844b6c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,22 @@ # yarn lockfile v1 +"@babel/cli@~7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.8.4.tgz#505fb053721a98777b2b175323ea4f090b7d3c1c" + integrity sha512-XXLgAm6LBbaNxaGhMAznXXaxtCWfuv6PIDJ9Alsy9JYTOh+j2jJz+L/162kkfU1j/pTSxK1xGmlwI4pdIMkoag== + dependencies: + commander "^4.0.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.13" + make-dir "^2.1.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.1.8" + "@babel/code-frame@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" @@ -1338,6 +1354,16 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== + "@types/tmp@~0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.1.0.tgz#19cf73a7bcf641965485119726397a096f0049bd" @@ -1655,6 +1681,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1736,6 +1767,17 @@ babel-plugin-jest-hoist@^25.5.0: "@babel/types" "^7.3.3" "@types/babel__traverse" "^7.0.6" +babel-plugin-module-resolver@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.0.0.tgz#8f3a3d9d48287dc1d3b0d5595113adabd36a847f" + integrity sha512-3pdEq3PXALilSJ6dnC4wMWr0AZixHRM4utpdpBR9g5QG7B7JwWyukQv7a9hVxkbGFl+nQbrHDqqQOIBtTXTP/Q== + dependencies: + find-babel-config "^1.2.0" + glob "^7.1.6" + pkg-up "^3.1.0" + reselect "^4.0.0" + resolve "^1.13.1" + babel-preset-current-node-syntax@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz#fb4a4c51fe38ca60fede1dc74ab35eb843cb41d6" @@ -1794,6 +1836,18 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1802,7 +1856,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -1939,6 +1993,25 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -2087,7 +2160,7 @@ contains-path@^0.1.0: resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -2107,7 +2180,7 @@ core-js-compat@^3.6.2: browserslist "^4.8.5" semver "7.0.0" -core-util-is@1.0.2: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= @@ -2738,6 +2811,11 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-safe-stringify@^2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" + integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -2774,6 +2852,11 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -2791,6 +2874,14 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-babel-config@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" + integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA== + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -2860,11 +2951,24 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@^1.2.7: + version "1.2.12" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" + integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + fsevents@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" @@ -2926,6 +3030,14 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + glob-parent@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" @@ -2933,7 +3045,7 @@ glob-parent@^5.0.0: dependencies: is-glob "^4.0.1" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -2969,6 +3081,11 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + graceful-fs@^4.1.2: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" @@ -2979,11 +3096,6 @@ graceful-fs@^4.2.3: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== -graceful-fs@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -3173,6 +3285,11 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + inquirer@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" @@ -3223,6 +3340,13 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -3301,7 +3425,7 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^2.1.1: +is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= @@ -3328,6 +3452,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + is-glob@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" @@ -3429,7 +3560,7 @@ is-wsl@^2.1.1: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== -isarray@1.0.0, isarray@^1.0.0: +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -4004,6 +4135,11 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + json5@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" @@ -4011,6 +4147,18 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" +jsonc@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/jsonc/-/jsonc-2.0.0.tgz#9e2a25100d164a9bb864c57517563717fa882551" + integrity sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw== + dependencies: + fast-safe-stringify "^2.0.6" + graceful-fs "^4.1.15" + mkdirp "^0.5.1" + parse-json "^4.0.0" + strip-bom "^4.0.0" + strip-json-comments "^3.0.1" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -4240,6 +4388,14 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + make-dir@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" @@ -4271,7 +4427,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -micromatch@^3.1.4: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -4376,6 +4532,11 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" +nan@^2.12.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -4717,6 +4878,11 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -4791,6 +4957,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" @@ -4819,6 +4990,13 @@ pkg-up@^2.0.0: dependencies: find-up "^2.1.0" +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" @@ -4878,6 +5056,11 @@ private@^0.1.8: resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -4953,6 +5136,28 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" +readable-stream@^2.0.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + realpath-native@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" @@ -5092,6 +5297,11 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +reselect@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" + integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -5126,6 +5336,13 @@ resolve@^1.12.0, resolve@^1.15.1, resolve@^1.3.2: dependencies: path-parse "^1.0.6" +resolve@^1.13.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + resolve@^1.5.0: version "1.9.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" @@ -5206,7 +5423,7 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== -safe-buffer@~5.1.1: +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -5265,7 +5482,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^5.4.1: +semver@^5.4.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -5334,6 +5551,11 @@ sisteransi@^1.0.4: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -5584,6 +5806,13 @@ string.prototype.trimstart@^1.0.0: define-properties "^1.1.3" es-abstract "^1.17.5" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -5641,6 +5870,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-json-comments@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + strip-json-comments@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" @@ -5819,6 +6053,16 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +tsconfig@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + tslib@^1.8.1: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" @@ -5923,6 +6167,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -5940,6 +6189,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" From 22abb3df4d925ee23b431e03fa1b37106b2f1280 Mon Sep 17 00:00:00 2001 From: infctr Date: Sat, 2 May 2020 22:32:23 +0300 Subject: [PATCH 04/26] Add fixture wrapper for rulesdir/autofix test --- tests/fixtures/rulesdir/.eslintignore | 1 + tests/fixtures/rulesdir/interface.js | 7 +++++++ tests/fixtures/rulesdir/string-enum.js | 7 +++++++ 3 files changed, 15 insertions(+) create mode 100644 tests/fixtures/rulesdir/.eslintignore create mode 100644 tests/fixtures/rulesdir/interface.js create mode 100644 tests/fixtures/rulesdir/string-enum.js diff --git a/tests/fixtures/rulesdir/.eslintignore b/tests/fixtures/rulesdir/.eslintignore new file mode 100644 index 0000000..72e8ffc --- /dev/null +++ b/tests/fixtures/rulesdir/.eslintignore @@ -0,0 +1 @@ +* diff --git a/tests/fixtures/rulesdir/interface.js b/tests/fixtures/rulesdir/interface.js new file mode 100644 index 0000000..d242b2f --- /dev/null +++ b/tests/fixtures/rulesdir/interface.js @@ -0,0 +1,7 @@ +const { rule } = require('../source/interface') + +/** + * `module.exports` is required for `eslint --rulesdir` interop in autofix tests + * @see https://github.com/eslint/eslint/issues/13232 + */ +module.exports = rule diff --git a/tests/fixtures/rulesdir/string-enum.js b/tests/fixtures/rulesdir/string-enum.js new file mode 100644 index 0000000..a0e2885 --- /dev/null +++ b/tests/fixtures/rulesdir/string-enum.js @@ -0,0 +1,7 @@ +const { rule } = require('../source/string-enum') + +/** + * `module.exports` is required for `eslint --rulesdir` interop in autofix tests + * @see https://github.com/eslint/eslint/issues/13232 + */ +module.exports = rule From 787c5dbb3f3163206f171926f318a6fc57596762 Mon Sep 17 00:00:00 2001 From: infctr Date: Sun, 3 May 2020 20:39:10 +0300 Subject: [PATCH 05/26] Change comments to jsdoc commments --- src/rules/interface.ts | 28 +++++++++++++++++++++------- src/rules/string-enum.ts | 28 +++++++++++++++++++++------- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/rules/interface.ts b/src/rules/interface.ts index bec66e2..d352733 100644 --- a/src/rules/interface.ts +++ b/src/rules/interface.ts @@ -12,27 +12,39 @@ import { ErrorMessage, } from 'common/options'; -// The name of this rule. +/** + * The name of this rule. + */ export const name = 'interface' as const; -// The options this rule can take. +/** + * The options this rule can take. + */ type Options = [SortingOrderOption] | [SortingOrderOption, Partial]; -// The schema for the rule options. +/** + * The schema for the rule options. + */ const schema: JSONSchema4 = [sortingOrderOptionSchema, sortingParamsOptionSchema]; -// The default options for the rule. +/** + * The default options for the rule. + */ const defaultOptions: Options = [ SortingOrder.Ascending, { caseSensitive: true, natural: false }, ]; -// The possible error messages. +/** + * The possible error messages. + */ const errorMessages = { invalidOrder: ErrorMessage.InterfaceInvalidOrder, } as const; -// The meta data for this rule. +/** + * The meta data for this rule. + */ const meta: RuleMetaData = { type: 'suggestion', docs: { @@ -45,7 +57,9 @@ const meta: RuleMetaData = { schema, }; -// Create the rule. +/** + * Create the rule. + */ export const rule = createRule({ name, meta, diff --git a/src/rules/string-enum.ts b/src/rules/string-enum.ts index c2ccb95..784b3ea 100644 --- a/src/rules/string-enum.ts +++ b/src/rules/string-enum.ts @@ -12,27 +12,39 @@ import { ErrorMessage, } from 'common/options'; -// The name of this rule. +/** + * The name of this rule. + */ export const name = 'string-enum' as const; -// The options this rule can take. +/** + * The options this rule can take. + */ type Options = [SortingOrderOption] | [SortingOrderOption, Partial]; -// The schema for the rule options. +/** + * The schema for the rule options. + */ const schema: JSONSchema4 = [sortingOrderOptionSchema, sortingParamsOptionSchema]; -// The default options for the rule. +/** + * The default options for the rule. + */ const defaultOptions: Options = [ SortingOrder.Ascending, { caseSensitive: true, natural: false }, ]; -// The possible error messages. +/** + * The possible error messages. + */ const errorMessages = { invalidOrder: ErrorMessage.StringEnumInvalidOrder, } as const; -// The meta data for this rule. +/** + * The meta data for this rule. + */ const meta: RuleMetaData = { type: 'suggestion', docs: { @@ -45,7 +57,9 @@ const meta: RuleMetaData = { schema, }; -// Create the rule. +/** + * Create the rule. + */ export const rule = createRule({ name, meta, From e7cd030fe09a7a8a17181e9d31fd418a8faa7d8e Mon Sep 17 00:00:00 2001 From: infctr Date: Mon, 4 May 2020 18:28:32 +0300 Subject: [PATCH 06/26] Update tests to typescript --- src/rules/interface.ts | 4 +- src/rules/string-enum.ts | 4 +- src/utils/rule.ts | 2 +- tests/autofix.spec.ts | 7 +- tests/config.spec.ts | 23 +- tests/helpers/configs.ts | 12 + tests/helpers/tsconfig.json | 10 + tests/helpers/util.ts | 46 ++ tests/rules/interface.spec.js | 537 --------------- tests/rules/interface.spec.ts | 1131 +++++++++++++++++++++++++++++++ tests/rules/string-enum.spec.js | 445 ------------ tests/rules/string-enum.spec.ts | 859 +++++++++++++++++++++++ tsconfig.json | 2 +- 13 files changed, 2081 insertions(+), 1001 deletions(-) create mode 100644 tests/helpers/configs.ts create mode 100644 tests/helpers/tsconfig.json create mode 100644 tests/helpers/util.ts delete mode 100644 tests/rules/interface.spec.js create mode 100644 tests/rules/interface.spec.ts delete mode 100644 tests/rules/string-enum.spec.js create mode 100644 tests/rules/string-enum.spec.ts diff --git a/src/rules/interface.ts b/src/rules/interface.ts index d352733..a368062 100644 --- a/src/rules/interface.ts +++ b/src/rules/interface.ts @@ -20,7 +20,9 @@ export const name = 'interface' as const; /** * The options this rule can take. */ -type Options = [SortingOrderOption] | [SortingOrderOption, Partial]; +export type Options = + | [SortingOrderOption] + | [SortingOrderOption, Partial]; /** * The schema for the rule options. diff --git a/src/rules/string-enum.ts b/src/rules/string-enum.ts index 784b3ea..53ff4fd 100644 --- a/src/rules/string-enum.ts +++ b/src/rules/string-enum.ts @@ -20,7 +20,9 @@ export const name = 'string-enum' as const; /** * The options this rule can take. */ -type Options = [SortingOrderOption] | [SortingOrderOption, Partial]; +export type Options = + | [SortingOrderOption] + | [SortingOrderOption, Partial]; /** * The schema for the rule options. diff --git a/src/utils/rule.ts b/src/utils/rule.ts index 0be2de8..2c68ab8 100644 --- a/src/utils/rule.ts +++ b/src/utils/rule.ts @@ -20,7 +20,7 @@ export type RuleMetaData = { export type RuleResult = { readonly context: UtilRuleContext; - readonly descriptors: ReadonlyArray>; + readonly descriptors: readonly ReportDescriptor[]; }; type Mutable = { diff --git a/tests/autofix.spec.ts b/tests/autofix.spec.ts index 6338b98..ce9d55d 100644 --- a/tests/autofix.spec.ts +++ b/tests/autofix.spec.ts @@ -37,10 +37,9 @@ describe('autofix', () => { ); if (result.status !== 0) { - // eslint-disable-next-line no-console - console.error(result.stdout); - // eslint-disable-next-line no-console - console.error(result.stderr); + console.error(result.stdout); // eslint-disable-line no-console + console.error(result.stderr); // eslint-disable-line no-console + throw new Error(`Process exited with status ${result.status}`); } diff --git a/tests/config.spec.ts b/tests/config.spec.ts index 7a07b5f..60cdbd3 100644 --- a/tests/config.spec.ts +++ b/tests/config.spec.ts @@ -2,16 +2,8 @@ import { readdirSync } from 'fs'; import plugin from '../src'; -const RULE_NAME_PREFIX = 'typescript-sort-keys/'; - -function entriesToObject(value: readonly [string, T][]): Record { - return value.reduce>((memo, [k, v]) => { - memo[k] = v; - return memo; - }, {}); -} - describe('recommended config', () => { + const RULE_NAME_PREFIX = 'typescript-sort-keys/'; const { rules, configs: { @@ -19,6 +11,15 @@ describe('recommended config', () => { }, } = plugin; + const entriesToObject = ( + value: readonly [string, T][], + ): Record => { + return value.reduce>((memo, [k, v]) => { + memo[k] = v; + return memo; + }, {}); + }; + const ruleConfigs = Object.entries(rules) .filter(([, rule]) => rule.meta.docs && rule.meta.docs.recommended !== false) .map<[string, string]>(([name, rule]) => [ @@ -32,11 +33,11 @@ describe('recommended config', () => { }); describe('plugin', () => { - const ruleFiles: ReadonlyArray = readdirSync('./src/rules').filter( + const ruleFiles: readonly string[] = readdirSync('./src/rules').filter( file => file !== 'index.ts' && file.endsWith('.ts'), ); - const configFiles: ReadonlyArray = readdirSync('./src/config').filter( + const configFiles: readonly string[] = readdirSync('./src/config').filter( file => file !== 'index.ts' && file.endsWith('.ts'), ); diff --git a/tests/helpers/configs.ts b/tests/helpers/configs.ts new file mode 100644 index 0000000..4e03aef --- /dev/null +++ b/tests/helpers/configs.ts @@ -0,0 +1,12 @@ +import { Linter } from 'eslint'; +import * as path from 'path'; + +export const filename = path.join(__dirname, 'file.ts'); + +export const typescript: Linter.Config = { + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { + sourceType: 'module', + project: path.join(__dirname, './tsconfig.json'), + }, +}; diff --git a/tests/helpers/tsconfig.json b/tests/helpers/tsconfig.json new file mode 100644 index 0000000..c0f1603 --- /dev/null +++ b/tests/helpers/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "lib": ["es2017"], + "module": "commonjs", + "moduleResolution": "node", + "skipLibCheck": true, + "target": "es2017" + }, + "files": ["file.ts"] +} diff --git a/tests/helpers/util.ts b/tests/helpers/util.ts new file mode 100644 index 0000000..c2c7af9 --- /dev/null +++ b/tests/helpers/util.ts @@ -0,0 +1,46 @@ +import { RuleTester as ESLintRuleTester } from 'eslint'; +import { filename } from './configs'; + +type OptionsSet = { + /** + * The set of options this test case should pass for. + */ + readonly optionsSet: readonly (Options | [])[]; +}; + +export type ValidTestCase = Omit< + ESLintRuleTester.ValidTestCase, + 'options' +> & + OptionsSet; + +export type InvalidTestCase = Omit< + ESLintRuleTester.InvalidTestCase, + 'options' +> & + OptionsSet; + +/** + * Convert our test cases into ones eslint test runner is expecting. + */ +export function processInvalidTestCase( + testCases: readonly InvalidTestCase[], +): ESLintRuleTester.InvalidTestCase[] { + return testCases.flatMap(testCase => + testCase.optionsSet.map(options => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { optionsSet, ...eslintTestCase } = testCase; + + return { filename, ...eslintTestCase, options }; + }), + ); +} + +/** + * Convert our test cases into ones eslint test runner is expecting. + */ +export function processValidTestCase( + testCases: readonly ValidTestCase[], +): ESLintRuleTester.ValidTestCase[] { + return processInvalidTestCase(testCases as any); +} diff --git a/tests/rules/interface.spec.js b/tests/rules/interface.spec.js deleted file mode 100644 index 28f7f20..0000000 --- a/tests/rules/interface.spec.js +++ /dev/null @@ -1,537 +0,0 @@ -import { RuleTester } from 'eslint'; - -import { rule } from 'rules/interface'; - -const ruleTester = new RuleTester({ - parser: require.resolve('@typescript-eslint/parser'), -}); - -ruleTester.run('interface', rule, { - valid: [ - // default (asc) - { code: 'interface U {_:T; a:T; b:T;} // default (asc)' }, - { code: 'interface U {a:T; b:T; c:T;}' }, - { code: 'interface U {a:T; b:T; b_:T;}' }, - { code: 'interface U {C:T; b_:T; c:T;}' }, - { code: 'interface U {$:T; A:T; _:T; a:T;}' }, - { code: "interface U {1:T; '11':T; 2:T; A:T;}" }, - { code: "interface U {'#':T; 'Z':T; À:T; è:T;}" }, - - { code: 'interface U {a:T; ["ab"]:T; b:T; c:T;}' }, - - // nested - { code: 'interface U {a:T; b:{x:T; y:T;}; c:T;} // nested' }, - { code: 'interface U {a:T; b:{x:T; y:T; z:{i:T; j:T;};}; c:T;}' }, - { code: 'type U = {a:T; b:{x:T; y:T;}; c:T;}' }, - { code: 'type U = {a:T; b:{x:T; y:T; z:{i:T; j:T;};}; c:T;}' }, - - // asc - { code: 'interface U {_:T; a:T; b:T;} // asc', options: ['asc'] }, - { code: 'interface U {a:T; b:T; c:T;}', options: ['asc'] }, - { code: 'interface U {a:T; b:T; b_:T;}', options: ['asc'] }, - { code: 'interface U {C:T; b_:T; c:T;}', options: ['asc'] }, - { code: 'interface U {$:T; A:T; _:T; a:T;}', options: ['asc'] }, - { code: "interface U {1:T; '11':T; 2:T; A:T;}", options: ['asc'] }, - { code: "interface U {'#':T; 'Z':T; À:T; è:T;}", options: ['asc'] }, - - // asc, insensitive - { code: 'interface U {_:T; a:T; b:T;} // asc, insensitive', options: ['asc', { caseSensitive: false }] }, - { code: 'interface U {a:T; b:T; c:T;}', options: ['asc', { caseSensitive: false }] }, - { code: 'interface U {a:T; b:T; b_:T;}', options: ['asc', { caseSensitive: false }] }, - { code: 'interface U {b_:T; C:T; c:T;}', options: ['asc', { caseSensitive: false }] }, - { code: 'interface U {b_:T; c:T; C:T;}', options: ['asc', { caseSensitive: false }] }, - { code: 'interface U {$:T; _:T; A:T; a:T;}', options: ['asc', { caseSensitive: false }] }, - { code: "interface U {1:T; '11':T; 2:T; A:T;}", options: ['asc', { caseSensitive: false }] }, - { code: "interface U {'#':T; 'Z':T; À:T; è:T;}", options: ['asc', { natural: true }] }, - - // asc, natural, insensitive - { code: 'interface U {_:T; a:T; b:T;} // asc, natural, insensitive', options: ['asc', { natural: true, caseSensitive: false }] }, - { code: 'interface U {a:T; b:T; c:T;}', options: ['asc', { natural: true, caseSensitive: false }] }, - { code: 'interface U {a:T; b:T; b_:T;}', options: ['asc', { natural: true, caseSensitive: false }] }, - { code: 'interface U {b_:T; C:T; c:T;}', options: ['asc', { natural: true, caseSensitive: false }] }, - { code: 'interface U {b_:T; c:T; C:T;}', options: ['asc', { natural: true, caseSensitive: false }] }, - { code: 'interface U {$:T; _:T; A:T; a:T;}', options: ['asc', { natural: true, caseSensitive: false }] }, - { code: "interface U {1:T; 2:T; '11':T; A:T;}", options: ['asc', { natural: true, caseSensitive: false }] }, - { code: "interface U {'#':T; 'Z':T; À:T; è:T;}", options: ['asc', { natural: true, caseSensitive: false }] }, - - // desc - { code: 'interface U {b:T; a:T; _:T;} // desc', options: ['desc'] }, - { code: 'interface U {c:T; b:T; a:T;}', options: ['desc'] }, - { code: 'interface U {b_:T; b:T; a:T;}', options: ['desc'] }, - { code: 'interface U {c:T; b_:T; C:T;}', options: ['desc'] }, - { code: 'interface U {a:T; _:T; A:T; $:T;}', options: ['desc'] }, - { code: "interface U {A:T; 2:T; '11':T; 1:T;}", options: ['desc'] }, - { code: "interface U {è:T; À:T; 'Z':T; '#':T;}", options: ['desc'] }, - - // desc, insensitive - { code: 'interface U {b:T; a:T; _:T;} // desc, insensitive', options: ['desc', { caseSensitive: false }] }, - { code: 'interface U {c:T; b:T; a:T;}', options: ['desc', { caseSensitive: false }] }, - { code: 'interface U {b_:T; b:T; a:T;}', options: ['desc', { caseSensitive: false }] }, - { code: 'interface U {c:T; C:T; b_:T;}', options: ['desc', { caseSensitive: false }] }, - { code: 'interface U {C:T; c:T; b_:T;}', options: ['desc', { caseSensitive: false }] }, - { code: 'interface U {a:T; A:T; _:T; $:T;}', options: ['desc', { caseSensitive: false }] }, - { code: "interface U {A:T; 2:T; '11':T; 1:T;}", options: ['desc', { caseSensitive: false }] }, - { code: "interface U {è:T; À:T; 'Z':T; '#':T;}", options: ['desc', { caseSensitive: false }] }, - - // desc, natural - { code: 'interface U {b:T; a:T; _:T;} // desc, natural', options: ['desc', { natural: true }] }, - { code: 'interface U {c:T; b:T; a:T;}', options: ['desc', { natural: true }] }, - { code: 'interface U {b_:T; b:T; a:T;}', options: ['desc', { natural: true }] }, - { code: 'interface U {c:T; b_:T; C:T;}', options: ['desc', { natural: true }] }, - { code: 'interface U {a:T; A:T; _:T; $:T;}', options: ['desc', { natural: true }] }, - { code: "interface U {A:T; '11':T; 2:T; 1:T;}", options: ['desc', { natural: true }] }, - { code: "interface U {è:T; À:T; 'Z':T; '#':T;}", options: ['desc', { natural: true }] }, - - // desc, natural, insensitive - { code: 'interface U {b:T; a:T; _:T;} // desc, natural, insensitive', options: ['desc', { natural: true, caseSensitive: false }] }, - { code: 'interface U {c:T; b:T; a:T;}', options: ['desc', { natural: true, caseSensitive: false }] }, - { code: 'interface U {b_:T; b:T; a:T;}', options: ['desc', { natural: true, caseSensitive: false }] }, - { code: 'interface U {c:T; C:T; b_:T;}', options: ['desc', { natural: true, caseSensitive: false }] }, - { code: 'interface U {C:T; c:T; b_:T;}', options: ['desc', { natural: true, caseSensitive: false }] }, - { code: 'interface U {a:T; A:T; _:T; $:T;}', options: ['desc', { natural: true, caseSensitive: false }] }, - { code: "interface U {A:T; '11':T; 2:T; 1:T;}", options: ['desc', { natural: true, caseSensitive: false }] }, - { code: "interface U {è:T; À:T; 'Z':T; '#':T;}", options: ['desc', { natural: true, caseSensitive: false }] }, - - // index signatures - { code: 'interface U { [nkey: number]: T; [skey: string]: T; $: T; A: T; _: T; a: T; }', options: ['asc'] }, - { code: 'interface U { a: T; _: T; A: T; $: T; [skey: string]: T; [nkey: number]: T; }', options: ['desc'] }, - ], - - invalid: [ - // default (asc) - { - code: 'interface U {a:T; _:T; b:T;}', - errors: ["Expected interface keys to be in ascending order. '_' should be before 'a'."], - output: 'interface U {_:T; a:T; b:T;}', - }, - { - code: 'interface U {a:T; c:T; b:T;}', - errors: ["Expected interface keys to be in ascending order. 'b' should be before 'c'."], - output: 'interface U {a:T; b:T; c:T;}', - }, - { - code: 'interface U {b_:T; a:T; b:T;}', - errors: ["Expected interface keys to be in ascending order. 'a' should be before 'b_'."], - output: 'interface U {a:T; b_:T; b:T;}', - }, - { - code: 'interface U {b_:T; c:T; C:T;}', - errors: ["Expected interface keys to be in ascending order. 'C' should be before 'c'."], - output: 'interface U {C:T; c:T; b_:T;}', - }, - { - code: 'interface U {$:T; _:T; A:T; a:T;}', - errors: ["Expected interface keys to be in ascending order. 'A' should be before '_'."], - output: 'interface U {$:T; A:T; _:T; a:T;}', - }, - { - code: "interface U {1:T; 2:T; A:T; '11':T;}", - errors: ["Expected interface keys to be in ascending order. '11' should be before 'A'."], - output: "interface U {1:T; '11':T; A:T; 2:T;}", - }, - { - code: "interface U {'#':T; À:T; 'Z':T; è:T;}", - errors: ["Expected interface keys to be in ascending order. 'Z' should be before 'À'."], - output: "interface U {'#':T; 'Z':T; À:T; è:T;}", - }, - - // methods - { - code: "interface U {1:T; 2:T; A():T; '11':T;}", - errors: ["Expected interface keys to be in ascending order. '11' should be before 'A'."], - output: "interface U {1:T; '11':T; A():T; 2:T;}", - }, - { - code: "interface U {'#'():T; À():T; 'Z':T; è:T;}", - errors: ["Expected interface keys to be in ascending order. 'Z' should be before 'À'."], - output: "interface U {'#'():T; 'Z':T; À():T; è:T;}", - }, - - // not ignore simple computed properties. - { - code: 'interface U {a:T; b:T; ["a"]:T; c:T;}', - errors: ["Expected interface keys to be in ascending order. 'a' should be before 'b'."], - output: 'interface U {a:T; ["a"]:T; b:T; c:T;}', - }, - - // nested - { - code: 'interface U {a:T; c:{y:T; x:T;}, b:T;}', - errors: ["Expected interface keys to be in ascending order. 'x' should be before 'y'.", "Expected interface keys to be in ascending order. 'b' should be before 'c'."], - output: 'interface U {a:T; b:T; c:{y:T; x:T;}}', - }, - { - code: 'type U = {a:T; c:{y:T; x:T;}, b:T;}', - errors: ["Expected interface keys to be in ascending order. 'x' should be before 'y'.", "Expected interface keys to be in ascending order. 'b' should be before 'c'."], - output: 'type U = {a:T; b:T; c:{y:T; x:T;}}', - }, - - // asc - { - code: 'interface U {a:T; _:T; b:T;} // asc', - options: ['asc'], - errors: ["Expected interface keys to be in ascending order. '_' should be before 'a'."], - output: 'interface U {_:T; a:T; b:T;} // asc', - }, - { - code: 'interface U {a:T; c:T; b:T;}', - options: ['asc'], - errors: ["Expected interface keys to be in ascending order. 'b' should be before 'c'."], - output: 'interface U {a:T; b:T; c:T;}', - }, - { - code: 'interface U {b_:T; a:T; b:T;}', - options: ['asc'], - errors: ["Expected interface keys to be in ascending order. 'a' should be before 'b_'."], - output: 'interface U {a:T; b_:T; b:T;}', - }, - { - code: 'interface U {b_:T; c:T; C:T;}', - options: ['asc'], - errors: ["Expected interface keys to be in ascending order. 'C' should be before 'c'."], - output: 'interface U {C:T; c:T; b_:T;}', - }, - { - code: 'interface U {$:T; _:T; A:T; a:T;}', - options: ['asc'], - errors: ["Expected interface keys to be in ascending order. 'A' should be before '_'."], - output: 'interface U {$:T; A:T; _:T; a:T;}', - }, - { - code: "interface U {1:T; 2:T; A:T; '11':T;}", - options: ['asc'], - errors: ["Expected interface keys to be in ascending order. '11' should be before 'A'."], - output: "interface U {1:T; '11':T; A:T; 2:T;}", - }, - { - code: "interface U {'#':T; À:T; 'Z':T; è:T;}", - options: ['asc'], - errors: ["Expected interface keys to be in ascending order. 'Z' should be before 'À'."], - output: "interface U {'#':T; 'Z':T; À:T; è:T;}", - }, - - // asc, insensitive - { - code: 'interface U {a:T; _:T; b:T;} // asc, insensitive', - options: ['asc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive ascending order. '_' should be before 'a'."], - output: 'interface U {_:T; a:T; b:T;} // asc, insensitive', - }, - { - code: 'interface U {a:T; c:T; b:T;}', - options: ['asc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive ascending order. 'b' should be before 'c'."], - output: 'interface U {a:T; b:T; c:T;}', - }, - { - code: 'interface U {b_:T; a:T; b:T;}', - options: ['asc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive ascending order. 'a' should be before 'b_'."], - output: 'interface U {a:T; b_:T; b:T;}', - }, - { - code: 'interface U {$:T; A:T; _:T; a:T;}', - options: ['asc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive ascending order. '_' should be before 'A'."], - output: 'interface U {$:T; _:T; A:T; a:T;}', - }, - { - code: "interface U {1:T; 2:T; A:T; '11':T;}", - options: ['asc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive ascending order. '11' should be before 'A'."], - output: "interface U {1:T; '11':T; A:T; 2:T;}", - }, - { - code: "interface U {'#':T; À:T; 'Z':T; è:T;}", - options: ['asc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive ascending order. 'Z' should be before 'À'."], - output: "interface U {'#':T; 'Z':T; À:T; è:T;}", - }, - - // asc, natural - { - code: 'interface U {a:T; _:T; b:T;} // asc, natural', - options: ['asc', { natural: true }], - errors: ["Expected interface keys to be in natural ascending order. '_' should be before 'a'."], - output: 'interface U {_:T; a:T; b:T;} // asc, natural', - }, - { - code: 'interface U {a:T; c:T; b:T;}', - options: ['asc', { natural: true }], - errors: ["Expected interface keys to be in natural ascending order. 'b' should be before 'c'."], - output: 'interface U {a:T; b:T; c:T;}', - }, - { - code: 'interface U {b_:T; a:T; b:T;}', - options: ['asc', { natural: true }], - errors: ["Expected interface keys to be in natural ascending order. 'a' should be before 'b_'."], - output: 'interface U {a:T; b_:T; b:T;}', - }, - { - code: 'interface U {b_:T; c:T; C:T;}', - options: ['asc', { natural: true }], - errors: ["Expected interface keys to be in natural ascending order. 'C' should be before 'c'."], - output: 'interface U {C:T; c:T; b_:T;}', - }, - { - code: 'interface U {$:T; A:T; _:T; a:T;}', - options: ['asc', { natural: true }], - errors: ["Expected interface keys to be in natural ascending order. '_' should be before 'A'."], - output: 'interface U {$:T; _:T; A:T; a:T;}', - }, - { - code: "interface U {1:T; 2:T; A:T; '11':T;}", - options: ['asc', { natural: true }], - errors: ["Expected interface keys to be in natural ascending order. '11' should be before 'A'."], - output: "interface U {1:T; 2:T; '11':T; A:T;}", - }, - { - code: "interface U {'#':T; À:T; 'Z':T; è:T;}", - options: ['asc', { natural: true }], - errors: ["Expected interface keys to be in natural ascending order. 'Z' should be before 'À'."], - output: "interface U {'#':T; 'Z':T; À:T; è:T;}", - }, - - // asc, natural, insensitive - { - code: 'interface U {a:T; _:T; b:T;} // asc, natural, insensitive', - options: ['asc', { natural: true, caseSensitive: false }], - errors: ["Expected interface keys to be in natural insensitive ascending order. '_' should be before 'a'."], - output: 'interface U {_:T; a:T; b:T;} // asc, natural, insensitive', - }, - { - code: 'interface U {a:T; c:T; b:T;}', - options: ['asc', { natural: true, caseSensitive: false }], - errors: ["Expected interface keys to be in natural insensitive ascending order. 'b' should be before 'c'."], - output: 'interface U {a:T; b:T; c:T;}', - }, - { - code: 'interface U {b_:T; a:T; b:T;}', - options: ['asc', { natural: true, caseSensitive: false }], - errors: ["Expected interface keys to be in natural insensitive ascending order. 'a' should be before 'b_'."], - output: 'interface U {a:T; b_:T; b:T;}', - }, - { - code: 'interface U {$:T; A:T; _:T; a:T;}', - options: ['asc', { natural: true, caseSensitive: false }], - errors: ["Expected interface keys to be in natural insensitive ascending order. '_' should be before 'A'."], - output: 'interface U {$:T; _:T; A:T; a:T;}', - }, - { - code: "interface U {1:T; '11':T; 2:T; A:T;}", - options: ['asc', { natural: true, caseSensitive: false }], - errors: ["Expected interface keys to be in natural insensitive ascending order. '2' should be before '11'."], - output: "interface U {1:T; 2:T; '11':T; A:T;}", - }, - { - code: "interface U {'#':T; À:T; 'Z':T; è:T;}", - options: ['asc', { natural: true, caseSensitive: false }], - errors: ["Expected interface keys to be in natural insensitive ascending order. 'Z' should be before 'À'."], - output: "interface U {'#':T; 'Z':T; À:T; è:T;}", - }, - - // desc - { - code: 'interface U {a:T; _:T; b:T;} // desc', - options: ['desc'], - errors: ["Expected interface keys to be in descending order. 'b' should be before '_'."], - output: 'interface U {b:T; _:T; a:T;} // desc', - }, - { - code: 'interface U {a:T; c:T; b:T;}', - options: ['desc'], - errors: ["Expected interface keys to be in descending order. 'c' should be before 'a'."], - output: 'interface U {c:T; a:T; b:T;}', - }, - { - code: 'interface U {b_:T; a:T; b:T;}', - options: ['desc'], - errors: ["Expected interface keys to be in descending order. 'b' should be before 'a'."], - output: 'interface U {b_:T; b:T; a:T;}', - }, - { - code: 'interface U {b_:T; c:T; C:T;}', - options: ['desc'], - errors: ["Expected interface keys to be in descending order. 'c' should be before 'b_'."], - output: 'interface U {c:T; b_:T; C:T;}', - }, - { - code: 'interface U {$:T; _:T; A:T; a:T;}', - options: ['desc'], - errors: ["Expected interface keys to be in descending order. '_' should be before '$'.", "Expected interface keys to be in descending order. 'a' should be before 'A'."], - output: 'interface U {a:T; _:T; A:T; $:T;}', - }, - { - code: "interface U {1:T; 2:T; A:T; '11':T;}", - options: ['desc'], - errors: ["Expected interface keys to be in descending order. '2' should be before '1'.", "Expected interface keys to be in descending order. 'A' should be before '2'."], - output: "interface U {A:T; 2:T; 1:T; '11':T;}", - }, - { - code: "interface U {'#':T; À:T; 'Z':T; è:T;}", - options: ['desc'], - errors: ["Expected interface keys to be in descending order. 'À' should be before '#'.", "Expected interface keys to be in descending order. 'è' should be before 'Z'."], - output: "interface U {è:T; À:T; 'Z':T; '#':T;}", - }, - - // desc, insensitive - { - code: 'interface U {a:T; _:T; b:T;} // desc, insensitive', - options: ['desc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive descending order. 'b' should be before '_'."], - output: 'interface U {b:T; _:T; a:T;} // desc, insensitive', - }, - { - code: 'interface U {a:T; c:T; b:T;}', - options: ['desc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive descending order. 'c' should be before 'a'."], - output: 'interface U {c:T; a:T; b:T;}', - }, - { - code: 'interface U {b_:T; a:T; b:T;}', - options: ['desc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive descending order. 'b' should be before 'a'."], - output: 'interface U {b_:T; b:T; a:T;}', - }, - { - code: 'interface U {b_:T; c:T; C:T;}', - options: ['desc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive descending order. 'c' should be before 'b_'."], - output: 'interface U {c:T; b_:T; C:T;}', - }, - { - code: 'interface U {$:T; _:T; A:T; a:T;}', - options: ['desc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive descending order. '_' should be before '$'.", "Expected interface keys to be in insensitive descending order. 'A' should be before '_'."], - output: 'interface U {A:T; _:T; $:T; a:T;}', - }, - { - code: "interface U {1:T; 2:T; A:T; '11':T;}", - options: ['desc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive descending order. '2' should be before '1'.", "Expected interface keys to be in insensitive descending order. 'A' should be before '2'."], - output: "interface U {A:T; 2:T; 1:T; '11':T;}", - }, - { - code: "interface U {'#':T; À:T; 'Z':T; è:T;}", - options: ['desc', { caseSensitive: false }], - errors: ["Expected interface keys to be in insensitive descending order. 'À' should be before '#'.", "Expected interface keys to be in insensitive descending order. 'è' should be before 'Z'."], - output: "interface U {è:T; À:T; 'Z':T; '#':T;}", - }, - - // desc, natural - { - code: 'interface U {a:T; _:T; b:T;} // desc, natural', - options: ['desc', { natural: true }], - errors: ["Expected interface keys to be in natural descending order. 'b' should be before '_'."], - output: 'interface U {b:T; _:T; a:T;} // desc, natural', - }, - { - code: 'interface U {a:T; c:T; b:T;}', - options: ['desc', { natural: true }], - errors: ["Expected interface keys to be in natural descending order. 'c' should be before 'a'."], - output: 'interface U {c:T; a:T; b:T;}', - }, - { - code: 'interface U {b_:T; a:T; b:T;}', - options: ['desc', { natural: true }], - errors: ["Expected interface keys to be in natural descending order. 'b' should be before 'a'."], - output: 'interface U {b_:T; b:T; a:T;}', - }, - { - code: 'interface U {b_:T; c:T; C:T;}', - options: ['desc', { natural: true }], - errors: ["Expected interface keys to be in natural descending order. 'c' should be before 'b_'."], - output: 'interface U {c:T; b_:T; C:T;}', - }, - { - code: 'interface U {$:T; _:T; A:T; a:T;}', - options: ['desc', { natural: true }], - errors: [ - "Expected interface keys to be in natural descending order. '_' should be before '$'.", - "Expected interface keys to be in natural descending order. 'A' should be before '_'.", - "Expected interface keys to be in natural descending order. 'a' should be before 'A'.", - ], - output: 'interface U {a:T; _:T; A:T; $:T;}', - }, - { - code: "interface U {1:T; 2:T; A:T; '11':T;}", - options: ['desc', { natural: true }], - errors: ["Expected interface keys to be in natural descending order. '2' should be before '1'.", "Expected interface keys to be in natural descending order. 'A' should be before '2'."], - output: "interface U {A:T; 2:T; 1:T; '11':T;}", - }, - { - code: "interface U {'#':T; À:T; 'Z':T; è:T;}", - options: ['desc', { natural: true }], - errors: ["Expected interface keys to be in natural descending order. 'À' should be before '#'.", "Expected interface keys to be in natural descending order. 'è' should be before 'Z'."], - output: "interface U {è:T; À:T; 'Z':T; '#':T;}", - }, - - // desc, natural, insensitive - { - code: 'interface U {a:T; _:T; b:T;} // desc, natural, insensitive', - options: ['desc', { natural: true, caseSensitive: false }], - errors: ["Expected interface keys to be in natural insensitive descending order. 'b' should be before '_'."], - output: 'interface U {b:T; _:T; a:T;} // desc, natural, insensitive', - }, - { - code: 'interface U {a:T; c:T; b:T;}', - options: ['desc', { natural: true, caseSensitive: false }], - errors: ["Expected interface keys to be in natural insensitive descending order. 'c' should be before 'a'."], - output: 'interface U {c:T; a:T; b:T;}', - }, - { - code: 'interface U {b_:T; a:T; b:T;}', - options: ['desc', { natural: true, caseSensitive: false }], - errors: ["Expected interface keys to be in natural insensitive descending order. 'b' should be before 'a'."], - output: 'interface U {b_:T; b:T; a:T;}', - }, - { - code: 'interface U {b_:T; c:T; C:T;}', - options: ['desc', { natural: true, caseSensitive: false }], - errors: ["Expected interface keys to be in natural insensitive descending order. 'c' should be before 'b_'."], - output: 'interface U {c:T; b_:T; C:T;}', - }, - { - code: 'interface U {$:T; _:T; A:T; a:T;}', - options: ['desc', { natural: true, caseSensitive: false }], - errors: [ - "Expected interface keys to be in natural insensitive descending order. '_' should be before '$'.", - "Expected interface keys to be in natural insensitive descending order. 'A' should be before '_'.", - ], - output: 'interface U {A:T; _:T; $:T; a:T;}', - }, - { - code: "interface U {1:T; 2:T; '11':T; A:T;}", - options: ['desc', { natural: true, caseSensitive: false }], - errors: [ - "Expected interface keys to be in natural insensitive descending order. '2' should be before '1'.", - "Expected interface keys to be in natural insensitive descending order. '11' should be before '2'.", - "Expected interface keys to be in natural insensitive descending order. 'A' should be before '11'.", - ], - output: "interface U {A:T; 2:T; '11':T; 1:T;}", - }, - { - code: "interface U {'#':T; À:T; 'Z':T; è:T;}", - options: ['desc', { natural: true, caseSensitive: false }], - errors: [ - "Expected interface keys to be in natural insensitive descending order. 'À' should be before '#'.", - "Expected interface keys to be in natural insensitive descending order. 'è' should be before 'Z'.", - ], - output: "interface U {è:T; À:T; 'Z':T; '#':T;}", - }, - - // index signatures - { - code: 'interface U { A: T; [skey: string]: T; _: T; }', - options: ['asc'], - errors: ["Expected interface keys to be in ascending order. '[index: skey]' should be before 'A'."], - output: 'interface U { [skey: string]: T; A: T; _: T; }', - }, - { - code: 'interface U { _: T; [skey: string]: T; A: T; }', - options: ['desc'], - errors: ["Expected interface keys to be in descending order. 'A' should be before '[index: skey]'."], - output: 'interface U { _: T; A: T; [skey: string]: T; }', - }, - ], -}); diff --git a/tests/rules/interface.spec.ts b/tests/rules/interface.spec.ts new file mode 100644 index 0000000..8604fe1 --- /dev/null +++ b/tests/rules/interface.spec.ts @@ -0,0 +1,1131 @@ +import { Rule, RuleTester } from 'eslint'; + +import { rule, name, Options } from 'rules/interface'; +import { SortingOrder } from 'common/options'; +import { typescript } from '../helpers/configs'; +import { + InvalidTestCase, + processInvalidTestCase, + processValidTestCase, + ValidTestCase, +} from '../helpers/util'; + +const valid: readonly ValidTestCase[] = [ + /** + * default, asc, caseSensitive + */ + { + code: 'interface U {_:T; a:T; b:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {a:T; b:T; c:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {a:T; b:T; b_:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {C:T; b_:T; c:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {$:T; A:T; _:T; a:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "interface U {1:T; '11':T; 2:T; A:T;}", + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "interface U {'#':T; 'Z':T; À:T; è:T;}", + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * computed + */ + { + code: 'interface U {a:T; ["ab"]:T; b:T; c:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * nested + */ + { + code: 'interface U {a:T; b:{x:T; y:T;}; c:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {a:T; b:{x:T; y:T; z:{i:T; j:T;};}; c:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'type U = {a:T; b:{x:T; y:T;}; c:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'type U = {a:T; b:{x:T; y:T; z:{i:T; j:T;};}; c:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * asc, insensitive + */ + { + code: 'interface U {_:T; a:T; b:T;}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'interface U {a:T; b:T; c:T;}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'interface U {a:T; b:T; b_:T;}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'interface U {b_:T; C:T; c:T;}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'interface U {b_:T; c:T; C:T;}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'interface U {$:T; _:T; A:T; a:T;}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: "interface U {1:T; '11':T; 2:T; A:T;}", + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + + { + code: "interface U {'#':T; 'Z':T; À:T; è:T;}", + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + + /** + * asc, natural, insensitive + */ + { + code: 'interface U {_:T; a:T; b:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {a:T; b:T; c:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {a:T; b:T; b_:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {b_:T; C:T; c:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {b_:T; c:T; C:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {$:T; _:T; A:T; a:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: "interface U {1:T; 2:T; '11':T; A:T;}", + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: "interface U {'#':T; 'Z':T; À:T; è:T;}", + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + + /** + * desc + */ + { + code: 'interface U {b:T; a:T; _:T;}', + optionsSet: [ + [SortingOrder.Descending], + [SortingOrder.Descending, { caseSensitive: true }], + [SortingOrder.Descending, { natural: false }], + [SortingOrder.Descending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {c:T; b:T; a:T;}', + optionsSet: [ + [SortingOrder.Descending], + [SortingOrder.Descending, { caseSensitive: true }], + [SortingOrder.Descending, { natural: false }], + [SortingOrder.Descending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {b_:T; b:T; a:T;}', + optionsSet: [ + [SortingOrder.Descending], + [SortingOrder.Descending, { caseSensitive: true }], + [SortingOrder.Descending, { natural: false }], + [SortingOrder.Descending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {c:T; b_:T; C:T;}', + optionsSet: [ + [SortingOrder.Descending], + [SortingOrder.Descending, { caseSensitive: true }], + [SortingOrder.Descending, { natural: false }], + [SortingOrder.Descending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {a:T; _:T; A:T; $:T;}', + optionsSet: [ + [SortingOrder.Descending], + [SortingOrder.Descending, { caseSensitive: true }], + [SortingOrder.Descending, { natural: false }], + [SortingOrder.Descending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "interface U {A:T; 2:T; '11':T; 1:T;}", + optionsSet: [ + [SortingOrder.Descending], + [SortingOrder.Descending, { caseSensitive: true }], + [SortingOrder.Descending, { natural: false }], + [SortingOrder.Descending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "interface U {è:T; À:T; 'Z':T; '#':T;}", + optionsSet: [ + [SortingOrder.Descending], + [SortingOrder.Descending, { caseSensitive: true }], + [SortingOrder.Descending, { natural: false }], + [SortingOrder.Descending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * desc, insensitive + */ + { + code: 'interface U {b:T; a:T; _:T;}', + optionsSet: [ + [SortingOrder.Descending, { caseSensitive: false }], + [SortingOrder.Descending, { caseSensitive: false, natural: false }], + ], + }, + { + code: 'interface U {c:T; b:T; a:T;}', + optionsSet: [ + [SortingOrder.Descending, { caseSensitive: false }], + [SortingOrder.Descending, { caseSensitive: false, natural: false }], + ], + }, + { + code: 'interface U {b_:T; b:T; a:T;}', + optionsSet: [ + [SortingOrder.Descending, { caseSensitive: false }], + [SortingOrder.Descending, { caseSensitive: false, natural: false }], + ], + }, + { + code: 'interface U {c:T; C:T; b_:T;}', + optionsSet: [ + [SortingOrder.Descending, { caseSensitive: false }], + [SortingOrder.Descending, { caseSensitive: false, natural: false }], + ], + }, + { + code: 'interface U {C:T; c:T; b_:T;}', + optionsSet: [ + [SortingOrder.Descending, { caseSensitive: false }], + [SortingOrder.Descending, { caseSensitive: false, natural: false }], + ], + }, + { + code: 'interface U {a:T; A:T; _:T; $:T;}', + optionsSet: [ + [SortingOrder.Descending, { caseSensitive: false }], + [SortingOrder.Descending, { caseSensitive: false, natural: false }], + ], + }, + { + code: "interface U {A:T; 2:T; '11':T; 1:T;}", + optionsSet: [ + [SortingOrder.Descending, { caseSensitive: false }], + [SortingOrder.Descending, { caseSensitive: false, natural: false }], + ], + }, + { + code: "interface U {è:T; À:T; 'Z':T; '#':T;}", + optionsSet: [ + [SortingOrder.Descending, { caseSensitive: false }], + [SortingOrder.Descending, { caseSensitive: false, natural: false }], + ], + }, + + /** + * desc, natural + */ + { + code: 'interface U {b:T; a:T; _:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true }], + [SortingOrder.Descending, { natural: true, caseSensitive: true }], + ], + }, + { + code: 'interface U {c:T; b:T; a:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true }], + [SortingOrder.Descending, { natural: true, caseSensitive: true }], + ], + }, + { + code: 'interface U {b_:T; b:T; a:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true }], + [SortingOrder.Descending, { natural: true, caseSensitive: true }], + ], + }, + { + code: 'interface U {c:T; b_:T; C:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true }], + [SortingOrder.Descending, { natural: true, caseSensitive: true }], + ], + }, + { + code: 'interface U {a:T; A:T; _:T; $:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true }], + [SortingOrder.Descending, { natural: true, caseSensitive: true }], + ], + }, + { + code: "interface U {A:T; '11':T; 2:T; 1:T;}", + optionsSet: [ + [SortingOrder.Descending, { natural: true }], + [SortingOrder.Descending, { natural: true, caseSensitive: true }], + ], + }, + { + code: "interface U {è:T; À:T; 'Z':T; '#':T;}", + optionsSet: [ + [SortingOrder.Descending, { natural: true }], + [SortingOrder.Descending, { natural: true, caseSensitive: true }], + ], + }, + + /** + * desc, natural, insensitive + */ + { + code: 'interface U {b:T; a:T; _:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {c:T; b:T; a:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {b_:T; b:T; a:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {c:T; C:T; b_:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {C:T; c:T; b_:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {a:T; A:T; _:T; $:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: "interface U {A:T; '11':T; 2:T; 1:T;}", + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: "interface U {è:T; À:T; 'Z':T; '#':T;}", + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + + /** + * index signatures + */ + { + code: `interface U { [nkey: number]: T; [skey: string]: T; $: T; A: T; _: T; a: T; }`, + optionsSet: [[SortingOrder.Ascending]], + }, + { + code: `interface U { a: T; _: T; A: T; $: T; [skey: string]: T; [nkey: number]: T; }`, + optionsSet: [[SortingOrder.Descending]], + }, +]; + +const invalid: readonly InvalidTestCase[] = [ + /** + * default (asc) + */ + { + code: 'interface U {a:T; _:T; b:T;}', + errors: ["Expected interface keys to be in ascending order. '_' should be before 'a'."], + output: 'interface U {_:T; a:T; b:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {a:T; c:T; b:T;}', + errors: ["Expected interface keys to be in ascending order. 'b' should be before 'c'."], + output: 'interface U {a:T; b:T; c:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {b_:T; a:T; b:T;}', + errors: ["Expected interface keys to be in ascending order. 'a' should be before 'b_'."], + output: 'interface U {a:T; b_:T; b:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {b_:T; c:T; C:T;}', + errors: ["Expected interface keys to be in ascending order. 'C' should be before 'c'."], + output: 'interface U {C:T; c:T; b_:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {$:T; _:T; A:T; a:T;}', + errors: ["Expected interface keys to be in ascending order. 'A' should be before '_'."], + output: 'interface U {$:T; A:T; _:T; a:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "interface U {1:T; 2:T; A:T; '11':T;}", + errors: ["Expected interface keys to be in ascending order. '11' should be before 'A'."], + output: "interface U {1:T; '11':T; A:T; 2:T;}", + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + errors: ["Expected interface keys to be in ascending order. 'Z' should be before 'À'."], + output: "interface U {'#':T; 'Z':T; À:T; è:T;}", + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * methods + */ + { + code: "interface U {1:T; 2:T; A():T; '11':T;}", + errors: ["Expected interface keys to be in ascending order. '11' should be before 'A'."], + output: "interface U {1:T; '11':T; A():T; 2:T;}", + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "interface U {'#'():T; À():T; 'Z':T; è:T;}", + errors: ["Expected interface keys to be in ascending order. 'Z' should be before 'À'."], + output: "interface U {'#'():T; 'Z':T; À():T; è:T;}", + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * not ignore simple computed properties. + */ + { + code: 'interface U {a:T; b:T; ["a"]:T; c:T;}', + errors: ["Expected interface keys to be in ascending order. 'a' should be before 'b'."], + output: 'interface U {a:T; ["a"]:T; b:T; c:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * nested + */ + { + code: 'interface U {a:T; c:{y:T; x:T;}, b:T;}', + errors: [ + "Expected interface keys to be in ascending order. 'x' should be before 'y'.", + "Expected interface keys to be in ascending order. 'b' should be before 'c'.", + ], + output: 'interface U {a:T; b:T; c:{y:T; x:T;}}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'type U = {a:T; c:{y:T; x:T;}, b:T;}', + errors: [ + "Expected interface keys to be in ascending order. 'x' should be before 'y'.", + "Expected interface keys to be in ascending order. 'b' should be before 'c'.", + ], + output: 'type U = {a:T; b:T; c:{y:T; x:T;}}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * asc + */ + { + code: 'interface U {a:T; _:T; b:T;}', + errors: ["Expected interface keys to be in ascending order. '_' should be before 'a'."], + output: 'interface U {_:T; a:T; b:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {a:T; c:T; b:T;}', + errors: ["Expected interface keys to be in ascending order. 'b' should be before 'c'."], + output: 'interface U {a:T; b:T; c:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {b_:T; a:T; b:T;}', + errors: ["Expected interface keys to be in ascending order. 'a' should be before 'b_'."], + output: 'interface U {a:T; b_:T; b:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {b_:T; c:T; C:T;}', + errors: ["Expected interface keys to be in ascending order. 'C' should be before 'c'."], + output: 'interface U {C:T; c:T; b_:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'interface U {$:T; _:T; A:T; a:T;}', + errors: ["Expected interface keys to be in ascending order. 'A' should be before '_'."], + output: 'interface U {$:T; A:T; _:T; a:T;}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "interface U {1:T; 2:T; A:T; '11':T;}", + errors: ["Expected interface keys to be in ascending order. '11' should be before 'A'."], + output: "interface U {1:T; '11':T; A:T; 2:T;}", + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + errors: ["Expected interface keys to be in ascending order. 'Z' should be before 'À'."], + output: "interface U {'#':T; 'Z':T; À:T; è:T;}", + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * asc, insensitive + */ + { + code: 'interface U {a:T; _:T; b:T;}', + errors: [ + "Expected interface keys to be in insensitive ascending order. '_' should be before 'a'.", + ], + output: 'interface U {_:T; a:T; b:T;}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'interface U {a:T; c:T; b:T;}', + errors: [ + "Expected interface keys to be in insensitive ascending order. 'b' should be before 'c'.", + ], + output: 'interface U {a:T; b:T; c:T;}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'interface U {b_:T; a:T; b:T;}', + errors: [ + "Expected interface keys to be in insensitive ascending order. 'a' should be before 'b_'.", + ], + output: 'interface U {a:T; b_:T; b:T;}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'interface U {$:T; A:T; _:T; a:T;}', + errors: [ + "Expected interface keys to be in insensitive ascending order. '_' should be before 'A'.", + ], + output: 'interface U {$:T; _:T; A:T; a:T;}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: "interface U {1:T; 2:T; A:T; '11':T;}", + errors: [ + "Expected interface keys to be in insensitive ascending order. '11' should be before 'A'.", + ], + output: "interface U {1:T; '11':T; A:T; 2:T;}", + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + errors: [ + "Expected interface keys to be in insensitive ascending order. 'Z' should be before 'À'.", + ], + output: "interface U {'#':T; 'Z':T; À:T; è:T;}", + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + + /** + * asc, natural + */ + { + code: 'interface U {a:T; _:T; b:T;}', + errors: ["Expected interface keys to be in natural ascending order. '_' should be before 'a'."], + output: 'interface U {_:T; a:T; b:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + { + code: 'interface U {a:T; c:T; b:T;}', + errors: ["Expected interface keys to be in natural ascending order. 'b' should be before 'c'."], + output: 'interface U {a:T; b:T; c:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + { + code: 'interface U {b_:T; a:T; b:T;}', + errors: [ + "Expected interface keys to be in natural ascending order. 'a' should be before 'b_'.", + ], + output: 'interface U {a:T; b_:T; b:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + { + code: 'interface U {b_:T; c:T; C:T;}', + errors: ["Expected interface keys to be in natural ascending order. 'C' should be before 'c'."], + output: 'interface U {C:T; c:T; b_:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + { + code: 'interface U {$:T; A:T; _:T; a:T;}', + errors: ["Expected interface keys to be in natural ascending order. '_' should be before 'A'."], + output: 'interface U {$:T; _:T; A:T; a:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + { + code: "interface U {1:T; 2:T; A:T; '11':T;}", + errors: [ + "Expected interface keys to be in natural ascending order. '11' should be before 'A'.", + ], + output: "interface U {1:T; 2:T; '11':T; A:T;}", + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + { + code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + errors: ["Expected interface keys to be in natural ascending order. 'Z' should be before 'À'."], + output: "interface U {'#':T; 'Z':T; À:T; è:T;}", + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + + /** + * asc, natural, insensitive + */ + { + code: 'interface U {a:T; _:T; b:T;}', + errors: [ + "Expected interface keys to be in natural insensitive ascending order. '_' should be before 'a'.", + ], + output: 'interface U {_:T; a:T; b:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {a:T; c:T; b:T;}', + errors: [ + "Expected interface keys to be in natural insensitive ascending order. 'b' should be before 'c'.", + ], + output: 'interface U {a:T; b:T; c:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {b_:T; a:T; b:T;}', + errors: [ + "Expected interface keys to be in natural insensitive ascending order. 'a' should be before 'b_'.", + ], + output: 'interface U {a:T; b_:T; b:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {$:T; A:T; _:T; a:T;}', + errors: [ + "Expected interface keys to be in natural insensitive ascending order. '_' should be before 'A'.", + ], + output: 'interface U {$:T; _:T; A:T; a:T;}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: "interface U {1:T; '11':T; 2:T; A:T;}", + errors: [ + "Expected interface keys to be in natural insensitive ascending order. '2' should be before '11'.", + ], + output: "interface U {1:T; 2:T; '11':T; A:T;}", + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + errors: [ + "Expected interface keys to be in natural insensitive ascending order. 'Z' should be before 'À'.", + ], + output: "interface U {'#':T; 'Z':T; À:T; è:T;}", + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + + /** + * desc + */ + { + code: 'interface U {a:T; _:T; b:T;}', + errors: ["Expected interface keys to be in descending order. 'b' should be before '_'."], + output: 'interface U {b:T; _:T; a:T;}', + optionsSet: [[SortingOrder.Descending]], + }, + { + code: 'interface U {a:T; c:T; b:T;}', + errors: ["Expected interface keys to be in descending order. 'c' should be before 'a'."], + output: 'interface U {c:T; a:T; b:T;}', + optionsSet: [[SortingOrder.Descending]], + }, + { + code: 'interface U {b_:T; a:T; b:T;}', + errors: ["Expected interface keys to be in descending order. 'b' should be before 'a'."], + output: 'interface U {b_:T; b:T; a:T;}', + optionsSet: [[SortingOrder.Descending]], + }, + { + code: 'interface U {b_:T; c:T; C:T;}', + errors: ["Expected interface keys to be in descending order. 'c' should be before 'b_'."], + output: 'interface U {c:T; b_:T; C:T;}', + optionsSet: [[SortingOrder.Descending]], + }, + { + code: 'interface U {$:T; _:T; A:T; a:T;}', + errors: [ + "Expected interface keys to be in descending order. '_' should be before '$'.", + "Expected interface keys to be in descending order. 'a' should be before 'A'.", + ], + output: 'interface U {a:T; _:T; A:T; $:T;}', + optionsSet: [[SortingOrder.Descending]], + }, + { + code: "interface U {1:T; 2:T; A:T; '11':T;}", + errors: [ + "Expected interface keys to be in descending order. '2' should be before '1'.", + "Expected interface keys to be in descending order. 'A' should be before '2'.", + ], + output: "interface U {A:T; 2:T; 1:T; '11':T;}", + optionsSet: [[SortingOrder.Descending]], + }, + { + code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + errors: [ + "Expected interface keys to be in descending order. 'À' should be before '#'.", + "Expected interface keys to be in descending order. 'è' should be before 'Z'.", + ], + output: "interface U {è:T; À:T; 'Z':T; '#':T;}", + optionsSet: [[SortingOrder.Descending]], + }, + + /** + * desc, insensitive + */ + { + code: 'interface U {a:T; _:T; b:T;}', + errors: [ + "Expected interface keys to be in insensitive descending order. 'b' should be before '_'.", + ], + output: 'interface U {b:T; _:T; a:T;}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + { + code: 'interface U {a:T; c:T; b:T;}', + errors: [ + "Expected interface keys to be in insensitive descending order. 'c' should be before 'a'.", + ], + output: 'interface U {c:T; a:T; b:T;}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + { + code: 'interface U {b_:T; a:T; b:T;}', + errors: [ + "Expected interface keys to be in insensitive descending order. 'b' should be before 'a'.", + ], + output: 'interface U {b_:T; b:T; a:T;}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + { + code: 'interface U {b_:T; c:T; C:T;}', + errors: [ + "Expected interface keys to be in insensitive descending order. 'c' should be before 'b_'.", + ], + output: 'interface U {c:T; b_:T; C:T;}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + { + code: 'interface U {$:T; _:T; A:T; a:T;}', + errors: [ + "Expected interface keys to be in insensitive descending order. '_' should be before '$'.", + "Expected interface keys to be in insensitive descending order. 'A' should be before '_'.", + ], + output: 'interface U {A:T; _:T; $:T; a:T;}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + { + code: "interface U {1:T; 2:T; A:T; '11':T;}", + errors: [ + "Expected interface keys to be in insensitive descending order. '2' should be before '1'.", + "Expected interface keys to be in insensitive descending order. 'A' should be before '2'.", + ], + output: "interface U {A:T; 2:T; 1:T; '11':T;}", + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + { + code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + errors: [ + "Expected interface keys to be in insensitive descending order. 'À' should be before '#'.", + "Expected interface keys to be in insensitive descending order. 'è' should be before 'Z'.", + ], + output: "interface U {è:T; À:T; 'Z':T; '#':T;}", + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + + /** + * desc, natural + */ + { + code: 'interface U {a:T; _:T; b:T;}', + errors: [ + "Expected interface keys to be in natural descending order. 'b' should be before '_'.", + ], + output: 'interface U {b:T; _:T; a:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + { + code: 'interface U {a:T; c:T; b:T;}', + errors: [ + "Expected interface keys to be in natural descending order. 'c' should be before 'a'.", + ], + output: 'interface U {c:T; a:T; b:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + { + code: 'interface U {b_:T; a:T; b:T;}', + errors: [ + "Expected interface keys to be in natural descending order. 'b' should be before 'a'.", + ], + output: 'interface U {b_:T; b:T; a:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + { + code: 'interface U {b_:T; c:T; C:T;}', + errors: [ + "Expected interface keys to be in natural descending order. 'c' should be before 'b_'.", + ], + output: 'interface U {c:T; b_:T; C:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + { + code: 'interface U {$:T; _:T; A:T; a:T;}', + errors: [ + "Expected interface keys to be in natural descending order. '_' should be before '$'.", + "Expected interface keys to be in natural descending order. 'A' should be before '_'.", + "Expected interface keys to be in natural descending order. 'a' should be before 'A'.", + ], + output: 'interface U {a:T; _:T; A:T; $:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + { + code: "interface U {1:T; 2:T; A:T; '11':T;}", + errors: [ + "Expected interface keys to be in natural descending order. '2' should be before '1'.", + "Expected interface keys to be in natural descending order. 'A' should be before '2'.", + ], + output: "interface U {A:T; 2:T; 1:T; '11':T;}", + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + { + code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + errors: [ + "Expected interface keys to be in natural descending order. 'À' should be before '#'.", + "Expected interface keys to be in natural descending order. 'è' should be before 'Z'.", + ], + output: "interface U {è:T; À:T; 'Z':T; '#':T;}", + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + + /** + * desc, natural, insensitive + */ + { + code: 'interface U {a:T; _:T; b:T;}', + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'b' should be before '_'.", + ], + output: 'interface U {b:T; _:T; a:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {a:T; c:T; b:T;}', + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'c' should be before 'a'.", + ], + output: 'interface U {c:T; a:T; b:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {b_:T; a:T; b:T;}', + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'b' should be before 'a'.", + ], + output: 'interface U {b_:T; b:T; a:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {b_:T; c:T; C:T;}', + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'c' should be before 'b_'.", + ], + output: 'interface U {c:T; b_:T; C:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'interface U {$:T; _:T; A:T; a:T;}', + errors: [ + "Expected interface keys to be in natural insensitive descending order. '_' should be before '$'.", + "Expected interface keys to be in natural insensitive descending order. 'A' should be before '_'.", + ], + output: 'interface U {A:T; _:T; $:T; a:T;}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: "interface U {1:T; 2:T; '11':T; A:T;}", + errors: [ + "Expected interface keys to be in natural insensitive descending order. '2' should be before '1'.", + "Expected interface keys to be in natural insensitive descending order. '11' should be before '2'.", + "Expected interface keys to be in natural insensitive descending order. 'A' should be before '11'.", + ], + output: "interface U {A:T; 2:T; '11':T; 1:T;}", + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'À' should be before '#'.", + "Expected interface keys to be in natural insensitive descending order. 'è' should be before 'Z'.", + ], + output: "interface U {è:T; À:T; 'Z':T; '#':T;}", + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + + /** + * index signatures + */ + { + code: 'interface U { A: T; [skey: string]: T; _: T; }', + errors: [ + "Expected interface keys to be in ascending order. '[index: skey]' should be before 'A'.", + ], + output: 'interface U { [skey: string]: T; A: T; _: T; }', + optionsSet: [[SortingOrder.Ascending]], + }, + { + code: 'interface U { _: T; [skey: string]: T; A: T; }', + errors: [ + "Expected interface keys to be in descending order. 'A' should be before '[index: skey]'.", + ], + output: 'interface U { _: T; A: T; [skey: string]: T; }', + optionsSet: [[SortingOrder.Descending]], + }, +]; + +describe('TypeScript', () => { + const ruleTester = new RuleTester(typescript); + + ruleTester.run(name, (rule as unknown) as Rule.RuleModule, { + valid: processValidTestCase(valid), + invalid: processInvalidTestCase(invalid), + }); +}); diff --git a/tests/rules/string-enum.spec.js b/tests/rules/string-enum.spec.js deleted file mode 100644 index e6a34c1..0000000 --- a/tests/rules/string-enum.spec.js +++ /dev/null @@ -1,445 +0,0 @@ -import { RuleTester } from 'eslint'; - -import { rule } from 'rules/string-enum'; - -const ruleTester = new RuleTester({ - parser: require.resolve('@typescript-eslint/parser'), -}); - -ruleTester.run('string-enum', rule, { - valid: [ - // ignores - { code: 'enum U {c, b, a} // ignores' }, - { code: 'enum U {c=a(), b, a}' }, - { code: 'enum U {c=0, b, a}' }, - { code: 'enum U {c=3, b, a}' }, - { code: 'enum U {c=1<<1, b, a}' }, - { code: 'enum U {c=M|N, b, a}' }, - { code: 'enum U {c="123".length, b, a}' }, - { code: 'enum U {c=0, b="b", a}' }, - { code: 'const enum U {A=1, B=A*2}' }, - - // default (asc) - { code: 'enum U {_="a", a="b", b="c"} // default (asc)' }, - { code: 'enum U {a="a", b="b", c="c"}' }, - { code: 'enum U {a="a", b="b", b_="c"}' }, - { code: 'enum U {C="a", b_="b", c="c"}' }, - { code: 'enum U {$="a", A="b", _="c", a="d"}' }, - { code: "enum U {'#'='a', 'Z'='b', À='c', è='d'}" }, - - // computed - { code: '{a="T", ["aa"]="T", b="T", c="T"}' }, - - // asc - { code: 'enum U {_="T", a="T", b="T"} // asc', options: ['asc'] }, - { code: 'enum U {a="T", b="T", c="T"}', options: ['asc'] }, - { code: 'enum U {a="T", b="T", b_="T"}', options: ['asc'] }, - { code: 'enum U {C="T", b_="T", c="T"}', options: ['asc'] }, - { code: 'enum U {$="T", A="T", _="T", a="T"}', options: ['asc'] }, - { code: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", options: ['asc'] }, - - // asc, insensitive - { code: 'enum U {_="T", a="T", b="T"} // asc, insensitive', options: ['asc', { caseSensitive: false }] }, - { code: 'enum U {a="T", b="T", c="T"}', options: ['asc', { caseSensitive: false }] }, - { code: 'enum U {a="T", b="T", b_="T"}', options: ['asc', { caseSensitive: false }] }, - { code: 'enum U {b_="T", C="T", c="T"}', options: ['asc', { caseSensitive: false }] }, - { code: 'enum U {b_="T", c="T", C="T"}', options: ['asc', { caseSensitive: false }] }, - { code: 'enum U {$="T", _="T", A="T", a="T"}', options: ['asc', { caseSensitive: false }] }, - { code: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", options: ['asc', { natural: true }] }, - - // asc, natural, insensitive - { code: 'enum U {_="T", a="T", b="T"} // asc, natural, insensitive', options: ['asc', { natural: true, caseSensitive: false }] }, - { code: 'enum U {a="T", b="T", c="T"}', options: ['asc', { natural: true, caseSensitive: false }] }, - { code: 'enum U {a="T", b="T", b_="T"}', options: ['asc', { natural: true, caseSensitive: false }] }, - { code: 'enum U {b_="T", C="T", c="T"}', options: ['asc', { natural: true, caseSensitive: false }] }, - { code: 'enum U {b_="T", c="T", C="T"}', options: ['asc', { natural: true, caseSensitive: false }] }, - { code: 'enum U {$="T", _="T", A="T", a="T"}', options: ['asc', { natural: true, caseSensitive: false }] }, - { code: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", options: ['asc', { natural: true, caseSensitive: false }] }, - - // desc - { code: 'enum U {b="T", a="T", _="T"} // desc', options: ['desc'] }, - { code: 'enum U {c="T", b="T", a="T"}', options: ['desc'] }, - { code: 'enum U {b_="T", b="T", a="T"}', options: ['desc'] }, - { code: 'enum U {c="T", b_="T", C="T"}', options: ['desc'] }, - { code: 'enum U {a="T", _="T", A="T", $="T"}', options: ['desc'] }, - { code: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", options: ['desc'] }, - - // desc, insensitive - { code: 'enum U {b="T", a="T", _="T"} // desc, insensitive', options: ['desc', { caseSensitive: false }] }, - { code: 'enum U {c="T", b="T", a="T"}', options: ['desc', { caseSensitive: false }] }, - { code: 'enum U {b_="T", b="T", a="T"}', options: ['desc', { caseSensitive: false }] }, - { code: 'enum U {c="T", C="T", b_="T"}', options: ['desc', { caseSensitive: false }] }, - { code: 'enum U {C="T", c="T", b_="T"}', options: ['desc', { caseSensitive: false }] }, - { code: 'enum U {a="T", A="T", _="T", $="T"}', options: ['desc', { caseSensitive: false }] }, - { code: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", options: ['desc', { caseSensitive: false }] }, - - // desc, natural - { code: 'enum U {b="T", a="T", _="T"} // desc, natural', options: ['desc', { natural: true }] }, - { code: 'enum U {c="T", b="T", a="T"}', options: ['desc', { natural: true }] }, - { code: 'enum U {b_="T", b="T", a="T"}', options: ['desc', { natural: true }] }, - { code: 'enum U {c="T", b_="T", C="T"}', options: ['desc', { natural: true }] }, - { code: 'enum U {a="T", A="T", _="T", $="T"}', options: ['desc', { natural: true }] }, - { code: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", options: ['desc', { natural: true }] }, - - // desc, natural, insensitive - { code: 'enum U {b="T", a="T", _="T"} // desc, natural, insensitive', options: ['desc', { natural: true, caseSensitive: false }] }, - { code: 'enum U {c="T", b="T", a="T"}', options: ['desc', { natural: true, caseSensitive: false }] }, - { code: 'enum U {b_="T", b="T", a="T"}', options: ['desc', { natural: true, caseSensitive: false }] }, - { code: 'enum U {c="T", C="T", b_="T"}', options: ['desc', { natural: true, caseSensitive: false }] }, - { code: 'enum U {C="T", c="T", b_="T"}', options: ['desc', { natural: true, caseSensitive: false }] }, - { code: 'enum U {a="T", A="T", _="T", $="T"}', options: ['desc', { natural: true, caseSensitive: false }] }, - { code: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", options: ['desc', { natural: true, caseSensitive: false }] }, - ], - - invalid: [ - // default (asc) - { - code: 'enum U {a="a", _="b", b="c"}', - errors: ["Expected string enum members to be in ascending order. '_' should be before 'a'."], - output: 'enum U {_="b", a="a", b="c"}', - }, - { - code: 'enum U {a="T", c="T", b="T"}', - errors: ["Expected string enum members to be in ascending order. 'b' should be before 'c'."], - output: 'enum U {a="T", b="T", c="T"}', - }, - { - code: 'enum U {b_="T", a="T", b="T"}', - errors: ["Expected string enum members to be in ascending order. 'a' should be before 'b_'."], - output: 'enum U {a="T", b_="T", b="T"}', - }, - { - code: 'enum U {b_="T", c="T", C="T"}', - errors: ["Expected string enum members to be in ascending order. 'C' should be before 'c'."], - output: 'enum U {C="T", c="T", b_="T",}', - }, - { - code: 'enum U {$="T", _="T", A="T", a="T"}', - errors: ["Expected string enum members to be in ascending order. 'A' should be before '_'."], - output: 'enum U {$="T", A="T", _="T", a="T"}', - }, - { - code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - errors: ["Expected string enum members to be in ascending order. 'Z' should be before 'À'."], - output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", - }, - - // not ignore simple computed properties. - { - code: 'enum U {a="T", b="T", ["aa"]="T", c="T"}', - errors: ["Expected string enum members to be in ascending order. 'aa' should be before 'b'."], - output: 'enum U {a="T", ["aa"]="T", b="T", c="T"}', - }, - - // asc - { - code: 'enum U {a="T", _="T", b="T"} // asc', - options: ['asc'], - errors: ["Expected string enum members to be in ascending order. '_' should be before 'a'."], - output: 'enum U {_="T", a="T", b="T"} // asc', - }, - { - code: 'enum U {a="T", c="T", b="T"}', - options: ['asc'], - errors: ["Expected string enum members to be in ascending order. 'b' should be before 'c'."], - output: 'enum U {a="T", b="T", c="T"}', - }, - { - code: 'enum U {b_="T", a="T", b="T"}', - options: ['asc'], - errors: ["Expected string enum members to be in ascending order. 'a' should be before 'b_'."], - output: 'enum U {a="T", b_="T", b="T"}', - }, - { - code: 'enum U {b_="T", c="T", C="T"}', - options: ['asc'], - errors: ["Expected string enum members to be in ascending order. 'C' should be before 'c'."], - output: 'enum U {C="T", c="T", b_="T",}', - }, - { - code: 'enum U {$="T", _="T", A="T", a="T"}', - options: ['asc'], - errors: ["Expected string enum members to be in ascending order. 'A' should be before '_'."], - output: 'enum U {$="T", A="T", _="T", a="T"}', - }, - { - code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - options: ['asc'], - errors: ["Expected string enum members to be in ascending order. 'Z' should be before 'À'."], - output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", - }, - - // asc, insensitive - { - code: 'enum U {a="T", _="T", b="T"} // asc, insensitive', - options: ['asc', { caseSensitive: false }], - errors: ["Expected string enum members to be in insensitive ascending order. '_' should be before 'a'."], - output: 'enum U {_="T", a="T", b="T"} // asc, insensitive', - }, - { - code: 'enum U {a="T", c="T", b="T"}', - options: ['asc', { caseSensitive: false }], - errors: ["Expected string enum members to be in insensitive ascending order. 'b' should be before 'c'."], - output: 'enum U {a="T", b="T", c="T"}', - }, - { - code: 'enum U {b_="T", a="T", b="T"}', - options: ['asc', { caseSensitive: false }], - errors: ["Expected string enum members to be in insensitive ascending order. 'a' should be before 'b_'."], - output: 'enum U {a="T", b_="T", b="T"}', - }, - { - code: 'enum U {$="T", A="T", _="T", a="T"}', - options: ['asc', { caseSensitive: false }], - errors: ["Expected string enum members to be in insensitive ascending order. '_' should be before 'A'."], - output: 'enum U {$="T", _="T", A="T", a="T"}', - }, - { - code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - options: ['asc', { caseSensitive: false }], - errors: ["Expected string enum members to be in insensitive ascending order. 'Z' should be before 'À'."], - output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", - }, - - // asc, natural - { - code: 'enum U {a="T", _="T", b="T"} // asc, natural', - options: ['asc', { natural: true }], - errors: ["Expected string enum members to be in natural ascending order. '_' should be before 'a'."], - output: 'enum U {_="T", a="T", b="T"} // asc, natural', - }, - { - code: 'enum U {a="T", c="T", b="T"}', - options: ['asc', { natural: true }], - errors: ["Expected string enum members to be in natural ascending order. 'b' should be before 'c'."], - output: 'enum U {a="T", b="T", c="T"}', - }, - { - code: 'enum U {b_="T", a="T", b="T"}', - options: ['asc', { natural: true }], - errors: ["Expected string enum members to be in natural ascending order. 'a' should be before 'b_'."], - output: 'enum U {a="T", b_="T", b="T"}', - }, - { - code: 'enum U {b_="T", c="T", C="T"}', - options: ['asc', { natural: true }], - errors: ["Expected string enum members to be in natural ascending order. 'C' should be before 'c'."], - output: 'enum U {C="T", c="T", b_="T",}', - }, - { - code: 'enum U {$="T", A="T", _="T", a="T"}', - options: ['asc', { natural: true }], - errors: ["Expected string enum members to be in natural ascending order. '_' should be before 'A'."], - output: 'enum U {$="T", _="T", A="T", a="T"}', - }, - { - code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - options: ['asc', { natural: true }], - errors: ["Expected string enum members to be in natural ascending order. 'Z' should be before 'À'."], - output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", - }, - - // asc, natural, insensitive - { - code: 'enum U {a="T", _="T", b="T"} // asc, natural, insensitive', - options: ['asc', { natural: true, caseSensitive: false }], - errors: ["Expected string enum members to be in natural insensitive ascending order. '_' should be before 'a'."], - output: 'enum U {_="T", a="T", b="T"} // asc, natural, insensitive', - }, - { - code: 'enum U {a="T", c="T", b="T"}', - options: ['asc', { natural: true, caseSensitive: false }], - errors: ["Expected string enum members to be in natural insensitive ascending order. 'b' should be before 'c'."], - output: 'enum U {a="T", b="T", c="T"}', - }, - { - code: 'enum U {b_="T", a="T", b="T"}', - options: ['asc', { natural: true, caseSensitive: false }], - errors: ["Expected string enum members to be in natural insensitive ascending order. 'a' should be before 'b_'."], - output: 'enum U {a="T", b_="T", b="T"}', - }, - { - code: 'enum U {$="T", A="T", _="T", a="T"}', - options: ['asc', { natural: true, caseSensitive: false }], - errors: ["Expected string enum members to be in natural insensitive ascending order. '_' should be before 'A'."], - output: 'enum U {$="T", _="T", A="T", a="T"}', - }, - { - code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - options: ['asc', { natural: true, caseSensitive: false }], - errors: ["Expected string enum members to be in natural insensitive ascending order. 'Z' should be before 'À'."], - output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", - }, - - // desc - { - code: 'enum U {a="T", _="T", b="T"} // desc', - options: ['desc'], - errors: ["Expected string enum members to be in descending order. 'b' should be before '_'."], - output: 'enum U {b="T", _="T", a="T",} // desc', - }, - { - code: 'enum U {a="T", c="T", b="T"}', - options: ['desc'], - errors: ["Expected string enum members to be in descending order. 'c' should be before 'a'."], - output: 'enum U {c="T", a="T", b="T"}', - }, - { - code: 'enum U {b_="T", a="T", b="T"}', - options: ['desc'], - errors: ["Expected string enum members to be in descending order. 'b' should be before 'a'."], - output: 'enum U {b_="T", b="T", a="T"}', - }, - { - code: 'enum U {b_="T", c="T", C="T"}', - options: ['desc'], - errors: ["Expected string enum members to be in descending order. 'c' should be before 'b_'."], - output: 'enum U {c="T", b_="T", C="T"}', - }, - { - code: 'enum U {$="T", _="T", A="T", a="T"}', - options: ['desc'], - errors: ["Expected string enum members to be in descending order. '_' should be before '$'.", "Expected string enum members to be in descending order. 'a' should be before 'A'."], - output: 'enum U {a="T", _="T", A="T", $="T"}', - }, - { - code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - options: ['desc'], - errors: ["Expected string enum members to be in descending order. 'À' should be before '#'.", "Expected string enum members to be in descending order. 'è' should be before 'Z'."], - output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", - }, - - // desc, insensitive - { - code: 'enum U {a="T", _="T", b="T"} // desc, insensitive', - options: ['desc', { caseSensitive: false }], - errors: ["Expected string enum members to be in insensitive descending order. 'b' should be before '_'."], - output: 'enum U {b="T", _="T", a="T",} // desc, insensitive', - }, - { - code: 'enum U {a="T", c="T", b="T"}', - options: ['desc', { caseSensitive: false }], - errors: ["Expected string enum members to be in insensitive descending order. 'c' should be before 'a'."], - output: 'enum U {c="T", a="T", b="T"}', - }, - { - code: 'enum U {b_="T", a="T", b="T"}', - options: ['desc', { caseSensitive: false }], - errors: ["Expected string enum members to be in insensitive descending order. 'b' should be before 'a'."], - output: 'enum U {b_="T", b="T", a="T"}', - }, - { - code: 'enum U {b_="T", c="T", C="T"}', - options: ['desc', { caseSensitive: false }], - errors: ["Expected string enum members to be in insensitive descending order. 'c' should be before 'b_'."], - output: 'enum U {c="T", b_="T", C="T"}', - }, - { - code: 'enum U {$="T", _="T", A="T", a="T"}', - options: ['desc', { caseSensitive: false }], - errors: [ - "Expected string enum members to be in insensitive descending order. '_' should be before '$'.", - "Expected string enum members to be in insensitive descending order. 'A' should be before '_'.", - ], - output: 'enum U {A="T", _="T", $="T", a="T"}', - }, - { - code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - options: ['desc', { caseSensitive: false }], - errors: [ - "Expected string enum members to be in insensitive descending order. 'À' should be before '#'.", - "Expected string enum members to be in insensitive descending order. 'è' should be before 'Z'.", - ], - output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", - }, - - // desc, natural - { - code: 'enum U {a="T", _="T", b="T"} // desc, natural', - options: ['desc', { natural: true }], - errors: ["Expected string enum members to be in natural descending order. 'b' should be before '_'."], - output: 'enum U {b="T", _="T", a="T",} // desc, natural', - }, - { - code: 'enum U {a="T", c="T", b="T"}', - options: ['desc', { natural: true }], - errors: ["Expected string enum members to be in natural descending order. 'c' should be before 'a'."], - output: 'enum U {c="T", a="T", b="T"}', - }, - { - code: 'enum U {b_="T", a="T", b="T"}', - options: ['desc', { natural: true }], - errors: ["Expected string enum members to be in natural descending order. 'b' should be before 'a'."], - output: 'enum U {b_="T", b="T", a="T"}', - }, - { - code: 'enum U {b_="T", c="T", C="T"}', - options: ['desc', { natural: true }], - errors: ["Expected string enum members to be in natural descending order. 'c' should be before 'b_'."], - output: 'enum U {c="T", b_="T", C="T"}', - }, - { - code: 'enum U {$="T", _="T", A="T", a="T"}', - options: ['desc', { natural: true }], - errors: [ - "Expected string enum members to be in natural descending order. '_' should be before '$'.", - "Expected string enum members to be in natural descending order. 'A' should be before '_'.", - "Expected string enum members to be in natural descending order. 'a' should be before 'A'.", - ], - output: 'enum U {a="T", _="T", A="T", $="T"}', - }, - { - code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - options: ['desc', { natural: true }], - errors: [ - "Expected string enum members to be in natural descending order. 'À' should be before '#'.", - "Expected string enum members to be in natural descending order. 'è' should be before 'Z'.", - ], - output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", - }, - - // desc, natural, insensitive - { - code: 'enum U {a="T", _="T", b="T"} // desc, natural, insensitive', - options: ['desc', { natural: true, caseSensitive: false }], - errors: ["Expected string enum members to be in natural insensitive descending order. 'b' should be before '_'."], - output: 'enum U {b="T", _="T", a="T",} // desc, natural, insensitive', - }, - { - code: 'enum U {a="T", c="T", b="T"}', - options: ['desc', { natural: true, caseSensitive: false }], - errors: ["Expected string enum members to be in natural insensitive descending order. 'c' should be before 'a'."], - output: 'enum U {c="T", a="T", b="T"}', - }, - { - code: 'enum U {b_="T", a="T", b="T"}', - options: ['desc', { natural: true, caseSensitive: false }], - errors: ["Expected string enum members to be in natural insensitive descending order. 'b' should be before 'a'."], - output: 'enum U {b_="T", b="T", a="T"}', - }, - { - code: 'enum U {b_="T", c="T", C="T"}', - options: ['desc', { natural: true, caseSensitive: false }], - errors: ["Expected string enum members to be in natural insensitive descending order. 'c' should be before 'b_'."], - output: 'enum U {c="T", b_="T", C="T"}', - }, - { - code: 'enum U {$="T", _="T", A="T", a="T"}', - options: ['desc', { natural: true, caseSensitive: false }], - errors: [ - "Expected string enum members to be in natural insensitive descending order. '_' should be before '$'.", - "Expected string enum members to be in natural insensitive descending order. 'A' should be before '_'.", - ], - output: 'enum U {A="T", _="T", $="T", a="T"}', - }, - { - code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - options: ['desc', { natural: true, caseSensitive: false }], - errors: [ - "Expected string enum members to be in natural insensitive descending order. 'À' should be before '#'.", - "Expected string enum members to be in natural insensitive descending order. 'è' should be before 'Z'.", - ], - output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", - }, - ], -}); diff --git a/tests/rules/string-enum.spec.ts b/tests/rules/string-enum.spec.ts new file mode 100644 index 0000000..c3421cd --- /dev/null +++ b/tests/rules/string-enum.spec.ts @@ -0,0 +1,859 @@ +import { Rule, RuleTester } from 'eslint'; + +import { rule, name, Options } from 'rules/string-enum'; +import { SortingOrder } from 'common/options'; +import { typescript } from '../helpers/configs'; +import { + InvalidTestCase, + processInvalidTestCase, + processValidTestCase, + ValidTestCase, +} from '../helpers/util'; + +const valid: readonly ValidTestCase[] = [ + /** + * ignores + */ + { code: 'enum U {c, b, a}', optionsSet: [[]] }, + { code: 'enum U {c=a(), b, a}', optionsSet: [[]] }, + { code: 'enum U {c=0, b, a}', optionsSet: [[]] }, + { code: 'enum U {c=3, b, a}', optionsSet: [[]] }, + { code: 'enum U {c=1<<1, b, a}', optionsSet: [[]] }, + { code: 'enum U {c=M|N, b, a}', optionsSet: [[]] }, + { code: 'enum U {c="123".length, b, a}', optionsSet: [[]] }, + { code: 'enum U {c=0, b="b", a}', optionsSet: [[]] }, + { code: 'const enum U {A=1, B=A*2}', optionsSet: [[]] }, + + /** + * default (asc) + */ + { + code: 'enum U {_="a", a="b", b="c"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {a="a", b="b", c="c"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {a="a", b="b", b_="c"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {C="a", b_="b", c="c"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {$="a", A="b", _="c", a="d"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "enum U {'#'='a', 'Z'='b', À='c', è='d'}", + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + { + code: 'enum U {_="T", a="T", b="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {a="T", b="T", c="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {a="T", b="T", b_="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {C="T", b_="T", c="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {$="T", A="T", _="T", a="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * computed + */ + { + code: '{a="T", ["aa"]="T", b="T", c="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * asc, insensitive + */ + { + code: 'enum U {_="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'enum U {a="T", b="T", c="T"}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'enum U {a="T", b="T", b_="T"}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'enum U {b_="T", C="T", c="T"}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'enum U {b_="T", c="T", C="T"}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'enum U {$="T", _="T", A="T", a="T"}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + + /** + * asc, natural, insensitive + */ + { + code: 'enum U {_="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'enum U {a="T", b="T", c="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'enum U {a="T", b="T", b_="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'enum U {b_="T", C="T", c="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'enum U {b_="T", c="T", C="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: 'enum U {$="T", _="T", A="T", a="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + { + code: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + }, + + /** + * desc + */ + { code: 'enum U {b="T", a="T", _="T"}', optionsSet: [[SortingOrder.Descending]] }, + { code: 'enum U {c="T", b="T", a="T"}', optionsSet: [[SortingOrder.Descending]] }, + { code: 'enum U {b_="T", b="T", a="T"}', optionsSet: [[SortingOrder.Descending]] }, + { code: 'enum U {c="T", b_="T", C="T"}', optionsSet: [[SortingOrder.Descending]] }, + { code: 'enum U {a="T", _="T", A="T", $="T"}', optionsSet: [[SortingOrder.Descending]] }, + { code: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", optionsSet: [[SortingOrder.Descending]] }, + + /** + * desc, insensitive + */ + { + code: 'enum U {b="T", a="T", _="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + { + code: 'enum U {c="T", b="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + { + code: 'enum U {b_="T", b="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + { + code: 'enum U {c="T", C="T", b_="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + { + code: 'enum U {C="T", c="T", b_="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + { + code: 'enum U {a="T", A="T", _="T", $="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + { + code: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + }, + + /** + * desc, natural + */ + { + code: 'enum U {b="T", a="T", _="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + { + code: 'enum U {c="T", b="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + { + code: 'enum U {b_="T", b="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + { + code: 'enum U {c="T", b_="T", C="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + { + code: 'enum U {a="T", A="T", _="T", $="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + { + code: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", + optionsSet: [[SortingOrder.Descending, { natural: true }]], + }, + + /** + * desc, natural, insensitive + */ + { + code: 'enum U {b="T", a="T", _="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'enum U {c="T", b="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'enum U {b_="T", b="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'enum U {c="T", C="T", b_="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'enum U {C="T", c="T", b_="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: 'enum U {a="T", A="T", _="T", $="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, + { + code: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + }, +]; + +const invalid: readonly InvalidTestCase[] = [ + /** + * default (asc) + */ + { + code: 'enum U {a="a", _="b", b="c"}', + errors: ["Expected string enum members to be in ascending order. '_' should be before 'a'."], + output: 'enum U {_="b", a="a", b="c"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {a="T", c="T", b="T"}', + errors: ["Expected string enum members to be in ascending order. 'b' should be before 'c'."], + output: 'enum U {a="T", b="T", c="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {b_="T", a="T", b="T"}', + errors: ["Expected string enum members to be in ascending order. 'a' should be before 'b_'."], + output: 'enum U {a="T", b_="T", b="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {b_="T", c="T", C="T"}', + errors: ["Expected string enum members to be in ascending order. 'C' should be before 'c'."], + output: 'enum U {C="T", c="T", b_="T",}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {$="T", _="T", A="T", a="T"}', + errors: ["Expected string enum members to be in ascending order. 'A' should be before '_'."], + output: 'enum U {$="T", A="T", _="T", a="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", + errors: ["Expected string enum members to be in ascending order. 'Z' should be before 'À'."], + output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * not ignore simple computed properties. + */ + { + code: 'enum U {a="T", b="T", ["aa"]="T", c="T"}', + errors: ["Expected string enum members to be in ascending order. 'aa' should be before 'b'."], + output: 'enum U {a="T", ["aa"]="T", b="T", c="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * asc + */ + { + code: 'enum U {a="T", _="T", b="T"}', + errors: ["Expected string enum members to be in ascending order. '_' should be before 'a'."], + output: 'enum U {_="T", a="T", b="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {a="T", c="T", b="T"}', + errors: ["Expected string enum members to be in ascending order. 'b' should be before 'c'."], + output: 'enum U {a="T", b="T", c="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {b_="T", a="T", b="T"}', + errors: ["Expected string enum members to be in ascending order. 'a' should be before 'b_'."], + output: 'enum U {a="T", b_="T", b="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {b_="T", c="T", C="T"}', + errors: ["Expected string enum members to be in ascending order. 'C' should be before 'c'."], + output: 'enum U {C="T", c="T", b_="T",}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: 'enum U {$="T", _="T", A="T", a="T"}', + errors: ["Expected string enum members to be in ascending order. 'A' should be before '_'."], + output: 'enum U {$="T", A="T", _="T", a="T"}', + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + { + code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", + errors: ["Expected string enum members to be in ascending order. 'Z' should be before 'À'."], + output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", + optionsSet: [ + [], + [SortingOrder.Ascending], + [SortingOrder.Ascending, { caseSensitive: true }], + [SortingOrder.Ascending, { natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + ], + }, + + /** + * asc, insensitive + */ + { + code: 'enum U {a="T", _="T", b="T"}', + errors: [ + "Expected string enum members to be in insensitive ascending order. '_' should be before 'a'.", + ], + output: 'enum U {_="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'enum U {a="T", c="T", b="T"}', + errors: [ + "Expected string enum members to be in insensitive ascending order. 'b' should be before 'c'.", + ], + output: 'enum U {a="T", b="T", c="T"}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'enum U {b_="T", a="T", b="T"}', + errors: [ + "Expected string enum members to be in insensitive ascending order. 'a' should be before 'b_'.", + ], + output: 'enum U {a="T", b_="T", b="T"}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: 'enum U {$="T", A="T", _="T", a="T"}', + errors: [ + "Expected string enum members to be in insensitive ascending order. '_' should be before 'A'.", + ], + output: 'enum U {$="T", _="T", A="T", a="T"}', + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + { + code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", + errors: [ + "Expected string enum members to be in insensitive ascending order. 'Z' should be before 'À'.", + ], + output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", + optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], + }, + + /** + * asc, natural + */ + { + code: 'enum U {a="T", _="T", b="T"}', + errors: [ + "Expected string enum members to be in natural ascending order. '_' should be before 'a'.", + ], + output: 'enum U {_="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + { + code: 'enum U {a="T", c="T", b="T"}', + errors: [ + "Expected string enum members to be in natural ascending order. 'b' should be before 'c'.", + ], + output: 'enum U {a="T", b="T", c="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + { + code: 'enum U {b_="T", a="T", b="T"}', + errors: [ + "Expected string enum members to be in natural ascending order. 'a' should be before 'b_'.", + ], + output: 'enum U {a="T", b_="T", b="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + { + code: 'enum U {b_="T", c="T", C="T"}', + errors: [ + "Expected string enum members to be in natural ascending order. 'C' should be before 'c'.", + ], + output: 'enum U {C="T", c="T", b_="T",}', + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + { + code: 'enum U {$="T", A="T", _="T", a="T"}', + errors: [ + "Expected string enum members to be in natural ascending order. '_' should be before 'A'.", + ], + output: 'enum U {$="T", _="T", A="T", a="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + { + code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", + errors: [ + "Expected string enum members to be in natural ascending order. 'Z' should be before 'À'.", + ], + output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", + optionsSet: [[SortingOrder.Ascending, { natural: true }]], + }, + + /** + * asc, natural, insensitive + */ + { + code: 'enum U {a="T", _="T", b="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + errors: [ + "Expected string enum members to be in natural insensitive ascending order. '_' should be before 'a'.", + ], + output: 'enum U {_="T", a="T", b="T"}', + }, + { + code: 'enum U {a="T", c="T", b="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + errors: [ + "Expected string enum members to be in natural insensitive ascending order. 'b' should be before 'c'.", + ], + output: 'enum U {a="T", b="T", c="T"}', + }, + { + code: 'enum U {b_="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + errors: [ + "Expected string enum members to be in natural insensitive ascending order. 'a' should be before 'b_'.", + ], + output: 'enum U {a="T", b_="T", b="T"}', + }, + { + code: 'enum U {$="T", A="T", _="T", a="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + errors: [ + "Expected string enum members to be in natural insensitive ascending order. '_' should be before 'A'.", + ], + output: 'enum U {$="T", _="T", A="T", a="T"}', + }, + { + code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + errors: [ + "Expected string enum members to be in natural insensitive ascending order. 'Z' should be before 'À'.", + ], + output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", + }, + + /** + * desc + */ + { + code: 'enum U {a="T", _="T", b="T"}', + optionsSet: [[SortingOrder.Descending]], + errors: ["Expected string enum members to be in descending order. 'b' should be before '_'."], + output: 'enum U {b="T", _="T", a="T",}', + }, + { + code: 'enum U {a="T", c="T", b="T"}', + optionsSet: [[SortingOrder.Descending]], + errors: ["Expected string enum members to be in descending order. 'c' should be before 'a'."], + output: 'enum U {c="T", a="T", b="T"}', + }, + { + code: 'enum U {b_="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Descending]], + errors: ["Expected string enum members to be in descending order. 'b' should be before 'a'."], + output: 'enum U {b_="T", b="T", a="T"}', + }, + { + code: 'enum U {b_="T", c="T", C="T"}', + optionsSet: [[SortingOrder.Descending]], + errors: ["Expected string enum members to be in descending order. 'c' should be before 'b_'."], + output: 'enum U {c="T", b_="T", C="T"}', + }, + { + code: 'enum U {$="T", _="T", A="T", a="T"}', + optionsSet: [[SortingOrder.Descending]], + errors: [ + "Expected string enum members to be in descending order. '_' should be before '$'.", + "Expected string enum members to be in descending order. 'a' should be before 'A'.", + ], + output: 'enum U {a="T", _="T", A="T", $="T"}', + }, + { + code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", + optionsSet: [[SortingOrder.Descending]], + errors: [ + "Expected string enum members to be in descending order. 'À' should be before '#'.", + "Expected string enum members to be in descending order. 'è' should be before 'Z'.", + ], + output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", + }, + + /** + * desc, insensitive + */ + { + code: 'enum U {a="T", _="T", b="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + errors: [ + "Expected string enum members to be in insensitive descending order. 'b' should be before '_'.", + ], + output: 'enum U {b="T", _="T", a="T",}', + }, + { + code: 'enum U {a="T", c="T", b="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + errors: [ + "Expected string enum members to be in insensitive descending order. 'c' should be before 'a'.", + ], + output: 'enum U {c="T", a="T", b="T"}', + }, + { + code: 'enum U {b_="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + errors: [ + "Expected string enum members to be in insensitive descending order. 'b' should be before 'a'.", + ], + output: 'enum U {b_="T", b="T", a="T"}', + }, + { + code: 'enum U {b_="T", c="T", C="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + errors: [ + "Expected string enum members to be in insensitive descending order. 'c' should be before 'b_'.", + ], + output: 'enum U {c="T", b_="T", C="T"}', + }, + { + code: 'enum U {$="T", _="T", A="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + errors: [ + "Expected string enum members to be in insensitive descending order. '_' should be before '$'.", + "Expected string enum members to be in insensitive descending order. 'A' should be before '_'.", + ], + output: 'enum U {A="T", _="T", $="T", a="T"}', + }, + { + code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + errors: [ + "Expected string enum members to be in insensitive descending order. 'À' should be before '#'.", + "Expected string enum members to be in insensitive descending order. 'è' should be before 'Z'.", + ], + output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", + }, + + /** + * desc, natural + */ + { + code: 'enum U {a="T", _="T", b="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + errors: [ + "Expected string enum members to be in natural descending order. 'b' should be before '_'.", + ], + output: 'enum U {b="T", _="T", a="T",}', + }, + { + code: 'enum U {a="T", c="T", b="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + errors: [ + "Expected string enum members to be in natural descending order. 'c' should be before 'a'.", + ], + output: 'enum U {c="T", a="T", b="T"}', + }, + { + code: 'enum U {b_="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + errors: [ + "Expected string enum members to be in natural descending order. 'b' should be before 'a'.", + ], + output: 'enum U {b_="T", b="T", a="T"}', + }, + { + code: 'enum U {b_="T", c="T", C="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + errors: [ + "Expected string enum members to be in natural descending order. 'c' should be before 'b_'.", + ], + output: 'enum U {c="T", b_="T", C="T"}', + }, + { + code: 'enum U {$="T", _="T", A="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], + errors: [ + "Expected string enum members to be in natural descending order. '_' should be before '$'.", + "Expected string enum members to be in natural descending order. 'A' should be before '_'.", + "Expected string enum members to be in natural descending order. 'a' should be before 'A'.", + ], + output: 'enum U {a="T", _="T", A="T", $="T"}', + }, + { + code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", + optionsSet: [[SortingOrder.Descending, { natural: true }]], + errors: [ + "Expected string enum members to be in natural descending order. 'À' should be before '#'.", + "Expected string enum members to be in natural descending order. 'è' should be before 'Z'.", + ], + output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", + }, + + /** + * desc, natural, insensitive + */ + { + code: 'enum U {a="T", _="T", b="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + errors: [ + "Expected string enum members to be in natural insensitive descending order. 'b' should be before '_'.", + ], + output: 'enum U {b="T", _="T", a="T",}', + }, + { + code: 'enum U {a="T", c="T", b="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + errors: [ + "Expected string enum members to be in natural insensitive descending order. 'c' should be before 'a'.", + ], + output: 'enum U {c="T", a="T", b="T"}', + }, + { + code: 'enum U {b_="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + errors: [ + "Expected string enum members to be in natural insensitive descending order. 'b' should be before 'a'.", + ], + output: 'enum U {b_="T", b="T", a="T"}', + }, + { + code: 'enum U {b_="T", c="T", C="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + errors: [ + "Expected string enum members to be in natural insensitive descending order. 'c' should be before 'b_'.", + ], + output: 'enum U {c="T", b_="T", C="T"}', + }, + { + code: 'enum U {$="T", _="T", A="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + errors: [ + "Expected string enum members to be in natural insensitive descending order. '_' should be before '$'.", + "Expected string enum members to be in natural insensitive descending order. 'A' should be before '_'.", + ], + output: 'enum U {A="T", _="T", $="T", a="T"}', + }, + { + code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + errors: [ + "Expected string enum members to be in natural insensitive descending order. 'À' should be before '#'.", + "Expected string enum members to be in natural insensitive descending order. 'è' should be before 'Z'.", + ], + output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", + }, +]; + +describe('TypeScript', () => { + const ruleTester = new RuleTester(typescript); + + ruleTester.run(name, (rule as unknown) as Rule.RuleModule, { + valid: processValidTestCase(valid), + invalid: processInvalidTestCase(invalid), + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 56139bf..bdf1139 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ // "incremental": true, /* Enable incremental compilation */ "target": "ES6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, - // "lib": [], /* Specify library files to be included in the compilation. */ + "lib": ["ESNext"] /* Specify library files to be included in the compilation. */, "allowJs": true /* Allow javascript files to be compiled. */, "checkJs": false /* Report errors in .js files. */, // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ From a0de41c682cb5207d607517bf089da5cec01c542 Mon Sep 17 00:00:00 2001 From: infctr Date: Mon, 4 May 2020 18:30:23 +0300 Subject: [PATCH 07/26] Update fixtures --- tests/fixtures/rulesdir/interface.js | 2 +- tests/fixtures/rulesdir/string-enum.js | 2 +- tests/rules/.eslintrc.js | 2 +- tests/rules/.prettierrc.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/fixtures/rulesdir/interface.js b/tests/fixtures/rulesdir/interface.js index d242b2f..5b89b81 100644 --- a/tests/fixtures/rulesdir/interface.js +++ b/tests/fixtures/rulesdir/interface.js @@ -1,7 +1,7 @@ const { rule } = require('../source/interface') /** - * `module.exports` is required for `eslint --rulesdir` interop in autofix tests + * Wrapper for `eslint --rulesdir` interop in autofix tests * @see https://github.com/eslint/eslint/issues/13232 */ module.exports = rule diff --git a/tests/fixtures/rulesdir/string-enum.js b/tests/fixtures/rulesdir/string-enum.js index a0e2885..9a827fe 100644 --- a/tests/fixtures/rulesdir/string-enum.js +++ b/tests/fixtures/rulesdir/string-enum.js @@ -1,7 +1,7 @@ const { rule } = require('../source/string-enum') /** - * `module.exports` is required for `eslint --rulesdir` interop in autofix tests + * Wrapper for `eslint --rulesdir` interop in autofix tests * @see https://github.com/eslint/eslint/issues/13232 */ module.exports = rule diff --git a/tests/rules/.eslintrc.js b/tests/rules/.eslintrc.js index e501d62..9447059 100644 --- a/tests/rules/.eslintrc.js +++ b/tests/rules/.eslintrc.js @@ -2,6 +2,6 @@ const prettier = require('./.prettierrc'); module.exports = { rules: { - 'prettier/prettier': [2, prettier], + 'prettier/prettier': [1, prettier], }, }; diff --git a/tests/rules/.prettierrc.js b/tests/rules/.prettierrc.js index d82cf3b..655bdbb 100644 --- a/tests/rules/.prettierrc.js +++ b/tests/rules/.prettierrc.js @@ -1,4 +1,4 @@ module.exports = { - printWidth: 200, + printWidth: 100, trailingComma: 'all', }; From f53560d527369d748fad7167df88a1ed229a30b0 Mon Sep 17 00:00:00 2001 From: infctr Date: Mon, 4 May 2020 18:53:25 +0300 Subject: [PATCH 08/26] Update eslint config and tsconfig --- .eslintrc.js | 40 ++++++++++------------------------------ tsconfig.prod.json | 7 ------- 2 files changed, 10 insertions(+), 37 deletions(-) delete mode 100644 tsconfig.prod.json diff --git a/.eslintrc.js b/.eslintrc.js index 18b6ad4..2e9358d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -13,7 +13,7 @@ module.exports = { 'plugin:import/typescript', 'plugin:@typescript-eslint/eslint-recommended', 'plugin:@typescript-eslint/recommended', - 'plugin:eslint-plugin/recommended', + 'plugin:eslint-plugin/all', 'plugin:prettier/recommended', 'prettier/@typescript-eslint', ], @@ -23,35 +23,11 @@ module.exports = { sourceType: 'module', }, rules: { - // Built in. 'no-console': 'warn', - // 'no-param-reassign': 'error', - // 'no-var': 'error', - // Typescript eslint. - // '@typescript-eslint/array-type': ['error', { default: 'generic' }], - '@typescript-eslint/explicit-function-return-type': ['off'], - // '@typescript-eslint/prefer-interface': 'off', - // '@typescript-eslint/no-non-null-assertion': 'off', - // '@typescript-eslint/no-require-imports': 'error', - // '@typescript-eslint/no-unused-vars': [ - // 'error', - // { - // args: 'after-used', - // argsIgnorePattern: '^_', - // caughtErrors: 'none', - // ignoreRestSiblings: true, - // vars: 'all', - // }, - // ], - // '@typescript-eslint/no-use-before-define': [ - // 'error', - // { - // functions: true, - // classes: true, - // variables: true, - // typedefs: true, - // }, - // ], + + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/no-explicit-any': 'off', }, overrides: [ { @@ -76,6 +52,10 @@ module.exports = { }, ], settings: { - 'import/ignore': ['escape-string-regexp'], + 'import/resolver': { + node: { + moduleDirectory: ['node_modules', 'src'], + }, + }, }, }; diff --git a/tsconfig.prod.json b/tsconfig.prod.json deleted file mode 100644 index a09f44e..0000000 --- a/tsconfig.prod.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "rootDir": "src" - }, - "exclude": ["tests"] -} From 3e00252b34ecdcdf897fb82419bafeab68c39d80 Mon Sep 17 00:00:00 2001 From: infctr Date: Wed, 6 May 2020 11:51:25 +0300 Subject: [PATCH 09/26] Add stronger types for plugin utils --- src/common/options.ts | 4 ++ src/rules/interface.ts | 13 +++--- src/rules/string-enum.ts | 11 ++--- src/utils/ast.ts | 43 ++++++-------------- src/utils/plugin.ts | 86 +++++++++++++++++++++++++--------------- 5 files changed, 80 insertions(+), 77 deletions(-) diff --git a/src/common/options.ts b/src/common/options.ts index be6d33b..ffe8376 100644 --- a/src/common/options.ts +++ b/src/common/options.ts @@ -29,6 +29,10 @@ export interface SortingParamsOption { readonly natural: boolean; } +export type RuleOptions = + | [SortingOrderOption] + | [SortingOrderOption, Partial]; + export enum ErrorMessage { InterfaceInvalidOrder = `Expected interface keys to be in {{ natural }}{{ insensitive }}{{ order }}ending order. '{{ thisName }}' should be before '{{ prevName }}'.`, StringEnumInvalidOrder = `Expected string enum members to be in {{ natural }}{{ insensitive }}{{ order }}ending order. '{{ thisName }}' should be before '{{ prevName }}'.`, diff --git a/src/rules/interface.ts b/src/rules/interface.ts index a368062..a554037 100644 --- a/src/rules/interface.ts +++ b/src/rules/interface.ts @@ -7,9 +7,8 @@ import { sortingOrderOptionSchema, sortingParamsOptionSchema, SortingOrder, - SortingParamsOption, - SortingOrderOption, ErrorMessage, + RuleOptions, } from 'common/options'; /** @@ -20,9 +19,7 @@ export const name = 'interface' as const; /** * The options this rule can take. */ -export type Options = - | [SortingOrderOption] - | [SortingOrderOption, Partial]; +export type Options = RuleOptions; /** * The schema for the rule options. @@ -68,19 +65,21 @@ export const rule = createRule({ defaultOptions, create(context) { - const compareNodeListAndReport = createReporter(context, currentNode => ({ - loc: currentNode.key ? currentNode.key.loc : currentNode.loc, + const compareNodeListAndReport = createReporter(context, ({ loc }) => ({ + loc, messageId: 'invalidOrder', })); return { TSInterfaceDeclaration(node) { const body = getObjectBody(node); + return compareNodeListAndReport(body); }, TSTypeLiteral(node) { const body = getObjectBody(node); + return compareNodeListAndReport(body); }, }; diff --git a/src/rules/string-enum.ts b/src/rules/string-enum.ts index 53ff4fd..8aa3bdc 100644 --- a/src/rules/string-enum.ts +++ b/src/rules/string-enum.ts @@ -7,9 +7,8 @@ import { sortingOrderOptionSchema, sortingParamsOptionSchema, SortingOrder, - SortingParamsOption, - SortingOrderOption, ErrorMessage, + RuleOptions, } from 'common/options'; /** @@ -20,9 +19,7 @@ export const name = 'string-enum' as const; /** * The options this rule can take. */ -export type Options = - | [SortingOrderOption] - | [SortingOrderOption, Partial]; +export type Options = RuleOptions; /** * The schema for the rule options. @@ -68,8 +65,8 @@ export const rule = createRule({ defaultOptions, create(context) { - const compareNodeListAndReport = createReporter(context, currentNode => ({ - loc: currentNode.key ? currentNode.key.loc : currentNode.loc, + const compareNodeListAndReport = createReporter(context, ({ loc }) => ({ + loc, messageId: 'invalidOrder', })); diff --git a/src/utils/ast.ts b/src/utils/ast.ts index 4acbb52..cf98aa9 100644 --- a/src/utils/ast.ts +++ b/src/utils/ast.ts @@ -49,12 +49,12 @@ function getProperty(node: TSESTree.Node) { } /** - * Gets the property name of a given node. - * The node can be a TSPropertySignature, or a TSMethodSignature. - * - * If the name is dynamic, this returns `null`. + * Gets the property name of the given `Property` node. * - * For examples: + * - If the property's key is an `Identifier` node, this returns the key's name + * whether it's a computed property or not. + * - If the property has a static name, this returns the static name. + * - Otherwise, this returns null. * * a.b // => "b" * a["b"] // => "b" @@ -76,10 +76,16 @@ function getProperty(node: TSESTree.Node) { * let a = {[tag`b`]: 1} // => null * let a = {[`${b}`]: 1} // => null */ -export function getStaticPropertyName(node: TSESTree.Node): string | null { +export function getPropertyName(node: TSESTree.Node): string | null { + if (!node.type) { + return null; + } + const property = getProperty(node); - if (!property) return null; + if (!property) { + return null; + } switch (property.type) { case AST_NODE_TYPES.Literal: @@ -99,26 +105,3 @@ export function getStaticPropertyName(node: TSESTree.Node): string | null { return null; } } - -/** - * Gets the property name of the given `Property` node. - * - * - If the property's key is an `Identifier` node, this returns the key's name - * whether it's a computed property or not. - * - If the property has a static name, this returns the static name. - * - Otherwise, this returns null. - */ -export function getPropertyName(node: TSESTree.Node): string | null { - if (node.type) { - return getStaticPropertyName(node); - } - - // if (node.key) { - // console.log('node.key', node.key); - // return node.key.name; - // } - - return null; - - // return getStaticPropertyName(node) || (node.key && node.key.name) || null; -} diff --git a/src/utils/plugin.ts b/src/utils/plugin.ts index 61f00b6..6457547 100644 --- a/src/utils/plugin.ts +++ b/src/utils/plugin.ts @@ -1,30 +1,39 @@ +import { TSESTree, AST_TOKEN_TYPES } from '@typescript-eslint/experimental-utils'; +import { + RuleContext as UtilRuleContext, + RuleFixer, + RuleFix, + SourceCode, +} from '@typescript-eslint/experimental-utils/dist/ts-eslint'; import assert from 'assert'; +import { RuleOptions, SortingOrder } from 'common/options'; import { getPropertyName } from './ast'; import { compareFunctions } from './compare'; -function createNodeSwapper(context) { - const sourceCode = context.getSourceCode(); +type TSType = TSESTree.TypeElement | TSESTree.TSEnumMember; + +function createNodeSwapper(context: UtilRuleContext) { + const sourceCode = context.getSourceCode() as SourceCode & { + lineStartIndices: number[]; + }; /** * Returns the indent range of a node if it's the first on its line. * Otherwise, returns a range starting immediately after the previous sibling. */ - function getIndentRange(node) { + function getIndentRange(node: TSESTree.Node | TSESTree.Comment): TSESTree.Range { const prevSibling = sourceCode.getTokenBefore(node); const end = node.range[0]; - let start; - - if (prevSibling.loc.start.line === node.loc.start.line) { - start = prevSibling.range[1] + 1; - } else { - start = node.range[0] - node.loc.start.column; - } + const start = + prevSibling.loc.start.line === node.loc.start.line + ? prevSibling.range[1] + 1 + : node.range[0] - node.loc.start.column; return [start, end]; } - function getRangeWithIndent(node) { + function getRangeWithIndent(node: TSESTree.Comment) { return [getIndentRange(node)[0], node.range[1]]; } @@ -32,8 +41,9 @@ function createNodeSwapper(context) { * Returns the range for the entire line, including EOL, if node is the only * token on its lines. Otherwise, returns the node range. */ - function getLineRange(node) { + function getLineRange(node: TSESTree.Comment): TSESTree.Range { const [start] = getRangeWithIndent(node); + // TODO check SourceCode own methods const index = sourceCode.lineStartIndices.findIndex(n => start === n); if (index < 0) { @@ -49,27 +59,30 @@ function createNodeSwapper(context) { ]; } - function getIndentText(node) { + function getIndentText(node: TSESTree.Node) { return sourceCode.text.slice(...getIndentRange(node)); } - function getNodePunctuator(node) { - let punctuator; + function getNodePunctuator(token: TSESTree.Token) { + const punctuator = + token.type === AST_TOKEN_TYPES.Punctuator + ? token + : sourceCode.getTokenAfter(token, { + filter: n => n.type === AST_TOKEN_TYPES.Punctuator && n.value !== ':', + includeComments: false, + }); - if (node.type === 'Punctuator') { - punctuator = node; - } else { - punctuator = sourceCode.getTokenAfter(node, { - filter: n => n.type === 'Punctuator' && n.value !== ':', - includeComments: false, - }); - } // Check the punctuator value outside of filter because we // want to stop traversal on any terminating punctuator return punctuator && /^[,;]$/.test(punctuator.value) ? punctuator : undefined; } - return (fixer, nodePositions, currentNode, replaceNode) => + return ( + fixer: RuleFixer, + nodePositions: Map, + currentNode: TSType, + replaceNode: TSType, + ) => [currentNode, replaceNode].reduce((acc, node) => { const otherNode = node === currentNode ? replaceNode : currentNode; const comments = sourceCode.getCommentsBefore(node); @@ -120,12 +133,17 @@ function createNodeSwapper(context) { ); return acc; - }, []); + }, [] as RuleFix[]); } -export function createReporter(context, createReportObject) { +export function createReporter( + context: UtilRuleContext, + createReportObject: ( + node: TSESTree.Node, + ) => { readonly loc: TSESTree.SourceLocation; readonly messageId: MessageIds }, +) { // Parse options. - const order = context.options[0] || 'asc'; + const order = context.options[0] || SortingOrder.Ascending; const options = context.options[1]; const insensitive = (options && options.caseSensitive) === false; const natural = Boolean(options && options.natural); @@ -136,7 +154,7 @@ export function createReporter(context, createReportObject) { const compareFn = compareFunctions[computedOrder]; const swapNodes = createNodeSwapper(context); - return body => { + return (body: TSType[]) => { const sortedBody = [...body].sort((a, b) => { return compareFn(getPropertyName(a), getPropertyName(b)); }); @@ -154,16 +172,18 @@ export function createReporter(context, createReportObject) { if (compareFn(prevNodeName, currentNodeName) > 0) { const targetPosition = sortedBody.indexOf(currentNode); const replaceNode = body[targetPosition]; - const { data, ...rest } = createReportObject(currentNode, replaceNode); + const { loc, messageId } = createReportObject(currentNode); // Sanity check - assert(rest.loc, 'createReportObject return value must include a node location'); + assert(loc, 'createReportObject return value must include a node location'); assert( - rest.messageId, + messageId, 'createReportObject return value must include a problem message', ); context.report({ + loc, + messageId, node: currentNode, data: { thisName: currentNodeName, @@ -171,15 +191,15 @@ export function createReporter(context, createReportObject) { order, insensitive: insensitive ? 'insensitive ' : '', natural: natural ? 'natural ' : '', - ...data, }, + fix: fixer => { if (currentNode !== replaceNode) { return swapNodes(fixer, nodePositions, currentNode, replaceNode); } + return undefined; }, - ...rest, }); } } From a81e1f90ba28fe919e1ba8160bfa5c2d5d246947 Mon Sep 17 00:00:00 2001 From: infctr Date: Tue, 12 May 2020 22:32:56 +0300 Subject: [PATCH 10/26] Add stricter types --- .prettierignore | 3 +++ package.json | 8 ++++---- src/rules/string-enum.ts | 7 ++++--- src/utils/ast.ts | 2 -- src/utils/plugin.ts | 27 ++++++++++++--------------- 5 files changed, 23 insertions(+), 24 deletions(-) diff --git a/.prettierignore b/.prettierignore index 8cd209f..49bc1ca 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,4 @@ tests/fixtures/** +build +dist +lib diff --git a/package.json b/package.json index 010d107..8baa9ac 100644 --- a/package.json +++ b/package.json @@ -13,16 +13,16 @@ "repository": "git@github.com:infctr/eslint-plugin-typescript-sort-keys.git", "scripts": { "build": "yarn rimraf lib && yarn compile", - "build-tests": "yarn rimraf build && yarn compile-tests", + "build-tests": "yarn rimraf build && yarn compile-tests && mv build/rules build/source && cp -r tests/fixtures/rulesdir build/rules", "compile": "yarn rollup -c", "compile-tests": "yarn babel --extensions .ts src --out-dir build", "docs": "eslint-docs", "docs:check": "eslint-docs check", "lint": "eslint --ext .js,.ts src/ tests/", - "postlint": "yarn docs:check", "format": "prettier --write src/**/*.{js,ts} tests/**/*.{js,ts}", - "test": "yarn jest --runInBand", - "test-compiled": "mv build/rules build/source && cp -r tests/fixtures/rulesdir build/rules && USE_COMPILED=1 yarn test", + "test": "yarn jest", + "test-compiled": "USE_COMPILED=1 yarn test", + "test-coverage": "yarn test-compiled --coverage --watchAll=false --coverageReporters=lcov,text-summary", "verify": "yarn build && yarn lint && yarn build-tests && yarn test-compiled && rimraf build" }, "dependencies": { diff --git a/src/rules/string-enum.ts b/src/rules/string-enum.ts index 8aa3bdc..d1536ba 100644 --- a/src/rules/string-enum.ts +++ b/src/rules/string-enum.ts @@ -1,4 +1,5 @@ import { JSONSchema4 } from 'json-schema'; +import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils'; import { getObjectBody } from 'utils/ast'; import { createReporter } from 'utils/plugin'; @@ -72,11 +73,11 @@ export const rule = createRule({ return { TSEnumDeclaration(node) { - const body = getObjectBody(node); + const body = getObjectBody(node) as TSESTree.TSEnumMember[]; const isStringEnum = body.every( - member => + (member: TSESTree.TSEnumMember) => member.initializer && - member.initializer.type === 'Literal' && + member.initializer.type === AST_NODE_TYPES.Literal && typeof member.initializer.value === 'string', ); diff --git a/src/utils/ast.ts b/src/utils/ast.ts index cf98aa9..988be08 100644 --- a/src/utils/ast.ts +++ b/src/utils/ast.ts @@ -14,8 +14,6 @@ export function getObjectBody( case AST_NODE_TYPES.TSEnumDeclaration: case AST_NODE_TYPES.TSTypeLiteral: return node.members; - default: - return null; } } diff --git a/src/utils/plugin.ts b/src/utils/plugin.ts index 6457547..3f21abb 100644 --- a/src/utils/plugin.ts +++ b/src/utils/plugin.ts @@ -43,7 +43,6 @@ function createNodeSwapper(context: UtilRuleContext) { */ function getLineRange(node: TSESTree.Comment): TSESTree.Range { const [start] = getRangeWithIndent(node); - // TODO check SourceCode own methods const index = sourceCode.lineStartIndices.findIndex(n => start === n); if (index < 0) { @@ -63,14 +62,11 @@ function createNodeSwapper(context: UtilRuleContext) { return sourceCode.text.slice(...getIndentRange(node)); } - function getNodePunctuator(token: TSESTree.Token) { - const punctuator = - token.type === AST_TOKEN_TYPES.Punctuator - ? token - : sourceCode.getTokenAfter(token, { - filter: n => n.type === AST_TOKEN_TYPES.Punctuator && n.value !== ':', - includeComments: false, - }); + function getNodePunctuator(node: TSESTree.Node) { + const punctuator = sourceCode.getTokenAfter(node, { + filter: n => n.type === AST_TOKEN_TYPES.Punctuator && n.value !== ':', + includeComments: false, + }); // Check the punctuator value outside of filter because we // want to stop traversal on any terminating punctuator @@ -83,7 +79,7 @@ function createNodeSwapper(context: UtilRuleContext) { currentNode: TSType, replaceNode: TSType, ) => - [currentNode, replaceNode].reduce((acc, node) => { + [currentNode, replaceNode].reduce((acc, node) => { const otherNode = node === currentNode ? replaceNode : currentNode; const comments = sourceCode.getCommentsBefore(node); const nextSibling = sourceCode.getTokenAfter(node); @@ -91,9 +87,10 @@ function createNodeSwapper(context: UtilRuleContext) { nodePositions.get(node).final === nodePositions.size - 1 && nodePositions.get(node).final === nodePositions.get(otherNode).initial; - let text = `${comments.length ? getIndentText(node) : ''}${sourceCode.getText( - node, - )}`; + let text = [ + comments.length ? getIndentText(node) : '', + sourceCode.getText(node), + ].join(''); // If nextSibling is the node punctuator, remove it if (nextSibling === getNodePunctuator(node)) { @@ -116,7 +113,7 @@ function createNodeSwapper(context: UtilRuleContext) { fixer.insertTextBefore( otherNode, comments - .map(c => sourceCode.getText(c)) + .map(comment => sourceCode.getText(comment as any)) .concat('') .join('\n'), ), @@ -133,7 +130,7 @@ function createNodeSwapper(context: UtilRuleContext) { ); return acc; - }, [] as RuleFix[]); + }, []); } export function createReporter( From dd93389e520f050e4ce1dacc38fb2f0b42c6409e Mon Sep 17 00:00:00 2001 From: infctr Date: Tue, 12 May 2020 22:33:23 +0300 Subject: [PATCH 11/26] Update dependecies --- package.json | 26 +- yarn.lock | 1833 +++++++++++++++++++++++--------------------------- 2 files changed, 854 insertions(+), 1005 deletions(-) diff --git a/package.json b/package.json index 8baa9ac..306e568 100644 --- a/package.json +++ b/package.json @@ -42,26 +42,26 @@ "@types/prettier": "~2.0.0", "@types/requireindex": "~1.2.0", "@types/rimraf": "~3.0.0", - "@types/tmp": "~0.1.0", - "@typescript-eslint/eslint-plugin": "~2.26.0", - "@typescript-eslint/experimental-utils": "~2.29.0", - "@typescript-eslint/parser": "~2.26.0", - "babel-jest": "~25.5.1", + "@types/tmp": "~0.2.0", + "@typescript-eslint/eslint-plugin": "~2.32.0", + "@typescript-eslint/experimental-utils": "~2.32.0", + "@typescript-eslint/parser": "~2.32.0", + "babel-jest": "~26.0.1", "babel-plugin-module-resolver": "~4.0.0", "cross-spawn": "~7.0.1", "eslint": "~6.8.0", - "eslint-config-prettier": "~6.10.1", + "eslint-config-prettier": "~6.11.0", "eslint-plugin-eslint-plugin": "~2.2.1", "eslint-plugin-import": "~2.20.2", - "eslint-plugin-jest": "~23.8.2", - "eslint-plugin-prettier": "~3.1.2", - "husky": "~4.2.3", - "jest": "~25.2.4", + "eslint-plugin-jest": "~23.10.0", + "eslint-plugin-prettier": "~3.1.3", + "husky": "~4.2.5", + "jest": "~26.0.1", "jsonc": "~2.0.0", - "lint-staged": "~10.1.1", - "prettier": "~2.0.2", + "lint-staged": "~10.2.2", + "prettier": "~2.0.5", "rimraf": "~3.0.2", - "tmp": "~0.1.0", + "tmp": "~0.2.1", "tsconfig": "~7.0.0", "typescript": "~3.8.3" }, diff --git a/yarn.lock b/yarn.lock index 6844b6c..892df80 100644 --- a/yarn.lock +++ b/yarn.lock @@ -440,7 +440,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-bigint@^7.0.0", "@babel/plugin-syntax-bigint@^7.8.3": +"@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== @@ -489,7 +489,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -974,194 +974,181 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@jest/console@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.2.3.tgz#38ac19b916ff61457173799239472659e1a67c39" - integrity sha512-k+37B1aSvOt9tKHWbZZSOy1jdgzesB0bj96igCVUG1nAH1W5EoUfgc5EXbBVU08KSLvkVdWopLXaO3xfVGlxtQ== +"@jest/console@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.0.1.tgz#62b3b2fa8990f3cbffbef695c42ae9ddbc8f4b39" + integrity sha512-9t1KUe/93coV1rBSxMmBAOIK3/HVpwxArCA1CxskKyRiv6o8J70V8C/V3OJminVCTa2M0hQI9AWRd5wxu2dAHw== dependencies: - "@jest/source-map" "^25.2.1" - chalk "^3.0.0" - jest-util "^25.2.3" + "@jest/types" "^26.0.1" + chalk "^4.0.0" + jest-message-util "^26.0.1" + jest-util "^26.0.1" slash "^3.0.0" -"@jest/core@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.2.4.tgz#382ef80369d3311f1df79db1ee19e958ae95cdad" - integrity sha512-WcWYShl0Bqfcb32oXtjwbiR78D/djhMdJW+ulp4/bmHgeODcsieqUJfUH+kEv8M7VNV77E6jds5aA+WuGh1nmg== +"@jest/core@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.0.1.tgz#aa538d52497dfab56735efb00e506be83d841fae" + integrity sha512-Xq3eqYnxsG9SjDC+WLeIgf7/8KU6rddBxH+SCt18gEpOhAGYC/Mq+YbtlNcIdwjnnT+wDseXSbU0e5X84Y4jTQ== dependencies: - "@jest/console" "^25.2.3" - "@jest/reporters" "^25.2.4" - "@jest/test-result" "^25.2.4" - "@jest/transform" "^25.2.4" - "@jest/types" "^25.2.3" + "@jest/console" "^26.0.1" + "@jest/reporters" "^26.0.1" + "@jest/test-result" "^26.0.1" + "@jest/transform" "^26.0.1" + "@jest/types" "^26.0.1" ansi-escapes "^4.2.1" - chalk "^3.0.0" + chalk "^4.0.0" exit "^0.1.2" - graceful-fs "^4.2.3" - jest-changed-files "^25.2.3" - jest-config "^25.2.4" - jest-haste-map "^25.2.3" - jest-message-util "^25.2.4" - jest-regex-util "^25.2.1" - jest-resolve "^25.2.3" - jest-resolve-dependencies "^25.2.4" - jest-runner "^25.2.4" - jest-runtime "^25.2.4" - jest-snapshot "^25.2.4" - jest-util "^25.2.3" - jest-validate "^25.2.3" - jest-watcher "^25.2.4" + graceful-fs "^4.2.4" + jest-changed-files "^26.0.1" + jest-config "^26.0.1" + jest-haste-map "^26.0.1" + jest-message-util "^26.0.1" + jest-regex-util "^26.0.0" + jest-resolve "^26.0.1" + jest-resolve-dependencies "^26.0.1" + jest-runner "^26.0.1" + jest-runtime "^26.0.1" + jest-snapshot "^26.0.1" + jest-util "^26.0.1" + jest-validate "^26.0.1" + jest-watcher "^26.0.1" micromatch "^4.0.2" p-each-series "^2.1.0" - realpath-native "^2.0.0" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.2.4.tgz#74f4d8dd87b427434d0b822cde37bc0e78f3e28b" - integrity sha512-wA4xlhD19/gukkDpJ5HQsTle0pgnzI5qMFEjw267lpTDC8d9N7Ihqr5pI+l0p8Qn1SQhai+glSqxrGdzKy4jxw== +"@jest/environment@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.0.1.tgz#82f519bba71959be9b483675ee89de8c8f72a5c8" + integrity sha512-xBDxPe8/nx251u0VJ2dFAFz2H23Y98qdIaNwnMK6dFQr05jc+Ne/2np73lOAx+5mSBO/yuQldRrQOf6hP1h92g== dependencies: - "@jest/fake-timers" "^25.2.4" - "@jest/types" "^25.2.3" - jest-mock "^25.2.3" + "@jest/fake-timers" "^26.0.1" + "@jest/types" "^26.0.1" + jest-mock "^26.0.1" -"@jest/fake-timers@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.2.4.tgz#6821b6edde74fda2a42467ae92cc93095d4c9527" - integrity sha512-oC1TJiwfMcBttVN7Wz+VZnqEAgYTiEMu0QLOXpypR89nab0uCB31zm/QeBZddhSstn20qe3yqOXygp6OwvKT/Q== +"@jest/fake-timers@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.0.1.tgz#f7aeff13b9f387e9d0cac9a8de3bba538d19d796" + integrity sha512-Oj/kCBnTKhm7CR+OJSjZty6N1bRDr9pgiYQr4wY221azLz5PHi08x/U+9+QpceAYOWheauLP8MhtSVFrqXQfhg== dependencies: - "@jest/types" "^25.2.3" - jest-message-util "^25.2.4" - jest-mock "^25.2.3" - jest-util "^25.2.3" - lolex "^5.0.0" + "@jest/types" "^26.0.1" + "@sinonjs/fake-timers" "^6.0.1" + jest-message-util "^26.0.1" + jest-mock "^26.0.1" + jest-util "^26.0.1" -"@jest/reporters@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.2.4.tgz#aa01c20aab217150d3a6080d5c98ce0bf34b17ed" - integrity sha512-VHbLxM03jCc+bTLOluW/IqHR2G0Cl0iATwIQbuZtIUast8IXO4fD0oy4jpVGpG5b20S6REA8U3BaQoCW/CeVNQ== +"@jest/globals@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.0.1.tgz#3f67b508a7ce62b6e6efc536f3d18ec9deb19a9c" + integrity sha512-iuucxOYB7BRCvT+TYBzUqUNuxFX1hqaR6G6IcGgEqkJ5x4htNKo1r7jk1ji9Zj8ZMiMw0oB5NaA7k5Tx6MVssA== + dependencies: + "@jest/environment" "^26.0.1" + "@jest/types" "^26.0.1" + expect "^26.0.1" + +"@jest/reporters@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.0.1.tgz#14ae00e7a93e498cec35b0c00ab21c375d9b078f" + integrity sha512-NWWy9KwRtE1iyG/m7huiFVF9YsYv/e+mbflKRV84WDoJfBqUrNRyDbL/vFxQcYLl8IRqI4P3MgPn386x76Gf2g== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^25.2.3" - "@jest/test-result" "^25.2.4" - "@jest/transform" "^25.2.4" - "@jest/types" "^25.2.3" - chalk "^3.0.0" + "@jest/console" "^26.0.1" + "@jest/test-result" "^26.0.1" + "@jest/transform" "^26.0.1" + "@jest/types" "^26.0.1" + chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.2" + graceful-fs "^4.2.4" istanbul-lib-coverage "^3.0.0" istanbul-lib-instrument "^4.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.0" - jest-haste-map "^25.2.3" - jest-resolve "^25.2.3" - jest-util "^25.2.3" - jest-worker "^25.2.1" + istanbul-reports "^3.0.2" + jest-haste-map "^26.0.1" + jest-resolve "^26.0.1" + jest-util "^26.0.1" + jest-worker "^26.0.0" slash "^3.0.0" source-map "^0.6.0" - string-length "^3.1.0" + string-length "^4.0.1" terminal-link "^2.0.0" - v8-to-istanbul "^4.0.1" + v8-to-istanbul "^4.1.3" optionalDependencies: - node-notifier "^6.0.0" + node-notifier "^7.0.0" -"@jest/source-map@^25.2.1": - version "25.2.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.2.1.tgz#b62ecf8ae76170b08eff8859b56eb7576df34ab8" - integrity sha512-PgScGJm1U27+9Te/cxP4oUFqJ2PX6NhBL2a6unQ7yafCgs8k02c0LSyjSIx/ao0AwcAdCczfAPDf5lJ7zoB/7A== +"@jest/source-map@^26.0.0": + version "26.0.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.0.0.tgz#fd7706484a7d3faf7792ae29783933bbf48a4749" + integrity sha512-S2Z+Aj/7KOSU2TfW0dyzBze7xr95bkm5YXNUqqCek+HE0VbNNSNzrRwfIi5lf7wvzDTSS0/ib8XQ1krFNyYgbQ== dependencies: callsites "^3.0.0" - graceful-fs "^4.2.3" + graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.2.4.tgz#8fc9eac58e82eb2a82e4058e68c3814f98f59cf5" - integrity sha512-AI7eUy+q2lVhFnaibDFg68NGkrxVWZdD6KBr9Hm6EvN0oAe7GxpEwEavgPfNHQjU2mi6g+NsFn/6QPgTUwM1qg== +"@jest/test-result@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.0.1.tgz#1ffdc1ba4bc289919e54b9414b74c9c2f7b2b718" + integrity sha512-oKwHvOI73ICSYRPe8WwyYPTtiuOAkLSbY8/MfWF3qDEd/sa8EDyZzin3BaXTqufir/O/Gzea4E8Zl14XU4Mlyg== dependencies: - "@jest/console" "^25.2.3" - "@jest/transform" "^25.2.4" - "@jest/types" "^25.2.3" + "@jest/console" "^26.0.1" + "@jest/types" "^26.0.1" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.2.4.tgz#28364aeddec140c696324114f63570f3de536c87" - integrity sha512-TEZm/Rkd6YgskdpTJdYLBtu6Gc11tfWPuSpatq0duH77ekjU8dpqX2zkPdY/ayuHxztV5LTJoV5BLtI9mZfXew== +"@jest/test-sequencer@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.0.1.tgz#b0563424728f3fe9e75d1442b9ae4c11da73f090" + integrity sha512-ssga8XlwfP8YjbDcmVhwNlrmblddMfgUeAkWIXts1V22equp2GMIHxm7cyeD5Q/B0ZgKPK/tngt45sH99yLLGg== dependencies: - "@jest/test-result" "^25.2.4" - jest-haste-map "^25.2.3" - jest-runner "^25.2.4" - jest-runtime "^25.2.4" - -"@jest/transform@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.2.4.tgz#34336f37f13f62f7d1f5b93d5d150ba9eb3e11b9" - integrity sha512-6eRigvb+G6bs4kW5j1/y8wu4nCrmVuIe0epPBbiWaYlwawJ8yi1EIyK3d/btDqmBpN5GpN4YhR6iPPnDmkYdTA== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^25.2.3" - babel-plugin-istanbul "^6.0.0" - chalk "^3.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.3" - jest-haste-map "^25.2.3" - jest-regex-util "^25.2.1" - jest-util "^25.2.3" - micromatch "^4.0.2" - pirates "^4.0.1" - realpath-native "^2.0.0" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" + "@jest/test-result" "^26.0.1" + graceful-fs "^4.2.4" + jest-haste-map "^26.0.1" + jest-runner "^26.0.1" + jest-runtime "^26.0.1" -"@jest/transform@^25.5.1": - version "25.5.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.5.1.tgz#0469ddc17699dd2bf985db55fa0fb9309f5c2db3" - integrity sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg== +"@jest/transform@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.0.1.tgz#0e3ecbb34a11cd4b2080ed0a9c4856cf0ceb0639" + integrity sha512-pPRkVkAQ91drKGbzCfDOoHN838+FSbYaEAvBXvKuWeeRRUD8FjwXkqfUNUZL6Ke48aA/1cqq/Ni7kVMCoqagWA== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^25.5.0" + "@jest/types" "^26.0.1" babel-plugin-istanbul "^6.0.0" - chalk "^3.0.0" + chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.2.4" - jest-haste-map "^25.5.1" - jest-regex-util "^25.2.6" - jest-util "^25.5.0" + jest-haste-map "^26.0.1" + jest-regex-util "^26.0.0" + jest-util "^26.0.1" micromatch "^4.0.2" pirates "^4.0.1" - realpath-native "^2.0.0" slash "^3.0.0" source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.2.3.tgz#035c4fb94e2da472f359ff9a211915d59987f6b6" - integrity sha512-6oLQwO9mKif3Uph3RX5J1i3S7X7xtDHWBaaaoeKw8hOzV6YUd0qDcYcHZ6QXMHDIzSr7zzrEa51o2Ovlj6AtKQ== +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@jest/types@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" - integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== +"@jest/types@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.0.1.tgz#b78333fbd113fa7aec8d39de24f88de8686dac67" + integrity sha512-IbtjvqI9+eS1qFnOIEL7ggWmT+iK/U+Vde9cGWtYb/b6XgKb3X44ZAe/z9YZzoAAZ/E92m0DqrilF934IGNnQA== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^15.0.0" - chalk "^3.0.0" + chalk "^4.0.0" "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" @@ -1177,7 +1164,14 @@ dependencies: type-detect "4.0.8" -"@types/babel__core@^7.1.0", "@types/babel__core@^7.1.7": +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@types/babel__core@^7.1.7": version "7.1.7" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== @@ -1321,17 +1315,17 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.2.tgz#160d82623610db590a64e8ca81784e11117e5a54" integrity sha512-LB2R1Oyhpg8gu4SON/mfforE525+Hi/M1ineICEDftqNVTyFg1aRIeGuTvXAoWHc4nbrFncWtJgMmoyRvuGh7A== +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/prettier@^1.19.0": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" - integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== - -"@types/prettier@~2.0.0": +"@types/prettier@^2.0.0", "@types/prettier@~2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.0.tgz#dc85454b953178cc6043df5208b9e949b54a3bc4" integrity sha512-/rM+sWiuOZ5dvuVzV37sUuklsbg+JPOP8d+nNFlo2ZtfpzPiPvh1/gc8liWOLBqe+sR+ZM7guPaIcTt6UZTo7Q== @@ -1364,10 +1358,10 @@ resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== -"@types/tmp@~0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.1.0.tgz#19cf73a7bcf641965485119726397a096f0049bd" - integrity sha512-6IwZ9HzWbCq6XoQWhxLpDjuADodH/MKXRUIDFudvgjcVdjFknvmR+DNsoUeer4XPrEnrZs04Jj+kfV9pFsrhmA== +"@types/tmp@~0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.0.tgz#e3f52b4d7397eaa9193592ef3fdd44dc0af4298c" + integrity sha512-flgpHJjntpBAdJD43ShRosQvNC0ME97DCfGvZEDlAThQmnerRXrLbX6YgzRBQCZTthET9eAWFAMaYP0m0Y4HzQ== "@types/yargs-parser@*": version "15.0.0" @@ -1381,23 +1375,23 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@~2.26.0": - version "2.26.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz#04c96560c8981421e5a9caad8394192363cc423f" - integrity sha512-4yUnLv40bzfzsXcTAtZyTjbiGUXMrcIJcIMioI22tSOyAxpdXiZ4r7YQUU8Jj6XXrLz9d5aMHPQf5JFR7h27Nw== +"@typescript-eslint/eslint-plugin@~2.32.0": + version "2.32.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.32.0.tgz#5d5cc2e00b1d4a4b848cc68bfdd3aede1ef0ad16" + integrity sha512-nb1kSUa8cd22hGgxpGdVT6/iyP7IKyrnyZEGYo+tN8iyDdXvXa+nfsX03tJVeFfhbkwR/0CDk910zPbqSflAsg== dependencies: - "@typescript-eslint/experimental-utils" "2.26.0" + "@typescript-eslint/experimental-utils" "2.32.0" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.26.0": - version "2.26.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz#063390c404d9980767d76274df386c0aa675d91d" - integrity sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ== +"@typescript-eslint/experimental-utils@2.32.0", "@typescript-eslint/experimental-utils@~2.32.0": + version "2.32.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.32.0.tgz#bee7fbe1d21d13a273066d70abc82549d0b7943e" + integrity sha512-oDWuB2q5AXsQ/mLq2N4qtWiBASWXPf7KhqXgeGH4QsyVKx+km8F6Vfqd3bspJQyhyCqxcbLO/jKJuIV3DzHZ6A== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.26.0" + "@typescript-eslint/typescript-estree" "2.32.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" @@ -1411,43 +1405,20 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/experimental-utils@~2.29.0": - version "2.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.29.0.tgz#3cb8060de9265ba131625a96bbfec31ba6d4a0fe" - integrity sha512-H/6VJr6eWYstyqjWXBP2Nn1hQJyvJoFdDtsHxGiD+lEP7piGnGpb/ZQd+z1ZSB1F7dN+WsxUDh8+S4LwI+f3jw== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.29.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@~2.26.0": - version "2.26.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.26.0.tgz#385463615818b33acb72a25b39c03579df93d76f" - integrity sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ== +"@typescript-eslint/parser@~2.32.0": + version "2.32.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.32.0.tgz#a1ace8ab1af529580bfb6cc2cd55fd8d8b1e68ab" + integrity sha512-swRtH835fUfm2khchiOVNchU3gVNaZNj2pY92QSx4kXan+RzaGNrwIRaCyX8uqzmK0xNPzseaUYHP8CsmrsjFw== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.26.0" - "@typescript-eslint/typescript-estree" "2.26.0" + "@typescript-eslint/experimental-utils" "2.32.0" + "@typescript-eslint/typescript-estree" "2.32.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.26.0": - version "2.26.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz#d8132cf1ee8a72234f996519a47d8a9118b57d56" - integrity sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg== - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^6.3.0" - tsutils "^3.17.1" - -"@typescript-eslint/typescript-estree@2.29.0": - version "2.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.29.0.tgz#1be6612bb02fc37ac9f466521c1459a4744e8d3a" - integrity sha512-3YGbtnWy4az16Egy5Fj5CckkVlpIh0MADtAQza+jiMADRSKkjdpzZp/5WuvwK/Qib3Z0HtzrDFeWanS99dNhnA== +"@typescript-eslint/typescript-estree@2.30.0": + version "2.30.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz#1b8e848b55144270255ffbfe4c63291f8f766615" + integrity sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" @@ -1457,52 +1428,60 @@ semver "^6.3.0" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@2.30.0": - version "2.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz#1b8e848b55144270255ffbfe4c63291f8f766615" - integrity sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw== +"@typescript-eslint/typescript-estree@2.32.0": + version "2.32.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.32.0.tgz#0e4ae2e883557f94039b13ac0ecfcfbb09835b8d" + integrity sha512-hQpbWM/Y2iq6jB9FHYJBqa3h1R9IEGodOtajhb261cVHt9cz30AKjXM6WP7LxJdEPPlyJ9rPTZVgBUgZgiyPgw== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" glob "^7.1.6" is-glob "^4.0.1" lodash "^4.17.15" - semver "^6.3.0" + semver "^7.3.2" tsutils "^3.17.1" -abab@^2.0.0: +abab@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== -acorn-globals@^4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" + acorn "^7.1.1" + acorn-walk "^7.1.1" acorn-jsx@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== - -acorn@^6.0.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== +acorn-walk@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" + integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== acorn@^7.1.0: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== +acorn@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" + integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== + +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv@^6.10.0: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" @@ -1533,10 +1512,10 @@ ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== +ansi-colors@^3.2.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== ansi-escapes@^4.2.1: version "4.2.1" @@ -1545,15 +1524,12 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.5.2" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-escapes@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" ansi-regex@^4.1.0: version "4.1.0" @@ -1565,11 +1541,6 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1633,11 +1604,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= - array-includes@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" @@ -1681,6 +1647,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -1706,30 +1677,17 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== -babel-jest@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.2.4.tgz#b21b68d3af8f161c3e6e501e91f0dea8e652e344" - integrity sha512-+yDzlyJVWrqih9i2Cvjpt7COaN8vUwCsKGtxJLzg6I0xhxD54K8mvDUCliPKLufyzHh/c5C4MRj4Vk7VMjOjIg== +babel-jest@^26.0.1, babel-jest@~26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.0.1.tgz#450139ce4b6c17174b136425bda91885c397bc46" + integrity sha512-Z4GGmSNQ8pX3WS1O+6v3fo41YItJJZsVxG5gIQ+HuB/iuAQBJxMTHTwz292vuYws1LnHfwSRgoqI+nxdy/pcvw== dependencies: - "@jest/transform" "^25.2.4" - "@jest/types" "^25.2.3" - "@types/babel__core" "^7.1.0" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^25.2.1" - chalk "^3.0.0" - slash "^3.0.0" - -babel-jest@~25.5.1: - version "25.5.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.5.1.tgz#bc2e6101f849d6f6aec09720ffc7bc5332e62853" - integrity sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ== - dependencies: - "@jest/transform" "^25.5.1" - "@jest/types" "^25.5.0" + "@jest/transform" "^26.0.1" + "@jest/types" "^26.0.1" "@types/babel__core" "^7.1.7" babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^25.5.0" - chalk "^3.0.0" + babel-preset-jest "^26.0.0" + chalk "^4.0.0" graceful-fs "^4.2.4" slash "^3.0.0" @@ -1751,17 +1709,10 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.1.tgz#d0003a1f3d5caa281e1107fe03bbf16b799f9955" - integrity sha512-HysbCQfJhxLlyxDbKcB2ucGYV0LjqK4h6dBoI3RtFuOxTiTWK6XGZMsHb0tGh8iJdV4hC6Z2GCHzVvDeh9i0lQ== - dependencies: - "@types/babel__traverse" "^7.0.6" - -babel-plugin-jest-hoist@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz#129c80ba5c7fc75baf3a45b93e2e372d57ca2677" - integrity sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g== +babel-plugin-jest-hoist@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.0.0.tgz#fd1d35f95cf8849fc65cb01b5e58aedd710b34a8" + integrity sha512-+AuoehOrjt9irZL7DOt2+4ZaTM6dlu1s5TTS46JBa0/qem4dy7VNW3tMb96qeEqcIh20LD73TVNtmVEeymTG7w== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -1794,21 +1745,12 @@ babel-preset-current-node-syntax@^0.1.2: "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -babel-preset-jest@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.2.1.tgz#4ccd0e577f69aa11b71806edfe8b25a5c3ac93a2" - integrity sha512-zXHJBM5iR8oEO4cvdF83AQqqJf3tJrXy3x8nfu2Nlqvn4cneg4Ca8M7cQvC5S9BzDDy1O0tZ9iXru9J6E3ym+A== - dependencies: - "@babel/plugin-syntax-bigint" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^25.2.1" - -babel-preset-jest@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz#c1d7f191829487a907764c65307faa0e66590b49" - integrity sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw== +babel-preset-jest@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.0.0.tgz#1eac82f513ad36c4db2e9263d7c485c825b1faa6" + integrity sha512-9ce+DatAa31DpR4Uir8g4Ahxs5K4W4L8refzt+qHWQANb6LhGcAEfIFgLUwk67oya2cCUd6t4eUMtO/z64ocNw== dependencies: - babel-plugin-jest-hoist "^25.5.0" + babel-plugin-jest-hoist "^26.0.0" babel-preset-current-node-syntax "^0.1.2" balanced-match@^1.0.0: @@ -1884,13 +1826,6 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - browserslist@^4.11.1, browserslist@^4.8.5: version "4.12.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" @@ -1943,6 +1878,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" + integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== + caniuse-lite@^1.0.30001043: version "1.0.30001048" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz#4bb4f1bc2eb304e5e1154da80b93dee3f1cf447e" @@ -1960,17 +1900,6 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^1.0.0, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -1988,6 +1917,19 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -2027,7 +1969,12 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -cli-cursor@^2.0.0, cli-cursor@^2.1.0: +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= @@ -2054,13 +2001,13 @@ cli-spinners@^2.0.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.3.0.tgz#0632239a4b5aa4c958610142c34bb7a651fc8df5" integrity sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w== -cli-truncate@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" - integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: - slice-ansi "0.0.4" - string-width "^1.0.1" + slice-ansi "^3.0.0" + string-width "^4.2.0" cli-width@^2.0.0: version "2.2.0" @@ -2086,11 +2033,6 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - collect-v8-coverage@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz#150ee634ac3650b71d9c985eb7f608942334feb1" @@ -2140,7 +2082,12 @@ commander@^4.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -compare-versions@^3.5.1: +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +compare-versions@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== @@ -2225,7 +2172,7 @@ cross-spawn@~7.0.1: shebang-command "^2.0.0" which "^2.0.1" -cssom@^0.4.1: +cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== @@ -2235,10 +2182,10 @@ cssom@~0.3.6: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992" - integrity sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA== +cssstyle@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" @@ -2249,19 +2196,14 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - -date-fns@^1.27.2: - version "1.30.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" - integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" @@ -2282,6 +2224,11 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decimal.js@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" + integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -2353,16 +2300,16 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.1.tgz#fcfe8aa07dd9b0c648396a478dabca8e76c6ab27" - integrity sha512-foe7dXnGlSh3jR1ovJmdv+77VQj98eKCHHwJPbZ2eEf0fHwKbkZicpPxEch9smZ+n2dnF6QFwkOQdLq9hpeJUg== - diff-sequences@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== +diff-sequences@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.0.0.tgz#0760059a5c287637b842bd7085311db7060e88a6" + integrity sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg== + diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -2383,12 +2330,12 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== dependencies: - webidl-conversions "^4.0.2" + webidl-conversions "^5.0.0" ecc-jsbn@~0.1.1: version "0.1.2" @@ -2403,10 +2350,10 @@ electron-to-chromium@^1.3.413: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.426.tgz#d7301de9e40df83a40fe1f51b4463cfe170d1153" integrity sha512-sdQ7CXQbFflKY5CU63ra+kIYq9F7d1OqI33856qJZxTrwo0sLASdmoRl9lWpGrQDS9Nk/RFliQWd3PPDrZ+Meg== -elegant-spinner@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" - integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= +elegant-spinner@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-2.0.0.tgz#f236378985ecd16da75488d166be4b688fd5af94" + integrity sha512-5YRYHhvhYzV/FC4AiMdeSIg3jAYGq9xFvbhZMpPlJoBsfYgrw2DSCYeXfat6tYBu45PWiyRr3+flaCPPmviPaA== emoji-regex@^7.0.1: version "7.0.3" @@ -2425,6 +2372,13 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +enquirer@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.5.tgz#3ab2b838df0a9d8ab9e7dff235b0e8712ef92381" + integrity sha512-BNT1C08P9XD0vNg3J475yIUG+mVdp9T6towYFHUv897X0KoHBjB1shyrNmhmtHWKP17iSWgo7Gqh7BBuzLZMSA== + dependencies: + ansi-colors "^3.2.1" + error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -2479,12 +2433,17 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.11.1: +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^1.14.1: version "1.14.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== @@ -2496,10 +2455,10 @@ escodegen@^1.11.1: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@~6.10.1: - version "6.10.1" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz#129ef9ec575d5ddc0e269667bf09defcd898642a" - integrity sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ== +eslint-config-prettier@~6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" + integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== dependencies: get-stdin "^6.0.0" @@ -2542,17 +2501,17 @@ eslint-plugin-import@~2.20.2: read-pkg-up "^2.0.0" resolve "^1.12.0" -eslint-plugin-jest@~23.8.2: - version "23.8.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz#6f28b41c67ef635f803ebd9e168f6b73858eb8d4" - integrity sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg== +eslint-plugin-jest@~23.10.0: + version "23.10.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.10.0.tgz#4738c7ca9e6513da50f4e99d7b161c1f82fa8e8f" + integrity sha512-cHC//nesojSO1MLxVmFJR/bUaQQG7xvMHQD8YLbsQzevR41WKm8paKDUv2wMHlUy5XLZUmNcWuflOi4apS8D+Q== dependencies: "@typescript-eslint/experimental-utils" "^2.5.0" -eslint-plugin-prettier@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz#432e5a667666ab84ce72f945c72f77d996a5c9ba" - integrity sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA== +eslint-plugin-prettier@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz#ae116a0fc0e598fdae48743a4430903de5b4e6ca" + integrity sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ== dependencies: prettier-linter-helpers "^1.0.0" @@ -2687,10 +2646,10 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^3.2.0, execa@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" - integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== +execa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.1.tgz#988488781f1f0238cd156f7aaede11c3e853b4c1" + integrity sha512-SCjM/zlBdOK8Q5TIjOn6iEHZaPHFsMoTxXQ2nvUvtPnuohz3H2dIozSg+etNR98dGoYUp2ENSKLL/XaMmbxVgw== dependencies: cross-spawn "^7.0.0" get-stream "^5.0.0" @@ -2699,7 +2658,6 @@ execa@^3.2.0, execa@^3.4.0: merge-stream "^2.0.0" npm-run-path "^4.0.0" onetime "^5.1.0" - p-finally "^2.0.0" signal-exit "^3.0.2" strip-final-newline "^2.0.0" @@ -2721,17 +2679,17 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/expect/-/expect-25.2.4.tgz#b66e0777c861034ebc21730bb34e1839d5d46806" - integrity sha512-hfuPhPds4yOsZtIw4kwAg70r0hqGmpqekgA+VX7pf/3wZ6FY+xIOXZhNsPMMMsspYG/YIsbAiwqsdnD4Ht+bCA== +expect@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.0.1.tgz#18697b9611a7e2725e20ba3ceadda49bc9865421" + integrity sha512-QcCy4nygHeqmbw564YxNbHTJlXh47dVID2BUP52cZFpLU9zHViMFK6h07cC1wf7GYCTIigTdAXhVua8Yl1FkKg== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^26.0.1" ansi-styles "^4.0.0" - jest-get-type "^25.2.1" - jest-matcher-utils "^25.2.3" - jest-message-util "^25.2.4" - jest-regex-util "^25.2.1" + jest-get-type "^26.0.0" + jest-matcher-utils "^26.0.1" + jest-message-util "^26.0.1" + jest-regex-util "^26.0.0" extend-shallow@^2.0.1: version "2.0.1" @@ -2823,21 +2781,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -figures@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - figures@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" @@ -2845,6 +2788,13 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" @@ -3091,11 +3041,6 @@ graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -graceful-fs@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -3114,13 +3059,6 @@ har-validator@~5.1.3: ajv "^6.5.5" har-schema "^2.0.0" -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3184,12 +3122,12 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== dependencies: - whatwg-encoding "^1.0.1" + whatwg-encoding "^1.0.5" html-escaper@^2.0.0: version "2.0.2" @@ -3210,14 +3148,14 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -husky@~4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.3.tgz#3b18d2ee5febe99e27f2983500202daffbc3151e" - integrity sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ== +husky@~4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.5.tgz#2b4f7622673a71579f901d9885ed448394b5fa36" + integrity sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ== dependencies: - chalk "^3.0.0" + chalk "^4.0.0" ci-info "^2.0.0" - compare-versions "^3.5.1" + compare-versions "^3.6.0" cosmiconfig "^6.0.0" find-versions "^3.2.0" opencollective-postinstall "^2.0.2" @@ -3267,11 +3205,16 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^3.0.0, indent-string@^3.2.0: +indent-string@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -3430,13 +3373,6 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -3490,13 +3426,6 @@ is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== - dependencies: - symbol-observable "^1.1.0" - is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -3504,6 +3433,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-potential-custom-element-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" + integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -3623,65 +3557,65 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.1.tgz#1343217244ad637e0c3b18e7f6b746941a9b5e9a" - integrity sha512-Vm9xwCiQ8t2cNNnckyeAV0UdxKpcQUz4nMxsBvIu8n2kmPSiyb5uaF/8LpmKr+yqL/MdOXaX2Nmdo4Qyxium9Q== +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.2.3.tgz#ad19deef9e47ba37efb432d2c9a67dfd97cc78af" - integrity sha512-EFxy94dvvbqRB36ezIPLKJ4fDIC+jAdNs8i8uTwFpaXd6H3LVc3ova1lNS4ZPWk09OCR2vq5kSdSQgar7zMORg== +jest-changed-files@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.0.1.tgz#1334630c6a1ad75784120f39c3aa9278e59f349f" + integrity sha512-q8LP9Sint17HaE2LjxQXL+oYWW/WeeXMPE2+Op9X3mY8IEGFVc14xRxFjUuXUbcPAlDLhtWdIEt59GdQbn76Hw== dependencies: - "@jest/types" "^25.2.3" - execa "^3.2.0" + "@jest/types" "^26.0.1" + execa "^4.0.0" throat "^5.0.0" -jest-cli@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.2.4.tgz#021c2383904696597abc060dcb133c82ebd8bfcc" - integrity sha512-zeY2pRDWKj2LZudIncvvguwLMEdcnJqc2jJbwza1beqi80qqLvkPF/BjbFkK2sIV3r+mfTJS+7ITrvK6pCdRjg== +jest-cli@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.0.1.tgz#3a42399a4cbc96a519b99ad069a117d955570cac" + integrity sha512-pFLfSOBcbG9iOZWaMK4Een+tTxi/Wcm34geqZEqrst9cZDkTQ1LZ2CnBrTlHWuYAiTMFr0EQeK52ScyFU8wK+w== dependencies: - "@jest/core" "^25.2.4" - "@jest/test-result" "^25.2.4" - "@jest/types" "^25.2.3" - chalk "^3.0.0" + "@jest/core" "^26.0.1" + "@jest/test-result" "^26.0.1" + "@jest/types" "^26.0.1" + chalk "^4.0.0" exit "^0.1.2" + graceful-fs "^4.2.4" import-local "^3.0.2" is-ci "^2.0.0" - jest-config "^25.2.4" - jest-util "^25.2.3" - jest-validate "^25.2.3" + jest-config "^26.0.1" + jest-util "^26.0.1" + jest-validate "^26.0.1" prompts "^2.0.1" - realpath-native "^2.0.0" yargs "^15.3.1" -jest-config@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.2.4.tgz#f4f33238979f225683179c89d1e402893008975d" - integrity sha512-fxy3nIpwJqOUQJRVF/q+pNQb6dv5b9YufOeCbpPZJ/md1zXpiupbhfehpfODhnKOfqbzSiigtSLzlWWmbRxnqQ== +jest-config@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.0.1.tgz#096a3d4150afadf719d1fab00e9a6fb2d6d67507" + integrity sha512-9mWKx2L1LFgOXlDsC4YSeavnblN6A4CPfXFiobq+YYLaBMymA/SczN7xYTSmLaEYHZOcB98UdoN4m5uNt6tztg== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^25.2.4" - "@jest/types" "^25.2.3" - babel-jest "^25.2.4" - chalk "^3.0.0" + "@jest/test-sequencer" "^26.0.1" + "@jest/types" "^26.0.1" + babel-jest "^26.0.1" + chalk "^4.0.0" deepmerge "^4.2.2" glob "^7.1.1" - jest-environment-jsdom "^25.2.4" - jest-environment-node "^25.2.4" - jest-get-type "^25.2.1" - jest-jasmine2 "^25.2.4" - jest-regex-util "^25.2.1" - jest-resolve "^25.2.3" - jest-util "^25.2.3" - jest-validate "^25.2.3" + graceful-fs "^4.2.4" + jest-environment-jsdom "^26.0.1" + jest-environment-node "^26.0.1" + jest-get-type "^26.0.0" + jest-jasmine2 "^26.0.1" + jest-regex-util "^26.0.0" + jest-resolve "^26.0.1" + jest-util "^26.0.1" + jest-validate "^26.0.1" micromatch "^4.0.2" - pretty-format "^25.2.3" - realpath-native "^2.0.0" + pretty-format "^26.0.1" jest-diff@^25.2.1: version "25.5.0" @@ -3693,100 +3627,80 @@ jest-diff@^25.2.1: jest-get-type "^25.2.6" pretty-format "^25.5.0" -jest-diff@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.2.3.tgz#54d601a0a754ef26e808a8c8dbadd278c215aa3f" - integrity sha512-VtZ6LAQtaQpFsmEzps15dQc5ELbJxy4L2DOSo2Ev411TUEtnJPkAMD7JneVypeMJQ1y3hgxN9Ao13n15FAnavg== +jest-diff@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.0.1.tgz#c44ab3cdd5977d466de69c46929e0e57f89aa1de" + integrity sha512-odTcHyl5X+U+QsczJmOjWw5tPvww+y9Yim5xzqxVl/R1j4z71+fHW4g8qu1ugMmKdFdxw+AtQgs5mupPnzcIBQ== dependencies: - chalk "^3.0.0" - diff-sequences "^25.2.1" - jest-get-type "^25.2.1" - pretty-format "^25.2.3" + chalk "^4.0.0" + diff-sequences "^26.0.0" + jest-get-type "^26.0.0" + pretty-format "^26.0.1" -jest-docblock@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.2.3.tgz#ac45280c43d59e7139f9fbe5896c6e0320c01ebb" - integrity sha512-d3/tmjLLrH5fpRGmIm3oFa3vOaD/IjPxtXVOrfujpfJ9y1tCDB1x/tvunmdOVAyF03/xeMwburl6ITbiQT1mVA== +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== dependencies: detect-newline "^3.0.0" -jest-each@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.2.3.tgz#64067ba1508ebbd07e9b126c173ab371e8e6309d" - integrity sha512-RTlmCjsBDK2c9T5oO4MqccA3/5Y8BUtiEy7OOQik1iyCgdnNdHbI0pNEpyapZPBG0nlvZ4mIu7aY6zNUvLraAQ== - dependencies: - "@jest/types" "^25.2.3" - chalk "^3.0.0" - jest-get-type "^25.2.1" - jest-util "^25.2.3" - pretty-format "^25.2.3" - -jest-environment-jsdom@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.2.4.tgz#f2783541d0538b1bc43641703372cea6a2e83611" - integrity sha512-5dm+tNwrLmhELdjAwiQnVGf/U9iFMWdTL4/wyrMg2HU6RQnCiuxpWbIigLHUhuP1P2Ak0F4k3xhjrikboKyShA== - dependencies: - "@jest/environment" "^25.2.4" - "@jest/fake-timers" "^25.2.4" - "@jest/types" "^25.2.3" - jest-mock "^25.2.3" - jest-util "^25.2.3" - jsdom "^15.2.1" - -jest-environment-node@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.2.4.tgz#dc211dfb0d8b66dfc1965a8f846e72e54ff0c430" - integrity sha512-Jkc5Y8goyXPrLRHnrUlqC7P4o5zn2m4zw6qWoRJ59kxV1f2a5wK+TTGhrhCwnhW/Ckpdl/pm+LufdvhJkvJbiw== - dependencies: - "@jest/environment" "^25.2.4" - "@jest/fake-timers" "^25.2.4" - "@jest/types" "^25.2.3" - jest-mock "^25.2.3" - jest-util "^25.2.3" - semver "^6.3.0" - -jest-get-type@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.1.tgz#6c83de603c41b1627e6964da2f5454e6aa3c13a6" - integrity sha512-EYjTiqcDTCRJDcSNKbLTwn/LcDPEE7ITk8yRMNAOjEsN6yp+Uu+V1gx4djwnuj/DvWg0YGmqaBqPVGsPxlvE7w== +jest-each@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.0.1.tgz#633083061619302fc90dd8f58350f9d77d67be04" + integrity sha512-OTgJlwXCAR8NIWaXFL5DBbeS4QIYPuNASkzSwMCJO+ywo9BEa6TqkaSWsfR7VdbMLdgYJqSfQcIyjJCNwl5n4Q== + dependencies: + "@jest/types" "^26.0.1" + chalk "^4.0.0" + jest-get-type "^26.0.0" + jest-util "^26.0.1" + pretty-format "^26.0.1" + +jest-environment-jsdom@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.0.1.tgz#217690852e5bdd7c846a4e3b50c8ffd441dfd249" + integrity sha512-u88NJa3aptz2Xix2pFhihRBAatwZHWwSiRLBDBQE1cdJvDjPvv7ZGA0NQBxWwDDn7D0g1uHqxM8aGgfA9Bx49g== + dependencies: + "@jest/environment" "^26.0.1" + "@jest/fake-timers" "^26.0.1" + "@jest/types" "^26.0.1" + jest-mock "^26.0.1" + jest-util "^26.0.1" + jsdom "^16.2.2" + +jest-environment-node@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.0.1.tgz#584a9ff623124ff6eeb49e0131b5f7612b310b13" + integrity sha512-4FRBWcSn5yVo0KtNav7+5NH5Z/tEgDLp7VRQVS5tCouWORxj+nI+1tOLutM07Zb2Qi7ja+HEDoOUkjBSWZg/IQ== + dependencies: + "@jest/environment" "^26.0.1" + "@jest/fake-timers" "^26.0.1" + "@jest/types" "^26.0.1" + jest-mock "^26.0.1" + jest-util "^26.0.1" jest-get-type@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== -jest-haste-map@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.2.3.tgz#2649392b5af191f0167a27bfb62e5d96d7eaaade" - integrity sha512-pAP22OHtPr4qgZlJJFks2LLgoQUr4XtM1a+F5UaPIZNiCRnePA0hM3L7aiJ0gzwiNIYwMTfKRwG/S1L28J3A3A== - dependencies: - "@jest/types" "^25.2.3" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.3" - jest-serializer "^25.2.1" - jest-util "^25.2.3" - jest-worker "^25.2.1" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - which "^2.0.2" - optionalDependencies: - fsevents "^2.1.2" +jest-get-type@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.0.0.tgz#381e986a718998dbfafcd5ec05934be538db4039" + integrity sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg== -jest-haste-map@^25.5.1: - version "25.5.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.5.1.tgz#1df10f716c1d94e60a1ebf7798c9fb3da2620943" - integrity sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ== +jest-haste-map@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.0.1.tgz#40dcc03c43ac94d25b8618075804d09cd5d49de7" + integrity sha512-J9kBl/EdjmDsvyv7CiyKY5+DsTvVOScenprz/fGqfLg/pm1gdjbwwQ98nW0t+OIt+f+5nAVaElvn/6wP5KO7KA== dependencies: - "@jest/types" "^25.5.0" + "@jest/types" "^26.0.1" "@types/graceful-fs" "^4.1.2" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.4" - jest-serializer "^25.5.0" - jest-util "^25.5.0" - jest-worker "^25.5.0" + jest-serializer "^26.0.0" + jest-util "^26.0.1" + jest-worker "^26.0.0" micromatch "^4.0.2" sane "^4.0.3" walker "^1.0.7" @@ -3794,261 +3708,237 @@ jest-haste-map@^25.5.1: optionalDependencies: fsevents "^2.1.2" -jest-jasmine2@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.2.4.tgz#5f77de83e1027f0c7588137055a80da773872374" - integrity sha512-juoKrmNmLwaheNbAg71SuUF9ovwUZCFNTpKVhvCXWk+SSeORcIUMptKdPCoLXV3D16htzhTSKmNxnxSk4SrTjA== +jest-jasmine2@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.0.1.tgz#947c40ee816636ba23112af3206d6fa7b23c1c1c" + integrity sha512-ILaRyiWxiXOJ+RWTKupzQWwnPaeXPIoLS5uW41h18varJzd9/7I0QJGqg69fhTT1ev9JpSSo9QtalriUN0oqOg== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^25.2.4" - "@jest/source-map" "^25.2.1" - "@jest/test-result" "^25.2.4" - "@jest/types" "^25.2.3" - chalk "^3.0.0" + "@jest/environment" "^26.0.1" + "@jest/source-map" "^26.0.0" + "@jest/test-result" "^26.0.1" + "@jest/types" "^26.0.1" + chalk "^4.0.0" co "^4.6.0" - expect "^25.2.4" + expect "^26.0.1" is-generator-fn "^2.0.0" - jest-each "^25.2.3" - jest-matcher-utils "^25.2.3" - jest-message-util "^25.2.4" - jest-runtime "^25.2.4" - jest-snapshot "^25.2.4" - jest-util "^25.2.3" - pretty-format "^25.2.3" + jest-each "^26.0.1" + jest-matcher-utils "^26.0.1" + jest-message-util "^26.0.1" + jest-runtime "^26.0.1" + jest-snapshot "^26.0.1" + jest-util "^26.0.1" + pretty-format "^26.0.1" throat "^5.0.0" -jest-leak-detector@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.2.3.tgz#4cf39f137925e0061c04c24ca65cae36465f0238" - integrity sha512-yblCMPE7NJKl7778Cf/73yyFWAas5St0iiEBwq7RDyaz6Xd4WPFnPz2j7yDb/Qce71A1IbDoLADlcwD8zT74Aw== +jest-leak-detector@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.0.1.tgz#79b19ab3f41170e0a78eb8fa754a116d3447fb8c" + integrity sha512-93FR8tJhaYIWrWsbmVN1pQ9ZNlbgRpfvrnw5LmgLRX0ckOJ8ut/I35CL7awi2ecq6Ca4lL59bEK9hr7nqoHWPA== dependencies: - jest-get-type "^25.2.1" - pretty-format "^25.2.3" + jest-get-type "^26.0.0" + pretty-format "^26.0.1" -jest-matcher-utils@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.2.3.tgz#59285bd6d6c810debc9caa585ed985e46a3f28fd" - integrity sha512-ZmiXiwQRVM9MoKjGMP5YsGGk2Th5ncyRxfXKz5AKsmU8m43kgNZirckVzaP61MlSa9LKmXbevdYqVp1ZKAw2Rw== +jest-matcher-utils@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.0.1.tgz#12e1fc386fe4f14678f4cc8dbd5ba75a58092911" + integrity sha512-PUMlsLth0Azen8Q2WFTwnSkGh2JZ8FYuwijC8NR47vXKpsrKmA1wWvgcj1CquuVfcYiDEdj985u5Wmg7COEARw== dependencies: - chalk "^3.0.0" - jest-diff "^25.2.3" - jest-get-type "^25.2.1" - pretty-format "^25.2.3" + chalk "^4.0.0" + jest-diff "^26.0.1" + jest-get-type "^26.0.0" + pretty-format "^26.0.1" -jest-message-util@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.2.4.tgz#b1441b9c82f5c11fc661303cbf200a2f136a7762" - integrity sha512-9wWMH3Bf+GVTv0GcQLmH/FRr0x0toptKw9TA8U5YFLVXx7Tq9pvcNzTyJrcTJ+wLqNbMPPJlJNft4MnlcrtF5Q== +jest-message-util@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.0.1.tgz#07af1b42fc450b4cc8e90e4c9cef11b33ce9b0ac" + integrity sha512-CbK8uQREZ8umUfo8+zgIfEt+W7HAHjQCoRaNs4WxKGhAYBGwEyvxuK81FXa7VeB9pwDEXeeKOB2qcsNVCAvB7Q== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^25.2.4" - "@jest/types" "^25.2.3" + "@jest/types" "^26.0.1" "@types/stack-utils" "^1.0.1" - chalk "^3.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" micromatch "^4.0.2" slash "^3.0.0" - stack-utils "^1.0.1" + stack-utils "^2.0.2" -jest-mock@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.2.3.tgz#b37a581f59d61bd91db27a99bf7eb8b3e5e993d5" - integrity sha512-xlf+pyY0j47zoCs8zGGOGfWyxxLximE8YFOfEK8s4FruR8DtM/UjNj61um+iDuMAFEBDe1bhCXkqiKoCmWjJzg== +jest-mock@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.0.1.tgz#7fd1517ed4955397cf1620a771dc2d61fad8fd40" + integrity sha512-MpYTBqycuPYSY6xKJognV7Ja46/TeRbAZept987Zp+tuJvMN0YBWyyhG9mXyYQaU3SBI0TUlSaO5L3p49agw7Q== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^26.0.1" jest-pnp-resolver@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== -jest-regex-util@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.1.tgz#db64b0d15cd3642c93b7b9627801d7c518600584" - integrity sha512-wroFVJw62LdqTdkL508ZLV82FrJJWVJMIuYG7q4Uunl1WAPTf4ftPKrqqfec4SvOIlvRZUdEX2TFpWR356YG/w== - -jest-regex-util@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" - integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== -jest-resolve-dependencies@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.4.tgz#2d904400387d74a366dff54badb40a2b3210e733" - integrity sha512-qhUnK4PfNHzNdca7Ub1mbAqE0j5WNyMTwxBZZJjQlUrdqsiYho/QGK65FuBkZuSoYtKIIqriR9TpGrPEc3P5Gg== +jest-resolve-dependencies@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.0.1.tgz#607ba7ccc32151d185a477cff45bf33bce417f0b" + integrity sha512-9d5/RS/ft0vB/qy7jct/qAhzJsr6fRQJyGAFigK3XD4hf9kIbEH5gks4t4Z7kyMRhowU6HWm/o8ILqhaHdSqLw== dependencies: - "@jest/types" "^25.2.3" - jest-regex-util "^25.2.1" - jest-snapshot "^25.2.4" + "@jest/types" "^26.0.1" + jest-regex-util "^26.0.0" + jest-snapshot "^26.0.1" -jest-resolve@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.2.3.tgz#ababeaf2bb948cb6d2dea8453759116da0fb7842" - integrity sha512-1vZMsvM/DBH258PnpUNSXIgtzpYz+vCVCj9+fcy4akZl4oKbD+9hZSlfe9RIDpU0Fc28ozHQrmwX3EqFRRIHGg== +jest-resolve@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.0.1.tgz#21d1ee06f9ea270a343a8893051aeed940cde736" + integrity sha512-6jWxk0IKZkPIVTvq6s72RH735P8f9eCJW3IM5CX/SJFeKq1p2cZx0U49wf/SdMlhaB/anann5J2nCJj6HrbezQ== dependencies: - "@jest/types" "^25.2.3" - browser-resolve "^1.11.3" - chalk "^3.0.0" + "@jest/types" "^26.0.1" + chalk "^4.0.0" + graceful-fs "^4.2.4" jest-pnp-resolver "^1.2.1" - realpath-native "^2.0.0" - resolve "^1.15.1" - -jest-runner@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.2.4.tgz#d0daf7c56b4a83b6b675863d5cdcd502c960f9a1" - integrity sha512-5xaIfqqxck9Wg2CV4b9KmJtf/sWO7zWQx7O+34GCLGPzoPcVmB3mZtdrQI1/jS3Reqjru9ycLjgLHSf6XoxRqA== - dependencies: - "@jest/console" "^25.2.3" - "@jest/environment" "^25.2.4" - "@jest/test-result" "^25.2.4" - "@jest/types" "^25.2.3" - chalk "^3.0.0" + jest-util "^26.0.1" + read-pkg-up "^7.0.1" + resolve "^1.17.0" + slash "^3.0.0" + +jest-runner@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.0.1.tgz#ea03584b7ae4bacfb7e533d680a575a49ae35d50" + integrity sha512-CApm0g81b49Znm4cZekYQK67zY7kkB4umOlI2Dx5CwKAzdgw75EN+ozBHRvxBzwo1ZLYZ07TFxkaPm+1t4d8jA== + dependencies: + "@jest/console" "^26.0.1" + "@jest/environment" "^26.0.1" + "@jest/test-result" "^26.0.1" + "@jest/types" "^26.0.1" + chalk "^4.0.0" exit "^0.1.2" - graceful-fs "^4.2.3" - jest-config "^25.2.4" - jest-docblock "^25.2.3" - jest-haste-map "^25.2.3" - jest-jasmine2 "^25.2.4" - jest-leak-detector "^25.2.3" - jest-message-util "^25.2.4" - jest-resolve "^25.2.3" - jest-runtime "^25.2.4" - jest-util "^25.2.3" - jest-worker "^25.2.1" + graceful-fs "^4.2.4" + jest-config "^26.0.1" + jest-docblock "^26.0.0" + jest-haste-map "^26.0.1" + jest-jasmine2 "^26.0.1" + jest-leak-detector "^26.0.1" + jest-message-util "^26.0.1" + jest-resolve "^26.0.1" + jest-runtime "^26.0.1" + jest-util "^26.0.1" + jest-worker "^26.0.0" source-map-support "^0.5.6" throat "^5.0.0" -jest-runtime@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.2.4.tgz#c66a421e115944426b377a7fd331f6c0902cfa56" - integrity sha512-6ehOUizgIghN+aV5YSrDzTZ+zJ9omgEjJbTHj3Jqes5D52XHfhzT7cSfdREwkNjRytrR7mNwZ7pRauoyNLyJ8Q== - dependencies: - "@jest/console" "^25.2.3" - "@jest/environment" "^25.2.4" - "@jest/source-map" "^25.2.1" - "@jest/test-result" "^25.2.4" - "@jest/transform" "^25.2.4" - "@jest/types" "^25.2.3" +jest-runtime@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.0.1.tgz#a121a6321235987d294168e282d52b364d7d3f89" + integrity sha512-Ci2QhYFmANg5qaXWf78T2Pfo6GtmIBn2rRaLnklRyEucmPccmCKvS9JPljcmtVamsdMmkyNkVFb9pBTD6si9Lw== + dependencies: + "@jest/console" "^26.0.1" + "@jest/environment" "^26.0.1" + "@jest/fake-timers" "^26.0.1" + "@jest/globals" "^26.0.1" + "@jest/source-map" "^26.0.0" + "@jest/test-result" "^26.0.1" + "@jest/transform" "^26.0.1" + "@jest/types" "^26.0.1" "@types/yargs" "^15.0.0" - chalk "^3.0.0" + chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.3" - graceful-fs "^4.2.3" - jest-config "^25.2.4" - jest-haste-map "^25.2.3" - jest-message-util "^25.2.4" - jest-mock "^25.2.3" - jest-regex-util "^25.2.1" - jest-resolve "^25.2.3" - jest-snapshot "^25.2.4" - jest-util "^25.2.3" - jest-validate "^25.2.3" - realpath-native "^2.0.0" + graceful-fs "^4.2.4" + jest-config "^26.0.1" + jest-haste-map "^26.0.1" + jest-message-util "^26.0.1" + jest-mock "^26.0.1" + jest-regex-util "^26.0.0" + jest-resolve "^26.0.1" + jest-snapshot "^26.0.1" + jest-util "^26.0.1" + jest-validate "^26.0.1" slash "^3.0.0" strip-bom "^4.0.0" yargs "^15.3.1" -jest-serializer@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.2.1.tgz#51727a5fc04256f461abe0fa024a022ba165877a" - integrity sha512-fibDi7M5ffx6c/P66IkvR4FKkjG5ldePAK1WlbNoaU4GZmIAkS9Le/frAwRUFEX0KdnisSPWf+b1RC5jU7EYJQ== - -jest-serializer@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.5.0.tgz#a993f484e769b4ed54e70e0efdb74007f503072b" - integrity sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA== +jest-serializer@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.0.0.tgz#f6c521ddb976943b93e662c0d4d79245abec72a3" + integrity sha512-sQGXLdEGWFAE4wIJ2ZaIDb+ikETlUirEOBsLXdoBbeLhTHkZUJwgk3+M8eyFizhM6le43PDCCKPA1hzkSDo4cQ== dependencies: graceful-fs "^4.2.4" -jest-snapshot@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.2.4.tgz#08d4517579c864df4280bcc948ceea34327a4ded" - integrity sha512-nIwpW7FZCq5p0AE3Oyqyb6jL0ENJixXzJ5/CD/XRuOqp3gS5OM3O/k+NnTrniCXxPFV4ry6s9HNfiPQBi0wcoA== +jest-snapshot@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.0.1.tgz#1baa942bd83d47b837a84af7fcf5fd4a236da399" + integrity sha512-jxd+cF7+LL+a80qh6TAnTLUZHyQoWwEHSUFJjkw35u3Gx+BZUNuXhYvDqHXr62UQPnWo2P6fvQlLjsU93UKyxA== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^25.2.3" - "@types/prettier" "^1.19.0" - chalk "^3.0.0" - expect "^25.2.4" - jest-diff "^25.2.3" - jest-get-type "^25.2.1" - jest-matcher-utils "^25.2.3" - jest-message-util "^25.2.4" - jest-resolve "^25.2.3" + "@jest/types" "^26.0.1" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.0.1" + graceful-fs "^4.2.4" + jest-diff "^26.0.1" + jest-get-type "^26.0.0" + jest-matcher-utils "^26.0.1" + jest-message-util "^26.0.1" + jest-resolve "^26.0.1" make-dir "^3.0.0" natural-compare "^1.4.0" - pretty-format "^25.2.3" - semver "^6.3.0" + pretty-format "^26.0.1" + semver "^7.3.2" -jest-util@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.2.3.tgz#0abf95a1d6b96f2de5a3ecd61b36c40a182dc256" - integrity sha512-7tWiMICVSo9lNoObFtqLt9Ezt5exdFlWs5fLe1G4XLY2lEbZc814cw9t4YHScqBkWMfzth8ASHKlYBxiX2rdCw== +jest-util@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.0.1.tgz#72c4c51177b695fdd795ca072a6f94e3d7cef00a" + integrity sha512-byQ3n7ad1BO/WyFkYvlWQHTsomB6GIewBh8tlGtusiylAlaxQ1UpS0XYH0ngOyhZuHVLN79Qvl6/pMiDMSSG1g== dependencies: - "@jest/types" "^25.2.3" - chalk "^3.0.0" - is-ci "^2.0.0" - make-dir "^3.0.0" - -jest-util@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.5.0.tgz#31c63b5d6e901274d264a4fec849230aa3fa35b0" - integrity sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA== - dependencies: - "@jest/types" "^25.5.0" - chalk "^3.0.0" + "@jest/types" "^26.0.1" + chalk "^4.0.0" graceful-fs "^4.2.4" is-ci "^2.0.0" make-dir "^3.0.0" -jest-validate@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.2.3.tgz#ecb0f093cf8ae71d15075fb48439b6f78f1fcb5a" - integrity sha512-GObn91jzU0B0Bv4cusAwjP6vnWy78hJUM8MOSz7keRfnac/ZhQWIsUjvk01IfeXNTemCwgR57EtdjQMzFZGREg== +jest-validate@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.0.1.tgz#a62987e1da5b7f724130f904725e22f4e5b2e23c" + integrity sha512-u0xRc+rbmov/VqXnX3DlkxD74rHI/CfS5xaV2VpeaVySjbb1JioNVOyly5b56q2l9ZKe7bVG5qWmjfctkQb0bA== dependencies: - "@jest/types" "^25.2.3" - camelcase "^5.3.1" - chalk "^3.0.0" - jest-get-type "^25.2.1" + "@jest/types" "^26.0.1" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.0.0" leven "^3.1.0" - pretty-format "^25.2.3" + pretty-format "^26.0.1" -jest-watcher@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.2.4.tgz#dda85b914d470fa4145164a8f70bda4f208bafb6" - integrity sha512-p7g7s3zqcy69slVzQYcphyzkB2FBmJwMbv6k6KjI5mqd6KnUnQPfQVKuVj2l+34EeuxnbXqnrjtUFmxhcL87rg== +jest-watcher@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.0.1.tgz#5b5e3ebbdf10c240e22a98af66d645631afda770" + integrity sha512-pdZPydsS8475f89kGswaNsN3rhP6lnC3/QDCppP7bg1L9JQz7oU9Mb/5xPETk1RHDCWeqmVC47M4K5RR7ejxFw== dependencies: - "@jest/test-result" "^25.2.4" - "@jest/types" "^25.2.3" + "@jest/test-result" "^26.0.1" + "@jest/types" "^26.0.1" ansi-escapes "^4.2.1" - chalk "^3.0.0" - jest-util "^25.2.3" - string-length "^3.1.0" - -jest-worker@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.1.tgz#209617015c768652646aa33a7828cc2ab472a18a" - integrity sha512-IHnpekk8H/hCUbBlfeaPZzU6v75bqwJp3n4dUrQuQOAgOneI4tx3jV2o8pvlXnDfcRsfkFIUD//HWXpCmR+evQ== - dependencies: - merge-stream "^2.0.0" - supports-color "^7.0.0" + chalk "^4.0.0" + jest-util "^26.0.1" + string-length "^4.0.1" -jest-worker@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" - integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== +jest-worker@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.0.0.tgz#4920c7714f0a96c6412464718d0c58a3df3fb066" + integrity sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" -jest@~25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest/-/jest-25.2.4.tgz#d10941948a2b57eb7accc2e7ae78af4a0e11b40a" - integrity sha512-Lu4LXxf4+durzN/IFilcAoQSisOwgHIXgl9vffopePpSSwFqfj1Pj4y+k3nL8oTbnvjxgDIsEcepy6he4bWqnQ== +jest@~26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.0.1.tgz#5c51a2e58dff7525b65f169721767173bf832694" + integrity sha512-29Q54kn5Bm7ZGKIuH2JRmnKl85YRigp0o0asTc6Sb6l2ch1DCXIeZTLLFy9ultJvhkTqbswF5DEx4+RlkmCxWg== dependencies: - "@jest/core" "^25.2.4" + "@jest/core" "^26.0.1" import-local "^3.0.2" - jest-cli "^25.2.4" + jest-cli "^26.0.1" "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -4068,36 +3958,36 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^15.2.1: - version "15.2.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" - integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== - dependencies: - abab "^2.0.0" - acorn "^7.1.0" - acorn-globals "^4.3.2" - array-equal "^1.0.0" - cssom "^0.4.1" - cssstyle "^2.0.0" - data-urls "^1.1.0" - domexception "^1.0.1" - escodegen "^1.11.1" - html-encoding-sniffer "^1.0.2" +jsdom@^16.2.2: + version "16.2.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.2.2.tgz#76f2f7541646beb46a938f5dc476b88705bedf2b" + integrity sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg== + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" nwsapi "^2.2.0" - parse5 "5.1.0" - pn "^1.1.0" - request "^2.88.0" - request-promise-native "^1.0.7" - saxes "^3.1.9" - symbol-tree "^3.2.2" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" tough-cookie "^3.0.1" - w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.1.2" - webidl-conversions "^4.0.2" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.0.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" - whatwg-url "^7.0.0" - ws "^7.0.0" + whatwg-url "^8.0.0" + ws "^7.2.3" xml-name-validator "^3.0.0" jsesc@^2.5.1: @@ -4223,18 +4113,18 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -lint-staged@~10.1.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.1.1.tgz#1c8569b66d684e6e3553cd760c03053f41fca152" - integrity sha512-wAeu/ePaBAOfwM2+cVbgPWDtn17B0Sxiv0NvNEqDAIvB8Yhvl60vafKFiK4grcYn87K1iK+a0zVoETvKbdT9/Q== +lint-staged@~10.2.2: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.2.tgz#901403c120eb5d9443a0358b55038b04c8a7db9b" + integrity sha512-78kNqNdDeKrnqWsexAmkOU3Z5wi+1CsQmUmfCuYgMTE8E4rAIX8RHW7xgxwAZ+LAayb7Cca4uYX4P3LlevzjVg== dependencies: - chalk "^3.0.0" - commander "^4.0.1" + chalk "^4.0.0" + commander "^5.0.0" cosmiconfig "^6.0.0" debug "^4.1.1" dedent "^0.7.0" - execa "^3.4.0" - listr "^0.14.3" + execa "^4.0.0" + listr2 "1.3.8" log-symbols "^3.0.0" micromatch "^4.0.2" normalize-path "^3.0.0" @@ -4242,49 +4132,25 @@ lint-staged@~10.1.1: string-argv "0.3.1" stringify-object "^3.3.0" -listr-silent-renderer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= - -listr-update-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" - integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^2.3.0" - strip-ansi "^3.0.1" - -listr-verbose-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" - integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== - dependencies: - chalk "^2.4.1" - cli-cursor "^2.1.0" - date-fns "^1.27.2" - figures "^2.0.0" - -listr@^0.14.3: - version "0.14.3" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" - integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== +listr2@1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-1.3.8.tgz#30924d79de1e936d8c40af54b6465cb814a9c828" + integrity sha512-iRDRVTgSDz44tBeBBg/35TQz4W+EZBWsDUq7hPpqeUHm7yLPNll0rkwW3lIX9cPAK7l+x95mGWLpxjqxftNfZA== dependencies: "@samverschueren/stream-to-observable" "^0.3.0" - is-observable "^1.1.0" - is-promise "^2.1.0" - is-stream "^1.1.0" - listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.5.0" - listr-verbose-renderer "^0.5.0" - p-map "^2.0.0" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-truncate "^2.1.0" + elegant-spinner "^2.0.0" + enquirer "^2.3.4" + figures "^3.2.0" + indent-string "^4.0.0" + log-update "^4.0.0" + p-map "^4.0.0" + pad "^3.2.0" rxjs "^6.3.3" + through "^2.3.8" + uuid "^7.0.2" load-json-file@^2.0.0: version "2.0.0" @@ -4344,13 +4210,6 @@ lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= - dependencies: - chalk "^1.0.0" - log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -4365,21 +4224,15 @@ log-symbols@^3.0.0: dependencies: chalk "^2.4.2" -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= - dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" - -lolex@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" - integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: - "@sinonjs/commons" "^1.7.0" + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" loose-envify@^1.0.0: version "1.4.0" @@ -4579,16 +4432,17 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-notifier@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12" - integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw== +node-notifier@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-7.0.0.tgz#513bc42f2aa3a49fce1980a7ff375957c71f718a" + integrity sha512-y8ThJESxsHcak81PGpzWwQKxzk+5YtP3IxR8AYdpXQ1IB6FmcVzFdZXrkPin49F/DKUCfeeiziB8ptY9npzGuA== dependencies: growly "^1.3.0" is-wsl "^2.1.1" - semver "^6.3.0" + semver "^7.2.1" shellwords "^0.1.1" - which "^1.3.1" + uuid "^7.0.3" + which "^2.0.2" node-releases@^1.1.53: version "1.1.53" @@ -4605,6 +4459,16 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -4631,11 +4495,6 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" @@ -4646,7 +4505,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -4774,11 +4633,6 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-finally@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" - integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -4821,10 +4675,12 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.0.0.tgz#be18c5a5adeb8e156460651421aceca56c213a50" - integrity sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w== +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" p-try@^1.0.0: version "1.0.0" @@ -4836,6 +4692,13 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== +pad@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/pad/-/pad-3.2.0.tgz#be7a1d1cb6757049b4ad5b70e71977158fea95d1" + integrity sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg== + dependencies: + wcwidth "^1.0.1" + parent-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.0.tgz#df250bdc5391f4a085fb589dad761f5ad6b865b5" @@ -4868,10 +4731,10 @@ parse-json@^5.0.0: json-parse-better-errors "^1.0.1" lines-and-columns "^1.1.6" -parse5@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== +parse5@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== pascalcase@^0.1.1: version "0.1.1" @@ -5004,11 +4867,6 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -5026,10 +4884,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.2.tgz#1ba8f3eb92231e769b7fcd7cb73ae1b6b74ade08" - integrity sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg== +prettier@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" + integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== pretty-format@^25.2.1, pretty-format@^25.5.0: version "25.5.0" @@ -5041,12 +4899,12 @@ pretty-format@^25.2.1, pretty-format@^25.5.0: ansi-styles "^4.0.0" react-is "^16.12.0" -pretty-format@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.2.3.tgz#ba6e9603a0d80fa2e470b1fed55de1f9bfd81421" - integrity sha512-IP4+5UOAVGoyqC/DiomOeHBUKN6q00gfyT2qpAsRH64tgOKB2yF7FHJXC18OCiU0/YFierACup/zdCOWw0F/0w== +pretty-format@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.0.1.tgz#a4fe54fe428ad2fd3413ca6bbd1ec8c2e277e197" + integrity sha512-SWxz6MbupT3ZSlL0Po4WF/KujhQaVehijR2blyRDCzk9e45EaYMVhMBn49fnRuHxtkSpXTes1GxNpVmH86Bxfw== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^26.0.1" ansi-regex "^5.0.0" ansi-styles "^4.0.0" react-is "^16.12.0" @@ -5118,6 +4976,15 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -5136,6 +5003,16 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + readable-stream@^2.0.2: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -5158,11 +5035,6 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -realpath-native@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" - integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== - regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -5252,7 +5124,7 @@ request-promise-core@1.1.3: dependencies: lodash "^4.17.15" -request-promise-native@^1.0.7: +request-promise-native@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== @@ -5261,7 +5133,7 @@ request-promise-native@^1.0.7: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.88.0: +request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -5324,25 +5196,20 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= +resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" -resolve@^1.12.0, resolve@^1.15.1, resolve@^1.3.2: +resolve@^1.12.0, resolve@^1.3.2: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== dependencies: path-parse "^1.0.6" -resolve@^1.13.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - resolve@^1.5.0: version "1.9.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" @@ -5378,13 +5245,6 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^3.0.0, rimraf@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -5455,12 +5315,12 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -saxes@^3.1.9: - version "3.1.11" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" - integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== +saxes@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: - xmlchars "^2.1.1" + xmlchars "^2.2.0" semver-compare@^1.0.0: version "1.0.0" @@ -5492,6 +5352,11 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.2.1, semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -5561,11 +5426,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= - slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -5575,6 +5435,24 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -5697,10 +5575,12 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== +stack-utils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" + integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg== + dependencies: + escape-string-regexp "^2.0.0" static-extend@^0.1.1: version "0.1.2" @@ -5720,30 +5600,13 @@ string-argv@0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -string-length@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" - integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== - dependencies: - astral-regex "^1.0.0" - strip-ansi "^5.2.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== +string-length@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" + integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + char-regex "^1.0.2" + strip-ansi "^6.0.0" string-width@^3.0.0: version "3.1.0" @@ -5822,20 +5685,6 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -5880,11 +5729,6 @@ strip-json-comments@^3.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -5907,12 +5751,7 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" -symbol-observable@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - -symbol-tree@^3.2.2: +symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== @@ -5968,7 +5807,7 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -through@^2.3.6: +through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -5980,12 +5819,12 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== dependencies: - rimraf "^2.6.3" + rimraf "^3.0.0" tmpl@1.0.x: version "1.0.4" @@ -6046,12 +5885,12 @@ tough-cookie@^3.0.1: psl "^1.1.28" punycode "^2.1.1" -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== dependencies: - punycode "^2.1.0" + punycode "^2.1.1" tsconfig@~7.0.0: version "7.0.0" @@ -6104,11 +5943,21 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + type-fest@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -6199,15 +6048,20 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^7.0.2, uuid@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + v8-compile-cache@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== -v8-to-istanbul@^4.0.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz#22fe35709a64955f49a08a7c7c959f6520ad6f20" - integrity sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng== +v8-to-istanbul@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6" + integrity sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -6230,20 +6084,18 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -w3c-hr-time@^1.0.1: +w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" -w3c-xmlserializer@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" - integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== dependencies: - domexception "^1.0.1" - webidl-conversions "^4.0.2" xml-name-validator "^3.0.0" walker@^1.0.7, walker@~1.0.5: @@ -6260,31 +6112,36 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: +webidl-conversions@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" -whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: +whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== +whatwg-url@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.1.0.tgz#c628acdcf45b82274ce7281ee31dd3c839791771" + integrity sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw== dependencies: lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" + tr46 "^2.0.2" + webidl-conversions "^5.0.0" which-module@^2.0.0: version "2.0.0" @@ -6296,7 +6153,7 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@^1.2.9, which@^1.3.1: +which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -6322,14 +6179,6 @@ word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -6361,17 +6210,17 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.0.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" - integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== +ws@^7.2.3: + version "7.3.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" + integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xmlchars@^2.1.1: +xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== From 9adef4a34b024e82b8ebb8d0c448a03de817dd94 Mon Sep 17 00:00:00 2001 From: infctr Date: Wed, 13 May 2020 12:46:26 +0300 Subject: [PATCH 12/26] Typescript strict true --- src/utils/ast.ts | 34 ++++++++++----------- src/utils/compare.ts | 72 +++++++++++++++++++++++++++----------------- src/utils/plugin.ts | 32 +++++++++----------- tsconfig.json | 6 ++-- 4 files changed, 79 insertions(+), 65 deletions(-) diff --git a/src/utils/ast.ts b/src/utils/ast.ts index 988be08..a6c835a 100644 --- a/src/utils/ast.ts +++ b/src/utils/ast.ts @@ -32,7 +32,7 @@ function getProperty(node: TSESTree.Node) { }; } - return null; + return undefined; case AST_NODE_TYPES.TSPropertySignature: case AST_NODE_TYPES.TSMethodSignature: @@ -42,7 +42,7 @@ function getProperty(node: TSESTree.Node) { return node.id; default: - return null; + return undefined; } } @@ -52,37 +52,37 @@ function getProperty(node: TSESTree.Node) { * - If the property's key is an `Identifier` node, this returns the key's name * whether it's a computed property or not. * - If the property has a static name, this returns the static name. - * - Otherwise, this returns null. + * - Otherwise, this returns undefined. * * a.b // => "b" * a["b"] // => "b" * a['b'] // => "b" * a[`b`] // => "b" * a[100] // => "100" - * a[b] // => null - * a["a" + "b"] // => null - * a[tag`b`] // => null - * a[`${b}`] // => null + * a[b] // => undefined + * a["a" + "b"] // => undefined + * a[tag`b`] // => undefined + * a[`${b}`] // => undefined * * let a = {b: 1} // => "b" * let a = {["b"]: 1} // => "b" * let a = {['b']: 1} // => "b" * let a = {[`b`]: 1} // => "b" * let a = {[100]: 1} // => "100" - * let a = {[b]: 1} // => null - * let a = {["a" + "b"]: 1} // => null - * let a = {[tag`b`]: 1} // => null - * let a = {[`${b}`]: 1} // => null + * let a = {[b]: 1} // => undefined + * let a = {["a" + "b"]: 1} // => undefined + * let a = {[tag`b`]: 1} // => undefined + * let a = {[`${b}`]: 1} // => undefined */ -export function getPropertyName(node: TSESTree.Node): string | null { +export function getPropertyName(node: TSESTree.Node): string | undefined { if (!node.type) { - return null; + return undefined; } const property = getProperty(node); if (!property) { - return null; + return undefined; } switch (property.type) { @@ -92,14 +92,14 @@ export function getPropertyName(node: TSESTree.Node): string | null { case AST_NODE_TYPES.TemplateLiteral: return property.expressions.length === 0 && property.quasis.length === 1 ? property.quasis[0].value.cooked - : null; + : undefined; case AST_NODE_TYPES.Identifier: return (node as TSESTree.Node & { computed?: boolean }).computed - ? null + ? undefined : property.name; default: - return null; + return undefined; } } diff --git a/src/utils/compare.ts b/src/utils/compare.ts index eb84105..8dc469a 100644 --- a/src/utils/compare.ts +++ b/src/utils/compare.ts @@ -32,35 +32,51 @@ function weightedCompare( return compareFn(a, b) - getWeight(a) + getWeight(b); } +const ascending = (a: string, b: string) => { + return weightedCompare(a, b, charCompare); +}; + +const ascendingInsensitive = (a: string, b: string) => { + return weightedCompare(a.toLowerCase(), b.toLowerCase(), charCompare); +}; + +const ascendingNatural = (a: string, b: string) => { + return weightedCompare(a, b, naturalCompare); +}; + +const ascendingInsensitiveNatural = (a: string, b: string) => { + return weightedCompare(a.toLowerCase(), b.toLowerCase(), naturalCompare); +}; + /** * Functions which check that the given 2 names are in specific order. - * - * Postfix `I` is meant insensitive. - * Postfix `N` is meant natural. */ -export const compareFunctions = { - asc(a: string, b: string) { - return weightedCompare(a, b, charCompare); - }, - ascI(a: string, b: string) { - return weightedCompare(a.toLowerCase(), b.toLowerCase(), charCompare); - }, - ascN(a: string, b: string) { - return weightedCompare(a, b, naturalCompare); - }, - ascIN(a: string, b: string) { - return weightedCompare(a.toLowerCase(), b.toLowerCase(), naturalCompare); - }, - desc(a: string, b: string) { - return compareFunctions.asc(b, a); - }, - descI(a: string, b: string) { - return compareFunctions.ascI(b, a); - }, - descN(a: string, b: string) { - return compareFunctions.ascN(b, a); - }, - descIN(a: string, b: string) { - return compareFunctions.ascIN(b, a); - }, +export const compareFn = ( + isAscending: boolean, + isInsensitive: boolean, + isNatural: boolean, +) => (...args: [string?, string?]) => { + if (args.filter(Boolean).length !== 2) { + return 0; + } + + const input = (isAscending ? args : args.reverse()) as [string, string]; + + if (isInsensitive && isNatural) { + return ascendingInsensitiveNatural(...input); + } + + if (!isInsensitive && isNatural) { + return ascendingNatural(...input); + } + + if (isInsensitive && !isNatural) { + return ascendingInsensitive(...input); + } + + if (!isInsensitive && !isNatural) { + return ascending(...input); + } + + return 0; }; diff --git a/src/utils/plugin.ts b/src/utils/plugin.ts index 3f21abb..c48f96e 100644 --- a/src/utils/plugin.ts +++ b/src/utils/plugin.ts @@ -9,7 +9,7 @@ import assert from 'assert'; import { RuleOptions, SortingOrder } from 'common/options'; import { getPropertyName } from './ast'; -import { compareFunctions } from './compare'; +import { compareFn } from './compare'; type TSType = TSESTree.TypeElement | TSESTree.TSEnumMember; @@ -26,7 +26,7 @@ function createNodeSwapper(context: UtilRuleContext) { const prevSibling = sourceCode.getTokenBefore(node); const end = node.range[0]; const start = - prevSibling.loc.start.line === node.loc.start.line + prevSibling && prevSibling.loc.start.line === node.loc.start.line ? prevSibling.range[1] + 1 : node.range[0] - node.loc.start.column; @@ -84,8 +84,8 @@ function createNodeSwapper(context: UtilRuleContext) { const comments = sourceCode.getCommentsBefore(node); const nextSibling = sourceCode.getTokenAfter(node); const isLastReplacingLast = - nodePositions.get(node).final === nodePositions.size - 1 && - nodePositions.get(node).final === nodePositions.get(otherNode).initial; + nodePositions.get(node)?.final === nodePositions.size - 1 && + nodePositions.get(node)?.final === nodePositions.get(otherNode)?.initial; let text = [ comments.length ? getIndentText(node) : '', @@ -142,19 +142,17 @@ export function createReporter( // Parse options. const order = context.options[0] || SortingOrder.Ascending; const options = context.options[1]; - const insensitive = (options && options.caseSensitive) === false; - const natural = Boolean(options && options.natural); - const computedOrder = [order, insensitive && 'I', natural && 'N'] - .filter(Boolean) - .join(''); + const isAscending = order === SortingOrder.Ascending; + const isInsensitive = (options && options.caseSensitive) === false; + const isNatural = Boolean(options && options.natural); - const compareFn = compareFunctions[computedOrder]; + const compare = compareFn(isAscending, isInsensitive, isNatural); const swapNodes = createNodeSwapper(context); return (body: TSType[]) => { - const sortedBody = [...body].sort((a, b) => { - return compareFn(getPropertyName(a), getPropertyName(b)); - }); + const sortedBody = [...body].sort((a, b) => + compare(getPropertyName(a), getPropertyName(b)), + ); const nodePositions = new Map( body.map(n => [n, { initial: body.indexOf(n), final: sortedBody.indexOf(n) }]), @@ -166,7 +164,7 @@ export function createReporter( const prevNodeName = getPropertyName(prevNode); const currentNodeName = getPropertyName(currentNode); - if (compareFn(prevNodeName, currentNodeName) > 0) { + if (compare(prevNodeName, currentNodeName) > 0) { const targetPosition = sortedBody.indexOf(currentNode); const replaceNode = body[targetPosition]; const { loc, messageId } = createReportObject(currentNode); @@ -186,8 +184,8 @@ export function createReporter( thisName: currentNodeName, prevName: prevNodeName, order, - insensitive: insensitive ? 'insensitive ' : '', - natural: natural ? 'natural ' : '', + insensitive: isInsensitive ? 'insensitive ' : '', + natural: isNatural ? 'natural ' : '', }, fix: fixer => { @@ -195,7 +193,7 @@ export function createReporter( return swapNodes(fixer, nodePositions, currentNode, replaceNode); } - return undefined; + return null; }, }); } diff --git a/tsconfig.json b/tsconfig.json index bdf1139..d8181a4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,9 +8,9 @@ "allowJs": true /* Allow javascript files to be compiled. */, "checkJs": false /* Report errors in .js files. */, // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - // "declaration": true, /* Generates corresponding '.d.ts' file. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ + "sourceMap": true /* Generates corresponding '.map' file. */, // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "build" /* Redirect output structure to the directory. */, // "rootDir": "src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, @@ -23,7 +23,7 @@ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ - "strict": false /* Enable all strict type-checking options. */, + "strict": true /* Enable all strict type-checking options. */, // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ From 2e2ccdc9d1af6e3a625c443ca4993c4c07198f0b Mon Sep 17 00:00:00 2001 From: infctr Date: Wed, 13 May 2020 14:41:03 +0300 Subject: [PATCH 13/26] Bump typescript --- package.json | 8 +-- yarn.lock | 145 +++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 140 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 306e568..b2015d6 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,8 @@ "format": "prettier --write src/**/*.{js,ts} tests/**/*.{js,ts}", "test": "yarn jest", "test-compiled": "USE_COMPILED=1 yarn test", - "test-coverage": "yarn test-compiled --coverage --watchAll=false --coverageReporters=lcov,text-summary", - "verify": "yarn build && yarn lint && yarn build-tests && yarn test-compiled && rimraf build" + "type-check": "tsc --noEmit --project ./tsconfig.build.json", + "verify": "yarn type-check && yarn lint && yarn build && yarn build-tests && yarn test-compiled && rimraf build" }, "dependencies": { "natural-compare-lite": "~1.4.0" @@ -53,7 +53,7 @@ "eslint-config-prettier": "~6.11.0", "eslint-plugin-eslint-plugin": "~2.2.1", "eslint-plugin-import": "~2.20.2", - "eslint-plugin-jest": "~23.10.0", + "eslint-plugin-jest": "~23.11.0", "eslint-plugin-prettier": "~3.1.3", "husky": "~4.2.5", "jest": "~26.0.1", @@ -63,7 +63,7 @@ "rimraf": "~3.0.2", "tmp": "~0.2.1", "tsconfig": "~7.0.0", - "typescript": "~3.8.3" + "typescript": "~3.9.2" }, "peerDependencies": { "@typescript-eslint/parser": "^1 || ^2", diff --git a/yarn.lock b/yarn.lock index 892df80..d2f0e31 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1657,6 +1657,13 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1771,6 +1778,11 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +basic-auth@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" + integrity sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ= + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -2070,6 +2082,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -2132,6 +2149,11 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +corser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" + integrity sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c= + cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -2212,6 +2234,13 @@ debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" +debug@^3.0.0, debug@^3.1.1: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -2345,6 +2374,16 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ecstatic@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-3.3.2.tgz#6d1dd49814d00594682c652adb66076a69d46c48" + integrity sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog== + dependencies: + he "^1.1.1" + mime "^1.6.0" + minimist "^1.1.0" + url-join "^2.0.5" + electron-to-chromium@^1.3.413: version "1.3.426" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.426.tgz#d7301de9e40df83a40fe1f51b4463cfe170d1153" @@ -2501,10 +2540,10 @@ eslint-plugin-import@~2.20.2: read-pkg-up "^2.0.0" resolve "^1.12.0" -eslint-plugin-jest@~23.10.0: - version "23.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.10.0.tgz#4738c7ca9e6513da50f4e99d7b161c1f82fa8e8f" - integrity sha512-cHC//nesojSO1MLxVmFJR/bUaQQG7xvMHQD8YLbsQzevR41WKm8paKDUv2wMHlUy5XLZUmNcWuflOi4apS8D+Q== +eslint-plugin-jest@~23.11.0: + version "23.11.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.11.0.tgz#6e01d83ea74c1eefd60811655bbc288bd8ab2e7d" + integrity sha512-qedvh6mcMgoLFHjITtG40yKOCu5Fa1GMYesDOclU30ZvtVkf+DaH0fnCn1ysOX/QMdk2SGhQvxvYLowcLaM0GA== dependencies: "@typescript-eslint/experimental-utils" "^2.5.0" @@ -2628,6 +2667,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= +eventemitter3@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + exec-sh@^0.3.2: version "0.3.4" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" @@ -2875,6 +2919,13 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== +follow-redirects@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb" + integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA== + dependencies: + debug "^3.0.0" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -3117,6 +3168,11 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" +he@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + hosted-git-info@^2.1.4: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" @@ -3134,6 +3190,31 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +http-proxy@^1.18.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" + integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-server@~0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.12.3.tgz#ba0471d0ecc425886616cb35c4faf279140a0d37" + integrity sha512-be0dKG6pni92bRjq0kvExtj/NrrAd28/8fCXkaI/4piTwQMSDSLMhWyW0NI1V+DBI3aa1HMlQu46/HjVLfmugA== + dependencies: + basic-auth "^1.0.3" + colors "^1.4.0" + corser "^2.0.1" + ecstatic "^3.3.2" + http-proxy "^1.18.0" + minimist "^1.2.5" + opener "^1.5.1" + portfinder "^1.0.25" + secure-compare "3.0.1" + union "~0.5.0" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -4319,6 +4400,11 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.43.0" +mime@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -4341,7 +4427,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -4594,6 +4680,11 @@ opencollective-postinstall@^2.0.2: resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + optionator@^0.8.1, optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -4867,6 +4958,15 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" +portfinder@^1.0.25: + version "1.0.26" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" + integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -4950,6 +5050,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +qs@^6.4.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" + integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== + qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -5169,6 +5274,11 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + reselect@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" @@ -5322,6 +5432,11 @@ saxes@^5.0.0: dependencies: xmlchars "^2.2.0" +secure-compare@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" + integrity sha1-8aAymzCLIh+uN7mXTz1XjQypmeM= + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -5970,10 +6085,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@~3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" - integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== +typescript@~3.9.2: + version "3.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.2.tgz#64e9c8e9be6ea583c54607677dd4680a1cf35db9" + integrity sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -6008,6 +6123,13 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" +union@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" + integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== + dependencies: + qs "^6.4.0" + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -6033,6 +6155,11 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-join@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728" + integrity sha1-WvIvGMBSoACkjXuCxenC4v7tpyg= + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" From cc9305be2cd5246f5e5b0b43a63a0ebc46f650d2 Mon Sep 17 00:00:00 2001 From: infctr Date: Wed, 13 May 2020 21:11:38 +0300 Subject: [PATCH 14/26] Remove compiling plugin for tests flow --- jest.config.js | 3 - package.json | 14 +-- tests/autofix.spec.ts | 68 ++++++----- tests/fixtures/.eslintrc.js | 14 --- tests/fixtures/rulesdir/.eslintignore | 1 - tests/fixtures/rulesdir/interface.js | 7 -- tests/fixtures/rulesdir/string-enum.js | 7 -- tsconfig.build.json | 4 + yarn.lock | 152 ++++++++++++++----------- 9 files changed, 138 insertions(+), 132 deletions(-) delete mode 100644 tests/fixtures/.eslintrc.js delete mode 100644 tests/fixtures/rulesdir/.eslintignore delete mode 100644 tests/fixtures/rulesdir/interface.js delete mode 100644 tests/fixtures/rulesdir/string-enum.js create mode 100644 tsconfig.build.json diff --git a/jest.config.js b/jest.config.js index 0159876..ac0b2a7 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,7 +1,4 @@ -const shouldUseCompiled = process.env.USE_COMPILED; - module.exports = { testRegex: 'tests/.*\\.spec\\.(js|ts)$', moduleDirectories: ['node_modules', 'src'], - testPathIgnorePatterns: [!shouldUseCompiled && 'tests/autofix.spec.ts'].filter(Boolean), }; diff --git a/package.json b/package.json index b2015d6..10afcc8 100644 --- a/package.json +++ b/package.json @@ -13,17 +13,16 @@ "repository": "git@github.com:infctr/eslint-plugin-typescript-sort-keys.git", "scripts": { "build": "yarn rimraf lib && yarn compile", - "build-tests": "yarn rimraf build && yarn compile-tests && mv build/rules build/source && cp -r tests/fixtures/rulesdir build/rules", "compile": "yarn rollup -c", - "compile-tests": "yarn babel --extensions .ts src --out-dir build", "docs": "eslint-docs", "docs:check": "eslint-docs check", "lint": "eslint --ext .js,.ts src/ tests/", "format": "prettier --write src/**/*.{js,ts} tests/**/*.{js,ts}", - "test": "yarn jest", - "test-compiled": "USE_COMPILED=1 yarn test", + "test": "yarn jest --watch", + "coverage": "yarn test --coverage --watchAll=false", + "coverage-preview": "http-server -o -p 5000 coverage/lcov-report", "type-check": "tsc --noEmit --project ./tsconfig.build.json", - "verify": "yarn type-check && yarn lint && yarn build && yarn build-tests && yarn test-compiled && rimraf build" + "verify": "yarn type-check && yarn lint && yarn build && yarn test" }, "dependencies": { "natural-compare-lite": "~1.4.0" @@ -34,7 +33,6 @@ "@babel/preset-env": "~7.9.6", "@babel/preset-typescript": "~7.9.0", "@infctr/eslint-docs": "~0.4.0", - "@types/cross-spawn": "~6.0.1", "@types/eslint": "~6.8.0", "@types/eslint-plugin-prettier": "~3.1.0", "@types/jest": "~25.2.1", @@ -48,13 +46,13 @@ "@typescript-eslint/parser": "~2.32.0", "babel-jest": "~26.0.1", "babel-plugin-module-resolver": "~4.0.0", - "cross-spawn": "~7.0.1", - "eslint": "~6.8.0", + "eslint": "~7.0.0", "eslint-config-prettier": "~6.11.0", "eslint-plugin-eslint-plugin": "~2.2.1", "eslint-plugin-import": "~2.20.2", "eslint-plugin-jest": "~23.11.0", "eslint-plugin-prettier": "~3.1.3", + "http-server": "~0.12.3", "husky": "~4.2.5", "jest": "~26.0.1", "jsonc": "~2.0.0", diff --git a/tests/autofix.spec.ts b/tests/autofix.spec.ts index ce9d55d..013f58f 100644 --- a/tests/autofix.spec.ts +++ b/tests/autofix.spec.ts @@ -1,50 +1,64 @@ -import assert from 'assert'; -import Path from 'path'; +import path from 'path'; import fs from 'fs'; -import spawn from 'cross-spawn'; import tmp from 'tmp'; +import { ESLint } from 'eslint'; + +import plugin from '../src'; +import recommended from 'config/recommended'; +import { typescript } from './helpers/configs'; + +declare module 'eslint' { + export class ESLint { + constructor(config?: any); + + lintFiles(path: string | string[]): Promise; + static outputFixes(config: any): Promise; + } +} describe('autofix', () => { beforeEach(() => { tmp.setGracefulCleanup(); }); - it('should properly format comments and indent level', () => { + it('should autofix and properly format comments and indent level', async () => { const { name: tmpDir } = tmp.dirSync({ prefix: 'typescript-sort-keys-', unsafeCleanup: true, }); - const testFilePath = Path.join(tmpDir, 'autofix.ts'); + const testFilePath = path.join(tmpDir, 'autofix.ts'); const input = fs.readFileSync('tests/fixtures/autofix.input.ts', 'utf8'); const expected = fs.readFileSync('tests/fixtures/autofix.output.ts', 'utf8'); fs.writeFileSync(testFilePath, input); - const result = spawn.sync( - 'eslint', - [ - '--ext', - '.ts', - '--rulesdir', - 'build/rules', - '--config', - require.resolve('./fixtures/.eslintrc.js'), - testFilePath, - '--fix', - ], - { encoding: 'utf8' }, - ); - - if (result.status !== 0) { - console.error(result.stdout); // eslint-disable-line no-console - console.error(result.stderr); // eslint-disable-line no-console - - throw new Error(`Process exited with status ${result.status}`); - } + const eslint = new ESLint({ + overrideConfig: { + parser: typescript.parser, + parserOptions: { sourceType: 'module' }, + }, + baseConfig: recommended, + plugins: { + 'typescript-sort-keys': plugin, + }, + useEslintrc: false, + fix: true, + }); + + const results = await eslint.lintFiles(testFilePath); + const result = results[0]; + + expect(result.messages).toHaveLength(0); + expect(result.errorCount).toBe(0); + expect(result.warningCount).toBe(0); + expect(result.fixableErrorCount).toBe(0); + expect(result.fixableWarningCount).toBe(0); + + await ESLint.outputFixes(results); const output = fs.readFileSync(testFilePath, 'utf8'); - assert.strictEqual(output, expected); + expect(output).toStrictEqual(expected); }); }); diff --git a/tests/fixtures/.eslintrc.js b/tests/fixtures/.eslintrc.js deleted file mode 100644 index c961557..0000000 --- a/tests/fixtures/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint'], - rules: { - interface: 'error', - 'string-enum': 'error', - }, - settings: { - 'import/parsers': { - '@typescript-eslint/parser': ['.ts'], - }, - }, -}; diff --git a/tests/fixtures/rulesdir/.eslintignore b/tests/fixtures/rulesdir/.eslintignore deleted file mode 100644 index 72e8ffc..0000000 --- a/tests/fixtures/rulesdir/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -* diff --git a/tests/fixtures/rulesdir/interface.js b/tests/fixtures/rulesdir/interface.js deleted file mode 100644 index 5b89b81..0000000 --- a/tests/fixtures/rulesdir/interface.js +++ /dev/null @@ -1,7 +0,0 @@ -const { rule } = require('../source/interface') - -/** - * Wrapper for `eslint --rulesdir` interop in autofix tests - * @see https://github.com/eslint/eslint/issues/13232 - */ -module.exports = rule diff --git a/tests/fixtures/rulesdir/string-enum.js b/tests/fixtures/rulesdir/string-enum.js deleted file mode 100644 index 9a827fe..0000000 --- a/tests/fixtures/rulesdir/string-enum.js +++ /dev/null @@ -1,7 +0,0 @@ -const { rule } = require('../source/string-enum') - -/** - * Wrapper for `eslint --rulesdir` interop in autofix tests - * @see https://github.com/eslint/eslint/issues/13232 - */ -module.exports = rule diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..b90fc83 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"] +} diff --git a/yarn.lock b/yarn.lock index d2f0e31..d1aeec6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1209,13 +1209,6 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/cross-spawn@~6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@types/cross-spawn/-/cross-spawn-6.0.1.tgz#60fa0c87046347c17d9735e5289e72b804ca9b63" - integrity sha512-MtN1pDYdI6D6QFDzy39Q+6c9rl2o/xN7aWGe6oZuzqq5N6+YuwFsWiEAv3dNzvzN9YzU+itpN8lBzFpphQKLAw== - dependencies: - "@types/node" "*" - "@types/eslint-plugin-prettier@~3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@types/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz#451b5e1e5f148a38dc41e9c5b61d45cd2e97af2c" @@ -1454,21 +1447,16 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" - integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== acorn-walk@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== -acorn@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== - acorn@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" @@ -1912,7 +1900,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2165,7 +2153,7 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -2185,7 +2173,7 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" -cross-spawn@~7.0.1: +cross-spawn@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== @@ -2268,7 +2256,7 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -2562,13 +2550,6 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - eslint-utils@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" @@ -2581,22 +2562,22 @@ eslint-visitor-keys@^1.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@~6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== +eslint@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.0.0.tgz#c35dfd04a4372110bd78c69a8d79864273919a08" + integrity sha512-qY1cwdOxMONHJfGqw52UOpZDeqXy8xmD0u8CT6jIstil72jkhURC704W8CFyTPDPllz4z4lu0Ql1+07PG/XdIg== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" + chalk "^4.0.0" + cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" eslint-scope "^5.0.0" - eslint-utils "^1.4.3" + eslint-utils "^2.0.0" eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" + espree "^7.0.0" + esquery "^1.2.0" esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" @@ -2609,28 +2590,27 @@ eslint@~6.8.0: is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" + levn "^0.4.1" lodash "^4.17.14" minimatch "^3.0.4" - mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.3" + optionator "^0.9.1" progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" table "^5.2.3" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" - integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== +espree@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.0.0.tgz#8a7a60f218e69f120a842dc24c5a88aa7748a74e" + integrity sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw== dependencies: - acorn "^7.1.0" - acorn-jsx "^5.1.0" + acorn "^7.1.1" + acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" esprima@^4.0.0, esprima@^4.0.1: @@ -2638,12 +2618,12 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== +esquery@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: version "4.2.1" @@ -2652,7 +2632,7 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= @@ -2662,6 +2642,11 @@ estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -2808,7 +2793,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -4181,7 +4166,15 @@ levenary@^1.1.1: dependencies: leven "^3.1.0" -levn@^0.3.0, levn@~0.3.0: +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -4685,7 +4678,7 @@ opener@^1.5.1: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== -optionator@^0.8.1, optionator@^0.8.3: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -4697,6 +4690,18 @@ optionator@^0.8.1, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + ora@^3.0.0: version "3.4.0" resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" @@ -4972,6 +4977,11 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -5173,16 +5183,16 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - regexpp@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== +regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + regexpu-core@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" @@ -5462,7 +5472,7 @@ semver@^5.4.1, semver@^5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -5844,6 +5854,11 @@ strip-json-comments@^3.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== +strip-json-comments@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" + integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -6046,6 +6061,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -6301,7 +6323,7 @@ which@^2.0.2: dependencies: isexe "^2.0.0" -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== From aa27543c700ddb2d39b9026a8261188951a47b55 Mon Sep 17 00:00:00 2001 From: infctr Date: Wed, 13 May 2020 22:16:44 +0300 Subject: [PATCH 15/26] Remove paths not taken from utils --- src/utils/ast.ts | 38 ++++++++++++-------------------------- src/utils/compare.ts | 6 +----- 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/src/utils/ast.ts b/src/utils/ast.ts index a6c835a..f1aaac5 100644 --- a/src/utils/ast.ts +++ b/src/utils/ast.ts @@ -19,20 +19,17 @@ export function getObjectBody( function getProperty(node: TSESTree.Node) { switch (node.type) { - case AST_NODE_TYPES.TSIndexSignature: - if (node.parameters.length > 0) { - const [identifier] = node.parameters; + case AST_NODE_TYPES.TSIndexSignature: { + const [identifier] = node.parameters; - return { - ...identifier, - // Override name for error message readability and weight calculation - name: indexSignature.create( - (identifier as TSESTree.Parameter & { name: string }).name, - ), - }; - } - - return undefined; + return { + ...identifier, + // Override name for error message readability and weight calculation + name: indexSignature.create( + (identifier as TSESTree.Parameter & { name: string }).name, + ), + }; + } case AST_NODE_TYPES.TSPropertySignature: case AST_NODE_TYPES.TSMethodSignature: @@ -74,11 +71,7 @@ function getProperty(node: TSESTree.Node) { * let a = {[tag`b`]: 1} // => undefined * let a = {[`${b}`]: 1} // => undefined */ -export function getPropertyName(node: TSESTree.Node): string | undefined { - if (!node.type) { - return undefined; - } - +export function getPropertyName(node: TSESTree.Node) { const property = getProperty(node); if (!property) { @@ -89,15 +82,8 @@ export function getPropertyName(node: TSESTree.Node): string | undefined { case AST_NODE_TYPES.Literal: return String(property.value); - case AST_NODE_TYPES.TemplateLiteral: - return property.expressions.length === 0 && property.quasis.length === 1 - ? property.quasis[0].value.cooked - : undefined; - case AST_NODE_TYPES.Identifier: - return (node as TSESTree.Node & { computed?: boolean }).computed - ? undefined - : property.name; + return property.name; default: return undefined; diff --git a/src/utils/compare.ts b/src/utils/compare.ts index 8dc469a..6b9adaa 100644 --- a/src/utils/compare.ts +++ b/src/utils/compare.ts @@ -74,9 +74,5 @@ export const compareFn = ( return ascendingInsensitive(...input); } - if (!isInsensitive && !isNatural) { - return ascending(...input); - } - - return 0; + return ascending(...input); }; From a2b12312329256db6a590a861c2c98aca6664137 Mon Sep 17 00:00:00 2001 From: infctr Date: Tue, 19 May 2020 11:15:21 +0300 Subject: [PATCH 16/26] Add url to package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 10afcc8..7f7c228 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "author": "infctr ", "main": "dist/index.js", "repository": "git@github.com:infctr/eslint-plugin-typescript-sort-keys.git", + "url": "https://github.com/infctr/eslint-plugin-typescript-sort-keys", "scripts": { "build": "yarn rimraf lib && yarn compile", "compile": "yarn rollup -c", From e8dba71c03f3e92244d6268ec6e0ed28e76fff34 Mon Sep 17 00:00:00 2001 From: infctr Date: Wed, 20 May 2020 23:19:19 +0300 Subject: [PATCH 17/26] Support `requiredFirst` sorting option --- src/common/options.ts | 32 +- src/rules/interface.ts | 28 +- src/rules/string-enum.ts | 22 +- src/utils/ast.ts | 14 +- src/utils/plugin.ts | 35 +- tests/autofix.spec.ts | 4 +- tests/rules/interface.spec.ts | 811 +++++++++++++++++++++++++++++++--- 7 files changed, 842 insertions(+), 104 deletions(-) diff --git a/src/common/options.ts b/src/common/options.ts index ffe8376..4aadec8 100644 --- a/src/common/options.ts +++ b/src/common/options.ts @@ -11,29 +11,25 @@ export const sortingOrderOptionSchema: JSONSchema4 = { export type SortingOrderOption = SortingOrder; -export const sortingParamsOptionSchema: JSONSchema4 = { - type: 'object', - properties: { - caseSensitive: { - type: 'boolean', - }, - natural: { - type: 'boolean', - }, - }, - additionalProperties: false, -}; - -export interface SortingParamsOption { +interface CaseSensitiveSortingOption { readonly caseSensitive: boolean; +} + +interface NaturalSortingOption { readonly natural: boolean; } -export type RuleOptions = - | [SortingOrderOption] - | [SortingOrderOption, Partial]; +interface RequiredFirstSortingOption { + readonly requiredFirst: boolean; +} + +export interface SortingParamsOptions { + readonly caseSensitive: CaseSensitiveSortingOption; + readonly natural: NaturalSortingOption; + readonly requiredFirst: RequiredFirstSortingOption; +} export enum ErrorMessage { - InterfaceInvalidOrder = `Expected interface keys to be in {{ natural }}{{ insensitive }}{{ order }}ending order. '{{ thisName }}' should be before '{{ prevName }}'.`, + InterfaceInvalidOrder = `Expected interface keys to be in {{ requiredFirst }}{{ natural }}{{ insensitive }}{{ order }}ending order. '{{ thisName }}' should be before '{{ prevName }}'.`, StringEnumInvalidOrder = `Expected string enum members to be in {{ natural }}{{ insensitive }}{{ order }}ending order. '{{ thisName }}' should be before '{{ prevName }}'.`, } diff --git a/src/rules/interface.ts b/src/rules/interface.ts index a554037..5be0e99 100644 --- a/src/rules/interface.ts +++ b/src/rules/interface.ts @@ -5,10 +5,10 @@ import { createReporter } from 'utils/plugin'; import { createRule, RuleMetaData } from 'utils/rule'; import { sortingOrderOptionSchema, - sortingParamsOptionSchema, SortingOrder, ErrorMessage, - RuleOptions, + SortingOrderOption, + SortingParamsOptions, } from 'common/options'; /** @@ -16,10 +16,30 @@ import { */ export const name = 'interface' as const; +type SortingParams = SortingParamsOptions['caseSensitive'] & + SortingParamsOptions['natural'] & + SortingParamsOptions['requiredFirst']; + /** * The options this rule can take. */ -export type Options = RuleOptions; +export type Options = [SortingOrderOption] | [SortingOrderOption, Partial]; + +const sortingParamsOptionSchema: JSONSchema4 = { + type: 'object', + properties: { + caseSensitive: { + type: 'boolean', + }, + natural: { + type: 'boolean', + }, + requiredFirst: { + type: 'boolean', + }, + }, + additionalProperties: false, +}; /** * The schema for the rule options. @@ -31,7 +51,7 @@ const schema: JSONSchema4 = [sortingOrderOptionSchema, sortingParamsOptionSchema */ const defaultOptions: Options = [ SortingOrder.Ascending, - { caseSensitive: true, natural: false }, + { caseSensitive: true, natural: false, requiredFirst: false }, ]; /** diff --git a/src/rules/string-enum.ts b/src/rules/string-enum.ts index d1536ba..16e7c48 100644 --- a/src/rules/string-enum.ts +++ b/src/rules/string-enum.ts @@ -6,10 +6,10 @@ import { createReporter } from 'utils/plugin'; import { createRule, RuleMetaData } from 'utils/rule'; import { sortingOrderOptionSchema, - sortingParamsOptionSchema, SortingOrder, ErrorMessage, - RuleOptions, + SortingOrderOption, + SortingParamsOptions, } from 'common/options'; /** @@ -17,10 +17,26 @@ import { */ export const name = 'string-enum' as const; +type SortingParams = SortingParamsOptions['caseSensitive'] & + SortingParamsOptions['natural']; + /** * The options this rule can take. */ -export type Options = RuleOptions; +export type Options = [SortingOrderOption] | [SortingOrderOption, Partial]; + +const sortingParamsOptionSchema: JSONSchema4 = { + type: 'object', + properties: { + caseSensitive: { + type: 'boolean', + }, + natural: { + type: 'boolean', + }, + }, + additionalProperties: false, +}; /** * The schema for the rule options. diff --git a/src/utils/ast.ts b/src/utils/ast.ts index f1aaac5..beda2a0 100644 --- a/src/utils/ast.ts +++ b/src/utils/ast.ts @@ -71,7 +71,7 @@ function getProperty(node: TSESTree.Node) { * let a = {[tag`b`]: 1} // => undefined * let a = {[`${b}`]: 1} // => undefined */ -export function getPropertyName(node: TSESTree.Node) { +export function getPropertyName(node: TSESTree.TypeElement | TSESTree.TSEnumMember) { const property = getProperty(node); if (!property) { @@ -89,3 +89,15 @@ export function getPropertyName(node: TSESTree.Node) { return undefined; } } + +export function getPropertyIsOptional( + node: TSESTree.TypeElement | TSESTree.TSEnumMember, +) { + switch (node.type) { + case AST_NODE_TYPES.TSMethodSignature: + case AST_NODE_TYPES.TSPropertySignature: + return Boolean(node.optional); + } + + return false; +} diff --git a/src/utils/plugin.ts b/src/utils/plugin.ts index c48f96e..244258f 100644 --- a/src/utils/plugin.ts +++ b/src/utils/plugin.ts @@ -7,10 +7,14 @@ import { } from '@typescript-eslint/experimental-utils/dist/ts-eslint'; import assert from 'assert'; -import { RuleOptions, SortingOrder } from 'common/options'; -import { getPropertyName } from './ast'; +import { SortingOrder } from 'common/options'; +import { Options as InterfaceRuleOptions } from 'rules/interface'; +import { Options as StringEnumRuleOptions } from 'rules/string-enum'; +import { getPropertyName, getPropertyIsOptional } from './ast'; import { compareFn } from './compare'; +type RuleOptions = InterfaceRuleOptions & StringEnumRuleOptions; + type TSType = TSESTree.TypeElement | TSESTree.TSEnumMember; function createNodeSwapper(context: UtilRuleContext) { @@ -145,14 +149,24 @@ export function createReporter( const isAscending = order === SortingOrder.Ascending; const isInsensitive = (options && options.caseSensitive) === false; const isNatural = Boolean(options && options.natural); + const isRequiredFirst = (options && options.requiredFirst) === true; const compare = compareFn(isAscending, isInsensitive, isNatural); const swapNodes = createNodeSwapper(context); return (body: TSType[]) => { - const sortedBody = [...body].sort((a, b) => - compare(getPropertyName(a), getPropertyName(b)), - ); + const sortedBody = isRequiredFirst + ? [ + ...body + .slice(0) + .filter(node => !getPropertyIsOptional(node)) + .sort((a, b) => compare(getPropertyName(a), getPropertyName(b))), + ...body + .slice(0) + .filter(node => getPropertyIsOptional(node)) + .sort((a, b) => compare(getPropertyName(a), getPropertyName(b))), + ] + : body.slice(0).sort((a, b) => compare(getPropertyName(a), getPropertyName(b))); const nodePositions = new Map( body.map(n => [n, { initial: body.indexOf(n), final: sortedBody.indexOf(n) }]), @@ -164,7 +178,15 @@ export function createReporter( const prevNodeName = getPropertyName(prevNode); const currentNodeName = getPropertyName(currentNode); - if (compare(prevNodeName, currentNodeName) > 0) { + if ( + (!isRequiredFirst && compare(prevNodeName, currentNodeName) > 0) || + (isRequiredFirst && + getPropertyIsOptional(prevNode) === getPropertyIsOptional(currentNode) && + compare(prevNodeName, currentNodeName) > 0) || + (isRequiredFirst && + getPropertyIsOptional(prevNode) !== getPropertyIsOptional(currentNode) && + getPropertyIsOptional(prevNode)) + ) { const targetPosition = sortedBody.indexOf(currentNode); const replaceNode = body[targetPosition]; const { loc, messageId } = createReportObject(currentNode); @@ -186,6 +208,7 @@ export function createReporter( order, insensitive: isInsensitive ? 'insensitive ' : '', natural: isNatural ? 'natural ' : '', + requiredFirst: isRequiredFirst ? 'required first ' : '', }, fix: fixer => { diff --git a/tests/autofix.spec.ts b/tests/autofix.spec.ts index 7987e20..f339023 100644 --- a/tests/autofix.spec.ts +++ b/tests/autofix.spec.ts @@ -28,7 +28,7 @@ describe('autofix', () => { ...recommended, rules: { ...recommended.rules, - interface: [ + 'typescript-sort-keys/interface': [ 'error', 'asc', { caseSensitive: true, natural: true, requiredFirst: true }, @@ -53,10 +53,10 @@ describe('autofix', () => { const eslint = new ESLint({ overrideConfig: { + ...config, parser: typescript.parser, parserOptions: { sourceType: 'module' }, }, - baseConfig: config, plugins: { 'typescript-sort-keys': plugin, }, diff --git a/tests/rules/interface.spec.ts b/tests/rules/interface.spec.ts index 8604fe1..62ba84c 100644 --- a/tests/rules/interface.spec.ts +++ b/tests/rules/interface.spec.ts @@ -22,6 +22,7 @@ const valid: readonly ValidTestCase[] = [ [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { @@ -32,6 +33,7 @@ const valid: readonly ValidTestCase[] = [ [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { @@ -42,6 +44,7 @@ const valid: readonly ValidTestCase[] = [ [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { @@ -52,6 +55,7 @@ const valid: readonly ValidTestCase[] = [ [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { @@ -62,6 +66,7 @@ const valid: readonly ValidTestCase[] = [ [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { @@ -72,6 +77,7 @@ const valid: readonly ValidTestCase[] = [ [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { @@ -82,6 +88,7 @@ const valid: readonly ValidTestCase[] = [ [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, @@ -96,6 +103,7 @@ const valid: readonly ValidTestCase[] = [ [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, @@ -110,6 +118,7 @@ const valid: readonly ValidTestCase[] = [ [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { @@ -120,6 +129,7 @@ const valid: readonly ValidTestCase[] = [ [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { @@ -130,6 +140,7 @@ const valid: readonly ValidTestCase[] = [ [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { @@ -140,6 +151,7 @@ const valid: readonly ValidTestCase[] = [ [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, @@ -216,6 +228,146 @@ const valid: readonly ValidTestCase[] = [ optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], }, + /** + * asc, natural, insensitive, required + */ + { + code: 'interface U {_:T; b:T; a?:T;}', + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {a:T; c:T; b?:T;}', + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {b:T; b_:T; a?:T;}', + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {C:T; c:T; b_?:T;}', + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {c:T; C:T; b_?:T;}', + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {$:T; _:T; A?:T; a?:T;}', + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: "interface U {1:T; '11':T; A:T; 2?:T;}", + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: "interface U {'Z':T; À:T; è:T; '#'?:T;}", + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + + /** + * asc, required + */ + { + code: 'interface U {_:T; b:T; a?:T;}', + optionsSet: [[SortingOrder.Ascending, { requiredFirst: true }]], + }, + { + code: 'interface U {a:T; c:T; b?:T;}', + optionsSet: [[SortingOrder.Ascending, { requiredFirst: true }]], + }, + { + code: 'interface U {b:T; b_:T; a?:T;}', + optionsSet: [[SortingOrder.Ascending, { requiredFirst: true }]], + }, + { + code: 'interface U {C:T; c:T; b_?:T;}', + optionsSet: [[SortingOrder.Ascending, { requiredFirst: true }]], + }, + { + code: 'interface U {1:T; 11:T; 9:T; 111?:T;}', + optionsSet: [[SortingOrder.Ascending, { requiredFirst: true }]], + }, + { + code: 'interface U {$:T; _:T; A?:T; a?:T;}', + optionsSet: [[SortingOrder.Ascending, { requiredFirst: true }]], + }, + { + code: "interface U {10:T; '11':T; 1?:T; 12?:T; 2?:T;}", + optionsSet: [[SortingOrder.Ascending, { requiredFirst: true }]], + }, + { + code: "interface U {'Z':T; À:T; è:T; '#'?:T;}", + optionsSet: [[SortingOrder.Ascending, { requiredFirst: true }]], + }, + + /** + * asc, natural, insensitive, not-required + */ + { + code: 'interface U {_:T; a?:T; b:T;}', + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {a:T; b?:T; c:T;}', + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {a?:T; b:T; b_:T;}', + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {b_?:T; C:T; c:T;}', + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {b_?:T; c:T; C:T;}', + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {$:T; _:T; A?:T; a?:T;}', + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: "interface U {1:T; 2?:T; '11':T; A:T;}", + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: "interface U {'#'?:T; 'Z':T; À:T; è:T;}", + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + /** * desc */ @@ -432,6 +584,146 @@ const valid: readonly ValidTestCase[] = [ optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, + /** + * desc, natural, insensitive, required + */ + { + code: 'interface U {b:T; _:T; a?:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {c:T; a:T; b?:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {b_:T; b:T; a?:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {c:T; C:T; b_?:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {C:T; c:T; b_?:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {_:T; $:T; a?:T; A?:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: "interface U { A:T; '11':T; 1:T; 2?:T;}", + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: "interface U {è:T; 'Z':T; À?:T; '#'?:T;}", + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + + /** + * desc, required + */ + { + code: 'interface U {b:T; _:T; a?:T;}', + optionsSet: [[SortingOrder.Descending, { requiredFirst: true }]], + }, + { + code: 'interface U {c:T; a:T; b?:T;}', + optionsSet: [[SortingOrder.Descending, { requiredFirst: true }]], + }, + { + code: 'interface U {b_:T; b:T; a?:T;}', + optionsSet: [[SortingOrder.Descending, { requiredFirst: true }]], + }, + { + code: 'interface U {c:T; C:T; b_?:T;}', + optionsSet: [[SortingOrder.Descending, { requiredFirst: true }]], + }, + { + code: 'interface U {9:T; 11:T; 1:T; 111?:T;}', + optionsSet: [[SortingOrder.Descending, { requiredFirst: true }]], + }, + { + code: 'interface U {_:T; $:T; a?:T; A?:T;}', + optionsSet: [[SortingOrder.Descending, { requiredFirst: true }]], + }, + { + code: "interface U {'11':T; 10:T; 2?:T; 12?:T; 1?:T;}", + optionsSet: [[SortingOrder.Descending, { requiredFirst: true }]], + }, + { + code: "interface U {è:T; À:T; 'Z':T; '#'?:T;}", + optionsSet: [[SortingOrder.Descending, { requiredFirst: true }]], + }, + + /** + * desc, natural, insensitive, not-required + */ + { + code: 'interface U {b:T; a?:T; _:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {c:T; b?:T; a:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {b_:T; b:T; a?:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {c:T; C:T; b_?:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {C:T; c:T; b_?:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {a?:T; A?:T; _:T; $:T;}', + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: "interface U {A:T; '11':T; 2?:T; 1:T;}", + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: "interface U {è:T; À:T; 'Z':T; '#'?:T;}", + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + /** * index signatures */ @@ -451,86 +743,93 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'interface U {a:T; _:T; b:T;}', - errors: ["Expected interface keys to be in ascending order. '_' should be before 'a'."], output: 'interface U {_:T; a:T; b:T;}', + errors: ["Expected interface keys to be in ascending order. '_' should be before 'a'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: 'interface U {a:T; c:T; b:T;}', - errors: ["Expected interface keys to be in ascending order. 'b' should be before 'c'."], output: 'interface U {a:T; b:T; c:T;}', + errors: ["Expected interface keys to be in ascending order. 'b' should be before 'c'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: 'interface U {b_:T; a:T; b:T;}', - errors: ["Expected interface keys to be in ascending order. 'a' should be before 'b_'."], output: 'interface U {a:T; b_:T; b:T;}', + errors: ["Expected interface keys to be in ascending order. 'a' should be before 'b_'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: 'interface U {b_:T; c:T; C:T;}', - errors: ["Expected interface keys to be in ascending order. 'C' should be before 'c'."], output: 'interface U {C:T; c:T; b_:T;}', + errors: ["Expected interface keys to be in ascending order. 'C' should be before 'c'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: 'interface U {$:T; _:T; A:T; a:T;}', - errors: ["Expected interface keys to be in ascending order. 'A' should be before '_'."], output: 'interface U {$:T; A:T; _:T; a:T;}', + errors: ["Expected interface keys to be in ascending order. 'A' should be before '_'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: "interface U {1:T; 2:T; A:T; '11':T;}", - errors: ["Expected interface keys to be in ascending order. '11' should be before 'A'."], output: "interface U {1:T; '11':T; A:T; 2:T;}", + errors: ["Expected interface keys to be in ascending order. '11' should be before 'A'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: "interface U {'#':T; À:T; 'Z':T; è:T;}", - errors: ["Expected interface keys to be in ascending order. 'Z' should be before 'À'."], output: "interface U {'#':T; 'Z':T; À:T; è:T;}", + errors: ["Expected interface keys to be in ascending order. 'Z' should be before 'À'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, @@ -539,26 +838,28 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: "interface U {1:T; 2:T; A():T; '11':T;}", - errors: ["Expected interface keys to be in ascending order. '11' should be before 'A'."], output: "interface U {1:T; '11':T; A():T; 2:T;}", + errors: ["Expected interface keys to be in ascending order. '11' should be before 'A'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: "interface U {'#'():T; À():T; 'Z':T; è:T;}", - errors: ["Expected interface keys to be in ascending order. 'Z' should be before 'À'."], output: "interface U {'#'():T; 'Z':T; À():T; è:T;}", + errors: ["Expected interface keys to be in ascending order. 'Z' should be before 'À'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, @@ -567,14 +868,15 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'interface U {a:T; b:T; ["a"]:T; c:T;}', - errors: ["Expected interface keys to be in ascending order. 'a' should be before 'b'."], output: 'interface U {a:T; ["a"]:T; b:T; c:T;}', + errors: ["Expected interface keys to be in ascending order. 'a' should be before 'b'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, @@ -583,32 +885,34 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'interface U {a:T; c:{y:T; x:T;}, b:T;}', + output: 'interface U {a:T; b:T; c:{y:T; x:T;}}', errors: [ "Expected interface keys to be in ascending order. 'x' should be before 'y'.", "Expected interface keys to be in ascending order. 'b' should be before 'c'.", ], - output: 'interface U {a:T; b:T; c:{y:T; x:T;}}', optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: 'type U = {a:T; c:{y:T; x:T;}, b:T;}', + output: 'type U = {a:T; b:T; c:{y:T; x:T;}}', errors: [ "Expected interface keys to be in ascending order. 'x' should be before 'y'.", "Expected interface keys to be in ascending order. 'b' should be before 'c'.", ], - output: 'type U = {a:T; b:T; c:{y:T; x:T;}}', optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, @@ -617,80 +921,86 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'interface U {a:T; _:T; b:T;}', - errors: ["Expected interface keys to be in ascending order. '_' should be before 'a'."], output: 'interface U {_:T; a:T; b:T;}', + errors: ["Expected interface keys to be in ascending order. '_' should be before 'a'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: 'interface U {a:T; c:T; b:T;}', - errors: ["Expected interface keys to be in ascending order. 'b' should be before 'c'."], output: 'interface U {a:T; b:T; c:T;}', + errors: ["Expected interface keys to be in ascending order. 'b' should be before 'c'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: 'interface U {b_:T; a:T; b:T;}', - errors: ["Expected interface keys to be in ascending order. 'a' should be before 'b_'."], output: 'interface U {a:T; b_:T; b:T;}', + errors: ["Expected interface keys to be in ascending order. 'a' should be before 'b_'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: 'interface U {b_:T; c:T; C:T;}', - errors: ["Expected interface keys to be in ascending order. 'C' should be before 'c'."], output: 'interface U {C:T; c:T; b_:T;}', + errors: ["Expected interface keys to be in ascending order. 'C' should be before 'c'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: 'interface U {$:T; _:T; A:T; a:T;}', - errors: ["Expected interface keys to be in ascending order. 'A' should be before '_'."], output: 'interface U {$:T; A:T; _:T; a:T;}', + errors: ["Expected interface keys to be in ascending order. 'A' should be before '_'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: "interface U {1:T; 2:T; A:T; '11':T;}", - errors: ["Expected interface keys to be in ascending order. '11' should be before 'A'."], output: "interface U {1:T; '11':T; A:T; 2:T;}", + errors: ["Expected interface keys to be in ascending order. '11' should be before 'A'."], optionsSet: [ [], [SortingOrder.Ascending], [SortingOrder.Ascending, { caseSensitive: true }], [SortingOrder.Ascending, { natural: false }], [SortingOrder.Ascending, { caseSensitive: true, natural: false }], + [SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }], ], }, { code: "interface U {'#':T; À:T; 'Z':T; è:T;}", - errors: ["Expected interface keys to be in ascending order. 'Z' should be before 'À'."], output: "interface U {'#':T; 'Z':T; À:T; è:T;}", + errors: ["Expected interface keys to be in ascending order. 'Z' should be before 'À'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -705,50 +1015,50 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'interface U {a:T; _:T; b:T;}', + output: 'interface U {_:T; a:T; b:T;}', errors: [ "Expected interface keys to be in insensitive ascending order. '_' should be before 'a'.", ], - output: 'interface U {_:T; a:T; b:T;}', optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], }, { code: 'interface U {a:T; c:T; b:T;}', + output: 'interface U {a:T; b:T; c:T;}', errors: [ "Expected interface keys to be in insensitive ascending order. 'b' should be before 'c'.", ], - output: 'interface U {a:T; b:T; c:T;}', optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], }, { code: 'interface U {b_:T; a:T; b:T;}', + output: 'interface U {a:T; b_:T; b:T;}', errors: [ "Expected interface keys to be in insensitive ascending order. 'a' should be before 'b_'.", ], - output: 'interface U {a:T; b_:T; b:T;}', optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], }, { code: 'interface U {$:T; A:T; _:T; a:T;}', + output: 'interface U {$:T; _:T; A:T; a:T;}', errors: [ "Expected interface keys to be in insensitive ascending order. '_' should be before 'A'.", ], - output: 'interface U {$:T; _:T; A:T; a:T;}', optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], }, { code: "interface U {1:T; 2:T; A:T; '11':T;}", + output: "interface U {1:T; '11':T; A:T; 2:T;}", errors: [ "Expected interface keys to be in insensitive ascending order. '11' should be before 'A'.", ], - output: "interface U {1:T; '11':T; A:T; 2:T;}", optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], }, { code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + output: "interface U {'#':T; 'Z':T; À:T; è:T;}", errors: [ "Expected interface keys to be in insensitive ascending order. 'Z' should be before 'À'.", ], - output: "interface U {'#':T; 'Z':T; À:T; è:T;}", optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], }, @@ -757,48 +1067,48 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'interface U {a:T; _:T; b:T;}', - errors: ["Expected interface keys to be in natural ascending order. '_' should be before 'a'."], output: 'interface U {_:T; a:T; b:T;}', + errors: ["Expected interface keys to be in natural ascending order. '_' should be before 'a'."], optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, { code: 'interface U {a:T; c:T; b:T;}', - errors: ["Expected interface keys to be in natural ascending order. 'b' should be before 'c'."], output: 'interface U {a:T; b:T; c:T;}', + errors: ["Expected interface keys to be in natural ascending order. 'b' should be before 'c'."], optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, { code: 'interface U {b_:T; a:T; b:T;}', + output: 'interface U {a:T; b_:T; b:T;}', errors: [ "Expected interface keys to be in natural ascending order. 'a' should be before 'b_'.", ], - output: 'interface U {a:T; b_:T; b:T;}', optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, { code: 'interface U {b_:T; c:T; C:T;}', - errors: ["Expected interface keys to be in natural ascending order. 'C' should be before 'c'."], output: 'interface U {C:T; c:T; b_:T;}', + errors: ["Expected interface keys to be in natural ascending order. 'C' should be before 'c'."], optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, { code: 'interface U {$:T; A:T; _:T; a:T;}', - errors: ["Expected interface keys to be in natural ascending order. '_' should be before 'A'."], output: 'interface U {$:T; _:T; A:T; a:T;}', + errors: ["Expected interface keys to be in natural ascending order. '_' should be before 'A'."], optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, { code: "interface U {1:T; 2:T; A:T; '11':T;}", + output: "interface U {1:T; 2:T; '11':T; A:T;}", errors: [ "Expected interface keys to be in natural ascending order. '11' should be before 'A'.", ], - output: "interface U {1:T; 2:T; '11':T; A:T;}", optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, { code: "interface U {'#':T; À:T; 'Z':T; è:T;}", - errors: ["Expected interface keys to be in natural ascending order. 'Z' should be before 'À'."], output: "interface U {'#':T; 'Z':T; À:T; è:T;}", + errors: ["Expected interface keys to be in natural ascending order. 'Z' should be before 'À'."], optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, @@ -807,105 +1117,273 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'interface U {a:T; _:T; b:T;}', + output: 'interface U {_:T; a:T; b:T;}', errors: [ "Expected interface keys to be in natural insensitive ascending order. '_' should be before 'a'.", ], - output: 'interface U {_:T; a:T; b:T;}', optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], }, { code: 'interface U {a:T; c:T; b:T;}', + output: 'interface U {a:T; b:T; c:T;}', errors: [ "Expected interface keys to be in natural insensitive ascending order. 'b' should be before 'c'.", ], - output: 'interface U {a:T; b:T; c:T;}', optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], }, { code: 'interface U {b_:T; a:T; b:T;}', + output: 'interface U {a:T; b_:T; b:T;}', errors: [ "Expected interface keys to be in natural insensitive ascending order. 'a' should be before 'b_'.", ], - output: 'interface U {a:T; b_:T; b:T;}', optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], }, { code: 'interface U {$:T; A:T; _:T; a:T;}', + output: 'interface U {$:T; _:T; A:T; a:T;}', errors: [ "Expected interface keys to be in natural insensitive ascending order. '_' should be before 'A'.", ], - output: 'interface U {$:T; _:T; A:T; a:T;}', optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], }, { code: "interface U {1:T; '11':T; 2:T; A:T;}", + output: "interface U {1:T; 2:T; '11':T; A:T;}", errors: [ "Expected interface keys to be in natural insensitive ascending order. '2' should be before '11'.", ], - output: "interface U {1:T; 2:T; '11':T; A:T;}", optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], }, { code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + output: "interface U {'#':T; 'Z':T; À:T; è:T;}", errors: [ "Expected interface keys to be in natural insensitive ascending order. 'Z' should be before 'À'.", ], - output: "interface U {'#':T; 'Z':T; À:T; è:T;}", optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], }, /** - * desc + * asc, natural, insensitive, required */ { - code: 'interface U {a:T; _:T; b:T;}', - errors: ["Expected interface keys to be in descending order. 'b' should be before '_'."], + code: 'interface U {_:T; a?:T; b:T;}', + output: 'interface U {_:T; b:T; a?:T;}', + errors: [ + "Expected interface keys to be in required first natural insensitive ascending order. 'b' should be before 'a'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {a:T; b?:T; c:T;}', + output: 'interface U {a:T; c:T; b?:T;}', + errors: [ + "Expected interface keys to be in required first natural insensitive ascending order. 'c' should be before 'b'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {b:T; a?:T; b_:T;}', + output: 'interface U {b:T; b_:T; a?:T;}', + errors: [ + "Expected interface keys to be in required first natural insensitive ascending order. 'b_' should be before 'a'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {C:T; b_?:T; c:T;}', + output: 'interface U {C:T; c:T; b_?:T;}', + errors: [ + "Expected interface keys to be in required first natural insensitive ascending order. 'c' should be before 'b_'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {C:T; b_?:T; c:T;}', + output: 'interface U {C:T; c:T; b_?:T;}', + errors: [ + "Expected interface keys to be in required first natural insensitive ascending order. 'c' should be before 'b_'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {$:T; A?:T; _:T; a?:T;}', + output: 'interface U {$:T; _:T; A?:T; a?:T;}', + errors: [ + "Expected interface keys to be in required first natural insensitive ascending order. '_' should be before 'A'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: "interface U {1:T; '11':T; 2?:T; A:T;}", + output: "interface U {1:T; '11':T; A:T; 2?:T;}", + errors: [ + "Expected interface keys to be in required first natural insensitive ascending order. 'A' should be before '2'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: "interface U {'Z':T; À:T; '#'?:T; è:T;}", + output: "interface U {'Z':T; À:T; è:T; '#'?:T;}", + errors: [ + "Expected interface keys to be in required first natural insensitive ascending order. 'è' should be before '#'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + + /** + * asc, natural, insensitive, not-required + */ + { + code: 'interface U {_:T; b:T; a?:T;}', + output: 'interface U {_:T; a?:T; b:T;}', + errors: [ + "Expected interface keys to be in natural insensitive ascending order. 'a' should be before 'b'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {b?:T; a:T; c:T;}', + output: 'interface U {a:T; b?:T; c:T;}', + errors: [ + "Expected interface keys to be in natural insensitive ascending order. 'a' should be before 'b'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {b:T; a?:T; b_:T;}', + output: 'interface U {a?:T; b:T; b_:T;}', + errors: [ + "Expected interface keys to be in natural insensitive ascending order. 'a' should be before 'b'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {C:T; c:T; b_?:T;}', + output: 'interface U {b_?:T; c:T; C:T;}', + errors: [ + "Expected interface keys to be in natural insensitive ascending order. 'b_' should be before 'c'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {C:T; b_?:T; c:T;}', + output: 'interface U {b_?:T; C:T; c:T;}', + errors: [ + "Expected interface keys to be in natural insensitive ascending order. 'b_' should be before 'C'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {$:T; A?:T; _:T; a?:T;}', + output: 'interface U {$:T; _:T; A?:T; a?:T;}', + errors: [ + "Expected interface keys to be in natural insensitive ascending order. '_' should be before 'A'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: "interface U {1:T; '11':T; 2?:T; A:T;}", + output: "interface U {1:T; 2?:T; '11':T; A:T;}", + errors: [ + "Expected interface keys to be in natural insensitive ascending order. '2' should be before '11'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: "interface U {'Z':T; À:T; '#'?:T; è:T;}", + output: "interface U {'#'?:T; À:T; 'Z':T; è:T;}", + errors: [ + "Expected interface keys to be in natural insensitive ascending order. '#' should be before 'À'.", + ], + optionsSet: [ + [SortingOrder.Ascending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + + /** + * desc + */ + { + code: 'interface U {a:T; _:T; b:T;}', output: 'interface U {b:T; _:T; a:T;}', + errors: ["Expected interface keys to be in descending order. 'b' should be before '_'."], optionsSet: [[SortingOrder.Descending]], }, { code: 'interface U {a:T; c:T; b:T;}', - errors: ["Expected interface keys to be in descending order. 'c' should be before 'a'."], output: 'interface U {c:T; a:T; b:T;}', + errors: ["Expected interface keys to be in descending order. 'c' should be before 'a'."], optionsSet: [[SortingOrder.Descending]], }, { code: 'interface U {b_:T; a:T; b:T;}', - errors: ["Expected interface keys to be in descending order. 'b' should be before 'a'."], output: 'interface U {b_:T; b:T; a:T;}', + errors: ["Expected interface keys to be in descending order. 'b' should be before 'a'."], optionsSet: [[SortingOrder.Descending]], }, { code: 'interface U {b_:T; c:T; C:T;}', - errors: ["Expected interface keys to be in descending order. 'c' should be before 'b_'."], output: 'interface U {c:T; b_:T; C:T;}', + errors: ["Expected interface keys to be in descending order. 'c' should be before 'b_'."], optionsSet: [[SortingOrder.Descending]], }, { code: 'interface U {$:T; _:T; A:T; a:T;}', + output: 'interface U {a:T; _:T; A:T; $:T;}', errors: [ "Expected interface keys to be in descending order. '_' should be before '$'.", "Expected interface keys to be in descending order. 'a' should be before 'A'.", ], - output: 'interface U {a:T; _:T; A:T; $:T;}', optionsSet: [[SortingOrder.Descending]], }, { code: "interface U {1:T; 2:T; A:T; '11':T;}", + output: "interface U {A:T; 2:T; 1:T; '11':T;}", errors: [ "Expected interface keys to be in descending order. '2' should be before '1'.", "Expected interface keys to be in descending order. 'A' should be before '2'.", ], - output: "interface U {A:T; 2:T; 1:T; '11':T;}", optionsSet: [[SortingOrder.Descending]], }, { code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + output: "interface U {è:T; À:T; 'Z':T; '#':T;}", errors: [ "Expected interface keys to be in descending order. 'À' should be before '#'.", "Expected interface keys to be in descending order. 'è' should be before 'Z'.", ], - output: "interface U {è:T; À:T; 'Z':T; '#':T;}", optionsSet: [[SortingOrder.Descending]], }, @@ -914,61 +1392,61 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'interface U {a:T; _:T; b:T;}', + output: 'interface U {b:T; _:T; a:T;}', errors: [ "Expected interface keys to be in insensitive descending order. 'b' should be before '_'.", ], - output: 'interface U {b:T; _:T; a:T;}', optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, { code: 'interface U {a:T; c:T; b:T;}', + output: 'interface U {c:T; a:T; b:T;}', errors: [ "Expected interface keys to be in insensitive descending order. 'c' should be before 'a'.", ], - output: 'interface U {c:T; a:T; b:T;}', optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, { code: 'interface U {b_:T; a:T; b:T;}', + output: 'interface U {b_:T; b:T; a:T;}', errors: [ "Expected interface keys to be in insensitive descending order. 'b' should be before 'a'.", ], - output: 'interface U {b_:T; b:T; a:T;}', optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, { code: 'interface U {b_:T; c:T; C:T;}', + output: 'interface U {c:T; b_:T; C:T;}', errors: [ "Expected interface keys to be in insensitive descending order. 'c' should be before 'b_'.", ], - output: 'interface U {c:T; b_:T; C:T;}', optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, { code: 'interface U {$:T; _:T; A:T; a:T;}', + output: 'interface U {A:T; _:T; $:T; a:T;}', errors: [ "Expected interface keys to be in insensitive descending order. '_' should be before '$'.", "Expected interface keys to be in insensitive descending order. 'A' should be before '_'.", ], - output: 'interface U {A:T; _:T; $:T; a:T;}', optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, { code: "interface U {1:T; 2:T; A:T; '11':T;}", + output: "interface U {A:T; 2:T; 1:T; '11':T;}", errors: [ "Expected interface keys to be in insensitive descending order. '2' should be before '1'.", "Expected interface keys to be in insensitive descending order. 'A' should be before '2'.", ], - output: "interface U {A:T; 2:T; 1:T; '11':T;}", optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, { code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + output: "interface U {è:T; À:T; 'Z':T; '#':T;}", errors: [ "Expected interface keys to be in insensitive descending order. 'À' should be before '#'.", "Expected interface keys to be in insensitive descending order. 'è' should be before 'Z'.", ], - output: "interface U {è:T; À:T; 'Z':T; '#':T;}", optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, @@ -977,62 +1455,62 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'interface U {a:T; _:T; b:T;}', + output: 'interface U {b:T; _:T; a:T;}', errors: [ "Expected interface keys to be in natural descending order. 'b' should be before '_'.", ], - output: 'interface U {b:T; _:T; a:T;}', optionsSet: [[SortingOrder.Descending, { natural: true }]], }, { code: 'interface U {a:T; c:T; b:T;}', + output: 'interface U {c:T; a:T; b:T;}', errors: [ "Expected interface keys to be in natural descending order. 'c' should be before 'a'.", ], - output: 'interface U {c:T; a:T; b:T;}', optionsSet: [[SortingOrder.Descending, { natural: true }]], }, { code: 'interface U {b_:T; a:T; b:T;}', + output: 'interface U {b_:T; b:T; a:T;}', errors: [ "Expected interface keys to be in natural descending order. 'b' should be before 'a'.", ], - output: 'interface U {b_:T; b:T; a:T;}', optionsSet: [[SortingOrder.Descending, { natural: true }]], }, { code: 'interface U {b_:T; c:T; C:T;}', + output: 'interface U {c:T; b_:T; C:T;}', errors: [ "Expected interface keys to be in natural descending order. 'c' should be before 'b_'.", ], - output: 'interface U {c:T; b_:T; C:T;}', optionsSet: [[SortingOrder.Descending, { natural: true }]], }, { code: 'interface U {$:T; _:T; A:T; a:T;}', + output: 'interface U {a:T; _:T; A:T; $:T;}', errors: [ "Expected interface keys to be in natural descending order. '_' should be before '$'.", "Expected interface keys to be in natural descending order. 'A' should be before '_'.", "Expected interface keys to be in natural descending order. 'a' should be before 'A'.", ], - output: 'interface U {a:T; _:T; A:T; $:T;}', optionsSet: [[SortingOrder.Descending, { natural: true }]], }, { code: "interface U {1:T; 2:T; A:T; '11':T;}", + output: "interface U {A:T; 2:T; 1:T; '11':T;}", errors: [ "Expected interface keys to be in natural descending order. '2' should be before '1'.", "Expected interface keys to be in natural descending order. 'A' should be before '2'.", ], - output: "interface U {A:T; 2:T; 1:T; '11':T;}", optionsSet: [[SortingOrder.Descending, { natural: true }]], }, { code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + output: "interface U {è:T; À:T; 'Z':T; '#':T;}", errors: [ "Expected interface keys to be in natural descending order. 'À' should be before '#'.", "Expected interface keys to be in natural descending order. 'è' should be before 'Z'.", ], - output: "interface U {è:T; À:T; 'Z':T; '#':T;}", optionsSet: [[SortingOrder.Descending, { natural: true }]], }, @@ -1041,82 +1519,275 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'interface U {a:T; _:T; b:T;}', + output: 'interface U {b:T; _:T; a:T;}', errors: [ "Expected interface keys to be in natural insensitive descending order. 'b' should be before '_'.", ], - output: 'interface U {b:T; _:T; a:T;}', optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, { code: 'interface U {a:T; c:T; b:T;}', + output: 'interface U {c:T; a:T; b:T;}', errors: [ "Expected interface keys to be in natural insensitive descending order. 'c' should be before 'a'.", ], - output: 'interface U {c:T; a:T; b:T;}', optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, { code: 'interface U {b_:T; a:T; b:T;}', + output: 'interface U {b_:T; b:T; a:T;}', errors: [ "Expected interface keys to be in natural insensitive descending order. 'b' should be before 'a'.", ], - output: 'interface U {b_:T; b:T; a:T;}', optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, { code: 'interface U {b_:T; c:T; C:T;}', + output: 'interface U {c:T; b_:T; C:T;}', errors: [ "Expected interface keys to be in natural insensitive descending order. 'c' should be before 'b_'.", ], - output: 'interface U {c:T; b_:T; C:T;}', optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, { code: 'interface U {$:T; _:T; A:T; a:T;}', + output: 'interface U {A:T; _:T; $:T; a:T;}', errors: [ "Expected interface keys to be in natural insensitive descending order. '_' should be before '$'.", "Expected interface keys to be in natural insensitive descending order. 'A' should be before '_'.", ], - output: 'interface U {A:T; _:T; $:T; a:T;}', optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, { code: "interface U {1:T; 2:T; '11':T; A:T;}", + output: "interface U {A:T; 2:T; '11':T; 1:T;}", errors: [ "Expected interface keys to be in natural insensitive descending order. '2' should be before '1'.", "Expected interface keys to be in natural insensitive descending order. '11' should be before '2'.", "Expected interface keys to be in natural insensitive descending order. 'A' should be before '11'.", ], - output: "interface U {A:T; 2:T; '11':T; 1:T;}", optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, { code: "interface U {'#':T; À:T; 'Z':T; è:T;}", + output: "interface U {è:T; À:T; 'Z':T; '#':T;}", errors: [ "Expected interface keys to be in natural insensitive descending order. 'À' should be before '#'.", "Expected interface keys to be in natural insensitive descending order. 'è' should be before 'Z'.", ], - output: "interface U {è:T; À:T; 'Z':T; '#':T;}", optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, + /** + * desc, natural, insensitive, required + */ + { + code: 'interface U {_:T; a?:T; b:T;}', + output: 'interface U {b:T; a?:T; _:T;}', + errors: [ + "Expected interface keys to be in required first natural insensitive descending order. 'b' should be before 'a'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {b:T; a?:T; _:T;}', + output: 'interface U {b:T; _:T; a?:T;}', + errors: [ + "Expected interface keys to be in required first natural insensitive descending order. '_' should be before 'a'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {b:T; b_:T; a?:T;}', + output: 'interface U {b_:T; b:T; a?:T;}', + errors: [ + "Expected interface keys to be in required first natural insensitive descending order. 'b_' should be before 'b'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {c:T; b_?:T; C:T;}', + output: 'interface U {c:T; C:T; b_?:T;}', + errors: [ + "Expected interface keys to be in required first natural insensitive descending order. 'C' should be before 'b_'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {b_?:T; C:T; c:T;}', + output: 'interface U {C:T; b_?:T; c:T;}', + errors: [ + "Expected interface keys to be in required first natural insensitive descending order. 'C' should be before 'b_'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: 'interface U {_:T; a?:T; $:T; A?:T;}', + output: 'interface U {_:T; $:T; a?:T; A?:T;}', + errors: [ + "Expected interface keys to be in required first natural insensitive descending order. '$' should be before 'a'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: "interface U {2?:T; A:T; 1:T; '11':T;}", + output: "interface U {A:T; 2?:T; 1:T; '11':T;}", + errors: [ + "Expected interface keys to be in required first natural insensitive descending order. 'A' should be before '2'.", + "Expected interface keys to be in required first natural insensitive descending order. '11' should be before '1'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: "interface U {è:T; 'Z':T; '#'?:T; À?:T;}", + output: "interface U {è:T; 'Z':T; À?:T; '#'?:T;}", + errors: [ + "Expected interface keys to be in required first natural insensitive descending order. 'À' should be before '#'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + { + code: "interface U {À?:T; 'Z':T; '#'?:T; è:T;}", + output: "interface U {è:T; 'Z':T; '#'?:T; À?:T;}", + errors: [ + "Expected interface keys to be in required first natural insensitive descending order. 'Z' should be before 'À'.", + "Expected interface keys to be in required first natural insensitive descending order. 'è' should be before '#'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: true }], + ], + }, + + /** + * desc, natural, insensitive, not-required + */ + { + code: 'interface U {_:T; a?:T; b:T;}', + output: 'interface U {b:T; a?:T; _:T;}', + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'a' should be before '_'.", + "Expected interface keys to be in natural insensitive descending order. 'b' should be before 'a'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {a?:T; b:T; _:T;}', + output: 'interface U {b:T; a?:T; _:T;}', + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'b' should be before 'a'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {b:T; b_:T; a?:T;}', + output: 'interface U {b_:T; b:T; a?:T;}', + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'b_' should be before 'b'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {c:T; b_?:T; C:T;}', + output: 'interface U {c:T; C:T; b_?:T;}', + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'C' should be before 'b_'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {b_?:T; C:T; c:T;}', + output: 'interface U {C:T; b_?:T; c:T;}', + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'C' should be before 'b_'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: 'interface U {_:T; a?:T; $:T; A?:T;}', + output: 'interface U {a?:T; _:T; $:T; A?:T;}', + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'a' should be before '_'.", + "Expected interface keys to be in natural insensitive descending order. 'A' should be before '$'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: "interface U {2?:T; A:T; 1:T; '11':T;}", + output: "interface U {A:T; 2?:T; 1:T; '11':T;}", + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'A' should be before '2'.", + "Expected interface keys to be in natural insensitive descending order. '11' should be before '1'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: "interface U {è:T; 'Z':T; '#'?:T; À?:T;}", + output: "interface U {è:T; À?:T; '#'?:T; 'Z':T;}", + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'À' should be before '#'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + { + code: "interface U {À?:T; 'Z':T; '#'?:T; è:T;}", + output: "interface U {è:T; 'Z':T; '#'?:T; À?:T;}", + errors: [ + "Expected interface keys to be in natural insensitive descending order. 'è' should be before '#'.", + ], + optionsSet: [ + [SortingOrder.Descending, { natural: true, caseSensitive: false, requiredFirst: false }], + ], + }, + /** * index signatures */ { code: 'interface U { A: T; [skey: string]: T; _: T; }', + output: 'interface U { [skey: string]: T; A: T; _: T; }', errors: [ "Expected interface keys to be in ascending order. '[index: skey]' should be before 'A'.", ], - output: 'interface U { [skey: string]: T; A: T; _: T; }', optionsSet: [[SortingOrder.Ascending]], }, { code: 'interface U { _: T; [skey: string]: T; A: T; }', + output: 'interface U { _: T; A: T; [skey: string]: T; }', errors: [ "Expected interface keys to be in descending order. 'A' should be before '[index: skey]'.", ], - output: 'interface U { _: T; A: T; [skey: string]: T; }', optionsSet: [[SortingOrder.Descending]], }, ]; From 123113e7613ad768f7883a68350e099bdeaaac34 Mon Sep 17 00:00:00 2001 From: infctr Date: Thu, 21 May 2020 11:58:24 +0300 Subject: [PATCH 18/26] Bump dependencies --- package.json | 10 +++--- yarn.lock | 94 ++++++++++++++++++++++++++++------------------------ 2 files changed, 56 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index 6457381..b930b10 100644 --- a/package.json +++ b/package.json @@ -34,9 +34,9 @@ "@babel/preset-env": "~7.9.6", "@babel/preset-typescript": "~7.9.0", "@infctr/eslint-docs": "~0.4.0", - "@types/eslint": "~6.8.0", + "@types/eslint": "~6.8.1", "@types/eslint-plugin-prettier": "~3.1.0", - "@types/jest": "~25.2.1", + "@types/jest": "~25.2.3", "@types/natural-compare-lite": "~1.4.0", "@types/prettier": "~2.0.0", "@types/requireindex": "~1.2.0", @@ -51,18 +51,18 @@ "eslint-config-prettier": "~6.11.0", "eslint-plugin-eslint-plugin": "~2.2.1", "eslint-plugin-import": "~2.20.2", - "eslint-plugin-jest": "~23.11.0", + "eslint-plugin-jest": "~23.13.1", "eslint-plugin-prettier": "~3.1.3", "http-server": "~0.12.3", "husky": "~4.2.5", "jest": "~26.0.1", "jsonc": "~2.0.0", - "lint-staged": "~10.2.2", + "lint-staged": "~10.2.4", "prettier": "~2.0.5", "rimraf": "~3.0.2", "tmp": "~0.2.1", "tsconfig": "~7.0.0", - "typescript": "~3.9.2" + "typescript": "~3.9.3" }, "peerDependencies": { "@typescript-eslint/parser": "^1 || ^2", diff --git a/yarn.lock b/yarn.lock index d1aeec6..65178ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1221,7 +1221,7 @@ resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== -"@types/eslint@*", "@types/eslint@~6.8.0": +"@types/eslint@*": version "6.8.0" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-6.8.0.tgz#5f2289b9f01316da7cf31c9e63109a10602a23cb" integrity sha512-hqzmggoxkOubpgTdcOltkfc5N8IftRJqU70d1jbOISjjZVPvjcr+CLi2CI70hx1SUIRkLgpglTy9w28nGe2Hsw== @@ -1229,6 +1229,14 @@ "@types/estree" "*" "@types/json-schema" "*" +"@types/eslint@~6.8.1": + version "6.8.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-6.8.1.tgz#e26f365a5dda12445d1d5a17eb70efd7c844a3d8" + integrity sha512-eutiEpQ4SN7kdF8QVDPyiSSy7ZFM+werJVw6/mRxLGbG4oet6/p81WFjSIcuY9PzM+dsu25Yh5EAUmQ9aJC1gg== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + "@types/estree@*": version "0.0.44" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21" @@ -1275,10 +1283,10 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@~25.2.1": - version "25.2.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.1.tgz#9544cd438607955381c1bdbdb97767a249297db5" - integrity sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA== +"@types/jest@~25.2.3": + version "25.2.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.3.tgz#33d27e4c4716caae4eced355097a47ad363fdcaf" + integrity sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw== dependencies: jest-diff "^25.2.1" pretty-format "^25.2.1" @@ -2087,7 +2095,7 @@ commander@^4.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^5.0.0: +commander@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== @@ -2399,7 +2407,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enquirer@^2.3.4: +enquirer@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.5.tgz#3ab2b838df0a9d8ab9e7dff235b0e8712ef92381" integrity sha512-BNT1C08P9XD0vNg3J475yIUG+mVdp9T6towYFHUv897X0KoHBjB1shyrNmhmtHWKP17iSWgo7Gqh7BBuzLZMSA== @@ -2528,10 +2536,10 @@ eslint-plugin-import@~2.20.2: read-pkg-up "^2.0.0" resolve "^1.12.0" -eslint-plugin-jest@~23.11.0: - version "23.11.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.11.0.tgz#6e01d83ea74c1eefd60811655bbc288bd8ab2e7d" - integrity sha512-qedvh6mcMgoLFHjITtG40yKOCu5Fa1GMYesDOclU30ZvtVkf+DaH0fnCn1ysOX/QMdk2SGhQvxvYLowcLaM0GA== +eslint-plugin-jest@~23.13.1: + version "23.13.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.13.1.tgz#b2ce83f76064ad8ba1f1f26f322b86a86e44148e" + integrity sha512-TRLJH6M6EDvGocD98a7yVThrAOCK9WJfo9phuUb0MJptcrOYZeCKzC9aOzZCD93sxXCsiJVZywaTHdI/mAi0FQ== dependencies: "@typescript-eslint/experimental-utils" "^2.5.0" @@ -2675,7 +2683,7 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^4.0.0: +execa@^4.0.0, execa@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.1.tgz#988488781f1f0238cd156f7aaede11c3e853b4c1" integrity sha512-SCjM/zlBdOK8Q5TIjOn6iEHZaPHFsMoTxXQ2nvUvtPnuohz3H2dIozSg+etNR98dGoYUp2ENSKLL/XaMmbxVgw== @@ -4187,42 +4195,42 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -lint-staged@~10.2.2: - version "10.2.2" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.2.tgz#901403c120eb5d9443a0358b55038b04c8a7db9b" - integrity sha512-78kNqNdDeKrnqWsexAmkOU3Z5wi+1CsQmUmfCuYgMTE8E4rAIX8RHW7xgxwAZ+LAayb7Cca4uYX4P3LlevzjVg== +lint-staged@~10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.4.tgz#0ed5d1cf06bdac0d3fbb003931bb6df3771fbf42" + integrity sha512-doTMGKXQAT34c3S3gwDrTnXmCZp/z1/92D8suPqqh755sKPT18ew1NoPNHxJdrvv1D4WrJ7CEnx79Ns3EdEFbg== dependencies: chalk "^4.0.0" - commander "^5.0.0" + commander "^5.1.0" cosmiconfig "^6.0.0" debug "^4.1.1" dedent "^0.7.0" - execa "^4.0.0" - listr2 "1.3.8" - log-symbols "^3.0.0" + execa "^4.0.1" + listr2 "^2.0.2" + log-symbols "^4.0.0" micromatch "^4.0.2" normalize-path "^3.0.0" please-upgrade-node "^3.2.0" string-argv "0.3.1" stringify-object "^3.3.0" -listr2@1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-1.3.8.tgz#30924d79de1e936d8c40af54b6465cb814a9c828" - integrity sha512-iRDRVTgSDz44tBeBBg/35TQz4W+EZBWsDUq7hPpqeUHm7yLPNll0rkwW3lIX9cPAK7l+x95mGWLpxjqxftNfZA== +listr2@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.0.4.tgz#b39100b0a227ec5659dcf76ddc516211fc168d61" + integrity sha512-oJaAcplPsa72rKW0eg4P4LbEJjhH+UO2I8uqR/I2wzHrVg16ohSfUy0SlcHS21zfYXxtsUpL8YXGHjyfWMR0cg== dependencies: "@samverschueren/stream-to-observable" "^0.3.0" - chalk "^3.0.0" + chalk "^4.0.0" cli-cursor "^3.1.0" cli-truncate "^2.1.0" elegant-spinner "^2.0.0" - enquirer "^2.3.4" + enquirer "^2.3.5" figures "^3.2.0" indent-string "^4.0.0" log-update "^4.0.0" p-map "^4.0.0" pad "^3.2.0" - rxjs "^6.3.3" + rxjs "^6.5.5" through "^2.3.8" uuid "^7.0.2" @@ -4291,12 +4299,12 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -log-symbols@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== +log-symbols@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== dependencies: - chalk "^2.4.2" + chalk "^4.0.0" log-update@^4.0.0: version "4.0.0" @@ -5384,13 +5392,6 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" -rxjs@^6.3.3: - version "6.3.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" - integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== - dependencies: - tslib "^1.9.0" - rxjs@^6.4.0: version "6.5.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" @@ -5398,6 +5399,13 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" +rxjs@^6.5.5: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== + dependencies: + tslib "^1.9.0" + safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" @@ -6107,10 +6115,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@~3.9.2: - version "3.9.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.2.tgz#64e9c8e9be6ea583c54607677dd4680a1cf35db9" - integrity sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw== +typescript@~3.9.3: + version "3.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" + integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" From e8bcac56fe2a74a120fd555218e36912562b13ff Mon Sep 17 00:00:00 2001 From: infctr Date: Thu, 21 May 2020 12:38:49 +0300 Subject: [PATCH 19/26] Update tests setup --- tests/rules/string-enum.spec.ts | 164 ++++++++++++++++---------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/tests/rules/string-enum.spec.ts b/tests/rules/string-enum.spec.ts index c3421cd..d038a6b 100644 --- a/tests/rules/string-enum.spec.ts +++ b/tests/rules/string-enum.spec.ts @@ -336,8 +336,8 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'enum U {a="a", _="b", b="c"}', - errors: ["Expected string enum members to be in ascending order. '_' should be before 'a'."], output: 'enum U {_="b", a="a", b="c"}', + errors: ["Expected string enum members to be in ascending order. '_' should be before 'a'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -348,8 +348,8 @@ const invalid: readonly InvalidTestCase[] = [ }, { code: 'enum U {a="T", c="T", b="T"}', - errors: ["Expected string enum members to be in ascending order. 'b' should be before 'c'."], output: 'enum U {a="T", b="T", c="T"}', + errors: ["Expected string enum members to be in ascending order. 'b' should be before 'c'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -360,8 +360,8 @@ const invalid: readonly InvalidTestCase[] = [ }, { code: 'enum U {b_="T", a="T", b="T"}', - errors: ["Expected string enum members to be in ascending order. 'a' should be before 'b_'."], output: 'enum U {a="T", b_="T", b="T"}', + errors: ["Expected string enum members to be in ascending order. 'a' should be before 'b_'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -372,8 +372,8 @@ const invalid: readonly InvalidTestCase[] = [ }, { code: 'enum U {b_="T", c="T", C="T"}', - errors: ["Expected string enum members to be in ascending order. 'C' should be before 'c'."], output: 'enum U {C="T", c="T", b_="T",}', + errors: ["Expected string enum members to be in ascending order. 'C' should be before 'c'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -384,8 +384,8 @@ const invalid: readonly InvalidTestCase[] = [ }, { code: 'enum U {$="T", _="T", A="T", a="T"}', - errors: ["Expected string enum members to be in ascending order. 'A' should be before '_'."], output: 'enum U {$="T", A="T", _="T", a="T"}', + errors: ["Expected string enum members to be in ascending order. 'A' should be before '_'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -396,8 +396,8 @@ const invalid: readonly InvalidTestCase[] = [ }, { code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - errors: ["Expected string enum members to be in ascending order. 'Z' should be before 'À'."], output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", + errors: ["Expected string enum members to be in ascending order. 'Z' should be before 'À'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -412,8 +412,8 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'enum U {a="T", b="T", ["aa"]="T", c="T"}', - errors: ["Expected string enum members to be in ascending order. 'aa' should be before 'b'."], output: 'enum U {a="T", ["aa"]="T", b="T", c="T"}', + errors: ["Expected string enum members to be in ascending order. 'aa' should be before 'b'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -428,8 +428,8 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'enum U {a="T", _="T", b="T"}', - errors: ["Expected string enum members to be in ascending order. '_' should be before 'a'."], output: 'enum U {_="T", a="T", b="T"}', + errors: ["Expected string enum members to be in ascending order. '_' should be before 'a'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -440,8 +440,8 @@ const invalid: readonly InvalidTestCase[] = [ }, { code: 'enum U {a="T", c="T", b="T"}', - errors: ["Expected string enum members to be in ascending order. 'b' should be before 'c'."], output: 'enum U {a="T", b="T", c="T"}', + errors: ["Expected string enum members to be in ascending order. 'b' should be before 'c'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -452,8 +452,8 @@ const invalid: readonly InvalidTestCase[] = [ }, { code: 'enum U {b_="T", a="T", b="T"}', - errors: ["Expected string enum members to be in ascending order. 'a' should be before 'b_'."], output: 'enum U {a="T", b_="T", b="T"}', + errors: ["Expected string enum members to be in ascending order. 'a' should be before 'b_'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -464,8 +464,8 @@ const invalid: readonly InvalidTestCase[] = [ }, { code: 'enum U {b_="T", c="T", C="T"}', - errors: ["Expected string enum members to be in ascending order. 'C' should be before 'c'."], output: 'enum U {C="T", c="T", b_="T",}', + errors: ["Expected string enum members to be in ascending order. 'C' should be before 'c'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -476,8 +476,8 @@ const invalid: readonly InvalidTestCase[] = [ }, { code: 'enum U {$="T", _="T", A="T", a="T"}', - errors: ["Expected string enum members to be in ascending order. 'A' should be before '_'."], output: 'enum U {$="T", A="T", _="T", a="T"}', + errors: ["Expected string enum members to be in ascending order. 'A' should be before '_'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -488,8 +488,8 @@ const invalid: readonly InvalidTestCase[] = [ }, { code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - errors: ["Expected string enum members to be in ascending order. 'Z' should be before 'À'."], output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", + errors: ["Expected string enum members to be in ascending order. 'Z' should be before 'À'."], optionsSet: [ [], [SortingOrder.Ascending], @@ -504,42 +504,42 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'enum U {a="T", _="T", b="T"}', + output: 'enum U {_="T", a="T", b="T"}', errors: [ "Expected string enum members to be in insensitive ascending order. '_' should be before 'a'.", ], - output: 'enum U {_="T", a="T", b="T"}', optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], }, { code: 'enum U {a="T", c="T", b="T"}', + output: 'enum U {a="T", b="T", c="T"}', errors: [ "Expected string enum members to be in insensitive ascending order. 'b' should be before 'c'.", ], - output: 'enum U {a="T", b="T", c="T"}', optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], }, { code: 'enum U {b_="T", a="T", b="T"}', + output: 'enum U {a="T", b_="T", b="T"}', errors: [ "Expected string enum members to be in insensitive ascending order. 'a' should be before 'b_'.", ], - output: 'enum U {a="T", b_="T", b="T"}', optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], }, { code: 'enum U {$="T", A="T", _="T", a="T"}', + output: 'enum U {$="T", _="T", A="T", a="T"}', errors: [ "Expected string enum members to be in insensitive ascending order. '_' should be before 'A'.", ], - output: 'enum U {$="T", _="T", A="T", a="T"}', optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], }, { code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", + output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", errors: [ "Expected string enum members to be in insensitive ascending order. 'Z' should be before 'À'.", ], - output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", optionsSet: [[SortingOrder.Ascending, { caseSensitive: false }]], }, @@ -548,50 +548,50 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'enum U {a="T", _="T", b="T"}', + output: 'enum U {_="T", a="T", b="T"}', errors: [ "Expected string enum members to be in natural ascending order. '_' should be before 'a'.", ], - output: 'enum U {_="T", a="T", b="T"}', optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, { code: 'enum U {a="T", c="T", b="T"}', + output: 'enum U {a="T", b="T", c="T"}', errors: [ "Expected string enum members to be in natural ascending order. 'b' should be before 'c'.", ], - output: 'enum U {a="T", b="T", c="T"}', optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, { code: 'enum U {b_="T", a="T", b="T"}', + output: 'enum U {a="T", b_="T", b="T"}', errors: [ "Expected string enum members to be in natural ascending order. 'a' should be before 'b_'.", ], - output: 'enum U {a="T", b_="T", b="T"}', optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, { code: 'enum U {b_="T", c="T", C="T"}', + output: 'enum U {C="T", c="T", b_="T",}', errors: [ "Expected string enum members to be in natural ascending order. 'C' should be before 'c'.", ], - output: 'enum U {C="T", c="T", b_="T",}', optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, { code: 'enum U {$="T", A="T", _="T", a="T"}', + output: 'enum U {$="T", _="T", A="T", a="T"}', errors: [ "Expected string enum members to be in natural ascending order. '_' should be before 'A'.", ], - output: 'enum U {$="T", _="T", A="T", a="T"}', optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, { code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", + output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", errors: [ "Expected string enum members to be in natural ascending order. 'Z' should be before 'À'.", ], - output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", optionsSet: [[SortingOrder.Ascending, { natural: true }]], }, @@ -600,43 +600,43 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'enum U {a="T", _="T", b="T"}', - optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + output: 'enum U {_="T", a="T", b="T"}', errors: [ "Expected string enum members to be in natural insensitive ascending order. '_' should be before 'a'.", ], - output: 'enum U {_="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], }, { code: 'enum U {a="T", c="T", b="T"}', - optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + output: 'enum U {a="T", b="T", c="T"}', errors: [ "Expected string enum members to be in natural insensitive ascending order. 'b' should be before 'c'.", ], - output: 'enum U {a="T", b="T", c="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], }, { code: 'enum U {b_="T", a="T", b="T"}', - optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + output: 'enum U {a="T", b_="T", b="T"}', errors: [ "Expected string enum members to be in natural insensitive ascending order. 'a' should be before 'b_'.", ], - output: 'enum U {a="T", b_="T", b="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], }, { code: 'enum U {$="T", A="T", _="T", a="T"}', - optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + output: 'enum U {$="T", _="T", A="T", a="T"}', errors: [ "Expected string enum members to be in natural insensitive ascending order. '_' should be before 'A'.", ], - output: 'enum U {$="T", _="T", A="T", a="T"}', + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], }, { code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], + output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", errors: [ "Expected string enum members to be in natural insensitive ascending order. 'Z' should be before 'À'.", ], - output: "enum U {'#'='T', 'Z'='T', À='T', è='T'}", + optionsSet: [[SortingOrder.Ascending, { natural: true, caseSensitive: false }]], }, /** @@ -644,45 +644,45 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'enum U {a="T", _="T", b="T"}', - optionsSet: [[SortingOrder.Descending]], - errors: ["Expected string enum members to be in descending order. 'b' should be before '_'."], output: 'enum U {b="T", _="T", a="T",}', + errors: ["Expected string enum members to be in descending order. 'b' should be before '_'."], + optionsSet: [[SortingOrder.Descending]], }, { code: 'enum U {a="T", c="T", b="T"}', - optionsSet: [[SortingOrder.Descending]], - errors: ["Expected string enum members to be in descending order. 'c' should be before 'a'."], output: 'enum U {c="T", a="T", b="T"}', + errors: ["Expected string enum members to be in descending order. 'c' should be before 'a'."], + optionsSet: [[SortingOrder.Descending]], }, { code: 'enum U {b_="T", a="T", b="T"}', - optionsSet: [[SortingOrder.Descending]], - errors: ["Expected string enum members to be in descending order. 'b' should be before 'a'."], output: 'enum U {b_="T", b="T", a="T"}', + errors: ["Expected string enum members to be in descending order. 'b' should be before 'a'."], + optionsSet: [[SortingOrder.Descending]], }, { code: 'enum U {b_="T", c="T", C="T"}', - optionsSet: [[SortingOrder.Descending]], - errors: ["Expected string enum members to be in descending order. 'c' should be before 'b_'."], output: 'enum U {c="T", b_="T", C="T"}', + errors: ["Expected string enum members to be in descending order. 'c' should be before 'b_'."], + optionsSet: [[SortingOrder.Descending]], }, { code: 'enum U {$="T", _="T", A="T", a="T"}', - optionsSet: [[SortingOrder.Descending]], + output: 'enum U {a="T", _="T", A="T", $="T"}', errors: [ "Expected string enum members to be in descending order. '_' should be before '$'.", "Expected string enum members to be in descending order. 'a' should be before 'A'.", ], - output: 'enum U {a="T", _="T", A="T", $="T"}', + optionsSet: [[SortingOrder.Descending]], }, { code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - optionsSet: [[SortingOrder.Descending]], + output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", errors: [ "Expected string enum members to be in descending order. 'À' should be before '#'.", "Expected string enum members to be in descending order. 'è' should be before 'Z'.", ], - output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", + optionsSet: [[SortingOrder.Descending]], }, /** @@ -690,53 +690,53 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'enum U {a="T", _="T", b="T"}', - optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + output: 'enum U {b="T", _="T", a="T",}', errors: [ "Expected string enum members to be in insensitive descending order. 'b' should be before '_'.", ], - output: 'enum U {b="T", _="T", a="T",}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, { code: 'enum U {a="T", c="T", b="T"}', - optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + output: 'enum U {c="T", a="T", b="T"}', errors: [ "Expected string enum members to be in insensitive descending order. 'c' should be before 'a'.", ], - output: 'enum U {c="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, { code: 'enum U {b_="T", a="T", b="T"}', - optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + output: 'enum U {b_="T", b="T", a="T"}', errors: [ "Expected string enum members to be in insensitive descending order. 'b' should be before 'a'.", ], - output: 'enum U {b_="T", b="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, { code: 'enum U {b_="T", c="T", C="T"}', - optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + output: 'enum U {c="T", b_="T", C="T"}', errors: [ "Expected string enum members to be in insensitive descending order. 'c' should be before 'b_'.", ], - output: 'enum U {c="T", b_="T", C="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, { code: 'enum U {$="T", _="T", A="T", a="T"}', - optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + output: 'enum U {A="T", _="T", $="T", a="T"}', errors: [ "Expected string enum members to be in insensitive descending order. '_' should be before '$'.", "Expected string enum members to be in insensitive descending order. 'A' should be before '_'.", ], - output: 'enum U {A="T", _="T", $="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, { code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], + output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", errors: [ "Expected string enum members to be in insensitive descending order. 'À' should be before '#'.", "Expected string enum members to be in insensitive descending order. 'è' should be before 'Z'.", ], - output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", + optionsSet: [[SortingOrder.Descending, { caseSensitive: false }]], }, /** @@ -744,54 +744,54 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'enum U {a="T", _="T", b="T"}', - optionsSet: [[SortingOrder.Descending, { natural: true }]], + output: 'enum U {b="T", _="T", a="T",}', errors: [ "Expected string enum members to be in natural descending order. 'b' should be before '_'.", ], - output: 'enum U {b="T", _="T", a="T",}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], }, { code: 'enum U {a="T", c="T", b="T"}', - optionsSet: [[SortingOrder.Descending, { natural: true }]], + output: 'enum U {c="T", a="T", b="T"}', errors: [ "Expected string enum members to be in natural descending order. 'c' should be before 'a'.", ], - output: 'enum U {c="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], }, { code: 'enum U {b_="T", a="T", b="T"}', - optionsSet: [[SortingOrder.Descending, { natural: true }]], + output: 'enum U {b_="T", b="T", a="T"}', errors: [ "Expected string enum members to be in natural descending order. 'b' should be before 'a'.", ], - output: 'enum U {b_="T", b="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], }, { code: 'enum U {b_="T", c="T", C="T"}', - optionsSet: [[SortingOrder.Descending, { natural: true }]], + output: 'enum U {c="T", b_="T", C="T"}', errors: [ "Expected string enum members to be in natural descending order. 'c' should be before 'b_'.", ], - output: 'enum U {c="T", b_="T", C="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], }, { code: 'enum U {$="T", _="T", A="T", a="T"}', - optionsSet: [[SortingOrder.Descending, { natural: true }]], + output: 'enum U {a="T", _="T", A="T", $="T"}', errors: [ "Expected string enum members to be in natural descending order. '_' should be before '$'.", "Expected string enum members to be in natural descending order. 'A' should be before '_'.", "Expected string enum members to be in natural descending order. 'a' should be before 'A'.", ], - output: 'enum U {a="T", _="T", A="T", $="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true }]], }, { code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - optionsSet: [[SortingOrder.Descending, { natural: true }]], + output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", errors: [ "Expected string enum members to be in natural descending order. 'À' should be before '#'.", "Expected string enum members to be in natural descending order. 'è' should be before 'Z'.", ], - output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", + optionsSet: [[SortingOrder.Descending, { natural: true }]], }, /** @@ -799,53 +799,53 @@ const invalid: readonly InvalidTestCase[] = [ */ { code: 'enum U {a="T", _="T", b="T"}', - optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + output: 'enum U {b="T", _="T", a="T",}', errors: [ "Expected string enum members to be in natural insensitive descending order. 'b' should be before '_'.", ], - output: 'enum U {b="T", _="T", a="T",}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, { code: 'enum U {a="T", c="T", b="T"}', - optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + output: 'enum U {c="T", a="T", b="T"}', errors: [ "Expected string enum members to be in natural insensitive descending order. 'c' should be before 'a'.", ], - output: 'enum U {c="T", a="T", b="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, { code: 'enum U {b_="T", a="T", b="T"}', - optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + output: 'enum U {b_="T", b="T", a="T"}', errors: [ "Expected string enum members to be in natural insensitive descending order. 'b' should be before 'a'.", ], - output: 'enum U {b_="T", b="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, { code: 'enum U {b_="T", c="T", C="T"}', - optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + output: 'enum U {c="T", b_="T", C="T"}', errors: [ "Expected string enum members to be in natural insensitive descending order. 'c' should be before 'b_'.", ], - output: 'enum U {c="T", b_="T", C="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, { code: 'enum U {$="T", _="T", A="T", a="T"}', - optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + output: 'enum U {A="T", _="T", $="T", a="T"}', errors: [ "Expected string enum members to be in natural insensitive descending order. '_' should be before '$'.", "Expected string enum members to be in natural insensitive descending order. 'A' should be before '_'.", ], - output: 'enum U {A="T", _="T", $="T", a="T"}', + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, { code: "enum U {'#'='T', À='T', 'Z'='T', è='T'}", - optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], + output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", errors: [ "Expected string enum members to be in natural insensitive descending order. 'À' should be before '#'.", "Expected string enum members to be in natural insensitive descending order. 'è' should be before 'Z'.", ], - output: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", + optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, ]; From 4b61b4e97d090239480dd2aa583675bfb0475cde Mon Sep 17 00:00:00 2001 From: infctr Date: Thu, 21 May 2020 23:23:40 +0300 Subject: [PATCH 20/26] Add rollup bundler --- .npmignore | 3 - babel.config.js | 29 --------- package.json | 26 +++++++- rollup.config.js | 37 +++++++++++ tsconfig.build.json | 4 -- tsconfig.json | 6 +- yarn.lock | 146 +++++++++++++++++++++++++++++++++++++++++--- 7 files changed, 202 insertions(+), 49 deletions(-) delete mode 100644 .npmignore create mode 100644 rollup.config.js delete mode 100644 tsconfig.build.json diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 5784eab..0000000 --- a/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -* -!lib/** -!config/** diff --git a/babel.config.js b/babel.config.js index ab5c600..8165fe4 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,35 +1,6 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const tsconfig = require('tsconfig'); -const fs = require('fs'); -const assert = require('assert'); - -const isTest = process.env.NODE_ENV === 'test'; -const filePath = tsconfig.resolveSync('.'); - -assert(filePath); - -// @ts-ignore -const config = tsconfig.readFileSync(filePath); -const baseUrl = config.compilerOptions.baseUrl; - -const moduleMappings = fs - .readdirSync(baseUrl, { withFileTypes: true }) - .filter(dirent => dirent.isDirectory()) - .map(dirent => dirent.name) - .reduce((memo, dir) => ({ ...memo, [dir]: ['./src/', dir].join('') }), {}); - module.exports = { presets: [ ['@babel/preset-env', { targets: { node: 'current' } }], '@babel/preset-typescript', ], - plugins: [ - !isTest && [ - 'module-resolver', - { - root: ['./src'], - alias: moduleMappings, - }, - ], - ].filter(Boolean), }; diff --git a/package.json b/package.json index 10ba337..2dc0179 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,22 @@ "typescript" ], "author": "infctr ", - "main": "dist/index.js", + "main": "lib/index.cjs.js", + "module": "lib/index.esm.js", "repository": "git@github.com:infctr/eslint-plugin-typescript-sort-keys.git", "url": "https://github.com/infctr/eslint-plugin-typescript-sort-keys", + "files": [ + "/lib", + "package.json", + "CHANGELOG.md", + "LICENSE.md", + "README.md" + ], + "exports": { + "import": "lib/index.esm.js", + "require": "lib/index.cjs.js", + "default": "lib/index.cjs.js" + }, "scripts": { "build": "yarn rimraf lib && yarn compile", "compile": "yarn rollup -c", @@ -26,6 +39,7 @@ "verify": "yarn type-check && yarn lint && yarn build && yarn test" }, "dependencies": { + "@typescript-eslint/experimental-utils": "~2.32.0", "natural-compare-lite": "~1.4.0" }, "devDependencies": { @@ -34,16 +48,21 @@ "@babel/preset-env": "~7.9.6", "@babel/preset-typescript": "~7.9.0", "@infctr/eslint-docs": "~0.4.0", + "@rollup/plugin-commonjs": "~12.0.0", + "@rollup/plugin-json": "~4.0.3", + "@rollup/plugin-node-resolve": "~8.0.0", + "@rollup/plugin-typescript": "~4.1.2", + "@types/babel__core": "~7.1.7", + "@types/babel__preset-env": "~7.9.0", "@types/eslint": "~6.8.1", "@types/eslint-plugin-prettier": "~3.1.0", + "@types/http-server": "~0.10.0", "@types/jest": "~25.2.3", "@types/natural-compare-lite": "~1.4.0", "@types/prettier": "~2.0.0", - "@types/requireindex": "~1.2.0", "@types/rimraf": "~3.0.0", "@types/tmp": "~0.2.0", "@typescript-eslint/eslint-plugin": "~2.32.0", - "@typescript-eslint/experimental-utils": "~2.32.0", "@typescript-eslint/parser": "~2.32.0", "babel-jest": "~26.0.1", "babel-plugin-module-resolver": "~4.0.0", @@ -60,6 +79,7 @@ "lint-staged": "~10.2.4", "prettier": "~2.0.5", "rimraf": "~3.0.2", + "rollup": "~2.10.5", "tmp": "~0.2.1", "tsconfig": "~7.0.0", "typescript": "~3.9.3" diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..b5089e9 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,37 @@ +import commonjs from '@rollup/plugin-commonjs'; +import resolve from '@rollup/plugin-node-resolve'; +import typescript from '@rollup/plugin-typescript'; +import json from '@rollup/plugin-json'; +import tsconfig from 'tsconfig'; +import fs from 'fs'; +import assert from 'assert'; + +const filePath = tsconfig.resolveSync('.'); + +assert(filePath); + +const config = tsconfig.readFileSync(filePath); +const baseUrl = config.compilerOptions.baseUrl; + +const moduleMappings = fs + .readdirSync(baseUrl, { withFileTypes: true }) + .filter(dir => dir.isDirectory()) + .map(dir => [dir.name, '/'].join('')); + +const external = id => + !id.startsWith('.') && + !id.startsWith('/') && + !id.startsWith('\0') && + !moduleMappings.some(mapping => id.startsWith(mapping)); + +export default [ + { + input: './src/index.ts', + external, + output: [ + { dir: 'lib', entryFileNames: '[name].cjs.js', format: 'cjs' }, + { dir: 'lib', entryFileNames: '[name].esm.js', format: 'es' }, + ], + plugins: [commonjs(), resolve(), typescript(), json()], + }, +]; diff --git a/tsconfig.build.json b/tsconfig.build.json deleted file mode 100644 index b90fc83..0000000 --- a/tsconfig.build.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "./tsconfig.json", - "include": ["src"] -} diff --git a/tsconfig.json b/tsconfig.json index d8181a4..c367e26 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,16 +3,16 @@ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ "target": "ES6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, - "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, + "module": "esnext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, "lib": ["ESNext"] /* Specify library files to be included in the compilation. */, "allowJs": true /* Allow javascript files to be compiled. */, "checkJs": false /* Report errors in .js files. */, // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true /* Generates corresponding '.d.ts' file. */, + // "declaration": true /* Generates corresponding '.d.ts' file. */, // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ "sourceMap": true /* Generates corresponding '.map' file. */, // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "build" /* Redirect output structure to the directory. */, + "outDir": "lib" /* Redirect output structure to the directory. */, // "rootDir": "src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, // "composite": true, /* Enable project compilation */ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ diff --git a/yarn.lock b/yarn.lock index 65178ba..03cf061 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1150,6 +1150,56 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@rollup/plugin-commonjs@~12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-12.0.0.tgz#e2f308ae6057499e0f413f878fff7c3a0fdc02a1" + integrity sha512-8+mDQt1QUmN+4Y9D3yCG8AJNewuTSLYPJVzKKUZ+lGeQrI+bV12Tc5HCyt2WdlnG6ihIL/DPbKRJlB40DX40mw== + dependencies: + "@rollup/pluginutils" "^3.0.8" + commondir "^1.0.1" + estree-walker "^1.0.1" + glob "^7.1.2" + is-reference "^1.1.2" + magic-string "^0.25.2" + resolve "^1.11.0" + +"@rollup/plugin-json@~4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.0.3.tgz#747e2c2884c5a0fa00b66c9c0f3f1012cddca534" + integrity sha512-QMUT0HZNf4CX17LMdwaslzlYHUKTYGuuk34yYIgZrNdu+pMEfqMS55gck7HEeHBKXHM4cz5Dg1OVwythDdbbuQ== + dependencies: + "@rollup/pluginutils" "^3.0.8" + +"@rollup/plugin-node-resolve@~8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.0.0.tgz#47cc0775e31b6a531c88a40270377fe899a271cb" + integrity sha512-5poJCChrkVggXXND/sQ7yNqwjUNT4fP31gpRWCnSNnlXuUXTCMHT33xZrTGxgjm5Rl18MHj7iEzlCT8rYWwQSA== + dependencies: + "@rollup/pluginutils" "^3.0.8" + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + deep-freeze "^0.0.1" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.14.2" + +"@rollup/plugin-typescript@~4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-4.1.2.tgz#6f910430276ae3e53a47a12ad65820627e7b6ad9" + integrity sha512-+7UlGat/99e2JbmGNnIauxwEhYLwrL7adO/tSJxUN57xrrS3Ps+ZzYpLCDGPZJ57j+ZJTZLLN89KXW9JMEB+jg== + dependencies: + "@rollup/pluginutils" "^3.0.1" + resolve "^1.14.1" + +"@rollup/pluginutils@^3.0.1", "@rollup/pluginutils@^3.0.8": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.0.10.tgz#a659b9025920378494cd8f8c59fbf9b3a50d5f12" + integrity sha512-d44M7t+PjmMrASHbhgpSbVgtL6EFyX7J4mYxwQ/c5eoaE6N2VgCgEcWVzNnwycIloti+/MpwFr8qfw+nRw00sw== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" @@ -1171,7 +1221,7 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@types/babel__core@^7.1.7": +"@types/babel__core@^7.1.7", "@types/babel__core@~7.1.7": version "7.1.7" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== @@ -1189,6 +1239,11 @@ dependencies: "@babel/types" "^7.0.0" +"@types/babel__preset-env@~7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@types/babel__preset-env/-/babel__preset-env-7.9.0.tgz#9498eeb833ce9bd8324dd8a26a45886bc4426aa8" + integrity sha512-0W1P7wGyx1dSYFtwUoqc7IbtB50brA249GdfhwHbnPbrHM/aOM1NIMbzp290DaCowSnnRNnpMR8O4HU4dxYx0Q== + "@types/babel__template@*": version "7.0.2" resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" @@ -1209,6 +1264,13 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/connect@*": + version "3.4.33" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" + integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== + dependencies: + "@types/node" "*" + "@types/eslint-plugin-prettier@~3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@types/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz#451b5e1e5f148a38dc41e9c5b61d45cd2e97af2c" @@ -1242,6 +1304,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21" integrity sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g== +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -1263,6 +1330,13 @@ dependencies: "@types/node" "*" +"@types/http-server@~0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@types/http-server/-/http-server-0.10.0.tgz#f5fe4a136ac4b2e5b5c25d017bb79310eafe5ece" + integrity sha512-bpuBiQM3GBd89Abzp/Spktt/ZIVSR8ccNBJgqUHf5KNow80t4ZFXfvTxzd96uHrwQQngbTqMulQPWbuFczYdfg== + dependencies: + "@types/connect" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -1331,10 +1405,12 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.0.tgz#dc85454b953178cc6043df5208b9e949b54a3bc4" integrity sha512-/rM+sWiuOZ5dvuVzV37sUuklsbg+JPOP8d+nNFlo2ZtfpzPiPvh1/gc8liWOLBqe+sR+ZM7guPaIcTt6UZTo7Q== -"@types/requireindex@~1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@types/requireindex/-/requireindex-1.2.0.tgz#b31ed3719fe0a5824fef9a3165f7743560d26bd5" - integrity sha512-XgAXuN2bI/w2kAN6jwhb5jrrSznOsded+Fz5YC+3Vs3f8UyE3d8FnTvIWe6shZdpz9NMHY/wtEWk17yL0hCSmg== +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" "@types/rimraf@~3.0.0": version "3.0.0" @@ -1861,6 +1937,11 @@ builtin-modules@^1.0.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= +builtin-modules@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" + integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -2100,6 +2181,11 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + compare-versions@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" @@ -2264,6 +2350,11 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +deep-freeze@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" + integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ= + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -2655,6 +2746,11 @@ estraverse@^5.1.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -2968,6 +3064,11 @@ fsevents@^2.1.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -3483,6 +3584,11 @@ is-glob@^4.0.1: dependencies: is-extglob "^2.1.1" +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -3517,6 +3623,13 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= +is-reference@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.4.tgz#3f95849886ddb70256a3e6d062b1a68c13c51427" + integrity sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw== + dependencies: + "@types/estree" "0.0.39" + is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -4323,6 +4436,13 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +magic-string@^0.25.2: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -4909,7 +5029,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.5: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -5324,7 +5444,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0: +resolve@^1.10.0, resolve@^1.11.0, resolve@^1.13.1, resolve@^1.14.1, resolve@^1.14.2, resolve@^1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -5380,6 +5500,13 @@ rimraf@^3.0.0, rimraf@~3.0.2: dependencies: glob "^7.1.3" +rollup@~2.10.5: + version "2.10.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.10.5.tgz#a2e6735fbcbd64453f8aa5d7b5ec1b421974f92c" + integrity sha512-05WRM/tjmPYwhOBvm/G9Qwa/HnAqn0TK0XxLDLQzoM4XdSmKjPBvhBl+U+Q/C6VJsucljyTQjGkZD503mjbPQg== + optionalDependencies: + fsevents "~2.1.2" + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -5655,6 +5782,11 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + spdx-correct@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" From 5229f29c355b5042ee5e1757b5a8b83817222953 Mon Sep 17 00:00:00 2001 From: infctr Date: Fri, 22 May 2020 00:03:56 +0300 Subject: [PATCH 21/26] Update github actions --- .github/workflows/publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a0dc4d2..a51319a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -28,6 +28,7 @@ jobs: node-version: 12 registry-url: https://registry.npmjs.org/ - run: yarn + - run: yarn compile - run: npm publish env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} From ae070b85624352a02b3f4144de298f5a9278fa45 Mon Sep 17 00:00:00 2001 From: infctr Date: Fri, 22 May 2020 00:05:15 +0300 Subject: [PATCH 22/26] Update changelog --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9b92d2..c41f6b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.0.0] + +### Changed + +- Rewrite to typescript with strong types +- Leverage helpers and types from @typescript-eslint/experimental-utils +- Run autofix tests with ESLint Class rather than spawn a child process for eslint runner +- Heavy refactoring and remove code paths that were never taken +- Update ESLint config +- Update to ESLint v7.0.0 +- Update dependencies + +### Added + +- Follow semver +- Rollup bundler + ## [0.10.0] - 2020-05-21 ### Added From b15daed4fa14df7918dac8d0836c8c1118a181b7 Mon Sep 17 00:00:00 2001 From: infctr Date: Fri, 22 May 2020 00:39:04 +0300 Subject: [PATCH 23/26] Update readme --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 6da3d4c..50b0e1a 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,14 @@ Then configure the rules you want to use under the rules section. } ``` +Or enable all rules with defaults + +```json +{ + "extends": ["plugin:typescript-sort-keys/recommended"] +} +``` + ## Supported Rules From 3e243ed7d1db1e6aee10fbfc99949fd86cf81b65 Mon Sep 17 00:00:00 2001 From: infctr Date: Fri, 22 May 2020 10:39:06 +0300 Subject: [PATCH 24/26] Update scripts tasks --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2dc0179..30c2c80 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ "test": "yarn jest --watch", "coverage": "yarn test --coverage --watchAll=false", "coverage-preview": "http-server -o -p 5000 coverage/lcov-report", - "type-check": "tsc --noEmit --project ./tsconfig.build.json", - "verify": "yarn type-check && yarn lint && yarn build && yarn test" + "type-check": "tsc --noEmit --skipLibCheck", + "verify": "yarn type-check && yarn lint && yarn build && yarn coverage" }, "dependencies": { "@typescript-eslint/experimental-utils": "~2.32.0", From 8a96d5b78ef920812932704edea5bbb353ba8169 Mon Sep 17 00:00:00 2001 From: infctr Date: Fri, 22 May 2020 10:54:30 +0300 Subject: [PATCH 25/26] Prettier no-semi --- .eslintrc.js | 2 +- .huskyrc.js | 2 +- .prettierrc.js | 3 +- babel.config.js | 2 +- docs/rules/interface.md | 192 ++++++++++++++++---------------- docs/rules/string-enum.md | 6 +- jest.config.js | 2 +- lint-staged.config.js | 2 +- rollup.config.js | 28 ++--- src/common/options.ts | 18 +-- src/config/recommended.ts | 2 +- src/index.ts | 8 +- src/rules/index.ts | 6 +- src/rules/interface.ts | 40 +++---- src/rules/string-enum.ts | 40 +++---- src/utils/ast.ts | 32 +++--- src/utils/common.ts | 6 +- src/utils/compare.ts | 46 ++++---- src/utils/plugin.ts | 120 ++++++++++---------- src/utils/rule.ts | 32 +++--- tests/autofix.spec.ts | 60 +++++----- tests/config.spec.ts | 42 +++---- tests/helpers/configs.ts | 8 +- tests/helpers/util.ts | 20 ++-- tests/rules/.eslintrc.js | 7 -- tests/rules/.prettierrc.js | 4 +- tests/rules/interface.spec.ts | 20 ++-- tests/rules/string-enum.spec.ts | 20 ++-- 28 files changed, 381 insertions(+), 389 deletions(-) delete mode 100644 tests/rules/.eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js index 2e9358d..70fd8ab 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -58,4 +58,4 @@ module.exports = { }, }, }, -}; +} diff --git a/.huskyrc.js b/.huskyrc.js index d614502..6dd52fe 100644 --- a/.huskyrc.js +++ b/.huskyrc.js @@ -2,4 +2,4 @@ module.exports = { hooks: { 'pre-commit': 'lint-staged', }, -}; +} diff --git a/.prettierrc.js b/.prettierrc.js index 694e650..6c8f09d 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -2,4 +2,5 @@ module.exports = { printWidth: 90, trailingComma: 'all', arrowParens: 'avoid', -}; + semi: false, +} diff --git a/babel.config.js b/babel.config.js index 8165fe4..befbdd1 100644 --- a/babel.config.js +++ b/babel.config.js @@ -3,4 +3,4 @@ module.exports = { ['@babel/preset-env', { targets: { node: 'current' } }], '@babel/preset-typescript', ], -}; +} diff --git a/docs/rules/interface.md b/docs/rules/interface.md index 0e4f36a..5bbbdcb 100644 --- a/docs/rules/interface.md +++ b/docs/rules/interface.md @@ -12,41 +12,41 @@ Examples of **incorrect** code for this rule: /* eslint typescript-sort-keys/interface: "error" */ interface U { - a: T; - c: T; - b: T; + a: T + c: T + b: T } interface U { - a: T; - c: T; - b: T; + a: T + c: T + b: T } // Case-sensitive by default. interface U { - a: T; - b: T; - C: T; + a: T + b: T + C: T } // Non-natural order by default. interface U { - 1: T; - 2: T; - 10: T; + 1: T + 2: T + 10: T } // Non-required first order by default. interface U { - b?: T; - a: T; - c: T; + b?: T + a: T + c: T } interface U { - a: T; - ['c']: T; - b: T; + a: T + ['c']: T + b: T } ``` @@ -56,42 +56,42 @@ Examples of **correct** code for this rule: /* eslint typescript-sort-keys/interface: "error" */ interface U { - a: T; - b: T; - c: T; + a: T + b: T + c: T } interface U { - a: T; - b: T; - c: T; + a: T + b: T + c: T } // Case-sensitive by default. interface U { - C: T; - a: T; - b: T; + C: T + a: T + b: T } // Non-natural order by default. interface U { - 1: T; - 10: T; - 2: T; + 1: T + 10: T + 2: T } // Non-required first order by default. interface U { - a: T; - b?: T; - c: T; + a: T + b?: T + c: T } // This rule checks computed properties which have a simple name as well. interface U { - a: T; - ['b']: T; - c: T; + a: T + ['b']: T + c: T } ``` @@ -142,35 +142,35 @@ Examples of **incorrect** code for the `"desc"` option: /* eslint typescript-sort-keys/interface: ["error", "desc"] */ interface U { - b: T; - c: T; - a: T; + b: T + c: T + a: T } interface U { - b: T; - c: T; - a: T; + b: T + c: T + a: T } // Case-sensitive by default. interface U { - C: T; - b: T; - a: T; + C: T + b: T + a: T } // Non-required first order by default. interface U { - a: T; - b?: T; - c: T; + a: T + b?: T + c: T } // Non-natural order by default. interface U { - 10: T; - 2: T; - 1: T; + 10: T + 2: T + 1: T } ``` @@ -180,35 +180,35 @@ Examples of **correct** code for the `"desc"` option: /* eslint typescript-sort-keys/interface: ["error", "desc"] */ interface U { - c: T; - b: T; - a: T; + c: T + b: T + a: T } interface U { - c: T; - b: T; - a: T; + c: T + b: T + a: T } // Case-sensitive by default. interface U { - b: T; - a: T; - C: T; + b: T + a: T + C: T } // Non-required first order by default. interface U { - c: T; - b?: T; - a: T; + c: T + b?: T + a: T } // Non-natural order by default. interface U { - 2: T; - 10: T; - 1: T; + 2: T + 10: T + 1: T } ``` @@ -220,16 +220,16 @@ Examples of **incorrect** code for the `{ caseSensitive: false }` option: /* eslint typescript-sort-keys/interface: ["error", "asc", { caseSensitive: false }] */ interface U { - a: T; - c: T; - C: T; - b: T; + a: T + c: T + C: T + b: T } interface U { - a: T; - C: T; - c: T; - b: T; + a: T + C: T + c: T + b: T } ``` @@ -239,16 +239,16 @@ Examples of **correct** code for the `{ caseSensitive: false }` option: /* eslint typescript-sort-keys/interface: ["error", "asc", { caseSensitive: false }] */ interface U { - a: T; - b: T; - c: T; - C: T; + a: T + b: T + c: T + C: T } interface U { - a: T; - b: T; - C: T; - c: T; + a: T + b: T + C: T + c: T } ``` @@ -260,9 +260,9 @@ Examples of **incorrect** code for the `{natural: true}` option: /* eslint typescript-sort-keys/interface: ["error", "asc", { natural: true }] */ interface U { - 1: T; - 10: T; - 2: T; + 1: T + 10: T + 2: T } ``` @@ -272,9 +272,9 @@ Examples of **correct** code for the `{natural: true}` option: /* eslint typescript-sort-keys/interface: ["error", "asc", { natural: true }] */ interface U { - 1: T; - 2: T; - 10: T; + 1: T + 2: T + 10: T } ``` @@ -286,10 +286,10 @@ Examples of **incorrect** code for the `{ requiredFirst: true }` option: /* eslint typescript-sort-keys/interface: ["error", "asc", { requiredFirst: true }] */ interface U { - d: T; - c?: T; - b?: T; - a: T; + d: T + c?: T + b?: T + a: T } ``` @@ -299,10 +299,10 @@ Examples of **correct** code for the `{ requiredFirst: true }` option: /* eslint typescript-sort-keys/interface: ["error", "asc", { requiredFirst: true }] */ interface U { - a: T; - d: T; - b?: T; - c?: T; + a: T + d: T + b?: T + c?: T } ``` diff --git a/docs/rules/string-enum.md b/docs/rules/string-enum.md index 5e303c8..3658eb1 100644 --- a/docs/rules/string-enum.md +++ b/docs/rules/string-enum.md @@ -71,11 +71,7 @@ enum U { ```json { - "typescript-sort-keys/string-enum": [ - "error", - "asc", - { "caseSensitive": true } - ] + "typescript-sort-keys/string-enum": ["error", "asc", { "caseSensitive": true }] } ``` diff --git a/jest.config.js b/jest.config.js index ac0b2a7..2f192c4 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,4 +1,4 @@ module.exports = { testRegex: 'tests/.*\\.spec\\.(js|ts)$', moduleDirectories: ['node_modules', 'src'], -}; +} diff --git a/lint-staged.config.js b/lint-staged.config.js index d887e90..92b9071 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -1,4 +1,4 @@ module.exports = { '*.{js,ts}': ['eslint --fix --ext js,jsx,tsx,ts --max-warnings 0 --no-ignore'], '*.{md,yml,json}': ['prettier --write'], -}; +} diff --git a/rollup.config.js b/rollup.config.js index b5089e9..9b8cd2e 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,28 +1,28 @@ -import commonjs from '@rollup/plugin-commonjs'; -import resolve from '@rollup/plugin-node-resolve'; -import typescript from '@rollup/plugin-typescript'; -import json from '@rollup/plugin-json'; -import tsconfig from 'tsconfig'; -import fs from 'fs'; -import assert from 'assert'; +import commonjs from '@rollup/plugin-commonjs' +import resolve from '@rollup/plugin-node-resolve' +import typescript from '@rollup/plugin-typescript' +import json from '@rollup/plugin-json' +import tsconfig from 'tsconfig' +import fs from 'fs' +import assert from 'assert' -const filePath = tsconfig.resolveSync('.'); +const filePath = tsconfig.resolveSync('.') -assert(filePath); +assert(filePath) -const config = tsconfig.readFileSync(filePath); -const baseUrl = config.compilerOptions.baseUrl; +const config = tsconfig.readFileSync(filePath) +const baseUrl = config.compilerOptions.baseUrl const moduleMappings = fs .readdirSync(baseUrl, { withFileTypes: true }) .filter(dir => dir.isDirectory()) - .map(dir => [dir.name, '/'].join('')); + .map(dir => [dir.name, '/'].join('')) const external = id => !id.startsWith('.') && !id.startsWith('/') && !id.startsWith('\0') && - !moduleMappings.some(mapping => id.startsWith(mapping)); + !moduleMappings.some(mapping => id.startsWith(mapping)) export default [ { @@ -34,4 +34,4 @@ export default [ ], plugins: [commonjs(), resolve(), typescript(), json()], }, -]; +] diff --git a/src/common/options.ts b/src/common/options.ts index 4aadec8..b015fdd 100644 --- a/src/common/options.ts +++ b/src/common/options.ts @@ -1,4 +1,4 @@ -import { JSONSchema4 } from 'json-schema'; +import { JSONSchema4 } from 'json-schema' export enum SortingOrder { Ascending = 'asc', @@ -7,26 +7,26 @@ export enum SortingOrder { export const sortingOrderOptionSchema: JSONSchema4 = { enum: [SortingOrder.Ascending, SortingOrder.Descending], -}; +} -export type SortingOrderOption = SortingOrder; +export type SortingOrderOption = SortingOrder interface CaseSensitiveSortingOption { - readonly caseSensitive: boolean; + readonly caseSensitive: boolean } interface NaturalSortingOption { - readonly natural: boolean; + readonly natural: boolean } interface RequiredFirstSortingOption { - readonly requiredFirst: boolean; + readonly requiredFirst: boolean } export interface SortingParamsOptions { - readonly caseSensitive: CaseSensitiveSortingOption; - readonly natural: NaturalSortingOption; - readonly requiredFirst: RequiredFirstSortingOption; + readonly caseSensitive: CaseSensitiveSortingOption + readonly natural: NaturalSortingOption + readonly requiredFirst: RequiredFirstSortingOption } export enum ErrorMessage { diff --git a/src/config/recommended.ts b/src/config/recommended.ts index e8ccd7a..f676021 100644 --- a/src/config/recommended.ts +++ b/src/config/recommended.ts @@ -4,4 +4,4 @@ export default { 'typescript-sort-keys/interface': 'error', 'typescript-sort-keys/string-enum': 'error', }, -}; +} diff --git a/src/index.ts b/src/index.ts index 1e176c3..c85f9b2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,11 @@ -import recommended from './config/recommended'; -import { rules } from './rules'; +import recommended from './config/recommended' +import { rules } from './rules' const config = { rules, configs: { recommended, }, -}; +} -export default config; +export default config diff --git a/src/rules/index.ts b/src/rules/index.ts index 15451fd..4ccfe27 100644 --- a/src/rules/index.ts +++ b/src/rules/index.ts @@ -1,7 +1,7 @@ -import { name as interfaceName, rule as interfaceRule } from './interface'; -import { name as stringEnumName, rule as stringEnumRule } from './string-enum'; +import { name as interfaceName, rule as interfaceRule } from './interface' +import { name as stringEnumName, rule as stringEnumRule } from './string-enum' export const rules = { [interfaceName]: interfaceRule, [stringEnumName]: stringEnumRule, -}; +} diff --git a/src/rules/interface.ts b/src/rules/interface.ts index 5be0e99..8f7e0e6 100644 --- a/src/rules/interface.ts +++ b/src/rules/interface.ts @@ -1,29 +1,29 @@ -import { JSONSchema4 } from 'json-schema'; +import { JSONSchema4 } from 'json-schema' -import { getObjectBody } from 'utils/ast'; -import { createReporter } from 'utils/plugin'; -import { createRule, RuleMetaData } from 'utils/rule'; +import { getObjectBody } from 'utils/ast' +import { createReporter } from 'utils/plugin' +import { createRule, RuleMetaData } from 'utils/rule' import { sortingOrderOptionSchema, SortingOrder, ErrorMessage, SortingOrderOption, SortingParamsOptions, -} from 'common/options'; +} from 'common/options' /** * The name of this rule. */ -export const name = 'interface' as const; +export const name = 'interface' as const type SortingParams = SortingParamsOptions['caseSensitive'] & SortingParamsOptions['natural'] & - SortingParamsOptions['requiredFirst']; + SortingParamsOptions['requiredFirst'] /** * The options this rule can take. */ -export type Options = [SortingOrderOption] | [SortingOrderOption, Partial]; +export type Options = [SortingOrderOption] | [SortingOrderOption, Partial] const sortingParamsOptionSchema: JSONSchema4 = { type: 'object', @@ -39,12 +39,12 @@ const sortingParamsOptionSchema: JSONSchema4 = { }, }, additionalProperties: false, -}; +} /** * The schema for the rule options. */ -const schema: JSONSchema4 = [sortingOrderOptionSchema, sortingParamsOptionSchema]; +const schema: JSONSchema4 = [sortingOrderOptionSchema, sortingParamsOptionSchema] /** * The default options for the rule. @@ -52,14 +52,14 @@ const schema: JSONSchema4 = [sortingOrderOptionSchema, sortingParamsOptionSchema const defaultOptions: Options = [ SortingOrder.Ascending, { caseSensitive: true, natural: false, requiredFirst: false }, -]; +] /** * The possible error messages. */ const errorMessages = { invalidOrder: ErrorMessage.InterfaceInvalidOrder, -} as const; +} as const /** * The meta data for this rule. @@ -74,7 +74,7 @@ const meta: RuleMetaData = { messages: errorMessages, fixable: 'code', schema, -}; +} /** * Create the rule. @@ -88,20 +88,20 @@ export const rule = createRule({ const compareNodeListAndReport = createReporter(context, ({ loc }) => ({ loc, messageId: 'invalidOrder', - })); + })) return { TSInterfaceDeclaration(node) { - const body = getObjectBody(node); + const body = getObjectBody(node) - return compareNodeListAndReport(body); + return compareNodeListAndReport(body) }, TSTypeLiteral(node) { - const body = getObjectBody(node); + const body = getObjectBody(node) - return compareNodeListAndReport(body); + return compareNodeListAndReport(body) }, - }; + } }, -}); +}) diff --git a/src/rules/string-enum.ts b/src/rules/string-enum.ts index 16e7c48..070513d 100644 --- a/src/rules/string-enum.ts +++ b/src/rules/string-enum.ts @@ -1,29 +1,29 @@ -import { JSONSchema4 } from 'json-schema'; -import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils'; +import { JSONSchema4 } from 'json-schema' +import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils' -import { getObjectBody } from 'utils/ast'; -import { createReporter } from 'utils/plugin'; -import { createRule, RuleMetaData } from 'utils/rule'; +import { getObjectBody } from 'utils/ast' +import { createReporter } from 'utils/plugin' +import { createRule, RuleMetaData } from 'utils/rule' import { sortingOrderOptionSchema, SortingOrder, ErrorMessage, SortingOrderOption, SortingParamsOptions, -} from 'common/options'; +} from 'common/options' /** * The name of this rule. */ -export const name = 'string-enum' as const; +export const name = 'string-enum' as const type SortingParams = SortingParamsOptions['caseSensitive'] & - SortingParamsOptions['natural']; + SortingParamsOptions['natural'] /** * The options this rule can take. */ -export type Options = [SortingOrderOption] | [SortingOrderOption, Partial]; +export type Options = [SortingOrderOption] | [SortingOrderOption, Partial] const sortingParamsOptionSchema: JSONSchema4 = { type: 'object', @@ -36,12 +36,12 @@ const sortingParamsOptionSchema: JSONSchema4 = { }, }, additionalProperties: false, -}; +} /** * The schema for the rule options. */ -const schema: JSONSchema4 = [sortingOrderOptionSchema, sortingParamsOptionSchema]; +const schema: JSONSchema4 = [sortingOrderOptionSchema, sortingParamsOptionSchema] /** * The default options for the rule. @@ -49,14 +49,14 @@ const schema: JSONSchema4 = [sortingOrderOptionSchema, sortingParamsOptionSchema const defaultOptions: Options = [ SortingOrder.Ascending, { caseSensitive: true, natural: false }, -]; +] /** * The possible error messages. */ const errorMessages = { invalidOrder: ErrorMessage.StringEnumInvalidOrder, -} as const; +} as const /** * The meta data for this rule. @@ -71,7 +71,7 @@ const meta: RuleMetaData = { messages: errorMessages, fixable: 'code', schema, -}; +} /** * Create the rule. @@ -85,22 +85,22 @@ export const rule = createRule({ const compareNodeListAndReport = createReporter(context, ({ loc }) => ({ loc, messageId: 'invalidOrder', - })); + })) return { TSEnumDeclaration(node) { - const body = getObjectBody(node) as TSESTree.TSEnumMember[]; + const body = getObjectBody(node) as TSESTree.TSEnumMember[] const isStringEnum = body.every( (member: TSESTree.TSEnumMember) => member.initializer && member.initializer.type === AST_NODE_TYPES.Literal && typeof member.initializer.value === 'string', - ); + ) if (isStringEnum) { - compareNodeListAndReport(body); + compareNodeListAndReport(body) } }, - }; + } }, -}); +}) diff --git a/src/utils/ast.ts b/src/utils/ast.ts index beda2a0..d31810a 100644 --- a/src/utils/ast.ts +++ b/src/utils/ast.ts @@ -1,6 +1,6 @@ -import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils'; +import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils' -import { indexSignature } from './common'; +import { indexSignature } from './common' export function getObjectBody( node: @@ -10,17 +10,17 @@ export function getObjectBody( ) { switch (node.type) { case AST_NODE_TYPES.TSInterfaceDeclaration: - return node.body.body; + return node.body.body case AST_NODE_TYPES.TSEnumDeclaration: case AST_NODE_TYPES.TSTypeLiteral: - return node.members; + return node.members } } function getProperty(node: TSESTree.Node) { switch (node.type) { case AST_NODE_TYPES.TSIndexSignature: { - const [identifier] = node.parameters; + const [identifier] = node.parameters return { ...identifier, @@ -28,18 +28,18 @@ function getProperty(node: TSESTree.Node) { name: indexSignature.create( (identifier as TSESTree.Parameter & { name: string }).name, ), - }; + } } case AST_NODE_TYPES.TSPropertySignature: case AST_NODE_TYPES.TSMethodSignature: - return node.key; + return node.key case AST_NODE_TYPES.TSEnumMember: - return node.id; + return node.id default: - return undefined; + return undefined } } @@ -72,21 +72,21 @@ function getProperty(node: TSESTree.Node) { * let a = {[`${b}`]: 1} // => undefined */ export function getPropertyName(node: TSESTree.TypeElement | TSESTree.TSEnumMember) { - const property = getProperty(node); + const property = getProperty(node) if (!property) { - return undefined; + return undefined } switch (property.type) { case AST_NODE_TYPES.Literal: - return String(property.value); + return String(property.value) case AST_NODE_TYPES.Identifier: - return property.name; + return property.name default: - return undefined; + return undefined } } @@ -96,8 +96,8 @@ export function getPropertyIsOptional( switch (node.type) { case AST_NODE_TYPES.TSMethodSignature: case AST_NODE_TYPES.TSPropertySignature: - return Boolean(node.optional); + return Boolean(node.optional) } - return false; + return false } diff --git a/src/utils/common.ts b/src/utils/common.ts index f10d6e5..2ad7609 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -1,9 +1,9 @@ -const nameToIndexSignature = (x: string) => `[index: ${x}]`; +const nameToIndexSignature = (x: string) => `[index: ${x}]` const indexSignatureRegexp = new RegExp( `^${nameToIndexSignature('.+')}`.replace('[', '\\[').replace(']', '\\]'), -); +) export const indexSignature = { create: nameToIndexSignature, regex: indexSignatureRegexp, -}; +} diff --git a/src/utils/compare.ts b/src/utils/compare.ts index 6b9adaa..42c1ad5 100644 --- a/src/utils/compare.ts +++ b/src/utils/compare.ts @@ -1,26 +1,26 @@ -import naturalCompare from 'natural-compare-lite'; +import naturalCompare from 'natural-compare-lite' -import { indexSignature } from './common'; +import { indexSignature } from './common' function charCompare(a: string, b: string) { if (a < b) { - return -1; + return -1 } if (b < a) { - return 1; + return 1 } - return 0; + return 0 } function getWeight(value: string) { switch (true) { // Custom name for index signature used here case indexSignature.regex.test(value): - return 100; + return 100 default: - return 0; + return 0 } } @@ -29,24 +29,24 @@ function weightedCompare( b: string, compareFn: (a: string, b: string) => number, ) { - return compareFn(a, b) - getWeight(a) + getWeight(b); + return compareFn(a, b) - getWeight(a) + getWeight(b) } const ascending = (a: string, b: string) => { - return weightedCompare(a, b, charCompare); -}; + return weightedCompare(a, b, charCompare) +} const ascendingInsensitive = (a: string, b: string) => { - return weightedCompare(a.toLowerCase(), b.toLowerCase(), charCompare); -}; + return weightedCompare(a.toLowerCase(), b.toLowerCase(), charCompare) +} const ascendingNatural = (a: string, b: string) => { - return weightedCompare(a, b, naturalCompare); -}; + return weightedCompare(a, b, naturalCompare) +} const ascendingInsensitiveNatural = (a: string, b: string) => { - return weightedCompare(a.toLowerCase(), b.toLowerCase(), naturalCompare); -}; + return weightedCompare(a.toLowerCase(), b.toLowerCase(), naturalCompare) +} /** * Functions which check that the given 2 names are in specific order. @@ -57,22 +57,22 @@ export const compareFn = ( isNatural: boolean, ) => (...args: [string?, string?]) => { if (args.filter(Boolean).length !== 2) { - return 0; + return 0 } - const input = (isAscending ? args : args.reverse()) as [string, string]; + const input = (isAscending ? args : args.reverse()) as [string, string] if (isInsensitive && isNatural) { - return ascendingInsensitiveNatural(...input); + return ascendingInsensitiveNatural(...input) } if (!isInsensitive && isNatural) { - return ascendingNatural(...input); + return ascendingNatural(...input) } if (isInsensitive && !isNatural) { - return ascendingInsensitive(...input); + return ascendingInsensitive(...input) } - return ascending(...input); -}; + return ascending(...input) +} diff --git a/src/utils/plugin.ts b/src/utils/plugin.ts index 244258f..737bfc4 100644 --- a/src/utils/plugin.ts +++ b/src/utils/plugin.ts @@ -1,44 +1,44 @@ -import { TSESTree, AST_TOKEN_TYPES } from '@typescript-eslint/experimental-utils'; +import { TSESTree, AST_TOKEN_TYPES } from '@typescript-eslint/experimental-utils' import { RuleContext as UtilRuleContext, RuleFixer, RuleFix, SourceCode, -} from '@typescript-eslint/experimental-utils/dist/ts-eslint'; -import assert from 'assert'; +} from '@typescript-eslint/experimental-utils/dist/ts-eslint' +import assert from 'assert' -import { SortingOrder } from 'common/options'; -import { Options as InterfaceRuleOptions } from 'rules/interface'; -import { Options as StringEnumRuleOptions } from 'rules/string-enum'; -import { getPropertyName, getPropertyIsOptional } from './ast'; -import { compareFn } from './compare'; +import { SortingOrder } from 'common/options' +import { Options as InterfaceRuleOptions } from 'rules/interface' +import { Options as StringEnumRuleOptions } from 'rules/string-enum' +import { getPropertyName, getPropertyIsOptional } from './ast' +import { compareFn } from './compare' -type RuleOptions = InterfaceRuleOptions & StringEnumRuleOptions; +type RuleOptions = InterfaceRuleOptions & StringEnumRuleOptions -type TSType = TSESTree.TypeElement | TSESTree.TSEnumMember; +type TSType = TSESTree.TypeElement | TSESTree.TSEnumMember function createNodeSwapper(context: UtilRuleContext) { const sourceCode = context.getSourceCode() as SourceCode & { - lineStartIndices: number[]; - }; + lineStartIndices: number[] + } /** * Returns the indent range of a node if it's the first on its line. * Otherwise, returns a range starting immediately after the previous sibling. */ function getIndentRange(node: TSESTree.Node | TSESTree.Comment): TSESTree.Range { - const prevSibling = sourceCode.getTokenBefore(node); - const end = node.range[0]; + const prevSibling = sourceCode.getTokenBefore(node) + const end = node.range[0] const start = prevSibling && prevSibling.loc.start.line === node.loc.start.line ? prevSibling.range[1] + 1 - : node.range[0] - node.loc.start.column; + : node.range[0] - node.loc.start.column - return [start, end]; + return [start, end] } function getRangeWithIndent(node: TSESTree.Comment) { - return [getIndentRange(node)[0], node.range[1]]; + return [getIndentRange(node)[0], node.range[1]] } /** @@ -46,35 +46,35 @@ function createNodeSwapper(context: UtilRuleContext) { * token on its lines. Otherwise, returns the node range. */ function getLineRange(node: TSESTree.Comment): TSESTree.Range { - const [start] = getRangeWithIndent(node); - const index = sourceCode.lineStartIndices.findIndex(n => start === n); + const [start] = getRangeWithIndent(node) + const index = sourceCode.lineStartIndices.findIndex(n => start === n) if (index < 0) { // Node is not at the beginning of the line - return node.range; + return node.range } - const lines = 1 + node.loc.end.line - node.loc.start.line; + const lines = 1 + node.loc.end.line - node.loc.start.line return [ sourceCode.lineStartIndices[index], sourceCode.lineStartIndices[index + lines], - ]; + ] } function getIndentText(node: TSESTree.Node) { - return sourceCode.text.slice(...getIndentRange(node)); + return sourceCode.text.slice(...getIndentRange(node)) } function getNodePunctuator(node: TSESTree.Node) { const punctuator = sourceCode.getTokenAfter(node, { filter: n => n.type === AST_TOKEN_TYPES.Punctuator && n.value !== ':', includeComments: false, - }); + }) // Check the punctuator value outside of filter because we // want to stop traversal on any terminating punctuator - return punctuator && /^[,;]$/.test(punctuator.value) ? punctuator : undefined; + return punctuator && /^[,;]$/.test(punctuator.value) ? punctuator : undefined } return ( @@ -84,31 +84,31 @@ function createNodeSwapper(context: UtilRuleContext) { replaceNode: TSType, ) => [currentNode, replaceNode].reduce((acc, node) => { - const otherNode = node === currentNode ? replaceNode : currentNode; - const comments = sourceCode.getCommentsBefore(node); - const nextSibling = sourceCode.getTokenAfter(node); + const otherNode = node === currentNode ? replaceNode : currentNode + const comments = sourceCode.getCommentsBefore(node) + const nextSibling = sourceCode.getTokenAfter(node) const isLastReplacingLast = nodePositions.get(node)?.final === nodePositions.size - 1 && - nodePositions.get(node)?.final === nodePositions.get(otherNode)?.initial; + nodePositions.get(node)?.final === nodePositions.get(otherNode)?.initial let text = [ comments.length ? getIndentText(node) : '', sourceCode.getText(node), - ].join(''); + ].join('') // If nextSibling is the node punctuator, remove it if (nextSibling === getNodePunctuator(node)) { - acc.push(fixer.remove(nextSibling)); + acc.push(fixer.remove(nextSibling)) } if (!/[,;]$/.test(text)) { // Add a punctuator if the node doesn't already have one - text += ','; + text += ',' } if (isLastReplacingLast) { // If we're moving the last node to its final destination, we can remove the punctuator - text = text.replace(/,$/, ''); + text = text.replace(/,$/, '') } if (comments.length) { @@ -121,7 +121,7 @@ function createNodeSwapper(context: UtilRuleContext) { .concat('') .join('\n'), ), - ); + ) } acc.push( @@ -131,10 +131,10 @@ function createNodeSwapper(context: UtilRuleContext) { fixer.remove(node), // Remove the original instances of node comments ...comments.map(n => fixer.removeRange(getLineRange(n))), - ); + ) - return acc; - }, []); + return acc + }, []) } export function createReporter( @@ -144,15 +144,15 @@ export function createReporter( ) => { readonly loc: TSESTree.SourceLocation; readonly messageId: MessageIds }, ) { // Parse options. - const order = context.options[0] || SortingOrder.Ascending; - const options = context.options[1]; - const isAscending = order === SortingOrder.Ascending; - const isInsensitive = (options && options.caseSensitive) === false; - const isNatural = Boolean(options && options.natural); - const isRequiredFirst = (options && options.requiredFirst) === true; + const order = context.options[0] || SortingOrder.Ascending + const options = context.options[1] + const isAscending = order === SortingOrder.Ascending + const isInsensitive = (options && options.caseSensitive) === false + const isNatural = Boolean(options && options.natural) + const isRequiredFirst = (options && options.requiredFirst) === true - const compare = compareFn(isAscending, isInsensitive, isNatural); - const swapNodes = createNodeSwapper(context); + const compare = compareFn(isAscending, isInsensitive, isNatural) + const swapNodes = createNodeSwapper(context) return (body: TSType[]) => { const sortedBody = isRequiredFirst @@ -166,17 +166,17 @@ export function createReporter( .filter(node => getPropertyIsOptional(node)) .sort((a, b) => compare(getPropertyName(a), getPropertyName(b))), ] - : body.slice(0).sort((a, b) => compare(getPropertyName(a), getPropertyName(b))); + : body.slice(0).sort((a, b) => compare(getPropertyName(a), getPropertyName(b))) const nodePositions = new Map( body.map(n => [n, { initial: body.indexOf(n), final: sortedBody.indexOf(n) }]), - ); + ) for (let i = 1; i < body.length; i += 1) { - const prevNode = body[i - 1]; - const currentNode = body[i]; - const prevNodeName = getPropertyName(prevNode); - const currentNodeName = getPropertyName(currentNode); + const prevNode = body[i - 1] + const currentNode = body[i] + const prevNodeName = getPropertyName(prevNode) + const currentNodeName = getPropertyName(currentNode) if ( (!isRequiredFirst && compare(prevNodeName, currentNodeName) > 0) || @@ -187,16 +187,16 @@ export function createReporter( getPropertyIsOptional(prevNode) !== getPropertyIsOptional(currentNode) && getPropertyIsOptional(prevNode)) ) { - const targetPosition = sortedBody.indexOf(currentNode); - const replaceNode = body[targetPosition]; - const { loc, messageId } = createReportObject(currentNode); + const targetPosition = sortedBody.indexOf(currentNode) + const replaceNode = body[targetPosition] + const { loc, messageId } = createReportObject(currentNode) // Sanity check - assert(loc, 'createReportObject return value must include a node location'); + assert(loc, 'createReportObject return value must include a node location') assert( messageId, 'createReportObject return value must include a problem message', - ); + ) context.report({ loc, @@ -213,13 +213,13 @@ export function createReporter( fix: fixer => { if (currentNode !== replaceNode) { - return swapNodes(fixer, nodePositions, currentNode, replaceNode); + return swapNodes(fixer, nodePositions, currentNode, replaceNode) } - return null; + return null }, - }); + }) } } - }; + } } diff --git a/src/utils/rule.ts b/src/utils/rule.ts index 2c68ab8..8a8730f 100644 --- a/src/utils/rule.ts +++ b/src/utils/rule.ts @@ -1,4 +1,4 @@ -import { ESLintUtils } from '@typescript-eslint/experimental-utils'; +import { ESLintUtils } from '@typescript-eslint/experimental-utils' import { ReportDescriptor, RuleContext as UtilRuleContext, @@ -6,41 +6,41 @@ import { RuleMetaData as UtilRuleMetaData, RuleMetaDataDocs as UtilRuleMetaDataDocs, RuleModule, -} from '@typescript-eslint/experimental-utils/dist/ts-eslint'; +} from '@typescript-eslint/experimental-utils/dist/ts-eslint' -export type BaseOptions = readonly unknown[]; +export type BaseOptions = readonly unknown[] // "url" will be set automatically. -export type RuleMetaDataDocs = Omit; +export type RuleMetaDataDocs = Omit // "docs.url" will be set automatically. export type RuleMetaData = { - readonly docs: RuleMetaDataDocs; -} & Omit, 'docs'>; + readonly docs: RuleMetaDataDocs +} & Omit, 'docs'> export type RuleResult = { - readonly context: UtilRuleContext; - readonly descriptors: readonly ReportDescriptor[]; -}; + readonly context: UtilRuleContext + readonly descriptors: readonly ReportDescriptor[] +} type Mutable = { - -readonly [P in keyof T]: T[P]; -}; + -readonly [P in keyof T]: T[P] +} /** * Create a rule. */ export function createRule(data: { - readonly name: string; - readonly meta: RuleMetaData; - readonly defaultOptions: Options; + readonly name: string + readonly meta: RuleMetaData + readonly defaultOptions: Options readonly create: ( context: UtilRuleContext, optionsWithDefault: Mutable, - ) => RuleListener; + ) => RuleListener }): RuleModule { return ESLintUtils.RuleCreator( name => `https://github.com/infctr/eslint-plugin-typescript-sort-keys/blob/master/docs/rules/${name}.md`, - )(data); + )(data) } diff --git a/tests/autofix.spec.ts b/tests/autofix.spec.ts index f339023..81eea1f 100644 --- a/tests/autofix.spec.ts +++ b/tests/autofix.spec.ts @@ -1,25 +1,25 @@ -import path from 'path'; -import fs from 'fs'; -import tmp from 'tmp'; -import { ESLint } from 'eslint'; +import path from 'path' +import fs from 'fs' +import tmp from 'tmp' +import { ESLint } from 'eslint' -import plugin from '../src'; -import recommended from 'config/recommended'; -import { typescript } from './helpers/configs'; +import plugin from '../src' +import recommended from 'config/recommended' +import { typescript } from './helpers/configs' declare module 'eslint' { export class ESLint { - constructor(config?: any); + constructor(config?: any) - lintFiles(path: string | string[]): Promise; - static outputFixes(config: any): Promise; + lintFiles(path: string | string[]): Promise + static outputFixes(config: any): Promise } } describe('autofix', () => { beforeEach(() => { - tmp.setGracefulCleanup(); - }); + tmp.setGracefulCleanup() + }) it.each([ [recommended, 'autofix.output.ts'], @@ -43,13 +43,13 @@ describe('autofix', () => { const { name: tmpDir } = tmp.dirSync({ prefix: 'typescript-sort-keys-', unsafeCleanup: true, - }); + }) - const testFilePath = path.join(tmpDir, 'autofix.ts'); - const input = fs.readFileSync('tests/fixtures/autofix.input.ts', 'utf8'); - const expected = fs.readFileSync(`tests/fixtures/${fileName}`, 'utf8'); + const testFilePath = path.join(tmpDir, 'autofix.ts') + const input = fs.readFileSync('tests/fixtures/autofix.input.ts', 'utf8') + const expected = fs.readFileSync(`tests/fixtures/${fileName}`, 'utf8') - fs.writeFileSync(testFilePath, input); + fs.writeFileSync(testFilePath, input) const eslint = new ESLint({ overrideConfig: { @@ -62,22 +62,22 @@ describe('autofix', () => { }, useEslintrc: false, fix: true, - }); + }) - const results = await eslint.lintFiles(testFilePath); - const result = results[0]; + const results = await eslint.lintFiles(testFilePath) + const result = results[0] - expect(result.messages).toHaveLength(0); - expect(result.errorCount).toBe(0); - expect(result.warningCount).toBe(0); - expect(result.fixableErrorCount).toBe(0); - expect(result.fixableWarningCount).toBe(0); + expect(result.messages).toHaveLength(0) + expect(result.errorCount).toBe(0) + expect(result.warningCount).toBe(0) + expect(result.fixableErrorCount).toBe(0) + expect(result.fixableWarningCount).toBe(0) - await ESLint.outputFixes(results); + await ESLint.outputFixes(results) - const output = fs.readFileSync(testFilePath, 'utf8'); + const output = fs.readFileSync(testFilePath, 'utf8') - expect(output).toStrictEqual(expected); + expect(output).toStrictEqual(expected) }, - ); -}); + ) +}) diff --git a/tests/config.spec.ts b/tests/config.spec.ts index 60cdbd3..74a0ccf 100644 --- a/tests/config.spec.ts +++ b/tests/config.spec.ts @@ -1,53 +1,53 @@ -import { readdirSync } from 'fs'; +import { readdirSync } from 'fs' -import plugin from '../src'; +import plugin from '../src' describe('recommended config', () => { - const RULE_NAME_PREFIX = 'typescript-sort-keys/'; + const RULE_NAME_PREFIX = 'typescript-sort-keys/' const { rules, configs: { recommended: { rules: configRules }, }, - } = plugin; + } = plugin const entriesToObject = ( value: readonly [string, T][], ): Record => { return value.reduce>((memo, [k, v]) => { - memo[k] = v; - return memo; - }, {}); - }; + memo[k] = v + return memo + }, {}) + } const ruleConfigs = Object.entries(rules) .filter(([, rule]) => rule.meta.docs && rule.meta.docs.recommended !== false) .map<[string, string]>(([name, rule]) => [ `${RULE_NAME_PREFIX}${name}`, rule.meta.docs && rule.meta.docs.recommended ? 'error' : 'off', - ]); + ]) it('contains all recommended rules', () => { - expect(entriesToObject(ruleConfigs)).toEqual(configRules); - }); -}); + expect(entriesToObject(ruleConfigs)).toEqual(configRules) + }) +}) describe('plugin', () => { const ruleFiles: readonly string[] = readdirSync('./src/rules').filter( file => file !== 'index.ts' && file.endsWith('.ts'), - ); + ) const configFiles: readonly string[] = readdirSync('./src/config').filter( file => file !== 'index.ts' && file.endsWith('.ts'), - ); + ) it('should have all the rules', () => { - expect(plugin).toHaveProperty('rules'); - expect(Object.keys(plugin.rules)).toHaveLength(ruleFiles.length); - }); + expect(plugin).toHaveProperty('rules') + expect(Object.keys(plugin.rules)).toHaveLength(ruleFiles.length) + }) it('should have all the configs', () => { - expect(plugin).toHaveProperty('configs'); - expect(Object.keys(plugin.configs)).toHaveLength(configFiles.length); - }); -}); + expect(plugin).toHaveProperty('configs') + expect(Object.keys(plugin.configs)).toHaveLength(configFiles.length) + }) +}) diff --git a/tests/helpers/configs.ts b/tests/helpers/configs.ts index 4e03aef..fb17fd3 100644 --- a/tests/helpers/configs.ts +++ b/tests/helpers/configs.ts @@ -1,7 +1,7 @@ -import { Linter } from 'eslint'; -import * as path from 'path'; +import { Linter } from 'eslint' +import * as path from 'path' -export const filename = path.join(__dirname, 'file.ts'); +export const filename = path.join(__dirname, 'file.ts') export const typescript: Linter.Config = { parser: require.resolve('@typescript-eslint/parser'), @@ -9,4 +9,4 @@ export const typescript: Linter.Config = { sourceType: 'module', project: path.join(__dirname, './tsconfig.json'), }, -}; +} diff --git a/tests/helpers/util.ts b/tests/helpers/util.ts index c2c7af9..e1c0d8b 100644 --- a/tests/helpers/util.ts +++ b/tests/helpers/util.ts @@ -1,24 +1,24 @@ -import { RuleTester as ESLintRuleTester } from 'eslint'; -import { filename } from './configs'; +import { RuleTester as ESLintRuleTester } from 'eslint' +import { filename } from './configs' type OptionsSet = { /** * The set of options this test case should pass for. */ - readonly optionsSet: readonly (Options | [])[]; -}; + readonly optionsSet: readonly (Options | [])[] +} export type ValidTestCase = Omit< ESLintRuleTester.ValidTestCase, 'options' > & - OptionsSet; + OptionsSet export type InvalidTestCase = Omit< ESLintRuleTester.InvalidTestCase, 'options' > & - OptionsSet; + OptionsSet /** * Convert our test cases into ones eslint test runner is expecting. @@ -29,11 +29,11 @@ export function processInvalidTestCase( return testCases.flatMap(testCase => testCase.optionsSet.map(options => { // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { optionsSet, ...eslintTestCase } = testCase; + const { optionsSet, ...eslintTestCase } = testCase - return { filename, ...eslintTestCase, options }; + return { filename, ...eslintTestCase, options } }), - ); + ) } /** @@ -42,5 +42,5 @@ export function processInvalidTestCase( export function processValidTestCase( testCases: readonly ValidTestCase[], ): ESLintRuleTester.ValidTestCase[] { - return processInvalidTestCase(testCases as any); + return processInvalidTestCase(testCases as any) } diff --git a/tests/rules/.eslintrc.js b/tests/rules/.eslintrc.js deleted file mode 100644 index 9447059..0000000 --- a/tests/rules/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -const prettier = require('./.prettierrc'); - -module.exports = { - rules: { - 'prettier/prettier': [1, prettier], - }, -}; diff --git a/tests/rules/.prettierrc.js b/tests/rules/.prettierrc.js index 655bdbb..53d4b95 100644 --- a/tests/rules/.prettierrc.js +++ b/tests/rules/.prettierrc.js @@ -1,4 +1,6 @@ module.exports = { printWidth: 100, trailingComma: 'all', -}; + arrowParens: 'avoid', + semi: false, +} diff --git a/tests/rules/interface.spec.ts b/tests/rules/interface.spec.ts index 62ba84c..c6c8e41 100644 --- a/tests/rules/interface.spec.ts +++ b/tests/rules/interface.spec.ts @@ -1,14 +1,14 @@ -import { Rule, RuleTester } from 'eslint'; +import { Rule, RuleTester } from 'eslint' -import { rule, name, Options } from 'rules/interface'; -import { SortingOrder } from 'common/options'; -import { typescript } from '../helpers/configs'; +import { rule, name, Options } from 'rules/interface' +import { SortingOrder } from 'common/options' +import { typescript } from '../helpers/configs' import { InvalidTestCase, processInvalidTestCase, processValidTestCase, ValidTestCase, -} from '../helpers/util'; +} from '../helpers/util' const valid: readonly ValidTestCase[] = [ /** @@ -735,7 +735,7 @@ const valid: readonly ValidTestCase[] = [ code: `interface U { a: T; _: T; A: T; $: T; [skey: string]: T; [nkey: number]: T; }`, optionsSet: [[SortingOrder.Descending]], }, -]; +] const invalid: readonly InvalidTestCase[] = [ /** @@ -1790,13 +1790,13 @@ const invalid: readonly InvalidTestCase[] = [ ], optionsSet: [[SortingOrder.Descending]], }, -]; +] describe('TypeScript', () => { - const ruleTester = new RuleTester(typescript); + const ruleTester = new RuleTester(typescript) ruleTester.run(name, (rule as unknown) as Rule.RuleModule, { valid: processValidTestCase(valid), invalid: processInvalidTestCase(invalid), - }); -}); + }) +}) diff --git a/tests/rules/string-enum.spec.ts b/tests/rules/string-enum.spec.ts index d038a6b..938b308 100644 --- a/tests/rules/string-enum.spec.ts +++ b/tests/rules/string-enum.spec.ts @@ -1,14 +1,14 @@ -import { Rule, RuleTester } from 'eslint'; +import { Rule, RuleTester } from 'eslint' -import { rule, name, Options } from 'rules/string-enum'; -import { SortingOrder } from 'common/options'; -import { typescript } from '../helpers/configs'; +import { rule, name, Options } from 'rules/string-enum' +import { SortingOrder } from 'common/options' +import { typescript } from '../helpers/configs' import { InvalidTestCase, processInvalidTestCase, processValidTestCase, ValidTestCase, -} from '../helpers/util'; +} from '../helpers/util' const valid: readonly ValidTestCase[] = [ /** @@ -328,7 +328,7 @@ const valid: readonly ValidTestCase[] = [ code: "enum U {è='T', À='T', 'Z'='T', '#'='T'}", optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, -]; +] const invalid: readonly InvalidTestCase[] = [ /** @@ -847,13 +847,13 @@ const invalid: readonly InvalidTestCase[] = [ ], optionsSet: [[SortingOrder.Descending, { natural: true, caseSensitive: false }]], }, -]; +] describe('TypeScript', () => { - const ruleTester = new RuleTester(typescript); + const ruleTester = new RuleTester(typescript) ruleTester.run(name, (rule as unknown) as Rule.RuleModule, { valid: processValidTestCase(valid), invalid: processInvalidTestCase(invalid), - }); -}); + }) +}) From 066fa238841ec82d82c77b5ec693f1ff06e71f43 Mon Sep 17 00:00:00 2001 From: infctr Date: Fri, 22 May 2020 11:44:39 +0300 Subject: [PATCH 26/26] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c41f6b2..17aeaee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.0.0] +## [1.0.0] - 2020-05-22 ### Changed