diff --git a/package.json b/package.json index 331c858c7..9136fc0c6 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "docs:build": "yarn svelte-kit build", "docs:preview": "yarn svelte-kit preview", "docs:watch": "yarn svelte-kit dev", - "format-for-gen-file": "eslint src/types-for-node.ts src/utils/rules.ts src/configs --fix", + "format-for-gen-file": "eslint src/types-for-node.ts src/utils/rules.ts src/configs typings/estree/index.d.ts --fix", "install-with-ignore-engines": "yarn --ignore-engines", "lint": "run-p lint:*", "lint-fix": "yarn lint:es --fix && yarn lint:style --fix", @@ -100,7 +100,6 @@ "@types/eslint-scope": "^3.7.0", "@types/eslint-utils": "^3.0.1", "@types/eslint-visitor-keys": "^1.0.0", - "@types/estree": "^1.0.0", "@types/esutils": "^2.0.0", "@types/less": "^3.0.3", "@types/markdown-it": "^12.2.3", diff --git a/src/rules/@typescript-eslint/no-unnecessary-condition.ts b/src/rules/@typescript-eslint/no-unnecessary-condition.ts index 2b8278f1e..4364b4e38 100644 --- a/src/rules/@typescript-eslint/no-unnecessary-condition.ts +++ b/src/rules/@typescript-eslint/no-unnecessary-condition.ts @@ -3,7 +3,6 @@ // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts import type { TSESTree } from "@typescript-eslint/types" import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" import { createRule } from "../../utils" import { isFalsyType, @@ -183,7 +182,7 @@ export default createRule("@typescript-eslint/no-unnecessary-condition", { }) } - const mutableVarReferenceIds: ESTree.Identifier[] = [] + const mutableVarReferenceIds: TSESTree.Identifier[] = [] const scriptElements: AST.SvelteScriptElement[] = [] let inSvelteReactiveStatement = false @@ -238,7 +237,7 @@ export default createRule("@typescript-eslint/no-unnecessary-condition", { } return mutableVarReferenceIds.some( - (id) => node.range[0] <= id.range![0] && id.range![1] <= node.range[1], + (id) => node.range[0] <= id.range[0] && id.range[1] <= node.range[1], ) } diff --git a/src/rules/derived-has-same-inputs-outputs.ts b/src/rules/derived-has-same-inputs-outputs.ts index 1d9a7a328..6f5aeb57e 100644 --- a/src/rules/derived-has-same-inputs-outputs.ts +++ b/src/rules/derived-has-same-inputs-outputs.ts @@ -1,4 +1,4 @@ -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" import { createRule } from "../utils" import type { RuleContext } from "../types" import { extractStoreReferences } from "./reference-helpers/svelte-store" @@ -21,18 +21,18 @@ export default createRule("derived-has-same-inputs-outputs", { create(context) { /** check node type */ function isIdentifierOrArrayExpression( - node: ESTree.SpreadElement | ESTree.Expression, - ): node is ESTree.Identifier | ESTree.ArrayExpression { + node: TSESTree.SpreadElement | TSESTree.Expression, + ): node is TSESTree.Identifier | TSESTree.ArrayExpression { return ["Identifier", "ArrayExpression"].includes(node.type) } type ArrowFunctionExpressionOrFunctionExpression = - | ESTree.ArrowFunctionExpression - | ESTree.FunctionExpression + | TSESTree.ArrowFunctionExpression + | TSESTree.FunctionExpression /** check node type */ function isFunctionExpression( - node: ESTree.SpreadElement | ESTree.Expression, + node: TSESTree.SpreadElement | TSESTree.Expression, ): node is ArrowFunctionExpressionOrFunctionExpression { return ["ArrowFunctionExpression", "FunctionExpression"].includes( node.type, @@ -45,7 +45,7 @@ export default createRule("derived-has-same-inputs-outputs", { */ function checkIdentifier( context: RuleContext, - args: ESTree.Identifier, + args: TSESTree.Identifier, fn: ArrowFunctionExpressionOrFunctionExpression, ) { const fnParam = fn.params[0] @@ -54,7 +54,7 @@ export default createRule("derived-has-same-inputs-outputs", { if (expectedName !== fnParam.name) { context.report({ node: fn, - loc: fnParam.loc!, + loc: fnParam.loc, messageId: "unexpected", data: { name: expectedName }, }) @@ -67,7 +67,7 @@ export default createRule("derived-has-same-inputs-outputs", { */ function checkArrayExpression( context: RuleContext, - args: ESTree.ArrayExpression, + args: TSESTree.ArrayExpression, fn: ArrowFunctionExpressionOrFunctionExpression, ) { const fnParam = fn.params[0] @@ -82,7 +82,7 @@ export default createRule("derived-has-same-inputs-outputs", { if (expectedName !== element.name) { context.report({ node: fn, - loc: element.loc!, + loc: element.loc, messageId: "unexpected", data: { name: expectedName }, }) diff --git a/src/rules/first-attribute-linebreak.ts b/src/rules/first-attribute-linebreak.ts index b16b3c673..e08b06e7e 100644 --- a/src/rules/first-attribute-linebreak.ts +++ b/src/rules/first-attribute-linebreak.ts @@ -68,13 +68,11 @@ export default createRule("first-attribute-linebreak", { : multiline if (location === "beside") { - if ( - node.parent.name.loc!.end.line === firstAttribute.loc.start.line - ) { + if (node.parent.name.loc.end.line === firstAttribute.loc.start.line) { return } } else { - if (node.parent.name.loc!.end.line < firstAttribute.loc.start.line) { + if (node.parent.name.loc.end.line < firstAttribute.loc.start.line) { return } } diff --git a/src/rules/indent-helpers/ast.ts b/src/rules/indent-helpers/ast.ts index ddf107b8a..2e5e9c7c0 100644 --- a/src/rules/indent-helpers/ast.ts +++ b/src/rules/indent-helpers/ast.ts @@ -1,11 +1,11 @@ import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" type AnyToken = AST.Token | AST.Comment /** * Check whether the given token is a whitespace. */ export function isWhitespace( - token: AnyToken | ESTree.Comment | null | undefined, + token: AnyToken | TSESTree.Comment | null | undefined, ): boolean { return ( token != null && @@ -18,7 +18,7 @@ export function isWhitespace( * Check whether the given token is a not whitespace. */ export function isNotWhitespace( - token: AnyToken | ESTree.Comment | null | undefined, + token: AnyToken | TSESTree.Comment | null | undefined, ): boolean { return ( token != null && diff --git a/src/rules/indent-helpers/commons.ts b/src/rules/indent-helpers/commons.ts index ae3a11270..b825443ae 100644 --- a/src/rules/indent-helpers/commons.ts +++ b/src/rules/indent-helpers/commons.ts @@ -74,7 +74,7 @@ export function isBeginningOfLine( filter: isNotWhitespace, }) - return !prevToken || prevToken.loc.end.line < node.loc!.start.line + return !prevToken || prevToken.loc.end.line < node.loc.start.line } /** diff --git a/src/rules/indent-helpers/es.ts b/src/rules/indent-helpers/es.ts index 78d5b818a..b193a5801 100644 --- a/src/rules/indent-helpers/es.ts +++ b/src/rules/indent-helpers/es.ts @@ -1,5 +1,4 @@ import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" import type { TSESTree } from "@typescript-eslint/types" import type { IndentContext } from "./commons" import { getFirstAndLastTokens } from "./commons" @@ -35,10 +34,10 @@ export function defineVisitor(context: IndentContext): NodeListener { */ function getRootLeft( node: - | ESTree.AssignmentExpression - | ESTree.AssignmentPattern - | ESTree.BinaryExpression - | ESTree.LogicalExpression, + | TSESTree.AssignmentExpression + | TSESTree.AssignmentPattern + | TSESTree.BinaryExpression + | TSESTree.LogicalExpression, ) { let target = node let parent = getParent(target) @@ -68,7 +67,7 @@ export function defineVisitor(context: IndentContext): NodeListener { offsets.setStartOffsetToken(sourceCode.getFirstToken(body), 0) } }, - ArrayExpression(node: ESTree.ArrayExpression | ESTree.ArrayPattern) { + ArrayExpression(node: TSESTree.ArrayExpression | TSESTree.ArrayPattern) { const firstToken = sourceCode.getFirstToken(node) const rightToken = sourceCode.getTokenAfter( node.elements[node.elements.length - 1] || firstToken, @@ -76,10 +75,10 @@ export function defineVisitor(context: IndentContext): NodeListener { ) offsets.setOffsetElementList(node.elements, firstToken, rightToken, 1) }, - ArrayPattern(node: ESTree.ArrayPattern) { + ArrayPattern(node: TSESTree.ArrayPattern) { visitor.ArrayExpression(node) }, - ArrowFunctionExpression(node: ESTree.ArrowFunctionExpression) { + ArrowFunctionExpression(node: TSESTree.ArrowFunctionExpression) { const [firstToken, secondToken] = sourceCode.getFirstTokens(node, { count: 2, includeComments: false, @@ -112,10 +111,10 @@ export function defineVisitor(context: IndentContext): NodeListener { }, AssignmentExpression( node: - | ESTree.AssignmentExpression - | ESTree.AssignmentPattern - | ESTree.BinaryExpression - | ESTree.LogicalExpression, + | TSESTree.AssignmentExpression + | TSESTree.AssignmentPattern + | TSESTree.BinaryExpression + | TSESTree.LogicalExpression, ) { const leftNode = getRootLeft(node) const opToken = sourceCode.getTokenAfter(node.left, { @@ -133,21 +132,21 @@ export function defineVisitor(context: IndentContext): NodeListener { getFirstAndLastTokens(sourceCode, leftNode).firstToken, ) }, - AssignmentPattern(node: ESTree.AssignmentPattern) { + AssignmentPattern(node: TSESTree.AssignmentPattern) { visitor.AssignmentExpression(node) }, - BinaryExpression(node: ESTree.BinaryExpression) { + BinaryExpression(node: TSESTree.BinaryExpression) { visitor.AssignmentExpression(node) }, - LogicalExpression(node: ESTree.LogicalExpression) { + LogicalExpression(node: TSESTree.LogicalExpression) { visitor.AssignmentExpression(node) }, AwaitExpression( node: - | ESTree.AwaitExpression - | ESTree.RestElement - | ESTree.SpreadElement - | ESTree.UnaryExpression, + | TSESTree.AwaitExpression + | TSESTree.RestElement + | TSESTree.SpreadElement + | TSESTree.UnaryExpression, ) { // `await`, `...`, or UnaryOperator const firstToken = sourceCode.getFirstToken(node) @@ -155,16 +154,16 @@ export function defineVisitor(context: IndentContext): NodeListener { offsets.setOffsetToken(nextToken, 1, firstToken) }, - RestElement(node: ESTree.RestElement) { + RestElement(node: TSESTree.RestElement) { visitor.AwaitExpression(node) }, - SpreadElement(node: ESTree.SpreadElement) { + SpreadElement(node: TSESTree.SpreadElement) { visitor.AwaitExpression(node) }, - UnaryExpression(node: ESTree.UnaryExpression) { + UnaryExpression(node: TSESTree.UnaryExpression) { visitor.AwaitExpression(node) }, - BlockStatement(node: ESTree.BlockStatement | ESTree.ClassBody) { + BlockStatement(node: TSESTree.BlockStatement | TSESTree.ClassBody) { offsets.setOffsetElementList( node.body, sourceCode.getFirstToken(node), @@ -172,10 +171,10 @@ export function defineVisitor(context: IndentContext): NodeListener { 1, ) }, - ClassBody(node: ESTree.ClassBody) { + ClassBody(node: TSESTree.ClassBody) { visitor.BlockStatement(node) }, - BreakStatement(node: ESTree.BreakStatement | ESTree.ContinueStatement) { + BreakStatement(node: TSESTree.BreakStatement | TSESTree.ContinueStatement) { if (node.label) { const firstToken = sourceCode.getFirstToken(node) const nextToken = sourceCode.getTokenAfter(firstToken) @@ -183,10 +182,10 @@ export function defineVisitor(context: IndentContext): NodeListener { offsets.setOffsetToken(nextToken, 1, firstToken) } }, - ContinueStatement(node: ESTree.ContinueStatement) { + ContinueStatement(node: TSESTree.ContinueStatement) { visitor.BreakStatement(node) }, - CallExpression(node: ESTree.CallExpression) { + CallExpression(node: TSESTree.CallExpression) { const firstToken = sourceCode.getFirstToken(node) const leftParenToken = sourceCode.getTokenAfter(node.callee, { filter: isOpeningParenToken, @@ -210,7 +209,7 @@ export function defineVisitor(context: IndentContext): NodeListener { 1, ) }, - CatchClause(node: ESTree.CatchClause) { + CatchClause(node: TSESTree.CatchClause) { const catchToken = sourceCode.getFirstToken(node) if (node.param != null) { @@ -228,7 +227,9 @@ export function defineVisitor(context: IndentContext): NodeListener { const bodyToken = sourceCode.getFirstToken(node.body) offsets.setOffsetToken(bodyToken, 0, catchToken) }, - ClassDeclaration(node: ESTree.ClassDeclaration | ESTree.ClassExpression) { + ClassDeclaration( + node: TSESTree.ClassDeclaration | TSESTree.ClassExpression, + ) { const classToken = sourceCode.getFirstToken(node) if (node.id != null) { @@ -243,10 +244,10 @@ export function defineVisitor(context: IndentContext): NodeListener { const bodyToken = sourceCode.getFirstToken(node.body) offsets.setOffsetToken(bodyToken, 0, classToken) }, - ClassExpression(node: ESTree.ClassExpression) { + ClassExpression(node: TSESTree.ClassExpression) { visitor.ClassDeclaration(node) }, - ConditionalExpression(node: ESTree.ConditionalExpression) { + ConditionalExpression(node: TSESTree.ConditionalExpression) { const questionToken = sourceCode.getTokenAfter(node.test, { filter: isNotClosingParenToken, includeComments: false, @@ -275,7 +276,7 @@ export function defineVisitor(context: IndentContext): NodeListener { offsets.setOffsetToken(consequentToken, 1, questionToken) offsets.setOffsetToken(alternateToken, 1, colonToken) }, - DoWhileStatement(node: ESTree.DoWhileStatement) { + DoWhileStatement(node: TSESTree.DoWhileStatement) { const doToken = sourceCode.getFirstToken(node) const whileToken = sourceCode.getTokenAfter(node.body, { filter: isNotClosingParenToken, @@ -300,7 +301,7 @@ export function defineVisitor(context: IndentContext): NodeListener { 1, ) }, - ExportAllDeclaration(node: ESTree.ExportAllDeclaration) { + ExportAllDeclaration(node: TSESTree.ExportAllDeclaration) { const exportToken = sourceCode.getFirstToken(node) const tokens = sourceCode.getTokensBetween(exportToken, node.source) const fromIndex = tokens.findIndex((t) => t.value === "from") @@ -352,7 +353,7 @@ export function defineVisitor(context: IndentContext): NodeListener { } } }, - ExportDefaultDeclaration(node: ESTree.ExportDefaultDeclaration) { + ExportDefaultDeclaration(node: TSESTree.ExportDefaultDeclaration) { const exportToken = sourceCode.getFirstToken(node) const declarationToken = getFirstAndLastTokens( sourceCode, @@ -368,7 +369,7 @@ export function defineVisitor(context: IndentContext): NodeListener { exportToken, ) }, - ExportNamedDeclaration(node: ESTree.ExportNamedDeclaration) { + ExportNamedDeclaration(node: TSESTree.ExportNamedDeclaration) { const exportToken = sourceCode.getFirstToken(node) if (node.declaration) { // export var foo = 1; @@ -440,7 +441,7 @@ export function defineVisitor(context: IndentContext): NodeListener { } } }, - ExportSpecifier(node: ESTree.ExportSpecifier | ESTree.ImportSpecifier) { + ExportSpecifier(node: TSESTree.ExportSpecifier | TSESTree.ImportSpecifier) { const tokens = sourceCode.getTokens(node) let firstToken = tokens.shift()! if (firstToken.value === "type") { @@ -450,7 +451,7 @@ export function defineVisitor(context: IndentContext): NodeListener { } offsets.setOffsetToken(tokens, 1, firstToken) }, - ForInStatement(node: ESTree.ForInStatement | ESTree.ForOfStatement) { + ForInStatement(node: TSESTree.ForInStatement | TSESTree.ForOfStatement) { const forToken = sourceCode.getFirstToken(node) const awaitToken = (node.type === "ForOfStatement" && @@ -484,10 +485,10 @@ export function defineVisitor(context: IndentContext): NodeListener { forToken, ) }, - ForOfStatement(node: ESTree.ForOfStatement) { + ForOfStatement(node: TSESTree.ForOfStatement) { visitor.ForInStatement(node) }, - ForStatement(node: ESTree.ForStatement) { + ForStatement(node: TSESTree.ForStatement) { const forToken = sourceCode.getFirstToken(node) const leftParenToken = sourceCode.getTokenAfter(forToken)! const rightParenToken = sourceCode.getTokenBefore(node.body, { @@ -511,7 +512,7 @@ export function defineVisitor(context: IndentContext): NodeListener { ) }, FunctionDeclaration( - node: ESTree.FunctionDeclaration | ESTree.FunctionExpression, + node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression, ) { const firstToken = sourceCode.getFirstToken(node) @@ -524,7 +525,7 @@ export function defineVisitor(context: IndentContext): NodeListener { includeComments: false, }, )! - let bodyBaseToken + let bodyBaseToken: AST.Token | null = null if (firstToken.type === "Punctuator") { // method bodyBaseToken = sourceCode.getFirstToken(getParent(node)!) @@ -539,7 +540,7 @@ export function defineVisitor(context: IndentContext): NodeListener { } if ( token.value === "*" || - (node.id && token.range[0] === node.id.range![0]) + (node.id && token.range[0] === node.id.range[0]) ) { tokenOffset = 1 } @@ -564,10 +565,10 @@ export function defineVisitor(context: IndentContext): NodeListener { const bodyToken = sourceCode.getFirstToken(node.body) offsets.setOffsetToken(bodyToken, 0, bodyBaseToken) }, - FunctionExpression(node: ESTree.FunctionExpression) { + FunctionExpression(node: TSESTree.FunctionExpression) { visitor.FunctionDeclaration(node) }, - IfStatement(node: ESTree.IfStatement) { + IfStatement(node: TSESTree.IfStatement) { const [ifToken, ifLeftParenToken] = sourceCode.getFirstTokens(node, { count: 2, includeComments: false, @@ -603,7 +604,7 @@ export function defineVisitor(context: IndentContext): NodeListener { ) } }, - ImportDeclaration(node: ESTree.ImportDeclaration) { + ImportDeclaration(node: TSESTree.ImportDeclaration) { const importToken = sourceCode.getFirstToken(node) const tokens = sourceCode.getTokensBetween(importToken, node.source) const fromIndex = tokens.map((t) => t.value).lastIndexOf("from") @@ -623,7 +624,7 @@ export function defineVisitor(context: IndentContext): NodeListener { afterTokens: [], } - const namedSpecifiers: ESTree.ImportSpecifier[] = [] + const namedSpecifiers: TSESTree.ImportSpecifier[] = [] for (const specifier of node.specifiers) { if (specifier.type === "ImportSpecifier") { namedSpecifiers.push(specifier) @@ -694,7 +695,7 @@ export function defineVisitor(context: IndentContext): NodeListener { } } }, - ImportExpression(node: ESTree.ImportExpression) { + ImportExpression(node: TSESTree.ImportExpression) { const firstToken = sourceCode.getFirstToken(node) const rightToken = sourceCode.getLastToken(node) const leftToken = sourceCode.getTokenAfter(firstToken, { @@ -705,16 +706,16 @@ export function defineVisitor(context: IndentContext): NodeListener { offsets.setOffsetToken(leftToken, 1, firstToken) offsets.setOffsetElementList([node.source], leftToken, rightToken, 1) }, - ImportNamespaceSpecifier(node: ESTree.ImportNamespaceSpecifier) { + ImportNamespaceSpecifier(node: TSESTree.ImportNamespaceSpecifier) { const tokens = sourceCode.getTokens(node) const firstToken = tokens.shift()! offsets.setOffsetToken(tokens, 1, firstToken) }, - ImportSpecifier(node: ESTree.ImportSpecifier) { + ImportSpecifier(node: TSESTree.ImportSpecifier) { visitor.ExportSpecifier(node) }, LabeledStatement( - node: ESTree.LabeledStatement | AST.SvelteReactiveStatement, + node: TSESTree.LabeledStatement | AST.SvelteReactiveStatement, ) { const labelToken = sourceCode.getFirstToken(node) const colonToken = sourceCode.getTokenAfter(labelToken)! @@ -725,7 +726,7 @@ export function defineVisitor(context: IndentContext): NodeListener { SvelteReactiveStatement(node: AST.SvelteReactiveStatement) { visitor.LabeledStatement(node) }, - MemberExpression(node: ESTree.MemberExpression | ESTree.MetaProperty) { + MemberExpression(node: TSESTree.MemberExpression | TSESTree.MetaProperty) { const objectToken = sourceCode.getFirstToken(node) if (node.type === "MemberExpression" && node.computed) { const leftBracketToken = sourceCode.getTokenBefore(node.property, { @@ -759,14 +760,14 @@ export function defineVisitor(context: IndentContext): NodeListener { offsets.setOffsetToken([dotToken, propertyToken], 1, objectToken) } }, - MetaProperty(node: ESTree.MetaProperty) { + MetaProperty(node: TSESTree.MetaProperty) { visitor.MemberExpression(node) }, MethodDefinition( node: - | ESTree.MethodDefinition - | ESTree.Property - | ESTree.PropertyDefinition, + | TSESTree.MethodDefinition + | TSESTree.Property + | TSESTree.PropertyDefinition, ) { const firstToken = sourceCode.getFirstToken(node) const keyTokens = getFirstAndLastTokens(sourceCode, node.key) @@ -779,7 +780,7 @@ export function defineVisitor(context: IndentContext): NodeListener { } offsets.setOffsetToken(prefixTokens, 0, firstToken) - let lastKeyToken + let lastKeyToken: AST.Token | null if (node.computed) { const leftBracketToken = sourceCode.getTokenBefore( keyTokens.firstToken, @@ -808,17 +809,17 @@ export function defineVisitor(context: IndentContext): NodeListener { ) } }, - Property(node: ESTree.Property) { + Property(node: TSESTree.Property) { visitor.MethodDefinition(node) }, - NewExpression(node: ESTree.NewExpression) { + NewExpression(node: TSESTree.NewExpression) { const newToken = sourceCode.getFirstToken(node) const calleeTokens = getFirstAndLastTokens(sourceCode, node.callee) offsets.setOffsetToken(calleeTokens.firstToken, 1, newToken) if ( node.arguments.length || - calleeTokens.lastToken.range[1] < node.range![1] + calleeTokens.lastToken.range[1] < node.range[1] ) { const rightParenToken = sourceCode.getLastToken(node) const leftParenToken = sourceCode.getTokenAfter(calleeTokens.lastToken)! @@ -832,7 +833,7 @@ export function defineVisitor(context: IndentContext): NodeListener { ) } }, - ObjectExpression(node: ESTree.ObjectExpression | ESTree.ObjectPattern) { + ObjectExpression(node: TSESTree.ObjectExpression | TSESTree.ObjectPattern) { const firstToken = sourceCode.getFirstToken(node) const rightToken = sourceCode.getTokenAfter( node.properties[node.properties.length - 1] || firstToken, @@ -840,13 +841,13 @@ export function defineVisitor(context: IndentContext): NodeListener { ) offsets.setOffsetElementList(node.properties, firstToken, rightToken, 1) }, - ObjectPattern(node: ESTree.ObjectPattern) { + ObjectPattern(node: TSESTree.ObjectPattern) { visitor.ObjectExpression(node) }, - PropertyDefinition(node: ESTree.PropertyDefinition) { + PropertyDefinition(node: TSESTree.PropertyDefinition) { visitor.MethodDefinition(node) }, - ReturnStatement(node: ESTree.ReturnStatement | ESTree.ThrowStatement) { + ReturnStatement(node: TSESTree.ReturnStatement | TSESTree.ThrowStatement) { if (node.argument) { const firstToken = sourceCode.getFirstToken(node) const nextToken = sourceCode.getTokenAfter(firstToken) @@ -854,14 +855,14 @@ export function defineVisitor(context: IndentContext): NodeListener { offsets.setOffsetToken(nextToken, 1, firstToken) } }, - ThrowStatement(node: ESTree.ThrowStatement) { + ThrowStatement(node: TSESTree.ThrowStatement) { visitor.ReturnStatement(node) }, - SequenceExpression(node: ESTree.SequenceExpression) { + SequenceExpression(node: TSESTree.SequenceExpression) { const firstToken = sourceCode.getFirstToken(node) offsets.setOffsetElementList(node.expressions, firstToken, null, 0) }, - SwitchCase(node: ESTree.SwitchCase) { + SwitchCase(node: TSESTree.SwitchCase) { const caseToken = sourceCode.getFirstToken(node) if (node.test != null) { const testTokens = getFirstAndLastTokens(sourceCode, node.test) @@ -895,7 +896,7 @@ export function defineVisitor(context: IndentContext): NodeListener { } } }, - SwitchStatement(node: ESTree.SwitchStatement) { + SwitchStatement(node: TSESTree.SwitchStatement) { const switchToken = sourceCode.getFirstToken(node) const { firstToken: leftParenToken, lastToken: rightParenToken } = getFirstAndLastTokens(sourceCode, node.discriminant) @@ -917,7 +918,7 @@ export function defineVisitor(context: IndentContext): NodeListener { options.switchCase, ) }, - TaggedTemplateExpression(node: ESTree.TaggedTemplateExpression) { + TaggedTemplateExpression(node: TSESTree.TaggedTemplateExpression) { const tagTokens = getFirstAndLastTokens(sourceCode, node.tag) offsets.setOffsetToken( sourceCode.getFirstToken(node.quasi), @@ -925,7 +926,7 @@ export function defineVisitor(context: IndentContext): NodeListener { tagTokens.firstToken, ) }, - TemplateLiteral(node: ESTree.TemplateLiteral) { + TemplateLiteral(node: TSESTree.TemplateLiteral) { const firstToken = sourceCode.getFirstToken(node) const quasiTokens = node.quasis .slice(1) @@ -937,7 +938,7 @@ export function defineVisitor(context: IndentContext): NodeListener { offsets.setOffsetToken(quasiTokens, 0, firstToken) offsets.setOffsetToken(expressionToken, 1, firstToken) }, - TryStatement(node: ESTree.TryStatement) { + TryStatement(node: TSESTree.TryStatement) { const tryToken = sourceCode.getFirstToken(node) const tryBlockToken = sourceCode.getFirstToken(node.block) @@ -954,12 +955,12 @@ export function defineVisitor(context: IndentContext): NodeListener { offsets.setOffsetToken([finallyToken, finallyBlockToken], 0, tryToken) } }, - UpdateExpression(node: ESTree.UpdateExpression) { + UpdateExpression(node: TSESTree.UpdateExpression) { const firstToken = sourceCode.getFirstToken(node) const nextToken = sourceCode.getTokenAfter(firstToken) offsets.setOffsetToken(nextToken, 1, firstToken) }, - VariableDeclaration(node: ESTree.VariableDeclaration) { + VariableDeclaration(node: TSESTree.VariableDeclaration) { offsets.setOffsetElementList( node.declarations, sourceCode.getFirstToken(node), @@ -967,7 +968,7 @@ export function defineVisitor(context: IndentContext): NodeListener { 1, ) }, - VariableDeclarator(node: ESTree.VariableDeclarator) { + VariableDeclarator(node: TSESTree.VariableDeclarator) { if (node.init != null) { const idToken = sourceCode.getFirstToken(node) const eqToken = sourceCode.getTokenAfter(node.id)! @@ -976,7 +977,7 @@ export function defineVisitor(context: IndentContext): NodeListener { offsets.setOffsetToken([eqToken, initToken], 1, idToken) } }, - WhileStatement(node: ESTree.WhileStatement | ESTree.WithStatement) { + WhileStatement(node: TSESTree.WhileStatement | TSESTree.WithStatement) { const firstToken = sourceCode.getFirstToken(node) const leftParenToken = sourceCode.getTokenAfter(firstToken)! const rightParenToken = sourceCode.getTokenBefore(node.body, { @@ -994,10 +995,10 @@ export function defineVisitor(context: IndentContext): NodeListener { firstToken, ) }, - WithStatement(node: ESTree.WithStatement) { + WithStatement(node: TSESTree.WithStatement) { visitor.WhileStatement(node) }, - YieldExpression(node: ESTree.YieldExpression) { + YieldExpression(node: TSESTree.YieldExpression) { if (node.argument != null) { const [yieldToken, secondToken] = sourceCode.getFirstTokens(node, { count: 2, @@ -1058,7 +1059,7 @@ export function defineVisitor(context: IndentContext): NodeListener { // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ignore const commonVisitor: any = { - ":statement, PropertyDefinition"(node: ESTree.Statement) { + ":statement, PropertyDefinition"(node: TSESTree.Statement) { const firstToken = sourceCode.getFirstToken(node) const lastToken = sourceCode.getLastToken(node) if (isSemicolonToken(lastToken) && firstToken !== lastToken) { @@ -1069,7 +1070,7 @@ export function defineVisitor(context: IndentContext): NodeListener { } } }, - ":expression"(node: ESTree.Expression) { + ":expression"(node: TSESTree.Expression) { // Proc parentheses. let leftToken = sourceCode.getTokenBefore(node) let rightToken = sourceCode.getTokenAfter(node) diff --git a/src/rules/indent-helpers/index.ts b/src/rules/indent-helpers/index.ts index 5aa2150a7..ccb497294 100644 --- a/src/rules/indent-helpers/index.ts +++ b/src/rules/indent-helpers/index.ts @@ -1,5 +1,5 @@ import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" import type { ASTNode, RuleContext, RuleListener } from "../../types" import * as SV from "./svelte" import * as ES from "./es" @@ -249,7 +249,7 @@ export function defineVisitor( offsets.ignore(node) } }, - "Program:exit"(node: ESTree.Program) { + "Program:exit"(node: TSESTree.Program) { const calculator = offsets.getOffsetCalculator() let prevToken: AnyToken | null = null diff --git a/src/rules/indent-helpers/offset-context.ts b/src/rules/indent-helpers/offset-context.ts index 4a4788bfa..ee876250d 100644 --- a/src/rules/indent-helpers/offset-context.ts +++ b/src/rules/indent-helpers/offset-context.ts @@ -154,7 +154,7 @@ export class OffsetContext { for (const n of nodes) { if (n) { if (!isBeginningOfLine(this.sourceCode, n)) { - const startLoc = n.loc!.start + const startLoc = n.loc.start const alignIndent = startLoc.column - /^\s*/u.exec(this.sourceCode.lines[startLoc.line - 1])![0].length @@ -231,7 +231,7 @@ export class OffsetContext { * Ignore range of the given node. */ public ignore(node: ASTNode): void { - const range = node.range! + const range = node.range const n = this.ignoreRanges.get(range[0]) ?? 0 this.ignoreRanges.set(range[0], Math.max(n, range[1])) } diff --git a/src/rules/indent-helpers/ts.ts b/src/rules/indent-helpers/ts.ts index 6a23a80ed..33a1ebd39 100644 --- a/src/rules/indent-helpers/ts.ts +++ b/src/rules/indent-helpers/ts.ts @@ -1,5 +1,5 @@ +import type { AST } from "svelte-eslint-parser" import type { TSESTree } from "@typescript-eslint/types" -import type * as ESTree from "estree" import { isClosingBracketToken, isClosingParenToken, @@ -45,7 +45,7 @@ export function defineVisitor(context: IndentContext): NodeListener { // foo as T const expressionTokens = getFirstAndLastTokens( sourceCode, - node.expression as ESTree.Expression, + node.expression, ) const asToken = sourceCode.getTokenAfter(expressionTokens.lastToken)! offsets.setOffsetToken( @@ -91,7 +91,7 @@ export function defineVisitor(context: IndentContext): NodeListener { const idToken = sourceCode.getFirstToken(node.id) offsets.setOffsetToken(idToken, 1, typeToken) - let eqToken + let eqToken: AST.Token | null if (node.typeParameters) { offsets.setOffsetToken( sourceCode.getFirstToken(node.typeParameters), @@ -510,7 +510,7 @@ export function defineVisitor(context: IndentContext): NodeListener { // fn(arg: A): R | null; const firstToken = sourceCode.getFirstToken(node) const keyTokens = getFirstAndLastTokens(sourceCode, node.key) - let keyLast + let keyLast: AST.Token if (node.computed) { const closeBracket = sourceCode.getTokenAfter(keyTokens.lastToken)! offsets.setOffsetElementList([node.key], firstToken, closeBracket, 1) @@ -612,7 +612,7 @@ export function defineVisitor(context: IndentContext): NodeListener { node: TSESTree.TSEmptyBodyFunctionExpression | TSESTree.TSDeclareFunction, ) { const firstToken = sourceCode.getFirstToken(node) - let leftParenToken, bodyBaseToken + let leftParenToken: AST.Token, bodyBaseToken: AST.Token if (firstToken.type === "Punctuator") { // method leftParenToken = firstToken @@ -719,7 +719,7 @@ export function defineVisitor(context: IndentContext): NodeListener { } offsets.setOffsetToken(prefixTokens, 0, firstToken) - let lastKeyToken + let lastKeyToken: AST.Token if (node.computed) { const leftBracketToken = sourceCode.getTokenBefore( keyTokens.firstToken, @@ -1086,7 +1086,7 @@ export function defineVisitor(context: IndentContext): NodeListener { ["TSTypeAliasDeclaration, TSCallSignatureDeclaration, TSConstructSignatureDeclaration, TSImportEqualsDeclaration," + "TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSEnumMember," + "TSPropertySignature, TSIndexSignature, TSMethodSignature," + - "TSAbstractClassProperty, ClassProperty"](node: ESTree.Node) { + "TSAbstractClassProperty, ClassProperty"](node: TSESTree.Node) { const firstToken = sourceCode.getFirstToken(node) const lastToken = sourceCode.getLastToken(node) if (isSemicolonToken(lastToken) && firstToken !== lastToken) { diff --git a/src/rules/max-attributes-per-line.ts b/src/rules/max-attributes-per-line.ts index 33179c232..bebb479d8 100644 --- a/src/rules/max-attributes-per-line.ts +++ b/src/rules/max-attributes-per-line.ts @@ -76,7 +76,7 @@ export default createRule("max-attributes-per-line", { attribute.type === "SvelteStyleDirective" || attribute.type === "SvelteSpecialDirective" ) { - name = sourceCode.text.slice(...attribute.key.range!) + name = sourceCode.text.slice(...attribute.key.range) } else { // if (attribute.type === "SvelteSpreadAttribute") name = sourceCode.text.slice(...attribute.range) diff --git a/src/rules/no-dupe-else-if-blocks.ts b/src/rules/no-dupe-else-if-blocks.ts index e3e93a164..b76c869d7 100644 --- a/src/rules/no-dupe-else-if-blocks.ts +++ b/src/rules/no-dupe-else-if-blocks.ts @@ -1,5 +1,5 @@ import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" import { createRule } from "../utils" import { equalTokens } from "../utils/ast-utils" @@ -8,12 +8,12 @@ import { equalTokens } from "../utils/ast-utils" // ------------------------------------------------------------------------------ type OrOperands = { - node: ESTree.Expression + node: TSESTree.Expression operands: AndOperands[] } type AndOperands = { - node: ESTree.Expression - operands: ESTree.Expression[] + node: TSESTree.Expression + operands: TSESTree.Expression[] } /** @@ -23,9 +23,9 @@ type AndOperands = { * @returns Array of conditions that makes the node when joined by the operator. */ function splitByLogicalOperator( - operator: ESTree.LogicalExpression["operator"], - node: ESTree.Expression, -): ESTree.Expression[] { + operator: TSESTree.LogicalExpression["operator"], + node: TSESTree.Expression, +): TSESTree.Expression[] { if (node.type === "LogicalExpression" && node.operator === operator) { return [ ...splitByLogicalOperator(operator, node.left), @@ -38,21 +38,21 @@ function splitByLogicalOperator( /** * Split with ||. */ -function splitByOr(node: ESTree.Expression) { +function splitByOr(node: TSESTree.Expression) { return splitByLogicalOperator("||", node) } /** * Split with &&. */ -function splitByAnd(node: ESTree.Expression) { +function splitByAnd(node: TSESTree.Expression) { return splitByLogicalOperator("&&", node) } /** * Build OrOperands */ -function buildOrOperands(node: ESTree.Expression): OrOperands { +function buildOrOperands(node: TSESTree.Expression): OrOperands { const orOperands = splitByOr(node) return { node, @@ -91,7 +91,7 @@ export default createRule("no-dupe-else-if-blocks", { * @param b Second node. * @returns `true` if the nodes are considered to be equal. */ - function equal(a: ESTree.Expression, b: ESTree.Expression): boolean { + function equal(a: TSESTree.Expression, b: TSESTree.Expression): boolean { if (a.type !== b.type) { return false } diff --git a/src/rules/no-dupe-style-properties.ts b/src/rules/no-dupe-style-properties.ts index 847a09c9e..6a184dde0 100644 --- a/src/rules/no-dupe-style-properties.ts +++ b/src/rules/no-dupe-style-properties.ts @@ -63,7 +63,7 @@ export default createRule("no-dupe-style-properties", { for (const attr of attrs) { if (attr.type === "SvelteStyleDirective") { yield { - decls: [{ prop: attr.key.name.name, loc: attr.key.name.loc! }], + decls: [{ prop: attr.key.name.name, loc: attr.key.name.loc }], } } else if (attr.type === "SvelteAttribute") { if (attr.key.name !== "style") { diff --git a/src/rules/no-dynamic-slot-name.ts b/src/rules/no-dynamic-slot-name.ts index b5be9703a..764b8e7de 100644 --- a/src/rules/no-dynamic-slot-name.ts +++ b/src/rules/no-dynamic-slot-name.ts @@ -1,5 +1,5 @@ import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" import { createRule } from "../utils" import { findVariable, @@ -65,16 +65,16 @@ export default createRule("no-dynamic-slot-name", { /** * Get static text from given expression */ - function getStaticText(node: ESTree.Expression) { + function getStaticText(node: TSESTree.Expression) { const expr = findRootExpression(node) return getStringIfConstant(expr) } /** Find data expression */ function findRootExpression( - node: ESTree.Expression, - already = new Set(), - ): ESTree.Expression { + node: TSESTree.Expression, + already = new Set(), + ): TSESTree.Expression { if (node.type !== "Identifier" || already.has(node)) { return node } diff --git a/src/rules/no-export-load-in-svelte-module-in-kit-pages.ts b/src/rules/no-export-load-in-svelte-module-in-kit-pages.ts index 40ce3a650..81c80ffab 100644 --- a/src/rules/no-export-load-in-svelte-module-in-kit-pages.ts +++ b/src/rules/no-export-load-in-svelte-module-in-kit-pages.ts @@ -1,4 +1,4 @@ -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" import { createRule } from "../utils" import { isKitPageComponent } from "../utils/svelte-kit" @@ -38,11 +38,11 @@ export default createRule("no-export-load-in-svelte-module-in-kit-pages", { // export function load() {} // export const load = () => {} [`:matches(ExportNamedDeclaration > FunctionDeclaration, ExportNamedDeclaration > VariableDeclaration > VariableDeclarator) > Identifier.id[name="load"]`]: - (node: ESTree.Identifier) => { + (node: TSESTree.Identifier) => { if (!isModule) return {} return context.report({ node, - loc: node.loc!, + loc: node.loc, messageId: "unexpected", }) }, diff --git a/src/rules/no-not-function-handler.ts b/src/rules/no-not-function-handler.ts index 94936588c..b16bc492b 100644 --- a/src/rules/no-not-function-handler.ts +++ b/src/rules/no-not-function-handler.ts @@ -1,5 +1,5 @@ import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" import { createRule } from "../utils" import { findVariable } from "../utils/ast-utils" @@ -7,7 +7,7 @@ const PHRASES = { ObjectExpression: "object", ArrayExpression: "array", ClassExpression: "class", - Literal(node: ESTree.Literal): string | null { + Literal(node: TSESTree.Literal): string | null { if ("regex" in node) { return "regex value" } @@ -37,9 +37,9 @@ export default createRule("no-not-function-handler", { create(context) { /** Find data expression */ function findRootExpression( - node: ESTree.Expression, - already = new Set(), - ): ESTree.Expression { + node: TSESTree.Expression, + already = new Set(), + ): TSESTree.Expression { if (node.type !== "Identifier" || already.has(node)) { return node } diff --git a/src/rules/no-shorthand-style-property-overrides.ts b/src/rules/no-shorthand-style-property-overrides.ts index 462f5e32c..85615d3a7 100644 --- a/src/rules/no-shorthand-style-property-overrides.ts +++ b/src/rules/no-shorthand-style-property-overrides.ts @@ -78,7 +78,7 @@ export default createRule("no-shorthand-style-property-overrides", { for (const attr of attrs) { if (attr.type === "SvelteStyleDirective") { yield { - decls: [{ prop: attr.key.name.name, loc: attr.key.name.loc! }], + decls: [{ prop: attr.key.name.name, loc: attr.key.name.loc }], } } else if (attr.type === "SvelteAttribute") { if (attr.key.name !== "style") { diff --git a/src/rules/no-store-async.ts b/src/rules/no-store-async.ts index b8dc13ea5..de1cc3fc3 100644 --- a/src/rules/no-store-async.ts +++ b/src/rules/no-store-async.ts @@ -32,7 +32,7 @@ export default createRule("no-store-async", { continue } - const start = fn.loc!.start + const start = fn.loc.start context.report({ node: fn, loc: { diff --git a/src/rules/no-target-blank.ts b/src/rules/no-target-blank.ts index 0433ad4de..fabe2d151 100644 --- a/src/rules/no-target-blank.ts +++ b/src/rules/no-target-blank.ts @@ -89,7 +89,10 @@ export default createRule("no-target-blank", { type: "problem", }, create(context) { - const configuration = context.options[0] || {} + const configuration: { + allowReferrer?: boolean + enforceDynamicLinks?: "always" | "never" + } = context.options[0] || {} const allowReferrer = Boolean(configuration.allowReferrer) || false const enforceDynamicLinks: "always" | "never" = configuration.enforceDynamicLinks || "always" diff --git a/src/rules/prefer-class-directive.ts b/src/rules/prefer-class-directive.ts index 0cd46e939..95c2cf0a3 100644 --- a/src/rules/prefer-class-directive.ts +++ b/src/rules/prefer-class-directive.ts @@ -1,5 +1,5 @@ import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" import { createRule } from "../utils" import { getStringIfConstant, @@ -28,7 +28,7 @@ export default createRule("prefer-class-directive", { type Expr = { not?: true - node: ESTree.Expression + node: TSESTree.Expression chains?: Expr } @@ -37,7 +37,7 @@ export default createRule("prefer-class-directive", { * Returns null if it has an unknown string. */ function parseConditionalExpression( - node: ESTree.ConditionalExpression, + node: TSESTree.ConditionalExpression, ): Map | null { const result = new Map() @@ -66,7 +66,7 @@ export default createRule("prefer-class-directive", { return result /** Process items */ - function processItems(key: Expr, e: ESTree.Expression) { + function processItems(key: Expr, e: TSESTree.Expression) { if (e.type === "ConditionalExpression") { const sub = parseConditionalExpression(e) if (sub == null) { @@ -96,7 +96,7 @@ export default createRule("prefer-class-directive", { * Expr to string */ function exprToString({ node, not }: Expr): string { - let text = sourceCode.text.slice(...node.range!) + let text = sourceCode.text.slice(...node.range) // *Currently not supported. // if (chains) { @@ -123,12 +123,12 @@ export default createRule("prefer-class-directive", { node.operator === "!==" || node.operator === "!=" ) { - const left = sourceCode.text.slice(...node.left.range!) + const left = sourceCode.text.slice(...node.left.range) const op = sourceCode.text.slice( - node.left.range![1], - node.right.range![0], + node.left.range[1], + node.right.range[0], ) - const right = sourceCode.text.slice(...node.right.range!) + const right = sourceCode.text.slice(...node.right.range) return `${left}${ node.operator === "===" || node.operator === "==" @@ -138,7 +138,7 @@ export default createRule("prefer-class-directive", { } } else if (node.type === "UnaryExpression") { if (node.operator === "!" && node.prefix) { - return sourceCode.text.slice(...node.argument.range!) + return sourceCode.text.slice(...node.argument.range) } } diff --git a/src/rules/prefer-destructured-store-props.ts b/src/rules/prefer-destructured-store-props.ts index 6bade7e7c..68265d81c 100644 --- a/src/rules/prefer-destructured-store-props.ts +++ b/src/rules/prefer-destructured-store-props.ts @@ -55,7 +55,7 @@ export default createRule("prefer-destructured-store-props", { } for (const reference of storeVar.references) { - const id = reference.identifier as TSESTree.Identifier + const id = reference.identifier if (id.name !== object.name) continue if (isReactiveVariableDefinitionWithMemberExpression(id)) { // $: target = $store.prop diff --git a/src/rules/prefer-style-directive.ts b/src/rules/prefer-style-directive.ts index 2fd45c68e..70aaa80b5 100644 --- a/src/rules/prefer-style-directive.ts +++ b/src/rules/prefer-style-directive.ts @@ -1,5 +1,5 @@ import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" import { createRule } from "../utils" import type { SvelteStyleDeclaration, @@ -12,8 +12,8 @@ import { isHTMLElementLike } from "../utils/ast-utils" /** Checks wether the given node is string literal or not */ function isStringLiteral( - node: ESTree.Expression, -): node is ESTree.Literal & { value: string } { + node: TSESTree.Expression, +): node is TSESTree.StringLiteral { return node.type === "Literal" && typeof node.value === "string" } @@ -154,28 +154,28 @@ export default createRule("prefer-style-directive", { messageId: "unexpected", *fix(fixer) { let valueText = sourceCode.text.slice( - node.test.range![0], - node.consequent.range![0], + node.test.range[0], + node.consequent.range[0], ) if (positive) { valueText += - sourceCode.text[node.consequent.range![0]] + + sourceCode.text[node.consequent.range[0]] + decl.value.value + - sourceCode.text[node.consequent.range![1] - 1] + sourceCode.text[node.consequent.range[1] - 1] } else { valueText += "null" } valueText += sourceCode.text.slice( - node.consequent.range![1], - node.alternate.range![0], + node.consequent.range[1], + node.alternate.range[0], ) if (positive) { valueText += "null" } else { valueText += - sourceCode.text[node.alternate.range![0]] + + sourceCode.text[node.alternate.range[0]] + decl.value.value + - sourceCode.text[node.alternate.range![1] - 1] + sourceCode.text[node.alternate.range[1] - 1] } const styleDirective = `style:${decl.prop.name}={${valueText}}` if (root.nodes.length === 1 && root.nodes[0] === inline) { diff --git a/src/rules/reference-helpers/svelte-store.ts b/src/rules/reference-helpers/svelte-store.ts index 5d41a63fd..864a77817 100644 --- a/src/rules/reference-helpers/svelte-store.ts +++ b/src/rules/reference-helpers/svelte-store.ts @@ -1,4 +1,3 @@ -import type * as ESTree from "estree" import type { TSESTree } from "@typescript-eslint/types" import { ReferenceTracker } from "eslint-utils" import type { Variable } from "eslint-scope" @@ -13,7 +12,7 @@ type StoreName = "writable" | "readable" | "derived" export function* extractStoreReferences( context: RuleContext, storeNames: StoreName[] = ["writable", "readable", "derived"], -): Generator<{ node: ESTree.CallExpression; name: string }, void> { +): Generator<{ node: TSESTree.CallExpression; name: string }, void> { const referenceTracker = new ReferenceTracker(context.getScope()) for (const { node, path } of referenceTracker.iterateEsmReferences({ "svelte/store": { @@ -30,18 +29,18 @@ export function* extractStoreReferences( }, })) { yield { - node: node as ESTree.CallExpression, + node: node as TSESTree.CallExpression, name: path[path.length - 1], } } } export type StoreChecker = ( - node: ESTree.Expression | TSESTree.Expression, + node: TSESTree.Expression, options?: { consistent?: boolean }, ) => boolean type StoreCheckerWithOptions = ( - node: ESTree.Expression, + node: TSESTree.Expression, options: { consistent: boolean }, ) => boolean @@ -55,7 +54,7 @@ export function createStoreChecker(context: RuleContext): StoreChecker { : createStoreCheckerForES(context) return (node, options) => - checker(node as ESTree.Expression, { + checker(node, { consistent: options?.consistent ?? false, }) } diff --git a/src/rules/require-store-callbacks-use-set-param.ts b/src/rules/require-store-callbacks-use-set-param.ts index 005b186e5..68f0848df 100644 --- a/src/rules/require-store-callbacks-use-set-param.ts +++ b/src/rules/require-store-callbacks-use-set-param.ts @@ -33,7 +33,7 @@ export default createRule("require-store-callbacks-use-set-param", { if (!param || (param.type === "Identifier" && param.name !== "set")) { context.report({ node: fn, - loc: fn.loc!, + loc: fn.loc, messageId: "unexpected", }) } diff --git a/src/rules/require-store-reactive-access.ts b/src/rules/require-store-reactive-access.ts index 0ea2bdd3d..b5f2acd49 100644 --- a/src/rules/require-store-reactive-access.ts +++ b/src/rules/require-store-reactive-access.ts @@ -1,4 +1,3 @@ -import type * as ESTree from "estree" import type { TSESTree } from "@typescript-eslint/types" import type { AST } from "svelte-eslint-parser" import { createRule } from "../utils" @@ -30,7 +29,7 @@ export default createRule("require-store-reactive-access", { /** Verify for expression node */ function verifyExpression( - node: ESTree.Expression | null | undefined | TSESTree.Expression, + node: TSESTree.Expression | null | undefined, options?: { disableFix?: boolean; consistent?: boolean }, ) { if (!node) return @@ -128,11 +127,11 @@ export default createRule("require-store-reactive-access", { ["IfStatement, WhileStatement, DoWhileStatement, " + "ConditionalExpression, ForStatement"]( node: - | ESTree.IfStatement - | ESTree.WhileStatement - | ESTree.DoWhileStatement - | ESTree.ConditionalExpression - | ESTree.ForStatement, + | TSESTree.IfStatement + | TSESTree.WhileStatement + | TSESTree.DoWhileStatement + | TSESTree.ConditionalExpression + | TSESTree.ForStatement, ) { // Check for `if (store)`, `while (store)`, `do {} while (store)`, // `store ? a : b`, `for (;store;)` @@ -141,41 +140,39 @@ export default createRule("require-store-reactive-access", { }) }, "ForInStatement, ForOfStatement"( - node: ESTree.ForInStatement | ESTree.ForOfStatement, + node: TSESTree.ForInStatement | TSESTree.ForOfStatement, ) { // Check for `for (let foo of store)`, `for (let foo in store)` verifyExpression(node.right) }, - SwitchStatement(node: ESTree.SwitchStatement) { + SwitchStatement(node: TSESTree.SwitchStatement) { // Check for `switch (store)` verifyExpression(node.discriminant) }, - "CallExpression, NewExpression"(node: ESTree.CallExpression) { + "CallExpression, NewExpression"(node: TSESTree.CallExpression) { if (node.callee.type === "Super") { return } // Check for `store()` verifyExpression(node.callee) }, - UnaryExpression(node: ESTree.UnaryExpression) { + UnaryExpression(node: TSESTree.UnaryExpression) { // Check for `-store`, `+store`, `!store`, `~store`, `typeof store` verifyExpression(node.argument, { consistent: node.operator === "!" || node.operator === "typeof", }) }, "UpdateExpression, SpreadElement"( - node: ESTree.UpdateExpression | ESTree.SpreadElement, + node: TSESTree.UpdateExpression | TSESTree.SpreadElement, ) { // Check for `store++`, `store--`, `...store` verifyExpression(node.argument) }, - AssignmentExpression(node: ESTree.AssignmentExpression) { + AssignmentExpression(node: TSESTree.AssignmentExpression) { if (node.operator !== "=") { if ( node.left.type !== "ObjectPattern" && - node.left.type !== "ArrayPattern" && - node.left.type !== "RestElement" && - node.left.type !== "AssignmentPattern" + node.left.type !== "ArrayPattern" ) { // Check for `store += 1` verifyExpression(node.left) @@ -184,15 +181,17 @@ export default createRule("require-store-reactive-access", { verifyExpression(node.right) } }, - BinaryExpression(node: ESTree.BinaryExpression) { - // Check for `store+1` - verifyExpression(node.left, { - consistent: - node.operator === "==" || - node.operator === "!=" || - node.operator === "===" || - node.operator === "!==", - }) + BinaryExpression(node: TSESTree.BinaryExpression) { + if (node.left.type !== "PrivateIdentifier") { + // Check for `store+1` + verifyExpression(node.left, { + consistent: + node.operator === "==" || + node.operator === "!=" || + node.operator === "===" || + node.operator === "!==", + }) + } // Check for `1+store` verifyExpression(node.right, { consistent: @@ -202,27 +201,27 @@ export default createRule("require-store-reactive-access", { node.operator === "!==", }) }, - LogicalExpression(node: ESTree.LogicalExpression) { + LogicalExpression(node: TSESTree.LogicalExpression) { // Check for `store && foo` verifyExpression(node.left, { consistent: true, }) }, - TemplateLiteral(node: ESTree.TemplateLiteral) { + TemplateLiteral(node: TSESTree.TemplateLiteral) { for (const expr of node.expressions) { // Check for `${store}` verifyExpression(expr) } }, - TaggedTemplateExpression(node: ESTree.TaggedTemplateExpression) { + TaggedTemplateExpression(node: TSESTree.TaggedTemplateExpression) { // Check for ` store`${foo}` ` verifyExpression(node.tag) }, "Property, PropertyDefinition, MethodDefinition"( node: - | ESTree.Property - | ESTree.PropertyDefinition - | ESTree.MethodDefinition, + | TSESTree.Property + | TSESTree.PropertyDefinition + | TSESTree.MethodDefinition, ) { if (node.key.type === "PrivateIdentifier" || !node.computed) { return @@ -230,11 +229,11 @@ export default createRule("require-store-reactive-access", { // Check for `{ [store]: foo}` verifyExpression(node.key) }, - ImportExpression(node: ESTree.ImportExpression) { + ImportExpression(node: TSESTree.ImportExpression) { // Check for `import(store)` verifyExpression(node.source) }, - AwaitExpression(node: ESTree.AwaitExpression) { + AwaitExpression(node: TSESTree.AwaitExpression) { // Check for `await store` verifyExpression(node.argument, { consistent: true, diff --git a/src/rules/valid-prop-names-in-kit-pages.ts b/src/rules/valid-prop-names-in-kit-pages.ts index c4a7b78c4..e7b978c14 100644 --- a/src/rules/valid-prop-names-in-kit-pages.ts +++ b/src/rules/valid-prop-names-in-kit-pages.ts @@ -1,5 +1,5 @@ import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" import { createRule } from "../utils" import { isKitPageComponent } from "../utils/svelte-kit" @@ -46,7 +46,7 @@ export default createRule("valid-prop-names-in-kit-pages", { }, "ExportNamedDeclaration > VariableDeclaration > VariableDeclarator": ( - node: ESTree.VariableDeclarator, + node: TSESTree.VariableDeclarator, ) => { if (!isScript) return @@ -55,7 +55,7 @@ export default createRule("valid-prop-names-in-kit-pages", { if (!EXPECTED_PROP_NAMES.includes(node.id.name)) { context.report({ node, - loc: node.loc!, + loc: node.loc, messageId: "unexpected", }) } @@ -72,7 +72,7 @@ export default createRule("valid-prop-names-in-kit-pages", { ) { context.report({ node: p.value, - loc: p.value.loc!, + loc: p.value.loc, messageId: "unexpected", }) } diff --git a/src/types-for-node.ts b/src/types-for-node.ts index 26eddc81e..3f7fa335a 100644 --- a/src/types-for-node.ts +++ b/src/types-for-node.ts @@ -1,16 +1,16 @@ +// +// The information here can be calculated by calculating the type, +// but is pre-defined to avoid the computational cost. +// + import type { TSESTree, AST_NODE_TYPES } from "@typescript-eslint/types" import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" export type ASTNode = | AST.SvelteNode - // This is correct, but is not done now to avoid type errors. - // | Exclude - // | Exclude, { type: ESTree.Node["type"] }> - | ESTree.Node - | Exclude + | Exclude, { type: AST.SvelteNode["type"] }> export type ASTNodeWithParent = - | (Exclude & { parent: ASTNodeWithParent }) + | (Exclude & { parent: ASTNodeWithParent }) | AST.SvelteProgram export type ASTNodeListener = { @@ -397,125 +397,145 @@ export type ASTNodeListener = { node: AST.SvelteReactiveStatement & ASTNodeWithParent, ) => void } + export type ESNodeListener = { - ArrayExpression?: (node: ESTree.ArrayExpression & ASTNodeWithParent) => void - ArrayPattern?: (node: ESTree.ArrayPattern & ASTNodeWithParent) => void + ArrayExpression?: (node: TSESTree.ArrayExpression & ASTNodeWithParent) => void + ArrayPattern?: (node: TSESTree.ArrayPattern & ASTNodeWithParent) => void ArrowFunctionExpression?: ( - node: ESTree.ArrowFunctionExpression & ASTNodeWithParent, + node: TSESTree.ArrowFunctionExpression & ASTNodeWithParent, ) => void AssignmentExpression?: ( - node: ESTree.AssignmentExpression & ASTNodeWithParent, + node: TSESTree.AssignmentExpression & ASTNodeWithParent, ) => void AssignmentPattern?: ( - node: ESTree.AssignmentPattern & ASTNodeWithParent, - ) => void - AwaitExpression?: (node: ESTree.AwaitExpression & ASTNodeWithParent) => void - BinaryExpression?: (node: ESTree.BinaryExpression & ASTNodeWithParent) => void - BlockStatement?: (node: ESTree.BlockStatement & ASTNodeWithParent) => void - BreakStatement?: (node: ESTree.BreakStatement & ASTNodeWithParent) => void - CallExpression?: (node: ESTree.CallExpression & ASTNodeWithParent) => void - CatchClause?: (node: ESTree.CatchClause & ASTNodeWithParent) => void - ChainExpression?: (node: ESTree.ChainExpression & ASTNodeWithParent) => void - ClassBody?: (node: ESTree.ClassBody & ASTNodeWithParent) => void - ClassDeclaration?: (node: ESTree.ClassDeclaration & ASTNodeWithParent) => void - ClassExpression?: (node: ESTree.ClassExpression & ASTNodeWithParent) => void + node: TSESTree.AssignmentPattern & ASTNodeWithParent, + ) => void + AwaitExpression?: (node: TSESTree.AwaitExpression & ASTNodeWithParent) => void + BinaryExpression?: ( + node: TSESTree.BinaryExpression & ASTNodeWithParent, + ) => void + BlockStatement?: (node: TSESTree.BlockStatement & ASTNodeWithParent) => void + BreakStatement?: (node: TSESTree.BreakStatement & ASTNodeWithParent) => void + CallExpression?: (node: TSESTree.CallExpression & ASTNodeWithParent) => void + CatchClause?: (node: TSESTree.CatchClause & ASTNodeWithParent) => void + ChainExpression?: (node: TSESTree.ChainExpression & ASTNodeWithParent) => void + ClassBody?: (node: TSESTree.ClassBody & ASTNodeWithParent) => void + ClassDeclaration?: ( + node: TSESTree.ClassDeclaration & ASTNodeWithParent, + ) => void + ClassExpression?: (node: TSESTree.ClassExpression & ASTNodeWithParent) => void ConditionalExpression?: ( - node: ESTree.ConditionalExpression & ASTNodeWithParent, + node: TSESTree.ConditionalExpression & ASTNodeWithParent, ) => void ContinueStatement?: ( - node: ESTree.ContinueStatement & ASTNodeWithParent, + node: TSESTree.ContinueStatement & ASTNodeWithParent, ) => void DebuggerStatement?: ( - node: ESTree.DebuggerStatement & ASTNodeWithParent, + node: TSESTree.DebuggerStatement & ASTNodeWithParent, + ) => void + DoWhileStatement?: ( + node: TSESTree.DoWhileStatement & ASTNodeWithParent, ) => void - DoWhileStatement?: (node: ESTree.DoWhileStatement & ASTNodeWithParent) => void - EmptyStatement?: (node: ESTree.EmptyStatement & ASTNodeWithParent) => void + EmptyStatement?: (node: TSESTree.EmptyStatement & ASTNodeWithParent) => void ExportAllDeclaration?: ( - node: ESTree.ExportAllDeclaration & ASTNodeWithParent, + node: TSESTree.ExportAllDeclaration & ASTNodeWithParent, ) => void ExportDefaultDeclaration?: ( - node: ESTree.ExportDefaultDeclaration & ASTNodeWithParent, + node: TSESTree.ExportDefaultDeclaration & ASTNodeWithParent, ) => void ExportNamedDeclaration?: ( - node: ESTree.ExportNamedDeclaration & ASTNodeWithParent, + node: TSESTree.ExportNamedDeclaration & ASTNodeWithParent, ) => void - ExportSpecifier?: (node: ESTree.ExportSpecifier & ASTNodeWithParent) => void + ExportSpecifier?: (node: TSESTree.ExportSpecifier & ASTNodeWithParent) => void ExpressionStatement?: ( - node: ESTree.ExpressionStatement & ASTNodeWithParent, + node: TSESTree.ExpressionStatement & ASTNodeWithParent, ) => void - ForInStatement?: (node: ESTree.ForInStatement & ASTNodeWithParent) => void - ForOfStatement?: (node: ESTree.ForOfStatement & ASTNodeWithParent) => void - ForStatement?: (node: ESTree.ForStatement & ASTNodeWithParent) => void + ForInStatement?: (node: TSESTree.ForInStatement & ASTNodeWithParent) => void + ForOfStatement?: (node: TSESTree.ForOfStatement & ASTNodeWithParent) => void + ForStatement?: (node: TSESTree.ForStatement & ASTNodeWithParent) => void FunctionDeclaration?: ( - node: ESTree.FunctionDeclaration & ASTNodeWithParent, + node: TSESTree.FunctionDeclaration & ASTNodeWithParent, ) => void FunctionExpression?: ( - node: ESTree.FunctionExpression & ASTNodeWithParent, + node: TSESTree.FunctionExpression & ASTNodeWithParent, ) => void - Identifier?: (node: ESTree.Identifier & ASTNodeWithParent) => void - IfStatement?: (node: ESTree.IfStatement & ASTNodeWithParent) => void + Identifier?: (node: TSESTree.Identifier & ASTNodeWithParent) => void + IfStatement?: (node: TSESTree.IfStatement & ASTNodeWithParent) => void ImportDeclaration?: ( - node: ESTree.ImportDeclaration & ASTNodeWithParent, + node: TSESTree.ImportDeclaration & ASTNodeWithParent, ) => void ImportDefaultSpecifier?: ( - node: ESTree.ImportDefaultSpecifier & ASTNodeWithParent, + node: TSESTree.ImportDefaultSpecifier & ASTNodeWithParent, + ) => void + ImportExpression?: ( + node: TSESTree.ImportExpression & ASTNodeWithParent, ) => void - ImportExpression?: (node: ESTree.ImportExpression & ASTNodeWithParent) => void ImportNamespaceSpecifier?: ( - node: ESTree.ImportNamespaceSpecifier & ASTNodeWithParent, + node: TSESTree.ImportNamespaceSpecifier & ASTNodeWithParent, ) => void - ImportSpecifier?: (node: ESTree.ImportSpecifier & ASTNodeWithParent) => void - LabeledStatement?: (node: ESTree.LabeledStatement & ASTNodeWithParent) => void - Literal?: (node: ESTree.Literal & ASTNodeWithParent) => void + ImportSpecifier?: (node: TSESTree.ImportSpecifier & ASTNodeWithParent) => void + LabeledStatement?: ( + node: TSESTree.LabeledStatement & ASTNodeWithParent, + ) => void + Literal?: (node: TSESTree.Literal & ASTNodeWithParent) => void LogicalExpression?: ( - node: ESTree.LogicalExpression & ASTNodeWithParent, - ) => void - MemberExpression?: (node: ESTree.MemberExpression & ASTNodeWithParent) => void - MetaProperty?: (node: ESTree.MetaProperty & ASTNodeWithParent) => void - MethodDefinition?: (node: ESTree.MethodDefinition & ASTNodeWithParent) => void - NewExpression?: (node: ESTree.NewExpression & ASTNodeWithParent) => void - ObjectExpression?: (node: ESTree.ObjectExpression & ASTNodeWithParent) => void - ObjectPattern?: (node: ESTree.ObjectPattern & ASTNodeWithParent) => void + node: TSESTree.LogicalExpression & ASTNodeWithParent, + ) => void + MemberExpression?: ( + node: TSESTree.MemberExpression & ASTNodeWithParent, + ) => void + MetaProperty?: (node: TSESTree.MetaProperty & ASTNodeWithParent) => void + MethodDefinition?: ( + node: TSESTree.MethodDefinition & ASTNodeWithParent, + ) => void + NewExpression?: (node: TSESTree.NewExpression & ASTNodeWithParent) => void + ObjectExpression?: ( + node: TSESTree.ObjectExpression & ASTNodeWithParent, + ) => void + ObjectPattern?: (node: TSESTree.ObjectPattern & ASTNodeWithParent) => void PrivateIdentifier?: ( - node: ESTree.PrivateIdentifier & ASTNodeWithParent, + node: TSESTree.PrivateIdentifier & ASTNodeWithParent, ) => void - Property?: (node: ESTree.Property & ASTNodeWithParent) => void + Property?: (node: TSESTree.Property & ASTNodeWithParent) => void PropertyDefinition?: ( - node: ESTree.PropertyDefinition & ASTNodeWithParent, + node: TSESTree.PropertyDefinition & ASTNodeWithParent, ) => void - RestElement?: (node: ESTree.RestElement & ASTNodeWithParent) => void - ReturnStatement?: (node: ESTree.ReturnStatement & ASTNodeWithParent) => void + RestElement?: (node: TSESTree.RestElement & ASTNodeWithParent) => void + ReturnStatement?: (node: TSESTree.ReturnStatement & ASTNodeWithParent) => void SequenceExpression?: ( - node: ESTree.SequenceExpression & ASTNodeWithParent, + node: TSESTree.SequenceExpression & ASTNodeWithParent, ) => void - SpreadElement?: (node: ESTree.SpreadElement & ASTNodeWithParent) => void - Super?: (node: ESTree.Super & ASTNodeWithParent) => void - SwitchCase?: (node: ESTree.SwitchCase & ASTNodeWithParent) => void - SwitchStatement?: (node: ESTree.SwitchStatement & ASTNodeWithParent) => void + SpreadElement?: (node: TSESTree.SpreadElement & ASTNodeWithParent) => void + Super?: (node: TSESTree.Super & ASTNodeWithParent) => void + SwitchCase?: (node: TSESTree.SwitchCase & ASTNodeWithParent) => void + SwitchStatement?: (node: TSESTree.SwitchStatement & ASTNodeWithParent) => void TaggedTemplateExpression?: ( - node: ESTree.TaggedTemplateExpression & ASTNodeWithParent, - ) => void - TemplateElement?: (node: ESTree.TemplateElement & ASTNodeWithParent) => void - TemplateLiteral?: (node: ESTree.TemplateLiteral & ASTNodeWithParent) => void - ThisExpression?: (node: ESTree.ThisExpression & ASTNodeWithParent) => void - ThrowStatement?: (node: ESTree.ThrowStatement & ASTNodeWithParent) => void - TryStatement?: (node: ESTree.TryStatement & ASTNodeWithParent) => void - UnaryExpression?: (node: ESTree.UnaryExpression & ASTNodeWithParent) => void - UpdateExpression?: (node: ESTree.UpdateExpression & ASTNodeWithParent) => void + node: TSESTree.TaggedTemplateExpression & ASTNodeWithParent, + ) => void + TemplateElement?: (node: TSESTree.TemplateElement & ASTNodeWithParent) => void + TemplateLiteral?: (node: TSESTree.TemplateLiteral & ASTNodeWithParent) => void + ThisExpression?: (node: TSESTree.ThisExpression & ASTNodeWithParent) => void + ThrowStatement?: (node: TSESTree.ThrowStatement & ASTNodeWithParent) => void + TryStatement?: (node: TSESTree.TryStatement & ASTNodeWithParent) => void + UnaryExpression?: (node: TSESTree.UnaryExpression & ASTNodeWithParent) => void + UpdateExpression?: ( + node: TSESTree.UpdateExpression & ASTNodeWithParent, + ) => void VariableDeclaration?: ( - node: ESTree.VariableDeclaration & ASTNodeWithParent, + node: TSESTree.VariableDeclaration & ASTNodeWithParent, ) => void VariableDeclarator?: ( - node: ESTree.VariableDeclarator & ASTNodeWithParent, + node: TSESTree.VariableDeclarator & ASTNodeWithParent, ) => void - WhileStatement?: (node: ESTree.WhileStatement & ASTNodeWithParent) => void - WithStatement?: (node: ESTree.WithStatement & ASTNodeWithParent) => void - YieldExpression?: (node: ESTree.YieldExpression & ASTNodeWithParent) => void + WhileStatement?: (node: TSESTree.WhileStatement & ASTNodeWithParent) => void + WithStatement?: (node: TSESTree.WithStatement & ASTNodeWithParent) => void + YieldExpression?: (node: TSESTree.YieldExpression & ASTNodeWithParent) => void Program?: (node: AST.SvelteProgram & ASTNodeWithParent) => void SvelteReactiveStatement?: ( node: AST.SvelteReactiveStatement & ASTNodeWithParent, ) => void } + export type TSNodeListener = { Decorator?: (node: TSESTree.Decorator & ASTNodeWithParent) => void ImportAttribute?: (node: TSESTree.ImportAttribute & ASTNodeWithParent) => void @@ -679,6 +699,7 @@ export type TSNodeListener = { ) => void TSVoidKeyword?: (node: TSESTree.TSVoidKeyword & ASTNodeWithParent) => void } + export type SvelteNodeListener = { SvelteScriptElement?: ( node: AST.SvelteScriptElement & ASTNodeWithParent, diff --git a/src/types.ts b/src/types.ts index bb41245ca..b39ad4e72 100644 --- a/src/types.ts +++ b/src/types.ts @@ -6,7 +6,7 @@ import type { SourceCode as ESLintSourceCode, } from "eslint" import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" import type { ASTNode, ASTNodeWithParent, @@ -140,7 +140,7 @@ export type RuleContext = { getAncestors(): ASTNode[] - getDeclaredVariables(node: ESTree.Node): Scope.Variable[] + getDeclaredVariables(node: TSESTree.Node): Scope.Variable[] getFilename(): string diff --git a/src/utils/ast-utils.ts b/src/utils/ast-utils.ts index d8a6cbadb..c024d98ce 100644 --- a/src/utils/ast-utils.ts +++ b/src/utils/ast-utils.ts @@ -1,5 +1,4 @@ import type { ASTNode, RuleContext, SourceCode } from "../types" -import type * as ESTree from "estree" import type { TSESTree } from "@typescript-eslint/types" import type { AST as SvAST } from "svelte-eslint-parser" import * as eslintUtils from "eslint-utils" @@ -40,7 +39,7 @@ export function equalTokens( * Get the value of a given node if it's a literal or a template literal. */ export function getStringIfConstant( - node: ESTree.Expression | TSESTree.Expression, + node: TSESTree.Expression | TSESTree.PrivateIdentifier, ): string | null { if (node.type === "Literal") { if (typeof node.value === "string") return node.value @@ -48,10 +47,10 @@ export function getStringIfConstant( let str = "" const quasis = [...node.quasis] const expressions = [...node.expressions] - let quasi: ESTree.TemplateElement | undefined, - expr: ESTree.Expression | undefined + let quasi: TSESTree.TemplateElement | undefined, + expr: TSESTree.Expression | undefined while ((quasi = quasis.shift())) { - str += quasi.value.cooked! + str += quasi.value.cooked expr = expressions.shift() if (expr) { const exprStr = getStringIfConstant(expr) @@ -82,7 +81,7 @@ export function getStringIfConstant( * Check if it need parentheses. */ export function needParentheses( - node: ESTree.Expression, + node: TSESTree.Expression, kind: "not" | "logical", ): boolean { if ( @@ -237,7 +236,7 @@ export function getLangValue( */ export function findVariable( context: RuleContext, - node: ESTree.Identifier | TSESTree.Identifier, + node: TSESTree.Identifier, ): Scope.Variable | null { const initialScope = eslintUtils.getInnermostScope( getScope(context, node), @@ -259,13 +258,11 @@ export function findVariable( */ export function getScope( context: RuleContext, - currentNode: ESTree.Node, + currentNode: TSESTree.Node, ): Scope.Scope { - // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ignore - const scopeManager = (context.getSourceCode() as any).scopeManager + const scopeManager = context.getSourceCode().scopeManager - // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ignore - let node: any = currentNode + let node: TSESTree.Node | null = currentNode for (; node; node = node.parent || null) { const scope = scopeManager.acquire(node, false) @@ -281,7 +278,7 @@ export function getScope( } /** Get the parent node from the given node */ -export function getParent(node: ESTree.Node): ESTree.Node | null { +export function getParent(node: TSESTree.Node): TSESTree.Node | null { // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ignore return (node as any).parent || null } diff --git a/src/utils/css-utils/style-attribute.ts b/src/utils/css-utils/style-attribute.ts index 780dce388..86184835a 100644 --- a/src/utils/css-utils/style-attribute.ts +++ b/src/utils/css-utils/style-attribute.ts @@ -3,7 +3,7 @@ import type { RuleContext } from "../../types" import Parser from "./template-safe-parser" import type { Root, ChildNode, AnyNode } from "postcss" import { Input } from "postcss" -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" /** Parse for CSS */ function safeParseCss(css: string): Root | null { @@ -59,7 +59,7 @@ export function parseStyleAttributeValue( export type SvelteStyleInterpolation = | AST.SvelteMustacheTagText - | ESTree.Expression + | TSESTree.Expression export interface SvelteStyleNode { nodes?: SvelteStyleChildNode[] @@ -78,11 +78,11 @@ export interface SvelteStyleInline< type: "inline" node: E getInlineStyle( - node: ESTree.Expression, - ): SvelteStyleRoot | null + node: TSESTree.Expression, + ): SvelteStyleRoot | null getAllInlineStyles(): Map< - ESTree.Expression, - SvelteStyleRoot + TSESTree.Expression, + SvelteStyleRoot > } export interface SvelteStyleDeclaration< @@ -124,8 +124,8 @@ type Ctx = { /** Checks wether the given node is string literal or not */ function isStringLiteral( - node: ESTree.Expression, -): node is ESTree.Literal & { value: string } { + node: TSESTree.Expression, +): node is TSESTree.Literal & { value: string } { return node.type === "Literal" && typeof node.value === "string" } @@ -145,12 +145,12 @@ function convertRoot( while (interpolations[0]) { const tagOrExpr = interpolations[0] - if (tagOrExpr.range![1] <= converted.range[0]) { + if (tagOrExpr.range[1] <= converted.range[0]) { nodes.push(buildSvelteStyleInline(tagOrExpr)) interpolations.shift() continue } - if (tagOrExpr.range![0] < converted.range[1]) { + if (tagOrExpr.range[0] < converted.range[1]) { try { converted.addInterpolation(tagOrExpr) } catch (e) { @@ -176,8 +176,8 @@ function convertRoot( /** Build SvelteStyleInline */ function buildSvelteStyleInline(tagOrExpr: E): SvelteStyleInline { const inlineStyles = new Map< - ESTree.Expression, - SvelteStyleRoot | null + TSESTree.Expression, + SvelteStyleRoot | null >() let range: AST.Range | null = null @@ -203,8 +203,8 @@ function convertRoot( }, getAllInlineStyles() { const allInlineStyles = new Map< - ESTree.Expression, - SvelteStyleRoot + TSESTree.Expression, + SvelteStyleRoot >() for (const node of extractExpressions(tagOrExpr)) { const style = getInlineStyle(node) @@ -219,7 +219,7 @@ function convertRoot( /** Get inline style node */ function getInlineStyle( node: SvelteStyleInterpolation, - ): SvelteStyleRoot | null { + ): SvelteStyleRoot | null { if (node.type === "SvelteMustacheTag") { return getInlineStyle(node.expression) } @@ -229,15 +229,15 @@ function convertRoot( const sourceCode = ctx.context.getSourceCode() inlineStyles.set(node, null) - let converted: SvelteStyleRoot | null + let converted: SvelteStyleRoot | null if (isStringLiteral(node)) { const root = safeParseCss(sourceCode.getText(node).slice(1, -1)) if (!root) { return null } - converted = convertRoot(root, [], () => [0, 0], { + converted = convertRoot(root, [], () => [0, 0], { ...ctx, - startOffset: node.range![0] + 1, + startOffset: node.range[0] + 1, }) } else if (node.type === "TemplateLiteral") { const root = safeParseCss(sourceCode.getText(node).slice(1, -1)) @@ -250,13 +250,13 @@ function convertRoot( (e) => { const index = node.expressions.indexOf(e) return [ - node.quasis[index].range![1] - 2, - node.quasis[index + 1].range![0] + 1, + node.quasis[index].range[1] - 2, + node.quasis[index + 1].range[0] + 1, ] }, { ...ctx, - startOffset: node.range![0] + 1, + startOffset: node.range[0] + 1, }, ) } else { @@ -269,7 +269,7 @@ function convertRoot( /** Extract all expressions */ function* extractExpressions( node: SvelteStyleInterpolation, - ): Iterable<(ESTree.Literal & { value: string }) | ESTree.TemplateLiteral> { + ): Iterable { if (node.type === "SvelteMustacheTag") { yield* extractExpressions(node.expression) } else if (isStringLiteral(node)) { @@ -327,7 +327,7 @@ function convertChild( return toLoc(range, ctx) }, addInterpolation(tagOrExpr) { - const index = tagOrExpr.range![0] + const index = tagOrExpr.range[0] if (prop.range[0] <= index && index < prop.range[1]) { prop.interpolations.push(tagOrExpr) return diff --git a/src/utils/eslint-core.ts b/src/utils/eslint-core.ts index 5450ba28d..135a7a787 100644 --- a/src/utils/eslint-core.ts +++ b/src/utils/eslint-core.ts @@ -1,6 +1,6 @@ /* eslint @typescript-eslint/no-explicit-any: off -- util */ import type { RuleListener, RuleContext, RuleModule } from "../types" -import type * as ESTree from "estree" +import type { TSESTree } from "@typescript-eslint/types" import type { AST as SvAST } from "svelte-eslint-parser" import { Linter } from "eslint" @@ -48,7 +48,7 @@ export function buildProxyListener( convertNode: ( node: | SvAST.SvelteNode - | (ESTree.Node & { parent: SvAST.SvelteNode | ESTree.Node | null }), + | (TSESTree.Node & { parent: SvAST.SvelteNode | TSESTree.Node | null }), ) => any, ): RuleListener { const listeners: RuleListener = {} diff --git a/tools/lib/load-rules.ts b/tools/lib/load-rules.ts index 48f93ec2f..388f1f850 100644 --- a/tools/lib/load-rules.ts +++ b/tools/lib/load-rules.ts @@ -1,5 +1,6 @@ import path from "path" import fs from "fs" +import type { RuleModule } from "../../src/types" /** * Get the all rules @@ -7,20 +8,15 @@ import fs from "fs" */ function readRules() { const rulesLibRoot = path.resolve(__dirname, "../../src/rules") - const rules = [] + const rules: RuleModule[] = [] for (const name of iterateTsFiles()) { - const ruleName = name.replace(/\.ts$/u, "") - const ruleId = `svelte/${ruleName}` // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports -- ignore const module = require(path.join(rulesLibRoot, name)) - const rule = module && module.default + const rule: RuleModule = module && module.default if (!rule || typeof rule.create !== "function") { continue } - rule.meta.docs.ruleName = ruleName - rule.meta.docs.ruleId = ruleId - rules.push(rule) } return rules diff --git a/tools/update-types-for-node.ts b/tools/update-types-for-node.ts index 295a69c49..1e4bd80ad 100644 --- a/tools/update-types-for-node.ts +++ b/tools/update-types-for-node.ts @@ -6,7 +6,8 @@ import fs from "fs" // import { fileURLToPath } from "url" // const filename = fileURLToPath(import.meta.url) const dirname = __dirname // path.dirname(filename) -const codeFilename = path.join(dirname, "../src/types-for-node.ts") +const typesForNodeFilename = path.join(dirname, "../src/types-for-node.ts") +const estreeFilename = path.join(dirname, "../typings/estree/index.d.ts") const { visitorKeys } = parseForESLint("") const esNextNodeNames = ["Decorator", "ImportAttribute", "StaticBlock"] @@ -23,86 +24,97 @@ const svelteNodeNames = Object.keys(visitorKeys).filter( (k) => !tsEsNodeNames.includes(k) && !k.startsWith("Experimental"), ) -let code = `import type { TSESTree, AST_NODE_TYPES } from "@typescript-eslint/types"; +const estreeCode = [ + `// +// Replace type information to use "@typescript-eslint/types" instead of "estree". +// + +import type { TSESTree } from "@typescript-eslint/types" + +export type Node = TSESTree.Node +export type Expression = TSESTree.Expression +export type Statement = TSESTree.Statement +export type Pattern = TSESTree.Pattern`, +] +const typesForNodeCode = [ + `// +// The information here can be calculated by calculating the type, +// but is pre-defined to avoid the computational cost. +// + +import type { TSESTree, AST_NODE_TYPES } from "@typescript-eslint/types"; import type { AST } from "svelte-eslint-parser" -import type * as ESTree from "estree" export type ASTNode = | AST.SvelteNode - // This is correct, but is not done now to avoid type errors. - // | Exclude - // | Exclude, { type: ESTree.Node["type"] }> - | ESTree.Node - | Exclude + | Exclude, { type: AST.SvelteNode["type"] }> export type ASTNodeWithParent = - | (Exclude & { parent: ASTNodeWithParent }) + | (Exclude & { parent: ASTNodeWithParent }) | AST.SvelteProgram -export type ASTNodeListener = { -` +export type ASTNodeListener = {`, +] for (const nodeType of tsEsNodeNames) { let argType = `TSESTree.${nodeType}` if (nodeType === "TSIntrinsicKeyword") { argType = `TSESTree.Node & { type: AST_NODE_TYPES.${nodeType}}` } - code += ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void -` + typesForNodeCode.push( + ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`, + ) } for (const nodeType of svelteNodeNames) { let argType = `AST.${nodeType}` if (nodeType === "Program") { argType = `AST.SvelteProgram` } - code += ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void -` + typesForNodeCode.push( + ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`, + ) } -code += ` -}` - -code += ` -export type ESNodeListener = { -` +typesForNodeCode.push(`}`) +typesForNodeCode.push(``) +typesForNodeCode.push(`export type ESNodeListener = {`) for (const nodeType of esNodeNames) { - const argType = `ESTree.${nodeType}` - code += ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void -` + const argType = `TSESTree.${nodeType}` + typesForNodeCode.push( + ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`, + ) + estreeCode.push(`export type ${nodeType} = TSESTree.${nodeType}`) } for (const nodeType of esSvelteNodeNames) { let argType = `AST.${nodeType}` if (nodeType === "Program") { argType = `AST.SvelteProgram` } - code += ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void -` + typesForNodeCode.push( + ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`, + ) } -code += ` -}` - -code += ` -export type TSNodeListener = { -` +typesForNodeCode.push(`}`) +typesForNodeCode.push(``) +typesForNodeCode.push(`export type TSNodeListener = {`) for (const nodeType of tsNodeNames) { let argType = `TSESTree.${nodeType}` if (nodeType === "TSIntrinsicKeyword") { argType = `TSESTree.Node & { type: AST_NODE_TYPES.${nodeType}}` } - code += ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void -` + typesForNodeCode.push( + ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`, + ) } -code += ` -}` - -code += ` -export type SvelteNodeListener = { -` +typesForNodeCode.push(`}`) +typesForNodeCode.push(``) +typesForNodeCode.push(`export type SvelteNodeListener = {`) for (const nodeType of svelteNodeNames.filter( (k) => !esSvelteNodeNames.includes(k), )) { const argType = `AST.${nodeType}` - code += ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void -` + typesForNodeCode.push( + ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`, + ) } -code += ` -}` +typesForNodeCode.push(`}`) -fs.writeFileSync(codeFilename, code) +fs.writeFileSync(typesForNodeFilename, typesForNodeCode.join("\n")) +fs.writeFileSync(estreeFilename, estreeCode.join("\n")) diff --git a/tsconfig.json b/tsconfig.json index e747d6c3f..aec0c961b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,9 +14,6 @@ "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "baseUrl": ".", - // "paths": { - // "*": ["typings/*"] - // }, "esModuleInterop": true, "outDir": "lib", "paths": { diff --git a/typings/eslint-utils/index.d.ts b/typings/eslint-utils/index.d.ts index 944e2725a..d51d6dada 100644 --- a/typings/eslint-utils/index.d.ts +++ b/typings/eslint-utils/index.d.ts @@ -1,6 +1,5 @@ import type { AST } from "svelte-eslint-parser" import type { Scope } from "eslint" -import type * as ESTree from "estree" import type { TSESTree } from "@typescript-eslint/types" export { ReferenceTracker, @@ -34,7 +33,7 @@ export function isNotCommentToken(token: Token): boolean export function findVariable( initialScope: Scope.Scope, - nameOrNode: ESTree.Identifier | TSESTree.Identifier | string, + nameOrNode: TSESTree.Identifier | string, ): Scope.Variable /** @@ -42,10 +41,6 @@ export function findVariable( */ export function getPropertyName( node: - | ESTree.MemberExpression - | ESTree.MethodDefinition - | ESTree.Property - | ESTree.PropertyDefinition | TSESTree.MemberExpression | TSESTree.MethodDefinition | TSESTree.Property diff --git a/typings/estree/index.d.ts b/typings/estree/index.d.ts new file mode 100644 index 000000000..298a9c345 --- /dev/null +++ b/typings/estree/index.d.ts @@ -0,0 +1,79 @@ +// +// Replace type information to use "@typescript-eslint/types" instead of "estree". +// + +import type { TSESTree } from "@typescript-eslint/types" + +export type Node = TSESTree.Node +export type Expression = TSESTree.Expression +export type Statement = TSESTree.Statement +export type Pattern = TSESTree.Pattern +export type ArrayExpression = TSESTree.ArrayExpression +export type ArrayPattern = TSESTree.ArrayPattern +export type ArrowFunctionExpression = TSESTree.ArrowFunctionExpression +export type AssignmentExpression = TSESTree.AssignmentExpression +export type AssignmentPattern = TSESTree.AssignmentPattern +export type AwaitExpression = TSESTree.AwaitExpression +export type BinaryExpression = TSESTree.BinaryExpression +export type BlockStatement = TSESTree.BlockStatement +export type BreakStatement = TSESTree.BreakStatement +export type CallExpression = TSESTree.CallExpression +export type CatchClause = TSESTree.CatchClause +export type ChainExpression = TSESTree.ChainExpression +export type ClassBody = TSESTree.ClassBody +export type ClassDeclaration = TSESTree.ClassDeclaration +export type ClassExpression = TSESTree.ClassExpression +export type ConditionalExpression = TSESTree.ConditionalExpression +export type ContinueStatement = TSESTree.ContinueStatement +export type DebuggerStatement = TSESTree.DebuggerStatement +export type DoWhileStatement = TSESTree.DoWhileStatement +export type EmptyStatement = TSESTree.EmptyStatement +export type ExportAllDeclaration = TSESTree.ExportAllDeclaration +export type ExportDefaultDeclaration = TSESTree.ExportDefaultDeclaration +export type ExportNamedDeclaration = TSESTree.ExportNamedDeclaration +export type ExportSpecifier = TSESTree.ExportSpecifier +export type ExpressionStatement = TSESTree.ExpressionStatement +export type ForInStatement = TSESTree.ForInStatement +export type ForOfStatement = TSESTree.ForOfStatement +export type ForStatement = TSESTree.ForStatement +export type FunctionDeclaration = TSESTree.FunctionDeclaration +export type FunctionExpression = TSESTree.FunctionExpression +export type Identifier = TSESTree.Identifier +export type IfStatement = TSESTree.IfStatement +export type ImportDeclaration = TSESTree.ImportDeclaration +export type ImportDefaultSpecifier = TSESTree.ImportDefaultSpecifier +export type ImportExpression = TSESTree.ImportExpression +export type ImportNamespaceSpecifier = TSESTree.ImportNamespaceSpecifier +export type ImportSpecifier = TSESTree.ImportSpecifier +export type LabeledStatement = TSESTree.LabeledStatement +export type Literal = TSESTree.Literal +export type LogicalExpression = TSESTree.LogicalExpression +export type MemberExpression = TSESTree.MemberExpression +export type MetaProperty = TSESTree.MetaProperty +export type MethodDefinition = TSESTree.MethodDefinition +export type NewExpression = TSESTree.NewExpression +export type ObjectExpression = TSESTree.ObjectExpression +export type ObjectPattern = TSESTree.ObjectPattern +export type PrivateIdentifier = TSESTree.PrivateIdentifier +export type Property = TSESTree.Property +export type PropertyDefinition = TSESTree.PropertyDefinition +export type RestElement = TSESTree.RestElement +export type ReturnStatement = TSESTree.ReturnStatement +export type SequenceExpression = TSESTree.SequenceExpression +export type SpreadElement = TSESTree.SpreadElement +export type Super = TSESTree.Super +export type SwitchCase = TSESTree.SwitchCase +export type SwitchStatement = TSESTree.SwitchStatement +export type TaggedTemplateExpression = TSESTree.TaggedTemplateExpression +export type TemplateElement = TSESTree.TemplateElement +export type TemplateLiteral = TSESTree.TemplateLiteral +export type ThisExpression = TSESTree.ThisExpression +export type ThrowStatement = TSESTree.ThrowStatement +export type TryStatement = TSESTree.TryStatement +export type UnaryExpression = TSESTree.UnaryExpression +export type UpdateExpression = TSESTree.UpdateExpression +export type VariableDeclaration = TSESTree.VariableDeclaration +export type VariableDeclarator = TSESTree.VariableDeclarator +export type WhileStatement = TSESTree.WhileStatement +export type WithStatement = TSESTree.WithStatement +export type YieldExpression = TSESTree.YieldExpression