@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.
@@ -30,21 +30,39 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/utils/index.ts
31
31
  var utils_exports = {};
32
32
  __export(utils_exports, {
33
+ CurrencyUnit: () => CurrencyUnit,
34
+ abbrCurrencyUnit: () => abbrCurrencyUnit,
33
35
  b64decode: () => b64decode,
34
36
  b64encode: () => b64encode,
35
37
  bytesToHex: () => bytesToHex,
38
+ clamp: () => clamp,
36
39
  convertCurrencyAmount: () => convertCurrencyAmount,
40
+ convertCurrencyAmountValue: () => convertCurrencyAmountValue,
41
+ countryCodesToCurrencyCodes: () => countryCodesToCurrencyCodes,
37
42
  createSha256Hash: () => createSha256Hash,
43
+ defaultCurrencyCode: () => defaultCurrencyCode,
44
+ formatCurrencyStr: () => formatCurrencyStr,
45
+ getCurrentLocale: () => getCurrentLocale,
38
46
  getErrorMsg: () => getErrorMsg,
39
47
  hexToBytes: () => hexToBytes,
40
48
  isBrowser: () => isBrowser,
49
+ isCurrencyAmount: () => isCurrencyAmount,
50
+ isCurrencyAmountObj: () => isCurrencyAmountObj,
51
+ isCurrencyMap: () => isCurrencyMap,
41
52
  isError: () => isError,
42
53
  isErrorMsg: () => isErrorMsg,
43
54
  isErrorWithMessage: () => isErrorWithMessage,
44
55
  isNode: () => isNode,
56
+ isNumber: () => isNumber,
45
57
  isTest: () => isTest,
46
58
  isType: () => isType,
59
+ linearInterpolate: () => linearInterpolate,
60
+ localeToCurrencyCode: () => localeToCurrencyCode,
61
+ localeToCurrencySymbol: () => localeToCurrencySymbol,
62
+ mapCurrencyAmount: () => mapCurrencyAmount,
47
63
  pollUntil: () => pollUntil,
64
+ round: () => round,
65
+ separateCurrencyStrParts: () => separateCurrencyStrParts,
48
66
  sleep: () => sleep,
49
67
  urlsafe_b64decode: () => urlsafe_b64decode
50
68
  });
@@ -147,7 +165,314 @@ var LightsparkException = class extends Error {
147
165
  };
148
166
  var LightsparkException_default = LightsparkException;
149
167
 
168
+ // src/utils/locale.ts
169
+ function getCurrentLocale() {
170
+ return Intl.NumberFormat().resolvedOptions().locale;
171
+ }
172
+
173
+ // src/utils/localeToCurrencyCodes.ts
174
+ var countryCodesToCurrencyCodes = {
175
+ AD: "EUR",
176
+ // AE: "AED",
177
+ // AF: "AFN",
178
+ // AG: "XCD",
179
+ // AI: "XCD",
180
+ // AL: "ALL",
181
+ // AM: "AMD",
182
+ // AO: "AOA",
183
+ AR: "ARS",
184
+ AS: "USD",
185
+ AT: "EUR",
186
+ AU: "AUD",
187
+ // AW: "AWG",
188
+ AX: "EUR",
189
+ // AZ: "AZN",
190
+ // BA: "BAM",
191
+ // BB: "BBD",
192
+ // BD: "BDT",
193
+ BE: "EUR",
194
+ // BF: "XOF",
195
+ // BG: "BGN",
196
+ // BH: "BHD",
197
+ // BI: "BIF",
198
+ // BJ: "XOF",
199
+ BL: "EUR",
200
+ // BM: "BMD",
201
+ // BN: "BND",
202
+ // BO: "BOB",
203
+ BQ: "USD",
204
+ BR: "BRL",
205
+ // BS: "BSD",
206
+ // BT: "BTN",
207
+ // BV: "NOK",
208
+ // BW: "BWP",
209
+ // BY: "BYN",
210
+ // BZ: "BZD",
211
+ CA: "CAD",
212
+ // CC: "AUD",
213
+ // CD: "CDF",
214
+ // CF: "XAF",
215
+ // CG: "XAF",
216
+ // CH: "CHF",
217
+ // CI: "XOF",
218
+ // CK: "NZD",
219
+ // CL: "CLP",
220
+ // CM: "XAF",
221
+ // CN: "CNY",
222
+ CO: "COP",
223
+ // CR: "CRC",
224
+ // CU: "CUP",
225
+ // CV: "CVE",
226
+ // CW: "ANG",
227
+ // CX: "AUD",
228
+ CY: "EUR",
229
+ // CZ: "CZK",
230
+ DE: "EUR",
231
+ // DJ: "DJF",
232
+ // DK: "DKK",
233
+ // DM: "XCD",
234
+ // DO: "DOP",
235
+ // DZ: "DZD",
236
+ EC: "USD",
237
+ EE: "EUR",
238
+ // EG: "EGP",
239
+ // EH: "MAD",
240
+ // ER: "ERN",
241
+ ES: "EUR",
242
+ // ET: "ETB",
243
+ FI: "EUR",
244
+ // FJ: "FJD",
245
+ // FK: "FKP",
246
+ FM: "USD",
247
+ // FO: "DKK",
248
+ FR: "EUR",
249
+ // GA: "XAF",
250
+ GB: "GBP",
251
+ // GD: "XCD",
252
+ // GE: "GEL",
253
+ GF: "EUR",
254
+ GG: "GBP",
255
+ // GH: "GHS",
256
+ // GI: "GIP",
257
+ // GL: "DKK",
258
+ // GM: "GMD",
259
+ // GN: "GNF",
260
+ GP: "EUR",
261
+ // GQ: "XAF",
262
+ GR: "EUR",
263
+ GS: "GBP",
264
+ // GT: "GTQ",
265
+ GU: "USD",
266
+ // GW: "XOF",
267
+ // GY: "GYD",
268
+ // HK: "HKD",
269
+ // HM: "AUD",
270
+ // HN: "HNL",
271
+ // HR: "HRK",
272
+ // HT: "HTG",
273
+ // HU: "HUF",
274
+ // ID: "IDR",
275
+ IE: "EUR",
276
+ // IL: "ILS",
277
+ IM: "GBP",
278
+ IN: "INR",
279
+ IO: "USD",
280
+ // IQ: "IQD",
281
+ // IR: "IRR",
282
+ // IS: "ISK",
283
+ IT: "EUR",
284
+ JE: "GBP",
285
+ // JM: "JMD",
286
+ // JO: "JOD",
287
+ // JP: "JPY",
288
+ // KE: "KES",
289
+ // KG: "KGS",
290
+ // KH: "KHR",
291
+ // KI: "AUD",
292
+ // KM: "KMF",
293
+ // KN: "XCD",
294
+ // KP: "KPW",
295
+ // KR: "KRW",
296
+ // KW: "KWD",
297
+ // KY: "KYD",
298
+ // KZ: "KZT",
299
+ // LA: "LAK",
300
+ // LB: "LBP",
301
+ // LC: "XCD",
302
+ // LI: "CHF",
303
+ // LK: "LKR",
304
+ // LR: "LRD",
305
+ // LS: "LSL",
306
+ LT: "EUR",
307
+ LU: "EUR",
308
+ LV: "EUR",
309
+ // LY: "LYD",
310
+ // MA: "MAD",
311
+ MC: "EUR",
312
+ // MD: "MDL",
313
+ ME: "EUR",
314
+ MF: "EUR",
315
+ // MG: "MGA",
316
+ MH: "USD",
317
+ // MK: "MKD",
318
+ // ML: "XOF",
319
+ // MM: "MMK",
320
+ // MN: "MNT",
321
+ // MO: "MOP",
322
+ MP: "USD",
323
+ MQ: "EUR",
324
+ // MR: "MRO",
325
+ // MS: "XCD",
326
+ MT: "EUR",
327
+ // MU: "MUR",
328
+ // MV: "MVR",
329
+ // MW: "MWK",
330
+ MX: "MXN",
331
+ // MY: "MYR",
332
+ // MZ: "MZN",
333
+ // NA: "NAD",
334
+ // NC: "XPF",
335
+ // NE: "XOF",
336
+ NF: "AUD",
337
+ // NG: "NGN",
338
+ // NI: "NIO",
339
+ NL: "EUR",
340
+ // NO: "NOK",
341
+ // NP: "NPR",
342
+ NR: "AUD",
343
+ // NU: "NZD",
344
+ // NZ: "NZD",
345
+ // OM: "OMR",
346
+ // PA: "PAB",
347
+ // PE: "PEN",
348
+ // PF: "XPF",
349
+ // PG: "PGK",
350
+ // PH: "PHP",
351
+ // PK: "PKR",
352
+ // PL: "PLN",
353
+ PM: "EUR",
354
+ // PN: "NZD",
355
+ PR: "USD",
356
+ // PS: "ILS",
357
+ PT: "EUR",
358
+ PW: "USD",
359
+ // PY: "PYG",
360
+ // QA: "QAR",
361
+ RE: "EUR",
362
+ // RO: "RON",
363
+ // RS: "RSD",
364
+ // RU: "RUB",
365
+ // RW: "RWF",
366
+ // SA: "SAR",
367
+ // SB: "SBD",
368
+ // SC: "SCR",
369
+ // SD: "SDG",
370
+ // SE: "SEK",
371
+ // SG: "SGD",
372
+ // SH: "SHP",
373
+ SI: "EUR",
374
+ // SJ: "NOK",
375
+ SK: "EUR",
376
+ // SL: "SLL",
377
+ SM: "EUR",
378
+ // SN: "XOF",
379
+ // SO: "SOS",
380
+ // SR: "SRD",
381
+ // ST: "STD",
382
+ // SV: "SVC",
383
+ // SX: "ANG",
384
+ // SY: "SYP",
385
+ // SZ: "SZL",
386
+ TC: "USD",
387
+ // TD: "XAF",
388
+ TF: "EUR",
389
+ // TG: "XOF",
390
+ // TH: "THB",
391
+ // TJ: "TJS",
392
+ // TK: "NZD",
393
+ TL: "USD",
394
+ // TM: "TMT",
395
+ // TN: "TND",
396
+ // TO: "TOP",
397
+ // TR: "TRY",
398
+ // TT: "TTD",
399
+ TV: "AUD",
400
+ // TW: "TWD",
401
+ // TZ: "TZS",
402
+ // UA: "UAH",
403
+ // UG: "UGX",
404
+ UM: "USD",
405
+ US: "USD",
406
+ // UY: "UYU",
407
+ // UZ: "UZS",
408
+ VA: "EUR",
409
+ // VC: "XCD",
410
+ // VE: "VEF",
411
+ VG: "USD",
412
+ VI: "USD",
413
+ // VN: "VND",
414
+ // VU: "VUV",
415
+ // WF: "XPF",
416
+ // WS: "WST",
417
+ // YE: "YER",
418
+ YT: "EUR"
419
+ // ZA: "ZAR",
420
+ // ZM: "ZMW",
421
+ // ZW: "ZWL",
422
+ };
423
+ function getCountryCode(localeString) {
424
+ let components = localeString.split("_");
425
+ if (components.length === 2) {
426
+ return components.pop();
427
+ }
428
+ components = localeString.split("-");
429
+ if (components.length === 2) {
430
+ return components.pop();
431
+ }
432
+ return localeString;
433
+ }
434
+ function localeToCurrencyCode(locale) {
435
+ const countryCode = getCountryCode(locale);
436
+ return countryCodesToCurrencyCodes[countryCode];
437
+ }
438
+
439
+ // src/utils/numbers.ts
440
+ function clamp(val, min, max) {
441
+ return val > max ? max : val < min ? min : val;
442
+ }
443
+ function linearInterpolate(value, fromRangeStart, fromRangeEnd, toRangeStart, toRangeEnd) {
444
+ const fromRangeMax = fromRangeEnd - fromRangeStart;
445
+ const fromRangeVal = value - fromRangeStart;
446
+ const toRangeMax = toRangeEnd - toRangeStart;
447
+ const val = fromRangeVal / fromRangeMax * toRangeMax + toRangeStart;
448
+ return clamp(
449
+ val,
450
+ Math.min(toRangeStart, toRangeEnd),
451
+ Math.max(toRangeStart, toRangeEnd)
452
+ );
453
+ }
454
+ function round(num, decimalPlaces = 0) {
455
+ const p = Math.pow(10, decimalPlaces);
456
+ const n = num * p * (1 + Number.EPSILON);
457
+ return Math.round(n) / p;
458
+ }
459
+ function isNumber(value) {
460
+ return typeof value === "number";
461
+ }
462
+
150
463
  // src/utils/currency.ts
464
+ var defaultCurrencyCode = "USD";
465
+ var CurrencyUnit = /* @__PURE__ */ ((CurrencyUnit2) => {
466
+ CurrencyUnit2["FUTURE_VALUE"] = "FUTURE_VALUE";
467
+ CurrencyUnit2["BITCOIN"] = "BITCOIN";
468
+ CurrencyUnit2["SATOSHI"] = "SATOSHI";
469
+ CurrencyUnit2["MILLISATOSHI"] = "MILLISATOSHI";
470
+ CurrencyUnit2["USD"] = "USD";
471
+ CurrencyUnit2["NANOBITCOIN"] = "NANOBITCOIN";
472
+ CurrencyUnit2["MICROBITCOIN"] = "MICROBITCOIN";
473
+ CurrencyUnit2["MILLIBITCOIN"] = "MILLIBITCOIN";
474
+ return CurrencyUnit2;
475
+ })(CurrencyUnit || {});
151
476
  var CONVERSION_MAP = {
152
477
  ["BITCOIN" /* BITCOIN */]: {
153
478
  ["BITCOIN" /* BITCOIN */]: (v) => v,
@@ -155,67 +480,303 @@ var CONVERSION_MAP = {
155
480
  ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v * 1e3,
156
481
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e11,
157
482
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 1e9,
158
- ["SATOSHI" /* SATOSHI */]: (v) => v * 1e8
483
+ ["SATOSHI" /* SATOSHI */]: (v) => v * 1e8,
484
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
485
+ /* Round without decimals since we're returning cents: */
486
+ round(v * centsPerBtc, 2)
487
+ )
159
488
  },
160
489
  ["MICROBITCOIN" /* MICROBITCOIN */]: {
161
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e6),
490
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e6,
162
491
  ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v,
163
- ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e3),
492
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v / 1e3,
164
493
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e5,
165
494
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 1e3,
166
- ["SATOSHI" /* SATOSHI */]: (v) => v * 100
495
+ ["SATOSHI" /* SATOSHI */]: (v) => v * 100,
496
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
497
+ /* Round without decimals since we're returning cents: */
498
+ round(v / 1e6 * centsPerBtc)
499
+ )
167
500
  },
168
501
  ["MILLIBITCOIN" /* MILLIBITCOIN */]: {
169
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e3),
502
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e3,
170
503
  ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v * 1e3,
171
504
  ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v,
172
505
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e8,
173
506
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 1e6,
174
- ["SATOSHI" /* SATOSHI */]: (v) => v * 1e5
507
+ ["SATOSHI" /* SATOSHI */]: (v) => v * 1e5,
508
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
509
+ /* Round without decimals since we're returning cents: */
510
+ round(v / 1e3 * centsPerBtc)
511
+ )
175
512
  },
176
513
  ["MILLISATOSHI" /* MILLISATOSHI */]: {
177
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e11),
178
- ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => Math.round(v / 1e5),
179
- ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e8),
514
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e11,
515
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v / 1e5,
516
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v / 1e8,
180
517
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v,
181
- ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => Math.round(v / 100),
182
- ["SATOSHI" /* SATOSHI */]: (v) => Math.round(v / 1e3)
518
+ ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v / 100,
519
+ ["SATOSHI" /* SATOSHI */]: (v) => v / 1e3,
520
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
521
+ /* Round without decimals since we're returning cents: */
522
+ round(v / 1e11 * centsPerBtc)
523
+ )
183
524
  },
184
525
  ["NANOBITCOIN" /* NANOBITCOIN */]: {
185
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e9),
186
- ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => Math.round(v / 1e3),
187
- ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e6),
526
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e9,
527
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v / 1e3,
528
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v / 1e6,
188
529
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 100,
189
530
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v,
190
- ["SATOSHI" /* SATOSHI */]: (v) => Math.round(v / 10)
531
+ ["SATOSHI" /* SATOSHI */]: (v) => v / 10,
532
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
533
+ /* Round without decimals since we're returning cents: */
534
+ round(v / 1e9 * centsPerBtc)
535
+ )
191
536
  },
192
537
  ["SATOSHI" /* SATOSHI */]: {
193
- ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e8),
194
- ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => Math.round(v / 100),
195
- ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e5),
538
+ ["BITCOIN" /* BITCOIN */]: (v) => v / 1e8,
539
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v / 100,
540
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v / 1e5,
196
541
  ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e3,
197
542
  ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 10,
198
- ["SATOSHI" /* SATOSHI */]: (v) => v
543
+ ["SATOSHI" /* SATOSHI */]: (v) => v,
544
+ ["USD" /* USD */]: (v, centsPerBtc = 1) => (
545
+ /* Round without decimals since we're returning cents: */
546
+ round(v / 1e8 * centsPerBtc)
547
+ )
548
+ },
549
+ ["USD" /* USD */]: {
550
+ ["BITCOIN" /* BITCOIN */]: (v, centsPerBtc = 1) => v / centsPerBtc,
551
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e6,
552
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e3,
553
+ ["MILLISATOSHI" /* MILLISATOSHI */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e11,
554
+ ["NANOBITCOIN" /* NANOBITCOIN */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e9,
555
+ ["SATOSHI" /* SATOSHI */]: (v, centsPerBtc = 1) => v / centsPerBtc * 1e8,
556
+ ["USD" /* USD */]: (v) => v
199
557
  }
200
558
  };
201
- var convertCurrencyAmount = (from, toUnit) => {
202
- if (from.originalUnit === "FUTURE_VALUE" /* FUTURE_VALUE */ || from.originalUnit === "USD" /* USD */ || toUnit === "FUTURE_VALUE" /* FUTURE_VALUE */ || toUnit === "USD" /* USD */) {
559
+ function convertCurrencyAmountValue(fromUnit, toUnit, amount, centsPerBtc = 1) {
560
+ if (fromUnit === "FUTURE_VALUE" /* FUTURE_VALUE */ || toUnit === "FUTURE_VALUE" /* FUTURE_VALUE */) {
203
561
  throw new LightsparkException_default("CurrencyError", `Unsupported CurrencyUnit.`);
204
562
  }
205
- const conversionFn = CONVERSION_MAP[from.originalUnit][toUnit];
563
+ if (fromUnit === toUnit) {
564
+ return amount;
565
+ }
566
+ const conversionFn = CONVERSION_MAP[fromUnit][toUnit];
206
567
  if (!conversionFn) {
207
568
  throw new LightsparkException_default(
208
569
  "CurrencyError",
209
- `Cannot convert from ${from.originalUnit} to ${toUnit}`
570
+ `Cannot convert from ${fromUnit} to ${toUnit}`
210
571
  );
211
572
  }
573
+ return conversionFn(amount, centsPerBtc);
574
+ }
575
+ var convertCurrencyAmount = (from, toUnit) => {
576
+ const value = convertCurrencyAmountValue(
577
+ from.originalUnit,
578
+ toUnit,
579
+ from.originalValue
580
+ );
212
581
  return {
213
582
  ...from,
214
583
  preferredCurrencyUnit: toUnit,
215
- preferredCurrencyValueApprox: conversionFn(from.originalValue),
216
- preferredCurrencyValueRounded: conversionFn(from.originalValue)
584
+ preferredCurrencyValueApprox: value,
585
+ preferredCurrencyValueRounded: value
217
586
  };
218
587
  };
588
+ function isCurrencyAmountObj(arg) {
589
+ return typeof arg === "object" && arg !== null && "value" in arg && "unit" in arg;
590
+ }
591
+ function isCurrencyAmount(arg) {
592
+ return typeof arg === "object" && arg !== null && "originalValue" in arg && "originalUnit" in arg && "preferredCurrencyUnit" in arg && "preferredCurrencyValueRounded" in arg && "preferredCurrencyValueApprox" in arg;
593
+ }
594
+ function asNumber(value) {
595
+ if (typeof value === "string") {
596
+ return Number(value);
597
+ }
598
+ return value || 0;
599
+ }
600
+ function getCurrencyAmount(currencyAmountArg) {
601
+ let value = 0;
602
+ let unit = void 0;
603
+ if (isCurrencyAmountObj(currencyAmountArg)) {
604
+ value = asNumber(currencyAmountArg.value);
605
+ unit = currencyAmountArg.unit;
606
+ } else if (isCurrencyAmount(currencyAmountArg)) {
607
+ value = currencyAmountArg.originalValue;
608
+ unit = currencyAmountArg.originalUnit;
609
+ }
610
+ return {
611
+ value: asNumber(value),
612
+ unit: unit || "SATOSHI" /* SATOSHI */
613
+ };
614
+ }
615
+ function mapCurrencyAmount(currencyAmountArg, centsPerBtc = 1) {
616
+ const { value, unit } = getCurrencyAmount(currencyAmountArg);
617
+ const convert = convertCurrencyAmountValue;
618
+ const sats = convert(unit, "SATOSHI" /* SATOSHI */, value, centsPerBtc);
619
+ const btc = convert(unit, "BITCOIN" /* BITCOIN */, value, centsPerBtc);
620
+ const msats = convert(unit, "MILLISATOSHI" /* MILLISATOSHI */, value, centsPerBtc);
621
+ const usd = convert(unit, "USD" /* USD */, value, centsPerBtc);
622
+ const mibtc = convert(unit, "MICROBITCOIN" /* MICROBITCOIN */, value, centsPerBtc);
623
+ const mlbtc = convert(unit, "MILLIBITCOIN" /* MILLIBITCOIN */, value, centsPerBtc);
624
+ const nbtc = convert(unit, "NANOBITCOIN" /* NANOBITCOIN */, value, centsPerBtc);
625
+ const mapWithCurrencyUnits = {
626
+ ["BITCOIN" /* BITCOIN */]: btc,
627
+ ["SATOSHI" /* SATOSHI */]: sats,
628
+ ["MILLISATOSHI" /* MILLISATOSHI */]: msats,
629
+ ["USD" /* USD */]: usd,
630
+ ["MICROBITCOIN" /* MICROBITCOIN */]: mibtc,
631
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: mlbtc,
632
+ ["NANOBITCOIN" /* NANOBITCOIN */]: nbtc,
633
+ ["FUTURE_VALUE" /* FUTURE_VALUE */]: NaN,
634
+ formatted: {
635
+ ["BITCOIN" /* BITCOIN */]: formatCurrencyStr({
636
+ value: btc,
637
+ unit: "BITCOIN" /* BITCOIN */
638
+ }),
639
+ ["SATOSHI" /* SATOSHI */]: formatCurrencyStr({
640
+ value: sats,
641
+ unit: "SATOSHI" /* SATOSHI */
642
+ }),
643
+ ["MILLISATOSHI" /* MILLISATOSHI */]: formatCurrencyStr({
644
+ value: msats,
645
+ unit: "MILLISATOSHI" /* MILLISATOSHI */
646
+ }),
647
+ ["MICROBITCOIN" /* MICROBITCOIN */]: formatCurrencyStr({
648
+ value: mibtc,
649
+ unit: "MICROBITCOIN" /* MICROBITCOIN */
650
+ }),
651
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: formatCurrencyStr({
652
+ value: mlbtc,
653
+ unit: "MILLIBITCOIN" /* MILLIBITCOIN */
654
+ }),
655
+ ["NANOBITCOIN" /* NANOBITCOIN */]: formatCurrencyStr({
656
+ value: nbtc,
657
+ unit: "NANOBITCOIN" /* NANOBITCOIN */
658
+ }),
659
+ ["USD" /* USD */]: formatCurrencyStr({
660
+ value: usd,
661
+ unit: "USD" /* USD */
662
+ }),
663
+ ["FUTURE_VALUE" /* FUTURE_VALUE */]: "-"
664
+ }
665
+ };
666
+ return {
667
+ ...mapWithCurrencyUnits,
668
+ btc,
669
+ sats,
670
+ msats,
671
+ isZero: msats === 0,
672
+ isLessThan: (other) => {
673
+ if (isNumber(other)) {
674
+ return msats < other;
675
+ }
676
+ if (isCurrencyAmountObj(other)) {
677
+ other = mapCurrencyAmount(other);
678
+ }
679
+ return msats < other.msats;
680
+ },
681
+ isGreaterThan: (other) => {
682
+ if (isNumber(other)) {
683
+ return msats > other;
684
+ }
685
+ if (isCurrencyAmountObj(other)) {
686
+ other = mapCurrencyAmount(other);
687
+ }
688
+ return msats > other.msats;
689
+ },
690
+ isEqualTo: (other) => {
691
+ if (isNumber(other)) {
692
+ return msats === other;
693
+ }
694
+ if (isCurrencyAmountObj(other)) {
695
+ other = mapCurrencyAmount(other);
696
+ }
697
+ return msats === other.msats;
698
+ },
699
+ formatted: {
700
+ ...mapWithCurrencyUnits.formatted,
701
+ btc: mapWithCurrencyUnits.formatted["BITCOIN" /* BITCOIN */],
702
+ sats: mapWithCurrencyUnits.formatted["SATOSHI" /* SATOSHI */],
703
+ msats: mapWithCurrencyUnits.formatted["MILLISATOSHI" /* MILLISATOSHI */]
704
+ },
705
+ type: "CurrencyMap"
706
+ };
707
+ }
708
+ var isCurrencyMap = (currencyMap) => typeof currencyMap === "object" && currencyMap !== null && "type" in currencyMap && typeof currencyMap.type === "string" && currencyMap.type === "CurrencyMap";
709
+ var abbrCurrencyUnit = (unit) => {
710
+ switch (unit) {
711
+ case "BITCOIN" /* BITCOIN */:
712
+ return "BTC";
713
+ case "SATOSHI" /* SATOSHI */:
714
+ return "SAT";
715
+ case "MILLISATOSHI" /* MILLISATOSHI */:
716
+ return "MSAT";
717
+ case "USD" /* USD */:
718
+ return "USD";
719
+ }
720
+ return "Unsupported CurrencyUnit";
721
+ };
722
+ function formatCurrencyStr(amount, maxFractionDigits, compact, showBtcSymbol = false, options = {}) {
723
+ const currencyAmount = getCurrencyAmount(amount);
724
+ let { value: num } = currencyAmount;
725
+ const { unit } = currencyAmount;
726
+ if (unit === "USD" /* USD */) {
727
+ num = num / 100;
728
+ }
729
+ function getDefaultMaxFractionDigits(defaultDigits) {
730
+ return typeof maxFractionDigits === "undefined" ? compact ? 1 : defaultDigits : maxFractionDigits;
731
+ }
732
+ const symbol = !showBtcSymbol ? "" : unit === "BITCOIN" /* BITCOIN */ ? "\uE903" : unit === "SATOSHI" /* SATOSHI */ ? "\uE902" : "";
733
+ const currentLocale = getCurrentLocale();
734
+ switch (unit) {
735
+ case "BITCOIN" /* BITCOIN */:
736
+ return `${symbol}${num.toLocaleString(currentLocale, {
737
+ notation: compact ? "compact" : void 0,
738
+ maximumFractionDigits: getDefaultMaxFractionDigits(4),
739
+ ...options
740
+ })}`;
741
+ case "MILLISATOSHI" /* MILLISATOSHI */:
742
+ case "SATOSHI" /* SATOSHI */:
743
+ case "MICROBITCOIN" /* MICROBITCOIN */:
744
+ case "MILLIBITCOIN" /* MILLIBITCOIN */:
745
+ case "NANOBITCOIN" /* NANOBITCOIN */:
746
+ default:
747
+ return `${symbol}${num.toLocaleString(currentLocale, {
748
+ notation: compact ? "compact" : void 0,
749
+ maximumFractionDigits: getDefaultMaxFractionDigits(0),
750
+ ...options
751
+ })}`;
752
+ case "USD" /* USD */:
753
+ return num.toLocaleString(currentLocale, {
754
+ style: "currency",
755
+ currency: defaultCurrencyCode,
756
+ notation: compact ? "compact" : void 0,
757
+ maximumFractionDigits: getDefaultMaxFractionDigits(2),
758
+ ...options
759
+ });
760
+ }
761
+ }
762
+ function separateCurrencyStrParts(currencyStr) {
763
+ const symbol = currencyStr.replace(/[0-9\s\u00a0.,]/g, "");
764
+ const amount = currencyStr.replace(/[^\d.,-]/g, "");
765
+ return { symbol, amount };
766
+ }
767
+ function localeToCurrencySymbol(locale) {
768
+ const currencyCode = localeToCurrencyCode(locale);
769
+ const formatted = new Intl.NumberFormat(locale, {
770
+ style: "currency",
771
+ currency: currencyCode,
772
+ useGrouping: false,
773
+ // to avoid thousands separators
774
+ minimumFractionDigits: 0,
775
+ maximumFractionDigits: 0
776
+ }).format(0);
777
+ const { symbol } = separateCurrencyStrParts(formatted);
778
+ return symbol;
779
+ }
219
780
 
220
781
  // src/utils/errors.ts
221
782
  var isError = (e) => {
@@ -366,21 +927,39 @@ var isType = (typename) => (node) => {
366
927
  };
367
928
  // Annotate the CommonJS export names for ESM import in node:
368
929
  0 && (module.exports = {
930
+ CurrencyUnit,
931
+ abbrCurrencyUnit,
369
932
  b64decode,
370
933
  b64encode,
371
934
  bytesToHex,
935
+ clamp,
372
936
  convertCurrencyAmount,
937
+ convertCurrencyAmountValue,
938
+ countryCodesToCurrencyCodes,
373
939
  createSha256Hash,
940
+ defaultCurrencyCode,
941
+ formatCurrencyStr,
942
+ getCurrentLocale,
374
943
  getErrorMsg,
375
944
  hexToBytes,
376
945
  isBrowser,
946
+ isCurrencyAmount,
947
+ isCurrencyAmountObj,
948
+ isCurrencyMap,
377
949
  isError,
378
950
  isErrorMsg,
379
951
  isErrorWithMessage,
380
952
  isNode,
953
+ isNumber,
381
954
  isTest,
382
955
  isType,
956
+ linearInterpolate,
957
+ localeToCurrencyCode,
958
+ localeToCurrencySymbol,
959
+ mapCurrencyAmount,
383
960
  pollUntil,
961
+ round,
962
+ separateCurrencyStrParts,
384
963
  sleep,
385
964
  urlsafe_b64decode
386
965
  });