// Generated by scripts/generate-dts.js.

/**
 * Copyright 2019 Shape Security, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License")
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

type Init<Node> = Pick<Node, Exclude<keyof Node, 'type'>>;

export type Node = ArrayAssignmentTarget | ArrayBinding | ArrayExpression | ArrowExpression | AssignmentExpression | AssignmentTargetIdentifier | AssignmentTargetPropertyIdentifier | AssignmentTargetPropertyProperty | AssignmentTargetWithDefault | AwaitExpression | BinaryExpression | BindingIdentifier | BindingPropertyIdentifier | BindingPropertyProperty | BindingWithDefault | Block | BlockStatement | BreakStatement | CallExpression | CatchClause | ClassDeclaration | ClassElement | ClassExpression | CompoundAssignmentExpression | ComputedMemberAssignmentTarget | ComputedMemberExpression | ComputedPropertyName | ConditionalExpression | ContinueStatement | DataProperty | DebuggerStatement | Directive | DoWhileStatement | EmptyStatement | Export | ExportAllFrom | ExportDefault | ExportFrom | ExportFromSpecifier | ExportLocalSpecifier | ExportLocals | ExpressionStatement | ForAwaitStatement | ForInStatement | ForOfStatement | ForStatement | FormalParameters | FunctionBody | FunctionDeclaration | FunctionExpression | Getter | IdentifierExpression | IfStatement | Import | ImportNamespace | ImportSpecifier | LabeledStatement | LiteralBooleanExpression | LiteralInfinityExpression | LiteralNullExpression | LiteralNumericExpression | LiteralRegExpExpression | LiteralStringExpression | Method | Module | NewExpression | NewTargetExpression | ObjectAssignmentTarget | ObjectBinding | ObjectExpression | ReturnStatement | Script | Setter | ShorthandProperty | SpreadElement | SpreadProperty | StaticMemberAssignmentTarget | StaticMemberExpression | StaticPropertyName | Super | SwitchCase | SwitchDefault | SwitchStatement | SwitchStatementWithDefault | TemplateElement | TemplateExpression | ThisExpression | ThrowStatement | TryCatchStatement | TryFinallyStatement | UnaryExpression | UpdateExpression | VariableDeclaration | VariableDeclarationStatement | VariableDeclarator | WhileStatement | WithStatement | YieldExpression | YieldGeneratorExpression;

export type Expression = ArrayExpression | ArrowExpression | AssignmentExpression | AwaitExpression | BinaryExpression | CallExpression | ClassExpression | CompoundAssignmentExpression | ConditionalExpression | FunctionExpression | IdentifierExpression | LiteralBooleanExpression | LiteralInfinityExpression | LiteralNullExpression | LiteralNumericExpression | LiteralRegExpExpression | LiteralStringExpression | ComputedMemberExpression | StaticMemberExpression | NewExpression | NewTargetExpression | ObjectExpression | TemplateExpression | ThisExpression | UnaryExpression | UpdateExpression | YieldExpression | YieldGeneratorExpression;

export type Statement = BlockStatement | BreakStatement | ClassDeclaration | ContinueStatement | DebuggerStatement | EmptyStatement | ExpressionStatement | FunctionDeclaration | IfStatement | DoWhileStatement | ForAwaitStatement | ForInStatement | ForOfStatement | ForStatement | WhileStatement | LabeledStatement | ReturnStatement | SwitchStatement | SwitchStatementWithDefault | ThrowStatement | TryCatchStatement | TryFinallyStatement | VariableDeclarationStatement | WithStatement;


export class ArrayAssignmentTarget {
  type: 'ArrayAssignmentTarget';
  elements: Array<AssignmentTargetWithDefault | ArrayAssignmentTarget | ObjectAssignmentTarget | AssignmentTargetIdentifier | ComputedMemberAssignmentTarget | StaticMemberAssignmentTarget | null>;
  rest: ArrayAssignmentTarget | ObjectAssignmentTarget | AssignmentTargetIdentifier | ComputedMemberAssignmentTarget | StaticMemberAssignmentTarget | null;
  constructor(init: Init<ArrayAssignmentTarget>);
}

export class ArrayBinding {
  type: 'ArrayBinding';
  elements: Array<BindingWithDefault | BindingIdentifier | ArrayBinding | ObjectBinding | null>;
  rest: BindingIdentifier | ArrayBinding | ObjectBinding | null;
  constructor(init: Init<ArrayBinding>);
}

export class ArrayExpression {
  type: 'ArrayExpression';
  elements: Array<Expression | SpreadElement | null>;
  constructor(init: Init<ArrayExpression>);
}

export class ArrowExpression {
  type: 'ArrowExpression';
  isAsync: boolean;
  params: FormalParameters;
  body: Expression | FunctionBody;
  constructor(init: Init<ArrowExpression>);
}

export class AssignmentExpression {
  type: 'AssignmentExpression';
  binding: ArrayAssignmentTarget | ObjectAssignmentTarget | AssignmentTargetIdentifier | ComputedMemberAssignmentTarget | StaticMemberAssignmentTarget;
  expression: Expression;
  constructor(init: Init<AssignmentExpression>);
}

export class AssignmentTargetIdentifier {
  type: 'AssignmentTargetIdentifier';
  name: string;
  constructor(init: Init<AssignmentTargetIdentifier>);
}

export class AssignmentTargetPropertyIdentifier {
  type: 'AssignmentTargetPropertyIdentifier';
  binding: AssignmentTargetIdentifier;
  init: Expression | null;
  constructor(init: Init<AssignmentTargetPropertyIdentifier>);
}

export class AssignmentTargetPropertyProperty {
  type: 'AssignmentTargetPropertyProperty';
  name: ComputedPropertyName | StaticPropertyName;
  binding: AssignmentTargetWithDefault | ArrayAssignmentTarget | ObjectAssignmentTarget | AssignmentTargetIdentifier | ComputedMemberAssignmentTarget | StaticMemberAssignmentTarget;
  constructor(init: Init<AssignmentTargetPropertyProperty>);
}

export class AssignmentTargetWithDefault {
  type: 'AssignmentTargetWithDefault';
  binding: ArrayAssignmentTarget | ObjectAssignmentTarget | AssignmentTargetIdentifier | ComputedMemberAssignmentTarget | StaticMemberAssignmentTarget;
  init: Expression;
  constructor(init: Init<AssignmentTargetWithDefault>);
}

export class AwaitExpression {
  type: 'AwaitExpression';
  expression: Expression;
  constructor(init: Init<AwaitExpression>);
}

export class BinaryExpression {
  type: 'BinaryExpression';
  left: Expression;
  operator: '==' | '!=' | '===' | '!==' | '<' | '<=' | '>' | '>=' | 'in' | 'instanceof' | '<<' | '>>' | '>>>' | '+' | '-' | '*' | '/' | '%' | '**' | ',' | '||' | '&&' | '|' | '^' | '&';
  right: Expression;
  constructor(init: Init<BinaryExpression>);
}

export class BindingIdentifier {
  type: 'BindingIdentifier';
  name: string;
  constructor(init: Init<BindingIdentifier>);
}

export class BindingPropertyIdentifier {
  type: 'BindingPropertyIdentifier';
  binding: BindingIdentifier;
  init: Expression | null;
  constructor(init: Init<BindingPropertyIdentifier>);
}

export class BindingPropertyProperty {
  type: 'BindingPropertyProperty';
  name: ComputedPropertyName | StaticPropertyName;
  binding: BindingWithDefault | BindingIdentifier | ArrayBinding | ObjectBinding;
  constructor(init: Init<BindingPropertyProperty>);
}

export class BindingWithDefault {
  type: 'BindingWithDefault';
  binding: BindingIdentifier | ArrayBinding | ObjectBinding;
  init: Expression;
  constructor(init: Init<BindingWithDefault>);
}

export class Block {
  type: 'Block';
  statements: Array<Statement>;
  constructor(init: Init<Block>);
}

export class BlockStatement {
  type: 'BlockStatement';
  block: Block;
  constructor(init: Init<BlockStatement>);
}

export class BreakStatement {
  type: 'BreakStatement';
  label: string | null;
  constructor(init: Init<BreakStatement>);
}

export class CallExpression {
  type: 'CallExpression';
  callee: Expression | Super;
  arguments: Array<Expression | SpreadElement>;
  constructor(init: Init<CallExpression>);
}

export class CatchClause {
  type: 'CatchClause';
  binding: BindingIdentifier | ArrayBinding | ObjectBinding | null;
  body: Block;
  constructor(init: Init<CatchClause>);
}

export class ClassDeclaration {
  type: 'ClassDeclaration';
  name: BindingIdentifier;
  super: Expression | null;
  elements: Array<ClassElement>;
  constructor(init: Init<ClassDeclaration>);
}

export class ClassElement {
  type: 'ClassElement';
  isStatic: boolean;
  method: Getter | Method | Setter;
  constructor(init: Init<ClassElement>);
}

export class ClassExpression {
  type: 'ClassExpression';
  name: BindingIdentifier | null;
  super: Expression | null;
  elements: Array<ClassElement>;
  constructor(init: Init<ClassExpression>);
}

export class CompoundAssignmentExpression {
  type: 'CompoundAssignmentExpression';
  binding: AssignmentTargetIdentifier | ComputedMemberAssignmentTarget | StaticMemberAssignmentTarget;
  operator: '+=' | '-=' | '*=' | '/=' | '%=' | '**=' | '<<=' | '>>=' | '>>>=' | '|=' | '^=' | '&=';
  expression: Expression;
  constructor(init: Init<CompoundAssignmentExpression>);
}

export class ComputedMemberAssignmentTarget {
  type: 'ComputedMemberAssignmentTarget';
  object: Expression | Super;
  expression: Expression;
  constructor(init: Init<ComputedMemberAssignmentTarget>);
}

export class ComputedMemberExpression {
  type: 'ComputedMemberExpression';
  object: Expression | Super;
  expression: Expression;
  constructor(init: Init<ComputedMemberExpression>);
}

export class ComputedPropertyName {
  type: 'ComputedPropertyName';
  expression: Expression;
  constructor(init: Init<ComputedPropertyName>);
}

export class ConditionalExpression {
  type: 'ConditionalExpression';
  test: Expression;
  consequent: Expression;
  alternate: Expression;
  constructor(init: Init<ConditionalExpression>);
}

export class ContinueStatement {
  type: 'ContinueStatement';
  label: string | null;
  constructor(init: Init<ContinueStatement>);
}

export class DataProperty {
  type: 'DataProperty';
  name: ComputedPropertyName | StaticPropertyName;
  expression: Expression;
  constructor(init: Init<DataProperty>);
}

export class DebuggerStatement {
  type: 'DebuggerStatement';
  constructor(init?: Init<DebuggerStatement>);
}

export class Directive {
  type: 'Directive';
  rawValue: string;
  constructor(init: Init<Directive>);
}

export class DoWhileStatement {
  type: 'DoWhileStatement';
  body: Statement;
  test: Expression;
  constructor(init: Init<DoWhileStatement>);
}

export class EmptyStatement {
  type: 'EmptyStatement';
  constructor(init?: Init<EmptyStatement>);
}

export class Export {
  type: 'Export';
  declaration: ClassDeclaration | FunctionDeclaration | VariableDeclaration;
  constructor(init: Init<Export>);
}

export class ExportAllFrom {
  type: 'ExportAllFrom';
  moduleSpecifier: string;
  constructor(init: Init<ExportAllFrom>);
}

export class ExportDefault {
  type: 'ExportDefault';
  body: ClassDeclaration | Expression | FunctionDeclaration;
  constructor(init: Init<ExportDefault>);
}

export class ExportFrom {
  type: 'ExportFrom';
  namedExports: Array<ExportFromSpecifier>;
  moduleSpecifier: string;
  constructor(init: Init<ExportFrom>);
}

export class ExportFromSpecifier {
  type: 'ExportFromSpecifier';
  name: string;
  exportedName: string | null;
  constructor(init: Init<ExportFromSpecifier>);
}

export class ExportLocalSpecifier {
  type: 'ExportLocalSpecifier';
  name: IdentifierExpression;
  exportedName: string | null;
  constructor(init: Init<ExportLocalSpecifier>);
}

export class ExportLocals {
  type: 'ExportLocals';
  namedExports: Array<ExportLocalSpecifier>;
  constructor(init: Init<ExportLocals>);
}

export class ExpressionStatement {
  type: 'ExpressionStatement';
  expression: Expression;
  constructor(init: Init<ExpressionStatement>);
}

export class ForAwaitStatement {
  type: 'ForAwaitStatement';
  left: ArrayAssignmentTarget | ObjectAssignmentTarget | AssignmentTargetIdentifier | ComputedMemberAssignmentTarget | StaticMemberAssignmentTarget | VariableDeclaration;
  right: Expression;
  body: Statement;
  constructor(init: Init<ForAwaitStatement>);
}

export class ForInStatement {
  type: 'ForInStatement';
  left: ArrayAssignmentTarget | ObjectAssignmentTarget | AssignmentTargetIdentifier | ComputedMemberAssignmentTarget | StaticMemberAssignmentTarget | VariableDeclaration;
  right: Expression;
  body: Statement;
  constructor(init: Init<ForInStatement>);
}

export class ForOfStatement {
  type: 'ForOfStatement';
  left: ArrayAssignmentTarget | ObjectAssignmentTarget | AssignmentTargetIdentifier | ComputedMemberAssignmentTarget | StaticMemberAssignmentTarget | VariableDeclaration;
  right: Expression;
  body: Statement;
  constructor(init: Init<ForOfStatement>);
}

export class ForStatement {
  type: 'ForStatement';
  init: Expression | VariableDeclaration | null;
  test: Expression | null;
  update: Expression | null;
  body: Statement;
  constructor(init: Init<ForStatement>);
}

export class FormalParameters {
  type: 'FormalParameters';
  items: Array<BindingWithDefault | BindingIdentifier | ArrayBinding | ObjectBinding>;
  rest: BindingIdentifier | ArrayBinding | ObjectBinding | null;
  constructor(init: Init<FormalParameters>);
}

export class FunctionBody {
  type: 'FunctionBody';
  directives: Array<Directive>;
  statements: Array<Statement>;
  constructor(init: Init<FunctionBody>);
}

export class FunctionDeclaration {
  type: 'FunctionDeclaration';
  isAsync: boolean;
  isGenerator: boolean;
  name: BindingIdentifier;
  params: FormalParameters;
  body: FunctionBody;
  constructor(init: Init<FunctionDeclaration>);
}

export class FunctionExpression {
  type: 'FunctionExpression';
  isAsync: boolean;
  isGenerator: boolean;
  name: BindingIdentifier | null;
  params: FormalParameters;
  body: FunctionBody;
  constructor(init: Init<FunctionExpression>);
}

export class Getter {
  type: 'Getter';
  name: ComputedPropertyName | StaticPropertyName;
  body: FunctionBody;
  constructor(init: Init<Getter>);
}

export class IdentifierExpression {
  type: 'IdentifierExpression';
  name: string;
  constructor(init: Init<IdentifierExpression>);
}

export class IfStatement {
  type: 'IfStatement';
  test: Expression;
  consequent: Statement;
  alternate: Statement | null;
  constructor(init: Init<IfStatement>);
}

export class Import {
  type: 'Import';
  defaultBinding: BindingIdentifier | null;
  namedImports: Array<ImportSpecifier>;
  moduleSpecifier: string;
  constructor(init: Init<Import>);
}

export class ImportNamespace {
  type: 'ImportNamespace';
  defaultBinding: BindingIdentifier | null;
  namespaceBinding: BindingIdentifier;
  moduleSpecifier: string;
  constructor(init: Init<ImportNamespace>);
}

export class ImportSpecifier {
  type: 'ImportSpecifier';
  name: string | null;
  binding: BindingIdentifier;
  constructor(init: Init<ImportSpecifier>);
}

export class LabeledStatement {
  type: 'LabeledStatement';
  label: string;
  body: Statement;
  constructor(init: Init<LabeledStatement>);
}

export class LiteralBooleanExpression {
  type: 'LiteralBooleanExpression';
  value: boolean;
  constructor(init: Init<LiteralBooleanExpression>);
}

export class LiteralInfinityExpression {
  type: 'LiteralInfinityExpression';
  constructor(init?: Init<LiteralInfinityExpression>);
}

export class LiteralNullExpression {
  type: 'LiteralNullExpression';
  constructor(init?: Init<LiteralNullExpression>);
}

export class LiteralNumericExpression {
  type: 'LiteralNumericExpression';
  value: number;
  constructor(init: Init<LiteralNumericExpression>);
}

export class LiteralRegExpExpression {
  type: 'LiteralRegExpExpression';
  pattern: string;
  global: boolean;
  ignoreCase: boolean;
  multiLine: boolean;
  dotAll: boolean;
  unicode: boolean;
  sticky: boolean;
  constructor(init: Init<LiteralRegExpExpression>);
}

export class LiteralStringExpression {
  type: 'LiteralStringExpression';
  value: string;
  constructor(init: Init<LiteralStringExpression>);
}

export class Method {
  type: 'Method';
  isAsync: boolean;
  isGenerator: boolean;
  name: ComputedPropertyName | StaticPropertyName;
  params: FormalParameters;
  body: FunctionBody;
  constructor(init: Init<Method>);
}

export class Module {
  type: 'Module';
  directives: Array<Directive>;
  items: Array<Export | ExportAllFrom | ExportDefault | ExportFrom | ExportLocals | Import | ImportNamespace | Statement>;
  constructor(init: Init<Module>);
}

export class NewExpression {
  type: 'NewExpression';
  callee: Expression;
  arguments: Array<Expression | SpreadElement>;
  constructor(init: Init<NewExpression>);
}

export class NewTargetExpression {
  type: 'NewTargetExpression';
  constructor(init?: Init<NewTargetExpression>);
}

export class ObjectAssignmentTarget {
  type: 'ObjectAssignmentTarget';
  properties: Array<AssignmentTargetPropertyIdentifier | AssignmentTargetPropertyProperty>;
  rest: AssignmentTargetIdentifier | ComputedMemberAssignmentTarget | StaticMemberAssignmentTarget | null;
  constructor(init: Init<ObjectAssignmentTarget>);
}

export class ObjectBinding {
  type: 'ObjectBinding';
  properties: Array<BindingPropertyIdentifier | BindingPropertyProperty>;
  rest: BindingIdentifier | null;
  constructor(init: Init<ObjectBinding>);
}

export class ObjectExpression {
  type: 'ObjectExpression';
  properties: Array<DataProperty | Getter | Method | Setter | ShorthandProperty | SpreadProperty>;
  constructor(init: Init<ObjectExpression>);
}

export class ReturnStatement {
  type: 'ReturnStatement';
  expression: Expression | null;
  constructor(init: Init<ReturnStatement>);
}

export class Script {
  type: 'Script';
  directives: Array<Directive>;
  statements: Array<Statement>;
  constructor(init: Init<Script>);
}

export class Setter {
  type: 'Setter';
  name: ComputedPropertyName | StaticPropertyName;
  param: BindingWithDefault | BindingIdentifier | ArrayBinding | ObjectBinding;
  body: FunctionBody;
  constructor(init: Init<Setter>);
}

export class ShorthandProperty {
  type: 'ShorthandProperty';
  name: IdentifierExpression;
  constructor(init: Init<ShorthandProperty>);
}

export class SpreadElement {
  type: 'SpreadElement';
  expression: Expression;
  constructor(init: Init<SpreadElement>);
}

export class SpreadProperty {
  type: 'SpreadProperty';
  expression: Expression;
  constructor(init: Init<SpreadProperty>);
}

export class StaticMemberAssignmentTarget {
  type: 'StaticMemberAssignmentTarget';
  object: Expression | Super;
  property: string;
  constructor(init: Init<StaticMemberAssignmentTarget>);
}

export class StaticMemberExpression {
  type: 'StaticMemberExpression';
  object: Expression | Super;
  property: string;
  constructor(init: Init<StaticMemberExpression>);
}

export class StaticPropertyName {
  type: 'StaticPropertyName';
  value: string;
  constructor(init: Init<StaticPropertyName>);
}

export class Super {
  type: 'Super';
  constructor(init?: Init<Super>);
}

export class SwitchCase {
  type: 'SwitchCase';
  test: Expression;
  consequent: Array<Statement>;
  constructor(init: Init<SwitchCase>);
}

export class SwitchDefault {
  type: 'SwitchDefault';
  consequent: Array<Statement>;
  constructor(init: Init<SwitchDefault>);
}

export class SwitchStatement {
  type: 'SwitchStatement';
  discriminant: Expression;
  cases: Array<SwitchCase>;
  constructor(init: Init<SwitchStatement>);
}

export class SwitchStatementWithDefault {
  type: 'SwitchStatementWithDefault';
  discriminant: Expression;
  preDefaultCases: Array<SwitchCase>;
  defaultCase: SwitchDefault;
  postDefaultCases: Array<SwitchCase>;
  constructor(init: Init<SwitchStatementWithDefault>);
}

export class TemplateElement {
  type: 'TemplateElement';
  rawValue: string;
  constructor(init: Init<TemplateElement>);
}

export class TemplateExpression {
  type: 'TemplateExpression';
  tag: Expression | null;
  elements: Array<Expression | TemplateElement>;
  constructor(init: Init<TemplateExpression>);
}

export class ThisExpression {
  type: 'ThisExpression';
  constructor(init?: Init<ThisExpression>);
}

export class ThrowStatement {
  type: 'ThrowStatement';
  expression: Expression;
  constructor(init: Init<ThrowStatement>);
}

export class TryCatchStatement {
  type: 'TryCatchStatement';
  body: Block;
  catchClause: CatchClause;
  constructor(init: Init<TryCatchStatement>);
}

export class TryFinallyStatement {
  type: 'TryFinallyStatement';
  body: Block;
  catchClause: CatchClause | null;
  finalizer: Block;
  constructor(init: Init<TryFinallyStatement>);
}

export class UnaryExpression {
  type: 'UnaryExpression';
  operator: '+' | '-' | '!' | '~' | 'typeof' | 'void' | 'delete';
  operand: Expression;
  constructor(init: Init<UnaryExpression>);
}

export class UpdateExpression {
  type: 'UpdateExpression';
  isPrefix: boolean;
  operator: '++' | '--';
  operand: AssignmentTargetIdentifier | ComputedMemberAssignmentTarget | StaticMemberAssignmentTarget;
  constructor(init: Init<UpdateExpression>);
}

export class VariableDeclaration {
  type: 'VariableDeclaration';
  kind: 'var' | 'let' | 'const';
  declarators: Array<VariableDeclarator>;
  constructor(init: Init<VariableDeclaration>);
}

export class VariableDeclarationStatement {
  type: 'VariableDeclarationStatement';
  declaration: VariableDeclaration;
  constructor(init: Init<VariableDeclarationStatement>);
}

export class VariableDeclarator {
  type: 'VariableDeclarator';
  binding: BindingIdentifier | ArrayBinding | ObjectBinding;
  init: Expression | null;
  constructor(init: Init<VariableDeclarator>);
}

export class WhileStatement {
  type: 'WhileStatement';
  test: Expression;
  body: Statement;
  constructor(init: Init<WhileStatement>);
}

export class WithStatement {
  type: 'WithStatement';
  object: Expression;
  body: Statement;
  constructor(init: Init<WithStatement>);
}

export class YieldExpression {
  type: 'YieldExpression';
  expression: Expression | null;
  constructor(init: Init<YieldExpression>);
}

export class YieldGeneratorExpression {
  type: 'YieldGeneratorExpression';
  expression: Expression;
  constructor(init: Init<YieldGeneratorExpression>);
}
