UNPKG

39.2 kBTypeScriptView Raw
1// Type definitions for eslint 7.28
2// Project: https://eslint.org
3// Definitions by: Pierre-Marie Dartus <https://github.com/pmdartus>
4// Jed Fox <https://github.com/j-f1>
5// Saad Quadri <https://github.com/saadq>
6// Jason Kwok <https://github.com/JasonHK>
7// Brad Zacher <https://github.com/bradzacher>
8// JounQin <https://github.com/JounQin>
9// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
10
11/// <reference path="helpers.d.ts" />
12/// <reference path="lib/rules/index.d.ts" />
13
14import { JSONSchema4 } from "json-schema";
15import * as ESTree from "estree";
16
17export namespace AST {
18 type TokenType =
19 | "Boolean"
20 | "Null"
21 | "Identifier"
22 | "Keyword"
23 | "Punctuator"
24 | "JSXIdentifier"
25 | "JSXText"
26 | "Numeric"
27 | "String"
28 | "RegularExpression";
29
30 interface Token {
31 type: TokenType;
32 value: string;
33 range: Range;
34 loc: SourceLocation;
35 }
36
37 interface SourceLocation {
38 start: ESTree.Position;
39 end: ESTree.Position;
40 }
41
42 type Range = [number, number];
43
44 interface Program extends ESTree.Program {
45 comments: ESTree.Comment[];
46 tokens: Token[];
47 loc: SourceLocation;
48 range: Range;
49 }
50}
51
52export namespace Scope {
53 interface ScopeManager {
54 scopes: Scope[];
55 globalScope: Scope | null;
56
57 acquire(node: ESTree.Node, inner?: boolean): Scope | null;
58
59 getDeclaredVariables(node: ESTree.Node): Variable[];
60 }
61
62 interface Scope {
63 type:
64 | "block"
65 | "catch"
66 | "class"
67 | "for"
68 | "function"
69 | "function-expression-name"
70 | "global"
71 | "module"
72 | "switch"
73 | "with"
74 | "TDZ";
75 isStrict: boolean;
76 upper: Scope | null;
77 childScopes: Scope[];
78 variableScope: Scope;
79 block: ESTree.Node;
80 variables: Variable[];
81 set: Map<string, Variable>;
82 references: Reference[];
83 through: Reference[];
84 functionExpressionScope: boolean;
85 }
86
87 interface Variable {
88 name: string;
89 identifiers: ESTree.Identifier[];
90 references: Reference[];
91 defs: Definition[];
92 }
93
94 interface Reference {
95 identifier: ESTree.Identifier;
96 from: Scope;
97 resolved: Variable | null;
98 writeExpr: ESTree.Node | null;
99 init: boolean;
100
101 isWrite(): boolean;
102
103 isRead(): boolean;
104
105 isWriteOnly(): boolean;
106
107 isReadOnly(): boolean;
108
109 isReadWrite(): boolean;
110 }
111
112 type DefinitionType =
113 | { type: "CatchClause"; node: ESTree.CatchClause; parent: null }
114 | { type: "ClassName"; node: ESTree.ClassDeclaration | ESTree.ClassExpression; parent: null }
115 | { type: "FunctionName"; node: ESTree.FunctionDeclaration | ESTree.FunctionExpression; parent: null }
116 | { type: "ImplicitGlobalVariable"; node: ESTree.Program; parent: null }
117 | {
118 type: "ImportBinding";
119 node: ESTree.ImportSpecifier | ESTree.ImportDefaultSpecifier | ESTree.ImportNamespaceSpecifier;
120 parent: ESTree.ImportDeclaration;
121 }
122 | {
123 type: "Parameter";
124 node: ESTree.FunctionDeclaration | ESTree.FunctionExpression | ESTree.ArrowFunctionExpression;
125 parent: null;
126 }
127 | { type: "TDZ"; node: any; parent: null }
128 | { type: "Variable"; node: ESTree.VariableDeclarator; parent: ESTree.VariableDeclaration };
129
130 type Definition = DefinitionType & { name: ESTree.Identifier };
131}
132
133//#region SourceCode
134
135export class SourceCode {
136 text: string;
137 ast: AST.Program;
138 lines: string[];
139 hasBOM: boolean;
140 parserServices: SourceCode.ParserServices;
141 scopeManager: Scope.ScopeManager;
142 visitorKeys: SourceCode.VisitorKeys;
143
144 constructor(text: string, ast: AST.Program);
145 constructor(config: SourceCode.Config);
146
147 static splitLines(text: string): string[];
148
149 getText(node?: ESTree.Node, beforeCount?: number, afterCount?: number): string;
150
151 getLines(): string[];
152
153 getAllComments(): ESTree.Comment[];
154
155 getComments(node: ESTree.Node): { leading: ESTree.Comment[]; trailing: ESTree.Comment[] };
156
157 getJSDocComment(node: ESTree.Node): ESTree.Comment | null;
158
159 getNodeByRangeIndex(index: number): ESTree.Node | null;
160
161 isSpaceBetweenTokens(first: AST.Token, second: AST.Token): boolean;
162
163 getLocFromIndex(index: number): ESTree.Position;
164
165 getIndexFromLoc(location: ESTree.Position): number;
166
167 // Inherited methods from TokenStore
168 // ---------------------------------
169
170 getTokenByRangeStart(offset: number, options?: { includeComments: false }): AST.Token | null;
171 getTokenByRangeStart(offset: number, options: { includeComments: boolean }): AST.Token | ESTree.Comment | null;
172
173 getFirstToken: SourceCode.UnaryNodeCursorWithSkipOptions;
174
175 getFirstTokens: SourceCode.UnaryNodeCursorWithCountOptions;
176
177 getLastToken: SourceCode.UnaryNodeCursorWithSkipOptions;
178
179 getLastTokens: SourceCode.UnaryNodeCursorWithCountOptions;
180
181 getTokenBefore: SourceCode.UnaryCursorWithSkipOptions;
182
183 getTokensBefore: SourceCode.UnaryCursorWithCountOptions;
184
185 getTokenAfter: SourceCode.UnaryCursorWithSkipOptions;
186
187 getTokensAfter: SourceCode.UnaryCursorWithCountOptions;
188
189 getFirstTokenBetween: SourceCode.BinaryCursorWithSkipOptions;
190
191 getFirstTokensBetween: SourceCode.BinaryCursorWithCountOptions;
192
193 getLastTokenBetween: SourceCode.BinaryCursorWithSkipOptions;
194
195 getLastTokensBetween: SourceCode.BinaryCursorWithCountOptions;
196
197 getTokensBetween: SourceCode.BinaryCursorWithCountOptions;
198
199 getTokens: ((node: ESTree.Node, beforeCount?: number, afterCount?: number) => AST.Token[]) &
200 SourceCode.UnaryNodeCursorWithCountOptions;
201
202 commentsExistBetween(
203 left: ESTree.Node | AST.Token | ESTree.Comment,
204 right: ESTree.Node | AST.Token | ESTree.Comment,
205 ): boolean;
206
207 getCommentsBefore(nodeOrToken: ESTree.Node | AST.Token): ESTree.Comment[];
208
209 getCommentsAfter(nodeOrToken: ESTree.Node | AST.Token): ESTree.Comment[];
210
211 getCommentsInside(node: ESTree.Node): ESTree.Comment[];
212}
213
214export namespace SourceCode {
215 interface Config {
216 text: string;
217 ast: AST.Program;
218 parserServices?: ParserServices | undefined;
219 scopeManager?: Scope.ScopeManager | undefined;
220 visitorKeys?: VisitorKeys | undefined;
221 }
222
223 type ParserServices = any;
224
225 interface VisitorKeys {
226 [nodeType: string]: string[];
227 }
228
229 interface UnaryNodeCursorWithSkipOptions {
230 <T extends AST.Token>(
231 node: ESTree.Node,
232 options:
233 | ((token: AST.Token) => token is T)
234 | { filter: (token: AST.Token) => token is T; includeComments?: false | undefined; skip?: number | undefined },
235 ): T | null;
236 <T extends AST.Token | ESTree.Comment>(
237 node: ESTree.Node,
238 options: {
239 filter: (tokenOrComment: AST.Token | ESTree.Comment) => tokenOrComment is T;
240 includeComments: boolean;
241 skip?: number | undefined;
242 },
243 ): T | null;
244 (
245 node: ESTree.Node,
246 options?:
247 | { filter?: ((token: AST.Token) => boolean) | undefined; includeComments?: false | undefined; skip?: number | undefined }
248 | ((token: AST.Token) => boolean)
249 | number,
250 ): AST.Token | null;
251 (
252 node: ESTree.Node,
253 options: {
254 filter?: ((token: AST.Token | ESTree.Comment) => boolean) | undefined;
255 includeComments: boolean;
256 skip?: number | undefined;
257 },
258 ): AST.Token | ESTree.Comment | null;
259 }
260
261 interface UnaryNodeCursorWithCountOptions {
262 <T extends AST.Token>(
263 node: ESTree.Node,
264 options:
265 | ((token: AST.Token) => token is T)
266 | { filter: (token: AST.Token) => token is T; includeComments?: false | undefined; count?: number | undefined },
267 ): T[];
268 <T extends AST.Token | ESTree.Comment>(
269 node: ESTree.Node,
270 options: {
271 filter: (tokenOrComment: AST.Token | ESTree.Comment) => tokenOrComment is T;
272 includeComments: boolean;
273 count?: number | undefined;
274 },
275 ): T[];
276 (
277 node: ESTree.Node,
278 options?:
279 | { filter?: ((token: AST.Token) => boolean) | undefined; includeComments?: false | undefined; count?: number | undefined }
280 | ((token: AST.Token) => boolean)
281 | number,
282 ): AST.Token[];
283 (
284 node: ESTree.Node,
285 options: {
286 filter?: ((token: AST.Token | ESTree.Comment) => boolean) | undefined;
287 includeComments: boolean;
288 count?: number | undefined;
289 },
290 ): Array<AST.Token | ESTree.Comment>;
291 }
292
293 interface UnaryCursorWithSkipOptions {
294 <T extends AST.Token>(
295 node: ESTree.Node | AST.Token | ESTree.Comment,
296 options:
297 | ((token: AST.Token) => token is T)
298 | { filter: (token: AST.Token) => token is T; includeComments?: false | undefined; skip?: number | undefined },
299 ): T | null;
300 <T extends AST.Token | ESTree.Comment>(
301 node: ESTree.Node | AST.Token | ESTree.Comment,
302 options: {
303 filter: (tokenOrComment: AST.Token | ESTree.Comment) => tokenOrComment is T;
304 includeComments: boolean;
305 skip?: number | undefined;
306 },
307 ): T | null;
308 (
309 node: ESTree.Node | AST.Token | ESTree.Comment,
310 options?:
311 | { filter?: ((token: AST.Token) => boolean) | undefined; includeComments?: false | undefined; skip?: number | undefined }
312 | ((token: AST.Token) => boolean)
313 | number,
314 ): AST.Token | null;
315 (
316 node: ESTree.Node | AST.Token | ESTree.Comment,
317 options: {
318 filter?: ((token: AST.Token | ESTree.Comment) => boolean) | undefined;
319 includeComments: boolean;
320 skip?: number | undefined;
321 },
322 ): AST.Token | ESTree.Comment | null;
323 }
324
325 interface UnaryCursorWithCountOptions {
326 <T extends AST.Token>(
327 node: ESTree.Node | AST.Token | ESTree.Comment,
328 options:
329 | ((token: AST.Token) => token is T)
330 | { filter: (token: AST.Token) => token is T; includeComments?: false | undefined; count?: number | undefined },
331 ): T[];
332 <T extends AST.Token | ESTree.Comment>(
333 node: ESTree.Node | AST.Token | ESTree.Comment,
334 options: {
335 filter: (tokenOrComment: AST.Token | ESTree.Comment) => tokenOrComment is T;
336 includeComments: boolean;
337 count?: number | undefined;
338 },
339 ): T[];
340 (
341 node: ESTree.Node | AST.Token | ESTree.Comment,
342 options?:
343 | { filter?: ((token: AST.Token) => boolean) | undefined; includeComments?: false | undefined; count?: number | undefined }
344 | ((token: AST.Token) => boolean)
345 | number,
346 ): AST.Token[];
347 (
348 node: ESTree.Node | AST.Token | ESTree.Comment,
349 options: {
350 filter?: ((token: AST.Token | ESTree.Comment) => boolean) | undefined;
351 includeComments: boolean;
352 count?: number | undefined;
353 },
354 ): Array<AST.Token | ESTree.Comment>;
355 }
356
357 interface BinaryCursorWithSkipOptions {
358 <T extends AST.Token>(
359 left: ESTree.Node | AST.Token | ESTree.Comment,
360 right: ESTree.Node | AST.Token | ESTree.Comment,
361 options:
362 | ((token: AST.Token) => token is T)
363 | { filter: (token: AST.Token) => token is T; includeComments?: false | undefined; skip?: number | undefined },
364 ): T | null;
365 <T extends AST.Token | ESTree.Comment>(
366 left: ESTree.Node | AST.Token | ESTree.Comment,
367 right: ESTree.Node | AST.Token | ESTree.Comment,
368 options: {
369 filter: (tokenOrComment: AST.Token | ESTree.Comment) => tokenOrComment is T;
370 includeComments: boolean;
371 skip?: number | undefined;
372 },
373 ): T | null;
374 (
375 left: ESTree.Node | AST.Token | ESTree.Comment,
376 right: ESTree.Node | AST.Token | ESTree.Comment,
377 options?:
378 | { filter?: ((token: AST.Token) => boolean) | undefined; includeComments?: false | undefined; skip?: number | undefined }
379 | ((token: AST.Token) => boolean)
380 | number,
381 ): AST.Token | null;
382 (
383 left: ESTree.Node | AST.Token | ESTree.Comment,
384 right: ESTree.Node | AST.Token | ESTree.Comment,
385 options: {
386 filter?: ((token: AST.Token | ESTree.Comment) => boolean) | undefined;
387 includeComments: boolean;
388 skip?: number | undefined;
389 },
390 ): AST.Token | ESTree.Comment | null;
391 }
392
393 interface BinaryCursorWithCountOptions {
394 <T extends AST.Token>(
395 left: ESTree.Node | AST.Token | ESTree.Comment,
396 right: ESTree.Node | AST.Token | ESTree.Comment,
397 options:
398 | ((token: AST.Token) => token is T)
399 | { filter: (token: AST.Token) => token is T; includeComments?: false | undefined; count?: number | undefined },
400 ): T[];
401 <T extends AST.Token | ESTree.Comment>(
402 left: ESTree.Node | AST.Token | ESTree.Comment,
403 right: ESTree.Node | AST.Token | ESTree.Comment,
404 options: {
405 filter: (tokenOrComment: AST.Token | ESTree.Comment) => tokenOrComment is T;
406 includeComments: boolean;
407 count?: number | undefined;
408 },
409 ): T[];
410 (
411 left: ESTree.Node | AST.Token | ESTree.Comment,
412 right: ESTree.Node | AST.Token | ESTree.Comment,
413 options?:
414 | { filter?: ((token: AST.Token) => boolean) | undefined; includeComments?: false | undefined; count?: number | undefined }
415 | ((token: AST.Token) => boolean)
416 | number,
417 ): AST.Token[];
418 (
419 left: ESTree.Node | AST.Token | ESTree.Comment,
420 right: ESTree.Node | AST.Token | ESTree.Comment,
421 options: {
422 filter?: ((token: AST.Token | ESTree.Comment) => boolean) | undefined;
423 includeComments: boolean;
424 count?: number | undefined;
425 },
426 ): Array<AST.Token | ESTree.Comment>;
427 }
428}
429
430//#endregion
431
432export namespace Rule {
433 interface RuleModule {
434 create(context: RuleContext): RuleListener;
435 meta?: RuleMetaData | undefined;
436 }
437
438 type NodeTypes = ESTree.Node["type"];
439 interface NodeListener {
440 ArrayExpression?: ((node: ESTree.ArrayExpression & NodeParentExtension) => void) | undefined;
441 ArrayPattern?: ((node: ESTree.ArrayPattern & NodeParentExtension) => void) | undefined;
442 ArrowFunctionExpression?: ((node: ESTree.ArrowFunctionExpression & NodeParentExtension) => void) | undefined;
443 AssignmentExpression?: ((node: ESTree.AssignmentExpression & NodeParentExtension) => void) | undefined;
444 AssignmentPattern?: ((node: ESTree.AssignmentPattern & NodeParentExtension) => void) | undefined;
445 AwaitExpression?: ((node: ESTree.AwaitExpression & NodeParentExtension) => void) | undefined;
446 BinaryExpression?: ((node: ESTree.BinaryExpression & NodeParentExtension) => void) | undefined;
447 BlockStatement?: ((node: ESTree.BlockStatement & NodeParentExtension) => void) | undefined;
448 BreakStatement?: ((node: ESTree.BreakStatement & NodeParentExtension) => void) | undefined;
449 CallExpression?: ((node: ESTree.CallExpression & NodeParentExtension) => void) | undefined;
450 CatchClause?: ((node: ESTree.CatchClause & NodeParentExtension) => void) | undefined;
451 ChainExpression?: ((node: ESTree.ChainExpression & NodeParentExtension) => void) | undefined;
452 ClassBody?: ((node: ESTree.ClassBody & NodeParentExtension) => void) | undefined;
453 ClassDeclaration?: ((node: ESTree.ClassDeclaration & NodeParentExtension) => void) | undefined;
454 ClassExpression?: ((node: ESTree.ClassExpression & NodeParentExtension) => void) | undefined;
455 ConditionalExpression?: ((node: ESTree.ConditionalExpression & NodeParentExtension) => void) | undefined;
456 ContinueStatement?: ((node: ESTree.ContinueStatement & NodeParentExtension) => void) | undefined;
457 DebuggerStatement?: ((node: ESTree.DebuggerStatement & NodeParentExtension) => void) | undefined;
458 DoWhileStatement?: ((node: ESTree.DoWhileStatement & NodeParentExtension) => void) | undefined;
459 EmptyStatement?: ((node: ESTree.EmptyStatement & NodeParentExtension) => void) | undefined;
460 ExportAllDeclaration?: ((node: ESTree.ExportAllDeclaration & NodeParentExtension) => void) | undefined;
461 ExportDefaultDeclaration?: ((node: ESTree.ExportDefaultDeclaration & NodeParentExtension) => void) | undefined;
462 ExportNamedDeclaration?: ((node: ESTree.ExportNamedDeclaration & NodeParentExtension) => void) | undefined;
463 ExportSpecifier?: ((node: ESTree.ExportSpecifier & NodeParentExtension) => void) | undefined;
464 ExpressionStatement?: ((node: ESTree.ExpressionStatement & NodeParentExtension) => void) | undefined;
465 ForInStatement?: ((node: ESTree.ForInStatement & NodeParentExtension) => void) | undefined;
466 ForOfStatement?: ((node: ESTree.ForOfStatement & NodeParentExtension) => void) | undefined;
467 ForStatement?: ((node: ESTree.ForStatement & NodeParentExtension) => void) | undefined;
468 FunctionDeclaration?: ((node: ESTree.FunctionDeclaration & NodeParentExtension) => void) | undefined;
469 FunctionExpression?: ((node: ESTree.FunctionExpression & NodeParentExtension) => void) | undefined;
470 Identifier?: ((node: ESTree.Identifier & NodeParentExtension) => void) | undefined;
471 IfStatement?: ((node: ESTree.IfStatement & NodeParentExtension) => void) | undefined;
472 ImportDeclaration?: ((node: ESTree.ImportDeclaration & NodeParentExtension) => void) | undefined;
473 ImportDefaultSpecifier?: ((node: ESTree.ImportDefaultSpecifier & NodeParentExtension) => void) | undefined;
474 ImportExpression?: ((node: ESTree.ImportExpression & NodeParentExtension) => void) | undefined;
475 ImportNamespaceSpecifier?: ((node: ESTree.ImportNamespaceSpecifier & NodeParentExtension) => void) | undefined;
476 ImportSpecifier?: ((node: ESTree.ImportSpecifier & NodeParentExtension) => void) | undefined;
477 LabeledStatement?: ((node: ESTree.LabeledStatement & NodeParentExtension) => void) | undefined;
478 Literal?: ((node: ESTree.Literal & NodeParentExtension) => void) | undefined;
479 LogicalExpression?: ((node: ESTree.LogicalExpression & NodeParentExtension) => void) | undefined;
480 MemberExpression?: ((node: ESTree.MemberExpression & NodeParentExtension) => void) | undefined;
481 MetaProperty?: ((node: ESTree.MetaProperty & NodeParentExtension) => void) | undefined;
482 MethodDefinition?: ((node: ESTree.MethodDefinition & NodeParentExtension) => void) | undefined;
483 NewExpression?: ((node: ESTree.NewExpression & NodeParentExtension) => void) | undefined;
484 ObjectExpression?: ((node: ESTree.ObjectExpression & NodeParentExtension) => void) | undefined;
485 ObjectPattern?: ((node: ESTree.ObjectPattern & NodeParentExtension) => void) | undefined;
486 Program?: ((node: ESTree.Program) => void) | undefined;
487 Property?: ((node: ESTree.Property & NodeParentExtension) => void) | undefined;
488 RestElement?: ((node: ESTree.RestElement & NodeParentExtension) => void) | undefined;
489 ReturnStatement?: ((node: ESTree.ReturnStatement & NodeParentExtension) => void) | undefined;
490 SequenceExpression?: ((node: ESTree.SequenceExpression & NodeParentExtension) => void) | undefined;
491 SpreadElement?: ((node: ESTree.SpreadElement & NodeParentExtension) => void) | undefined;
492 Super?: ((node: ESTree.Super & NodeParentExtension) => void) | undefined;
493 SwitchCase?: ((node: ESTree.SwitchCase & NodeParentExtension) => void) | undefined;
494 SwitchStatement?: ((node: ESTree.SwitchStatement & NodeParentExtension) => void) | undefined;
495 TaggedTemplateExpression?: ((node: ESTree.TaggedTemplateExpression & NodeParentExtension) => void) | undefined;
496 TemplateElement?: ((node: ESTree.TemplateElement & NodeParentExtension) => void) | undefined;
497 TemplateLiteral?: ((node: ESTree.TemplateLiteral & NodeParentExtension) => void) | undefined;
498 ThisExpression?: ((node: ESTree.ThisExpression & NodeParentExtension) => void) | undefined;
499 ThrowStatement?: ((node: ESTree.ThrowStatement & NodeParentExtension) => void) | undefined;
500 TryStatement?: ((node: ESTree.TryStatement & NodeParentExtension) => void) | undefined;
501 UnaryExpression?: ((node: ESTree.UnaryExpression & NodeParentExtension) => void) | undefined;
502 UpdateExpression?: ((node: ESTree.UpdateExpression & NodeParentExtension) => void) | undefined;
503 VariableDeclaration?: ((node: ESTree.VariableDeclaration & NodeParentExtension) => void) | undefined;
504 VariableDeclarator?: ((node: ESTree.VariableDeclarator & NodeParentExtension) => void) | undefined;
505 WhileStatement?: ((node: ESTree.WhileStatement & NodeParentExtension) => void) | undefined;
506 WithStatement?: ((node: ESTree.WithStatement & NodeParentExtension) => void) | undefined;
507 YieldExpression?: ((node: ESTree.YieldExpression & NodeParentExtension) => void) | undefined;
508 }
509
510 interface NodeParentExtension {
511 parent: Node;
512 }
513 type Node = ESTree.Node & NodeParentExtension;
514
515 interface RuleListener extends NodeListener {
516 onCodePathStart?(codePath: CodePath, node: Node): void;
517
518 onCodePathEnd?(codePath: CodePath, node: Node): void;
519
520 onCodePathSegmentStart?(segment: CodePathSegment, node: Node): void;
521
522 onCodePathSegmentEnd?(segment: CodePathSegment, node: Node): void;
523
524 onCodePathSegmentLoop?(fromSegment: CodePathSegment, toSegment: CodePathSegment, node: Node): void;
525
526 [key: string]:
527 | ((codePath: CodePath, node: Node) => void)
528 | ((segment: CodePathSegment, node: Node) => void)
529 | ((fromSegment: CodePathSegment, toSegment: CodePathSegment, node: Node) => void)
530 | ((node: Node) => void)
531 | NodeListener[keyof NodeListener]
532 | undefined;
533 }
534
535 interface CodePath {
536 id: string;
537 initialSegment: CodePathSegment;
538 finalSegments: CodePathSegment[];
539 returnedSegments: CodePathSegment[];
540 thrownSegments: CodePathSegment[];
541 currentSegments: CodePathSegment[];
542 upper: CodePath | null;
543 childCodePaths: CodePath[];
544 }
545
546 interface CodePathSegment {
547 id: string;
548 nextSegments: CodePathSegment[];
549 prevSegments: CodePathSegment[];
550 reachable: boolean;
551 }
552
553 interface RuleMetaData {
554 docs?: {
555 /** provides the short description of the rule in the [rules index](https://eslint.org/docs/rules/) */
556 description?: string | undefined;
557 /** specifies the heading under which the rule is listed in the [rules index](https://eslint.org/docs/rules/) */
558 category?: string | undefined;
559 /** is whether the `"extends": "eslint:recommended"` property in a [configuration file](https://eslint.org/docs/user-guide/configuring#extending-configuration-files) enables the rule */
560 recommended?: boolean | undefined;
561 /** specifies the URL at which the full documentation can be accessed */
562 url?: string | undefined;
563 /** specifies whether rules can return suggestions (defaults to false if omitted) */
564 suggestion?: boolean | undefined;
565 } | undefined;
566 messages?: { [messageId: string]: string } | undefined;
567 fixable?: "code" | "whitespace" | undefined;
568 schema?: JSONSchema4 | JSONSchema4[] | undefined;
569 deprecated?: boolean | undefined;
570 type?: "problem" | "suggestion" | "layout" | undefined;
571 }
572
573 interface RuleContext {
574 id: string;
575 options: any[];
576 settings: { [name: string]: any };
577 parserPath: string;
578 parserOptions: Linter.ParserOptions;
579 parserServices: SourceCode.ParserServices;
580
581 getAncestors(): ESTree.Node[];
582
583 getDeclaredVariables(node: ESTree.Node): Scope.Variable[];
584
585 getFilename(): string;
586
587 getPhysicalFilename(): string;
588
589 getCwd(): string;
590
591 getScope(): Scope.Scope;
592
593 getSourceCode(): SourceCode;
594
595 markVariableAsUsed(name: string): boolean;
596
597 report(descriptor: ReportDescriptor): void;
598 }
599
600 type ReportFixer = (fixer: RuleFixer) => null | Fix | IterableIterator<Fix> | Fix[];
601
602 interface ReportDescriptorOptionsBase {
603 data?: { [key: string]: string };
604
605 fix?: null | ReportFixer;
606 }
607
608 interface SuggestionReportOptions {
609 data?: { [key: string]: string };
610
611 fix: ReportFixer;
612 }
613
614 type SuggestionDescriptorMessage = { desc: string } | { messageId: string };
615 type SuggestionReportDescriptor = SuggestionDescriptorMessage & SuggestionReportOptions;
616
617 interface ReportDescriptorOptions extends ReportDescriptorOptionsBase {
618 suggest?: SuggestionReportDescriptor[] | null | undefined;
619 }
620
621 type ReportDescriptor = ReportDescriptorMessage & ReportDescriptorLocation & ReportDescriptorOptions;
622 type ReportDescriptorMessage = { message: string } | { messageId: string };
623 type ReportDescriptorLocation =
624 | { node: ESTree.Node }
625 | { loc: AST.SourceLocation | { line: number; column: number } };
626
627 interface RuleFixer {
628 insertTextAfter(nodeOrToken: ESTree.Node | AST.Token, text: string): Fix;
629
630 insertTextAfterRange(range: AST.Range, text: string): Fix;
631
632 insertTextBefore(nodeOrToken: ESTree.Node | AST.Token, text: string): Fix;
633
634 insertTextBeforeRange(range: AST.Range, text: string): Fix;
635
636 remove(nodeOrToken: ESTree.Node | AST.Token): Fix;
637
638 removeRange(range: AST.Range): Fix;
639
640 replaceText(nodeOrToken: ESTree.Node | AST.Token, text: string): Fix;
641
642 replaceTextRange(range: AST.Range, text: string): Fix;
643 }
644
645 interface Fix {
646 range: AST.Range;
647 text: string;
648 }
649}
650
651//#region Linter
652
653export class Linter {
654 static version: string;
655
656 version: string;
657
658 constructor(options?: { cwd?: string | undefined });
659
660 verify(code: SourceCode | string, config: Linter.Config, filename?: string): Linter.LintMessage[];
661 verify(code: SourceCode | string, config: Linter.Config, options: Linter.LintOptions): Linter.LintMessage[];
662
663 verifyAndFix(code: string, config: Linter.Config, filename?: string): Linter.FixReport;
664 verifyAndFix(code: string, config: Linter.Config, options: Linter.FixOptions): Linter.FixReport;
665
666 getSourceCode(): SourceCode;
667
668 defineRule(name: string, rule: Rule.RuleModule): void;
669
670 defineRules(rules: { [name: string]: Rule.RuleModule }): void;
671
672 getRules(): Map<string, Rule.RuleModule>;
673
674 defineParser(name: string, parser: Linter.ParserModule): void;
675}
676
677export namespace Linter {
678 type Severity = 0 | 1 | 2;
679
680 type RuleLevel = Severity | "off" | "warn" | "error";
681 type RuleLevelAndOptions<Options extends any[] = any[]> = Prepend<Partial<Options>, RuleLevel>;
682
683 type RuleEntry<Options extends any[] = any[]> = RuleLevel | RuleLevelAndOptions<Options>;
684
685 interface RulesRecord {
686 [rule: string]: RuleEntry;
687 }
688
689 interface HasRules<Rules extends RulesRecord = RulesRecord> {
690 rules?: Partial<Rules> | undefined;
691 }
692
693 interface BaseConfig<Rules extends RulesRecord = RulesRecord> extends HasRules<Rules> {
694 $schema?: string | undefined;
695 env?: { [name: string]: boolean } | undefined;
696 extends?: string | string[] | undefined;
697 globals?: { [name: string]: boolean | "readonly" | "readable" | "writable" | "writeable" } | undefined;
698 noInlineConfig?: boolean | undefined;
699 overrides?: ConfigOverride[] | undefined;
700 parser?: string | undefined;
701 parserOptions?: ParserOptions | undefined;
702 plugins?: string[] | undefined;
703 processor?: string | undefined;
704 reportUnusedDisableDirectives?: boolean | undefined;
705 settings?: { [name: string]: any } | undefined;
706 }
707
708 interface ConfigOverride<Rules extends RulesRecord = RulesRecord> extends BaseConfig<Rules> {
709 excludedFiles?: string | string[] | undefined;
710 files: string | string[];
711 }
712
713 // https://github.com/eslint/eslint/blob/v6.8.0/conf/config-schema.js
714 interface Config<Rules extends RulesRecord = RulesRecord> extends BaseConfig<Rules> {
715 ignorePatterns?: string | string[] | undefined;
716 root?: boolean | undefined;
717 }
718
719 interface ParserOptions {
720 ecmaVersion?: 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | undefined;
721 sourceType?: "script" | "module" | undefined;
722 ecmaFeatures?: {
723 globalReturn?: boolean | undefined;
724 impliedStrict?: boolean | undefined;
725 jsx?: boolean | undefined;
726 experimentalObjectRestSpread?: boolean | undefined;
727 [key: string]: any;
728 } | undefined;
729 [key: string]: any;
730 }
731
732 interface LintOptions {
733 filename?: string | undefined;
734 preprocess?: ((code: string) => string[]) | undefined;
735 postprocess?: ((problemLists: LintMessage[][]) => LintMessage[]) | undefined;
736 filterCodeBlock?: boolean | undefined;
737 disableFixes?: boolean | undefined;
738 allowInlineConfig?: boolean | undefined;
739 reportUnusedDisableDirectives?: boolean | undefined;
740 }
741
742 interface LintSuggestion {
743 desc: string;
744 fix: Rule.Fix;
745 messageId?: string | undefined;
746 }
747
748 interface LintMessage {
749 column: number;
750 line: number;
751 endColumn?: number | undefined;
752 endLine?: number | undefined;
753 ruleId: string | null;
754 message: string;
755 messageId?: string | undefined;
756 nodeType?: string | undefined;
757 fatal?: true | undefined;
758 severity: Severity;
759 fix?: Rule.Fix | undefined;
760 /** @deprecated Use `linter.getSourceCode()` */
761 source?: string | null | undefined;
762 suggestions?: LintSuggestion[] | undefined;
763 }
764
765 interface FixOptions extends LintOptions {
766 fix?: boolean | undefined;
767 }
768
769 interface FixReport {
770 fixed: boolean;
771 output: string;
772 messages: LintMessage[];
773 }
774
775 type ParserModule =
776 | {
777 parse(text: string, options?: any): AST.Program;
778 }
779 | {
780 parseForESLint(text: string, options?: any): ESLintParseResult;
781 };
782
783 interface ESLintParseResult {
784 ast: AST.Program;
785 parserServices?: SourceCode.ParserServices | undefined;
786 scopeManager?: Scope.ScopeManager | undefined;
787 visitorKeys?: SourceCode.VisitorKeys | undefined;
788 }
789
790 interface ProcessorFile {
791 text: string;
792 filename: string;
793 }
794
795 // https://eslint.org/docs/developer-guide/working-with-plugins#processors-in-plugins
796 interface Processor<T extends string | ProcessorFile = string | ProcessorFile> {
797 supportsAutofix?: boolean | undefined;
798 preprocess?(text: string, filename: string): T[];
799 postprocess?(messages: LintMessage[][], filename: string): LintMessage[];
800 }
801}
802
803//#endregion
804
805//#region ESLint
806
807export class ESLint {
808 static version: string;
809
810 static outputFixes(results: ESLint.LintResult[]): Promise<void>;
811
812 static getErrorResults(results: ESLint.LintResult[]): ESLint.LintResult[];
813
814 constructor(options?: ESLint.Options);
815
816 lintFiles(patterns: string | string[]): Promise<ESLint.LintResult[]>;
817
818 lintText(code: string, options?: { filePath?: string | undefined; warnIgnored?: boolean | undefined }): Promise<ESLint.LintResult[]>;
819
820 calculateConfigForFile(filePath: string): Promise<any>;
821
822 isPathIgnored(filePath: string): Promise<boolean>;
823
824 loadFormatter(nameOrPath?: string): Promise<ESLint.Formatter>;
825}
826
827export namespace ESLint {
828 interface Options {
829 // File enumeration
830 cwd?: string | undefined;
831 errorOnUnmatchedPattern?: boolean | undefined;
832 extensions?: string[] | undefined;
833 globInputPaths?: boolean | undefined;
834 ignore?: boolean | undefined;
835 ignorePath?: string | undefined;
836
837 // Linting
838 allowInlineConfig?: boolean | undefined;
839 baseConfig?: Linter.Config | undefined;
840 overrideConfig?: Linter.Config | undefined;
841 overrideConfigFile?: string | undefined;
842 plugins?: Record<string, any> | undefined;
843 reportUnusedDisableDirectives?: Linter.RuleLevel | undefined;
844 resolvePluginsRelativeTo?: string | undefined;
845 rulePaths?: string[] | undefined;
846 useEslintrc?: boolean | undefined;
847
848 // Autofix
849 fix?: boolean | ((message: Linter.LintMessage) => boolean) | undefined;
850 fixTypes?: Array<Rule.RuleMetaData["type"]> | undefined;
851
852 // Cache-related
853 cache?: boolean | undefined;
854 cacheLocation?: string | undefined;
855 cacheStrategy?: "content" | "metadata" | undefined;
856 }
857
858 interface LintResult {
859 filePath: string;
860 messages: Linter.LintMessage[];
861 errorCount: number;
862 warningCount: number;
863 fixableErrorCount: number;
864 fixableWarningCount: number;
865 output?: string | undefined;
866 source?: string | undefined;
867 usedDeprecatedRules: DeprecatedRuleUse[];
868 }
869
870 interface LintResultData {
871 rulesMeta: {
872 [ruleId: string]: Rule.RuleMetaData;
873 };
874 }
875
876 interface DeprecatedRuleUse {
877 ruleId: string;
878 replacedBy: string[];
879 }
880
881 interface Formatter {
882 format(results: LintResult[], data?: LintResultData): string;
883 }
884
885 // Docs reference the type by this name
886 type EditInfo = Rule.Fix;
887}
888
889//#endregion
890
891//#region CLIEngine
892
893/** @deprecated Deprecated in favor of `ESLint` */
894export class CLIEngine {
895 static version: string;
896
897 constructor(options: CLIEngine.Options);
898
899 executeOnFiles(patterns: string[]): CLIEngine.LintReport;
900
901 resolveFileGlobPatterns(patterns: string[]): string[];
902
903 getConfigForFile(filePath: string): Linter.Config;
904
905 executeOnText(text: string, filename?: string): CLIEngine.LintReport;
906
907 addPlugin(name: string, pluginObject: any): void;
908
909 isPathIgnored(filePath: string): boolean;
910
911 getFormatter(format?: string): CLIEngine.Formatter;
912
913 getRules(): Map<string, Rule.RuleModule>;
914
915 static getErrorResults(results: CLIEngine.LintResult[]): CLIEngine.LintResult[];
916
917 static getFormatter(format?: string): CLIEngine.Formatter;
918
919 static outputFixes(report: CLIEngine.LintReport): void;
920}
921
922/** @deprecated Deprecated in favor of `ESLint` */
923export namespace CLIEngine {
924 class Options {
925 allowInlineConfig?: boolean | undefined;
926 baseConfig?: false | { [name: string]: any } | undefined;
927 cache?: boolean | undefined;
928 cacheFile?: string | undefined;
929 cacheLocation?: string | undefined;
930 cacheStrategy?: "content" | "metadata" | undefined;
931 configFile?: string | undefined;
932 cwd?: string | undefined;
933 envs?: string[] | undefined;
934 errorOnUnmatchedPattern?: boolean | undefined;
935 extensions?: string[] | undefined;
936 fix?: boolean | undefined;
937 globals?: string[] | undefined;
938 ignore?: boolean | undefined;
939 ignorePath?: string | undefined;
940 ignorePattern?: string | string[] | undefined;
941 useEslintrc?: boolean | undefined;
942 parser?: string | undefined;
943 parserOptions?: Linter.ParserOptions | undefined;
944 plugins?: string[] | undefined;
945 resolvePluginsRelativeTo?: string | undefined;
946 rules?: {
947 [name: string]: Linter.RuleLevel | Linter.RuleLevelAndOptions;
948 } | undefined;
949 rulePaths?: string[] | undefined;
950 reportUnusedDisableDirectives?: boolean | undefined;
951 }
952
953 type LintResult = ESLint.LintResult;
954
955 type LintResultData = ESLint.LintResultData;
956
957 interface LintReport {
958 results: LintResult[];
959 errorCount: number;
960 warningCount: number;
961 fixableErrorCount: number;
962 fixableWarningCount: number;
963 usedDeprecatedRules: DeprecatedRuleUse[];
964 }
965
966 type DeprecatedRuleUse = ESLint.DeprecatedRuleUse;
967
968 type Formatter = (results: LintResult[], data?: LintResultData) => string;
969}
970
971//#endregion
972
973//#region RuleTester
974
975export class RuleTester {
976 constructor(config?: any);
977
978 run(
979 name: string,
980 rule: Rule.RuleModule,
981 tests: {
982 valid?: Array<string | RuleTester.ValidTestCase> | undefined;
983 invalid?: RuleTester.InvalidTestCase[] | undefined;
984 },
985 ): void;
986}
987
988export namespace RuleTester {
989 interface ValidTestCase {
990 code: string;
991 options?: any;
992 filename?: string | undefined;
993 parserOptions?: Linter.ParserOptions | undefined;
994 settings?: { [name: string]: any } | undefined;
995 parser?: string | undefined;
996 globals?: { [name: string]: boolean } | undefined;
997 }
998
999 interface SuggestionOutput {
1000 messageId?: string | undefined;
1001 desc?: string | undefined;
1002 data?: Record<string, unknown> | undefined;
1003 output: string;
1004 }
1005
1006 interface InvalidTestCase extends ValidTestCase {
1007 errors: number | Array<TestCaseError | string>;
1008 output?: string | null | undefined;
1009 }
1010
1011 interface TestCaseError {
1012 message?: string | RegExp | undefined;
1013 messageId?: string | undefined;
1014 type?: string | undefined;
1015 data?: any;
1016 line?: number | undefined;
1017 column?: number | undefined;
1018 endLine?: number | undefined;
1019 endColumn?: number | undefined;
1020 suggestions?: SuggestionOutput[] | undefined;
1021 }
1022}
1023
1024//#endregion
1025
\No newline at end of file