From c0cd57501f6c0588ff2ba2e6a86e4f43bfd35e51 Mon Sep 17 00:00:00 2001 From: mshanemc Date: Sun, 4 Dec 2022 17:14:29 -0600 Subject: [PATCH] feat: migration rules --- .vscode/settings.json | 3 +- package.json | 10 +- src/index.ts | 16 ++- src/rules/getConnectionsWithVersion.ts | 46 ++++++++ src/rules/migration/noDeprecatedProperties.ts | 52 ++++++++ src/rules/migration/noThisFlags.ts | 101 ++++++++++++++++ src/rules/migration/noThisOrg.ts | 94 +++++++++++++++ src/rules/migration/sfdxFlagsProperty.ts | 3 +- src/rules/migration/shouldParseFlags.ts | 70 +++++++++++ src/rules/noDuplicateShortCharacters.ts | 2 +- src/shared/commands.ts | 18 ++- yarn.lock | 111 +++++++++--------- 12 files changed, 463 insertions(+), 63 deletions(-) create mode 100644 src/rules/getConnectionsWithVersion.ts create mode 100644 src/rules/migration/noDeprecatedProperties.ts create mode 100644 src/rules/migration/noThisFlags.ts create mode 100644 src/rules/migration/noThisOrg.ts create mode 100644 src/rules/migration/shouldParseFlags.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 72446f43..278a54e7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "typescript.tsdk": "node_modules/typescript/lib" + "typescript.tsdk": "node_modules/typescript/lib", + "cSpell.words": ["TSES"] } diff --git a/package.json b/package.json index b52bef40..8d6a5c7a 100644 --- a/package.json +++ b/package.json @@ -14,17 +14,17 @@ ], "repository": "salesforcecli/eslint-plugin-sf-plugin", "dependencies": { - "@typescript-eslint/utils": "^5.44.0" + "@typescript-eslint/utils": "^5.45.0" }, "devDependencies": { "@salesforce/prettier-config": "^0.0.2", "@types/eslint": "^8.4.10", - "@types/estree": "^0.0.52", + "@types/estree": "^1.0.0", "@types/jest": "^28.1.7", "@types/node": "^18.11.9", - "@typescript-eslint/eslint-plugin": "^5.44.0", - "@typescript-eslint/parser": "^5.44.0", - "eslint": "^8.28.0", + "@typescript-eslint/eslint-plugin": "^5.45.0", + "@typescript-eslint/parser": "^5.45.0", + "eslint": "^8.29.0", "eslint-config-prettier": "^8.5.0", "eslint-config-salesforce": "^0.1.6", "eslint-config-salesforce-license": "^0.1.6", diff --git a/src/index.ts b/src/index.ts index 00676d57..86d3edc5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,8 +19,12 @@ import { noSfdxCommandImport } from './rules/migration/noSfdxCommandImport'; import { sfdxFlagsProperty } from './rules/migration/sfdxFlagsProperty'; import { useSfCommandFlags } from './rules/migration/useSfCommandFlags'; import { noThisUx } from './rules/migration/no-this-ux'; +import { noThisOrg } from './rules/migration/noThisOrg'; import { runMatchesClassType } from './rules/runMatchesClassType'; - +import { noDeprecatedProperties } from './rules/migration/noDeprecatedProperties'; +import { shouldParseFlags } from './rules/migration/shouldParseFlags'; +import { noThisFlags } from './rules/migration/noThisFlags'; +import { getConnectionWithVersion } from './rules/getConnectionsWithVersion'; const recommended = { plugins: ['sf-plugin'], rules: { @@ -36,6 +40,7 @@ const recommended = { 'sf-plugin/json-flag': 'error', 'sf-plugin/flag-min-max-default': 'warn', 'sf-plugin/run-matches-class-type': 'error', + 'sf-plugin/get-connection-with-version': 'warn', }, }; export = { @@ -49,6 +54,10 @@ export = { 'sf-plugin/sfdx-flags-property': 'error', 'sf-plugin/use-sf-command-flags': 'error', 'sf-plugin/no-this-ux': 'error', + 'sf-plugin/no-deprecated-properties': 'error', + 'sf-plugin/should-parse-flags': 'error', + 'sf-plugin/no-this-org': 'error', + 'sf-plugin/no-this-flags': 'error', }, }, }, @@ -69,5 +78,10 @@ export = { 'sfdx-flags-property': sfdxFlagsProperty, 'use-sf-command-flags': useSfCommandFlags, 'no-this-ux': noThisUx, + 'no-deprecated-properties': noDeprecatedProperties, + 'should-parse-flags': shouldParseFlags, + 'no-this-org': noThisOrg, + 'no-this-flags': noThisFlags, + 'get-connection-with-version': getConnectionWithVersion, }, }; diff --git a/src/rules/getConnectionsWithVersion.ts b/src/rules/getConnectionsWithVersion.ts new file mode 100644 index 00000000..0a26eef1 --- /dev/null +++ b/src/rules/getConnectionsWithVersion.ts @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ +import { ESLintUtils } from '@typescript-eslint/utils'; +import { AST_NODE_TYPES } from '@typescript-eslint/utils'; +import { ancestorsContainsSfCommand, isInCommandDirectory } from '../shared/commands'; + +export const getConnectionWithVersion = ESLintUtils.RuleCreator.withoutDocs({ + meta: { + docs: { + description: 'Calls to getConnection should pass in a version', + recommended: 'warn', + }, + messages: { + addVersion: `getConnection should pass in a version, typically from the api-version flag, + even if that value may be undefined. + Otherwise, the org will default to its maximum version`, + }, + type: 'problem', + schema: [], + }, + defaultOptions: [], + create(context) { + return { + CallExpression(node): void { + if ( + isInCommandDirectory(context) && + node.type === AST_NODE_TYPES.CallExpression && + node.arguments.length === 0 && + node.callee?.type === AST_NODE_TYPES.MemberExpression && + node.callee.property.type === AST_NODE_TYPES.Identifier && + node.callee.property?.name === 'getConnection' && + ancestorsContainsSfCommand(context.getAncestors()) + ) { + context.report({ + node: node.callee.property, + messageId: 'addVersion', + }); + } + }, + }; + }, +}); diff --git a/src/rules/migration/noDeprecatedProperties.ts b/src/rules/migration/noDeprecatedProperties.ts new file mode 100644 index 00000000..f363557b --- /dev/null +++ b/src/rules/migration/noDeprecatedProperties.ts @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ +import { ESLintUtils } from '@typescript-eslint/utils'; +import { isInCommandDirectory, ancestorsContainsSfCommand } from '../../shared/commands'; +export const noDeprecatedProperties = ESLintUtils.RuleCreator.withoutDocs({ + meta: { + docs: { + description: 'Removes non-existent properties left over from SfdxCommand', + recommended: 'error', + }, + messages: { + property: 'Class property {{property}} is not available on SfCommand and should be removed', + }, + type: 'problem', + schema: [], + fixable: 'code', + }, + defaultOptions: [], + create(context) { + return { + PropertyDefinition(node): void { + if (isInCommandDirectory(context) && ancestorsContainsSfCommand(context.getAncestors())) { + if ( + node.key.type === 'Identifier' && + [ + 'requiresUsername', + 'supportUsername', + 'supportsDevhubUsername', + 'requiresDevhubUsername', + 'varargs', + ].includes(node.key.name) + ) { + context.report({ + node, + messageId: 'property', + data: { + property: node.key.name, + }, + fix: (fixer) => { + return fixer.remove(node); + }, + }); + } + } + }, + }; + }, +}); diff --git a/src/rules/migration/noThisFlags.ts b/src/rules/migration/noThisFlags.ts new file mode 100644 index 00000000..c1062696 --- /dev/null +++ b/src/rules/migration/noThisFlags.ts @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2020, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ +import { ESLintUtils } from '@typescript-eslint/utils'; +import { AST_NODE_TYPES } from '@typescript-eslint/utils'; +import { ancestorsContainsSfCommand, getRunMethod, getSfCommand, isInCommandDirectory } from '../../shared/commands'; + +export const noThisFlags = ESLintUtils.RuleCreator.withoutDocs({ + meta: { + docs: { + description: 'Fix references to this.org (property on SfdxCommand)', + recommended: 'error', + }, + messages: { + noThisFlags: 'SfCommand does not have a this.flags property. Make sure you parse the flag.', + useFlags: 'change this.flags to flags', + instanceProp: 'create a this.flags property on SfCommand', + setThisFlags: 'flags is defined on the class, but never set. Set it equal to the parsed flags property.', + }, + hasSuggestions: true, + type: 'suggestion', + schema: [], + fixable: 'code', + }, + defaultOptions: [], + create(context) { + return { + MemberExpression(node): void { + if ( + isInCommandDirectory(context) && + node.type === AST_NODE_TYPES.MemberExpression && + node.object?.type === AST_NODE_TYPES.ThisExpression && + node.property?.type === AST_NODE_TYPES.Identifier && + node.property?.name === 'flags' && + ancestorsContainsSfCommand(context.getAncestors()) + ) { + // it's ok if there's a this.org on the class... + const classAbove = getSfCommand(context.getAncestors()); + const runMethod = getRunMethod(classAbove); + + if ( + classAbove && + classAbove.body.body.find( + (b) => + b.type === 'PropertyDefinition' && + b.key.type === 'Identifier' && + b.key.name === 'flags' && + b.static === false + ) + ) { + // ...as long as it's been set in the run method + const flagsParse = + runMethod.type === 'MethodDefinition' + ? runMethod.value.body.body.find( + (b) => b.type === 'VariableDeclaration' && context.getSourceCode().getText(b).includes('this.parse') + ) + : undefined; + const source = context.getSourceCode().getText(); + if (!source.includes('this.flags = ')) { + context.report({ + node, + messageId: 'instanceProp', + fix: (fixer) => { + return fixer.insertTextAfter(flagsParse, 'this.flags = flags;'); + }, + }); + } + } else { + // we have no this.flags. Make one, or use flags + context.report({ + node, + messageId: 'noThisFlags', + suggest: [ + { + messageId: 'useFlags', + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type + fix: (fixer) => { + return fixer.replaceText(node, 'flags'); + }, + }, + { + messageId: 'instanceProp', + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type + fix: (fixer) => { + return fixer.insertTextBefore( + runMethod, + `private flags: Interfaces.InferredFlags;` + ); + }, + }, + ], + }); + } + } + }, + }; + }, +}); diff --git a/src/rules/migration/noThisOrg.ts b/src/rules/migration/noThisOrg.ts new file mode 100644 index 00000000..bb801a6a --- /dev/null +++ b/src/rules/migration/noThisOrg.ts @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2020, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ +import { ESLintUtils } from '@typescript-eslint/utils'; +import { AST_NODE_TYPES } from '@typescript-eslint/utils'; +import { ancestorsContainsSfCommand, getRunMethod, getSfCommand, isInCommandDirectory } from '../../shared/commands'; + +export const noThisOrg = ESLintUtils.RuleCreator.withoutDocs({ + meta: { + docs: { + description: 'Fix references to this.org (property on SfdxCommand)', + recommended: 'error', + }, + messages: { + noThisOrg: 'SfCommand does not have a this.org property. Make sure you parse the org flag.', + useFlags: "change this.org to flags['target-org']", + instanceProp: 'create a this.org property on SfCommand', + setThisOrg: 'this org is defined on the class, but never set. Set it equal to the org flag.', + }, + hasSuggestions: true, + type: 'suggestion', + schema: [], + fixable: 'code', + }, + defaultOptions: [], + create(context) { + return { + MemberExpression(node): void { + if ( + isInCommandDirectory(context) && + node.type === AST_NODE_TYPES.MemberExpression && + node.object?.type === AST_NODE_TYPES.ThisExpression && + node.property?.type === AST_NODE_TYPES.Identifier && + node.property?.name === 'org' && + ancestorsContainsSfCommand(context.getAncestors()) + ) { + // it's ok if there's a this.org on the class... + const classAbove = getSfCommand(context.getAncestors()); + const runMethod = getRunMethod(classAbove); + + if ( + classAbove && + classAbove.body.body.find( + (b) => b.type === 'PropertyDefinition' && b.key.type === 'Identifier' && b.key.name === 'org' + ) + ) { + // ...as long as it's been set in the run method + const flagsParse = + runMethod.type === 'MethodDefinition' + ? runMethod.value.body.body.find( + (b) => b.type === 'VariableDeclaration' && context.getSourceCode().getText(b).includes('this.parse') + ) + : undefined; + const source = context.getSourceCode().getText(); + if (!source.includes('this.org = ')) { + context.report({ + node, + messageId: 'instanceProp', + fix: (fixer) => { + return fixer.insertTextAfter(flagsParse, "this.org = flags['target-org'];"); + }, + }); + } + } else { + // we have no this.flags. Make one, or use the parsed flags + context.report({ + node, + messageId: 'noThisOrg', + suggest: [ + { + messageId: 'useFlags', + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type + fix: (fixer) => { + return fixer.replaceText(node, "flags['target-org']"); + }, + }, + { + messageId: 'instanceProp', + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type + fix: (fixer) => { + return fixer.insertTextBefore(runMethod, 'private org: Org;\r'); + }, + }, + ], + }); + } + } + }, + }; + }, +}); diff --git a/src/rules/migration/sfdxFlagsProperty.ts b/src/rules/migration/sfdxFlagsProperty.ts index 0bd99ffe..91a45e5a 100644 --- a/src/rules/migration/sfdxFlagsProperty.ts +++ b/src/rules/migration/sfdxFlagsProperty.ts @@ -6,10 +6,11 @@ */ import { ESLintUtils } from '@typescript-eslint/utils'; import { ancestorsContainsSfCommand, isInCommandDirectory } from '../../shared/commands'; + export const sfdxFlagsProperty = ESLintUtils.RuleCreator.withoutDocs({ meta: { docs: { - description: 'Change flag definitions to SfCommmand version', + description: 'Change flag definitions to SfCommand version', recommended: 'error', }, messages: { diff --git a/src/rules/migration/shouldParseFlags.ts b/src/rules/migration/shouldParseFlags.ts new file mode 100644 index 00000000..69870248 --- /dev/null +++ b/src/rules/migration/shouldParseFlags.ts @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2020, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ +import { ESLintUtils } from '@typescript-eslint/utils'; +import { isInCommandDirectory, extendsSfCommand, isClassDeclaration } from '../../shared/commands'; +import { isFlagsStaticProperty } from '../../shared/flags'; + +export const shouldParseFlags = ESLintUtils.RuleCreator.withoutDocs({ + meta: { + docs: { + description: 'The run method should call this.parse when there are flags', + recommended: 'error', + }, + messages: { + summary: 'The run method should call this.parse when there are flags', + }, + type: 'problem', + schema: [], + fixable: 'code', + }, + defaultOptions: [], + create(context) { + return { + // eslint-disable-next-line complexity + MethodDefinition(node): void { + if ( + node.key.type === 'Identifier' && + node.key.name === 'run' && + node.accessibility === 'public' && + node.value?.body?.body && + isInCommandDirectory(context) + ) { + // OK, looks like a run method has a type annotation + const ancestors = context.getAncestors(); + const classDeclaration = ancestors.find( + (ancestor) => isClassDeclaration(ancestor) && extendsSfCommand(ancestor) + ); + if ( + classDeclaration?.type === 'ClassDeclaration' && + classDeclaration.superClass?.type === 'Identifier' && + classDeclaration.superClass.name === 'SfCommand' && + // and it has flags to be parsed + classDeclaration.body?.body?.some((prop) => isFlagsStaticProperty(prop)) + ) { + // get the text for the two nodes + const sourceCode = context.getSourceCode(); + const runBody = sourceCode.getText(node.value.body); + const className = classDeclaration.id.name; + + if (!runBody.includes(`await this.parse(${className})`)) { + context.report({ + node, + messageId: 'summary', + fix: (fixer) => { + return fixer.insertTextBefore( + node.value.body.body[0], + `const {flags} = await this.parse(${className});` + ); + }, + }); + } + } + } + }, + }; + }, +}); diff --git a/src/rules/noDuplicateShortCharacters.ts b/src/rules/noDuplicateShortCharacters.ts index 99bfad26..390beac5 100644 --- a/src/rules/noDuplicateShortCharacters.ts +++ b/src/rules/noDuplicateShortCharacters.ts @@ -51,7 +51,7 @@ export const noDuplicateShortCharacters = ESLintUtils.RuleCreator.withoutDocs({ charFlagMap.set(char, flagName); } else { context.report({ - node, + node: charNode, messageId: 'message', data: { flag1: flagName, diff --git a/src/shared/commands.ts b/src/shared/commands.ts index 3cf4fbbd..ec3db2e8 100644 --- a/src/shared/commands.ts +++ b/src/shared/commands.ts @@ -15,6 +15,9 @@ export const isClassDeclaration = (node: TSESTree.Node): node is TSESTree.ClassD export const ancestorsContainsSfCommand = (ancestors: TSESTree.Node[]): boolean => ancestors.some((a) => isClassDeclaration(a) && extendsSfCommand(a)); +export const getSfCommand = (ancestors: TSESTree.Node[]): TSESTree.ClassDeclaration | undefined => + ancestors.find((a) => isClassDeclaration(a) && extendsSfCommand(a)) as TSESTree.ClassDeclaration; + export const extendsSfCommand = (node: TSESTree.ClassDeclaration): boolean => node.superClass?.type === AST_NODE_TYPES.Identifier && node.superClass.name === 'SfCommand'; @@ -24,5 +27,18 @@ export const getClassPropertyIdentifierName = (node: TSESTree.ClassElement): str // we don't care what the types are, really any context will do // eslint-disable-next-line @typescript-eslint/no-explicit-any export const isInCommandDirectory = (context: RuleContext): boolean => { - return context.getPhysicalFilename().includes(`${sep}commands${sep}`); // not an sfCommand + return context.getPhysicalFilename().includes(`src${sep}commands${sep}`); // not an sfCommand }; + +export const getRunMethod = (node: TSESTree.ClassDeclaration): TSESTree.ClassElement => + node.body.body.find( + (b) => + b.type === 'MethodDefinition' && + b.kind === 'method' && + b.computed === false && + b.accessibility === 'public' && + b.static === false && + b.override === false && + b.key.type === 'Identifier' && + b.key.name === 'run' + ); diff --git a/yarn.lock b/yarn.lock index 0b4b63a9..e2176499 100644 --- a/yarn.lock +++ b/yarn.lock @@ -662,11 +662,16 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^0.0.52": +"@types/estree@*": version "0.0.52" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.52.tgz#7f1f57ad5b741f3d5b210d3b1f145640d89bf8fe" integrity sha512-BZWrtCU0bMVAIliIV+HJO1f1PR41M7NKjfxrFJwwhKI1KwhwOxYw1SXg9ao+CIMt774nFuGiG6eU+udtbEI9oQ== +"@types/estree@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + "@types/graceful-fs@^4.1.3": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" @@ -748,14 +753,14 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.44.0.tgz#105788f299050c917eb85c4d9fd04b089e3740de" - integrity sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw== +"@typescript-eslint/eslint-plugin@^5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz#ffa505cf961d4844d38cfa19dcec4973a6039e41" + integrity sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA== dependencies: - "@typescript-eslint/scope-manager" "5.44.0" - "@typescript-eslint/type-utils" "5.44.0" - "@typescript-eslint/utils" "5.44.0" + "@typescript-eslint/scope-manager" "5.45.0" + "@typescript-eslint/type-utils" "5.45.0" + "@typescript-eslint/utils" "5.45.0" debug "^4.3.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" @@ -763,72 +768,72 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.44.0.tgz#99e2c710a2252191e7a79113264f438338b846ad" - integrity sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA== +"@typescript-eslint/parser@^5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.45.0.tgz#b18a5f6b3cf1c2b3e399e9d2df4be40d6b0ddd0e" + integrity sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ== dependencies: - "@typescript-eslint/scope-manager" "5.44.0" - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/typescript-estree" "5.44.0" + "@typescript-eslint/scope-manager" "5.45.0" + "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/typescript-estree" "5.45.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz#988c3f34b45b3474eb9ff0674c18309dedfc3e04" - integrity sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g== +"@typescript-eslint/scope-manager@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz#7a4ac1bfa9544bff3f620ab85947945938319a96" + integrity sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw== dependencies: - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/visitor-keys" "5.44.0" + "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/visitor-keys" "5.45.0" -"@typescript-eslint/type-utils@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.44.0.tgz#bc5a6e8a0269850714a870c9268c038150dfb3c7" - integrity sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w== +"@typescript-eslint/type-utils@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz#aefbc954c40878fcebeabfb77d20d84a3da3a8b2" + integrity sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q== dependencies: - "@typescript-eslint/typescript-estree" "5.44.0" - "@typescript-eslint/utils" "5.44.0" + "@typescript-eslint/typescript-estree" "5.45.0" + "@typescript-eslint/utils" "5.45.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.44.0.tgz#f3f0b89aaff78f097a2927fe5688c07e786a0241" - integrity sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ== +"@typescript-eslint/types@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.45.0.tgz#794760b9037ee4154c09549ef5a96599621109c5" + integrity sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA== -"@typescript-eslint/typescript-estree@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz#0461b386203e8d383bb1268b1ed1da9bc905b045" - integrity sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw== +"@typescript-eslint/typescript-estree@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz#f70a0d646d7f38c0dfd6936a5e171a77f1e5291d" + integrity sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ== dependencies: - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/visitor-keys" "5.44.0" + "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/visitor-keys" "5.45.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.44.0", "@typescript-eslint/utils@^5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.44.0.tgz#d733da4d79d6c30f1a68b531cdda1e0c1f00d52d" - integrity sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw== +"@typescript-eslint/utils@5.45.0", "@typescript-eslint/utils@^5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.45.0.tgz#9cca2996eee1b8615485a6918a5c763629c7acf5" + integrity sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.44.0" - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/typescript-estree" "5.44.0" + "@typescript-eslint/scope-manager" "5.45.0" + "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/typescript-estree" "5.45.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz#10740dc28902bb903d12ee3a005cc3a70207d433" - integrity sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ== +"@typescript-eslint/visitor-keys@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz#e0d160e9e7fdb7f8da697a5b78e7a14a22a70528" + integrity sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg== dependencies: - "@typescript-eslint/types" "5.44.0" + "@typescript-eslint/types" "5.45.0" eslint-visitor-keys "^3.3.0" acorn-jsx@^5.3.2: @@ -1538,10 +1543,10 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@^8.28.0: - version "8.28.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e" - integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ== +eslint@^8.29.0: + version "8.29.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.29.0.tgz#d74a88a20fb44d59c51851625bc4ee8d0ec43f87" + integrity sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg== dependencies: "@eslint/eslintrc" "^1.3.3" "@humanwhocodes/config-array" "^0.11.6"