From f0a60abfec74f48d1ef6cbc43cd7329812b45fb5 Mon Sep 17 00:00:00 2001 From: Abraham Guo Date: Mon, 19 Aug 2024 21:19:33 -0500 Subject: [PATCH 1/4] enable and autofix --- eslint.config.mjs | 1 + packages/ast-spec/tests/fixtures.test.ts | 12 ++++-------- packages/ast-spec/tests/util/serializers/Node.ts | 2 +- packages/eslint-plugin/src/rules/member-ordering.ts | 8 ++++---- packages/eslint-plugin/src/rules/no-shadow.ts | 2 +- packages/eslint-plugin/src/rules/prefer-readonly.ts | 4 ++-- .../eslint-plugin/src/rules/unified-signatures.ts | 2 +- .../src/generateType.ts | 2 +- .../src/optimizeAST.ts | 2 +- packages/rule-tester/src/utils/flat-config-schema.ts | 2 +- packages/scope-manager/src/ScopeManager.ts | 2 +- packages/scope-manager/tests/fixtures.test.ts | 2 +- .../src/create-program/createProjectProgramError.ts | 2 +- packages/typescript-estree/src/getModifiers.ts | 4 ++-- .../src/parseSettings/warnAboutTSVersion.ts | 4 +--- .../src/useProgramFromProjectService.ts | 2 +- packages/utils/src/eslint-utils/deepMerge.ts | 2 +- .../src/components/config/ConfigTypeScript.tsx | 2 +- .../website/src/components/editor/LoadedEditor.tsx | 2 +- .../src/components/editor/useSandboxServices.ts | 11 +++++++---- packages/website/src/components/lib/jsonSchema.ts | 4 ++-- .../website/src/components/linter/createLinter.ts | 2 +- .../website/src/components/linter/createParser.ts | 2 +- tools/scripts/generate-lib.mts | 6 ++---- 24 files changed, 40 insertions(+), 44 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index b6d0d392d19d..47c331cd18f1 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -326,6 +326,7 @@ export default tseslint.config( 'unicorn/no-useless-spread': 'error', 'unicorn/prefer-node-protocol': 'error', 'unicorn/prefer-regexp-test': 'error', + 'unicorn/prefer-spread': 'error', 'unicorn/prefer-string-replace-all': 'error', }, }, diff --git a/packages/ast-spec/tests/fixtures.test.ts b/packages/ast-spec/tests/fixtures.test.ts index e0cdcc832fe2..fe0207126d5e 100644 --- a/packages/ast-spec/tests/fixtures.test.ts +++ b/packages/ast-spec/tests/fixtures.test.ts @@ -339,16 +339,12 @@ describe('AST Fixtures', () => { // once we've run all the tests, snapshot the list of fixtures that have differences for easy reference it('List fixtures with AST differences', () => { - expect( - Array.from(fixturesWithASTDifferences).sort(), - ).toMatchSpecificSnapshot( + expect([...fixturesWithASTDifferences].sort()).toMatchSpecificSnapshot( path.resolve(__dirname, 'fixtures-with-differences-ast.shot'), ); }); it('List fixtures with Token differences', () => { - expect( - Array.from(fixturesWithTokenDifferences).sort(), - ).toMatchSpecificSnapshot( + expect([...fixturesWithTokenDifferences].sort()).toMatchSpecificSnapshot( path.resolve(__dirname, 'fixtures-with-differences-tokens.shot'), ); }); @@ -357,7 +353,7 @@ describe('AST Fixtures', () => { Object.fromEntries( Object.entries(fixturesWithErrorDifferences).map(([key, value]) => [ key, - Array.from(value).sort(), + [...value].sort(), ]), ), ).toMatchSpecificSnapshot( @@ -366,7 +362,7 @@ describe('AST Fixtures', () => { }); it('List fixtures we expect babel to not support', () => { expect( - Array.from(fixturesConfiguredToExpectBabelToNotSupport).sort(), + [...fixturesConfiguredToExpectBabelToNotSupport].sort(), ).toMatchSpecificSnapshot( path.resolve(__dirname, 'fixtures-without-babel-support.shot'), ); diff --git a/packages/ast-spec/tests/util/serializers/Node.ts b/packages/ast-spec/tests/util/serializers/Node.ts index a0fe170f4501..05b7f70f20c9 100644 --- a/packages/ast-spec/tests/util/serializers/Node.ts +++ b/packages/ast-spec/tests/util/serializers/Node.ts @@ -21,7 +21,7 @@ function sortKeys( keySet.delete('interpreter'); } - return Array.from(keySet).sort((a, b) => + return [...keySet].sort((a, b) => a.localeCompare(b), ) as (keyof typeof node)[]; } diff --git a/packages/eslint-plugin/src/rules/member-ordering.ts b/packages/eslint-plugin/src/rules/member-ordering.ts index 93e5f45adcdc..3c174c45affe 100644 --- a/packages/eslint-plugin/src/rules/member-ordering.ts +++ b/packages/eslint-plugin/src/rules/member-ordering.ts @@ -299,8 +299,8 @@ export const defaultOrder: MemberType[] = [ 'method', ]; -const allMemberTypes = Array.from( - ( +const allMemberTypes = [ + ...( [ 'readonly-signature', 'signature', @@ -367,7 +367,7 @@ const allMemberTypes = Array.from( return all; }, new Set()), -); +]; const functionExpressions = [ AST_NODE_TYPES.FunctionExpression, @@ -511,7 +511,7 @@ function getRankOrder( orderConfig: MemberType[], ): number { let rank = -1; - const stack = memberGroups.slice(); // Get a copy of the member groups + const stack = [...memberGroups]; // Get a copy of the member groups while (stack.length > 0 && rank === -1) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion diff --git a/packages/eslint-plugin/src/rules/no-shadow.ts b/packages/eslint-plugin/src/rules/no-shadow.ts index 152d536239e8..a8319ef7aac4 100644 --- a/packages/eslint-plugin/src/rules/no-shadow.ts +++ b/packages/eslint-plugin/src/rules/no-shadow.ts @@ -634,7 +634,7 @@ export default createRule({ return { 'Program:exit'(node): void { const globalScope = context.sourceCode.getScope(node); - const stack = globalScope.childScopes.slice(); + const stack = [...globalScope.childScopes]; while (stack.length) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion diff --git a/packages/eslint-plugin/src/rules/prefer-readonly.ts b/packages/eslint-plugin/src/rules/prefer-readonly.ts index f163b1aaab34..d7746b0a6990 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly.ts @@ -458,8 +458,8 @@ class ClassScope { }); return [ - ...Array.from(this.privateModifiableMembers.values()), - ...Array.from(this.privateModifiableStatics.values()), + ...this.privateModifiableMembers.values(), + ...this.privateModifiableStatics.values(), ]; } } diff --git a/packages/eslint-plugin/src/rules/unified-signatures.ts b/packages/eslint-plugin/src/rules/unified-signatures.ts index 9a6705576ed4..ee012cceb0ed 100644 --- a/packages/eslint-plugin/src/rules/unified-signatures.ts +++ b/packages/eslint-plugin/src/rules/unified-signatures.ts @@ -515,7 +515,7 @@ export default createRule({ 'checkScope() called without a current scope', ); const failures = checkOverloads( - Array.from(scope.overloads.values()), + [...scope.overloads.values()], scope.typeParameters, ); addFailures(failures); diff --git a/packages/rule-schema-to-typescript-types/src/generateType.ts b/packages/rule-schema-to-typescript-types/src/generateType.ts index a2477a546338..26cacf80f817 100644 --- a/packages/rule-schema-to-typescript-types/src/generateType.ts +++ b/packages/rule-schema-to-typescript-types/src/generateType.ts @@ -36,7 +36,7 @@ export function generateType(schema: JSONSchema4, refMap: RefMap): AST { throw new UnexpectedError( `Could not find definition for $ref ${ schema.$ref - }.\nAvailable refs:\n${Array.from(refMap.keys()).join('\n')})`, + }.\nAvailable refs:\n${[...refMap.keys()].join('\n')})`, schema, ); } diff --git a/packages/rule-schema-to-typescript-types/src/optimizeAST.ts b/packages/rule-schema-to-typescript-types/src/optimizeAST.ts index ba39aae909a3..14a0fd1c778a 100644 --- a/packages/rule-schema-to-typescript-types/src/optimizeAST.ts +++ b/packages/rule-schema-to-typescript-types/src/optimizeAST.ts @@ -44,7 +44,7 @@ export function optimizeAST(ast: AST | null): void { for (const element of elements) { uniqueElementsMap.set(JSON.stringify(element), element); } - const uniqueElements = Array.from(uniqueElementsMap.values()); + const uniqueElements = [...uniqueElementsMap.values()]; // @ts-expect-error -- purposely overwriting the property with a flattened list ast.elements = uniqueElements; diff --git a/packages/rule-tester/src/utils/flat-config-schema.ts b/packages/rule-tester/src/utils/flat-config-schema.ts index 89a1e18fad71..2be89f4c81d8 100644 --- a/packages/rule-tester/src/utils/flat-config-schema.ts +++ b/packages/rule-tester/src/utils/flat-config-schema.ts @@ -122,7 +122,7 @@ function normalizeRuleOptions( ruleOptions: SharedConfig.RuleLevel | SharedConfig.RuleLevelAndOptions, ): SharedConfig.RuleLevelAndOptions { const finalOptions = Array.isArray(ruleOptions) - ? ruleOptions.slice(0) + ? [...ruleOptions] : [ruleOptions]; finalOptions[0] = ruleSeverities.get( diff --git a/packages/scope-manager/src/ScopeManager.ts b/packages/scope-manager/src/ScopeManager.ts index 5814b6a78034..3fe70f467809 100644 --- a/packages/scope-manager/src/ScopeManager.ts +++ b/packages/scope-manager/src/ScopeManager.ts @@ -56,7 +56,7 @@ class ScopeManager { scope.childScopes.forEach(recurse); } this.scopes.forEach(recurse); - return Array.from(variables).sort((a, b) => a.$id - b.$id); + return [...variables].sort((a, b) => a.$id - b.$id); } constructor(options: ScopeManagerOptions) { diff --git a/packages/scope-manager/tests/fixtures.test.ts b/packages/scope-manager/tests/fixtures.test.ts index 5ddf348764c7..7ccf64f08fbc 100644 --- a/packages/scope-manager/tests/fixtures.test.ts +++ b/packages/scope-manager/tests/fixtures.test.ts @@ -125,7 +125,7 @@ function nestDescribe( if (type[1] && !type[1].has(value)) { throw new Error( - `Expected value for ${key} to be one of (${Array.from(type[1]).join( + `Expected value for ${key} to be one of (${[...type[1]].join( ' | ', )}), but got ${value as string}`, ); diff --git a/packages/typescript-estree/src/create-program/createProjectProgramError.ts b/packages/typescript-estree/src/create-program/createProjectProgramError.ts index 2af659b217f6..9bf5d67da280 100644 --- a/packages/typescript-estree/src/create-program/createProjectProgramError.ts +++ b/packages/typescript-estree/src/create-program/createProjectProgramError.ts @@ -35,7 +35,7 @@ function getErrorStart( describedFilePath: string, parseSettings: ParseSettings, ): string { - const relativeProjects = Array.from(parseSettings.projects.values()).map( + const relativeProjects = [...parseSettings.projects.values()].map( projectFile => describeFilePath(projectFile, parseSettings.tsconfigRootDir), ); diff --git a/packages/typescript-estree/src/getModifiers.ts b/packages/typescript-estree/src/getModifiers.ts index 42609a518c58..e6e4c3951123 100644 --- a/packages/typescript-estree/src/getModifiers.ts +++ b/packages/typescript-estree/src/getModifiers.ts @@ -17,7 +17,7 @@ export function getModifiers( if (includeIllegalModifiers || ts.canHaveModifiers(node)) { // eslint-disable-next-line deprecation/deprecation -- this is safe as it's guarded const modifiers = ts.getModifiers(node as ts.HasModifiers); - return modifiers ? Array.from(modifiers) : undefined; + return modifiers ? [...modifiers] : undefined; } return undefined; @@ -44,7 +44,7 @@ export function getDecorators( if (includeIllegalDecorators || ts.canHaveDecorators(node)) { // eslint-disable-next-line deprecation/deprecation -- this is safe as it's guarded const decorators = ts.getDecorators(node as ts.HasDecorators); - return decorators ? Array.from(decorators) : undefined; + return decorators ? [...decorators] : undefined; } return undefined; diff --git a/packages/typescript-estree/src/parseSettings/warnAboutTSVersion.ts b/packages/typescript-estree/src/parseSettings/warnAboutTSVersion.ts index 710d5c69d587..c338c538bfec 100644 --- a/packages/typescript-estree/src/parseSettings/warnAboutTSVersion.ts +++ b/packages/typescript-estree/src/parseSettings/warnAboutTSVersion.ts @@ -16,9 +16,7 @@ const SUPPORTED_PRERELEASE_RANGES: string[] = []; const ACTIVE_TYPESCRIPT_VERSION = ts.version; const isRunningSupportedTypeScriptVersion = semver.satisfies( ACTIVE_TYPESCRIPT_VERSION, - [SUPPORTED_TYPESCRIPT_VERSIONS] - .concat(SUPPORTED_PRERELEASE_RANGES) - .join(' || '), + [SUPPORTED_TYPESCRIPT_VERSIONS, ...SUPPORTED_PRERELEASE_RANGES].join(' || '), ); let warnedAboutTSVersion = false; diff --git a/packages/typescript-estree/src/useProgramFromProjectService.ts b/packages/typescript-estree/src/useProgramFromProjectService.ts index e4c306b0ebee..077a2e447446 100644 --- a/packages/typescript-estree/src/useProgramFromProjectService.ts +++ b/packages/typescript-estree/src/useProgramFromProjectService.ts @@ -93,7 +93,7 @@ function openClientFileFromProjectService( serviceSettings.maximumDefaultProjectFileMatchCount ) { const filePrintLimit = 20; - const filesToPrint = Array.from(defaultProjectMatchedFiles).slice( + const filesToPrint = [...defaultProjectMatchedFiles].slice( 0, filePrintLimit, ); diff --git a/packages/utils/src/eslint-utils/deepMerge.ts b/packages/utils/src/eslint-utils/deepMerge.ts index b764e2294653..9a1a421249f7 100644 --- a/packages/utils/src/eslint-utils/deepMerge.ts +++ b/packages/utils/src/eslint-utils/deepMerge.ts @@ -22,7 +22,7 @@ export function deepMerge( // get the unique set of keys across both objects const keys = new Set(Object.keys(first).concat(Object.keys(second))); - return Array.from(keys).reduce((acc, key) => { + return [...keys].reduce((acc, key) => { const firstHasKey = key in first; const secondHasKey = key in second; const firstValue = first[key]; diff --git a/packages/website/src/components/config/ConfigTypeScript.tsx b/packages/website/src/components/config/ConfigTypeScript.tsx index 1f45569df9c8..9d9352aef689 100644 --- a/packages/website/src/components/config/ConfigTypeScript.tsx +++ b/packages/website/src/components/config/ConfigTypeScript.tsx @@ -50,7 +50,7 @@ function ConfigTypeScript(props: ConfigTypeScriptProps): React.JSX.Element { key: item.name, type: 'string', label: item.description.message, - enum: ['', ...Array.from(item.type.keys())], + enum: ['', ...item.type.keys()], }); } return group; diff --git a/packages/website/src/components/editor/LoadedEditor.tsx b/packages/website/src/components/editor/LoadedEditor.tsx index 6dab67a39278..954b0bc4439d 100644 --- a/packages/website/src/components/editor/LoadedEditor.tsx +++ b/packages/website/src/components/editor/LoadedEditor.tsx @@ -155,7 +155,7 @@ export const LoadedEditor: React.FC = ({ enableSchemaRequest: false, allowComments: true, schemas: [ - ...Array.from(webLinter.rules.values()).map(rule => ({ + ...[...webLinter.rules.values()].map(rule => ({ uri: createRuleUri(rule.name), schema: getRuleJsonSchemaWithErrorLevel(rule.name, rule.schema), })), diff --git a/packages/website/src/components/editor/useSandboxServices.ts b/packages/website/src/components/editor/useSandboxServices.ts index 7e2eab3ef2a3..1f139e4ef21e 100644 --- a/packages/website/src/components/editor/useSandboxServices.ts +++ b/packages/website/src/components/editor/useSandboxServices.ts @@ -118,10 +118,13 @@ export const useSandboxServices = ( ); onLoaded( - Array.from(webLinter.rules.values()), - Array.from( - new Set([...sandboxInstance.supportedVersions, window.ts.version]), - ) + [...webLinter.rules.values()], + [ + ...new Set([ + ...sandboxInstance.supportedVersions, + window.ts.version, + ]), + ] .filter(item => semverSatisfies(item, rootPackageJson.devDependencies.typescript), ) diff --git a/packages/website/src/components/lib/jsonSchema.ts b/packages/website/src/components/lib/jsonSchema.ts index f8870f61b241..d1ccef7718e3 100644 --- a/packages/website/src/components/lib/jsonSchema.ts +++ b/packages/website/src/components/lib/jsonSchema.ts @@ -187,7 +187,7 @@ export function getTypescriptJsonSchema(): JSONSchema4 { type: 'array', items: { type: 'string', - enum: Array.from(item.element.type.keys()), + enum: [...item.element.type.keys()], }, description: item.description.message, }; @@ -195,7 +195,7 @@ export function getTypescriptJsonSchema(): JSONSchema4 { options[item.name] = { type: 'string', description: item.description.message, - enum: Array.from(item.type.keys()), + enum: [...item.type.keys()], }; } return options; diff --git a/packages/website/src/components/linter/createLinter.ts b/packages/website/src/components/linter/createLinter.ts index ea0a1abc0b5a..405dab2e8e57 100644 --- a/packages/website/src/components/linter/createLinter.ts +++ b/packages/website/src/components/linter/createLinter.ts @@ -182,7 +182,7 @@ export function createLinter( return { rules, - configs: Array.from(configs.keys()), + configs: [...configs.keys()], triggerFix, triggerLint, updateParserOptions, diff --git a/packages/website/src/components/linter/createParser.ts b/packages/website/src/components/linter/createParser.ts index 08e3c17fd0ee..a32ca342c177 100644 --- a/packages/website/src/components/linter/createParser.ts +++ b/packages/website/src/components/linter/createParser.ts @@ -27,7 +27,7 @@ export function createParser( ): tsvfs.VirtualTypeScriptEnvironment => { return vfs.createVirtualTypeScriptEnvironment( system, - Array.from(registeredFiles), + [...registeredFiles], window.ts, compilerOptions, ); diff --git a/tools/scripts/generate-lib.mts b/tools/scripts/generate-lib.mts index 18fbfdba1d6a..12ef2fabc8fe 100644 --- a/tools/scripts/generate-lib.mts +++ b/tools/scripts/generate-lib.mts @@ -237,7 +237,7 @@ async function main(): Promise { if (requiredBaseImports.size > 0) { imports.push( - `import {${Array.from(requiredBaseImports) + `import {${[...requiredBaseImports] .sort() .join(',')}} from './${BASE_CONFIG_MODULE_NAME}';`, ); @@ -288,9 +288,7 @@ async function main(): Promise { // generate a string union type for the lib names const libUnionCode = [ - `type Lib = ${Array.from(libMap.keys()) - .map(k => `'${k}'`) - .join(' | ')};`, + `type Lib = ${[...libMap.keys()].map(k => `'${k}'`).join(' | ')};`, '', 'export { Lib };', ]; From 2a1f5ca591f9aaa236a1ba8149bd4120a9f07f79 Mon Sep 17 00:00:00 2001 From: Abraham Guo Date: Mon, 19 Aug 2024 21:32:37 -0500 Subject: [PATCH 2/4] non autofixable cases --- .../src/rules/consistent-type-exports.ts | 2 +- .../src/rules/prefer-function-type.ts | 7 ++--- .../tests/rules/no-inferrable-types.test.ts | 14 ++++------ .../src/printAST.ts | 2 +- packages/typescript-estree/src/convert.ts | 9 ++++--- .../getWatchProgramsForProjects.ts | 2 +- .../src/parseSettings/resolveProjectList.ts | 27 +++++++++---------- packages/utils/src/eslint-utils/deepMerge.ts | 2 +- packages/website-eslint/src/mock/path.js | 2 +- .../src/theme/NotFound/Content/index.tsx | 2 +- 10 files changed, 33 insertions(+), 36 deletions(-) diff --git a/packages/eslint-plugin/src/rules/consistent-type-exports.ts b/packages/eslint-plugin/src/rules/consistent-type-exports.ts index 236659d13adb..959d6dfe1161 100644 --- a/packages/eslint-plugin/src/rules/consistent-type-exports.ts +++ b/packages/eslint-plugin/src/rules/consistent-type-exports.ts @@ -290,7 +290,7 @@ function* fixSeparateNamedExports( ): IterableIterator { const { node, typeBasedSpecifiers, inlineTypeSpecifiers, valueSpecifiers } = report; - const typeSpecifiers = typeBasedSpecifiers.concat(inlineTypeSpecifiers); + const typeSpecifiers = [...typeBasedSpecifiers, ...inlineTypeSpecifiers]; const source = getSourceFromExport(node); const specifierNames = typeSpecifiers.map(getSpecifierText).join(', '); diff --git a/packages/eslint-plugin/src/rules/prefer-function-type.ts b/packages/eslint-plugin/src/rules/prefer-function-type.ts index c7372c067f0b..74ee9ac968b7 100644 --- a/packages/eslint-plugin/src/rules/prefer-function-type.ts +++ b/packages/eslint-plugin/src/rules/prefer-function-type.ts @@ -108,9 +108,10 @@ export default createRule({ const text = context.sourceCode .getText() .slice(start, member.range[1]); - const comments = context.sourceCode - .getCommentsBefore(member) - .concat(context.sourceCode.getCommentsAfter(member)); + const comments = [ + ...context.sourceCode.getCommentsBefore(member), + ...context.sourceCode.getCommentsAfter(member), + ]; let suggestion = `${text.slice(0, colonPos)} =>${text.slice( colonPos + 1, )}`; diff --git a/packages/eslint-plugin/tests/rules/no-inferrable-types.test.ts b/packages/eslint-plugin/tests/rules/no-inferrable-types.test.ts index fa1b7f4ffa37..6d9ad9cce982 100644 --- a/packages/eslint-plugin/tests/rules/no-inferrable-types.test.ts +++ b/packages/eslint-plugin/tests/rules/no-inferrable-types.test.ts @@ -10,9 +10,6 @@ import type { type MessageIds = InferMessageIdsTypeFromRule; type Options = InferOptionsTypeFromRule; -function flatten(arr: T[][]): T[] { - return arr.reduce((acc, a) => acc.concat(a), []); -} const testCases = [ { type: 'bigint', @@ -70,11 +67,11 @@ const testCases = [ code: ['undefined', 'void someValue'], }, ]; -const validTestCases = flatten( - testCases.map(c => c.code.map(code => `const a = ${code}`)), +const validTestCases = testCases.flatMap(c => + c.code.map(code => `const a = ${code}`), ); -const invalidTestCases: InvalidTestCase[] = flatten( - testCases.map(cas => +const invalidTestCases: InvalidTestCase[] = + testCases.flatMap(cas => cas.code.map(code => ({ code: `const a: ${cas.type} = ${code}`, output: `const a = ${code}`, @@ -89,8 +86,7 @@ const invalidTestCases: InvalidTestCase[] = flatten( }, ], })), - ), -); + ); const ruleTester = new RuleTester(); diff --git a/packages/rule-schema-to-typescript-types/src/printAST.ts b/packages/rule-schema-to-typescript-types/src/printAST.ts index f2ff982fb3ab..746d0b850b0c 100644 --- a/packages/rule-schema-to-typescript-types/src/printAST.ts +++ b/packages/rule-schema-to-typescript-types/src/printAST.ts @@ -42,7 +42,7 @@ function printAST(ast: AST): CodeWithComments { const code = printAndMaybeParenthesise(ast.elementType); return { code: `${code.code}[]`, - commentLines: ast.commentLines.concat(code.commentLines), + commentLines: [...ast.commentLines, ...code.commentLines], }; } diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index 7fab3f5eaac4..5c94e0ffb054 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -1982,11 +1982,12 @@ export class Converter { ); break; case SyntaxKind.NamedImports: - result.specifiers = result.specifiers.concat( - node.importClause.namedBindings.elements.map(el => + result.specifiers = [ + ...result.specifiers, + ...node.importClause.namedBindings.elements.map(el => this.convertChild(el), ), - ); + ]; break; } } @@ -2163,7 +2164,7 @@ export class Converter { left.type === AST_NODE_TYPES.SequenceExpression && node.left.kind !== SyntaxKind.ParenthesizedExpression ) { - result.expressions = result.expressions.concat(left.expressions); + result.expressions.push(...left.expressions); } else { result.expressions.push(left); } diff --git a/packages/typescript-estree/src/create-program/getWatchProgramsForProjects.ts b/packages/typescript-estree/src/create-program/getWatchProgramsForProjects.ts index 16db33b6964e..473e73f2ae78 100644 --- a/packages/typescript-estree/src/create-program/getWatchProgramsForProjects.ts +++ b/packages/typescript-estree/src/create-program/getWatchProgramsForProjects.ts @@ -320,7 +320,7 @@ function createWatchProgram( path, !extensions ? undefined - : extensions.concat(parseSettings.extraFileExtensions), + : [...extensions, ...parseSettings.extraFileExtensions], exclude, include, depth, diff --git a/packages/typescript-estree/src/parseSettings/resolveProjectList.ts b/packages/typescript-estree/src/parseSettings/resolveProjectList.ts index 1e2155cd0103..2a5caec14c0f 100644 --- a/packages/typescript-estree/src/parseSettings/resolveProjectList.ts +++ b/packages/typescript-estree/src/parseSettings/resolveProjectList.ts @@ -94,21 +94,20 @@ export function resolveProjectList( const globProjects = sanitizedProjects.filter(project => isGlob(project)); const uniqueCanonicalProjectPaths = new Map( - nonGlobProjects - .concat( - globProjects.length === 0 - ? [] - : globSync([...globProjects, ...projectFolderIgnoreList], { - cwd: options.tsconfigRootDir, - dot: true, - }), - ) - .map(project => [ - getCanonicalFileName( - ensureAbsolutePath(project, options.tsconfigRootDir), - ), + [ + ...nonGlobProjects, + ...(globProjects.length === 0 + ? [] + : globSync([...globProjects, ...projectFolderIgnoreList], { + cwd: options.tsconfigRootDir, + dot: true, + })), + ].map(project => [ + getCanonicalFileName( ensureAbsolutePath(project, options.tsconfigRootDir), - ]), + ), + ensureAbsolutePath(project, options.tsconfigRootDir), + ]), ); log( diff --git a/packages/utils/src/eslint-utils/deepMerge.ts b/packages/utils/src/eslint-utils/deepMerge.ts index 9a1a421249f7..14d791cedfc0 100644 --- a/packages/utils/src/eslint-utils/deepMerge.ts +++ b/packages/utils/src/eslint-utils/deepMerge.ts @@ -20,7 +20,7 @@ export function deepMerge( second: ObjectLike = {}, ): Record { // get the unique set of keys across both objects - const keys = new Set(Object.keys(first).concat(Object.keys(second))); + const keys = new Set([...Object.keys(first), ...Object.keys(second)]); return [...keys].reduce((acc, key) => { const firstHasKey = key in first; diff --git a/packages/website-eslint/src/mock/path.js b/packages/website-eslint/src/mock/path.js index 674595ce81a7..e88a754a4eea 100644 --- a/packages/website-eslint/src/mock/path.js +++ b/packages/website-eslint/src/mock/path.js @@ -172,7 +172,7 @@ export function relative(from, to) { outputParts.push('..'); } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); + outputParts = [...outputParts, ...toParts.slice(samePartsLength)]; return outputParts.join('/'); } diff --git a/packages/website/src/theme/NotFound/Content/index.tsx b/packages/website/src/theme/NotFound/Content/index.tsx index 4bc63043527e..26990fa82a88 100644 --- a/packages/website/src/theme/NotFound/Content/index.tsx +++ b/packages/website/src/theme/NotFound/Content/index.tsx @@ -13,7 +13,7 @@ export default function NotFound(): React.JSX.Element {

$ npx eslint .
- {`'${location.pathname}'`.split('').map((letter, i) => ( + {[...`'${location.pathname}'`].map((letter, i) => ( {letter} From 736dd19ac7cfd5cf4b3c0e276b712be7938de3a2 Mon Sep 17 00:00:00 2001 From: Abraham Guo Date: Tue, 20 Aug 2024 06:53:46 -0500 Subject: [PATCH 3/4] use more push --- packages/typescript-estree/src/convert.ts | 5 ++--- packages/website-eslint/src/mock/path.js | 12 ++++-------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index 5c94e0ffb054..1759a1122691 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -1982,12 +1982,11 @@ export class Converter { ); break; case SyntaxKind.NamedImports: - result.specifiers = [ - ...result.specifiers, + result.specifiers.push( ...node.importClause.namedBindings.elements.map(el => this.convertChild(el), ), - ]; + ); break; } } diff --git a/packages/website-eslint/src/mock/path.js b/packages/website-eslint/src/mock/path.js index e88a754a4eea..3737bc24f8f3 100644 --- a/packages/website-eslint/src/mock/path.js +++ b/packages/website-eslint/src/mock/path.js @@ -167,14 +167,10 @@ export function relative(from, to) { } } - let outputParts = []; - for (let i = samePartsLength; i < fromParts.length; i++) { - outputParts.push('..'); - } - - outputParts = [...outputParts, ...toParts.slice(samePartsLength)]; - - return outputParts.join('/'); + return [ + ...Array(fromParts.length - samePartsLength).fill('..'), + ...toParts.slice(samePartsLength), + ].join('/'); } export const sep = '/'; From f4abc1866d86911aaba1728f66957ffd0d15e3a9 Mon Sep 17 00:00:00 2001 From: Abraham Guo Date: Tue, 20 Aug 2024 07:08:58 -0500 Subject: [PATCH 4/4] resolve no-unsafe-argument --- packages/typescript-estree/src/convert.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index 1759a1122691..4f4d95183611 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -1983,8 +1983,8 @@ export class Converter { break; case SyntaxKind.NamedImports: result.specifiers.push( - ...node.importClause.namedBindings.elements.map(el => - this.convertChild(el), + ...node.importClause.namedBindings.elements.map( + el => this.convertChild(el) as TSESTree.ImportClause, ), ); break;