UNPKG

39.1 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 interface ReportDescriptorOptionsBase {
601 data?: { [key: string]: string } | undefined;
602
603 fix?: null | ((fixer: RuleFixer) => null | Fix | IterableIterator<Fix> | Fix[]) | undefined;
604 }
605
606 type SuggestionDescriptorMessage = { desc: string } | { messageId: string };
607 type SuggestionReportDescriptor = SuggestionDescriptorMessage & ReportDescriptorOptionsBase;
608
609 interface ReportDescriptorOptions extends ReportDescriptorOptionsBase {
610 suggest?: SuggestionReportDescriptor[] | null | undefined;
611 }
612
613 type ReportDescriptor = ReportDescriptorMessage & ReportDescriptorLocation & ReportDescriptorOptions;
614 type ReportDescriptorMessage = { message: string } | { messageId: string };
615 type ReportDescriptorLocation =
616 | { node: ESTree.Node }
617 | { loc: AST.SourceLocation | { line: number; column: number } };
618
619 interface RuleFixer {
620 insertTextAfter(nodeOrToken: ESTree.Node | AST.Token, text: string): Fix;
621
622 insertTextAfterRange(range: AST.Range, text: string): Fix;
623
624 insertTextBefore(nodeOrToken: ESTree.Node | AST.Token, text: string): Fix;
625
626 insertTextBeforeRange(range: AST.Range, text: string): Fix;
627
628 remove(nodeOrToken: ESTree.Node | AST.Token): Fix;
629
630 removeRange(range: AST.Range): Fix;
631
632 replaceText(nodeOrToken: ESTree.Node | AST.Token, text: string): Fix;
633
634 replaceTextRange(range: AST.Range, text: string): Fix;
635 }
636
637 interface Fix {
638 range: AST.Range;
639 text: string;
640 }
641}
642
643//#region Linter
644
645export class Linter {
646 static version: string;
647
648 version: string;
649
650 constructor(options?: { cwd?: string | undefined });
651
652 verify(code: SourceCode | string, config: Linter.Config, filename?: string): Linter.LintMessage[];
653 verify(code: SourceCode | string, config: Linter.Config, options: Linter.LintOptions): Linter.LintMessage[];
654
655 verifyAndFix(code: string, config: Linter.Config, filename?: string): Linter.FixReport;
656 verifyAndFix(code: string, config: Linter.Config, options: Linter.FixOptions): Linter.FixReport;
657
658 getSourceCode(): SourceCode;
659
660 defineRule(name: string, rule: Rule.RuleModule): void;
661
662 defineRules(rules: { [name: string]: Rule.RuleModule }): void;
663
664 getRules(): Map<string, Rule.RuleModule>;
665
666 defineParser(name: string, parser: Linter.ParserModule): void;
667}
668
669export namespace Linter {
670 type Severity = 0 | 1 | 2;
671
672 type RuleLevel = Severity | "off" | "warn" | "error";
673 type RuleLevelAndOptions<Options extends any[] = any[]> = Prepend<Partial<Options>, RuleLevel>;
674
675 type RuleEntry<Options extends any[] = any[]> = RuleLevel | RuleLevelAndOptions<Options>;
676
677 interface RulesRecord {
678 [rule: string]: RuleEntry;
679 }
680
681 interface HasRules<Rules extends RulesRecord = RulesRecord> {
682 rules?: Partial<Rules> | undefined;
683 }
684
685 interface BaseConfig<Rules extends RulesRecord = RulesRecord> extends HasRules<Rules> {
686 $schema?: string | undefined;
687 env?: { [name: string]: boolean } | undefined;
688 extends?: string | string[] | undefined;
689 globals?: { [name: string]: boolean | "readonly" | "readable" | "writable" | "writeable" } | undefined;
690 noInlineConfig?: boolean | undefined;
691 overrides?: ConfigOverride[] | undefined;
692 parser?: string | undefined;
693 parserOptions?: ParserOptions | undefined;
694 plugins?: string[] | undefined;
695 processor?: string | undefined;
696 reportUnusedDisableDirectives?: boolean | undefined;
697 settings?: { [name: string]: any } | undefined;
698 }
699
700 interface ConfigOverride<Rules extends RulesRecord = RulesRecord> extends BaseConfig<Rules> {
701 excludedFiles?: string | string[] | undefined;
702 files: string | string[];
703 }
704
705 // https://github.com/eslint/eslint/blob/v6.8.0/conf/config-schema.js
706 interface Config<Rules extends RulesRecord = RulesRecord> extends BaseConfig<Rules> {
707 ignorePatterns?: string | string[] | undefined;
708 root?: boolean | undefined;
709 }
710
711 interface ParserOptions {
712 ecmaVersion?: 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | undefined;
713 sourceType?: "script" | "module" | undefined;
714 ecmaFeatures?: {
715 globalReturn?: boolean | undefined;
716 impliedStrict?: boolean | undefined;
717 jsx?: boolean | undefined;
718 experimentalObjectRestSpread?: boolean | undefined;
719 [key: string]: any;
720 } | undefined;
721 [key: string]: any;
722 }
723
724 interface LintOptions {
725 filename?: string | undefined;
726 preprocess?: ((code: string) => string[]) | undefined;
727 postprocess?: ((problemLists: LintMessage[][]) => LintMessage[]) | undefined;
728 filterCodeBlock?: boolean | undefined;
729 disableFixes?: boolean | undefined;
730 allowInlineConfig?: boolean | undefined;
731 reportUnusedDisableDirectives?: boolean | undefined;
732 }
733
734 interface LintSuggestion {
735 desc: string;
736 fix: Rule.Fix;
737 messageId?: string | undefined;
738 }
739
740 interface LintMessage {
741 column: number;
742 line: number;
743 endColumn?: number | undefined;
744 endLine?: number | undefined;
745 ruleId: string | null;
746 message: string;
747 messageId?: string | undefined;
748 nodeType?: string | undefined;
749 fatal?: true | undefined;
750 severity: Severity;
751 fix?: Rule.Fix | undefined;
752 /** @deprecated Use `linter.getSourceCode()` */
753 source?: string | null | undefined;
754 suggestions?: LintSuggestion[] | undefined;
755 }
756
757 interface FixOptions extends LintOptions {
758 fix?: boolean | undefined;
759 }
760
761 interface FixReport {
762 fixed: boolean;
763 output: string;
764 messages: LintMessage[];
765 }
766
767 type ParserModule =
768 | {
769 parse(text: string, options?: any): AST.Program;
770 }
771 | {
772 parseForESLint(text: string, options?: any): ESLintParseResult;
773 };
774
775 interface ESLintParseResult {
776 ast: AST.Program;
777 parserServices?: SourceCode.ParserServices | undefined;
778 scopeManager?: Scope.ScopeManager | undefined;
779 visitorKeys?: SourceCode.VisitorKeys | undefined;
780 }
781
782 interface ProcessorFile {
783 text: string;
784 filename: string;
785 }
786
787 // https://eslint.org/docs/developer-guide/working-with-plugins#processors-in-plugins
788 interface Processor<T extends string | ProcessorFile = string | ProcessorFile> {
789 supportsAutofix?: boolean | undefined;
790 preprocess?(text: string, filename: string): T[];
791 postprocess?(messages: LintMessage[][], filename: string): LintMessage[];
792 }
793}
794
795//#endregion
796
797//#region ESLint
798
799export class ESLint {
800 static version: string;
801
802 static outputFixes(results: ESLint.LintResult[]): Promise<void>;
803
804 static getErrorResults(results: ESLint.LintResult[]): ESLint.LintResult[];
805
806 constructor(options?: ESLint.Options);
807
808 lintFiles(patterns: string | string[]): Promise<ESLint.LintResult[]>;
809
810 lintText(code: string, options?: { filePath?: string | undefined; warnIgnored?: boolean | undefined }): Promise<ESLint.LintResult[]>;
811
812 calculateConfigForFile(filePath: string): Promise<any>;
813
814 isPathIgnored(filePath: string): Promise<boolean>;
815
816 loadFormatter(nameOrPath?: string): Promise<ESLint.Formatter>;
817}
818
819export namespace ESLint {
820 interface Options {
821 // File enumeration
822 cwd?: string | undefined;
823 errorOnUnmatchedPattern?: boolean | undefined;
824 extensions?: string[] | undefined;
825 globInputPaths?: boolean | undefined;
826 ignore?: boolean | undefined;
827 ignorePath?: string | undefined;
828
829 // Linting
830 allowInlineConfig?: boolean | undefined;
831 baseConfig?: Linter.Config | undefined;
832 overrideConfig?: Linter.Config | undefined;
833 overrideConfigFile?: string | undefined;
834 plugins?: Record<string, any> | undefined;
835 reportUnusedDisableDirectives?: Linter.RuleLevel | undefined;
836 resolvePluginsRelativeTo?: string | undefined;
837 rulePaths?: string[] | undefined;
838 useEslintrc?: boolean | undefined;
839
840 // Autofix
841 fix?: boolean | ((message: Linter.LintMessage) => boolean) | undefined;
842 fixTypes?: Array<Rule.RuleMetaData["type"]> | undefined;
843
844 // Cache-related
845 cache?: boolean | undefined;
846 cacheLocation?: string | undefined;
847 cacheStrategy?: "content" | "metadata" | undefined;
848 }
849
850 interface LintResult {
851 filePath: string;
852 messages: Linter.LintMessage[];
853 errorCount: number;
854 warningCount: number;
855 fixableErrorCount: number;
856 fixableWarningCount: number;
857 output?: string | undefined;
858 source?: string | undefined;
859 usedDeprecatedRules: DeprecatedRuleUse[];
860 }
861
862 interface LintResultData {
863 rulesMeta: {
864 [ruleId: string]: Rule.RuleMetaData;
865 };
866 }
867
868 interface DeprecatedRuleUse {
869 ruleId: string;
870 replacedBy: string[];
871 }
872
873 interface Formatter {
874 format(results: LintResult[], data?: LintResultData): string;
875 }
876
877 // Docs reference the type by this name
878 type EditInfo = Rule.Fix;
879}
880
881//#endregion
882
883//#region CLIEngine
884
885/** @deprecated Deprecated in favor of `ESLint` */
886export class CLIEngine {
887 static version: string;
888
889 constructor(options: CLIEngine.Options);
890
891 executeOnFiles(patterns: string[]): CLIEngine.LintReport;
892
893 resolveFileGlobPatterns(patterns: string[]): string[];
894
895 getConfigForFile(filePath: string): Linter.Config;
896
897 executeOnText(text: string, filename?: string): CLIEngine.LintReport;
898
899 addPlugin(name: string, pluginObject: any): void;
900
901 isPathIgnored(filePath: string): boolean;
902
903 getFormatter(format?: string): CLIEngine.Formatter;
904
905 getRules(): Map<string, Rule.RuleModule>;
906
907 static getErrorResults(results: CLIEngine.LintResult[]): CLIEngine.LintResult[];
908
909 static getFormatter(format?: string): CLIEngine.Formatter;
910
911 static outputFixes(report: CLIEngine.LintReport): void;
912}
913
914/** @deprecated Deprecated in favor of `ESLint` */
915export namespace CLIEngine {
916 class Options {
917 allowInlineConfig?: boolean | undefined;
918 baseConfig?: false | { [name: string]: any } | undefined;
919 cache?: boolean | undefined;
920 cacheFile?: string | undefined;
921 cacheLocation?: string | undefined;
922 cacheStrategy?: "content" | "metadata" | undefined;
923 configFile?: string | undefined;
924 cwd?: string | undefined;
925 envs?: string[] | undefined;
926 errorOnUnmatchedPattern?: boolean | undefined;
927 extensions?: string[] | undefined;
928 fix?: boolean | undefined;
929 globals?: string[] | undefined;
930 ignore?: boolean | undefined;
931 ignorePath?: string | undefined;
932 ignorePattern?: string | string[] | undefined;
933 useEslintrc?: boolean | undefined;
934 parser?: string | undefined;
935 parserOptions?: Linter.ParserOptions | undefined;
936 plugins?: string[] | undefined;
937 resolvePluginsRelativeTo?: string | undefined;
938 rules?: {
939 [name: string]: Linter.RuleLevel | Linter.RuleLevelAndOptions;
940 } | undefined;
941 rulePaths?: string[] | undefined;
942 reportUnusedDisableDirectives?: boolean | undefined;
943 }
944
945 type LintResult = ESLint.LintResult;
946
947 type LintResultData = ESLint.LintResultData;
948
949 interface LintReport {
950 results: LintResult[];
951 errorCount: number;
952 warningCount: number;
953 fixableErrorCount: number;
954 fixableWarningCount: number;
955 usedDeprecatedRules: DeprecatedRuleUse[];
956 }
957
958 type DeprecatedRuleUse = ESLint.DeprecatedRuleUse;
959
960 type Formatter = (results: LintResult[], data?: LintResultData) => string;
961}
962
963//#endregion
964
965//#region RuleTester
966
967export class RuleTester {
968 constructor(config?: any);
969
970 run(
971 name: string,
972 rule: Rule.RuleModule,
973 tests: {
974 valid?: Array<string | RuleTester.ValidTestCase> | undefined;
975 invalid?: RuleTester.InvalidTestCase[] | undefined;
976 },
977 ): void;
978}
979
980export namespace RuleTester {
981 interface ValidTestCase {
982 code: string;
983 options?: any;
984 filename?: string | undefined;
985 parserOptions?: Linter.ParserOptions | undefined;
986 settings?: { [name: string]: any } | undefined;
987 parser?: string | undefined;
988 globals?: { [name: string]: boolean } | undefined;
989 }
990
991 interface SuggestionOutput {
992 messageId?: string | undefined;
993 desc?: string | undefined;
994 data?: Record<string, unknown> | undefined;
995 output: string;
996 }
997
998 interface InvalidTestCase extends ValidTestCase {
999 errors: number | Array<TestCaseError | string>;
1000 output?: string | null | undefined;
1001 }
1002
1003 interface TestCaseError {
1004 message?: string | RegExp | undefined;
1005 messageId?: string | undefined;
1006 type?: string | undefined;
1007 data?: any;
1008 line?: number | undefined;
1009 column?: number | undefined;
1010 endLine?: number | undefined;
1011 endColumn?: number | undefined;
1012 suggestions?: SuggestionOutput[] | undefined;
1013 }
1014}
1015
1016//#endregion
1017
\No newline at end of file