{"version":3,"sources":["../index.ts"],"sourcesContent":["import { isNamedPitch, isPitch, Pitch } from \"@tonaljs/pitch\";\nimport { interval } from \"@tonaljs/pitch-interval\";\nimport { accToAlt, altToAcc } from \"@tonaljs/pitch-note\";\n\nexport interface RomanNumeral extends Pitch {\n  readonly name: string;\n  readonly empty: boolean;\n  readonly roman: string;\n  readonly interval: string;\n  readonly acc: string;\n  readonly chordType: string;\n  readonly major: boolean;\n  readonly dir: 1;\n}\n\nexport interface NoRomanNumeral extends Partial<RomanNumeral> {\n  readonly empty: true;\n  readonly name: \"\";\n  readonly chordType: \"\";\n}\nconst NoRomanNumeral: NoRomanNumeral = { empty: true, name: \"\", chordType: \"\" };\n\nconst cache: Record<string, RomanNumeral | NoRomanNumeral> = {};\n\n/**\n * Get properties of a roman numeral string\n *\n * @function\n * @param {string} - the roman numeral string (can have type, like: Imaj7)\n * @return {Object} - the roman numeral properties\n * @param {string} name - the roman numeral (tonic)\n * @param {string} type - the chord type\n * @param {string} num - the number (1 = I, 2 = II...)\n * @param {boolean} major - major or not\n *\n * @example\n * romanNumeral(\"VIIb5\") // => { name: \"VII\", type: \"b5\", num: 7, major: true }\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function get(src: any): RomanNumeral | NoRomanNumeral {\n  return typeof src === \"string\"\n    ? cache[src] || (cache[src] = parse(src))\n    : typeof src === \"number\"\n      ? get(NAMES[src] || \"\")\n      : isPitch(src)\n        ? fromPitch(src)\n        : isNamedPitch(src)\n          ? get(src.name)\n          : NoRomanNumeral;\n}\n\n/**\n * @deprecated\n * @use RomanNumeral.get\n */\nexport const romanNumeral = get;\n\n/**\n * Get roman numeral names\n *\n * @function\n * @param {boolean} [isMajor=true]\n * @return {Array<String>}\n *\n * @example\n * names() // => [\"I\", \"II\", \"III\", \"IV\", \"V\", \"VI\", \"VII\"]\n */\nexport function names(major = true) {\n  return (major ? NAMES : NAMES_MINOR).slice();\n}\n\nfunction fromPitch(pitch: Pitch): RomanNumeral | NoRomanNumeral {\n  return get(altToAcc(pitch.alt) + NAMES[pitch.step]);\n}\n\nconst REGEX =\n  /^(#{1,}|b{1,}|x{1,}|)(IV|I{1,3}|VI{0,2}|iv|i{1,3}|vi{0,2})([^IViv]*)$/;\n\n// [name, accidentals, romanNumeral, chordType]\ntype RomanNumeralTokens = [string, string, string, string];\nexport function tokenize(str: string): RomanNumeralTokens {\n  return (REGEX.exec(str) || [\"\", \"\", \"\", \"\"]) as RomanNumeralTokens;\n}\n\nconst ROMANS = \"I II III IV V VI VII\";\nconst NAMES = ROMANS.split(\" \");\nconst NAMES_MINOR = ROMANS.toLowerCase().split(\" \");\n\nfunction parse(src: string): RomanNumeral | NoRomanNumeral {\n  const [name, acc, roman, chordType] = tokenize(src);\n  if (!roman) {\n    return NoRomanNumeral;\n  }\n\n  const upperRoman = roman.toUpperCase();\n  const step = NAMES.indexOf(upperRoman);\n  const alt = accToAlt(acc);\n  const dir = 1;\n  return {\n    empty: false,\n    name,\n    roman,\n    interval: interval({ step, alt, dir }).name,\n    acc,\n    chordType,\n    alt,\n    step,\n    major: roman === upperRoman,\n    oct: 0,\n    dir,\n  };\n}\n\n/** @deprecated */\nexport default {\n  names,\n  get,\n  // deprecated\n  romanNumeral,\n};\n"],"mappings":";AAAA,SAAS,cAAc,eAAsB;AAC7C,SAAS,gBAAgB;AACzB,SAAS,UAAU,gBAAgB;AAkBnC,IAAM,iBAAiC,EAAE,OAAO,MAAM,MAAM,IAAI,WAAW,GAAG;AAE9E,IAAM,QAAuD,CAAC;AAiBvD,SAAS,IAAI,KAAyC;AAC3D,SAAO,OAAO,QAAQ,WAClB,MAAM,GAAG,MAAM,MAAM,GAAG,IAAI,MAAM,GAAG,KACrC,OAAO,QAAQ,WACb,IAAI,MAAM,GAAG,KAAK,EAAE,IACpB,QAAQ,GAAG,IACT,UAAU,GAAG,IACb,aAAa,GAAG,IACd,IAAI,IAAI,IAAI,IACZ;AACZ;AAMO,IAAM,eAAe;AAYrB,SAAS,MAAM,QAAQ,MAAM;AAClC,UAAQ,QAAQ,QAAQ,aAAa,MAAM;AAC7C;AAEA,SAAS,UAAU,OAA6C;AAC9D,SAAO,IAAI,SAAS,MAAM,GAAG,IAAI,MAAM,MAAM,IAAI,CAAC;AACpD;AAEA,IAAM,QACJ;AAIK,SAAS,SAAS,KAAiC;AACxD,SAAQ,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE;AAC5C;AAEA,IAAM,SAAS;AACf,IAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,IAAM,cAAc,OAAO,YAAY,EAAE,MAAM,GAAG;AAElD,SAAS,MAAM,KAA4C;AACzD,QAAM,CAAC,MAAM,KAAK,OAAO,SAAS,IAAI,SAAS,GAAG;AAClD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,YAAY;AACrC,QAAM,OAAO,MAAM,QAAQ,UAAU;AACrC,QAAM,MAAM,SAAS,GAAG;AACxB,QAAM,MAAM;AACZ,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,UAAU,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAAU;AAAA,IACjB,KAAK;AAAA,IACL;AAAA,EACF;AACF;AAGA,IAAO,wBAAQ;AAAA,EACb;AAAA,EACA;AAAA;AAAA,EAEA;AACF;","names":[]}