UNPKG

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