import { Node } from 'estree';

export enum Syntax {
    AssignmentExpression     = 'AssignmentExpression',
    AssignmentPattern        = 'AssignmentPattern',
    ArrayExpression          = 'ArrayExpression',
    ArrayPattern             = 'ArrayPattern',
    ArrowFunctionExpression  = 'ArrowFunctionExpression',
    AwaitExpression          = 'AwaitExpression',
    BlockStatement           = 'BlockStatement',
    BinaryExpression         = 'BinaryExpression',
    BreakStatement           = 'BreakStatement',
    CallExpression           = 'CallExpression',
    CatchClause              = 'CatchClause',
    ClassBody                = 'ClassBody',
    ClassDeclaration         = 'ClassDeclaration',
    ClassExpression          = 'ClassExpression',
    ComprehensionBlock       = 'ComprehensionBlock',
    ComprehensionExpression  = 'ComprehensionExpression',
    ConditionalExpression    = 'ConditionalExpression',
    ContinueStatement        = 'ContinueStatement',
    DirectiveStatement       = 'DirectiveStatement',
    DoWhileStatement         = 'DoWhileStatement',
    DebuggerStatement        = 'DebuggerStatement',
    EmptyStatement           = 'EmptyStatement',
    ExportAllDeclaration     = 'ExportAllDeclaration',
    ExportBatchSpecifier     = 'ExportBatchSpecifier',
    ExportDeclaration        = 'ExportDeclaration',
    ExportNamedDeclaration   = 'ExportNamedDeclaration',
    ExportSpecifier          = 'ExportSpecifier',
    ExpressionStatement      = 'ExpressionStatement',
    ForStatement             = 'ForStatement',
    ForInStatement           = 'ForInStatement',
    ForOfStatement           = 'ForOfStatement',
    FunctionDeclaration      = 'FunctionDeclaration',
    FunctionExpression       = 'FunctionExpression',
    GeneratorExpression      = 'GeneratorExpression',
    Identifier               = 'Identifier',
    IfStatement              = 'IfStatement',
    ImportExpression         = 'ImportExpression',
    ImportSpecifier          = 'ImportSpecifier',
    ImportDeclaration        = 'ImportDeclaration',
    Literal                  = 'Literal',
    LabeledStatement         = 'LabeledStatement',
    LogicalExpression        = 'LogicalExpression',
    MemberExpression         = 'MemberExpression',
    MetaProperty             = 'MetaProperty',
    MethodDefinition         = 'MethodDefinition',
    ModuleDeclaration        = 'ModuleDeclaration',
    NewExpression            = 'NewExpression',
    ObjectExpression         = 'ObjectExpression',
    ObjectPattern            = 'ObjectPattern',
    Program                  = 'Program',
    Property                 = 'Property',
    RestElement              = 'RestElement',
    ReturnStatement          = 'ReturnStatement',
    SequenceExpression       = 'SequenceExpression',
    SpreadElement            = 'SpreadElement',
    Super                    = 'Super',
    SwitchStatement          = 'SwitchStatement',
    SwitchCase               = 'SwitchCase',
    TaggedTemplateExpression = 'TaggedTemplateExpression',
    TemplateElement          = 'TemplateElement',
    TemplateLiteral          = 'TemplateLiteral',
    ThisExpression           = 'ThisExpression',
    ThrowStatement           = 'ThrowStatement',
    TryStatement             = 'TryStatement',
    UnaryExpression          = 'UnaryExpression',
    UpdateExpression         = 'UpdateExpression',
    VariableDeclaration      = 'VariableDeclaration',
    VariableDeclarator       = 'VariableDeclarator',
    WhileStatement           = 'WhileStatement',
    WithStatement            = 'WithStatement',
    YieldExpression          = 'YieldExpression'
}

export interface EsotopeOptions {
    indent?: string,
    base?: number,
    parse?: Function
    format?: {
        indent?: {
            style?: string,
            base?: number
        },
        newline?: string,
        space?: string,
        json?: boolean,
        renumber?: boolean,
        hexadecimal?: boolean,
        quotes?: 'single' | 'double' | 'auto',
        escapeless?: boolean,
        compact?: boolean,
        parentheses?: boolean,
        semicolons?: boolean,
        safeConcatenation?: boolean
    },
    directive?: boolean,
    raw?: boolean,
    verbatim?: string
}

export function generate (ast: Node, options?: EsotopeOptions): string;