import type { JSONSchema4 } from "json-schema"; import type { Linter, Rule, Scope, SourceCode as ESLintSourceCode } from "eslint"; import type { AST, parseForESLint } from "astro-eslint-parser"; import type * as ESTree from "estree"; import type { ASTNode, ASTNodeWithParent, ASTNodeListener } from "./types-for-node"; export type { ASTNode, ASTNodeWithParent, ASTNodeListener }; export interface RuleListener extends ASTNodeListener { onCodePathStart?(codePath: Rule.CodePath, node: never): void; onCodePathEnd?(codePath: Rule.CodePath, node: never): void; onCodePathSegmentStart?(segment: Rule.CodePathSegment, node: never): void; onCodePathSegmentEnd?(segment: Rule.CodePathSegment, node: never): void; onCodePathSegmentLoop?(fromSegment: Rule.CodePathSegment, toSegment: Rule.CodePathSegment, node: never): void; [key: string]: ((codePath: Rule.CodePath, node: never) => void) | ((segment: Rule.CodePathSegment, node: never) => void) | ((fromSegment: Rule.CodePathSegment, toSegment: Rule.CodePathSegment, node: never) => void) | ASTNodeListener[keyof ASTNodeListener] | ((node: never) => void) | undefined; } export interface RuleModule { meta: RuleMetaData; create: (context: RuleContext) => RuleListener; } export type RuleCategory = "Possible Errors" | "Security Vulnerability" | "Best Practices" | "Stylistic Issues" | "A11Y Extension Rules" | "Extension Rules" | "System"; export interface RuleMetaData { docs: { description: string; category: RuleCategory; recommended: boolean | "base"; extensionRule?: string | { plugin: string; url: string; }; url: string; ruleId: string; ruleName: string; default?: "error" | "warn"; available: () => boolean; }; messages: { [messageId: string]: string; }; fixable?: "code" | "whitespace"; hasSuggestions?: boolean; schema: JSONSchema4 | JSONSchema4[]; deprecated?: boolean; replacedBy?: string[]; type: "problem" | "suggestion" | "layout"; } export interface PartialRuleModule { meta: PartialRuleMetaData; create: (context: RuleContext) => RuleListener; } export interface PartialRuleMetaData { docs: { description: string; category: RuleCategory; recommended: boolean | "base"; extensionRule?: string | { plugin: string; url: string; }; default?: "error" | "warn"; available?: () => boolean; }; messages: { [messageId: string]: string; }; fixable?: "code" | "whitespace"; hasSuggestions?: boolean; schema: JSONSchema4 | JSONSchema4[]; deprecated?: boolean; replacedBy?: string[]; type: "problem" | "suggestion" | "layout"; } export type RuleContext = { id: string; options: any[]; settings?: { ["astro"]?: { ignoreWarnings?: unknown; }; }; parserPath: string; parserOptions: Linter.ParserOptions; parserServices: Partial["services"]>; getAncestors(): ASTNode[]; getDeclaredVariables(node: ESTree.Node): Scope.Variable[]; getFilename(): string; getScope(): Scope.Scope; getSourceCode(): SourceCode; sourceCode: SourceCode; markVariableAsUsed(name: string): boolean; report(descriptor: ReportDescriptor): void; getCwd?: () => string; }; export type NodeOrToken = { type: string; loc?: AST.SourceLocation | null; range?: [number, number]; }; interface ReportDescriptorOptionsBase { data?: { [key: string]: string; }; fix?: null | ((fixer: RuleFixer) => null | Rule.Fix | IterableIterator | Rule.Fix[]); } type SuggestionDescriptorMessage = { desc: string; } | { messageId: string; }; type SuggestionReportDescriptor = SuggestionDescriptorMessage & ReportDescriptorOptionsBase; interface ReportDescriptorOptions extends ReportDescriptorOptionsBase { suggest?: SuggestionReportDescriptor[] | null; } type ReportDescriptor = ReportDescriptorMessage & ReportDescriptorLocation & ReportDescriptorOptions; type ReportDescriptorMessage = { message: string; } | { messageId: string; }; type ReportDescriptorLocation = { node: NodeOrToken; } | { loc: AST.SourceLocation | { line: number; column: number; }; }; export interface RuleFixer { insertTextAfter(nodeOrToken: NodeOrToken, text: string): Rule.Fix; insertTextAfterRange(range: AST.Range, text: string): Rule.Fix; insertTextBefore(nodeOrToken: NodeOrToken, text: string): Rule.Fix; insertTextBeforeRange(range: AST.Range, text: string): Rule.Fix; remove(nodeOrToken: NodeOrToken): Rule.Fix; removeRange(range: AST.Range): Rule.Fix; replaceText(nodeOrToken: NodeOrToken, text: string): Rule.Fix; replaceTextRange(range: AST.Range, text: string): Rule.Fix; } export declare namespace SourceCode { function splitLines(text: string): string[]; } export interface SourceCode { text: string; ast: AST.AstroProgram; lines: string[]; hasBOM: boolean; parserServices: ESLintSourceCode.ParserServices; scopeManager: Scope.ScopeManager; visitorKeys: ESLintSourceCode.VisitorKeys; getScope(node: ESTree.Node | ASTNode): Scope.Scope; getText(node?: NodeOrToken, beforeCount?: number, afterCount?: number): string; getLines(): string[]; getAllComments(): AST.Comment[]; getComments(node: NodeOrToken): { leading: AST.Comment[]; trailing: AST.Comment[]; }; getJSDocComment(node: NodeOrToken): AST.Comment | null; getNodeByRangeIndex(index: number): ASTNodeWithParent | null; isSpaceBetweenTokens(first: AST.Token, second: AST.Token): boolean; getLocFromIndex(index: number): AST.Position; getIndexFromLoc(location: AST.Position): number; getTokenByRangeStart(offset: number, options?: { includeComments?: boolean; }): AST.Token | AST.Comment | null; getFirstToken(node: NodeOrToken): AST.Token; getFirstToken(node: NodeOrToken, options?: Parameters[1] | { skip?: number; }): AST.Token | AST.Comment | null; getFirstTokens(node: NodeOrToken, options?: Parameters[1]): (AST.Token | AST.Comment)[]; getLastToken(node: NodeOrToken): AST.Token; getLastToken(node: NodeOrToken, options?: Parameters[1] | number): AST.Token | AST.Comment | null; getLastTokens(node: NodeOrToken, options?: Parameters[1]): (AST.Token | AST.Comment)[]; getTokenBefore(node: NodeOrToken): AST.Token | null; getTokenBefore(node: NodeOrToken, options?: Parameters[1]): AST.Token | AST.Comment | null; getTokensBefore(node: NodeOrToken, options?: Parameters[1]): (AST.Token | AST.Comment)[]; getTokenAfter(node: NodeOrToken): AST.Token | null; getTokenAfter(node: NodeOrToken, options?: Parameters[1]): AST.Token | AST.Comment | null; getTokensAfter(node: NodeOrToken, options?: Parameters[1]): (AST.Token | AST.Comment)[]; getFirstTokenBetween(left: NodeOrToken, right: NodeOrToken, options?: Parameters[2]): AST.Token | AST.Comment | null; getFirstTokensBetween(left: NodeOrToken, right: NodeOrToken, options?: Parameters[2]): (AST.Token | AST.Comment)[]; getLastTokenBetween(left: NodeOrToken, right: NodeOrToken, options?: Parameters[2]): AST.Token | AST.Comment | null; getLastTokensBetween(left: NodeOrToken, right: NodeOrToken, options?: Parameters[2]): (AST.Token | AST.Comment)[]; getTokensBetween(left: NodeOrToken, right: NodeOrToken, padding?: Parameters[2]): (AST.Token | AST.Comment)[]; getTokens(node: NodeOrToken, beforeCount?: number, afterCount?: number): AST.Token[]; getTokens(node: NodeOrToken, options: Parameters[1]): (AST.Token | AST.Comment)[]; commentsExistBetween(left: NodeOrToken, right: NodeOrToken): boolean; getCommentsBefore(nodeOrToken: NodeOrToken | AST.Token): AST.Comment[]; getCommentsAfter(nodeOrToken: NodeOrToken | AST.Token): AST.Comment[]; getCommentsInside(node: NodeOrToken): AST.Comment[]; }