{"version":3,"sources":["../src/units.ts"],"sourcesContent":["import Big from 'big.js';\n\ntype DisplayFormat = {\n  format: string;\n  fractionDigits: number;\n  trailingZeros: boolean;\n};\n\nconst displayFormatDefaults = (display?: Partial<DisplayFormat>): DisplayFormat => {\n  return {\n    format: display?.format ?? '',\n    fractionDigits: display?.fractionDigits ?? 0,\n    trailingZeros: display?.trailingZeros ?? false,\n  };\n};\n\nclass Unit {\n  public name: string;\n  public aliases: string[];\n  public value: Big;\n  public display: DisplayFormat;\n\n  constructor(name: string, value: number | Big, display?: Partial<DisplayFormat>, aliases?: string[]) {\n    this.name = name;\n    this.display = displayFormatDefaults(display);\n    this.aliases = aliases ? aliases : [];\n\n    if (value instanceof Big) {\n      this.value = value;\n    } else {\n      this.value = Big(value);\n    }\n  }\n\n  setDisplay(display: DisplayFormat) {\n    this.display = display;\n  }\n}\n\nconst units: Unit[] = [\n  new Unit(\n    'btc',\n    1,\n    {\n      format: '{amount} BTC',\n      fractionDigits: 8,\n      trailingZeros: true,\n    },\n    ['bitcoin'],\n  ),\n\n  new Unit(\n    'mbtc',\n    1 / 1e3,\n    {\n      format: '{amount} mBTC',\n      fractionDigits: 5,\n      trailingZeros: true,\n    },\n    ['millibtc'],\n  ),\n  new Unit(\n    'bit',\n    1 / 1e6,\n    {\n      format: '{amount} μBTC',\n      fractionDigits: 2,\n      trailingZeros: true,\n    },\n    ['microbtc'],\n  ),\n\n  new Unit(\n    'sats',\n    1 / 1e8,\n    {\n      format: '{amount} satoshis',\n      fractionDigits: 0,\n      trailingZeros: false,\n    },\n    ['sat', 'satoshis', 'satoshi'],\n  ),\n];\n\nlet unitsMap: Map<string, Unit>;\n\nconst setUnitsMap = () => {\n  unitsMap = new Map();\n\n  units.forEach((unit) => {\n    unitsMap.set(unit.name, unit);\n\n    unit.aliases.forEach((alias) => {\n      unitsMap.set(alias, unit);\n    });\n  });\n};\n\nsetUnitsMap();\n\nconst getUnit = (name: string) => {\n  const unit = unitsMap.get(name.toLowerCase());\n\n  if (!unit) {\n    throw new Error(`Invalid unit: ${name}`);\n  }\n\n  return unit;\n};\n\nconst addUnit = (name: string, value: number, display?: Partial<DisplayFormat>, aliases?: string[]) => {\n  const unit = new Unit(name, value, display, aliases);\n\n  units.push(unit);\n\n  setUnitsMap();\n};\n\nconst setDisplay = (unitName: string, display: Partial<DisplayFormat>) => {\n  const unit = getUnit(unitName);\n\n  unit.display = displayFormatDefaults(display);\n};\n\nexport { Unit, DisplayFormat, setDisplay, getUnit, addUnit };\n"],"mappings":";AAAA,OAAO,SAAS;AAQhB,IAAM,wBAAwB,CAAC,YAAoD;AARnF;AASE,SAAO;AAAA,IACL,SAAQ,wCAAS,WAAT,YAAmB;AAAA,IAC3B,iBAAgB,wCAAS,mBAAT,YAA2B;AAAA,IAC3C,gBAAe,wCAAS,kBAAT,YAA0B;AAAA,EAC3C;AACF;AAEA,IAAM,OAAN,MAAW;AAAA,EAMT,YAAY,MAAc,OAAqB,SAAkC,SAAoB;AACnG,SAAK,OAAO;AACZ,SAAK,UAAU,sBAAsB,OAAO;AAC5C,SAAK,UAAU,UAAU,UAAU,CAAC;AAEpC,QAAI,iBAAiB,KAAK;AACxB,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,WAAK,QAAQ,IAAI,KAAK;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,WAAW,SAAwB;AACjC,SAAK,UAAU;AAAA,EACjB;AACF;AAEA,IAAM,QAAgB;AAAA,EACpB,IAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAAA,EAEA,IAAI;AAAA,IACF;AAAA,IACA,IAAI;AAAA,IACJ;AAAA,MACE,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAAA,EACA,IAAI;AAAA,IACF;AAAA,IACA,IAAI;AAAA,IACJ;AAAA,MACE,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAAA,EAEA,IAAI;AAAA,IACF;AAAA,IACA,IAAI;AAAA,IACJ;AAAA,MACE,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB;AAAA,IACA,CAAC,OAAO,YAAY,SAAS;AAAA,EAC/B;AACF;AAEA,IAAI;AAEJ,IAAM,cAAc,MAAM;AACxB,aAAW,oBAAI,IAAI;AAEnB,QAAM,QAAQ,CAAC,SAAS;AACtB,aAAS,IAAI,KAAK,MAAM,IAAI;AAE5B,SAAK,QAAQ,QAAQ,CAAC,UAAU;AAC9B,eAAS,IAAI,OAAO,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH,CAAC;AACH;AAEA,YAAY;AAEZ,IAAM,UAAU,CAAC,SAAiB;AAChC,QAAM,OAAO,SAAS,IAAI,KAAK,YAAY,CAAC;AAE5C,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AAAA,EACzC;AAEA,SAAO;AACT;AAEA,IAAM,UAAU,CAAC,MAAc,OAAe,SAAkC,YAAuB;AACrG,QAAM,OAAO,IAAI,KAAK,MAAM,OAAO,SAAS,OAAO;AAEnD,QAAM,KAAK,IAAI;AAEf,cAAY;AACd;AAEA,IAAM,aAAa,CAAC,UAAkB,YAAoC;AACxE,QAAM,OAAO,QAAQ,QAAQ;AAE7B,OAAK,UAAU,sBAAsB,OAAO;AAC9C;","names":[]}