// Babel 7 doesn't have typings yet. These are minimal and temporary declare module '@babel/core'; declare module '@babel/plugin-syntax-import-meta'; declare module '@babel/plugin-syntax-dynamic-import'; declare module '@babel/helper-plugin-utils'; declare module '@babel/template'; declare module '@babel/traverse' { import * as t from 'babel-types'; export type Node = t.Node; export class Scope { constructor(path: NodePath, parentScope?: Scope); path: NodePath; block: Node; parentBlock: Node; parent: Scope; // hub: Hub; bindings: {[name: string]: Binding;}; /** Generate a unique identifier and add it to the current scope. */ generateDeclaredUidIdentifier(name?: string): t.Identifier; /** Generate a unique identifier. */ generateUidIdentifier(name?: string): t.Identifier; /** Generate a unique `_id1` binding. */ generateUid(name?: string): string; /** Walks the scope tree and gathers **all** bindings. */ getAllBindings(...kinds: string[]): object; } export class Binding { constructor(opts: { existing: Binding; identifier: t.Identifier; scope: Scope; path: NodePath; kind: 'var' | 'let' | 'const'; }); identifier: t.Identifier; scope: Scope; path: NodePath; kind: 'var'|'let'|'const'|'module'; referenced: boolean; references: number; referencePaths: NodePath[]; constant: boolean; constantViolations: NodePath[]; } export class NodePath { node: T; scope: Scope; traverse(visitor: Visitor, state?: any): void; // ------------------------- replacement ------------------------- /** * Replace a node with an array of multiple. This method performs the * following steps: * * - Inherit the comments of first provided node with that of the current * node. * - Insert the provided nodes after the current node. * - Remove the current node. */ replaceWithMultiple(nodes: Node[]): void; /** * Parse a string as an expression and replace the current node with the * result. * * NOTE: This is typically not a good idea to use. Building source strings * when transforming ASTs is an antipattern and SHOULD NOT be encouraged. * Even if it's easier to use, your transforms will be extremely brittle. */ replaceWithSourceString(replacement: any): void; /** Replace the current node with another. */ replaceWith(replacement: Node|NodePath): void; /** * This method takes an array of statements nodes and then explodes it * into expressions. This method retains completion records which is * extremely important to retain original semantics. */ replaceExpressionWithStatements(nodes: Node[]): Node; replaceInline(nodes: Node|Node[]): void; } // The Visitor has to be generic because babel binds `this` for each property. // `this` is usually used in babel plugins to pass plugin state from // `pre` -> `visitor` -> `post`. An example of this can be seen in the // official babel handbook: // https://github.com/thejameskyle/babel-handbook/blob/master/translations/en/plugin-handbook.md#-pre-and-post-in-plugins export interface Visitor extends VisitNodeObject { ArrayExpression?: VisitNode; AssignmentExpression?: VisitNode; LVal?: VisitNode; Expression?: VisitNode; BinaryExpression?: VisitNode; Directive?: VisitNode; DirectiveLiteral?: VisitNode; BlockStatement?: VisitNode; BreakStatement?: VisitNode; Identifier?: VisitNode; CallExpression?: VisitNode; CatchClause?: VisitNode; ConditionalExpression?: VisitNode; ContinueStatement?: VisitNode; DebuggerStatement?: VisitNode; DoWhileStatement?: VisitNode; Statement?: VisitNode; EmptyStatement?: VisitNode; ExpressionStatement?: VisitNode; File?: VisitNode; Program?: VisitNode; ForInStatement?: VisitNode; VariableDeclaration?: VisitNode; ForStatement?: VisitNode; FunctionDeclaration?: VisitNode; FunctionExpression?: VisitNode; IfStatement?: VisitNode; LabeledStatement?: VisitNode; StringLiteral?: VisitNode; NumericLiteral?: VisitNode; NullLiteral?: VisitNode; BooleanLiteral?: VisitNode; RegExpLiteral?: VisitNode; LogicalExpression?: VisitNode; MemberExpression?: VisitNode; NewExpression?: VisitNode; ObjectExpression?: VisitNode; ObjectMethod?: VisitNode; ObjectProperty?: VisitNode; RestElement?: VisitNode; ReturnStatement?: VisitNode; SequenceExpression?: VisitNode; SwitchCase?: VisitNode; SwitchStatement?: VisitNode; ThisExpression?: VisitNode; ThrowStatement?: VisitNode; TryStatement?: VisitNode; UnaryExpression?: VisitNode; UpdateExpression?: VisitNode; VariableDeclarator?: VisitNode; WhileStatement?: VisitNode; WithStatement?: VisitNode; AssignmentPattern?: VisitNode; ArrayPattern?: VisitNode; ArrowFunctionExpression?: VisitNode; ClassBody?: VisitNode; ClassDeclaration?: VisitNode; ClassExpression?: VisitNode; ExportAllDeclaration?: VisitNode; ExportDefaultDeclaration?: VisitNode; ExportNamedDeclaration?: VisitNode; Declaration?: VisitNode; ExportSpecifier?: VisitNode; ForOfStatement?: VisitNode; ImportDeclaration?: VisitNode; ImportDefaultSpecifier?: VisitNode; ImportNamespaceSpecifier?: VisitNode; ImportSpecifier?: VisitNode; MetaProperty?: VisitNode; ClassMethod?: VisitNode; ObjectPattern?: VisitNode; SpreadElement?: VisitNode; Super?: VisitNode; TaggedTemplateExpression?: VisitNode; TemplateLiteral?: VisitNode; TemplateElement?: VisitNode; YieldExpression?: VisitNode; AnyTypeAnnotation?: VisitNode; ArrayTypeAnnotation?: VisitNode; BooleanTypeAnnotation?: VisitNode; BooleanLiteralTypeAnnotation?: VisitNode; NullLiteralTypeAnnotation?: VisitNode; ClassImplements?: VisitNode; ClassProperty?: VisitNode; DeclareClass?: VisitNode; DeclareFunction?: VisitNode; DeclareInterface?: VisitNode; DeclareModule?: VisitNode; DeclareTypeAlias?: VisitNode; DeclareVariable?: VisitNode; ExistentialTypeParam?: VisitNode; FunctionTypeAnnotation?: VisitNode; FunctionTypeParam?: VisitNode; GenericTypeAnnotation?: VisitNode; InterfaceExtends?: VisitNode; InterfaceDeclaration?: VisitNode; IntersectionTypeAnnotation?: VisitNode; MixedTypeAnnotation?: VisitNode; NullableTypeAnnotation?: VisitNode; NumericLiteralTypeAnnotation?: VisitNode; NumberTypeAnnotation?: VisitNode; StringLiteralTypeAnnotation?: VisitNode; StringTypeAnnotation?: VisitNode; ThisTypeAnnotation?: VisitNode; TupleTypeAnnotation?: VisitNode; TypeofTypeAnnotation?: VisitNode; TypeAlias?: VisitNode; TypeAnnotation?: VisitNode; TypeCastExpression?: VisitNode; TypeParameterDeclaration?: VisitNode; TypeParameterInstantiation?: VisitNode; ObjectTypeAnnotation?: VisitNode; ObjectTypeCallProperty?: VisitNode; ObjectTypeIndexer?: VisitNode; ObjectTypeProperty?: VisitNode; QualifiedTypeIdentifier?: VisitNode; UnionTypeAnnotation?: VisitNode; VoidTypeAnnotation?: VisitNode; JSXAttribute?: VisitNode; JSXIdentifier?: VisitNode; JSXNamespacedName?: VisitNode; JSXElement?: VisitNode; JSXExpressionContainer?: VisitNode; JSXClosingElement?: VisitNode; JSXMemberExpression?: VisitNode; JSXOpeningElement?: VisitNode; JSXEmptyExpression?: VisitNode; JSXSpreadAttribute?: VisitNode; JSXText?: VisitNode; Noop?: VisitNode; ParenthesizedExpression?: VisitNode; AwaitExpression?: VisitNode; BindExpression?: VisitNode; Decorator?: VisitNode; DoExpression?: VisitNode; ExportDefaultSpecifier?: VisitNode; ExportNamespaceSpecifier?: VisitNode; RestProperty?: VisitNode; SpreadProperty?: VisitNode; Binary?: VisitNode; Scopable?: VisitNode; BlockParent?: VisitNode; Block?: VisitNode; Terminatorless?: VisitNode; CompletionStatement?: VisitNode; Conditional?: VisitNode; Loop?: VisitNode; While?: VisitNode; ExpressionWrapper?: VisitNode; For?: VisitNode; ForXStatement?: VisitNode; Function?: VisitNode; FunctionParent?: VisitNode; Pureish?: VisitNode; Literal?: VisitNode; Immutable?: VisitNode; UserWhitespacable?: VisitNode; Method?: VisitNode; ObjectMember?: VisitNode; Property?: VisitNode; UnaryLike?: VisitNode; Pattern?: VisitNode; Class?: VisitNode; ModuleDeclaration?: VisitNode; ExportDeclaration?: VisitNode; ModuleSpecifier?: VisitNode; Flow?: VisitNode; FlowBaseAnnotation?: VisitNode; FlowDeclaration?: VisitNode; JSX?: VisitNode; Scope?: VisitNode; } export type VisitNode = VisitNodeFunction|VisitNodeObject; export type VisitNodeFunction = (this: T, path: NodePath

, state: any) => void; export interface VisitNodeObject { enter?(path: NodePath, state: any): void; exit?(path: NodePath, state: any): void; } }