@lightsparkdev/core 1.0.5 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -30,6 +30,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
+ CurrencyUnit: () => CurrencyUnit,
33
34
  DefaultCrypto: () => DefaultCrypto,
34
35
  KeyOrAlias: () => KeyOrAlias,
35
36
  LightsparkAuthException: () => LightsparkAuthException_default,
@@ -44,22 +45,39 @@ __export(src_exports, {
44
45
  SigningKey: () => SigningKey,
45
46
  SigningKeyType: () => SigningKeyType,
46
47
  StubAuthProvider: () => StubAuthProvider,
48
+ abbrCurrencyUnit: () => abbrCurrencyUnit,
47
49
  apiDomainForEnvironment: () => apiDomainForEnvironment,
48
50
  b64decode: () => b64decode,
49
51
  b64encode: () => b64encode,
50
52
  bytesToHex: () => bytesToHex,
53
+ clamp: () => clamp,
51
54
  convertCurrencyAmount: () => convertCurrencyAmount,
55
+ convertCurrencyAmountValue: () => convertCurrencyAmountValue,
56
+ countryCodesToCurrencyCodes: () => countryCodesToCurrencyCodes,
52
57
  createSha256Hash: () => createSha256Hash,
58
+ defaultCurrencyCode: () => defaultCurrencyCode,
59
+ formatCurrencyStr: () => formatCurrencyStr,
60
+ getCurrentLocale: () => getCurrentLocale,
53
61
  getErrorMsg: () => getErrorMsg,
54
62
  hexToBytes: () => hexToBytes,
55
63
  isBrowser: () => isBrowser,
64
+ isCurrencyAmount: () => isCurrencyAmount,
65
+ isCurrencyAmountObj: () => isCurrencyAmountObj,
66
+ isCurrencyMap: () => isCurrencyMap,
56
67
  isError: () => isError,
57
68
  isErrorMsg: () => isErrorMsg,
58
69
  isErrorWithMessage: () => isErrorWithMessage,
59
70
  isNode: () => isNode,
71
+ isNumber: () => isNumber,
60
72
  isTest: () => isTest,
61
73
  isType: () => isType,
74
+ linearInterpolate: () => linearInterpolate,
75
+ localeToCurrencyCode: () => localeToCurrencyCode,
76
+ localeToCurrencySymbol: () => localeToCurrencySymbol,
77
+ mapCurrencyAmount: () => mapCurrencyAmount,
62
78
  pollUntil: () => pollUntil,
79
+ round: () => round,
80
+ separateCurrencyStrParts: () => separateCurrencyStrParts,
63
81
  sleep: () => sleep,
64
82
  urlsafe_b64decode: () => urlsafe_b64decode
65
83
  });
@@ -407,7 +425,314 @@ async function createSha256Hash(data, asHex) {
407
425
  }
408
426
  }
409
427
 
428
+ // src/utils/locale.ts
429
+ function getCurrentLocale() {
430
+ return Intl.NumberFormat().resolvedOptions().locale;
431
+ }
432
+
433
+ // src/utils/localeToCurrencyCodes.ts
434
+ var countryCodesToCurrencyCodes = {
435
+ AD: "EUR",
436
+ // AE: "AED",
437
+ // AF: "AFN",
438
+ // AG: "XCD",
439
+ // AI: "XCD",
440
+ // AL: "ALL",
441
+ // AM: "AMD",
442
+ // AO: "AOA",
443
+ AR: "ARS",
444
+ AS: "USD",
445
+ AT: "EUR",
446
+ AU: "AUD",
447
+ // AW: "AWG",
448
+ AX: "EUR",
449
+ // AZ: "AZN",
450
+ // BA: "BAM",
451
+ // BB: "BBD",
452
+ // BD: "BDT",
453
+ BE: "EUR",
454
+ // BF: "XOF",
455
+ // BG: "BGN",
456
+ // BH: "BHD",
457
+ // BI: "BIF",
458
+ // BJ: "XOF",
459
+ BL: "EUR",
460
+ // BM: "BMD",
461
+ // BN: "BND",
462
+ // BO: "BOB",
463
+ BQ: "USD",
464
+ BR: "BRL",
465
+ // BS: "BSD",
466
+ // BT: "BTN",
467
+ // BV: "NOK",
468
+ // BW: "BWP",
469
+ // BY: "BYN",
470
+ // BZ: "BZD",
471
+ CA: "CAD",
472
+ // CC: "AUD",
473
+ // CD: "CDF",
474
+ // CF: "XAF",
475
+ // CG: "XAF",
476
+ // CH: "CHF",
477
+ // CI: "XOF",
478
+ // CK: "NZD",
479
+ // CL: "CLP",
480
+ // CM: "XAF",
481
+ // CN: "CNY",
482
+ CO: "COP",
483
+ // CR: "CRC",
484
+ // CU: "CUP",
485
+ // CV: "CVE",
486
+ // CW: "ANG",
487
+ // CX: "AUD",
488
+ CY: "EUR",
489
+ // CZ: "CZK",
490
+ DE: "EUR",
491
+ // DJ: "DJF",
492
+ // DK: "DKK",
493
+ // DM: "XCD",
494
+ // DO: "DOP",
495
+ // DZ: "DZD",
496
+ EC: "USD",
497
+ EE: "EUR",
498
+ // EG: "EGP",
499
+ // EH: "MAD",
500
+ // ER: "ERN",
501
+ ES: "EUR",
502
+ // ET: "ETB",
503
+ FI: "EUR",
504
+ // FJ: "FJD",
505
+ // FK: "FKP",
506
+ FM: "USD",
507
+ // FO: "DKK",
508
+ FR: "EUR",
509
+ // GA: "XAF",
510
+ GB: "GBP",
511
+ // GD: "XCD",
512
+ // GE: "GEL",
513
+ GF: "EUR",
514
+ GG: "GBP",
515
+ // GH: "GHS",
516
+ // GI: "GIP",
517
+ // GL: "DKK",
518
+ // GM: "GMD",
519
+ // GN: "GNF",
520
+ GP: "EUR",
521
+ // GQ: "XAF",
522
+ GR: "EUR",
523
+ GS: "GBP",
524
+ // GT: "GTQ",
525
+ GU: "USD",
526
+ // GW: "XOF",
527
+ // GY: "GYD",
528
+ // HK: "HKD",
529
+ // HM: "AUD",
530
+ // HN: "HNL",
531
+ // HR: "HRK",
532
+ // HT: "HTG",
533
+ // HU: "HUF",
534
+ // ID: "IDR",
535
+ IE: "EUR",
536
+ // IL: "ILS",
537
+ IM: "GBP",
538
+ IN: "INR",
539
+ IO: "USD",
540
+ // IQ: "IQD",
541
+ // IR: "IRR",
542
+ // IS: "ISK",
543
+ IT: "EUR",
544
+ JE: "GBP",
545
+ // JM: "JMD",
546
+ // JO: "JOD",
547
+ // JP: "JPY",
548
+ // KE: "KES",
549
+ // KG: "KGS",
550
+ // KH: "KHR",
551
+ // KI: "AUD",
552
+ // KM: "KMF",
553
+ // KN: "XCD",
554
+ // KP: "KPW",
555
+ // KR: "KRW",
556
+ // KW: "KWD",
557
+ // KY: "KYD",
558
+ // KZ: "KZT",
559
+ // LA: "LAK",
560
+ // LB: "LBP",
561
+ // LC: "XCD",
562
+ // LI: "CHF",
563
+ // LK: "LKR",
564
+ // LR: "LRD",
565
+ // LS: "LSL",
566
+ LT: "EUR",
567
+ LU: "EUR",
568
+ LV: "EUR",
569
+ // LY: "LYD",
570
+ // MA: "MAD",
571
+ MC: "EUR",
572
+ // MD: "MDL",
573
+ ME: "EUR",
574
+ MF: "EUR",
575
+ // MG: "MGA",
576
+ MH: "USD",
577
+ // MK: "MKD",
578
+ // ML: "XOF",
579
+ // MM: "MMK",
580
+ // MN: "MNT",
581
+ // MO: "MOP",
582
+ MP: "USD",
583
+ MQ: "EUR",
584
+ // MR: "MRO",
585
+ // MS: "XCD",
586
+ MT: "EUR",
587
+ // MU: "MUR",
588
+ // MV: "MVR",
589
+ // MW: "MWK",
590
+ MX: "MXN",
591
+ // MY: "MYR",
592
+ // MZ: "MZN",
593
+ // NA: "NAD",
594
+ // NC: "XPF",
595
+ // NE: "XOF",
596
+ NF: "AUD",
597
+ // NG: "NGN",
598
+ // NI: "NIO",
599
+ NL: "EUR",
600
+ // NO: "NOK",
601
+ // NP: "NPR",
602
+ NR: "AUD",
603
+ // NU: "NZD",
604
+ // NZ: "NZD",
605
+ // OM: "OMR",
606
+ // PA: "PAB",
607
+ // PE: "PEN",
608
+ // PF: "XPF",
609
+ // PG: "PGK",
610
+ // PH: "PHP",
611
+ // PK: "PKR",
612
+ // PL: "PLN",
613
+ PM: "EUR",
614
+ // PN: "NZD",
615
+ PR: "USD",
616
+ // PS: "ILS",
617
+ PT: "EUR",
618
+ PW: "USD",
619
+ // PY: "PYG",
620
+ // QA: "QAR",
621
+ RE: "EUR",
622
+ // RO: "RON",
623
+ // RS: "RSD",
624
+ // RU: "RUB",
625
+ // RW: "RWF",
626
+ // SA: "SAR",
627
+ // SB: "SBD",
628
+ // SC: "SCR",
629
+ // SD: "SDG",
630
+ // SE: "SEK",
631
+ // SG: "SGD",
632
+ // SH: "SHP",
633
+ SI: "EUR",
634
+ // SJ: "NOK",
635
+ SK: "EUR",
636
+ // SL: "SLL",
637
+ SM: "EUR",
638
+ // SN: "XOF",
639
+ // SO: "SOS",
640
+ // SR: "SRD",
641
+ // ST: "STD",
642
+ // SV: "SVC",
643
+ // SX: "ANG",
644
+ // SY: "SYP",
645
+ // SZ: "SZL",
646
+ TC: "USD",
647
+ // TD: "XAF",
648
+ TF: "EUR",
649
+ // TG: "XOF",
650
+ // TH: "THB",
651
+ // TJ: "TJS",
652
+ // TK: "NZD",
653
+ TL: "USD",
654
+ // TM: "TMT",
655
+ // TN: "TND",
656
+ // TO: "TOP",
657
+ // TR: "TRY",
658
+ // TT: "TTD",
659
+ TV: "AUD",
660
+ // TW: "TWD",
661
+ // TZ: "TZS",
662
+ // UA: "UAH",
663
+ // UG: "UGX",
664
+ UM: "USD",
665
+ US: "USD",
666
+ // UY: "UYU",
667
+ // UZ: "UZS",
668
+ VA: "EUR",
669
+ // VC: "XCD",
670
+ // VE: "VEF",
671
+ VG: "USD",
672
+ VI: "USD",
673
+ // VN: "VND",
674
+ // VU: "VUV",
675
+ // WF: "XPF",
676
+ // WS: "WST",
677
+ // YE: "YER",
678
+ YT: "EUR"
679
+ // ZA: "ZAR",
680
+ // ZM: "ZMW",
681
+ // ZW: "ZWL",
682
+ };
683
+ function getCountryCode(localeString) {
684
+ let components = localeString.split("_");
685
+ if (components.length === 2) {
686
+ return components.pop();
687
+ }
688
+ components = localeString.split("-");
689
+ if (components.length === 2) {
690
+ return components.pop();
691
+ }
692
+ return localeString;
693
+ }
694
+ function localeToCurrencyCode(locale) {
695
+ const countryCode = getCountryCode(locale);
696
+ return countryCodesToCurrencyCodes[countryCode];
697
+ }
698
+
699
+ // src/utils/numbers.ts
700
+ function clamp(val, min, max) {
701
+ return val > max ? max : val < min ? min : val;
702
+ }
703
+ function linearInterpolate(value, fromRangeStart, fromRangeEnd, toRangeStart, toRangeEnd) {
704
+ const fromRangeMax = fromRangeEnd - fromRangeStart;
705
+ const fromRangeVal = value - fromRangeStart;
706
+ const toRangeMax = toRangeEnd - toRangeStart;
707
+ const val = fromRangeVal / fromRangeMax * toRangeMax + toRangeStart;
708
+ return clamp(
709
+ val,
710
+ Math.min(toRangeStart, toRangeEnd),
711
+ Math.max(toRangeStart, toRangeEnd)
712
+ );
713
+ }
714
+ function round(num, decimalPlaces = 0) {
715
+ const p = Math.pow(10, decimalPlaces);
716
+ const n = num * p * (1 + Number.EPSILON);
717
+ return Math.round(n) / p;
718
+ }
719
+ function isNumber(value) {
720
+ return typeof value === "number";
721
+ }
722
+
410
723
  // src/utils/currency.ts
724
+ var defaultCurrencyCode = "USD";
725
+ var CurrencyUnit = /* @__PURE__ */ ((CurrencyUnit2) => {
726
+ CurrencyUnit2["FUTURE_VALUE"] = "FUTURE_VALUE";
727
+ CurrencyUnit2["BITCOIN"] = "BITCOIN";
728
+ CurrencyUnit2["SATOSHI"] = "SATOSHI";
729
+ CurrencyUnit2["MILLISATOSHI"] = "MILLISATOSHI";
730
+ CurrencyUnit2["USD"] = "USD";
731
+ CurrencyUnit2["NANOBITCOIN"] = "NANOBITCOIN";
732
+ CurrencyUnit2["MICROBITCOIN"] = "MICROBITCOIN";
733
+ CurrencyUnit2["MILLIBITCOIN"] = "MILLIBITCOIN";
734
+ return CurrencyUnit2;
735
+ })(CurrencyUnit || {});
411
736
  var CONVERSION_MAP = {
412
737
  ["BITCOIN" /* BITCOIN */]: {
413
738
  ["BITCOIN" /* BITCOIN */]: (v) => v,
@@ -415,67 +740,303 @@ var CONVERSION_MAP = {
415
740
  ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v * 1e3,
416
741
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e11,
417
742
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 1e9,
418
- ["SATOSHI" /* SATOSHI */]: (v) => v * 1e8
743
+ ["SATOSHI" /* SATOSHI */]: (v) => v * 1e8,
744
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
745
+ /* Round without decimals since we're returning cents: */
746
+ round(v * centsPerBtc, 2)
747
+ )
419
748
  },
420
749
  ["MICROBITCOIN" /* MICROBITCOIN */]: {
421
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e6),
750
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e6,
422
751
  ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v,
423
- ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e3),
752
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v / 1e3,
424
753
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e5,
425
754
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 1e3,
426
- ["SATOSHI" /* SATOSHI */]: (v) => v * 100
755
+ ["SATOSHI" /* SATOSHI */]: (v) => v * 100,
756
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
757
+ /* Round without decimals since we're returning cents: */
758
+ round(v / 1e6 * centsPerBtc)
759
+ )
427
760
  },
428
761
  ["MILLIBITCOIN" /* MILLIBITCOIN */]: {
429
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e3),
762
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e3,
430
763
  ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v * 1e3,
431
764
  ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v,
432
765
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e8,
433
766
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 1e6,
434
- ["SATOSHI" /* SATOSHI */]: (v) => v * 1e5
767
+ ["SATOSHI" /* SATOSHI */]: (v) => v * 1e5,
768
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
769
+ /* Round without decimals since we're returning cents: */
770
+ round(v / 1e3 * centsPerBtc)
771
+ )
435
772
  },
436
773
  ["MILLISATOSHI" /* MILLISATOSHI */]: {
437
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e11),
438
- ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => Math.round(v / 1e5),
439
- ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e8),
774
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e11,
775
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v / 1e5,
776
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v / 1e8,
440
777
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v,
441
- ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => Math.round(v / 100),
442
- ["SATOSHI" /* SATOSHI */]: (v) => Math.round(v / 1e3)
778
+ ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v / 100,
779
+ ["SATOSHI" /* SATOSHI */]: (v) => v / 1e3,
780
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
781
+ /* Round without decimals since we're returning cents: */
782
+ round(v / 1e11 * centsPerBtc)
783
+ )
443
784
  },
444
785
  ["NANOBITCOIN" /* NANOBITCOIN */]: {
445
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e9),
446
- ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => Math.round(v / 1e3),
447
- ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e6),
786
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e9,
787
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v / 1e3,
788
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v / 1e6,
448
789
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 100,
449
790
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v,
450
- ["SATOSHI" /* SATOSHI */]: (v) => Math.round(v / 10)
791
+ ["SATOSHI" /* SATOSHI */]: (v) => v / 10,
792
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
793
+ /* Round without decimals since we're returning cents: */
794
+ round(v / 1e9 * centsPerBtc)
795
+ )
451
796
  },
452
797
  ["SATOSHI" /* SATOSHI */]: {
453
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e8),
454
- ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => Math.round(v / 100),
455
- ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e5),
798
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e8,
799
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v / 100,
800
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v / 1e5,
456
801
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e3,
457
802
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 10,
458
- ["SATOSHI" /* SATOSHI */]: (v) => v
803
+ ["SATOSHI" /* SATOSHI */]: (v) => v,
804
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
805
+ /* Round without decimals since we're returning cents: */
806
+ round(v / 1e8 * centsPerBtc)
807
+ )
808
+ },
809
+ ["USD" /* USD */]: {
810
+ ["BITCOIN" /* BITCOIN */]: (v, centsPerBtc = 1) => v / centsPerBtc,
811
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e6,
812
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e3,
813
+ ["MILLISATOSHI" /* MILLISATOSHI */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e11,
814
+ ["NANOBITCOIN" /* NANOBITCOIN */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e9,
815
+ ["SATOSHI" /* SATOSHI */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e8,
816
+ ["USD" /* USD */]: (v) => v
459
817
  }
460
818
  };
461
- var convertCurrencyAmount = (from, toUnit) => {
462
- if (from.originalUnit === "FUTURE_VALUE" /* FUTURE_VALUE */ || from.originalUnit === "USD" /* USD */ || toUnit === "FUTURE_VALUE" /* FUTURE_VALUE */ || toUnit === "USD" /* USD */) {
819
+ function convertCurrencyAmountValue(fromUnit, toUnit, amount, centsPerBtc = 1) {
820
+ if (fromUnit === "FUTURE_VALUE" /* FUTURE_VALUE */ || toUnit === "FUTURE_VALUE" /* FUTURE_VALUE */) {
463
821
  throw new LightsparkException_default("CurrencyError", `Unsupported CurrencyUnit.`);
464
822
  }
465
- const conversionFn = CONVERSION_MAP[from.originalUnit][toUnit];
823
+ if (fromUnit === toUnit) {
824
+ return amount;
825
+ }
826
+ const conversionFn = CONVERSION_MAP[fromUnit][toUnit];
466
827
  if (!conversionFn) {
467
828
  throw new LightsparkException_default(
468
829
  "CurrencyError",
469
- `Cannot convert from ${from.originalUnit} to ${toUnit}`
830
+ `Cannot convert from ${fromUnit} to ${toUnit}`
470
831
  );
471
832
  }
833
+ return conversionFn(amount, centsPerBtc);
834
+ }
835
+ var convertCurrencyAmount = (from, toUnit) => {
836
+ const value = convertCurrencyAmountValue(
837
+ from.originalUnit,
838
+ toUnit,
839
+ from.originalValue
840
+ );
472
841
  return {
473
842
  ...from,
474
843
  preferredCurrencyUnit: toUnit,
475
- preferredCurrencyValueApprox: conversionFn(from.originalValue),
476
- preferredCurrencyValueRounded: conversionFn(from.originalValue)
844
+ preferredCurrencyValueApprox: value,
845
+ preferredCurrencyValueRounded: value
846
+ };
847
+ };
848
+ function isCurrencyAmountObj(arg) {
849
+ return typeof arg === "object" && arg !== null && "value" in arg && "unit" in arg;
850
+ }
851
+ function isCurrencyAmount(arg) {
852
+ return typeof arg === "object" && arg !== null && "originalValue" in arg && "originalUnit" in arg && "preferredCurrencyUnit" in arg && "preferredCurrencyValueRounded" in arg && "preferredCurrencyValueApprox" in arg;
853
+ }
854
+ function asNumber(value) {
855
+ if (typeof value === "string") {
856
+ return Number(value);
857
+ }
858
+ return value || 0;
859
+ }
860
+ function getCurrencyAmount(currencyAmountArg) {
861
+ let value = 0;
862
+ let unit = void 0;
863
+ if (isCurrencyAmountObj(currencyAmountArg)) {
864
+ value = asNumber(currencyAmountArg.value);
865
+ unit = currencyAmountArg.unit;
866
+ } else if (isCurrencyAmount(currencyAmountArg)) {
867
+ value = currencyAmountArg.originalValue;
868
+ unit = currencyAmountArg.originalUnit;
869
+ }
870
+ return {
871
+ value: asNumber(value),
872
+ unit: unit || "SATOSHI" /* SATOSHI */
873
+ };
874
+ }
875
+ function mapCurrencyAmount(currencyAmountArg, centsPerBtc = 1) {
876
+ const { value, unit } = getCurrencyAmount(currencyAmountArg);
877
+ const convert = convertCurrencyAmountValue;
878
+ const sats = convert(unit, "SATOSHI" /* SATOSHI */, value, centsPerBtc);
879
+ const btc = convert(unit, "BITCOIN" /* BITCOIN */, value, centsPerBtc);
880
+ const msats = convert(unit, "MILLISATOSHI" /* MILLISATOSHI */, value, centsPerBtc);
881
+ const usd = convert(unit, "USD" /* USD */, value, centsPerBtc);
882
+ const mibtc = convert(unit, "MICROBITCOIN" /* MICROBITCOIN */, value, centsPerBtc);
883
+ const mlbtc = convert(unit, "MILLIBITCOIN" /* MILLIBITCOIN */, value, centsPerBtc);
884
+ const nbtc = convert(unit, "NANOBITCOIN" /* NANOBITCOIN */, value, centsPerBtc);
885
+ const mapWithCurrencyUnits = {
886
+ ["BITCOIN" /* BITCOIN */]: btc,
887
+ ["SATOSHI" /* SATOSHI */]: sats,
888
+ ["MILLISATOSHI" /* MILLISATOSHI */]: msats,
889
+ ["USD" /* USD */]: usd,
890
+ ["MICROBITCOIN" /* MICROBITCOIN */]: mibtc,
891
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: mlbtc,
892
+ ["NANOBITCOIN" /* NANOBITCOIN */]: nbtc,
893
+ ["FUTURE_VALUE" /* FUTURE_VALUE */]: NaN,
894
+ formatted: {
895
+ ["BITCOIN" /* BITCOIN */]: formatCurrencyStr({
896
+ value: btc,
897
+ unit: "BITCOIN" /* BITCOIN */
898
+ }),
899
+ ["SATOSHI" /* SATOSHI */]: formatCurrencyStr({
900
+ value: sats,
901
+ unit: "SATOSHI" /* SATOSHI */
902
+ }),
903
+ ["MILLISATOSHI" /* MILLISATOSHI */]: formatCurrencyStr({
904
+ value: msats,
905
+ unit: "MILLISATOSHI" /* MILLISATOSHI */
906
+ }),
907
+ ["MICROBITCOIN" /* MICROBITCOIN */]: formatCurrencyStr({
908
+ value: mibtc,
909
+ unit: "MICROBITCOIN" /* MICROBITCOIN */
910
+ }),
911
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: formatCurrencyStr({
912
+ value: mlbtc,
913
+ unit: "MILLIBITCOIN" /* MILLIBITCOIN */
914
+ }),
915
+ ["NANOBITCOIN" /* NANOBITCOIN */]: formatCurrencyStr({
916
+ value: nbtc,
917
+ unit: "NANOBITCOIN" /* NANOBITCOIN */
918
+ }),
919
+ ["USD" /* USD */]: formatCurrencyStr({
920
+ value: usd,
921
+ unit: "USD" /* USD */
922
+ }),
923
+ ["FUTURE_VALUE" /* FUTURE_VALUE */]: "-"
924
+ }
925
+ };
926
+ return {
927
+ ...mapWithCurrencyUnits,
928
+ btc,
929
+ sats,
930
+ msats,
931
+ isZero: msats === 0,
932
+ isLessThan: (other) => {
933
+ if (isNumber(other)) {
934
+ return msats < other;
935
+ }
936
+ if (isCurrencyAmountObj(other)) {
937
+ other = mapCurrencyAmount(other);
938
+ }
939
+ return msats < other.msats;
940
+ },
941
+ isGreaterThan: (other) => {
942
+ if (isNumber(other)) {
943
+ return msats > other;
944
+ }
945
+ if (isCurrencyAmountObj(other)) {
946
+ other = mapCurrencyAmount(other);
947
+ }
948
+ return msats > other.msats;
949
+ },
950
+ isEqualTo: (other) => {
951
+ if (isNumber(other)) {
952
+ return msats === other;
953
+ }
954
+ if (isCurrencyAmountObj(other)) {
955
+ other = mapCurrencyAmount(other);
956
+ }
957
+ return msats === other.msats;
958
+ },
959
+ formatted: {
960
+ ...mapWithCurrencyUnits.formatted,
961
+ btc: mapWithCurrencyUnits.formatted["BITCOIN" /* BITCOIN */],
962
+ sats: mapWithCurrencyUnits.formatted["SATOSHI" /* SATOSHI */],
963
+ msats: mapWithCurrencyUnits.formatted["MILLISATOSHI" /* MILLISATOSHI */]
964
+ },
965
+ type: "CurrencyMap"
477
966
  };
967
+ }
968
+ var isCurrencyMap = (currencyMap) => typeof currencyMap === "object" && currencyMap !== null && "type" in currencyMap && typeof currencyMap.type === "string" && currencyMap.type === "CurrencyMap";
969
+ var abbrCurrencyUnit = (unit) => {
970
+ switch (unit) {
971
+ case "BITCOIN" /* BITCOIN */:
972
+ return "BTC";
973
+ case "SATOSHI" /* SATOSHI */:
974
+ return "SAT";
975
+ case "MILLISATOSHI" /* MILLISATOSHI */:
976
+ return "MSAT";
977
+ case "USD" /* USD */:
978
+ return "USD";
979
+ }
980
+ return "Unsupported CurrencyUnit";
478
981
  };
982
+ function formatCurrencyStr(amount, maxFractionDigits, compact, showBtcSymbol = false, options = {}) {
983
+ const currencyAmount = getCurrencyAmount(amount);
984
+ let { value: num } = currencyAmount;
985
+ const { unit } = currencyAmount;
986
+ if (unit === "USD" /* USD */) {
987
+ num = num / 100;
988
+ }
989
+ function getDefaultMaxFractionDigits(defaultDigits) {
990
+ return typeof maxFractionDigits === "undefined" ? compact ? 1 : defaultDigits : maxFractionDigits;
991
+ }
992
+ const symbol = !showBtcSymbol ? "" : unit === "BITCOIN" /* BITCOIN */ ? "\uE903" : unit === "SATOSHI" /* SATOSHI */ ? "\uE902" : "";
993
+ const currentLocale = getCurrentLocale();
994
+ switch (unit) {
995
+ case "BITCOIN" /* BITCOIN */:
996
+ return `${symbol}${num.toLocaleString(currentLocale, {
997
+ notation: compact ? "compact" : void 0,
998
+ maximumFractionDigits: getDefaultMaxFractionDigits(4),
999
+ ...options
1000
+ })}`;
1001
+ case "MILLISATOSHI" /* MILLISATOSHI */:
1002
+ case "SATOSHI" /* SATOSHI */:
1003
+ case "MICROBITCOIN" /* MICROBITCOIN */:
1004
+ case "MILLIBITCOIN" /* MILLIBITCOIN */:
1005
+ case "NANOBITCOIN" /* NANOBITCOIN */:
1006
+ default:
1007
+ return `${symbol}${num.toLocaleString(currentLocale, {
1008
+ notation: compact ? "compact" : void 0,
1009
+ maximumFractionDigits: getDefaultMaxFractionDigits(0),
1010
+ ...options
1011
+ })}`;
1012
+ case "USD" /* USD */:
1013
+ return num.toLocaleString(currentLocale, {
1014
+ style: "currency",
1015
+ currency: defaultCurrencyCode,
1016
+ notation: compact ? "compact" : void 0,
1017
+ maximumFractionDigits: getDefaultMaxFractionDigits(2),
1018
+ ...options
1019
+ });
1020
+ }
1021
+ }
1022
+ function separateCurrencyStrParts(currencyStr) {
1023
+ const symbol = currencyStr.replace(/[0-9\s\u00a0.,]/g, "");
1024
+ const amount = currencyStr.replace(/[^\d.,-]/g, "");
1025
+ return { symbol, amount };
1026
+ }
1027
+ function localeToCurrencySymbol(locale) {
1028
+ const currencyCode = localeToCurrencyCode(locale);
1029
+ const formatted = new Intl.NumberFormat(locale, {
1030
+ style: "currency",
1031
+ currency: currencyCode,
1032
+ useGrouping: false,
1033
+ // to avoid thousands separators
1034
+ minimumFractionDigits: 0,
1035
+ maximumFractionDigits: 0
1036
+ }).format(0);
1037
+ const { symbol } = separateCurrencyStrParts(formatted);
1038
+ return symbol;
1039
+ }
479
1040
 
480
1041
  // src/utils/errors.ts
481
1042
  var isError = (e) => {
@@ -958,6 +1519,7 @@ var apiDomainForEnvironment = (environment) => {
958
1519
  var ServerEnvironment_default = ServerEnvironment;
959
1520
  // Annotate the CommonJS export names for ESM import in node:
960
1521
  0 && (module.exports = {
1522
+ CurrencyUnit,
961
1523
  DefaultCrypto,
962
1524
  KeyOrAlias,
963
1525
  LightsparkAuthException,
@@ -972,22 +1534,39 @@ var ServerEnvironment_default = ServerEnvironment;
972
1534
  SigningKey,
973
1535
  SigningKeyType,
974
1536
  StubAuthProvider,
1537
+ abbrCurrencyUnit,
975
1538
  apiDomainForEnvironment,
976
1539
  b64decode,
977
1540
  b64encode,
978
1541
  bytesToHex,
1542
+ clamp,
979
1543
  convertCurrencyAmount,
1544
+ convertCurrencyAmountValue,
1545
+ countryCodesToCurrencyCodes,
980
1546
  createSha256Hash,
1547
+ defaultCurrencyCode,
1548
+ formatCurrencyStr,
1549
+ getCurrentLocale,
981
1550
  getErrorMsg,
982
1551
  hexToBytes,
983
1552
  isBrowser,
1553
+ isCurrencyAmount,
1554
+ isCurrencyAmountObj,
1555
+ isCurrencyMap,
984
1556
  isError,
985
1557
  isErrorMsg,
986
1558
  isErrorWithMessage,
987
1559
  isNode,
1560
+ isNumber,
988
1561
  isTest,
989
1562
  isType,
1563
+ linearInterpolate,
1564
+ localeToCurrencyCode,
1565
+ localeToCurrencySymbol,
1566
+ mapCurrencyAmount,
990
1567
  pollUntil,
1568
+ round,
1569
+ separateCurrencyStrParts,
991
1570
  sleep,
992
1571
  urlsafe_b64decode
993
1572
  });