meriyah
Version:
A 100% compliant, self-hosted javascript parser with high focus on both performance and stability
533 lines (532 loc) • 19.6 kB
TypeScript
export interface _Node {
start?: number;
end?: number;
range?: [number, number];
loc?: SourceLocation | null;
}
export interface SourceLocation {
source?: string | null;
start: Position;
end: Position;
}
export interface Position {
line: number;
column: number;
}
export type Labels = any;
export type IdentifierOrExpression = Identifier | Expression | ArrowFunctionExpression;
export type ArgumentExpression = ArrayExpression | AssignmentExpression | ConditionalExpression | Literal | SpreadElement | BinaryExpression | LogicalExpression | SequenceExpression;
export type CommentType = 'SingleLine' | 'MultiLine' | 'HTMLOpen' | 'HTMLClose' | 'HashbangComment';
export interface Comment extends _Node {
type: CommentType;
value: string;
}
export type Node = AccessorProperty | ArrayExpression | ArrayPattern | ArrowFunctionExpression | AssignmentExpression | AssignmentPattern | AwaitExpression | BinaryExpression | BlockStatement | BreakStatement | CallExpression | ChainExpression | ImportExpression | CatchClause | ClassBody | ClassDeclaration | ClassExpression | ConditionalExpression | ContinueStatement | DebuggerStatement | Decorator | DoWhileStatement | EmptyStatement | ExportAllDeclaration | ExportDefaultDeclaration | ExportNamedDeclaration | ExportSpecifier | ExpressionStatement | PropertyDefinition | ForInStatement | ForOfStatement | ForStatement | FunctionDeclaration | FunctionExpression | Identifier | IfStatement | ImportDeclaration | ImportDefaultSpecifier | ImportAttribute | ImportNamespaceSpecifier | ImportSpecifier | JSXNamespacedName | JSXAttribute | JSXClosingElement | JSXClosingFragment | JSXElement | JSXEmptyExpression | JSXExpressionContainer | JSXFragment | JSXIdentifier | JSXOpeningElement | JSXOpeningFragment | JSXSpreadAttribute | JSXSpreadChild | JSXMemberExpression | JSXText | LabeledStatement | Literal | LogicalExpression | MemberExpression | MetaProperty | MethodDefinition | NewExpression | ObjectExpression | ObjectPattern | ParenthesizedExpression | PrivateIdentifier | Program | Property | RestElement | ReturnStatement | SequenceExpression | SpreadElement | StaticBlock | Super | SwitchCase | SwitchStatement | TaggedTemplateExpression | TemplateElement | TemplateLiteral | ThisExpression | ThrowStatement | TryStatement | UpdateExpression | UnaryExpression | VariableDeclaration | VariableDeclarator | WhileStatement | WithStatement | YieldExpression;
export type BindingPattern = ArrayPattern | ObjectPattern | Identifier;
export type ClassElement = FunctionExpression | MethodDefinition;
export type DeclarationStatement = ClassDeclaration | ClassExpression | ExportDefaultDeclaration | ExportAllDeclaration | ExportNamedDeclaration | FunctionDeclaration;
export type EntityName = Identifier;
export type ExportDeclaration = ClassDeclaration | ClassExpression | FunctionDeclaration | VariableDeclaration;
export type Expression = ArrowFunctionExpression | AssignmentExpression | BinaryExpression | ConditionalExpression | MetaProperty | ChainExpression | JSXClosingElement | JSXClosingFragment | JSXExpressionContainer | JSXOpeningElement | JSXOpeningFragment | JSXSpreadChild | LogicalExpression | NewExpression | RestElement | SequenceExpression | SpreadElement | AwaitExpression | LeftHandSideExpression | UnaryExpression | UpdateExpression | YieldExpression;
export type ForInitializer = Expression | VariableDeclaration;
export type ImportClause = ImportDefaultSpecifier | ImportNamespaceSpecifier | ImportSpecifier;
export type IterationStatement = DoWhileStatement | ForInStatement | ForOfStatement | ForStatement | WhileStatement;
export type JSXChild = JSXElement | JSXExpression | JSXFragment | JSXText;
export type JSXExpression = JSXEmptyExpression | JSXSpreadChild | JSXExpressionContainer;
export type JSXTagNameExpression = JSXIdentifier | JSXMemberExpression | JSXNamespacedName;
export type LeftHandSideExpression = CallExpression | ChainExpression | ImportExpression | ClassExpression | ClassDeclaration | FunctionExpression | LiteralExpression | MemberExpression | PrimaryExpression | TaggedTemplateExpression;
export type LiteralExpression = Literal | TemplateLiteral;
export type ObjectLiteralElementLike = MethodDefinition | Property | RestElement | SpreadElement;
export type Parameter = AssignmentPattern | RestElement | ArrayPattern | ObjectPattern | Identifier;
export type PrimaryExpression = ArrayExpression | ArrayPattern | ClassExpression | FunctionExpression | Identifier | JSXElement | JSXFragment | JSXOpeningElement | Literal | LiteralExpression | MetaProperty | ObjectExpression | ObjectPattern | Super | TemplateLiteral | ThisExpression;
export type PrimaryExpressionExtended = ArrayExpression | ArrowFunctionExpression | ArrayPattern | AwaitExpression | Expression | ClassExpression | FunctionExpression | Identifier | JSXElement | JSXFragment | JSXOpeningElement | Literal | LiteralExpression | MetaProperty | ObjectExpression | ObjectPattern | PrivateIdentifier | NewExpression | Super | TemplateLiteral | ThisExpression | UnaryExpression | UpdateExpression;
export type PropertyName = Identifier | Literal;
export type Statement = BlockStatement | BreakStatement | ContinueStatement | DebuggerStatement | DeclarationStatement | EmptyStatement | ExpressionStatement | IfStatement | IterationStatement | ImportDeclaration | LabeledStatement | ReturnStatement | SwitchStatement | ThrowStatement | TryStatement | VariableDeclaration | WithStatement;
interface ClassDeclarationBase extends _Node {
id: Identifier | null;
body: ClassBody;
superClass: Expression | null;
decorators?: Decorator[];
}
interface FunctionDeclarationBase extends _Node {
id: Identifier | null;
generator: boolean;
async: boolean;
params: Parameter[];
body?: BlockStatement | null;
}
export interface BlockStatementBase extends _Node {
body: Statement[];
}
export interface ArrayExpression extends _Node {
type: 'ArrayExpression';
elements: (Expression | SpreadElement | null)[];
}
export interface ArrayPattern extends _Node {
type: 'ArrayPattern';
elements: Expression[];
}
export interface ArrowFunctionExpression extends _Node {
type: 'ArrowFunctionExpression';
params: Parameter[];
body: Expression | BlockStatement;
async: boolean;
expression: boolean;
generator: false;
}
export interface AssignmentExpression extends _Node {
type: 'AssignmentExpression';
operator: string;
left: Expression;
right: Expression;
}
export interface AssignmentPattern extends _Node {
type: 'AssignmentPattern';
left: BindingPattern | Identifier;
right?: Expression;
}
export interface AwaitExpression extends _Node {
type: 'AwaitExpression';
argument: Expression;
}
export interface BinaryExpression extends _Node {
type: 'BinaryExpression';
operator: string;
left: Expression | PrivateIdentifier;
right: Expression;
}
export interface BlockStatement extends BlockStatementBase {
type: 'BlockStatement';
}
export interface BreakStatement extends _Node {
type: 'BreakStatement';
label: Identifier | null;
}
export interface ImportExpression extends _Node {
type: 'ImportExpression';
source: Expression;
options?: Expression | null;
}
export interface ChainExpression extends _Node {
type: 'ChainExpression';
expression: CallExpression | MemberExpression;
}
export interface CallExpression extends _Node {
type: 'CallExpression';
callee: any;
arguments: (Expression | SpreadElement)[];
optional: boolean;
}
export interface CatchClause extends _Node {
type: 'CatchClause';
param: BindingPattern | Identifier | null;
body: BlockStatement;
}
export interface StaticBlock extends BlockStatementBase {
type: 'StaticBlock';
}
export interface ClassBody extends _Node {
type: 'ClassBody';
body: (ClassElement | PropertyDefinition | AccessorProperty | StaticBlock)[];
}
export interface AccessorProperty extends _Node {
type: 'AccessorProperty';
key: PrivateIdentifier | Expression;
value: any;
decorators?: Decorator[];
computed: boolean;
static: boolean;
}
export interface PropertyDefinition extends _Node {
type: 'PropertyDefinition';
key: PrivateIdentifier | Expression;
value: any;
decorators?: Decorator[];
computed: boolean;
static: boolean;
}
export interface PrivateIdentifier extends _Node {
type: 'PrivateIdentifier';
name: string;
}
export interface ClassDeclaration extends ClassDeclarationBase {
type: 'ClassDeclaration';
}
export interface ClassExpression extends ClassDeclarationBase {
type: 'ClassExpression';
}
export interface ConditionalExpression extends _Node {
type: 'ConditionalExpression';
test: Expression;
consequent: Expression;
alternate: Expression;
}
export interface ContinueStatement extends _Node {
type: 'ContinueStatement';
label: Identifier | null;
}
export interface DebuggerStatement extends _Node {
type: 'DebuggerStatement';
}
export interface Decorator extends _Node {
type: 'Decorator';
expression: LeftHandSideExpression;
}
export interface DoWhileStatement extends _Node {
type: 'DoWhileStatement';
test: Expression;
body: Statement;
}
export interface EmptyStatement extends _Node {
type: 'EmptyStatement';
}
export interface ExportAllDeclaration extends _Node {
type: 'ExportAllDeclaration';
source: StringLiteral;
exported: Identifier | StringLiteral | null;
attributes: ImportAttribute[];
}
export interface ExportDefaultDeclaration extends _Node {
type: 'ExportDefaultDeclaration';
declaration: ExportDeclaration | Expression;
}
export interface ExportNamedDeclaration extends _Node {
type: 'ExportNamedDeclaration';
declaration: ExportDeclaration | null;
specifiers: ExportSpecifier[];
source: StringLiteral | null;
attributes: ImportAttribute[];
}
export interface ExportSpecifier extends _Node {
type: 'ExportSpecifier';
local: Identifier | StringLiteral;
exported: Identifier | StringLiteral;
}
export interface ExpressionStatement extends _Node {
type: 'ExpressionStatement';
expression: Expression;
directive?: string;
}
export interface ForInStatement extends _Node {
type: 'ForInStatement';
left: ForInitializer;
right: Expression;
body: Statement;
}
export interface ForOfStatement extends _Node {
type: 'ForOfStatement';
left: ForInitializer;
right: Expression;
body: Statement;
await: boolean;
}
export interface ForStatement extends _Node {
type: 'ForStatement';
init: Expression | ForInitializer | null;
test: Expression | null;
update: Expression | null;
body: Statement;
}
export interface FunctionDeclaration extends FunctionDeclarationBase {
type: 'FunctionDeclaration';
}
export interface FunctionExpression extends FunctionDeclarationBase {
type: 'FunctionExpression';
}
export interface Identifier extends _Node {
type: 'Identifier';
name: string;
}
export interface IfStatement extends _Node {
type: 'IfStatement';
test: Expression;
consequent: Statement;
alternate: Statement | null;
}
export interface ImportDeclaration extends _Node {
type: 'ImportDeclaration';
source: StringLiteral;
specifiers: ImportClause[];
attributes: ImportAttribute[];
}
export interface ImportAttribute extends _Node {
type: 'ImportAttribute';
key: Identifier | StringLiteral;
value: StringLiteral;
}
export interface ImportDefaultSpecifier extends _Node {
type: 'ImportDefaultSpecifier';
local: Identifier;
}
export interface ImportNamespaceSpecifier extends _Node {
type: 'ImportNamespaceSpecifier';
local: Identifier;
}
export interface ImportSpecifier extends _Node {
type: 'ImportSpecifier';
local: Identifier;
imported: Identifier | StringLiteral;
}
export interface JSXNamespacedName extends _Node {
type: 'JSXNamespacedName';
namespace: JSXIdentifier | JSXMemberExpression;
name: JSXIdentifier;
}
export type JSXAttributeValue = JSXIdentifier | Literal | JSXElement | JSXFragment | JSXExpressionContainer | JSXSpreadChild | null;
export interface JSXAttribute extends _Node {
type: 'JSXAttribute';
name: JSXNamespacedName | JSXIdentifier;
value: JSXAttributeValue;
}
export interface JSXClosingElement extends _Node {
type: 'JSXClosingElement';
name: JSXTagNameExpression;
}
export interface JSXClosingFragment extends _Node {
type: 'JSXClosingFragment';
}
export interface JSXElement extends _Node {
type: 'JSXElement';
openingElement: JSXOpeningElement;
closingElement: JSXClosingElement | null;
children: JSXChild[];
}
export interface JSXEmptyExpression extends _Node {
type: 'JSXEmptyExpression';
}
export interface JSXExpressionContainer extends _Node {
type: 'JSXExpressionContainer';
expression: Expression | JSXEmptyExpression;
}
export interface JSXFragment extends _Node {
type: 'JSXFragment';
openingFragment: JSXOpeningFragment;
closingFragment: JSXClosingFragment;
children: JSXChild[];
}
export interface JSXIdentifier extends _Node {
type: 'JSXIdentifier';
name: string;
}
export interface JSXMemberExpression extends _Node {
type: 'JSXMemberExpression';
object: JSXTagNameExpression;
property: JSXIdentifier;
}
export interface JSXOpeningElement extends _Node {
type: 'JSXOpeningElement';
selfClosing: boolean;
name: JSXTagNameExpression;
attributes: (JSXAttribute | JSXSpreadAttribute)[];
}
export interface JSXOpeningFragment extends _Node {
type: 'JSXOpeningFragment';
}
export interface JSXSpreadAttribute extends _Node {
type: 'JSXSpreadAttribute';
argument: Expression;
}
export interface JSXSpreadChild extends _Node {
type: 'JSXSpreadChild';
expression: Expression | JSXEmptyExpression;
}
export interface JSXText extends _Node {
type: 'JSXText';
value: string;
raw?: string;
}
export interface LabeledStatement extends _Node {
type: 'LabeledStatement';
label: Identifier;
body: Statement;
}
export type Literal = StringLiteral | NumericLiteral | BooleanLiteral | NullLiteral | BigIntLiteral | RegExpLiteral;
export interface _LiteralBase extends _Node {
type: 'Literal';
raw?: string;
}
export interface StringLiteral extends _LiteralBase {
value: string;
}
export interface NumericLiteral extends _LiteralBase {
value: number;
}
export interface BooleanLiteral extends _LiteralBase {
value: boolean;
}
export interface NullLiteral extends _LiteralBase {
value: null;
}
export interface BigIntLiteral extends _LiteralBase {
value: bigint;
bigint: string;
}
export interface RegExpLiteral extends _LiteralBase {
value: RegExp | null;
regex: {
pattern: string;
flags: string;
};
}
export interface LogicalExpression extends _Node {
type: 'LogicalExpression';
operator: string;
left: Expression;
right: Expression;
}
export interface MemberExpression extends _Node {
type: 'MemberExpression';
object: Expression | Super;
property: Expression | PrivateIdentifier;
computed: boolean;
optional: boolean;
}
export type Pattern = Identifier | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | MemberExpression;
export interface MetaProperty extends _Node {
type: 'MetaProperty';
meta: Identifier;
property: Identifier;
}
export interface MethodDefinition extends _Node {
type: 'MethodDefinition';
key: Expression | PrivateIdentifier | null;
value: FunctionExpression;
computed: boolean;
static: boolean;
kind: 'method' | 'get' | 'set' | 'constructor';
decorators?: Decorator[];
}
export interface NewExpression extends _Node {
type: 'NewExpression';
callee: LeftHandSideExpression;
arguments: Expression[];
}
export interface ObjectExpression extends _Node {
type: 'ObjectExpression';
properties: ObjectLiteralElementLike[];
}
export interface ObjectPattern extends _Node {
type: 'ObjectPattern';
properties: ObjectLiteralElementLike[];
}
export interface Program extends _Node {
type: 'Program';
body: Statement[];
sourceType: 'module' | 'script';
}
export interface ParenthesizedExpression extends _Node {
type: 'ParenthesizedExpression';
expression: Expression;
}
export interface Property extends _Node {
type: 'Property';
key: Expression;
value: Expression | AssignmentPattern | BindingPattern | Identifier;
computed: boolean;
method: boolean;
shorthand: boolean;
kind: 'init' | 'get' | 'set';
}
export interface RestElement extends _Node {
type: 'RestElement';
argument: BindingPattern | Identifier | Expression | PropertyName;
value?: AssignmentPattern;
}
export interface ReturnStatement extends _Node {
type: 'ReturnStatement';
argument: Expression | null;
}
export interface SequenceExpression extends _Node {
type: 'SequenceExpression';
expressions: Expression[];
}
export type SpreadArgument = BindingPattern | Identifier | Expression | PropertyName | SpreadElement;
export interface SpreadElement extends _Node {
type: 'SpreadElement';
argument: SpreadArgument;
}
export interface Super extends _Node {
type: 'Super';
}
export interface SwitchCase extends _Node {
type: 'SwitchCase';
test: Expression | null;
consequent: Statement[];
}
export interface SwitchStatement extends _Node {
type: 'SwitchStatement';
discriminant: Expression;
cases: SwitchCase[];
}
export interface TaggedTemplateExpression extends _Node {
type: 'TaggedTemplateExpression';
tag: Expression;
quasi: TemplateLiteral;
}
export interface TemplateElement extends _Node {
type: 'TemplateElement';
value: {
raw: string;
cooked: string | null;
};
tail: boolean;
}
export interface TemplateLiteral extends _Node {
type: 'TemplateLiteral';
quasis: TemplateElement[];
expressions: Expression[];
}
export interface ThisExpression extends _Node {
type: 'ThisExpression';
}
export interface ThrowStatement extends _Node {
type: 'ThrowStatement';
argument: Expression;
}
export interface TryStatement extends _Node {
type: 'TryStatement';
block: BlockStatement;
handler: CatchClause | null;
finalizer: BlockStatement | null;
}
export type UnaryOperator = '-' | '+' | '!' | '~' | 'typeof' | 'void' | 'delete';
export type UpdateOperator = '++' | '--';
export interface UpdateExpression extends _Node {
type: 'UpdateExpression';
operator: UpdateOperator;
argument: Expression;
prefix: boolean;
}
export interface UnaryExpression extends _Node {
type: 'UnaryExpression';
operator: UnaryOperator;
prefix: true;
argument: Expression;
}
export interface VariableDeclaration extends _Node {
type: 'VariableDeclaration';
declarations: VariableDeclarator[];
kind: 'let' | 'const' | 'var';
}
export interface VariableDeclarator extends _Node {
type: 'VariableDeclarator';
id: Expression | BindingPattern | Identifier;
init: Expression | null;
definite?: boolean;
}
export interface WhileStatement extends _Node {
type: 'WhileStatement';
test: Expression;
body: Statement;
}
export interface WithStatement extends _Node {
type: 'WithStatement';
object: Expression;
body: Statement;
}
export interface YieldExpression extends _Node {
type: 'YieldExpression';
delegate: boolean;
argument?: Expression | null;
}
export {};