import type { BinaryExpressionOperator, UnaryOperator } from "../lexer/types.js"; interface BaseNode { start: number; end: number; } export interface NumberLiteral extends BaseNode { type: "NumberLiteral"; value: number; } export interface StringLiteral extends BaseNode { type: "StringLiteral"; value: string; } export interface BooleanLiteral extends BaseNode { type: "BooleanLiteral"; value: boolean; } export interface NullLiteral extends BaseNode { type: "NullLiteral"; value: null; } export interface UndefinedLiteral extends BaseNode { type: "UndefinedLiteral"; value: undefined; } export interface Identifier extends BaseNode { type: "Identifier"; name: string; } export interface BinaryExpression extends BaseNode { type: "BinaryExpression"; operator: BinaryExpressionOperator; left: ASTNode; right: ASTNode; } export interface UnaryExpression extends BaseNode { type: "UnaryExpression"; operator: UnaryOperator; operand: ASTNode; } export interface ConditionalExpression extends BaseNode { type: "ConditionalExpression"; test: ASTNode; consequent: ASTNode; alternate: ASTNode; } export interface MemberExpression extends BaseNode { type: "MemberExpression"; object: ASTNode; property: ASTNode; computed: boolean; } export interface OptionalMemberExpression extends BaseNode { type: "OptionalMemberExpression"; object: ASTNode; property: ASTNode; computed: boolean; } export interface ArrayLiteral extends BaseNode { type: "ArrayLiteral"; readonly elements: readonly (ASTNode | SpreadElement)[]; } export interface ObjectLiteral extends BaseNode { type: "ObjectLiteral"; readonly properties: readonly ObjectProperty[]; } export interface ObjectProperty extends BaseNode { type: "ObjectProperty"; key: ASTNode; value: ASTNode; computed: boolean; } export interface CallExpression extends BaseNode { type: "CallExpression"; callee: ASTNode; readonly args: readonly ASTNode[]; } export interface PipeExpression extends BaseNode { type: "PipeExpression"; input: ASTNode; transform: ASTNode; } export interface TemplateLiteral extends BaseNode { type: "TemplateLiteral"; readonly parts: readonly (StringLiteral | ASTNode)[]; } export interface SpreadElement extends BaseNode { type: "SpreadElement"; argument: ASTNode; } export interface ArrowFunctionExpression extends BaseNode { type: "ArrowFunctionExpression"; params: string[]; body: ASTNode; } export interface DateLiteralNode extends BaseNode { type: "DateLiteralNode"; value: string; } export type ASTNode = NumberLiteral | StringLiteral | BooleanLiteral | NullLiteral | UndefinedLiteral | Identifier | BinaryExpression | UnaryExpression | ConditionalExpression | MemberExpression | OptionalMemberExpression | ArrayLiteral | ObjectLiteral | CallExpression | PipeExpression | TemplateLiteral | SpreadElement | ArrowFunctionExpression | DateLiteralNode; export {};