UNPKG

@dbml/parse

Version:
4,402 lines • 148 kB
import I, { last as $e, partition as zt, findLastIndex as Qt } from "lodash";
var u = /* @__PURE__ */ ((t) => (t.SPACE = "<space>", t.TAB = "<tab>", t.NEWLINE = "<newline>", t.COMMA = "<comma>", t.LPAREN = "<lparen>", t.RPAREN = "<rparen>", t.LBRACE = "<lbrace>", t.RBRACE = "<rbrace>", t.LBRACKET = "<lbracket>", t.RBRACKET = "<rbracket>", t.LANGLE = "<langle>", t.RANGLE = "<rangle>", t.OP = "<op>", t.EOF = "<eof>", t.NUMERIC_LITERAL = "<number>", t.STRING_LITERAL = "<string>", t.COLOR_LITERAL = "<color>", t.FUNCTION_EXPRESSION = "<function-expression>", t.QUOTED_STRING = "<variable>", t.IDENTIFIER = "<identifier>", t.SEMICOLON = "<semicolon>", t.COLON = "<colon>", t.SINGLE_LINE_COMMENT = "<single-line-comment>", t.MULTILINE_COMMENT = "<multiline-comment>", t))(u || {});
function qt(t) {
  switch (t.kind) {
    case "<newline>":
    case "<space>":
    case "<tab>":
    case "<single-line-comment>":
    case "<multiline-comment>":
      return !0;
    default:
      return !1;
  }
}
function lt(t) {
  if (!t)
    return !1;
  switch (t) {
    case "+":
    case "-":
    case "*":
    case "/":
    case "%":
    case "<":
    case ">":
    case "=":
    case "!":
    case ".":
    case "&":
    case "|":
      return !0;
    default:
      return !1;
  }
}
function ct(t) {
  return t !== void 0 && t.kind === "<op>";
}
class G {
  constructor(e, n, s, i, r) {
    this.kind = e, this.startPos = n, this.endPos = s, this.value = i, this.leadingTrivia = [], this.trailingTrivia = [], this.leadingInvalid = [], this.trailingInvalid = [], this.isInvalid = r, this.start = n.offset, this.end = s.offset;
  }
  static create(e, n, s, i, r) {
    return new G(e, n, s, i, r);
  }
}
function gt(t) {
  return t.trailingTrivia.find(({ kind: e }) => e === u.NEWLINE) !== void 0;
}
function ut(t, e) {
  return e.leadingTrivia.find(({ kind: s }) => s === u.NEWLINE) !== void 0 || gt(t);
}
function We(t) {
  return t.trailingTrivia.find(({ kind: e }) => [u.SPACE, u.TAB].includes(e)) !== void 0;
}
function _t(t) {
  return t.trailingTrivia.length === 0 ? t.end : _t($e(t.trailingTrivia));
}
function At(t) {
  return t.leadingTrivia.length === 0 ? t.start : At(t.leadingTrivia[0]);
}
function Ht(t) {
  return [u.SINGLE_LINE_COMMENT, u.MULTILINE_COMMENT].includes(
    t.kind
  );
}
class Jt {
  constructor() {
    this.id = 0;
  }
  reset() {
    this.id = 0;
  }
  nextId() {
    return this.id++;
  }
}
class k {
  // The symbol that this syntax node refers to
  // args must be passed in order of appearance in the node
  constructor(e, n, s) {
    this.id = e, this.kind = n;
    const i = s.find((a) => a !== void 0 && !Number.isNaN(a.start));
    i ? (this.startPos = i.startPos, this.fullStart = i instanceof G ? At(i) : i.fullStart) : (this.startPos = {
      offset: NaN,
      column: NaN,
      line: NaN
    }, this.fullStart = NaN);
    const r = [...s].reverse().find((a) => a !== void 0 && !Number.isNaN(a.end));
    r ? (this.endPos = r.endPos, this.fullEnd = r instanceof G ? _t(r) : r.fullEnd) : (this.endPos = {
      offset: NaN,
      column: NaN,
      line: NaN
    }, this.fullEnd = NaN), this.start = this.startPos.offset, this.end = this.endPos.offset;
  }
}
var Ne = /* @__PURE__ */ ((t) => (t.PROGRAM = "<program>", t.ELEMENT_DECLARATION = "<element-declaration>", t.ATTRIBUTE = "<attribute>", t.IDENTIFIER_STREAM = "<identifer-stream>", t.LITERAL = "<literal>", t.VARIABLE = "<variable>", t.PREFIX_EXPRESSION = "<prefix-expression>", t.INFIX_EXPRESSION = "<infix-expression>", t.POSTFIX_EXPRESSION = "<postfix-expression>", t.FUNCTION_EXPRESSION = "<function-expression>", t.FUNCTION_APPLICATION = "<function-application>", t.BLOCK_EXPRESSION = "<block-expression>", t.LIST_EXPRESSION = "<list-expression>", t.TUPLE_EXPRESSION = "<tuple-expression>", t.CALL_EXPRESSION = "<call-expression>", t.PRIMARY_EXPRESSION = "<primary-expression>", t.GROUP_EXPRESSION = "<group-expression>", t.DUMMY = "<dummy>", t.ARRAY = "<array>", t))(Ne || {});
class j extends k {
  constructor({ body: e = [], eof: n }, s) {
    super(s, "<program>", [...e, n]), this.body = e, this.eof = n;
  }
}
class A extends k {
  constructor({
    type: e,
    name: n,
    as: s,
    alias: i,
    attributeList: r,
    bodyColon: a,
    body: l
  }, p) {
    if (super(p, "<element-declaration>", [
      e,
      n,
      s,
      i,
      r,
      a,
      l
    ]), l && a && !(l instanceof v || l instanceof A))
      throw new Error("If an element has a simple body, it must be a function application node");
    this.type = e, this.name = n, this.as = s, this.alias = i, this.attributeList = r, this.bodyColon = a, this.body = l;
  }
}
class q extends k {
  constructor({ identifiers: e = [] }, n) {
    super(n, "<identifer-stream>", e || []), this.identifiers = e;
  }
}
class ie extends k {
  constructor({
    name: e,
    colon: n,
    value: s
  }, i) {
    super(i, "<attribute>", [e, n, s]), this.name = e, this.value = s, this.colon = n;
  }
}
class H extends k {
  constructor({ op: e, expression: n }, s) {
    super(s, "<prefix-expression>", [e, n]), this.op = e, this.expression = n;
  }
}
class J extends k {
  constructor({
    op: e,
    leftExpression: n,
    rightExpression: s
  }, i) {
    super(i, "<infix-expression>", [n, e, s]), this.op = e, this.leftExpression = n, this.rightExpression = s;
  }
}
class Me extends k {
  constructor({ op: e, expression: n }, s) {
    super(s, "<postfix-expression>", [n, e]), this.op = e, this.expression = n;
  }
}
class se extends k {
  constructor({ value: e }, n) {
    super(n, "<function-expression>", [e]), this.value = e;
  }
}
class v extends k {
  constructor({ callee: e, args: n = [] }, s) {
    super(s, "<function-application>", [e, ...n]), this.callee = e, this.args = n;
  }
}
class K extends k {
  constructor({
    blockOpenBrace: e,
    body: n = [],
    blockCloseBrace: s
  }, i) {
    super(i, "<block-expression>", [e, ...n, s]), this.blockOpenBrace = e, this.body = n, this.blockCloseBrace = s;
  }
}
class R extends k {
  constructor({
    listOpenBracket: e,
    elementList: n = [],
    commaList: s = [],
    listCloseBracket: i
  }, r) {
    super(r, "<list-expression>", [
      e,
      ...vt(n, s),
      i
    ]), this.listOpenBracket = e, this.elementList = n, this.commaList = s, this.listCloseBracket = i;
  }
}
class ee extends k {
  constructor({
    tupleOpenParen: e,
    elementList: n = [],
    commaList: s = [],
    tupleCloseParen: i
  }, r) {
    super(r, "<tuple-expression>", [
      e,
      ...vt(n, s),
      i
    ]), this.tupleOpenParen = e, this.elementList = n, this.commaList = s, this.tupleCloseParen = i;
  }
}
class ze extends ee {
  constructor({
    groupOpenParen: e,
    expression: n,
    groupCloseParen: s
  }, i) {
    super(
      {
        tupleOpenParen: e,
        elementList: n && [n],
        commaList: [],
        tupleCloseParen: s
      },
      i
    ), this.kind = "<group-expression>";
  }
}
class Z extends k {
  constructor({
    callee: e,
    argumentList: n
  }, s) {
    super(s, "<call-expression>", [e, n]), this.callee = e, this.argumentList = n;
  }
}
class be extends k {
  constructor({ literal: e }, n) {
    super(n, "<literal>", [e]), this.literal = e;
  }
}
class te extends k {
  constructor({ variable: e }, n) {
    super(n, "<variable>", [e]), this.variable = e;
  }
}
class M extends k {
  constructor({ expression: e }, n) {
    super(n, "<primary-expression>", [e]), this.expression = e;
  }
}
class Se extends k {
  constructor({ pre: e }, n) {
    const s = G.create(u.SPACE, e.endPos, e.endPos, " ", !1);
    super(n, "<dummy>", [s]);
  }
}
class he extends k {
  constructor({ expression: e, indexer: n }, s) {
    super(s, "<array>", [e, n]), this.array = e, this.indexer = n;
  }
}
function vt(t, e) {
  if (!t || t.length === 0)
    return e || [];
  if (!e || e.length === 0)
    return t || [];
  const [n] = t, [s] = e;
  return (n.start < s.start ? I.flatten(I.zip(t, e)) : I.flatten(I.zip(e, t))).filter(
    (i) => i !== null
  );
}
function hs(t, e = !1) {
  return JSON.stringify(
    t,
    function(n, s) {
      var i;
      return !(this instanceof j) && n === "symbol" ? s == null ? void 0 : s.id : (
        /* this instanceof SyntaxNode && */
        n === "symbol" ? {
          symbolTable: s == null ? void 0 : s.symbolTable,
          id: s == null ? void 0 : s.id,
          references: s == null ? void 0 : s.references.map((r) => r.id),
          declaration: (i = s == null ? void 0 : s.declaration) == null ? void 0 : i.id
        } : (
          /* this instanceof SyntaxNode && */
          n === "referee" || /* this instanceof SyntaxNode && */
          n === "parent" || /* this instanceof NodeSymbol && */
          n === "declaration" ? s == null ? void 0 : s.id : (
            /* this instanceof NodeSymbol && */
            n === "symbolTable" ? Object.fromEntries(s.table) : s
          )
        )
      );
    },
    e ? 2 : 0
  );
}
class x {
  constructor(e) {
    this.value = e;
  }
  unwrap() {
    return this.value;
  }
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  unwrap_or(e) {
    return this.value;
  }
  and_then(e) {
    return e(this.value);
  }
  map(e) {
    return new x(e(this.value));
  }
  // eslint-disable-next-line class-methods-use-this
  isOk() {
    return !0;
  }
}
class y {
  // eslint-disable-next-line class-methods-use-this
  unwrap() {
    throw new Error("Trying to unwrap a None value");
  }
  // eslint-disable-next-line class-methods-use-this
  unwrap_or(e) {
    return e;
  }
  // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this
  and_then(e) {
    return new y();
  }
  // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this
  map(e) {
    return new y();
  }
  // eslint-disable-next-line class-methods-use-this
  isOk() {
    return !1;
  }
}
var T = /* @__PURE__ */ ((t) => (t.Schema = "Schema", t.Table = "Table", t.Column = "Column", t.TableGroup = "TableGroup", t.TableGroupField = "TableGroup field", t.Enum = "Enum", t.EnumField = "Enum field", t.Note = "Note", t))(T || {});
function Qe(t) {
  return `Schema:${t}`;
}
function De(t) {
  return `Table:${t}`;
}
function qe(t) {
  return `Column:${t}`;
}
function He(t) {
  return `Enum:${t}`;
}
function Je(t) {
  return `Enum field:${t}`;
}
function Ze(t) {
  return `TableGroup:${t}`;
}
function Ke(t) {
  return `TableGroup field:${t}`;
}
function Zt(t) {
  return `Note:${t}`;
}
function Ce(t, e) {
  switch (e) {
    case "Column":
      return qe(t);
    case "Enum":
      return He(t);
    case "Enum field":
      return Je(t);
    case "Schema":
      return Qe(t);
    case "Table":
      return De(t);
    case "TableGroup":
      return Ze(t);
    case "TableGroup field":
      return Ke(t);
    default:
      throw new Error("Unreachable");
  }
}
function re(t) {
  const [e, n] = t.split(":");
  return Object.values(T).includes(e) ? new x({
    name: n,
    kind: e
  }) : new y();
}
function Kt(t) {
  const e = re(t).unwrap_or(void 0);
  if (!e)
    return !1;
  const { kind: n, name: s } = e;
  return n === "Schema" && s === "public";
}
function en(t) {
  return [
    Qe,
    De,
    He,
    Ze,
    qe,
    Je,
    Ke
  ].map((e) => e(t));
}
function Fe(t) {
  return !!t.match(/(\p{L}|_|\p{M})/gu);
}
function Re(t) {
  const [e] = t;
  return e >= "0" && e <= "9";
}
function tn(t) {
  const [e] = t;
  return Re(e) || Fe(e) && e.toLowerCase() >= "a" && e.toLowerCase() <= "f";
}
function Ee(t) {
  return Fe(t) || Re(t);
}
function ht(t, e) {
  const n = [], s = Math.min(t.length, e.length);
  for (let i = 0; i < s; i += 1)
    n.push(t[i], e[i]);
  return n.push(...t.slice(s), ...e.slice(s)), n;
}
function _e(t, e) {
  return t >= e.start && t < e.end;
}
class nn {
  constructor() {
    this.id = 0;
  }
  reset() {
    this.id = 0;
  }
  nextId() {
    return this.id++;
  }
}
class wt {
  constructor({ symbolTable: e }, n) {
    this.references = [], this.id = n, this.symbolTable = e;
  }
}
class sn {
  constructor({ symbolTable: e, declaration: n }, s) {
    this.references = [], this.id = s, this.symbolTable = e, this.declaration = n;
  }
}
class rn {
  constructor({ declaration: e }, n) {
    this.references = [], this.id = n, this.declaration = e;
  }
}
class yt {
  constructor({ symbolTable: e, declaration: n }, s) {
    this.references = [], this.id = s, this.symbolTable = e, this.declaration = n;
  }
}
class an {
  constructor({ declaration: e }, n) {
    this.references = [], this.id = n, this.declaration = e;
  }
}
class on {
  constructor({ symbolTable: e, declaration: n }, s) {
    this.references = [], this.id = s, this.symbolTable = e, this.declaration = n;
  }
}
class ln {
  constructor({ declaration: e }, n) {
    this.references = [], this.id = n, this.declaration = e;
  }
}
var o = /* @__PURE__ */ ((t) => (t[t.UNKNOWN_SYMBOL = 1e3] = "UNKNOWN_SYMBOL", t[t.UNEXPECTED_SYMBOL = 1001] = "UNEXPECTED_SYMBOL", t[t.UNEXPECTED_EOF = 1002] = "UNEXPECTED_EOF", t[t.UNEXPECTED_NEWLINE = 1003] = "UNEXPECTED_NEWLINE", t[t.UNKNOWN_TOKEN = 1004] = "UNKNOWN_TOKEN", t[t.UNEXPECTED_TOKEN = 1005] = "UNEXPECTED_TOKEN", t[t.UNEXPECTED_ELEMENT_DECLARATION = 1006] = "UNEXPECTED_ELEMENT_DECLARATION", t[t.MISSING_SPACES = 1007] = "MISSING_SPACES", t[t.UNKNOWN_PREFIX_OP = 1008] = "UNKNOWN_PREFIX_OP", t[t.INVALID_OPERAND = 1009] = "INVALID_OPERAND", t[t.EMPTY_ATTRIBUTE_NAME = 1010] = "EMPTY_ATTRIBUTE_NAME", t[t.INVALID_ESCAPE_SEQUENCE = 1011] = "INVALID_ESCAPE_SEQUENCE", t[t.INVALID_NAME = 3e3] = "INVALID_NAME", t[t.UNEXPECTED_NAME = 3001] = "UNEXPECTED_NAME", t[t.NAME_NOT_FOUND = 3002] = "NAME_NOT_FOUND", t[t.DUPLICATE_NAME = 3003] = "DUPLICATE_NAME", t[t.INVALID_ALIAS = 3004] = "INVALID_ALIAS", t[t.UNEXPECTED_ALIAS = 3005] = "UNEXPECTED_ALIAS", t[t.UNEXPECTED_SETTINGS = 3006] = "UNEXPECTED_SETTINGS", t[t.INVALID_SETTINGS = 3007] = "INVALID_SETTINGS", t[t.UNEXPECTED_SIMPLE_BODY = 3008] = "UNEXPECTED_SIMPLE_BODY", t[t.UNEXPECTED_COMPLEX_BODY = 3009] = "UNEXPECTED_COMPLEX_BODY", t[t.INVALID_TABLE_CONTEXT = 3010] = "INVALID_TABLE_CONTEXT", t[t.INVALID_TABLE_SETTING = 3011] = "INVALID_TABLE_SETTING", t[t.DUPLICATE_TABLE_SETTING = 3012] = "DUPLICATE_TABLE_SETTING", t[t.INVALID_TABLEGROUP_CONTEXT = 3013] = "INVALID_TABLEGROUP_CONTEXT", t[t.INVALID_TABLEGROUP_ELEMENT_NAME = 3014] = "INVALID_TABLEGROUP_ELEMENT_NAME", t[t.DUPLICATE_TABLEGROUP_ELEMENT_NAME = 3015] = "DUPLICATE_TABLEGROUP_ELEMENT_NAME", t[t.DUPLICATE_TABLEGROUP_FIELD_NAME = 3016] = "DUPLICATE_TABLEGROUP_FIELD_NAME", t[t.INVALID_TABLEGROUP_FIELD = 3017] = "INVALID_TABLEGROUP_FIELD", t[t.EMPTY_TABLE = 3018] = "EMPTY_TABLE", t[t.INVALID_COLUMN = 3019] = "INVALID_COLUMN", t[t.INVALID_COLUMN_NAME = 3020] = "INVALID_COLUMN_NAME", t[t.UNKNOWN_COLUMN_SETTING = 3021] = "UNKNOWN_COLUMN_SETTING", t[t.INVALID_COLUMN_TYPE = 3022] = "INVALID_COLUMN_TYPE", t[t.DUPLICATE_COLUMN_NAME = 3023] = "DUPLICATE_COLUMN_NAME", t[t.DUPLICATE_COLUMN_SETTING = 3024] = "DUPLICATE_COLUMN_SETTING", t[t.INVALID_COLUMN_SETTING_VALUE = 3025] = "INVALID_COLUMN_SETTING_VALUE", t[t.INVALID_ENUM_CONTEXT = 3026] = "INVALID_ENUM_CONTEXT", t[t.INVALID_ENUM_ELEMENT_NAME = 3027] = "INVALID_ENUM_ELEMENT_NAME", t[t.INVALID_ENUM_ELEMENT = 3028] = "INVALID_ENUM_ELEMENT", t[t.DUPLICATE_ENUM_ELEMENT_NAME = 3029] = "DUPLICATE_ENUM_ELEMENT_NAME", t[t.UNKNOWN_ENUM_ELEMENT_SETTING = 3030] = "UNKNOWN_ENUM_ELEMENT_SETTING", t[t.DUPLICATE_ENUM_ELEMENT_SETTING = 3031] = "DUPLICATE_ENUM_ELEMENT_SETTING", t[t.INVALID_ENUM_ELEMENT_SETTING = 3032] = "INVALID_ENUM_ELEMENT_SETTING", t[t.EMPTY_ENUM = 3033] = "EMPTY_ENUM", t[t.INVALID_REF_CONTEXT = 3034] = "INVALID_REF_CONTEXT", t[t.UNKNOWN_REF_SETTING = 3035] = "UNKNOWN_REF_SETTING", t[t.DUPLICATE_REF_SETTING = 3036] = "DUPLICATE_REF_SETTING", t[t.INVALID_REF_SETTING_VALUE = 3037] = "INVALID_REF_SETTING_VALUE", t[t.INVALID_REF_RELATIONSHIP = 3038] = "INVALID_REF_RELATIONSHIP", t[t.INVALID_REF_FIELD = 3039] = "INVALID_REF_FIELD", t[t.EMPTY_REF = 3040] = "EMPTY_REF", t[t.REF_REDEFINED = 3041] = "REF_REDEFINED", t[t.INVALID_NOTE_CONTEXT = 3042] = "INVALID_NOTE_CONTEXT", t[t.INVALID_NOTE = 3043] = "INVALID_NOTE", t[t.NOTE_REDEFINED = 3044] = "NOTE_REDEFINED", t[t.NOTE_CONTENT_REDEFINED = 3045] = "NOTE_CONTENT_REDEFINED", t[t.EMPTY_NOTE = 3046] = "EMPTY_NOTE", t[t.INVALID_INDEXES_CONTEXT = 3047] = "INVALID_INDEXES_CONTEXT", t[t.INVALID_INDEXES_FIELD = 3048] = "INVALID_INDEXES_FIELD", t[t.INVALID_INDEX = 3049] = "INVALID_INDEX", t[t.UNKNOWN_INDEX_SETTING = 3050] = "UNKNOWN_INDEX_SETTING", t[t.DUPLICATE_INDEX_SETTING = 3051] = "DUPLICATE_INDEX_SETTING", t[t.UNEXPECTED_INDEX_SETTING_VALUE = 3052] = "UNEXPECTED_INDEX_SETTING_VALUE", t[t.INVALID_INDEX_SETTING_VALUE = 3053] = "INVALID_INDEX_SETTING_VALUE", t[t.INVALID_PROJECT_CONTEXT = 3054] = "INVALID_PROJECT_CONTEXT", t[t.PROJECT_REDEFINED = 3055] = "PROJECT_REDEFINED", t[t.INVALID_PROJECT_FIELD = 3056] = "INVALID_PROJECT_FIELD", t[t.INVALID_CUSTOM_CONTEXT = 3057] = "INVALID_CUSTOM_CONTEXT", t[t.INVALID_CUSTOM_ELEMENT_VALUE = 3058] = "INVALID_CUSTOM_ELEMENT_VALUE", t[t.INVALID_ELEMENT_IN_SIMPLE_BODY = 3059] = "INVALID_ELEMENT_IN_SIMPLE_BODY", t[t.BINDING_ERROR = 4e3] = "BINDING_ERROR", t[t.UNSUPPORTED = 5e3] = "UNSUPPORTED", t[t.CIRCULAR_REF = 5001] = "CIRCULAR_REF", t[t.SAME_ENDPOINT = 5002] = "SAME_ENDPOINT", t[t.UNEQUAL_FIELDS_BINARY_REF = 5003] = "UNEQUAL_FIELDS_BINARY_REF", t[t.CONFLICTING_SETTING = 5004] = "CONFLICTING_SETTING", t[t.TABLE_REAPPEAR_IN_TABLEGROUP = 5005] = "TABLE_REAPPEAR_IN_TABLEGROUP", t))(o || {});
class c extends Error {
  constructor(e, n, s) {
    super(n), this.code = e, this.diagnostic = n, this.nodeOrToken = s, this.start = s.start, this.end = s.end, this.name = this.constructor.name, Object.setPrototypeOf(this, c.prototype);
  }
}
class X {
  constructor(e, n) {
    this.value = e, this.errors = n === void 0 ? [] : n;
  }
  getValue() {
    return this.value;
  }
  getErrors() {
    return this.errors;
  }
  chain(e) {
    const n = e(this.value), s = [...this.errors, ...n.errors];
    return new X(n.value, s);
  }
  map(e) {
    return new X(e(this.value), this.errors);
  }
}
function cn(t, e, n) {
  if (!t || !me(t) || e.length === 0)
    return new y();
  const s = [...e], i = Xe(t).unwrap(), r = s.pop();
  if (!(r instanceof K))
    return new y();
  const a = I.last(s) instanceof R ? s.pop() : void 0;
  return s.length === 3 && Xe(s[1]).unwrap().value === "as" ? new x(
    n.create(A, {
      type: i,
      name: s[0],
      as: Xe(s[1]).unwrap(),
      alias: s[2],
      attributeList: a,
      body: r
    })
  ) : s.length === 1 ? new x(
    n.create(A, {
      type: i,
      name: s[0],
      attributeList: a,
      body: r
    })
  ) : s.length === 0 ? new x(
    n.create(A, {
      type: i,
      attributeList: a,
      body: r
    })
  ) : new y();
}
function ft(t) {
  return t.kind === u.IDENTIFIER && t.value === "as";
}
function N(t) {
  t && (t instanceof G ? un(t) : hn(t));
}
function un(t) {
  t.kind !== u.EOF && (t.isInvalid = !0);
}
function hn(t) {
  if (t instanceof A)
    N(t.type), N(t.name), N(t.as), N(t.alias), N(t.bodyColon), N(t.attributeList), N(t.body);
  else if (t instanceof q)
    t.identifiers.forEach(N);
  else if (t instanceof ie)
    N(t.name), N(t.colon), N(t.value);
  else if (t instanceof H)
    N(t.op), N(t.expression);
  else if (t instanceof J)
    N(t.leftExpression), N(t.op), N(t.rightExpression);
  else if (t instanceof Me)
    N(t.op), N(t.expression);
  else if (t instanceof K)
    N(t.blockOpenBrace), t.body.forEach(N), N(t.blockCloseBrace);
  else if (t instanceof R)
    N(t.listOpenBracket), t.commaList.forEach(N), t.elementList.forEach(N), N(t.listCloseBracket);
  else if (t instanceof ee)
    N(t.tupleOpenParen), t.commaList.forEach(N), t.elementList.forEach(N), N(t.tupleCloseParen);
  else if (t instanceof Z)
    N(t.callee), N(t.argumentList);
  else if (t instanceof v)
    N(t.callee), t.args.forEach(N);
  else if (t instanceof M)
    N(t.expression);
  else if (t instanceof se)
    N(t.value);
  else if (t instanceof te)
    N(t.variable);
  else if (t instanceof be)
    N(t.literal);
  else
    throw t instanceof ze ? new Error("This case is handled by the TupleExpressionNode case") : new Error("Unreachable case in markInvalidNode");
}
function kt(t) {
  return !!(t != null && t.isInvalid);
}
function U(...t) {
  return t.filter((e) => e !== void 0);
}
function fn(t) {
  if (t instanceof j)
    return U(...t.body, t.eof);
  if (t instanceof A)
    return U(
      t.type,
      t.name,
      t.as,
      t.alias,
      t.attributeList,
      t.bodyColon,
      t.body
    );
  if (t instanceof ie)
    return U(t.name, t.colon, t.value);
  if (t instanceof q)
    return t.identifiers;
  if (t instanceof be)
    return t.literal ? [t.literal] : [];
  if (t instanceof te)
    return U(t.variable);
  if (t instanceof H)
    return U(t.op, t.expression);
  if (t instanceof J)
    return U(t.leftExpression, t.op, t.rightExpression);
  if (t instanceof Me)
    return U(t.expression, t.op);
  if (t instanceof se)
    return U(t.value);
  if (t instanceof v)
    return U(t.callee, ...t.args);
  if (t instanceof K)
    return U(t.blockOpenBrace, ...t.body, t.blockCloseBrace);
  if (t instanceof R)
    return U(
      t.listOpenBracket,
      ...ht(t.elementList, t.commaList),
      t.listCloseBracket
    );
  if (t instanceof ee)
    return U(
      t.tupleOpenParen,
      ...ht(t.elementList, t.commaList),
      t.tupleCloseParen
    );
  if (t instanceof Z)
    return U(t.callee, t.argumentList);
  if (t instanceof M)
    return U(t.expression);
  if (t instanceof he)
    return U(
      t.array,
      t.indexer
    );
  throw t instanceof ze ? new Error("This case is already handled by TupleExpressionNode") : new Error("Unreachable - no other possible cases");
}
function Xe(t) {
  return V(t) ? new x(t.expression.variable) : new y();
}
function Y(t) {
  var e;
  return t instanceof M && (t.expression instanceof te && t.expression.variable instanceof G && t.expression.variable.kind === u.QUOTED_STRING || t.expression instanceof be && ((e = t.expression.literal) == null ? void 0 : e.kind) === u.STRING_LITERAL);
}
function V(t) {
  return t instanceof M && t.expression instanceof te && t.expression.variable instanceof G;
}
function me(t) {
  var e;
  return t instanceof M && t.expression instanceof te && ((e = t.expression.variable) == null ? void 0 : e.kind) === u.IDENTIFIER;
}
function et(t) {
  var e;
  return t instanceof J && t.leftExpression instanceof k && t.rightExpression instanceof k && ((e = t.op) == null ? void 0 : e.value) === ".";
}
function Te(t) {
  if (t === void 0)
    return new y();
  const e = t.identifiers.map((n) => n.value).join(" ");
  return e === "" ? new y() : new x(e);
}
class pn {
  // list of errors during lexing
  constructor(e) {
    this.start = {
      offset: 0,
      line: 0,
      column: 0
    }, this.current = {
      offset: 0,
      line: 0,
      column: 0
    }, this.tokens = [], this.errors = [], this.text = e;
  }
  isAtEnd() {
    return this.current.offset >= this.text.length;
  }
  advance() {
    const e = this.peek();
    return this.current = { ...this.current }, e === `
` ? (this.current.line += 1, this.current.column = 0) : this.current.column += 1, this.current.offset += 1, e;
  }
  peek(e = 0) {
    if (!(this.current.offset + e >= this.text.length))
      return this.text[this.current.offset + e];
  }
  // Check if the sequence ahead matches `sequence`
  check(e) {
    for (let n = 0; n < e.length; n += 1)
      if (e[n] !== this.peek(n))
        return !1;
    return !0;
  }
  // If the sequence ahead matches `sequence`, move `current` past `sequence`
  match(e) {
    return this.check(e) ? (e.split("").forEach(() => this.advance()), !0) : !1;
  }
  addToken(e, n = !1) {
    this.tokens.push(this.createToken(e, n));
  }
  createToken(e, n = !1) {
    return G.create(
      e,
      this.start,
      this.current,
      this.text.substring(this.start.offset, this.current.offset),
      n
    );
  }
  lex() {
    return this.scanTokens(), this.tokens.push(G.create(u.EOF, this.start, this.current, "", !1)), this.gatherTrivia(), this.gatherInvalid(), new X(this.tokens, this.errors);
  }
  scanTokens() {
    for (; !this.isAtEnd(); ) {
      const e = this.advance();
      switch (e) {
        case " ":
          this.addToken(u.SPACE);
          break;
        case "\r":
          break;
        case `
`:
          this.addToken(u.NEWLINE);
          break;
        case "	":
          this.addToken(u.TAB);
          break;
        case ",":
          this.addToken(u.COMMA);
          break;
        case "(":
          this.addToken(u.LPAREN);
          break;
        case ")":
          this.addToken(u.RPAREN);
          break;
        case "[":
          this.addToken(u.LBRACKET);
          break;
        case "]":
          this.addToken(u.RBRACKET);
          break;
        case "{":
          this.addToken(u.LBRACE);
          break;
        case "}":
          this.addToken(u.RBRACE);
          break;
        case ";":
          this.addToken(u.SEMICOLON);
          break;
        case ":":
          this.addToken(u.COLON);
          break;
        case "'":
          this.match("''") ? this.multilineStringLiteral() : this.singleLineStringLiteral();
          break;
        case '"':
          this.quotedVariable();
          break;
        case "`":
          this.functionExpression();
          break;
        case "#":
          this.colorLiteral();
          break;
        case "/":
          this.match("/") ? this.singleLineComment() : this.match("*") ? this.multilineComment() : this.operator();
          break;
        default:
          if (lt(e)) {
            this.operator();
            break;
          }
          if (Fe(e)) {
            this.identifier();
            break;
          }
          if (Re(e)) {
            this.numericLiteralOrIdentifier();
            break;
          }
          this.addToken(u.OP, !0), this.errors.push(
            new c(
              o.UNKNOWN_SYMBOL,
              `Unexpected token '${e}'`,
              this.createToken(u.OP, !0)
            )
          );
          break;
      }
      this.start = { ...this.current };
    }
  }
  gatherTrivia() {
    let e = !0, n = [], s;
    const i = [];
    for (const r of this.tokens)
      qt(r) ? (n.push(r), r.kind === u.NEWLINE && s && (s.trailingTrivia = n, e = !0, s = void 0, n = [])) : (e ? r.leadingTrivia = n : s.trailingTrivia = n, i.push(r), n = [], s = r, e = !1);
    this.tokens = i;
  }
  gatherInvalid() {
    let e;
    const n = [], s = [];
    for (e = 0; e < this.tokens.length && kt(this.tokens[e]); e += 1)
      s.push(this.tokens[e]);
    let i = this.tokens[e];
    for (i.leadingInvalid = [...s, ...i.leadingInvalid]; e < this.tokens.length; e += 1) {
      const r = this.tokens[e];
      r.isInvalid ? i.trailingInvalid.push(r) : (i = r, n.push(r));
    }
    this.tokens = n;
  }
  // Consuming characters until the `stopSequence` is encountered
  consumeUntil(e, n, {
    allowNewline: s,
    // Whether newline is allowed
    allowEof: i,
    // Whether EOF is allowed
    raw: r,
    // Whether to interpret '\' as a backlash
    consumeStopSequence: a = !0
  }) {
    let l = "";
    for (; !this.isAtEnd() && (s || !this.check(`
`)) && !this.check(n); )
      this.peek() === "\\" && !r ? (this.advance(), l += this.escapedString()) : l += this.advance();
    if (this.isAtEnd() && !i) {
      const p = this.createToken(e, !0);
      this.tokens.push(p), this.errors.push(
        new c(o.UNEXPECTED_EOF, "EOF reached while parsing", p)
      );
      return;
    }
    if (this.check(`
`) && !s) {
      const p = this.createToken(e, !0);
      this.tokens.push(p), this.errors.push(
        new c(
          o.UNEXPECTED_NEWLINE,
          "Invalid newline encountered while parsing",
          p
        )
      );
      return;
    }
    a && this.match(n), this.tokens.push(G.create(e, this.start, this.current, l, !1));
  }
  singleLineStringLiteral() {
    this.consumeUntil(u.STRING_LITERAL, "'", {
      allowNewline: !1,
      allowEof: !1,
      raw: !1
    });
  }
  multilineStringLiteral() {
    this.consumeUntil(u.STRING_LITERAL, "'''", {
      allowNewline: !0,
      allowEof: !1,
      raw: !1
    });
  }
  functionExpression() {
    this.consumeUntil(u.FUNCTION_EXPRESSION, "`", {
      allowNewline: !1,
      allowEof: !1,
      raw: !0
    });
  }
  quotedVariable() {
    this.consumeUntil(u.QUOTED_STRING, '"', {
      allowNewline: !1,
      allowEof: !1,
      raw: !1
    });
  }
  singleLineComment() {
    this.consumeUntil(u.SINGLE_LINE_COMMENT, `
`, {
      allowNewline: !0,
      allowEof: !0,
      raw: !0,
      consumeStopSequence: !1
    });
  }
  multilineComment() {
    this.consumeUntil(u.MULTILINE_COMMENT, "*/", {
      allowNewline: !0,
      allowEof: !1,
      raw: !0
    });
  }
  identifier() {
    for (; !this.isAtEnd() && Ee(this.peek()); )
      this.advance();
    this.addToken(u.IDENTIFIER);
  }
  operator() {
    for (; lt(this.peek()); )
      this.advance();
    this.addToken(u.OP);
  }
  // we accept identifiers starting with digits but must contain at least one char or underscore
  numericLiteralOrIdentifier() {
    let e = 0;
    if (this.isAtEnd())
      return this.addToken(u.NUMERIC_LITERAL);
    for (; !this.isAtEnd(); ) {
      const n = this.check(".");
      if (e += n ? 1 : 0, e > 1)
        break;
      if (!n && this.current.offset === this.text.length - 1)
        return this.advance(), this.addToken(u.NUMERIC_LITERAL);
      if (!n && !Ee(this.peek()))
        return this.addToken(u.NUMERIC_LITERAL);
      if (!n && !Re(this.peek()))
        break;
      this.advance();
    }
    if (e > 0) {
      for (; !this.isAtEnd() && (this.check(".") || Ee(this.peek())); )
        this.advance();
      const n = this.createToken(u.NUMERIC_LITERAL, !0);
      this.tokens.push(n), this.errors.push(new c(o.UNKNOWN_TOKEN, "Invalid number", n));
    } else {
      for (; !this.isAtEnd() && Ee(this.peek()); )
        this.advance();
      const n = this.createToken(u.IDENTIFIER, !1);
      this.tokens.push(n);
    }
  }
  colorLiteral() {
    for (; !this.isAtEnd() && Ee(this.peek()); )
      this.advance();
    this.addToken(u.COLOR_LITERAL);
  }
  escapedString() {
    const e = { column: this.current.column - 1, offset: this.current.offset - 1, line: this.current.line };
    if (this.isAtEnd())
      return "\\";
    switch (this.advance()) {
      case "\r":
        return this.check(`
`) && this.advance(), "";
      case `
`:
        return "";
      case "t":
        return "	";
      case "n":
        return `
`;
      case "\\":
        return "\\";
      case "r":
        return "\r";
      case "'":
        return "'";
      case '"':
        return '"';
      case "0":
        return "\0";
      case "b":
        return "\b";
      case "v":
        return "\v";
      case "f":
        return "\f";
      case " ":
        return "\\ ";
      case "u": {
        let n = "";
        for (let s = 0; s <= 3; s += 1) {
          if (this.isAtEnd() || !Ee(this.peek()))
            return this.errors.push(new c(o.INVALID_ESCAPE_SEQUENCE, `Invalid unicode escape sequence '\\u${n}', only unicode escape sequences of the form '\\uHHHH' where H is a hexadecimal number are allowed`, G.create(u.STRING_LITERAL, e, this.current, `\\u${n}`, !0))), `\\u${n}`;
          n += this.advance();
        }
        return String.fromCharCode(parseInt(n, 16));
      }
      default:
        return this.text[this.current.offset - 1];
    }
  }
}
var Oe = /* @__PURE__ */ ((t) => (t[t.ListExpression = 0] = "ListExpression", t[t.GroupExpression = 1] = "GroupExpression", t[t.BlockExpression = 2] = "BlockExpression", t))(Oe || {});
class dn {
  constructor() {
    this.stack = [], this.numberOfNestedLParens = 0, this.numberOfNestedLBrackets = 0, this.numberOfNestedLBraces = 0;
  }
  push(e) {
    this.stack.push(e), e === 0 && (this.numberOfNestedLBrackets += 1), e === 1 && (this.numberOfNestedLParens += 1), e === 2 && (this.numberOfNestedLBraces += 1);
  }
  pop() {
    const e = this.stack.pop();
    return e === 0 && (this.numberOfNestedLBrackets -= 1), e === 1 && (this.numberOfNestedLParens -= 1), e === 2 && (this.numberOfNestedLBraces -= 1), e;
  }
  top() {
    return I.last(this.stack);
  }
  isWithinGroupExpressionContext() {
    return this.numberOfNestedLParens > 0;
  }
  isWithinListExpressionContext() {
    return this.numberOfNestedLBrackets > 0;
  }
  isWithinBlockExpressionContext() {
    return this.numberOfNestedLBraces > 0;
  }
  // Call the passed in callback
  // with the guarantee that the passed in context will be pushed and popped properly
  // even in cases of exceptions
  withContextDo(e, n) {
    return () => {
      this.push(e);
      try {
        return n();
      } finally {
        this.pop();
      }
    };
  }
  // Return the type of the handler context currently in the context stack to handle `token`
  findHandlerContext(e, n) {
    if (!(this.numberOfNestedLBraces <= 0 && this.numberOfNestedLBrackets <= 0 && this.numberOfNestedLParens <= 0))
      for (let s = n; s < e.length - 1; s += 1)
        switch (e[s].kind) {
          case u.COMMA:
            if (this.isWithinGroupExpressionContext() || this.isWithinListExpressionContext())
              return [...this.stack].reverse().find(
                (r) => [
                  1,
                  0
                  /* ListExpression */
                ].includes(r)
              );
            break;
          case u.RPAREN:
            if (this.isWithinGroupExpressionContext())
              return 1;
            break;
          case u.RBRACE:
            if (this.isWithinBlockExpressionContext())
              return 2;
            break;
          case u.RBRACKET:
            if (this.isWithinListExpressionContext())
              return 0;
            break;
        }
  }
}
class En {
  constructor(e) {
    this.generator = e;
  }
  create(e, n) {
    return new e(n, this.generator.nextId());
  }
}
class d {
  constructor(e, n, s) {
    this.token = e, this.partialNode = n, this.handlerContext = s;
  }
}
class Nn {
  constructor(e, n) {
    this.current = 0, this.errors = [], this.contextStack = new dn(), this.synchronizeProgram = () => {
      const s = this.peek();
      s.kind !== u.EOF ? N(this.advance()) : (N(this.peek()), this.logError(s, o.UNEXPECTED_EOF, "Unexpected EOF"));
    }, this.synchronizeElementDeclarationName = () => {
      for (; !this.isAtEnd(); ) {
        const s = this.peek();
        if (ft(s) || this.check(u.COLON, u.LBRACE, u.LBRACKET))
          break;
        N(s), this.advance();
      }
    }, this.synchronizeElementDeclarationAlias = () => {
      for (; !this.isAtEnd(); ) {
        const s = this.peek();
        if (this.check(u.COLON, u.LBRACE, u.LBRACKET))
          break;
        N(s), this.advance();
      }
    }, this.blockExpression = this.contextStack.withContextDo(Oe.BlockExpression, () => {
      const s = { body: [] }, i = () => this.nodeFactory.create(K, s);
      try {
        this.consume("Expect an opening brace '{'", u.LBRACE), s.blockOpenBrace = this.previous();
      } catch (r) {
        if (!(r instanceof d))
          throw r;
        if (s.blockOpenBrace = r.partialNode, !this.canHandle(r))
          throw new d(r.token, i(), r.handlerContext);
        this.synchronizeBlock();
      }
      for (; !this.isAtEnd() && !this.check(u.RBRACE); )
        try {
          s.body.push(this.canBeField() ? this.fieldDeclaration() : this.expression());
        } catch (r) {
          if (!(r instanceof d))
            throw r;
          if (s.body.push(r.partialNode), !this.canHandle(r))
            throw new d(r.token, i(), r.handlerContext);
          this.synchronizeBlock();
        }
      try {
        this.consume("Expect a closing brace '}'", u.RBRACE), s.blockCloseBrace = this.previous();
      } catch (r) {
        if (!(r instanceof d))
          throw r;
        if (s.blockCloseBrace = r.partialNode, !this.canHandle(r))
          throw new d(r.token, i(), r.handlerContext);
        this.synchronizeBlock();
      }
      return i();
    }), this.synchronizeBlock = () => {
      if (!this.check(u.RBRACE))
        for (N(this.advance()); !this.isAtEnd(); ) {
          const s = this.peek();
          if (this.check(u.RBRACE) || ut(this.previous(), s))
            break;
          N(s), this.advance();
        }
    }, this.tupleExpression = this.contextStack.withContextDo(Oe.GroupExpression, () => {
      const s = { elementList: [], commaList: [] }, i = () => this.nodeFactory.create(ze, {
        groupOpenParen: s.tupleOpenParen,
        groupCloseParen: s.tupleCloseParen,
        expression: s.elementList[0]
      }), r = () => this.nodeFactory.create(ee, s);
      try {
        this.consume("Expect an opening parenthesis '('", u.LPAREN), s.tupleOpenParen = this.previous();
      } catch (a) {
        if (!(a instanceof d))
          throw a;
        if (s.tupleOpenParen = a.partialNode, !this.canHandle(a))
          throw new d(a.token, r(), a.handlerContext);
        this.synchronizeTuple();
      }
      if (!this.isAtEnd() && !this.check(u.RPAREN))
        try {
          s.elementList.push(this.normalExpression());
        } catch (a) {
          if (!(a instanceof d))
            throw a;
          if (s.elementList.push(a.partialNode), !this.canHandle(a))
            throw new d(a.token, i(), a.handlerContext);
          this.synchronizeTuple();
        }
      for (; !this.isAtEnd() && !this.check(u.RPAREN); )
        try {
          this.consume("Expect a comma ','", u.COMMA), s.commaList.push(this.previous()), s.elementList.push(this.normalExpression());
        } catch (a) {
          if (!(a instanceof d))
            throw a;
          if (a.partialNode instanceof k && s.elementList.push(a.partialNode), !this.canHandle(a))
            throw new d(a.token, r(), a.handlerContext);
          this.synchronizeTuple();
        }
      try {
        this.consume("Expect a closing parenthesis ')'", u.RPAREN), s.tupleCloseParen = this.previous();
      } catch (a) {
        if (!(a instanceof d))
          throw a;
        if (s.tupleCloseParen = a.partialNode, !this.canHandle(a))
          throw new d(a.token, r(), a.handlerContext);
        this.synchronizeTuple();
      }
      return s.elementList.length === 1 ? i() : r();
    }), this.synchronizeTuple = () => {
      for (; !this.isAtEnd(); ) {
        const s = this.peek();
        if (this.check(u.RPAREN, u.COMMA))
          break;
        N(s), this.advance();
      }
    }, this.listExpression = this.contextStack.withContextDo(Oe.ListExpression, () => {
      const s = { elementList: [], commaList: [] }, i = () => this.nodeFactory.create(R, s);
      try {
        this.consume("Expect an opening bracket '['", u.LBRACKET), s.listOpenBracket = this.previous();
      } catch (r) {
        if (!(r instanceof d))
          throw r;
        if (s.listOpenBracket = r.partialNode, !this.canHandle(r))
          throw new d(r.token, i(), r.handlerContext);
        this.synchronizeList();
      }
      if (!this.isAtEnd() && !this.check(u.RBRACKET))
        try {
          s.elementList.push(this.attribute());
        } catch (r) {
          if (!(r instanceof d))
            throw r;
          if (s.elementList.push(r.partialNode), !this.canHandle(r))
            throw new d(r.token, i(), r.handlerContext);
          this.synchronizeList();
        }
      for (; !this.isAtEnd() && !this.check(u.RBRACKET); )
        try {
          this.consume("Expect a comma ','", u.COMMA), s.commaList.push(this.previous()), s.elementList.push(this.attribute());
        } catch (r) {
          if (!(r instanceof d))
            throw r;
          if (r.partialNode instanceof k && s.elementList.push(r.partialNode), !this.canHandle(r))
            throw new d(r.token, i(), r.handlerContext);
          this.synchronizeList();
        }
      try {
        this.consume("Expect a closing bracket ']'", u.RBRACKET), s.listCloseBracket = this.previous();
      } catch (r) {
        if (!(r instanceof d))
          throw r;
        if (s.listCloseBracket = r.partialNode, !this.canHandle(r))
          throw new d(r.token, i(), r.handlerContext);
        this.synchronizeList();
      }
      return i();
    }), this.synchronizeList = () => {
      for (; !this.isAtEnd(); ) {
        const s = this.peek();
        if (this.check(u.COMMA, u.RBRACKET))
          break;
        N(s), this.advance();
      }
    }, this.synchronizeAttributeName = () => {
      for (; !this.isAtEnd(); ) {
        const s = this.peek();
        if (this.check(u.COMMA, u.RBRACKET, u.COLON))
          break;
        N(s), this.advance();
      }
    }, this.synchronizeAttributeValue = () => {
      for (; !this.isAtEnd(); ) {
        const s = this.peek();
        if (this.check(u.COMMA, u.RBRACKET))
          break;
        N(s), this.advance();
      }
    }, this.tokens = e, this.nodeFactory = new En(n);
  }
  isAtEnd() {
    return this.current >= this.tokens.length || this.tokens[this.current].kind === u.EOF;
  }
  advance() {
    return this.isAtEnd() ? I.last(this.tokens) : this.tokens[this.current++];
  }
  peek(e = 0) {
    return e + this.current >= this.tokens.length ? I.last(this.tokens) : this.tokens[this.current + e];
  }
  match(...e) {
    const n = this.check(...e);
    return n && this.advance(), n;
  }
  check(...e) {
    const n = this.peek();
    return e.includes(n.kind);
  }
  previous() {
    return this.tokens[this.current - 1];
  }
  canHandle(e) {
    return e.handlerContext === void 0 || e.handlerContext === this.contextStack.top();
  }
  consume(e, ...n) {
    if (!this.match(...n))
      throw this.logError(this.peek(), o.UNEXPECTED_TOKEN, e), new d(
        this.peek(),
        void 0,
        this.contextStack.findHandlerContext(this.tokens, this.current)
      );
  }
  // Discard tokens until one of `kind` is found
  // If any tokens are discarded, the error message is logged
  // Return whether the token of one of the listed kinds are eventually reached
  discardUntil(e, ...n) {
    if (this.isAtEnd() || !this.check(...n)) {
      for (N(this.peek()), this.logError(this.advance(), o.UNEXPECTED_TOKEN, e); !this.isAtEnd() && !this.check(...n); )
        N(this.advance());
      return !this.isAtEnd();
    }
    return !0;
  }
  gatherInvalid() {
    const e = [], n = [];
    let s, i = 0;
    for (; i < this.tokens.length && this.tokens[i].isInvalid; i += 1)
      n.push(this.tokens[i]);
    for (s = this.tokens[i], s.leadingInvalid = n, e.push(s), i += 1; i < this.tokens.length; i += 1) {
      const r = this.tokens[i];
      r.isInvalid ? s.trailingInvalid.push(r) : (s = r, e.push(s));
    }
    this.tokens = e;
  }
  parse() {
    const e = this.program(), n = this.advance(), s = this.nodeFactory.create(j, { body: e, eof: n });
    return this.gatherInvalid(), new X({ ast: s, tokens: this.tokens }, this.errors);
  }
  /* Parsing and synchronizing ProgramNode */
  program() {
    const e = [];
    for (; !this.isAtEnd(); )
      try {
        const n = this.elementDeclaration();
        e.push(n);
      } catch (n) {
        if (!(n instanceof d))
          throw n;
        e.push(n.partialNode), this.synchronizeProgram();
      }
    return e;
  }
  /* Parsing and synchronizing top-level ElementDeclarationNode */
  elementDeclaration() {
    const e = {}, n = () => this.nodeFactory.create(A, e);
    try {
      this.consume("Expect an identifier", u.IDENTIFIER), e.type = this.previous();
    } catch (s) {
      throw s instanceof d ? (e.type = s.partialNode, new d(s.token, n(), s.handlerContext)) : s;
    }
    if (!this.check(u.COLON, u.LBRACE, u.LBRACKET))
      try {
        e.name = this.normalExpression();
      } catch (s) {
        if (!(s instanceof d))
          throw s;
        if (e.name = s.partialNode, !this.canHandle(s))
          throw new d(s.token, n(), s.handlerContext);
        this.synchronizeElementDeclarationName();
      }
    if (ft(this.peek()))
      if (e.as = this.advance(), this.check(u.COLON, u.LBRACE, u.LBRACKET))
        this.logError(this.peek(), o.UNEXPECTED_TOKEN, "Expect an alias");
      else
        try {
          e.alias = this.normalExpression();
        } catch (s) {
          if (!(s instanceof d))
            throw s;
          if (e.alias = s.partialNode, !this.canHandle(s))
            throw new d(s.token, n(), s.handlerContext);
          this.synchronizeElementDeclarationAlias();
        }
    try {
      e.attributeList = this.check(u.LBRACKET) ? this.listExpression() : void 0;
    } catch (s) {
      throw s instanceof d ? (e.attributeList = s.partialNode, new d(s.token, n(), s.handlerContext)) : s;
    }
    if (!this.discardUntil(
      "Expect an opening brace '{' or a colon ':'",
      u.LBRACE,
      u.COLON
    ))
      return n();
    try {
      if (this.match(u.COLON)) {
        e.bodyColon = this.previous();
        const s = this.expression();
        s instanceof A ? (N(s), this.logError(s, o.UNEXPECTED_ELEMENT_DECLARATION, "An element's simple body must not be an element declaration")) : e.body = s;
      } else
        e.body = this.blockExpression();
    } catch (s) {
      throw s instanceof d ? (e.body = s.partialNode, new d(s.token, n(), s.handlerContext)) : s;
    }
    return this.nodeFactory.create(A, e);
  }
  /* Parsing nested element declarations with simple body */
  // e.g
  // ```
  //  Table Users {
  //    Note: 'This is a note'  // fieldDeclaration() handles this
  //  }
  fieldDeclaration() {
    const e = {}, n = () => this.nodeFactory.create(A, e);
    try {
      this.consume("Expect an identifier", u.IDENTIFIER), e.type = this.previous();
    } catch (s) {
      throw s instanceof d ? (e.type = s.partialNode, new d(s.token, n(), s.handlerContext)) : s;
    }
    try {
      this.consume("Expect a colon ':'", u.COLON), e.bodyColon = this.previous();
    } catch (s) {
      throw s instanceof d ? (e.bodyColon = s.partialNode, new d(s.token, n(), s.handlerContext)) : s;
    }
    try {
      const s = this.expression();
      s instanceof A ? this.errors.push(new c(o.INVALID_ELEMENT_IN_SIMPLE_BODY, "Simple body cannot be an element declaration", s)) : e.body = s;
    } catch (s) {
      throw s instanceof d ? (e.body = s.partialNode, new d(s.token, n(), s.handlerContext)) : s;
    }
    return this.nodeFactory.create(A, e);
  }
  /* Parsing any ExpressionNode, including non-NormalExpression */
  expression() {
    const e = { args: [] }, n = () => cn(e.callee, e.args, this.nodeFactory).unwrap_or(
      this.nodeFactory.create(v, e)
    );
    try {
      e.callee = this.normalExpression();
    } catch (i) {
      throw i instanceof d ? (e.callee = i.partialNode, new d(i.token, n(), i.handlerContext)) : i;
    }
    if (this.shouldStopExpression())
      return n();
    let s = e.callee;
    for (; !this.shouldStopExpression(); ) {
      We(this.previous()) || this.logError(s, o.MISSING_SPACES, "Expect a following space");
      try {
        s = this.normalExpression(), e.args.push(s);
      } catch (i) {
        throw i instanceof d ? (s = i.partialNode, e.args.push(s), new d(i.token, n(), i.handlerContext)) : i;
      }
    }
    return n();
  }
  shouldStopExpression() {
    if (this.isAtEnd() || gt(this.previous()))
      return !0;
    const e = this.peek().kind;
    return e === u.RBRACE || e === u.RBRACKET || e === u.RPAREN || e === u.COMMA || e === u.COLON;
  }
  normalExpression() {
    return this.expression_bp(0);
  }
  // Pratt's parsing algorithm
  expression_bp(e) {
    let n = this.leftExpression_bp();
    for (; !this.isAtEnd(); ) {
      const s = this.peek();
      if (s.kind === u.LPAREN) {
        const { left: i } = pt(s);
        if (i < e || // When '(' is encountered,
        // consider it part of another expression if
        // it's at the start of a new line
        // and we're currently not having unmatched '(' or '['
        ut(this.previous(), s) && !this.contextStack.isWithinGroupExpressionContext() && !this.contextStack.isWithinListExpressionContext())
          break;
        try {
          n = this.nodeFactory.create(Z, {
            callee: n,
            argumentList: this.tupleExpression()
          });
        } catch (r) {
          throw r instanceof d ? (n = this.nodeFactory.create(Z, {
            callee: n,
            argumentList: r.partialNode
          }), new d(r.token, n, r.handlerContext)) : r;
        }
      } else if (s.kind === u.LBRACKET) {
        if (We(this.previous()))
          break;
        try {
          n = this.nodeFactory.create(he, {
            expression: n,
            indexer: this.listExpression()
          });
        } catch (i) {
          throw i instanceof d ? (n = this.nodeFactory.create(he, {
            expression: n,
            indexer: i.partialNode
          }), new d(i.token, n, i.handlerContext)) : i;
        }
      } else if (ct(s)) {
        const i = s, r = pt(i);
        if (r.left !== null) {
          if (r.left <= e)
            break;
          this.advance(), n = this.nodeFactory.create(Me, {
            expression: n,
            op: i
          });
        } else {
          const a = Tn(i);
          if (a.left === null || a.left <= e)
            break;
          this.advance();
          try {
            n = this.nodeFactory.create(J, {
              leftExpression: n,
              op: i,
              rightExpression: i.value === "." ? this.extractOperand() : this.expression_bp(a.right)
            });
          } catch (l) {
            throw l instanceof d ? (n = this.nodeFactory.create(J, {
              leftExpression: n,
              op: i,
              rightExpression: l.partialNode
            }), new d(l.token, n, l.handlerContext)) : l;
          }
        }
      } else
        break;
    }
    return n;
  }
  leftExpression_bp() {
    let e;
    if (ct(this.peek())) {
      const n = {};
      n.op = this.peek();
      const s = In(n.op);
      if (s.right === null)
        throw this.logError(
          n.op,
          o.UNKNOWN_PREFIX_OP,
          `Unexpected '${n.op.value}' in an expression`
        ), new d(
          n.op,
          this.nodeFactory.create(Se, { pre: n.op }),
          this.contextStack.findHandlerContext(this.tokens, this.current)
        );
      this.advance();
      try {
        n.expression = this.expression_bp(s.right);
      } catch (i) {
        throw i instanceof d ? (n.expression = i.partialNode, new d(
          i.token,
          this.nodeFactory.create(H, n),
          i.handlerContext
        )) : i;
      }
      e = this.nodeFactory.create(H, n);
    } else if (e = this.extractOperand(), e instanceof Se)
      throw new d(
        this.peek(),
        this.nodeFactory.create(Se, { pre: this.peek() }),
        this.contextStack.findHandlerContext(this.tokens, this.current)
      );
    return e;
  }
  // Extract an operand to be used in a normal form expression
  // e.g (1 + 2) in (1 + 2) * 3
  // e.g [1, 2, 3, 4]
  // e.g { ... }
  extractOperand() {
    return this.check(
      u.NUMERIC_LITERAL,
      u.STRING_LITERAL,
      u.COLOR_LITERAL,
      u.QUOTED_STRING,
      u.IDENTIFIER
    ) ? this.primaryExpression() : this.check(u.FUNCTION_EXPRESSION) ? this.functionExpression() : this.check(u.LBRACKET) ? this.listExpression() : this.check(u.LBRACE) ? this.blockExpression() : this.check(u.LPAREN) ? this.tupleExpression() : (this.peek().kind === u.EOF ? this.logError(
      this.peek(),
      o.UNEXPECTED_EOF,
      "Unexpected EOF"
    ) : this.logError(
      this.peek(),
      o.INVALID_OPERAND,
      `Invalid start of operand "${this.peek().value}"`
    ), this.nodeFactory.create(Se, { pre: this.previous() }));
  }
  /* Parsing FunctionExpression */
  functionExpression() {
    const e = {};
    try {
      this.consume("Expect a function expression", u.FUNCTION_EXPRESSION), e.value = this.previous();
    } catch (n) {
      throw n instanceof d ? (e.value = n.partialNode, new d(
        n.token,
        this.nodeFactory.create(se, e),
        n.handlerContext
      )) : n;
    }
    return this.nodeFactory.create(se, e);
  }
  canBeField() {
    return this.peek().kind === u.IDENTIFIER && this.peek(1).kind === u.COLON;
  }
  /* Parsing PrimaryExpression */
  primaryExpression() {
    if (this.match(
      u.COLOR_LITERAL,
      u.STRING_LITERAL,
      u.NUMERIC_LITERAL
    ))
      return this.nodeFactory.create(M, {
        expression: this.nodeFactory.create(be, { literal: this.previous() })
      });
    if (this.match(u.QUOTED_STRING, u.IDENTIFIER))
      return this.nodeFactory.create(M, {
        expression: this.nodeFactory.create(te, { variable: this.previous() })
      });
    throw this.logError(this.peek(), o.UNEXPECTED_TOKEN, "Expect a variable or literal"), new d(
      this.peek(),
      void 0,
      this.contextStack.findHandlerContext(this.tokens, this.current)
    );
  }
  attribute() {
    const e = {};
    if (this.check(u.COLON, u.RBRACKET, u.COMMA)) {
      const n = this.peek();
      this.logError(
        n,
        o.EMPTY_ATTRIBUTE_NAME,
        "Expect a non-empty attribute name"
      ), e.name = this.nodeFactory.create(q, { identifiers: [] });
    } else
      try {
        e.name = this.attributeName();
      } catch (n) {
        if (!(n instanceof d))
          throw n;
        if (e.name = n.partialNode, !this.canHandle(n))
          throw new d(
            n.token,
            this.nodeFactory.create(ie, e),
            n.handlerContext
          );
        this.synchronizeAttributeName();
      }
    return this.match(u.COLON) && (e.colon = this.previous(), e.value = this.attributeValue()), this.nodeFactory.create(ie, e);
  }
  attributeValue() {
    let e;
    try {
      e = this.peek().kind === u.IDENTIFIER && this.peek(1).kind === u.IDENTIFIER ? this.attributeName() : this.normalExpression();
    } catch (n) {
      if (!(n instanceof d) || !this.canHandle(n))
        throw n;
      e = n.partialNode, this.synchronizeAttributeValue();
    }
    return e;
  }
  attributeName() {
    const e = [];
    if (this.peek().kind !== u.IDENTIFIER)
      return this.primaryExpression();
    for (; !this.isAtEnd() && !this.check(u.COLON, u.COMMA, u.RBRACKET); )
      try {
        this.consume("Expect an identifier", u.IDENTIFIER), e.push(this.previous());
      } catch (n) {
        throw n instanceof d ? new d(
          n.token,
          this.nodeFactory.create(q, { identifiers: e }),
          n.handlerContext
        ) : n;
      }
    return this.nodeFactory.create(q, { identifiers: e });
  }
  logError(e, n, s) {
    this.errors.push(new c(n, s, e));
  }
}
const mn = {
  "+": { left: 9, right: 10 },
  "*": { left: 11, right: 12 },
  "-": { left: 9, right: 10 },
  "/": { left: 11, right: 12 },
  "%": { left: 11, right: 12 },
  "<": { left: 7, right: 8 },
  "<=": { left: 7, right: 8 },
  ">": { left: 7, right: 8 },
  ">=": { left: 7, right: 8 },
  "<>": { left: 7, right: 8 },
  "=": { left: 2, right: 3 },
  "==": { left: 4, right: 5 },
  "!=": { left: 4, right: 5 },
  ".": { left: 16, right: 17 }
};
function Tn(t) {
  return mn[t.value] || { left: null, right: null };
}
const bn = {
  "+": { left: null, right: 15 },
  "-": { left: null, right: 15 },
  "<": { left: null, right: 15 },
  ">": { left: null, right: 15 },
  "<>": { left: null, right: 15 },
  "!": { left: null, right: 15 }
};
function In(t) {
  return bn[t.value] || { left: null, right: null };
}
const Ln = {
  "(": { left: 14, right: null }
};
function pt(t) {
  return Ln[t.value] || { left: null, right: null };
}
var b = /* @__PURE__ */ ((t) => (t.Table = "table", t.Enum = "enum", t.Ref = "ref", t.Note = "note", t.Project = "project", t.Indexes = "indexes", t.TableGroup = "tablegroup", t))(b || {});
function we(t) {
  var n;
  const e = (n = t == null ? void 0 : t.type) == null ? void 0 : n.value.toLowerCase();
  switch (e) {
    case b.Enum:
    case b.Table:
    case b.Indexes:
    case b.Note:
    case b.Project:
    case b.Ref:
    case b.TableGroup:
      return new x(e);
    default:
      return new y();
  }
}
function pe(t) {
  if (!et(t))
    return new x([t]);
  const e = pe(t.leftExpression).unwrap_or(void 0);
  return e ? (e.push(t.rightExpression), new x(e)) : new y();
}
function z(t) {
  if (t === void 0)
    return new y();
  const e = pe(t).unwrap_or(void 0);
  if (!e)
    return new y();
  const n = [];
  for (const s of e) {
    const i = Q(s).unwrap_or(void 0);
    if (!i)
      return new y();
    n.push(i);
  }
  return new x(n);
}
function Ae(t) {
  if (t === void 0)
    return new y();
  const e = pe(t).unwrap_or(void 0);
  if (!e || e.length === 0)
    return new y();
  const n = [];
  let s;
  if (!V(I.last(e))) {
    const i = e.pop();
    if (Dt(i))
      s = i.elementList.map(
        (r) => W(r).unwrap()
      );
    else
      return new y();
  }
  for (const i of e) {
    const r = Q(i).unwrap_or(void 0);
    if (!r)
      return new y();
    n.push(r);
  }
  return new x({
    variables: n,
    tupleElements: s
  });
}
function Q(t) {
  return V(t) ? new x(t.expression.variable.value) : new y();
}
function je(t) {
  if (dt(t))
    return t instanceof se ? new x({ functional: [t], nonFunctional: [] }) : new x({ functional: [], nonFunctional: [t] });
  if (t instanceof ee && t.elementList.every(dt)) {
    const e = t.elementList.filter(
      (s) => s instanceof se
    ), n = t.elementList.filter(V);
    return new x({ functional: e, nonFunctional: n });
  }
  return new y();
}
function W(t) {
  var n;
  const e = (n = t == null ? void 0 : t.expression.variable) == null ? void 0 : n.value;
  return e === void 0 ? new y() : new x(e);
}
function $(t) {
  return Y(t) ? t.expression instanceof te ? new x(t.expression.variable.value) : new x(t.expression.literal.value) : new y();
}
function gn(t) {
  var e;
  return !(t instanceof J) || !Ot((e = t.op) == null ? void 0 : e.value) ? !1 : Ae(t.leftExpression).and_then(() => Ae(t.rightExpression)).unwrap_or(void 0) !== void 0;
}
function _n(t) {
  const e = Ae(t.leftExpression), n = Ae(t.rightExpression);
  if (!e.isOk() || !n.isOk())
    return !1;
  const { tupleElements: s } = e.unwrap(), { tupleElements: i } = n.unwrap();
  return (s == null ? void 0 : s.length) === (i == null ? void 0 : i.length);
}
function dt(t) {
  return t instanceof M && t.expression instanceof te || t instanceof se;
}
function An(t, e) {
  var i, r, a, l;
  let n = e;
  const s = Kt(t);
  for (; n; ) {
    if ((r = (i = n.symbol) == null ? void 0 : i.symbolTable) != null && r.has(t))
      return (a = n.symbol.symbolTable) == null ? void 0 : a.get(t);
    if (((l = n.symbol) == null ? void 0 : l.declaration) instanceof j && s)
      return n.symbol;
    if (n instanceof j)
      return;
    n = n.parent;
  }
}
class vn {
  constructor(e, n, s) {
    this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
  }
  validate() {
    return [...this.validateContext(), ...this.validateName(this.declarationNode.name), ...this.validateAlias(this.declarationNode.alias), ...this.validateSettingList(this.declarationNode.attributeList), ...this.validateBody(this.declarationNode.body)];
  }
  validateContext() {
    return this.declarationNode.parent instanceof j || we(this.declarationNode.parent).unwrap_or(void 0) !== b.Project ? [new c(o.INVALID_CUSTOM_CONTEXT, "A custom element can only appear in a Project", this.declarationNode)] : [];
  }
  validateName(e) {
    return e ? [new c(o.UNEXPECTED_NAME, "A Custom element shouldn't have a name", e)] : [];
  }
  validateAlias(e) {
    return e ? [new c(o.UNEXPECTED_NAME, "A Custom element shouldn't have an alias", e)] : [];
  }
  validateSettingList(e) {
    return e ? [new c(o.UNEXPECTED_SETTINGS, "A Custom element shouldn't have a setting list", e)] : [];
  }
  validateBody(e) {
    if (!e)
      return [];
    if (e instanceof K)
      return [new c(o.UNEXPECTED_COMPLEX_BODY, "A Custom element can only have an inline field", e)];
    const n = [];
    return Y(e.callee) || n.push(new c(o.INVALID_CUSTOM_ELEMENT_VALUE, "A Custom element value can only be a string", e)), e.args.length > 0 && n.push(...e.args.map((s) => new c(o.INVALID_CUSTOM_ELEMENT_VALUE, "A Custom element value can only be a string", s))), n;
  }
}
class ye {
  constructor() {
    this.table = /* @__PURE__ */ new Map();
  }
  has(e) {
    return this.table.has(e);
  }
  set(e, n) {
    this.table.set(e, n);
  }
  get(e, n) {
    return this.table.get(e) || n !== void 0 && this.set(e, n) || n;
  }
  entries() {
    return this.table.entries();
  }
}
class wn {
  constructor(e, n, s) {
    this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
  }
  validate() {
    return [...this.validateContext(), ...this.validateName(this.declarationNode.name), ...this.validateAlias(this.declarationNode.alias), ...this.validateSettingList(this.declarationNode.attributeList), ...this.registerElement(), ...this.validateBody(this.declarationNode.body)];
  }
  validateContext() {
    return this.declarationNode.parent instanceof A ? [new c(o.INVALID_PROJECT_CONTEXT, "An Enum can only appear top-level", this.declarationNode)] : [];
  }
  validateName(e) {
    return e ? St(e) ? [] : [new c(o.INVALID_NAME, "An Enum name must be of the form <enum> or <schema>.<enum>", e)] : [new c(o.NAME_NOT_FOUND, "An Enum must have a name", this.declarationNode)];
  }
  validateAlias(e) {
    return e ? [new c(o.UNEXPECTED_ALIAS, "A Ref shouldn't have an alias", e)] : [];
  }
  registerElement() {
    const e = [];
    this.declarationNode.symbol = this.symbolFactory.create(sn, { declaration: this.declarationNode, symbolTable: new ye() });
    const { name: n } = this.declarationNode, s = z(n);
    if (s.isOk()) {
      const i = s.unwrap(), r = i.pop(), a = tt(i, this.publicSymbolTable, this.symbolFactory), l = He(r);
      a.has(l) && e.push(new c(o.DUPLICATE_NAME, `Enum name ${r} already exists in schema '${i.join(".") || "public"}'`, n)), a.set(l, this.declarationNode.symbol);
    }
    return e;
  }
  validateSettingList(e) {
    return e ? [new c(o.UNEXPECTED_SETTINGS, "An Enum shouldn't have a setting list", e)] : [];
  }
  validateBody(e) {
    if (!e)
      return [];
    if (e instanceof v)
      return this.validateFields([e]);
    const [n, s] = I.partition(e.body, (i) => i instanceof v);
    return [...this.validateFields(n), ...this.validateSubElements(s)];
  }
  validateFields(e) {
    return e.length === 0 ? [new c(o.EMPTY_ENUM, "An Enum must have at least one element", this.declarationNode)] : e.flatMap((n) => {
      const s = [];
      n.callee && !V(n.callee) && s.push(new c(o.INVALID_ENUM_ELEMENT_NAME, "An enum field must be an identifier or a quoted identifier", n.callee));
      const i = [...n.args];
      return I.last(i) instanceof R ? (s.push(...this.validateFieldSettings(I.last(i))), i.pop()) : i[0] instanceof R && (s.push(...this.validateFieldSettings(i[0])), i.shift()), i.length > 0 && s.push(...i.map((r) => new c(o.INVALID_ENUM_ELEMENT, "An Enum must have only a field and optionally a setting list", r))), s.push(...this.registerField(n)), s;
    });
  }
  validateFieldSettings(e) {
    const n = C(e), s = n.getErrors(), i = n.getValue();
    for (const r in i) {
      const a = i[r];
      switch (r) {
        case "note":
          a.length > 1 && a.forEach((l) => s.push(new c(o.DUPLICATE_ENUM_ELEMENT_SETTING, "'note' can only appear once", l))), a.forEach((l) => {
            Y(l.value) || s.push(new c(o.INVALID_ENUM_ELEMENT_SETTING, "'note' must be a string", l));
          });
          break;
        default:
          a.forEach((l) => s.push(new c(o.UNKNOWN_ENUM_ELEMENT_SETTING, `Unknown enum field setting '${r}'`, l)));
      }
    }
    return s;
  }
  validateSubElements(e) {
    return e.flatMap((n) => {
      if (n.parent = this.declarationNode, !n.type)
        return [];
      const s = oe(n);
      return new s(n, this.publicSymbolTable, this.symbolFactory).validate();
    });
  }
  registerField(e) {
    if (e.callee && V(e.callee)) {
      const n = W(e.callee).unwrap(), s = Je(n), i = this.symbolFactory.create(rn, { declaration: e });
      e.symbol = i;
      const r = this.declarationNode.symbol.symbolTable;
      if (r.has(s)) {
        const a = r.get(s);
        return [
          new c(o.DUPLICATE_COLUMN_NAME, `Duplicate enum field ${n}`, e),
          new c(o.DUPLICATE_COLUMN_NAME, `Duplicate enum field ${n}`, a.declaration)
        ];
      }
      r.set(s, i);
    }
    return [];
  }
}
class yn {
  constructor(e, n, s) {
    this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
  }
  validate() {
    return [...this.validateContext(), ...this.validateName(this.declarationNode.name), ...this.validateAlias(this.declarationNode.alias), ...this.validateSettingList(this.declarationNode.attributeList), ...this.validateBody(this.declarationNode.body)];
  }
  validateContext() {
    return this.declarationNode.parent instanceof j || we(this.declarationNode.parent).unwrap_or(void 0) !== b.Table ? [new c(o.INVALID_NOTE_CONTEXT, "An Indexes can only appear inside a Table", this.declarationNode)] : [];
  }
  validateName(e) {
    return e ? [new c(o.UNEXPECTED_NAME, "An Indexes shouldn't have a name", e)] : [];
  }
  validateAlias(e) {
    return e ? [new c(o.UNEXPECTED_ALIAS, "An Indexes shouldn't have an alias", e)] : [];
  }
  validateSettingList(e) {
    return e ? [new c(o.UNEXPECTED_SETTINGS, "An Indexes shouldn't have a setting list", e)] : [];
  }
  validateBody(e) {
    if (!e)
      return [];
    if (e instanceof v)
      return [new c(o.UNEXPECTED_SIMPLE_BODY, "An Indexes must have a complex body", e)];
    const [n, s] = I.partition(e.body, (i) => i instanceof v);
    return [...this.validateFields(n), ...this.validateSubElements(s)];
  }
  validateFields(e) {
    return e.flatMap((n) => {
      if (!n.callee)
        return [];
      const s = [], i = [n.callee, ...n.args];
      return I.last(i) instanceof R && s.push(...this.validateFieldSetting(i.pop())), i.forEach((r) => {
        for (; r instanceof Z; )
          r.argumentList && !je(r.argumentList).isOk() && s.push(new c(o.INVALID_INDEXES_FIELD, "An index field must be an identifier, a quoted identifier, a functional expression or a tuple of such", r.argumentList)), r = r.callee;
        je(r).isOk() || s.push(new c(o.INVALID_INDEXES_FIELD, "An index field must be an identifier, a quoted identifier, a functional expression or a tuple of such", r));
      }), s;
    });
  }
  validateFieldSetting(e) {
    const n = C(e), s = n.getErrors(), i = n.getValue();
    for (const r in i) {
      const a = i[r];
      switch (r) {
        case "note":
        case "name":
          a.length > 1 && a.forEach((l) => s.push(new c(o.DUPLICATE_INDEX_SETTING, `'${r}' can only appear once`, l))), a.forEach((l) => {
            Y(l.value) || s.push(new c(o.INVALID_INDEX_SETTING_VALUE, `'${r}' must be a string`, l));
          });
          break;
        case "unique":
        case "pk":
          a.length > 1 && a.forEach((l) => s.push(new c(o.DUPLICATE_INDEX_SETTING, `'${r}' can only appear once`, l))), a.forEach((l) => {
            ue(l.value) || s.push(new c(o.INVALID_INDEX_SETTING_VALUE, `'${r}' must not have a value`, l));
          });
          break;
        case "type":
          a.length > 1 && a.forEach((l) => s.push(new c(o.DUPLICATE_INDEX_SETTING, "'type' can only appear once", l))), a.forEach((l) => {
            V(l.value) || s.push(new c(o.INVALID_INDEX_SETTING_VALUE, `'type' must be "btree" or "hash"`, l));
          });
          break;
        default:
          a.forEach((l) => s.push(new c(o.UNKNOWN_INDEX_SETTING, `Unknown index setting '${r}'`, l)));
      }
    }
    return s;
  }
  validateSubElements(e) {
    return e.flatMap((n) => {
      if (n.parent = this.declarationNode, !n.type)
        return [];
      const s = oe(n);
      return new s(n, this.publicSymbolTable, this.symbolFactory).validate();
    });
  }
}
class kn {
  constructor(e, n, s) {
    this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
  }
  validate() {
    return [
      ...this.validateContext(),
      ...this.validateName(this.declarationNode.name),
      ...this.validateAlias(this.declarationNode.alias),
      ...this.validateSettingList(this.declarationNode.attributeList),
      ...this.validateBody(this.declarationNode.body)
    ];
  }
  validateContext() {
    return !(this.declarationNode.parent instanceof j) && ![
      b.Table,
      b.TableGroup,
      b.Project
    ].includes(we(this.declarationNode.parent).unwrap_or(void 0)) ? [new c(
      o.INVALID_NOTE_CONTEXT,
      "A Note can only appear inside a Table, a Table Group or a Project. Sticky note can only appear at the global scope.",
      this.declarationNode
    )] : [];
  }
  validateName(e) {
    if (!(this.declarationNode.parent instanceof j))
      return e ? [new c(o.UNEXPECTED_NAME, "A Note shouldn't have a name", e)] : [];
    if (!e)
      return [new c(o.INVALID_NAME, "Sticky note must have a name", this.declarationNode)];
    const n = z(e);
    if (!n.isOk())
      return [new c(o.INVALID_NAME, "Invalid name for sticky note ", this.declarationNode)];
    const i = n.unwrap().join("."), r = Zt(i);
    return this.publicSymbolTable.has(r) ? [new c(o.DUPLICATE_NAME, `Sticky note "${i}" has already been defined`, e)] : (this.publicSymbolTable.set(r, this.declarationNode.symbol), []);
  }
  validateAlias(e) {
    return e ? [new c(o.UNEXPECTED_ALIAS, "A Ref shouldn't have an alias", e)] : [];
  }
  validateSettingList(e) {
    return e ? [new c(o.UNEXPECTED_SETTINGS, "A Note shouldn't have a setting list", e)] : [];
  }
  validateBody(e) {
    if (!e)
      return [];
    if (e instanceof v)
      return this.validateFields([e]);
    const [n, s] = I.partition(e.body, (i) => i instanceof v);
    return [...this.validateFields(n), ...this.validateSubElements(s)];
  }
  validateFields(e) {
    const n = [];
    return e.length === 0 ? [new c(o.EMPTY_NOTE, "A Note must have a content", this.declarationNode)] : (e.length > 1 && e.slice(1).forEach((s) => n.push(new c(o.NOTE_CONTENT_REDEFINED, "A Note can only contain one string", s))), Y(e[0].callee) || n.push(new c(o.INVALID_NOTE, "A Note content must be a quoted string", e[0])), e[0].args.length > 0 && n.push(...e[0].args.map((s) => new c(o.INVALID_NOTE, "A Note can only contain one quoted string", s))), n);
  }
  validateSubElements(e) {
    return e.flatMap((n) => {
      if (n.parent = this.declarationNode, !n.type)
        return [];
      const s = oe(n);
      return new s(n, this.publicSymbolTable, this.symbolFactory).validate();
    });
  }
}
class xn {
  constructor(e, n, s) {
    this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
  }
  validate() {
    return [...this.validateContext(), ...this.validateName(this.declarationNode.name), ...this.validateAlias(this.declarationNode.alias), ...this.validateSettingList(this.declarationNode.attributeList), ...this.validateBody(this.declarationNode.body)];
  }
  validateContext() {
    return this.declarationNode.parent instanceof A ? [new c(o.INVALID_PROJECT_CONTEXT, "A Project can only appear top-level", this.declarationNode)] : [];
  }
  validateName(e) {
    return e ? ke(e) ? [] : [new c(o.INVALID_NAME, "A Project's name is optional or must be an identifier or a quoted identifer", e)] : [];
  }
  validateAlias(e) {
    return e ? [new c(o.UNEXPECTED_ALIAS, "A Project shouldn't have an alias", e)] : [];
  }
  validateSettingList(e) {
    return e ? [new c(o.UNEXPECTED_SETTINGS, "A Project shouldn't have a setting list", e)] : [];
  }
  validateBody(e) {
    if (!e)
      return [];
    if (e instanceof v)
      return [new c(o.UNEXPECTED_SIMPLE_BODY, "A Project's body must be a block", e)];
    const [n, s] = I.partition(e.body, (i) => i instanceof v);
    return [
      ...n.map((i) => new c(o.INVALID_PROJECT_FIELD, "A Project can not have inline fields", i)),
      ...this.validateSubElements(s)
    ];
  }
  validateSubElements(e) {
    return e.flatMap((n) => {
      if (n.parent = this.declarationNode, !n.type)
        return [];
      const s = oe(n);
      return new s(n, this.publicSymbolTable, this.symbolFactory).validate();
    });
  }
}
class Sn {
  constructor(e, n, s) {
    this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
  }
  validate() {
    return [...this.validateContext(), ...this.validateName(this.declarationNode.name), ...this.validateAlias(this.declarationNode.alias), ...this.validateSettingList(this.declarationNode.attributeList), ...this.validateBody(this.declarationNode.body)];
  }
  validateContext() {
    return this.declarationNode.parent instanceof j ? [] : [new c(o.INVALID_REF_CONTEXT, "A Ref must appear top-level", this.declarationNode)];
  }
  validateName(e) {
    return e ? ke(e) ? [] : [new c(o.INVALID_NAME, "A Ref's name is optional or must be an identifier or a quoted identifer", e)] : [];
  }
  validateAlias(e) {
    return e ? [new c(o.UNEXPECTED_ALIAS, "A Ref shouldn't have an alias", e)] : [];
  }
  validateSettingList(e) {
    return e ? [new c(o.UNEXPECTED_SETTINGS, "A Ref shouldn't have a setting list", e)] : [];
  }
  validateBody(e) {
    if (!e)
      return [];
    if (e instanceof v)
      return this.validateFields([e]);
    const [n, s] = I.partition(e.body, (i) => i instanceof v);
    return [...this.validateFields(n), ...this.validateSubElements(s)];
  }
  validateFields(e) {
    if (e.length === 0)
      return [new c(o.EMPTY_REF, "A Ref must have at least one field", this.declarationNode)];
    const n = [];
    return e.length > 1 && n.push(...e.slice(1).map((s) => new c(o.REF_REDEFINED, "A Ref can only contain one binary relationship", s))), e.forEach((s) => {
      s.callee && !gn(s.callee) && n.push(new c(o.INVALID_REF_FIELD, "A Ref field must be a binary relationship", s.callee)), s.callee && !_n(s.callee) && n.push(new c(o.UNEQUAL_FIELDS_BINARY_REF, "Unequal fields in ref endpoints", s.callee));
      const i = [...s.args];
      if (I.last(i) instanceof R) {
        const r = this.validateFieldSettings(I.last(i));
        n.push(...r), i.pop();
      } else
        i[0] instanceof R && (n.push(...this.validateFieldSettings(i[0])), i.shift());
      i.length > 0 && n.push(...i.map((r) => new c(o.INVALID_REF_FIELD, "A Ref field should only have a single binary relationship", r)));
    }), n;
  }
  validateFieldSettings(e) {
    const n = C(e), s = n.getErrors(), i = n.getValue();
    for (const r in i) {
      const a = i[r];
      switch (r) {
        case "delete":
        case "update":
          a.length > 1 && a.forEach((l) => s.push(new c(o.DUPLICATE_REF_SETTING, `'${r}' can only appear once`, l))), a.forEach((l) => {
            On(l.value) || s.push(new c(o.INVALID_REF_SETTING_VALUE, `'${r}' can only have values "cascade", "no action", "set null", "set default" or "restrict"`, l));
          });
          break;
        case "color":
          a.length > 1 && s.push(...a.map((l) => new c(o.DUPLICATE_REF_SETTING, "'color' can only appear once", l))), a.forEach((l) => {
            nt(l.value) || s.push(new c(o.INVALID_REF_SETTING_VALUE, "'color' must be a color literal", l));
          });
          break;
        default:
          a.forEach((l) => s.push(new c(o.UNKNOWN_REF_SETTING, `Unknown ref setting '${r}'`, l)));
      }
    }
    return s;
  }
  validateSubElements(e) {
    return e.flatMap((n) => {
      if (n.parent = this.declarationNode, !n.type)
        return [];
      const s = oe(n);
      return new s(n, this.publicSymbolTable, this.symbolFactory).validate();
    });
  }
}
function On(t) {
  if (!(V(t) && t.expression.variable.kind !== u.QUOTED_STRING) && !(t instanceof q))
    return !1;
  let e;
  if (t instanceof q ? e = Te(t).unwrap_or("") : e = t.expression.variable.value, e)
    switch (e.toLowerCase()) {
      case "cascade":
      case "no action":
      case "set null":
      case "set default":
      case "restrict":
        return !0;
      default:
        return !1;
    }
  return !1;
}
class Dn {
  constructor(e, n, s) {
    this.declarationNode = e, this.symbolFactory = s, this.publicSymbolTable = n;
  }
  validate() {
    return [...this.validateContext(), ...this.validateName(this.declarationNode.name), ...this.validateAlias(this.declarationNode.alias), ...this.validateSettingList(this.declarationNode.attributeList), ...this.registerElement(), ...this.validateBody(this.declarationNode.body)];
  }
  validateContext() {
    return this.declarationNode.parent instanceof A ? [new c(o.INVALID_TABLE_CONTEXT, "Table must appear top-level", this.declarationNode)] : [];
  }
  validateName(e) {
    return e ? e instanceof he ? [new c(o.INVALID_NAME, "Invalid array as Table name, maybe you forget to add a space between the name and the setting list?", e)] : St(e) ? [] : [new c(o.INVALID_NAME, "A Table name must be of the form <table> or <schema>.<table>", e)] : [new c(o.NAME_NOT_FOUND, "A Table must have a name", this.declarationNode)];
  }
  validateAlias(e) {
    return e ? Mn(e) ? [] : [new c(o.INVALID_ALIAS, "Table aliases can only contains alphanumeric and underscore unless surrounded by double quotes", e)] : [];
  }
  validateSettingList(e) {
    const n = C(e), s = n.getErrors(), i = n.getValue();
    for (const r in i) {
      const a = i[r];
      switch (r) {
        case "headercolor":
          a.length > 1 && s.push(...a.map((l) => new c(o.DUPLICATE_TABLE_SETTING, "'headercolor' can only appear once", l))), a.forEach((l) => {
            nt(l.value) || s.push(new c(o.INVALID_TABLE_SETTING, "'headercolor' must be a color literal", l.value || l.name));
          });
          break;
        case "note":
          a.length > 1 && s.push(...a.map((l) => new c(o.DUPLICATE_TABLE_SETTING, "'note' can only appear once", l))), a.forEach((l) => {
            Y(l.value) || s.push(new c(o.INVALID_TABLE_SETTING, "'note' must be a string literal", l.value || l.name));
          });
          break;
        default:
          s.push(...a.map((l) => new c(o.INVALID_TABLE_SETTING, `Unknown '${r}' setting`, l)));
      }
    }
    return s;
  }
  registerElement() {
    const e = [];
    this.declarationNode.symbol = this.symbolFactory.create(yt, { declaration: this.declarationNode, symbolTable: new ye() });
    const { name: n, alias: s } = this.declarationNode, i = z(n);
    if (i.isOk()) {
      const r = [...i.unwrap()], a = r.pop(), l = tt(r, this.publicSymbolTable, this.symbolFactory), p = De(a);
      l.has(p) && e.push(new c(o.DUPLICATE_NAME, `Table name '${a}' already exists in schema '${r.join(".") || "public"}'`, n)), l.set(p, this.declarationNode.symbol);
    }
    if (s && ke(s) && !Pn(s.expression.variable.value, i.unwrap_or([]))) {
      const r = W(s).unwrap(), a = De(r);
      this.publicSymbolTable.has(a) && e.push(new c(o.DUPLICATE_NAME, `Table name '${r}' already exists`, n)), this.publicSymbolTable.set(a, this.declarationNode.symbol);
    }
    return e;
  }
  validateBody(e) {
    if (!e)
      return [];
    if (e instanceof v)
      return [new c(o.UNEXPECTED_SIMPLE_BODY, "A Table's body must be a block", e)];
    const [n, s] = I.partition(e.body, (i) => i instanceof v);
    return [...this.validateFields(n), ...this.validateSubElements(s)];
  }
  validateFields(e) {
    return e.length === 0 ? [new c(o.EMPTY_TABLE, "A Table must have at least one column", this.declarationNode)] : e.flatMap((n) => {
      if (!n.callee)
        return [];
      const s = [];
      n.args.length === 0 && s.push(new c(o.INVALID_COLUMN, "A column must have a type", n.callee)), V(n.callee) || s.push(new c(o.INVALID_COLUMN_NAME, "A column name must be an identifier or a quoted identifier", n.callee)), n.args[0] && !Rn(n.args[0]) && s.push(new c(o.INVALID_COLUMN_TYPE, "Invalid column type", n.args[0]));
      const i = n.args.slice(1);
      return s.push(...this.validateFieldSetting(i)), s.push(...this.registerField(n)), s;
    });
  }
  registerField(e) {
    if (e.callee && V(e.callee)) {
      const n = W(e.callee).unwrap(), s = qe(n), i = this.symbolFactory.create(an, { declaration: e });
      e.symbol = i;
      const r = this.declarationNode.symbol.symbolTable;
      if (r.has(s)) {
        const a = r.get(s);
        return [
          new c(o.DUPLICATE_COLUMN_NAME, `Duplicate column ${n}`, e),
          new c(o.DUPLICATE_COLUMN_NAME, `Duplicate column ${n}`, a.declaration)
        ];
      }
      r.set(s, i);
    }
    return [];
  }
  // This is needed to support legacy inline settings
  validateFieldSetting(e) {
    if (!e.slice(0, -1).every(me) || !e.slice(-1).every((p) => me(p) || p instanceof R))
      return [...e.map((p) => new c(o.INVALID_COLUMN, "These fields must be some inline settings optionally ended with a setting list", p))];
    if (e.length === 0)
      return [];
    let n;
    I.last(e) instanceof R && (n = e.pop());
    const s = C(n), i = s.getErrors(), r = s.getValue();
    for (const p of e) {
      const f = W(p).unwrap_or("").toLowerCase();
      if (f !== "pk" && f !== "unique") {
        i.push(new c(o.INVALID_SETTINGS, "Inline column settings can only be `pk` or `unique`", p));
        continue;
      }
      r[f] === void 0 ? r[f] = [p] : r[f].push(p);
    }
    const a = r.pk || [], l = r["primary key"] || [];
    a.length >= 1 && l.length >= 1 && i.push(...[...a, ...l].map((p) => new c(o.DUPLICATE_COLUMN_SETTING, "Either one of 'primary key' and 'pk' can appear", p)));
    for (const p in r) {
      const f = r[p];
      switch (p) {
        case "note":
          f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "note can only appear once", h))), f.forEach((h) => {
            Y(h.value) || i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'note' must be a quoted string", h.value || h.name));
          });
          break;
        case "ref":
          f.forEach((h) => {
            Bn(h.value) || i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'ref' must be a valid unary relationship", h.value || h.name));
          });
          break;
        case "primary key":
          f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "primary key can only appear once", h))), f.forEach((h) => {
            ue(h.value) || i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'primary key' must not have a value", h.value || h.name));
          });
          break;
        case "pk":
          f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "'pk' can only appear once", h))), f.forEach((h) => {
            h instanceof ie && !ue(h.value) && i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'pk' must not have a value", h.value || h.name));
          });
          break;
        case "not null":
          f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "'not null' can only appear once", h)));
          const E = r.null || [];
          f.length >= 1 && E.length >= 1 && i.push(...[...f, ...E].map((h) => new c(o.CONFLICTING_SETTING, "'not null' and 'null' can not be set at the same time", h))), f.forEach((h) => {
            ue(h.value) || i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'not null' must not have a value", h.value || h.name));
          });
          break;
        case "null":
          f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "'null' can only appear once", h))), f.forEach((h) => {
            ue(h.value) || i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'null' must not have a value", h.value || h.name));
          });
          break;
        case "unique":
          f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "'unique' can only appear once", h))), f.forEach((h) => {
            h instanceof ie && !ue(h.value) && i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'unique' must not have a value", h.value || h.name));
          });
          break;
        case "increment":
          f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "'increment' can only appear once", h))), f.forEach((h) => {
            h instanceof ie && !ue(h.value) && i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'increment' must not have a value", h.value || h.name));
          });
          break;
        case "default":
          f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_TABLE_SETTING, "'default' can only appear once", h))), f.forEach((h) => {
            Fn(h.value) || i.push(new c(o.INVALID_TABLE_SETTING, "'default' must be a string literal, number literal, function expression, true, false or null", h.value || h.name));
          });
          break;
        default:
          f.forEach((h) => i.push(new c(o.UNKNOWN_COLUMN_SETTING, `Unknown column setting '${p}'`, h)));
      }
    }
    return i;
  }
  validateSubElements(e) {
    const n = e.flatMap((i) => {
      if (i.parent = this.declarationNode, !i.type)
        return [];
      const r = oe(i);
      return new r(i, this.publicSymbolTable, this.symbolFactory).validate();
    }), s = e.filter((i) => {
      var r;
      return ((r = i.type) == null ? void 0 : r.value.toLowerCase()) === "note";
    });
    return s.length > 1 && n.push(...s.map((i) => new c(o.NOTE_REDEFINED, "Duplicate notes are defined", i))), n;
  }
}
function Rn(t) {
  if (!(t instanceof Z || et(t) || t instanceof M || t instanceof he))
    return !1;
  if (t instanceof Z) {
    if (t.callee === void 0 || t.argumentList === void 0 || !t.argumentList.elementList.every((n) => fe(n) || Y(n) || me(n)))
      return !1;
    t = t.callee;
  }
  for (; t instanceof he; ) {
    if (t.array === void 0 || t.indexer === void 0 || !t.indexer.elementList.every((n) => !n.colon && !n.value && fe(n.name)))
      return !1;
    t = t.array;
  }
  const e = z(t).unwrap_or(void 0);
  return e !== void 0 && e.length > 0;
}
function Pn(t, e) {
  return e.length === 1 && t === e[0];
}
class Un {
  constructor(e, n, s) {
    this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
  }
  validate() {
    return [
      ...this.validateContext(),
      ...this.validateName(this.declarationNode.name),
      ...this.validateAlias(this.declarationNode.alias),
      ...this.validateSettingList(this.declarationNode.attributeList),
      ...this.registerElement(),
      ...this.validateBody(this.declarationNode.body)
    ];
  }
  validateContext() {
    return this.declarationNode.parent instanceof A ? [new c(
      o.INVALID_TABLEGROUP_CONTEXT,
      "TableGroup must appear top-level",
      this.declarationNode
    )] : [];
  }
  validateName(e) {
    return e ? ke(e) ? [] : [new c(
      o.INVALID_NAME,
      "A TableGroup name must be a single identifier",
      e
    )] : [new c(
      o.NAME_NOT_FOUND,
      "A TableGroup must have a name",
      this.declarationNode
    )];
  }
  validateAlias(e) {
    return e ? [new c(
      o.UNEXPECTED_ALIAS,
      "A TableGroup shouldn't have an alias",
      e
    )] : [];
  }
  registerElement() {
    const { name: e } = this.declarationNode;
    this.declarationNode.symbol = this.symbolFactory.create(on, { declaration: this.declarationNode, symbolTable: new ye() });
    const n = z(e);
    if (n.isOk()) {
      const s = n.unwrap(), i = s.pop(), r = tt(s, this.publicSymbolTable, this.symbolFactory), a = Ze(i);
      if (r.has(a))
        return [new c(o.DUPLICATE_NAME, `TableGroup name '${i}' already exists`, e)];
      r.set(a, this.declarationNode.symbol);
    }
    return [];
  }
  validateSettingList(e) {
    const n = C(e), s = n.getErrors(), i = n.getValue();
    return I.forIn(i, (r, a) => {
      switch (a) {
        case "color":
          r.length > 1 && s.push(...r.map((l) => new c(
            o.DUPLICATE_TABLE_SETTING,
            "'color' can only appear once",
            l
          ))), r.forEach((l) => {
            nt(l.value) || s.push(new c(
              o.INVALID_TABLE_SETTING,
              "'color' must be a color literal",
              l.value || l.name
            ));
          });
          break;
        case "note":
          r.length > 1 && s.push(...r.map((l) => new c(
            o.DUPLICATE_TABLE_SETTING,
            "'note' can only appear once",
            l
          ))), r.filter((l) => !Y(l.value)).forEach((l) => {
            s.push(new c(
              o.INVALID_TABLE_SETTING,
              "'note' must be a string literal",
              l.value || l.name
            ));
          });
          break;
        default:
          s.push(...r.map((l) => new c(
            o.INVALID_TABLE_SETTING,
            `Unknown '${a}' setting`,
            l
          )));
          break;
      }
    }), s;
  }
  validateBody(e) {
    if (!e)
      return [];
    if (e instanceof v)
      return [new c(
        o.UNEXPECTED_SIMPLE_BODY,
        "A TableGroup's body must be a block",
        e
      )];
    const [n, s] = I.partition(e.body, (i) => i instanceof v);
    return [
      ...this.validateFields(n),
      ...this.validateSubElements(s)
    ];
  }
  validateFields(e) {
    return e.flatMap((n) => {
      const s = [];
      return n.callee && !z(n.callee).isOk() && s.push(new c(o.INVALID_TABLEGROUP_FIELD, "A TableGroup field must be of the form <table> or <schema>.<table>", n.callee)), this.registerField(n), n.args.length > 0 && s.push(...n.args.map((i) => new c(o.INVALID_TABLEGROUP_FIELD, "A TableGroup field should only have a single Table name", i))), s;
    });
  }
  validateSubElements(e) {
    const n = e.flatMap((i) => {
      if (i.parent = this.declarationNode, !i.type)
        return [];
      const r = oe(i);
      return new r(i, this.publicSymbolTable, this.symbolFactory).validate();
    }), s = e.filter((i) => {
      var r;
      return ((r = i.type) == null ? void 0 : r.value.toLowerCase()) === "note";
    });
    return s.length > 1 && n.push(...s.map((i) => new c(o.NOTE_REDEFINED, "Duplicate notes are defined", i))), n;
  }
  registerField(e) {
    if (e.callee && V(e.callee)) {
      const n = W(e.callee).unwrap(), s = Ke(n), i = this.symbolFactory.create(ln, { declaration: e });
      e.symbol = i;
      const r = this.declarationNode.symbol.symbolTable;
      if (r.has(s)) {
        const a = r.get(s);
        return [
          new c(o.DUPLICATE_TABLEGROUP_FIELD_NAME, `${n} already exists in the group`, e),
          new c(o.DUPLICATE_TABLEGROUP_FIELD_NAME, `${n} already exists in the group`, a.declaration)
        ];
      }
      r.set(s, i);
    }
    return [];
  }
}
const xt = ["-", "+"];
function oe(t) {
  switch (t.type.value.toLowerCase()) {
    case b.Enum:
      return wn;
    case b.Table:
      return Dn;
    case b.TableGroup:
      return Un;
    case b.Project:
      return xn;
    case b.Ref:
      return Sn;
    case b.Note:
      return kn;
    case b.Indexes:
      return yn;
    default:
      return vn;
  }
}
function St(t) {
  return !!z(t).unwrap_or(!1);
}
function Mn(t) {
  return ke(t);
}
function ke(t) {
  return t instanceof M && t.expression instanceof te;
}
function tt(t, e, n) {
  var i;
  t[0] === "public" && (t = t.slice(1));
  let s = e;
  for (const r of t) {
    let a;
    const l = Qe(r);
    if (s.has(l)) {
      if (a = (i = s.get(l)) == null ? void 0 : i.symbolTable, !a)
        throw new Error("Expect a symbol table in a schema symbol");
    } else {
      a = new ye();
      const p = n.create(wt, { symbolTable: a });
      s.set(l, p);
    }
    s = a;
  }
  return s;
}
function Ot(t) {
  return t === "-" || t === "<>" || t === ">" || t === "<";
}
function nt(t) {
  var n;
  if (!(t instanceof M) || !(t.expression instanceof be) || ((n = t.expression.literal) == null ? void 0 : n.kind) !== u.COLOR_LITERAL)
    return !1;
  const e = t.expression.literal.value;
  if (e.length !== 4 && e.length !== 7 || e[0] !== "#")
    return !1;
  for (let s = 1; s < e.length; s += 1)
    if (!tn(e[s]))
      return !1;
  return !0;
}
function ue(t) {
  return t === void 0;
}
function Fn(t) {
  var e;
  return !!(Y(t) || fe(t) || me(t) && ["true", "false", "null"].includes(t.expression.variable.value.toLowerCase()) || t instanceof H && xt.includes((e = t.op) == null ? void 0 : e.value) && fe(t.expression) || t instanceof se);
}
function fe(t) {
  var e;
  return t instanceof M && t.expression instanceof be && ((e = t.expression.literal) == null ? void 0 : e.kind) === u.NUMERIC_LITERAL;
}
function Bn(t) {
  var n;
  if (!(t instanceof H) || !Ot((n = t.op) == null ? void 0 : n.value))
    return !1;
  const e = z(t.expression).unwrap_or(void 0);
  return e !== void 0 && e.length > 0;
}
function Dt(t) {
  return t instanceof ee && t.elementList.every(V);
}
function C(t) {
  var s;
  const e = {}, n = [];
  if (!t)
    return new X({});
  for (const i of t.elementList) {
    if (!i.name)
      continue;
    if (i.name instanceof M) {
      n.push(new c(o.INVALID_SETTINGS, "A setting name must be a stream of identifiers", i.name));
      continue;
    }
    const r = (s = Te(i.name).unwrap_or(void 0)) == null ? void 0 : s.toLowerCase();
    r && (e[r] === void 0 ? e[r] = [i] : e[r].push(i));
  }
  return new X(e, n);
}
class Et {
  constructor(e, n) {
    this.ast = e, this.symbolFactory = n, this.publicSchemaSymbol = this.symbolFactory.create(wt, {
      symbolTable: new ye()
    }), this.ast.symbol = this.publicSchemaSymbol, this.ast.symbol.declaration = this.ast;
  }
  validate() {
    const e = [];
    this.ast.body.forEach((s) => {
      if (s.parent = this.ast, s.type === void 0)
        return;
      const i = oe(s), r = new i(
        s,
        this.publicSchemaSymbol.symbolTable,
        this.symbolFactory
      );
      e.push(...r.validate());
    });
    const n = this.ast.body.filter((s) => we(s).unwrap_or(void 0) === b.Project);
    return n.length > 1 && n.forEach((s) => e.push(new c(o.PROJECT_REDEFINED, "Only one project can exist", s))), new X(this.ast, e);
  }
}
class le {
  constructor(e, n) {
    this.declarationNode = e, this.errors = n;
  }
  bind() {
    this.bindSettingList(this.declarationNode.attributeList, this.settingList), this.bindBody();
  }
  bindSettingList(e, n) {
    if (e)
      for (const s of e.elementList) {
        if (s.name instanceof M)
          continue;
        const i = Te(s.name).unwrap_or(void 0);
        if (!i)
          continue;
        const r = n[i.toLowerCase()];
        r != null && r.shouldBind && this.scanAndBind(s.value, r);
      }
  }
  bindBody() {
    const e = this.declarationNode;
    if (!e.body)
      return;
    const { body: n } = e;
    if (n instanceof K)
      for (const s of n.body)
        if (s instanceof A) {
          if (!s.type)
            continue;
          const i = Rt(s);
          new i(s, this.errors).bind();
        } else
          this.bindSubfield(s);
    else
      this.bindSubfield(n);
  }
  bindSubfield(e) {
    const n = [e.callee, ...e.args], s = I.last(n);
    s instanceof R && (n.pop(), this.bindSettingList(s, this.subfield.settingList));
    const { argBinderRules: i } = this.subfield.arg;
    for (let r = 0; r < Math.min(n.length, i.length); r += 1)
      i[r].shouldBind && this.scanAndBind(n[r], i[r]);
  }
  // Scan for variable node and member access expression in the node to bind
  scanAndBind(e, n) {
    var s, i;
    if (e)
      if (e instanceof M) {
        if (e.expression instanceof te && ((i = n.keywords) != null && i.includes((s = e.expression.variable) == null ? void 0 : s.value.toLowerCase())))
          return;
        this.bindFragments([e], n);
      } else
        e instanceof J ? et(e) ? this.bindFragments(pe(e).unwrap_or([]), n) : (this.scanAndBind(e.leftExpression, n), this.scanAndBind(e.rightExpression, n)) : e instanceof H ? this.scanAndBind(e.expression, n) : e instanceof Me ? this.scanAndBind(e.expression, n) : e instanceof ee && e.elementList.forEach((r) => this.scanAndBind(r, n));
  }
  // Bind the fragments of a member access expression
  // which can be a simple expression like v1.User,
  // or a complex tuple like v1.User.(id, name)
  bindFragments(e, n) {
    if (e.length === 0)
      return;
    const s = [...n.topSubnamesSymbolKind], { remainingSubnamesSymbolKind: i } = n, r = e.findIndex((h) => !V(h)), l = r !== -1 && Dt(e[r]) ? e[r] : void 0, p = r >= 0 ? s.pop() : void 0, f = e.slice(
      0,
      r === -1 ? void 0 : r
    );
    if (f.length === 0)
      return;
    const E = [];
    for (; s.length && f.length; ) {
      const h = s.pop(), m = f.pop(), g = W(m).unwrap();
      E.unshift({
        index: Ce(g, h),
        referrer: m
      });
    }
    for (; f.length; ) {
      const h = f.pop(), m = W(h).unwrap();
      E.unshift({
        index: Ce(m, i),
        referrer: h
      });
    }
    return l ? l.elementList.forEach(
      (h) => this.resolveIndexStack(
        [
          ...E,
          {
            index: Ce(
              W(h).unwrap(),
              p
            ),
            referrer: h
          }
        ],
        n.ignoreNameNotFound
      )
    ) : this.resolveIndexStack(E, n.ignoreNameNotFound);
  }
  // Looking up the indexes in the subname stack from the current declaration node
  // Each time the index resolves to a symbol, the referrer's symbol is bound to it
  resolveIndexStack(e, n) {
    if (e.length === 0)
      throw new Error("Unreachable - An unresolved name must have at least one name component");
    const [s, ...i] = e, r = An(s.index, this.declarationNode);
    if (r === void 0) {
      const { kind: f, name: E } = re(s.index).unwrap();
      this.logError(s.referrer, `Can not find ${f} '${E}'`, n);
      return;
    }
    r.references.push(s.referrer), s.referrer.referee = r;
    let a = r.symbolTable, { kind: l, name: p } = re(s.index).unwrap();
    for (const f of i) {
      const { kind: E, name: h } = re(f.index).unwrap(), m = a.get(f.index);
      if (!m) {
        this.logError(
          f.referrer,
          `${l} '${p}' does not have ${E} '${h}'`,
          n
        );
        return;
      }
      if (l = E, p = h, f.referrer.referee = m, m.references.push(f.referrer), !m.symbolTable)
        break;
      a = m.symbolTable;
    }
  }
  logError(e, n, s) {
    s || this.errors.push(new c(o.BINDING_ERROR, n, e));
  }
}
class Vn extends le {
  constructor() {
    super(...arguments), this.subfield = {
      arg: {
        argBinderRules: []
      },
      settingList: {}
    }, this.settingList = {};
  }
}
class Gn extends le {
  constructor() {
    super(...arguments), this.subfield = {
      arg: {
        argBinderRules: [{ shouldBind: !1 }]
      },
      settingList: {}
    }, this.settingList = {};
  }
}
class Cn extends le {
  constructor() {
    super(...arguments), this.subfield = {
      arg: {
        argBinderRules: [
          {
            shouldBind: !0,
            topSubnamesSymbolKind: [T.Table, T.Column],
            remainingSubnamesSymbolKind: T.Schema,
            ignoreNameNotFound: !1
          },
          {
            shouldBind: !0,
            topSubnamesSymbolKind: [T.Table, T.Column],
            remainingSubnamesSymbolKind: T.Schema,
            ignoreNameNotFound: !1
          },
          {
            shouldBind: !0,
            topSubnamesSymbolKind: [T.Table, T.Column],
            remainingSubnamesSymbolKind: T.Schema,
            ignoreNameNotFound: !1
          },
          {
            shouldBind: !0,
            topSubnamesSymbolKind: [T.Table, T.Column],
            remainingSubnamesSymbolKind: T.Schema,
            ignoreNameNotFound: !1
          }
        ]
      },
      settingList: {}
    }, this.settingList = {};
  }
}
class Xn extends le {
  constructor() {
    super(...arguments), this.subfield = {
      arg: {
        argBinderRules: [{ shouldBind: !1 }]
      },
      settingList: {}
    }, this.settingList = {};
  }
}
class $n extends le {
  constructor() {
    super(...arguments), this.subfield = {
      arg: {
        argBinderRules: []
      },
      settingList: {}
    }, this.settingList = {};
  }
}
class Wn extends le {
  constructor() {
    super(...arguments), this.subfield = {
      arg: {
        argBinderRules: [
          {
            shouldBind: !0,
            topSubnamesSymbolKind: [T.Table, T.Column],
            remainingSubnamesSymbolKind: T.Schema,
            ignoreNameNotFound: !1
          }
        ]
      },
      settingList: {}
    }, this.settingList = {};
  }
}
class jn extends le {
  constructor() {
    super(...arguments), this.subfield = {
      arg: {
        argBinderRules: [
          { shouldBind: !1 },
          {
            shouldBind: !0,
            topSubnamesSymbolKind: [T.Enum],
            remainingSubnamesSymbolKind: T.Schema,
            ignoreNameNotFound: !0
          }
        ]
      },
      settingList: {
        ref: {
          shouldBind: !0,
          topSubnamesSymbolKind: [T.Table, T.Column],
          remainingSubnamesSymbolKind: T.Schema,
          ignoreNameNotFound: !1
        },
        default: {
          shouldBind: !1
        }
      }
    }, this.settingList = {};
  }
}
class Yn extends le {
  constructor() {
    super(...arguments), this.subfield = {
      arg: {
        argBinderRules: [
          {
            shouldBind: !0,
            topSubnamesSymbolKind: [T.Table],
            remainingSubnamesSymbolKind: T.Schema,
            ignoreNameNotFound: !1
          }
        ]
      },
      settingList: {}
    }, this.settingList = {};
  }
}
function Rt(t) {
  switch (t.type.value.toLowerCase()) {
    case b.Enum:
      return Gn;
    case b.Table:
      return jn;
    case b.TableGroup:
      return Yn;
    case b.Project:
      return $n;
    case b.Ref:
      return Wn;
    case b.Note:
      return Xn;
    case b.Indexes:
      return Cn;
    default:
      return Vn;
  }
}
class zn {
  constructor(e) {
    this.ast = e, this.errors = [];
  }
  resolve() {
    for (const e of this.ast.body)
      if (e.type) {
        const n = Rt(e);
        new n(e, this.errors).bind();
      }
    return new X(this.ast, this.errors);
  }
}
class Qn {
  constructor(e) {
    this.generator = e;
  }
  create(e, n) {
    return new e(n, this.generator.nextId());
  }
}
class qn {
  constructor(e, n) {
    this.ast = e, this.symbolFactory = new Qn(n);
  }
  // Analyzing: Invoking both the validator and binder
  analyze() {
    return new Et(this.ast, this.symbolFactory).validate().chain((n) => new zn(n).resolve());
  }
  // For invoking the validator only
  validate() {
    return new Et(this.ast, this.symbolFactory).validate().chain((n) => new X(n, []));
  }
}
function Nt(t, e) {
  const { variables: n, tupleElements: s } = Ae(t).unwrap();
  return s ? n.length === 0 ? {
    schemaName: e.schemaName,
    tableName: e.name,
    fieldNames: s
  } : {
    tableName: n.pop(),
    schemaName: n.pop() || null,
    fieldNames: s
  } : n.length === 1 ? {
    schemaName: e.schemaName,
    tableName: e.name,
    fieldNames: [n[0]]
  } : {
    fieldNames: [n.pop()],
    tableName: n.pop(),
    schemaName: n.pop() || null
  };
}
function Pt(t) {
  switch (t) {
    case "<":
      return ["1", "*"];
    case "<>":
      return ["*", "*"];
    case ">":
      return ["*", "1"];
    case "-":
      return ["1", "1"];
  }
  throw new Error("Invalid relation op");
}
function _(t) {
  return {
    start: {
      offset: t.startPos.offset,
      line: t.startPos.line + 1,
      column: t.startPos.column + 1
    },
    end: { offset: t.endPos.offset, line: t.endPos.line + 1, column: t.endPos.column + 1 }
  };
}
function Ye(t) {
  var n;
  const e = (n = pe(t).unwrap_or(void 0)) == null ? void 0 : n.pop();
  return e instanceof ee ? e.elementList.map((s) => s.referee) : [e.referee];
}
function Ie(t) {
  const e = z(t).unwrap();
  return {
    name: e.pop(),
    schemaName: e
  };
}
function Be(t) {
  return t.expression.literal.value;
}
function Ut(t, e) {
  if (Array.isArray(t)) {
    const i = t.map(({ id: a }) => a).sort().join(","), r = e.map(({ id: a }) => a).sort().join(",");
    return i < r ? `${i}-${r}` : `${r}-${i}`;
  }
  const n = t.id.toString(), s = e.id.toString();
  return n < s ? `${n}-${s}` : `${s}-${n}`;
}
function Mt(t, e) {
  if (Array.isArray(t)) {
    const i = t.map(({ id: a }) => a).sort(), r = e.map(({ id: a }) => a).sort();
    return I.zip(i, r).every(([a, l]) => a === l);
  }
  const n = t.id, s = e.id;
  return n === s;
}
function ae(t) {
  const e = t.split(`
`), n = e.slice(e.findIndex((r) => r.trimStart() !== "")), s = n.filter((r) => r.trimStart()), i = Math.min(...s.map((r) => r.length - r.trimStart().length));
  return n.map((r) => r.slice(i)).join(`
`);
}
class Ft {
  constructor(e, n) {
    this.declarationNode = e, this.env = n, this.table = { name: void 0, schemaName: void 0, alias: null, fields: [], token: void 0, indexes: [] }, this.pkColumns = [];
  }
  interpret() {
    this.table.token = _(this.declarationNode), this.env.tables.set(this.declarationNode, this.table);
    const e = [
      ...this.interpretName(this.declarationNode.name),
      ...this.interpretAlias(this.declarationNode.alias),
      ...this.interpretSettingList(this.declarationNode.attributeList),
      ...this.interpretBody(this.declarationNode.body)
    ];
    return this.pkColumns.length >= 2 && (this.table.indexes.push({
      columns: this.pkColumns.map(({ name: n, token: s }) => ({ value: n, type: "column", token: s })),
      token: {
        start: { offset: -1, line: -1, column: -1 },
        // do not make sense to have a meaningful start (?)
        end: { offset: -1, line: -1, column: -1 }
        // do not make sense to have a meaningful end (?)
      },
      pk: !0
    }), this.pkColumns.forEach((n) => n.pk = !1)), e;
  }
  interpretName(e) {
    const { name: n, schemaName: s } = Ie(e);
    return s.length > 1 ? (this.table.name = n, this.table.schemaName = s.join("."), [new c(o.UNSUPPORTED, "Nested schema is not supported", e)]) : (this.table.name = n, this.table.schemaName = s.length ? s[0] : null, []);
  }
  interpretAlias(e) {
    if (!e)
      return [];
    const n = W(e).unwrap_or(null);
    return n && (this.env.aliases.push({
      name: n,
      kind: "table",
      value: {
        tableName: this.table.name,
        schemaName: this.table.schemaName
      }
    }), this.table.alias = n), [];
  }
  interpretSettingList(e) {
    var i, r, a;
    const n = C(e).getValue();
    this.table.headerColor = (i = n.headercolor) != null && i.length ? Be((a = (r = n.headercolor) == null ? void 0 : r.at(0)) == null ? void 0 : a.value) : void 0;
    const [s] = n.note || [];
    return this.table.note = s && {
      value: $(s == null ? void 0 : s.value).map(ae).unwrap(),
      token: _(s)
    }, [];
  }
  interpretBody(e) {
    const [n, s] = I.partition(e.body, (i) => i instanceof v);
    return [...this.interpretFields(n), ...this.interpretSubElements(s)];
  }
  interpretSubElements(e) {
    return e.flatMap((n) => {
      var s;
      switch ((s = n.type) == null ? void 0 : s.value.toLowerCase()) {
        case "note":
          return this.table.note = {
            value: $(n.body instanceof K ? n.body.body[0].callee : n.body.callee).map(ae).unwrap(),
            token: _(n)
          }, [];
        case "indexes":
          return this.interpretIndexes(n);
      }
      return [];
    });
  }
  interpretFields(e) {
    return e.flatMap((n) => this.interpretColumn(n));
  }
  interpretColumn(e) {
    var a, l, p, f, E, h, m, g, P;
    const n = [], s = {};
    s.name = W(e.callee).unwrap();
    const i = Hn(e.args[0]);
    s.type = i.getValue(), n.push(...i.getErrors()), s.token = _(e), s.inline_refs = [];
    const r = e.args.slice(1);
    if (I.last(r) instanceof R) {
      const S = C(r.pop()).getValue();
      s.pk = !!((a = S.pk) != null && a.length) || !!((l = S["primary key"]) != null && l.length), s.increment = !!((p = S.increment) != null && p.length), s.unique = !!((f = S.unique) != null && f.length), s.not_null = (E = S["not null"]) != null && E.length ? !0 : (h = S.null) != null && h.length ? !1 : void 0, s.dbdefault = Jn((g = (m = S.default) == null ? void 0 : m.at(0)) == null ? void 0 : g.value);
      const F = (P = S.note) == null ? void 0 : P.at(0);
      s.note = F && {
        value: $(F.value).map(ae).unwrap(),
        token: _(F)
      };
      const Le = S.ref || [];
      s.inline_refs = Le.flatMap((B) => {
        const [rt] = Ye(B.value.expression);
        if (Mt(rt, e.symbol))
          return n.push(new c(o.SAME_ENDPOINT, "Two endpoints are the same", B)), [];
        const xe = B.value.op, ne = z(B.value.expression).unwrap();
        let de;
        if (ne.length === 1) {
          const [ce] = ne;
          de = {
            schemaName: this.table.schemaName,
            tableName: this.table.name,
            fieldNames: [ce],
            relation: xe.value,
            token: _(B)
          };
        } else if (ne.length === 2) {
          const [ce, ge] = ne;
          de = {
            schemaName: null,
            tableName: ce,
            fieldNames: [ge],
            relation: xe.value,
            token: _(B)
          };
        } else if (ne.length === 3) {
          const [ce, ge, ot] = ne;
          de = {
            schemaName: ce,
            tableName: ge,
            fieldNames: [ot],
            relation: xe.value,
            token: _(B)
          };
        } else {
          n.push(new c(o.UNSUPPORTED, "Nested schema is not supported", B));
          const ce = ne.pop(), ge = ne.pop();
          de = {
            schemaName: ne.join("."),
            tableName: ge,
            fieldNames: [ce],
            relation: xe.value,
            token: _(B)
          };
        }
        const at = this.registerInlineRefToEnv(e, rt, de, B);
        return n.push(...at), at.length === 0 ? de : [];
      });
    }
    return s.pk || (s.pk = r.some((S) => Q(S).unwrap().toLowerCase() === "pk")), s.unique || (s.unique = r.some((S) => Q(S).unwrap().toLowerCase() === "unique")), this.table.fields.push(s), s.pk && this.pkColumns.push(s), n;
  }
  interpretIndexes(e) {
    return this.table.indexes.push(...e.body.body.map((n) => {
      var a, l, p, f, E, h, m;
      const s = { columns: [] }, i = n;
      s.token = _(i);
      const r = [i.callee, ...i.args];
      if (I.last(r) instanceof R) {
        const g = C(r.pop()).getValue();
        s.pk = !!((a = g.pk) != null && a.length), s.unique = !!((l = g.unique) != null && l.length), s.name = $((f = (p = g.name) == null ? void 0 : p.at(0)) == null ? void 0 : f.value).unwrap_or(void 0);
        const P = (E = g.note) == null ? void 0 : E.at(0);
        s.note = P && {
          value: $(P.value).unwrap(),
          token: _(P)
        }, s.type = Q((m = (h = g.type) == null ? void 0 : h.at(0)) == null ? void 0 : m.value).unwrap_or(void 0);
      }
      return r.flatMap((g) => {
        if (!(g instanceof Z))
          return g;
        const P = [];
        for (; g instanceof Z; )
          P.push(g.argumentList), g = g.callee;
        return P.push(g), P;
      }).forEach((g) => {
        const { functional: P, nonFunctional: S } = je(g).unwrap();
        s.columns.push(
          ...P.map((F) => ({
            value: F.value.value,
            type: "expression",
            token: _(F)
          })),
          ...S.map((F) => ({
            value: W(F).unwrap(),
            type: "column",
            token: _(F)
          }))
        );
      }), s;
    })), [];
  }
  registerInlineRefToEnv(e, n, s, i) {
    const r = Ut(e.symbol, n);
    if (this.env.refIds[r])
      return [
        new c(o.CIRCULAR_REF, "References with same endpoints exist", i),
        new c(o.CIRCULAR_REF, "References with same endpoints exist", this.env.refIds[r])
      ];
    const a = Pt(s.relation);
    return this.env.refIds[r] = i, this.env.ref.set(i, {
      name: null,
      schemaName: null,
      token: s.token,
      endpoints: [
        {
          ...s,
          relation: a[1]
        },
        {
          schemaName: this.table.schemaName,
          tableName: this.table.name,
          fieldNames: [Q(e.callee).unwrap()],
          token: _(e),
          relation: a[0]
        }
      ]
    }), [];
  }
}
function Hn(t) {
  let e = null;
  t instanceof Z && (e = t.argumentList.elementList.map((r) => fe(r) ? r.expression.literal.value : Y(r) ? $(r).unwrap() : Q(r).unwrap()).join(","), t = t.callee);
  let n = "";
  for (; t instanceof he; )
    n = `[${t.indexer.elementList.map((r) => r.name.expression.literal.value).join(",")}]${n}`, t = t.array;
  const { name: s, schemaName: i } = Ie(t);
  return i.length > 1 ? new X(
    {
      schemaName: i.length === 0 ? null : i[0],
      type_name: `${s}${n}${e ? `(${e})` : ""}`,
      args: e
    },
    [new c(o.UNSUPPORTED, "Nested schema is not supported", t)]
  ) : new X({
    schemaName: i.length === 0 ? null : i[0],
    type_name: `${s}${n}${e ? `(${e})` : ""}`,
    args: e
  });
}
function Jn(t) {
  var e, n, s;
  if (t) {
    if (Y(t))
      return {
        value: $(t).unwrap(),
        type: "string"
      };
    if (fe(t))
      return {
        type: "number",
        value: Number.parseFloat(t.expression.literal.value)
      };
    if (me(t))
      return {
        value: t.expression.variable.value.toLowerCase(),
        type: "boolean"
      };
    if (t instanceof H && xt.includes((e = t.op) == null ? void 0 : e.value) && fe(t.expression)) {
      const i = Number.parseFloat(t.expression.expression.literal.value);
      return {
        value: ((n = t.op) == null ? void 0 : n.value) === "-" ? 0 - i : i,
        type: "number"
      };
    }
    if (t instanceof se)
      return {
        value: (s = t.value) == null ? void 0 : s.value,
        type: "expression"
      };
    throw new Error("Unreachable");
  }
}
class Zn {
  constructor(e, n) {
    this.declarationNode = e, this.env = n, this.note = { name: void 0, content: void 0, token: void 0 };
  }
  interpret() {
    return this.note.token = _(this.declarationNode), this.env.notes.set(this.declarationNode, this.note), [
      ...this.interpretName(this.declarationNode.name),
      ...this.interpretSettingList(this.declarationNode.attributeList),
      ...this.interpretBody(this.declarationNode.body)
    ];
  }
  interpretName(e) {
    const { name: n } = Ie(e);
    return this.note.name = n, [];
  }
  interpretSettingList(e) {
    var s, i, r;
    const n = C(e).getValue();
    return this.note.headerColor = (s = n.headercolor) != null && s.length ? Be((r = (i = n.headercolor) == null ? void 0 : i.at(0)) == null ? void 0 : r.value) : void 0, [];
  }
  interpretBody(e) {
    const [n, s] = I.partition(e.body, (i) => i instanceof v);
    return n.length !== 1 || s.length > 0 ? [
      new c(o.INVALID_NOTE, "Invalid note syntax", e)
    ] : [...this.interpretNote(n[0])];
  }
  interpretNote(e) {
    const n = I.get(e, "callee.expression.literal.value", "");
    return this.note.content = ae(n), [];
  }
}
class Bt {
  constructor(e, n) {
    this.declarationNode = e, this.env = n, this.container = this.declarationNode.parent instanceof A ? this.env.tables.get(this.declarationNode.parent) : void 0, this.ref = {};
  }
  interpret() {
    return this.ref.token = _(this.declarationNode), this.env.ref.set(this.declarationNode, this.ref), [
      ...this.interpretName(this.declarationNode.name),
      ...this.interpretBody(this.declarationNode.body)
    ];
  }
  interpretName(e) {
    const n = [], s = z(this.declarationNode.name).unwrap_or([]);
    return this.ref.name = s.pop() || null, s.length > 1 && n.push(new c(o.UNSUPPORTED, "Nested schema is not supported", this.declarationNode.name)), this.ref.schemaName = s.join(".") || null, n;
  }
  interpretBody(e) {
    return e instanceof v ? this.interpretField(e) : this.interpretField(e.body[0]);
  }
  interpretField(e) {
    var f, E, h, m, g, P, S;
    const n = e.callee.op.value, { leftExpression: s, rightExpression: i } = e.callee, r = Ye(s), a = Ye(i);
    if (Mt(r, a))
      return [new c(o.SAME_ENDPOINT, "Two endpoints are the same", e)];
    const l = Ut(r, a);
    if (this.env.refIds[l])
      return [
        new c(o.CIRCULAR_REF, "References with same endpoints exist", this.declarationNode),
        new c(o.CIRCULAR_REF, "References with same endpoints exist", this.env.refIds[l])
      ];
    if (e.args[0]) {
      const F = C(e.args[0]).getValue(), Le = (E = (f = F.delete) == null ? void 0 : f.at(0)) == null ? void 0 : E.value;
      this.ref.onDelete = Le instanceof q ? Te(Le).unwrap_or(void 0) : Q(Le).unwrap_or(void 0);
      const B = (m = (h = F.update) == null ? void 0 : h.at(0)) == null ? void 0 : m.value;
      this.ref.onUpdate = B instanceof q ? Te(B).unwrap_or(void 0) : Q(B).unwrap_or(void 0), this.ref.color = (g = F.color) != null && g.length ? Be((S = (P = F.color) == null ? void 0 : P.at(0)) == null ? void 0 : S.value) : void 0;
    }
    const p = Pt(n);
    return this.ref.endpoints = [
      {
        ...Nt(s, this.container),
        relation: p[0],
        token: _(s)
      },
      {
        ...Nt(i, this.container),
        relation: p[1],
        token: _(i)
      }
    ], this.env.refIds[l] = this.declarationNode, [];
  }
}
class Vt {
  constructor(e, n) {
    this.declarationNode = e, this.env = n, this.tableGroup = { tables: [] };
  }
  interpret() {
    const e = [];
    return this.tableGroup.token = _(this.declarationNode), this.env.tableGroups.set(this.declarationNode, this.tableGroup), e.push(
      ...this.interpretName(this.declarationNode.name),
      ...this.interpretSettingList(this.declarationNode.attributeList),
      ...this.interpretBody(this.declarationNode.body)
    ), e;
  }
  interpretName(e) {
    const n = [], { name: s, schemaName: i } = Ie(e);
    return i.length >= 2 && (this.tableGroup.name = s, this.tableGroup.schemaName = i.join("."), n.push(new c(o.UNSUPPORTED, "Nested schema is not supported", this.declarationNode.name))), this.tableGroup.name = s, this.tableGroup.schemaName = i[0] || null, n;
  }
  interpretBody(e) {
    const [n, s] = zt(e.body, (i) => i instanceof v);
    return [
      ...this.interpretFields(n),
      ...this.interpretSubElements(s)
    ];
  }
  interpretSubElements(e) {
    return e.flatMap((n) => {
      var s;
      switch ((s = n.type) == null ? void 0 : s.value.toLowerCase()) {
        case "note":
          this.tableGroup.note = {
            value: $(
              n.body instanceof K ? n.body.body[0].callee : n.body.callee
            ).map(ae).unwrap(),
            token: _(n)
          };
          break;
      }
      return [];
    });
  }
  interpretFields(e) {
    const n = [];
    return this.tableGroup.tables = e.map((s) => {
      const i = z(s.callee).unwrap();
      i.length > 2 && n.push(new c(o.UNSUPPORTED, "Nested schema is not supported", s));
      const r = pe(s.callee).unwrap().pop().referee.id;
      if (this.env.groupOfTable[r]) {
        const a = this.env.groupOfTable[r], { schemaName: l, name: p } = this.env.tableGroups.get(a), f = l ? `${l}.${p}` : p;
        n.push(new c(o.TABLE_REAPPEAR_IN_TABLEGROUP, `Table "${i.join(".")}" already appears in group "${f}"`, s));
      } else
        this.env.groupOfTable[r] = this.declarationNode;
      return {
        name: i.pop(),
        schemaName: i.join(".")
      };
    }), n;
  }
  interpretSettingList(e) {
    var i, r, a;
    const n = C(e).getValue();
    this.tableGroup.color = (i = n.color) != null && i.length ? Be((a = (r = n.color) == null ? void 0 : r.at(0)) == null ? void 0 : a.value) : void 0;
    const [s] = n.note || [];
    return this.tableGroup.note = s && {
      value: $(s == null ? void 0 : s.value).map(ae).unwrap(),
      token: _(s)
    }, [];
  }
}
class Gt {
  constructor(e, n) {
    this.declarationNode = e, this.env = n, this.enum = { values: [] };
  }
  interpret() {
    return this.enum.token = _(this.declarationNode), this.env.enums.set(this.declarationNode, this.enum), [...this.interpretName(this.declarationNode.name), ...this.interpretBody(this.declarationNode.body)];
  }
  interpretName(e) {
    const { name: n, schemaName: s } = Ie(e);
    return s.length > 1 ? (this.enum.name = n, this.enum.schemaName = s.join("."), [new c(o.UNSUPPORTED, "Nested schema is not supported", e)]) : (this.enum.name = n, this.enum.schemaName = s.length ? s[0] : null, []);
  }
  interpretBody(e) {
    return e.body.flatMap((n) => {
      var l;
      const s = n, i = {};
      i.token = _(s), i.name = Q(s.callee).unwrap();
      const a = (l = C(s.args[0]).getValue().note) == null ? void 0 : l.at(0);
      return i.note = a && {
        value: $(a.value).map(ae).unwrap(),
        token: _(a)
      }, this.enum.values.push(i), [];
    });
  }
}
class Kn {
  constructor(e, n) {
    this.declarationNode = e, this.env = n, this.project = { enums: [], refs: [], tableGroups: [], tables: [] };
  }
  interpret() {
    return this.env.project.set(this.declarationNode, this.project), this.project.token = _(this.declarationNode), [...this.interpretName(this.declarationNode.name), ...this.interpretBody(this.declarationNode.body)];
  }
  interpretName(e) {
    if (!e)
      return this.project.name = null, [];
    const { name: n } = Ie(e);
    return this.project.name = n, [];
  }
  interpretBody(e) {
    return e.body.flatMap((n) => {
      var i;
      const s = n;
      switch ((i = s.type) == null ? void 0 : i.value.toLowerCase()) {
        case "table": {
          const r = new Ft(s, this.env).interpret();
          return this.project.tables.push(this.env.tables.get(s)), r;
        }
        case "ref": {
          const r = new Bt(s, this.env).interpret();
          return this.project.refs.push(this.env.ref.get(s)), r;
        }
        case "tablegroup": {
          const r = new Vt(s, this.env).interpret();
          return this.project.tableGroups.push(this.env.tableGroups.get(s)), r;
        }
        case "enum": {
          const r = new Gt(s, this.env).interpret();
          return this.project.enums.push(this.env.enums.get(s)), r;
        }
        case "note":
          return this.project.note = {
            value: $(s.body instanceof K ? s.body.body[0].callee : s.body.callee).map(ae).unwrap(),
            token: _(s)
          }, [];
        default:
          return this.project[s.type.value.toLowerCase()] = $(s.body.callee).unwrap(), [];
      }
    });
  }
}
class es {
  constructor(e) {
    this.ast = e, this.env = {
      schema: [],
      tables: /* @__PURE__ */ new Map(),
      notes: /* @__PURE__ */ new Map(),
      refIds: {},
      ref: /* @__PURE__ */ new Map(),
      enums: /* @__PURE__ */ new Map(),
      tableGroups: /* @__PURE__ */ new Map(),
      groupOfTable: {},
      aliases: [],
      project: /* @__PURE__ */ new Map()
    };
  }
  interpret() {
    const e = this.ast.body.flatMap((n) => {
      switch (we(n).unwrap_or(void 0)) {
        case b.Table:
          return new Ft(n, this.env).interpret();
        case b.Note:
          return new Zn(n, this.env).interpret();
        case b.Ref:
          return new Bt(n, this.env).interpret();
        case b.TableGroup:
          return new Vt(n, this.env).interpret();
        case b.Enum:
          return new Gt(n, this.env).interpret();
        case b.Project:
          return new Kn(n, this.env).interpret();
        default:
          return [];
      }
    });
    return new X(ts(this.env), e);
  }
}
function ts(t) {
  return {
    schemas: [],
    tables: Array.from(t.tables.values()),
    notes: Array.from(t.notes.values()),
    refs: Array.from(t.ref.values()),
    enums: Array.from(t.enums.values()),
    tableGroups: Array.from(t.tableGroups.values()),
    aliases: t.aliases,
    project: Array.from(t.project.values())[0] || {}
  };
}
var L = /* @__PURE__ */ ((t) => (t[t.Function = 1] = "Function", t[t.Constructor = 2] = "Constructor", t[t.Field = 3] = "Field", t[t.Variable = 4] = "Variable", t[t.Class = 5] = "Class", t[t.Struct = 6] = "Struct", t[t.Interface = 7] = "Interface", t[t.Module = 8] = "Module", t[t.Property = 9] = "Property", t[t.Event = 10] = "Event", t[t.Operator = 11] = "Operator", t[t.Unit = 12] = "Unit", t[t.Value = 13] = "Value", t[t.Constant = 14] = "Constant", t[t.Enum = 15] = "Enum", t[t.EnumMember = 16] = "EnumMember", t[t.Keyword = 17] = "Keyword", t[t.Text = 18] = "Text", t[t.Color = 19] = "Color", t[t.File = 20] = "File", t[t.Reference = 21] = "Reference", t[t.Customcolor = 22] = "Customcolor", t[t.Folder = 23] = "Folder", t[t.TypeParameter = 24] = "TypeParameter", t[t.User = 25] = "User", t[t.Issue = 26] = "Issue", t[t.Snippet = 27] = "Snippet", t))(L || {}), w = /* @__PURE__ */ ((t) => (t[t.None = 0] = "None", t[t.KeepWhitespace = 1] = "KeepWhitespace", t[t.InsertAsSnippet = 4] = "InsertAsSnippet", t))(w || {});
function ve(t) {
  switch (t) {
    case T.Schema:
      return L.Module;
    case T.Table:
      return L.Class;
    case T.Column:
      return L.Field;
    case T.Enum:
      return L.Enum;
    case T.EnumField:
      return L.EnumMember;
    case T.TableGroup:
      return L.Struct;
    case T.TableGroupField:
      return L.Field;
    default:
      return L.Text;
  }
}
function Pe(t, e) {
  if (!t || We(t))
    return !1;
  for (const n of t.trailingTrivia) {
    if (n.start > e)
      break;
    if (n.kind === u.NEWLINE && n.end <= e)
      return !1;
  }
  return !0;
}
function D() {
  return {
    suggestions: []
  };
}
function Ue(t) {
  return {
    ...t,
    suggestions: t.suggestions.map((e) => ({
      ...e,
      insertText: ` ${e.insertText}`
    }))
  };
}
function Ve(t) {
  return {
    ...t,
    suggestions: t.suggestions.map((e) => ({
      ...e,
      insertText: e.insertText.split("").every(Fe) ? e.insertText : `"${e.insertText}"`
    }))
  };
}
function st(t, e) {
  return t.getOffsetAt(e);
}
class Ct {
  constructor(e, n = []) {
    this.compiler = e, this.triggerCharacters = n;
  }
  provideCompletionItems(e, n) {
    var E, h;
    const s = st(e, n), i = this.compiler.token.flatStream(), { token: r, index: a } = this.compiler.container.token(s), l = a === void 0 ? i[0] : i[a + 1];
    if ([
      ...(r == null ? void 0 : r.trailingTrivia) || [],
      ...(r == null ? void 0 : r.leadingTrivia) || [],
      ...(l == null ? void 0 : l.leadingTrivia) || []
    ].find((m) => Ht(m) && _e(s, m)))
      return D();
    if (a === void 0)
      return Lt();
    if ([u.STRING_LITERAL, u.QUOTED_STRING].includes(r.kind) && _e(s, r))
      return D();
    const p = this.compiler.container.element(s);
    if (this.compiler.container.scopeKind(s) === O.TOPLEVEL || p instanceof A && p.type && p.type.start <= s && p.type.end >= s)
      return Lt();
    const f = [...this.compiler.container.stack(s)].reverse();
    for (const m of f)
      if (m instanceof H)
        switch ((E = m.op) == null ? void 0 : E.value) {
          case ">":
          case "<":
          case "<>":
          case "-":
            return mt(
              this.compiler,
              s,
              m
            );
        }
      else if (m instanceof J)
        switch ((h = m.op) == null ? void 0 : h.value) {
          case ">":
          case "<":
          case "<>":
          case "-":
            return mt(
              this.compiler,
              s,
              m
            );
          case ".":
            return Xt(
              this.compiler,
              s,
              m
            );
        }
      else {
        if (m instanceof ie)
          return Tt(this.compiler, s, m);
        if (m instanceof R)
          return Tt(this.compiler, s, m);
        if (m instanceof ee)
          return ns(this.compiler, s);
        if (m instanceof v)
          return It(this.compiler, s, m);
        if (m instanceof A && (m.bodyColon && s >= m.bodyColon.end || m.body && _e(s, m.body)))
          return It(this.compiler, s, void 0);
      }
    return D();
  }
}
function mt(t, e, n) {
  const s = t.container.scopeKind(e);
  if ([O.REF, O.TABLE].includes(s)) {
    const i = Ge(t, e, t.container.element(e), [
      T.Table,
      T.Schema,
      T.Column
    ]);
    return Pe(n.op, e) ? Ue(i) : i;
  }
  return D();
}
function Ge(t, e, n, s) {
  var a;
  if (n === void 0)
    return D();
  let i = n;
  const r = { suggestions: [] };
  for (; i; ) {
    if ((a = i == null ? void 0 : i.symbol) != null && a.symbolTable) {
      const { symbol: l } = i;
      r.suggestions.push(
        ...t.symbol.members(l).filter(({ kind: p }) => s.includes(p)).map(({ name: p, kind: f }) => ({
          label: p,
          insertText: p,
          insertTextRules: w.KeepWhitespace,
          kind: ve(f),
          sortText: ve(f).toString().padStart(2, "0"),
          range: void 0
        }))
      );
    }
    i = i instanceof A ? i.parent : void 0;
  }
  return Ve(r);
}
function ns(t, e) {
  var s;
  switch (t.container.scopeKind(e)) {
    case O.INDEXES:
      return Wt(t, e);
    case O.REF:
      {
        const i = [...t.container.stack(e)];
        for (; i.length > 0; ) {
          const r = i.pop();
          if (r instanceof J && ((s = r.op) == null ? void 0 : s.value) === ".")
            return Xt(
              t,
              e,
              r
            );
        }
      }
      return $t(t, e);
  }
  return D();
}
function Tt(t, e, n) {
  const { token: s } = t.container.token(e);
  if ([u.COMMA, u.LBRACKET].includes(s == null ? void 0 : s.kind)) {
    const i = bt(t, e);
    return (s == null ? void 0 : s.kind) === u.COMMA && Pe(s, e) ? Ue(i) : i;
  }
  if (n.name && n.name.start <= e && n.name.end >= e)
    return bt(t, e);
  if (n.name instanceof q) {
    const i = ss(
      t,
      e,
      Te(n.name).unwrap_or("")
    );
    return (s == null ? void 0 : s.kind) === u.COLON && Pe(s, e) ? Ue(i) : i;
  }
  return D();
}
function bt(t, e) {
  const n = t.container.element(e), s = t.container.scopeKind(e);
  if (n instanceof j)
    return D();
  if (n.body && !_e(e, n.body))
    switch (s) {
      case O.TABLE:
        return {
          suggestions: ["headercolor", "note"].map((i) => ({
            label: i,
            insertText: `${i}: `,
            kind: L.Field,
            insertTextRules: w.KeepWhitespace,
            range: void 0
          }))
        };
      case O.TABLEGROUP:
        return {
          suggestions: ["color", "note"].map((i) => ({
            label: i,
            insertText: `${i}: `,
            kind: L.Field,
            insertTextRules: w.KeepWhitespace,
            range: void 0
          }))
        };
      default:
        return D();
    }
  switch (s) {
    case O.TABLE:
      return {
        suggestions: [
          ...["primary key", "null", "not null", "increment", "pk", "unique"].map((i) => ({
            label: i,
            insertText: i,
            kind: L.Property,
            insertTextRules: w.KeepWhitespace,
            range: void 0
          })),
          ...["ref", "default"].map((i) => ({
            label: i,
            insertText: `${i}: `,
            kind: L.Property,
            insertTextRules: w.KeepWhitespace,
            range: void 0
          })),
          {
            label: "note",
            insertText: "note: ",
            kind: L.Property,
            insertTextRules: w.KeepWhitespace,
            range: void 0
          }
        ]
      };
    case O.ENUM:
      return {
        suggestions: [
          {
            label: "note",
            insertText: "note: ",
            kind: L.Property,
            insertTextRules: w.KeepWhitespace,
            range: void 0
          }
        ]
      };
    case O.INDEXES:
      return {
        suggestions: [
          ...["unique", "pk"].map((i) => ({
            label: i,
            insertText: i,
            insertTextRules: w.KeepWhitespace,
            kind: L.Property,
            range: void 0
          })),
          ...["note", "name", "type"].map((i) => ({
            label: i,
            insertText: `${i}: `,
            kind: L.Property,
            insertTextRules: w.KeepWhitespace,
            range: void 0
          }))
        ]
      };
    case O.REF:
      return {
        suggestions: ["update", "delete"].map((i) => ({
          label: i,
          insertText: `${i}: `,
          kind: L.Property,
          insertTextRules: w.KeepWhitespace,
          range: void 0
        }))
      };
  }
  return D();
}
function ss(t, e, n) {
  switch (n == null ? void 0 : n.toLowerCase()) {
    case "update":
    case "delete":
      return {
        suggestions: ["cascade", "set default", "set null", "restrict"].map((s) => ({
          label: s,
          insertText: s,
          kind: L.Value,
          insertTextRules: w.KeepWhitespace,
          range: void 0
        }))
      };
    case "type":
      return {
        suggestions: ["btree", "hash"].map((s) => ({
          label: s,
          insertText: `${s}`,
          kind: L.Value,
          insertTextRules: w.KeepWhitespace,
          range: void 0
        }))
      };
  }
  return D();
}
function Xt(t, e, n) {
  const s = pe(n).unwrap_or([]);
  if (s.pop(), s.some((r) => !V(r)))
    return D();
  const i = s.map((r) => Q(r).unwrap());
  return Ve({
    suggestions: t.symbol.ofName({ nameStack: i, owner: t.container.element(e) }).flatMap(({ symbol: r }) => t.symbol.members(r)).map(({ kind: r, name: a }) => ({
      label: a,
      insertText: a,
      kind: ve(r),
      range: void 0
    }))
  });
}
function It(t, e, n) {
  var i;
  switch (t.container.scopeKind(e)) {
    case O.TABLE:
      return rs(t, e, n);
    case O.PROJECT:
      return as(t, e, n);
    case O.INDEXES:
      return ls(t, e);
    case O.ENUM:
      return is(t, e, n);
    case O.REF: {
      const r = $t(t, e);
      return ((i = t.container.token(e).token) == null ? void 0 : i.kind) === u.COLON && Pe(t.container.token(e).token, e) ? Ue(r) : r;
    }
    case O.TABLEGROUP:
      return os(t);
    default:
      return D();
  }
}
function Lt() {
  return {
    suggestions: ["Table", "TableGroup", "Enum", "Project", "Ref"].map((t) => ({
      label: t,
      insertText: t,
      insertTextRules: w.KeepWhitespace,
      kind: L.Keyword,
      range: void 0
    }))
  };
}
function is(t, e, n) {
  return n != null && n.callee && it(e, n) === 1 ? Ge(t, e, t.container.element(e), [
    T.Schema,
    T.Table,
    T.Column
  ]) : D();
}
function rs(t, e, n) {
  if (!(n != null && n.callee))
    return {
      suggestions: ["Note", "indexes"].map((i) => ({
        label: i,
        insertText: i,
        insertTextRules: w.KeepWhitespace,
        kind: L.Keyword,
        range: void 0
      }))
    };
  const s = it(e, n);
  return s === 0 ? {
    suggestions: ["Note", "indexes"].map((i) => ({
      label: i,
      insertText: i,
      insertTextRules: w.KeepWhitespace,
      kind: L.Keyword,
      range: void 0
    }))
  } : s === 1 ? cs(t, e) : D();
}
function as(t, e, n) {
  return n != null && n.callee ? it(e, n) === 0 ? {
    suggestions: ["Table", "TableGroup", "Enum", "Note", "Ref"].map((i) => ({
      label: i,
      insertText: i,
      insertTextRules: w.KeepWhitespace,
      kind: L.Keyword,
      range: void 0
    }))
  } : D() : {
    suggestions: ["Table", "TableGroup", "Enum", "Note", "Ref"].map((i) => ({
      label: i,
      insertText: i,
      insertTextRules: w.KeepWhitespace,
      kind: L.Keyword,
      range: void 0
    }))
  };
}
function $t(t, e) {
  return Ge(t, e, t.container.element(e), [
    T.Schema,
    T.Table,
    T.Column
  ]);
}
function os(t) {
  return {
    suggestions: [
      ...Ve({
        suggestions: [...t.parse.publicSymbolTable().entries()].flatMap(([e]) => {
          const n = re(e).unwrap_or(void 0);
          if (n === void 0)
            return [];
          const { kind: s, name: i } = n;
          return s !== T.Table && s !== T.Schema ? [] : {
            label: i,
            insertText: i,
            insertTextRules: w.KeepWhitespace,
            kind: ve(s),
            range: void 0
          };
        })
      }).suggestions,
      ...["Note"].map((e) => ({
        label: e,
        insertText: e,
        insertTextRules: w.KeepWhitespace,
        kind: L.Keyword,
        range: void 0
      }))
    ]
  };
}
function ls(t, e) {
  return Wt(t, e);
}
function cs(t, e) {
  return {
    suggestions: [
      ...[
        "integer",
        "int",
        "tinyint",
        "smallint",
        "mediumint",
        "bigint",
        "bit",
        "bool",
        "binary",
        "varbinary",
        "logical",
        "char",
        "nchar",
        "varchar",
        "varchar2",
        "nvarchar",
        "nvarchar2",
        "binary_float",
        "binary_double",
        "float",
        "double",
        "decimal",
        "dec",
        "real",
        "money",
        "smallmoney",
        "enum",
        "tinyblob",
        "tinytext",
        "blob",
        "text",
        "mediumblob",
        "mediumtext",
        "longblob",
        "longtext",
        "ntext",
        "set",
        "inet6",
        "uuid",
        "image",
        "date",
        "time",
        "datetime",
        "datetime2",
        "timestamp",
        "year",
        "smalldatetime",
        "datetimeoffset",
        "XML",
        "sql_variant",
        "uniqueidentifier",
        "CURSOR",
        "BFILE",
        "CLOB",
        "NCLOB",
        "RAW"
      ].map((n) => ({
        label: n,
        insertText: n,
        insertTextRules: w.KeepWhitespace,
        kind: L.TypeParameter,
        sortText: L.TypeParameter.toString().padStart(2, "0"),
        range: void 0
      })),
      ...Ge(t, e, t.container.element(e), [
        T.Enum,
        T.Schema
      ]).suggestions
    ]
  };
}
function Wt(t, e) {
  const n = t.container.element(e), s = n == null ? void 0 : n.parent;
  if (!((s == null ? void 0 : s.symbol) instanceof yt))
    return D();
  const { symbolTable: i } = s.symbol;
  return Ve({
    suggestions: [...i.entries()].flatMap(([r]) => {
      const a = re(r).unwrap_or(void 0);
      if (a === void 0)
        return [];
      const { name: l } = a;
      return {
        label: l,
        insertText: l,
        insertTextRules: w.KeepWhitespace,
        kind: ve(T.Column),
        range: void 0
      };
    })
  });
}
function it(t, e) {
  if (!e.callee)
    return -1;
  const n = [e.callee, ...e.args], s = n.findIndex((i) => t <= i.end);
  return s === -1 ? n.length : s;
}
class jt {
  constructor(e) {
    this.compiler = e;
  }
  provideDefinition(e, n) {
    var a;
    const { uri: s } = e, i = st(e, n), r = [...this.compiler.container.stack(i)];
    for (; r.length !== 0; ) {
      const l = r.pop();
      if ((a = l == null ? void 0 : l.referee) != null && a.declaration && [Ne.PRIMARY_EXPRESSION, Ne.VARIABLE].includes(l == null ? void 0 : l.kind)) {
        const { startPos: p, endPos: f } = l.referee.declaration;
        return [
          {
            range: {
              startColumn: p.column + 1,
              startLineNumber: p.line + 1,
              endColumn: f.column + 1,
              endLineNumber: f.line + 1
            },
            uri: s
          }
        ];
      }
    }
    return [];
  }
}
class Yt {
  constructor(e) {
    this.compiler = e;
  }
  provideReferences(e, n) {
    const { uri: s } = e, i = st(e, n), r = [...this.compiler.container.stack(i)];
    for (; r.length !== 0; ) {
      const a = r.pop();
      if (a && [
        Ne.ELEMENT_DECLARATION,
        Ne.FUNCTION_APPLICATION,
        Ne.PRIMARY_EXPRESSION
      ].includes(a == null ? void 0 : a.kind)) {
        const { symbol: l } = a;
        if (l != null && l.references.length)
          return l.references.map(({ startPos: p, endPos: f }) => ({
            range: {
              startColumn: p.column + 1,
              startLineNumber: p.line + 1,
              endColumn: f.column + 1,
              endLineNumber: f.line + 1
            },
            uri: s
          }));
      }
    }
    return [];
  }
}
const fs = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  __proto__: null,
  CompletionItemInsertTextRule: w,
  CompletionItemKind: L,
  DBMLCompletionItemProvider: Ct,
  DBMLDefinitionProvider: jt,
  DBMLReferencesProvider: Yt
}, Symbol.toStringTag, { value: "Module" }));
var O = /* @__PURE__ */ ((t) => (t[t.TABLE = 0] = "TABLE", t[t.ENUM = 1] = "ENUM", t[t.TABLEGROUP = 2] = "TABLEGROUP", t[t.INDEXES = 3] = "INDEXES", t[t.NOTE = 4] = "NOTE", t[t.REF = 5] = "REF", t[t.PROJECT = 6] = "PROJECT", t[t.CUSTOM = 7] = "CUSTOM", t[t.TOPLEVEL = 8] = "TOPLEVEL", t))(O || {});
class ps {
  constructor() {
    this.source = "", this.cache = new Array(
      16
      /* TOTAL_QUERY_COUNT */
    ).fill(null), this.nodeIdGenerator = new Jt(), this.symbolIdGenerator = new nn(), this.token = {
      invalidStream: this.createQuery(
        6,
        () => this.parse.tokens().filter(kt)
      ),
      // Valid + Invalid tokens (which are guarenteed to be non-trivials) are included in the stream
      flatStream: this.createQuery(
        7,
        () => this.parse.tokens().flatMap((e) => [...e.leadingInvalid, e, ...e.trailingInvalid])
      )
    }, this.parse = {
      source: () => this.source,
      _: this.createQuery(
        0,
        () => {
          const e = new pn(this.source).lex().chain((n) => new Nn(n, this.nodeIdGenerator).parse()).chain(({ ast: n, tokens: s }) => new qn(n, this.symbolIdGenerator).analyze().map(() => ({ ast: n, tokens: s })));
          return e.getErrors().length > 0 ? e : e.chain(({ ast: n, tokens: s }) => new es(n).interpret().map((r) => ({ ast: n, tokens: s, rawDb: r })));
        }
      ),
      ast: this.createQuery(
        1,
        () => this.parse._().getValue().ast
      ),
      errors: this.createQuery(2, () => this.parse._().getErrors()),
      tokens: this.createQuery(
        4,
        () => this.parse._().getValue().tokens
      ),
      rawDb: this.createQuery(
        3,
        () => this.parse._().getValue().rawDb
      ),
      publicSymbolTable: this.createQuery(
        5,
        () => this.parse._().getValue().ast.symbol.symbolTable
      )
    }, this.container = {
      stack: this.createQuery(
        10,
        (e) => {
          const n = this.token.flatStream(), { index: s, token: i } = this.container.token(e), r = s === void 0 ? -1 : Qt(n, (f) => !f.isInvalid, s);
          if (r === -1)
            return [this.parse.ast()];
          const a = n[r].start;
          let l = this.parse.ast();
          const p = [l];
          for (; ; ) {
            const E = fn(l).find((h) => _e(a, h));
            if (E === void 0 || E instanceof G)
              break;
            p.push(E), l = E;
          }
          if ((i == null ? void 0 : i.kind) === u.COLON)
            return p;
          for (; p.length > 0; ) {
            let f = !1;
            const E = $e(p);
            if (E instanceof v) {
              const h = this.parse.source();
              for (let m = E.end; m < e; m += 1)
                h[m] === `
` && (p.pop(), f = !0);
            } else
              E instanceof H || E instanceof J ? this.container.token(e).token !== E.op && (p.pop(), f = !0) : E instanceof R ? E.listCloseBracket && E.end <= e && (p.pop(), f = !0) : E instanceof ee ? E.tupleCloseParen && E.end <= e && (p.pop(), f = !0) : E instanceof K ? E.blockCloseBrace && E.end <= e && (p.pop(), f = !0) : E instanceof q || E.end < e && (p.pop(), f = !0);
            if (f) {
              const h = $e(p);
              h instanceof A && h.end <= e && p.pop();
            }
            if (!f)
              break;
          }
          return p;
        }
      ),
      token: this.createQuery(
        11,
        (e) => {
          const n = this.token.flatStream().findIndex((s) => s.start >= e);
          return n === void 0 ? { token: void 0, index: void 0 } : n <= 0 ? { token: void 0, index: void 0 } : {
            token: this.token.flatStream()[n - 1],
            index: n - 1
          };
        }
      ),
      element: this.createQuery(
        12,
        (e) => {
          const n = this.container.stack(e);
          for (let s = n.length - 1; s >= 0; s -= 1)
            if (n[s] instanceof A)
              return n[s];
          return this.parse.ast();
        }
      ),
      scope: this.createQuery(
        14,
        (e) => {
          var n, s;
          return (s = (n = this.container.element(e)) == null ? void 0 : n.symbol) == null ? void 0 : s.symbolTable;
        }
      ),
      scopeKind: this.createQuery(15, (e) => {
        var s;
        if (this.container.element(e) instanceof j)
          return 8;
        switch ((s = this.container.element(e).type) == null ? void 0 : s.value.toLowerCase()) {
          case "table":
            return 0;
          case "enum":
            return 1;
          case "ref":
            return 5;
          case "tablegroup":
            return 2;
          case "indexes":
            return 3;
          case "note":
            return 4;
          case "project":
            return 6;
          default:
            return 7;
        }
      })
    }, this.symbol = {
      // Given a stack of name and the current scope
      // Try looking up the first name in the stack in the current scope
      // and resolve the rest of the name stack as members
      // Then try to do the same with all ancestor scopes
      ofName: this.createQuery(
        8,
        ({
          nameStack: e,
          owner: n = this.parse.ast()
        }) => {
          var i;
          if (e.length === 0)
            return [];
          const s = [];
          for (let r = n; r; r = r instanceof A ? r.parent : void 0) {
            if (!((i = r.symbol) != null && i.symbolTable))
              continue;
            const { symbolTable: a } = r.symbol;
            let l = [a], p = [];
            for (const f of e)
              p = l.flatMap(
                (E) => en(f).flatMap((h) => {
                  const m = E.get(h), g = re(h).unwrap_or(void 0);
                  return !m || !g ? [] : { ...g, symbol: m };
                })
              ), l = p.flatMap(
                (E) => E.symbol.symbolTable ? E.symbol.symbolTable : []
              );
            s.push(...p);
          }
          return s;
        },
        ({ nameStack: e, owner: n }) => `${e.join(".")}@${n.id}`
      ),
      members: this.createQuery(
        9,
        (e) => e.symbolTable ? [...e.symbolTable.entries()].map(([n, s]) => ({
          ...re(n).unwrap(),
          symbol: s
        })) : []
      )
    };
  }
  createQuery(e, n, s) {
    return (i) => {
      const r = this.cache[e], a = i && s ? s(i) : i;
      if (r !== null) {
        if (!(r instanceof Map))
          return r;
        if (r.has(a))
          return r.get(a);
      }
      const l = n(i);
      return i !== void 0 ? r instanceof Map ? r.set(a, l) : (this.cache[e] = /* @__PURE__ */ new Map(), this.cache[e].set(a, l)) : this.cache[e] = l, l;
    };
  }
  setSource(e) {
    this.source = e, this.cache = new Array(
      16
      /* TOTAL_QUERY_COUNT */
    ).fill(null), this.nodeIdGenerator.reset(), this.symbolIdGenerator.reset();
  }
  initMonacoServices() {
    return {
      definitionProvider: new jt(this),
      referenceProvider: new Yt(this),
      autocompletionProvider: new Ct(this)
    };
  }
}
export {
  ps as Compiler,
  hs as serialize,
  fs as services
};