import { VisitorKeys as VisitorKeys$1 } from "eslint-visitor-keys";
import { AST, SourceCode } from "eslint";
import { Comment } from "estree";
import { AST as AST$1 } from "jsonc-eslint-parser";
declare namespace ast_d_exports {
  export { JSONArrayExpression, JSONBigIntLiteral, JSONBinaryExpression, JSONExpression, JSONExpressionStatement, JSONIdentifier, JSONKeywordLiteral, JSONLiteral, JSONNode, JSONNumberIdentifier, JSONNumberLiteral, JSONObjectExpression, JSONProgram, JSONProperty, JSONRegExpLiteral, JSONStringLiteral, JSONTemplateElement, JSONTemplateLiteral, JSONUnaryExpression, JSONUndefinedIdentifier, Locations, Position, SourceLocation };
}
interface Locations {
  loc: SourceLocation;
  range: [number, number];
}
interface BaseJSONNode extends Locations {
  type: string;
}
interface SourceLocation {
  start: Position;
  end: Position;
}
interface Position {
  /** >= 1 */
  line: number;
  /** >= 0 */
  column: number;
}
type JSONNode = JSONProgram | JSONExpressionStatement | JSONExpression | JSONProperty | JSONIdentifier | JSONTemplateLiteral | JSONTemplateElement;
interface JSONProgram extends BaseJSONNode {
  type: "Program";
  body: [JSONExpressionStatement];
  comments: Comment[];
  tokens: AST.Token[];
  parent: null;
}
interface JSONExpressionStatement extends BaseJSONNode {
  type: "JSONExpressionStatement";
  expression: JSONExpression;
  parent: JSONProgram;
}
type JSONExpression = JSONArrayExpression | JSONObjectExpression | JSONLiteral | JSONUnaryExpression | JSONNumberIdentifier | JSONUndefinedIdentifier | JSONTemplateLiteral | JSONBinaryExpression;
interface JSONArrayExpression extends BaseJSONNode {
  type: "JSONArrayExpression";
  elements: (JSONExpression | null)[];
  parent: JSONArrayExpression | JSONProperty | JSONExpressionStatement;
}
interface JSONObjectExpression extends BaseJSONNode {
  type: "JSONObjectExpression";
  properties: JSONProperty[];
  parent: JSONArrayExpression | JSONProperty | JSONExpressionStatement;
}
interface JSONProperty extends BaseJSONNode {
  type: "JSONProperty";
  key: JSONIdentifier | JSONStringLiteral | JSONNumberLiteral;
  value: JSONExpression;
  kind: "init";
  method: false;
  shorthand: false;
  computed: false;
  parent: JSONObjectExpression;
}
interface JSONIdentifier extends BaseJSONNode {
  type: "JSONIdentifier";
  name: string;
  parent?: JSONArrayExpression | JSONProperty | JSONExpressionStatement | JSONUnaryExpression;
}
interface JSONNumberIdentifier extends JSONIdentifier {
  name: "Infinity" | "NaN";
}
interface JSONUndefinedIdentifier extends JSONIdentifier {
  name: "undefined";
}
interface JSONLiteralBase extends BaseJSONNode {
  type: "JSONLiteral";
  raw: string;
  parent?: JSONArrayExpression | JSONProperty | JSONExpressionStatement | JSONUnaryExpression | JSONBinaryExpression;
}
interface JSONStringLiteral extends JSONLiteralBase {
  value: string;
  regex: null;
  bigint: null;
}
interface JSONNumberLiteral extends JSONLiteralBase {
  value: number;
  regex: null;
  bigint: null;
}
interface JSONKeywordLiteral extends JSONLiteralBase {
  value: boolean | null;
  regex: null;
  bigint: null;
}
interface JSONRegExpLiteral extends JSONLiteralBase {
  value: null;
  regex: {
    pattern: string;
    flags: string;
  };
  bigint: null;
}
interface JSONBigIntLiteral extends JSONLiteralBase {
  value: null;
  regex: null;
  bigint: string;
}
type JSONLiteral = JSONStringLiteral | JSONNumberLiteral | JSONKeywordLiteral | JSONRegExpLiteral | JSONBigIntLiteral;
interface JSONUnaryExpression extends BaseJSONNode {
  type: "JSONUnaryExpression";
  operator: "-" | "+";
  prefix: true;
  argument: JSONNumberLiteral | JSONNumberIdentifier;
  parent: JSONArrayExpression | JSONProperty | JSONExpressionStatement;
}
interface JSONTemplateLiteral extends BaseJSONNode {
  type: "JSONTemplateLiteral";
  quasis: [JSONTemplateElement];
  expressions: [];
  parent: JSONArrayExpression | JSONProperty | JSONExpressionStatement;
}
interface JSONTemplateElement extends BaseJSONNode {
  type: "JSONTemplateElement";
  tail: boolean;
  value: {
    cooked: string;
    raw: string;
  };
  parent: JSONTemplateLiteral;
}
interface JSONBinaryExpression extends BaseJSONNode {
  type: "JSONBinaryExpression";
  operator: "-" | "+" | "*" | "/" | "%" | "**";
  left: JSONNumberLiteral | JSONUnaryExpression | JSONBinaryExpression;
  right: JSONNumberLiteral | JSONUnaryExpression | JSONBinaryExpression;
  parent: JSONArrayExpression | JSONProperty | JSONExpressionStatement | JSONUnaryExpression | JSONBinaryExpression;
}
//#endregion
//#region src/parser/parser-options.d.ts
type ParserOptions = {
  jsonSyntax?: "JSON" | "json" | "JSONC" | "jsonc" | "JSON5" | "json5" | null;
};
//#endregion
//#region src/parser/parser.d.ts
/**
 * Parse JSON source code
 */
declare function parseJSON(code: string, options?: ParserOptions): JSONProgram;
/**
 * Parse source code
 */
declare function parseForESLint(code: string, options?: ParserOptions): {
  ast: JSONProgram;
  visitorKeys: SourceCode.VisitorKeys;
  services: {
    isJSON: boolean;
  };
};
//#endregion
//#region src/parser/tokenizer.d.ts
/**
 * Tokenizes the given code.
 * @param code The code to tokenize.
 * @param options The options to use for tokenization.
 * @private
 */
declare function tokenize(code: string, options?: ParserOptions & {
  includeComments?: false | null | undefined;
}): AST.Token[];
/**
 * Tokenizes the given code.
 * @param code The code to tokenize.
 * @param options The options to use for tokenization.
 * @private
 */
declare function tokenize(code: string, options: ParserOptions & {
  includeComments: true;
}): (AST.Token | Comment)[];
//#endregion
//#region src/parser/traverse.d.ts
interface Visitor<N> {
  visitorKeys?: VisitorKeys$1;
  enterNode(node: N, parent: N | null): void;
  leaveNode(node: N, parent: N | null): void;
}
declare function traverseNodes(node: JSONNode, visitor: Visitor<JSONNode>): void;
//#endregion
//#region src/utils/ast.d.ts
/**
 * Checks if given node is JSONExpression
 */
declare function isExpression<N extends JSONNode>(node: N): node is N & JSONExpression;
/**
 * Checks if given node is JSONNumberIdentifier
 */
declare function isNumberIdentifier(node: JSONIdentifier): node is JSONNumberIdentifier;
/**
 * Checks if given node is JSONUndefinedIdentifier
 */
declare function isUndefinedIdentifier(node: JSONIdentifier): node is JSONUndefinedIdentifier;
type JSONValue = string | number | boolean | null | undefined | JSONObjectValue | JSONValue[] | RegExp | bigint;
type JSONObjectValue = {
  [key: string]: JSONValue;
};
declare function getStaticJSONValue(node: JSONUnaryExpression | JSONNumberIdentifier | JSONNumberLiteral | JSONBinaryExpression): number;
declare function getStaticJSONValue(node: JSONUndefinedIdentifier): undefined;
declare function getStaticJSONValue(node: JSONTemplateLiteral | JSONTemplateElement | JSONStringLiteral): string;
declare function getStaticJSONValue(node: JSONKeywordLiteral): boolean | null;
declare function getStaticJSONValue(node: JSONRegExpLiteral): RegExp;
declare function getStaticJSONValue(node: JSONBigIntLiteral): bigint;
declare function getStaticJSONValue(node: JSONLiteral): string | number | boolean | RegExp | bigint | null;
declare function getStaticJSONValue(node: Exclude<JSONExpression, JSONObjectExpression | JSONArrayExpression>): Exclude<JSONValue, JSONObjectValue | JSONValue[]>;
declare function getStaticJSONValue(node: JSONObjectExpression): JSONObjectValue;
declare function getStaticJSONValue(node: JSONArrayExpression): JSONValue[];
declare function getStaticJSONValue(node: JSONExpression | JSONExpressionStatement | JSONProgram | JSONNode): JSONValue;
declare namespace meta_d_exports {
  export { name, version };
}
declare const name: string;
declare const version: string;
//#endregion
//#region src/types.d.ts
type JSONSyntax = "JSON" | "JSONC" | "JSON5" | null;
interface JSONParserOptions {
  jsonSyntax?: JSONSyntax;
}
type RuleFunction<Node extends AST$1.JSONNode = any> = (node: Node) => void;
type BuiltInRuleListeners = { [Node in AST$1.JSONNode as Node["type"]]?: RuleFunction<Node>; };
type BuiltInRuleListenerExits = { [Node in AST$1.JSONNode as `${Node["type"]}:exit`]?: RuleFunction<Node>; };
interface RuleListener extends BuiltInRuleListeners, BuiltInRuleListenerExits {
  [key: string]: RuleFunction | undefined;
}
//#endregion
//#region src/index.d.ts
declare const VisitorKeys: import("eslint").SourceCode.VisitorKeys;
//#endregion
export { type ast_d_exports as AST, type BuiltInRuleListenerExits, type BuiltInRuleListeners, type JSONParserOptions, type JSONSyntax, type RuleFunction, type RuleListener, VisitorKeys, getStaticJSONValue, isExpression, isNumberIdentifier, isUndefinedIdentifier, meta_d_exports as meta, name, parseForESLint, parseJSON, tokenize, traverseNodes };