import type { Token, Comment } from "../types"; export interface Locations { loc: SourceLocation; range: [number, number]; } interface BaseJSONNode extends Locations { type: string; } export interface SourceLocation { start: Position; end: Position; } export interface Position { line: number; column: number; } export type JSONNode = JSONProgram | JSONExpressionStatement | JSONExpression | JSONProperty | JSONIdentifier | JSONTemplateLiteral | JSONTemplateElement; export interface JSONProgram extends BaseJSONNode { type: "Program"; body: [JSONExpressionStatement]; comments: Comment[]; tokens: Token[]; parent: null; } export interface JSONExpressionStatement extends BaseJSONNode { type: "JSONExpressionStatement"; expression: JSONExpression; parent: JSONProgram; } export type JSONExpression = JSONArrayExpression | JSONObjectExpression | JSONLiteral | JSONUnaryExpression | JSONNumberIdentifier | JSONUndefinedIdentifier | JSONTemplateLiteral | JSONBinaryExpression; export interface JSONArrayExpression extends BaseJSONNode { type: "JSONArrayExpression"; elements: (JSONExpression | null)[]; parent: JSONArrayExpression | JSONProperty | JSONExpressionStatement; } export interface JSONObjectExpression extends BaseJSONNode { type: "JSONObjectExpression"; properties: JSONProperty[]; parent: JSONArrayExpression | JSONProperty | JSONExpressionStatement; } export interface JSONProperty extends BaseJSONNode { type: "JSONProperty"; key: JSONIdentifier | JSONStringLiteral | JSONNumberLiteral; value: JSONExpression; kind: "init"; method: false; shorthand: false; computed: false; parent: JSONObjectExpression; } export interface JSONIdentifier extends BaseJSONNode { type: "JSONIdentifier"; name: string; parent?: JSONArrayExpression | JSONProperty | JSONExpressionStatement | JSONUnaryExpression; } export interface JSONNumberIdentifier extends JSONIdentifier { name: "Infinity" | "NaN"; } export interface JSONUndefinedIdentifier extends JSONIdentifier { name: "undefined"; } interface JSONLiteralBase extends BaseJSONNode { type: "JSONLiteral"; raw: string; parent?: JSONArrayExpression | JSONProperty | JSONExpressionStatement | JSONUnaryExpression | JSONBinaryExpression; } export interface JSONStringLiteral extends JSONLiteralBase { value: string; regex: null; bigint: null; } export interface JSONNumberLiteral extends JSONLiteralBase { value: number; regex: null; bigint: null; } export interface JSONKeywordLiteral extends JSONLiteralBase { value: boolean | null; regex: null; bigint: null; } export interface JSONRegExpLiteral extends JSONLiteralBase { value: null; regex: { pattern: string; flags: string; }; bigint: null; } export interface JSONBigIntLiteral extends JSONLiteralBase { value: null; regex: null; bigint: string; } export type JSONLiteral = JSONStringLiteral | JSONNumberLiteral | JSONKeywordLiteral | JSONRegExpLiteral | JSONBigIntLiteral; export interface JSONUnaryExpression extends BaseJSONNode { type: "JSONUnaryExpression"; operator: "-" | "+"; prefix: true; argument: JSONNumberLiteral | JSONNumberIdentifier; parent: JSONArrayExpression | JSONProperty | JSONExpressionStatement; } export interface JSONTemplateLiteral extends BaseJSONNode { type: "JSONTemplateLiteral"; quasis: [JSONTemplateElement]; expressions: []; parent: JSONArrayExpression | JSONProperty | JSONExpressionStatement; } export interface JSONTemplateElement extends BaseJSONNode { type: "JSONTemplateElement"; tail: boolean; value: { cooked: string; raw: string; }; parent: JSONTemplateLiteral; } export interface JSONBinaryExpression extends BaseJSONNode { type: "JSONBinaryExpression"; operator: "-" | "+" | "*" | "/" | "%" | "**"; left: JSONNumberLiteral | JSONUnaryExpression | JSONBinaryExpression; right: JSONNumberLiteral | JSONUnaryExpression | JSONBinaryExpression; parent: JSONArrayExpression | JSONProperty | JSONExpressionStatement | JSONUnaryExpression | JSONBinaryExpression; } export {};