@funkit/utils 1.0.0 → 1.0.2

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.d.ts CHANGED
@@ -12,6 +12,7 @@ export * from './groupBy';
12
12
  export * from './indexBy';
13
13
  export * from './isMobile';
14
14
  export * from './isNotNullish';
15
+ export * from './json';
15
16
  export * from './locale';
16
17
  export * from './mobile';
17
18
  export * from './noop';
package/dist/index.js CHANGED
@@ -220,7 +220,7 @@ function formatCurrencyAndStringify(amount, options = {}, numberFormatOptions =
220
220
  function formatPercent(percent, decimalPlaces = 2) {
221
221
  const maxDecimal = String(percent).split(".")[1]?.length || 2;
222
222
  const finalDecimal = Math.max(Math.min(maxDecimal, decimalPlaces), 2);
223
- return percent.toFixed(finalDecimal) + "%";
223
+ return `${percent.toFixed(finalDecimal)}%`;
224
224
  }
225
225
  function formatCryptoAndStringify(amount, platform = "", useCurrencyAbbreviation = true, options) {
226
226
  const defaultOptions = {
@@ -320,21 +320,15 @@ function round(value, decimals, method = "round") {
320
320
 
321
321
  // src/utils/formatFees.ts
322
322
  function formatDynamicFeeUsd(fee, total, options = {}) {
323
- const { percentThreshold = 2.5 } = options;
324
323
  if (fee < 0.01) {
325
324
  return `<${formatCurrencyAndStringify(0.01)}`;
326
325
  }
326
+ const { percentThreshold = 2.5 } = options;
327
327
  if (percentThreshold !== null && fee > percentThreshold) {
328
328
  return formatPercent(fee / total * 100);
329
329
  }
330
330
  return formatCurrencyAndStringify(fee);
331
331
  }
332
- function formatDynamicFeeToken(fee, symbol) {
333
- if (fee < 1e-5) {
334
- return `<${formatCryptoAndStringify(1e-5, symbol)}`;
335
- }
336
- return formatCryptoAndStringify(fee, symbol);
337
- }
338
332
 
339
333
  // src/utils/formatTimestamp.ts
340
334
  var fullMonthNames = [
@@ -465,6 +459,25 @@ function isMobile() {
465
459
  return isAndroid() || isIOS();
466
460
  }
467
461
 
462
+ // src/utils/json.ts
463
+ function safeParseJsonArray(src) {
464
+ try {
465
+ const value = src ? JSON.parse(src) : [];
466
+ return Array.isArray(value) ? value : [];
467
+ } catch {
468
+ return [];
469
+ }
470
+ }
471
+ function safeParseJson(src, onError) {
472
+ if (!src) return null;
473
+ try {
474
+ return JSON.parse(src);
475
+ } catch (e) {
476
+ onError?.(e);
477
+ return null;
478
+ }
479
+ }
480
+
468
481
  // src/utils/locale.ts
469
482
  var detectedBrowserLocale = () => {
470
483
  if (typeof window !== "undefined" && typeof navigator !== "undefined") {
@@ -519,7 +532,6 @@ export {
519
532
  formatAddressLastFour,
520
533
  formatCryptoAndStringify,
521
534
  formatCurrencyAndStringify,
522
- formatDynamicFeeToken,
523
535
  formatDynamicFeeUsd,
524
536
  formatNumberAndStringify,
525
537
  formatPercent,
@@ -547,6 +559,8 @@ export {
547
559
  parseInputToNumber,
548
560
  redirectInMobile,
549
561
  round,
550
- roundUpToXDecimalPlaces
562
+ roundUpToXDecimalPlaces,
563
+ safeParseJson,
564
+ safeParseJsonArray
551
565
  };
552
566
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/utils/address.ts", "../src/utils/browsers.ts", "../src/utils/capitalize.ts", "../src/utils/colors.ts", "../src/utils/debounce.ts", "../src/utils/deepMerge.ts", "../src/utils/exhaustiveCheck.ts", "../src/utils/isNotNullish.ts", "../src/utils/formatNumber.ts", "../src/utils/formatFees.ts", "../src/utils/formatTimestamp.ts", "../src/utils/groupBy.ts", "../src/utils/indexBy.ts", "../src/utils/isMobile.ts", "../src/utils/locale.ts", "../src/utils/mobile.ts", "../src/utils/noop.ts", "../src/utils/omitUndefinedValues.ts", "../src/utils/type.ts"],
4
- "sourcesContent": ["export function formatAddress(address: string): string {\n const leadingChars = 4\n const trailingChars = 4\n\n return address.length < leadingChars + trailingChars\n ? address\n : `${address.substring(0, leadingChars)}\\u2026${address.substring(\n address.length - trailingChars,\n )}`\n}\n\nexport function formatAddressLastFour(address: string): string {\n const trailingChars = 4\n return address.length < trailingChars\n ? address\n : `\\u2026${address.substring(address.length - trailingChars)}`\n}\n", "export function isSafari(): boolean {\n return (\n typeof navigator !== 'undefined' &&\n typeof navigator.userAgent !== 'undefined' &&\n /Version\\/([0-9._]+).*Safari/.test(navigator.userAgent) // Source: https://github.com/DamonOehlman/detect-browser/blob/master/src/index.ts\n )\n}\n\nexport function isArc(): boolean {\n return (\n typeof document !== 'undefined' &&\n getComputedStyle(document.body).getPropertyValue('--arc-palette-focus') !==\n ''\n )\n}\n\nexport enum BrowserType {\n Arc = 'Arc',\n Brave = 'Brave',\n Browser = 'Browser',\n Chrome = 'Chrome',\n Edge = 'Edge',\n Firefox = 'Firefox',\n Opera = 'Opera',\n Safari = 'Safari',\n}\n\nexport function getBrowser(): BrowserType {\n // bail out if `navigator` or `navigator.userAgent` is not available\n if (typeof navigator === 'undefined') return BrowserType.Browser\n const ua = navigator.userAgent?.toLowerCase()\n // @ts-expect-error - brave is not in the navigator type\n if (navigator.brave?.isBrave) return BrowserType.Brave\n if (ua?.indexOf('edg/') > -1) return BrowserType.Edge\n if (ua?.indexOf('op') > -1) return BrowserType.Opera\n if (isArc()) return BrowserType.Arc\n if (ua?.indexOf('chrome') > -1) return BrowserType.Chrome\n if (ua?.indexOf('firefox') > -1) return BrowserType.Firefox\n if (isSafari()) return BrowserType.Safari\n return BrowserType.Browser\n}\n", "export function capitalizeFirstLetter(val: string) {\n return String(val).charAt(0).toUpperCase() + String(val).slice(1)\n}\n", "export function colorToHex(color: string): string {\n // Check if the input is in RGB format\n const rgbMatch = color.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/)\n if (rgbMatch) {\n const [, r, g, b] = rgbMatch.map(Number)\n // Convert RGB to HEX\n const rHex = r.toString(16).padStart(2, '0')\n const gHex = g.toString(16).padStart(2, '0')\n const bHex = b.toString(16).padStart(2, '0')\n return `#${rHex}${gHex}${bHex}`\n }\n\n // Check if the input is in HEX format\n const hexMatch = color.match(/^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i)\n if (hexMatch) {\n return hexMatch[0].toLowerCase()\n }\n\n return color\n}\n\nexport const convertHexToRGBA = (hexCode: string, opacity = 1): string => {\n let hex = hexCode.replace('#', '')\n\n if (hex.length === 3) {\n hex = `${hex[0]}${hex[0]}${hex[1]}${hex[1]}${hex[2]}${hex[2]}`\n }\n\n const r = Number.parseInt(hex.substring(0, 2), 16)\n const g = Number.parseInt(hex.substring(2, 4), 16)\n const b = Number.parseInt(hex.substring(4, 6), 16)\n\n /* Backward compatibility for whole number based opacity values. */\n const finalOpacity = opacity > 1 && opacity <= 100 ? opacity / 100 : opacity\n\n return `rgba(${r},${g},${b},${finalOpacity})`\n}\n\nexport const isHexString = (color: string): boolean => {\n return /^#([0-9a-f]{3}){1,2}$/i.test(color)\n}\n", "export function debounce(fn: () => void, ms: number) {\n let timer: NodeJS.Timeout | null\n\n return () => {\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = setTimeout(() => {\n timer = null\n fn()\n }, ms)\n }\n}\n", "export type DeepPartial<T> = T extends\n | number\n | string\n | boolean\n | null\n | undefined\n ? T\n : {\n [P in keyof T]?: DeepPartial<T[P]>\n }\n\nfunction deepClone<T extends object>(obj: T): T {\n return JSON.parse(JSON.stringify(obj))\n}\n\n/** NOTE: merging arrays is undefined behavior */\nexport function deepMerge<T extends object>(\n origin: T,\n ...objects: DeepPartial<T>[]\n): T {\n const target = deepClone(origin) as T\n\n for (const obj of objects) {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n if (Array.isArray(value)) {\n // @ts-expect-error\n target[key] = value\n } else if (typeof value === 'object' && value !== null) {\n // @ts-expect-error\n target[key] = deepMerge(target[key], value)\n } else {\n // @ts-expect-error\n target[key] = value\n }\n }\n }\n }\n\n return target\n}\n", "export function exhaustiveCheck(_value: never): any {\n if (process.env.NODE_ENV === 'local') {\n throw new Error('exhaustiveCheck: should not reach this point')\n }\n}\n", "export function isNotNullish<T>(value: T | null | undefined): value is T {\n return value != null\n}\n", "import { isNotNullish } from './isNotNullish'\n\ninterface FormatNumberOptions {\n /** Numbers smaller than this will be converted to scientific notation */\n minBeforeUseScientific?: number\n /** If the number part for suffixed # is >= this, will use sci notation (e.g. 1,000M -> 1E3M) */\n maxNumberPartSizeForSuffix?: number\n /** The amount of decimal places to truncate to when softly truncating (to specify decimal places for suffix-truncation, e.g. 1.23M, use decimalPrecisionForSuffix) */\n softDecimalPrecision?: number\n /** Numbers >= this will have their decimals truncated aggressively */\n maxBeforeAggresiveDecimalTruncation?: number\n /** The amount of decimal places to truncate to when aggressively truncating (to specify decimal places for suffix-truncation, e.g. 1.23M, use decimalPrecisionForSuffix) */\n aggresiveDecimalPrecision?: number\n /** Numbers >= this will have a suffix added during truncation (e.g. 1.23M) */\n maxBeforeUseSuffix?: number\n /** The amount of decimal places to truncate suffix-truncated numbers to (e.g. 1.23M vs 1.2312M)*/\n decimalPrecisionForSuffix?: number\n /** The largest suffix to use (e.g. if 1000000, we will stop at M and not use the B suffix) */\n maxSuffixSize?: 1e3 | 1e6 | 1e9 | 1e12\n numberFormatOptions?: Intl.NumberFormatOptions\n /** Adds minimum significant digits value to force numbers to show decimal precision even when there are none 5 -> 5.00 */\n minimumSignificantDigits?: number\n}\n\nconst FORMAT_NUMBER_DEFAULT = {\n minBeforeUseScientific: 0.00001,\n maxBeforeAggresiveDecimalTruncation: 1,\n softDecimalPrecision: 5,\n aggresiveDecimalPrecision: 5,\n maxBeforeUseSuffix: 1000000,\n decimalPrecisionForSuffix: 5,\n maxSuffixSize: 1000000,\n maxNumberPartSizeForSuffix: 1e3,\n minimumSignificantDigits: 5,\n} satisfies FormatNumberOptions\n\n/**\n * Formats a number with conditional truncation, suffixation, and scientific notation.\n * @param number\n * @param options Customize the formatting conditions/behavior\n * @example Visualization, using default values:\n * ```\n * <--(1.23E-7)---0.00001------(0.12121)-------1-------(123,423.26)---1,000,000---(1.22M)--(100.23M)-->\n * _______<-minBeforeScientific maxBeforeAggressive-> maxBeforeUseSuffix-> ^ w/ maxSuffixSize\n * ```\n */\nexport function formatNumberAndStringify(\n number: number,\n options: FormatNumberOptions = FORMAT_NUMBER_DEFAULT,\n numberFormatOptions = {},\n) {\n const {\n minBeforeUseScientific,\n softDecimalPrecision,\n maxBeforeAggresiveDecimalTruncation,\n aggresiveDecimalPrecision,\n maxBeforeUseSuffix,\n decimalPrecisionForSuffix,\n maxSuffixSize,\n maxNumberPartSizeForSuffix,\n } = { ...FORMAT_NUMBER_DEFAULT, ...options }\n\n if (number === 0) {\n return number.toLocaleString('en', { ...numberFormatOptions })\n }\n if (!number) {\n return ''\n }\n const absoluteNumber = Math.abs(number)\n\n const roundedForSuffix = absoluteNumber.toFixed(decimalPrecisionForSuffix)\n // rounding to decimal precision may increment the number high enough to require a suffix\n if (Number(roundedForSuffix) >= maxBeforeUseSuffix) {\n return _formatTruncated(\n number,\n decimalPrecisionForSuffix,\n false,\n true,\n maxSuffixSize,\n maxNumberPartSizeForSuffix,\n numberFormatOptions,\n )\n }\n if (absoluteNumber >= maxBeforeAggresiveDecimalTruncation) {\n return number.toLocaleString('en', {\n maximumFractionDigits: aggresiveDecimalPrecision,\n ...numberFormatOptions,\n })\n }\n if (absoluteNumber < minBeforeUseScientific) {\n return number.toLocaleString('en', {\n notation: 'scientific',\n maximumFractionDigits: aggresiveDecimalPrecision,\n ...numberFormatOptions,\n })\n }\n // else, minBeforeScientific <= number < maxBeforeAggresive\n return number.toLocaleString('en', {\n maximumFractionDigits: softDecimalPrecision,\n // minimumSignificantDigits,\n // maximumSignificantDigits: minimumSignificantDigits,\n ...numberFormatOptions,\n })\n}\n\n/** Formats a number for currency (default $) display */\nexport function formatCurrencyAndStringify(\n amount: number,\n /** Options to pass `formatNumberAndStringify */\n options: FormatNumberOptions = {},\n /** Options to pass toLocaleString */\n numberFormatOptions: Intl.NumberFormatOptions = {},\n) {\n const defaultOptions: FormatNumberOptions = {\n maxSuffixSize: 1e12,\n minBeforeUseScientific: 0.000001,\n decimalPrecisionForSuffix: 2,\n aggresiveDecimalPrecision: 2,\n softDecimalPrecision: 6,\n minimumSignificantDigits: 2,\n }\n const defaultNumberFormatOptions: Intl.NumberFormatOptions = {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2, // This enforces two decimal places\n maximumFractionDigits: 2, // This limits to two decimal places, ensuring consistency\n compactDisplay: 'long',\n }\n\n const formattedAsString = formatNumberAndStringify(\n amount,\n { ...defaultOptions, ...options },\n {\n ...defaultNumberFormatOptions,\n ...numberFormatOptions,\n },\n )\n return formattedAsString\n}\n\nexport function formatPercent(percent: number, decimalPlaces = 2) {\n const maxDecimal = String(percent).split('.')[1]?.length || 2\n const finalDecimal = Math.max(Math.min(maxDecimal, decimalPlaces), 2)\n return percent.toFixed(finalDecimal) + '%'\n}\n\n/**\n * Formats a cryptocurrency amount as a string for display.\n *\n * Can customize with options and whether to display currency abbreviation.\n */\nexport function formatCryptoAndStringify(\n /** The currency amount **/\n amount: number,\n /** The currency abbreviation e.g. ETH, USDC, ... **/\n platform = '',\n /** Displays abbreviation after amount, e.g. '1.25 ETH'; default true **/\n useCurrencyAbbreviation = true,\n /** Used to format the number, can be used to customize decimal truncation etc. **/\n options?: FormatNumberOptions,\n) {\n const defaultOptions: FormatNumberOptions = {\n minimumSignificantDigits: 5,\n }\n const defaultNumberFormatOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits: 5, // This enforces two decimal places\n maximumFractionDigits: 5, // This limits to two decimal places, ensuring consistency\n }\n const formattedAsString = formatNumberAndStringify(\n amount,\n { ...defaultOptions, ...options },\n defaultNumberFormatOptions,\n )\n // get currency\n const abbr = platform\n\n let result = formattedAsString\n if (useCurrencyAbbreviation && abbr) {\n result = `${formattedAsString} ${abbr}`\n }\n return result\n}\n\nfunction _formatTruncated(\n value: number,\n precision = 2,\n keepTrailingZeros = false,\n useComma = false,\n maxSuffixValue = 1e12,\n maxNumberPartSizeForSuffix = 1e3,\n numberFormatOptions = {},\n) {\n if (!Number.isFinite(value)) {\n throw new Error('invalid number for `value` passed in to `formatTruncated`')\n }\n\n const negative = value < 0\n const absValue = Math.abs(value)\n\n function getFormattedNumberPartAndSuffix(\n divideBy: number,\n suffixStr = '',\n nextSuffixStr = '',\n ): [formatted: string, suffix: string] {\n const dividedVal = absValue / divideBy\n const rawDividedValRounded = dividedVal.toFixed(precision)\n\n // use sci notation for large number parts\n const useScientific =\n Number(rawDividedValRounded) >= maxNumberPartSizeForSuffix ||\n (divideBy === 1e12 && Number(rawDividedValRounded) >= 1e3) // anything >= 1,000T should be sci notation\n\n // the rounding that occurs due to decimal precision can increase the suffix size, e.g. 999.999999 -> 1K\n const incrementToNextSuffix =\n maxSuffixValue > divideBy && Number(rawDividedValRounded) >= 1000\n const suffix = !incrementToNextSuffix ? suffixStr : nextSuffixStr\n const dividedValRounded = !incrementToNextSuffix\n ? rawDividedValRounded\n : (Number(rawDividedValRounded) / 1000).toFixed(precision)\n\n if (useComma || useScientific) {\n return [\n Number(dividedValRounded).toLocaleString('en', {\n // don't use sci notation if the dividedValRounded is 1 because otherwise we get \"1EB\" instead of \"1B\"\n ...(useScientific &&\n Number(dividedValRounded) !== 1 && { notation: 'scientific' }),\n maximumFractionDigits: precision,\n ...numberFormatOptions,\n }),\n suffix,\n ]\n }\n return [dividedValRounded, suffix]\n }\n\n let [formatted, suffix] = getFormattedNumberPartAndSuffix(1, '', 'K')\n if (absValue >= 1e3 && (absValue < 1e6 || maxSuffixValue === 1e3)) {\n ;[formatted, suffix] = getFormattedNumberPartAndSuffix(1e3, 'K', 'M')\n } else if (absValue >= 1e6 && (absValue < 1e9 || maxSuffixValue === 1e6)) {\n ;[formatted, suffix] = getFormattedNumberPartAndSuffix(1e6, 'M', 'B')\n } else if (absValue >= 1e9 && (absValue < 1e12 || maxSuffixValue === 1e9)) {\n ;[formatted, suffix] = getFormattedNumberPartAndSuffix(1e9, 'B', 'T')\n } else if (absValue >= 1e12) {\n ;[formatted, suffix] = getFormattedNumberPartAndSuffix(1e12, 'T')\n }\n\n if (!keepTrailingZeros && !formatted?.includes('E')) {\n const [before, after] = formatted.split('.')\n const trimmedAfter = after?.replace(/0+$/gm, '')\n formatted = before\n if (trimmedAfter?.length > 0) {\n formatted += '.' + trimmedAfter\n }\n }\n if (negative) {\n formatted = '-' + formatted\n }\n formatted += suffix\n return formatted\n}\n\nexport function parseInputToNumber(input: string | number | undefined): number {\n return Number.parseFloat((input || 0).toString())\n}\n\n// Rounds up a number to the number of specified decimal places\n// DO NOT use for display purposes (it will do 41.80 -> 41.8).\n// Use formatNumberAndStringify(amount, {}, { maximumFractionDigits: 2, minimumFractionDigits: 2 }) instead.\nexport function roundUpToXDecimalPlaces(\n inputNumber: string,\n decimalPlaces: number,\n) {\n // Using toFixed to round up to X decimal places\n const multiplier = 10 ** decimalPlaces\n const roundedString = (\n Math.ceil(Number.parseFloat(inputNumber) * multiplier) / multiplier\n ).toFixed(decimalPlaces)\n\n // Converting the rounded string back to a number\n const roundedNumber = Number.parseFloat(roundedString)\n return roundedNumber\n}\n\nconst MIN_NUMBER = 0.01\nexport function normalizeSmallUsdNumber(usdNumber: string | number | null) {\n if (!isNotNullish(usdNumber)) return 0\n const parsedNumber = Number.parseFloat(usdNumber.toString())\n if (parsedNumber > 0 && parsedNumber < MIN_NUMBER) return MIN_NUMBER\n return parsedNumber\n}\n\nexport function round(\n value: number,\n decimals: number,\n /**\n * Whether to round up ('ceil'), down ('floor'), or nearest ('round')\n *\n * Defauls to 'round'\n **/\n method: 'ceil' | 'floor' | 'round' = 'round',\n): number {\n return Math[method](value * 10 ** decimals) / 10 ** decimals\n}\n", "import {\n formatCryptoAndStringify,\n formatCurrencyAndStringify,\n formatPercent,\n} from './formatNumber'\n\nexport interface FormatDynamicFeeUsdOptions {\n /**\n * Threshold in USD above which the fee should be displayed in %\n *\n * Defauls to 2.5\n *\n * Pass null to disable % format altogether\n */\n percentThreshold?: number | null\n}\n\n// For any fees, if the total fee amounts to less than $2.50, show the fee as a strict dollar value.\n// If the fee is greater than $2.50, show it as a percent.\n// If the fee is less than $0.01, show <$0.01 instead.\nexport function formatDynamicFeeUsd(\n fee: number,\n total: number,\n options: FormatDynamicFeeUsdOptions = {},\n) {\n const { percentThreshold = 2.5 } = options\n\n if (fee < 0.01) {\n return `<${formatCurrencyAndStringify(0.01)}`\n }\n\n if (percentThreshold !== null && fee > percentThreshold) {\n return formatPercent((fee / total) * 100)\n }\n\n return formatCurrencyAndStringify(fee)\n}\n\n// If the fee is less than 0.00001, show <0.00001 instead.\nexport function formatDynamicFeeToken(fee: number, symbol: string) {\n if (fee < 0.00001) {\n return `<${formatCryptoAndStringify(0.00001, symbol)}`\n }\n\n return formatCryptoAndStringify(fee, symbol)\n}\n", "export const fullMonthNames = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\n\nconst shortenedMonthNames = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n]\n\nfunction getDaySuffix(day: number): string {\n if (day >= 11 && day <= 13) {\n return 'th'\n }\n const lastDigit = day % 10\n switch (lastDigit) {\n case 1:\n return 'st'\n case 2:\n return 'nd'\n case 3:\n return 'rd'\n default:\n return 'th'\n }\n}\n\ninterface FormatDateOption {\n year?: 'full' | 'short' | 'none'\n month?: 'full' | 'short'\n}\n\nexport function formatTimestampToDate(\n date: Date,\n { year = 'full', month = 'full' }: FormatDateOption = {},\n) {\n const monthIdx = date.getMonth()\n const monthStr =\n month === 'short' ? shortenedMonthNames[monthIdx] : fullMonthNames[monthIdx]\n const day = date.getDate()\n const yearStr =\n year === 'none'\n ? ''\n : date\n .getFullYear()\n .toString()\n .slice(year === 'full' ? 0 : 2)\n const daySuffix = getDaySuffix(day)\n return `${monthStr} ${day}${daySuffix}${yearStr ? `, ${yearStr}` : ''}`\n}\n\ninterface FormatTimeOption extends FormatDateOption {\n hours?: '24hr' | '12hr'\n seconds?: 'none'\n}\n\nexport function formatTimestamp(\n date: Date,\n opt: FormatTimeOption = {},\n): string {\n const { hours = '12hr', seconds } = opt\n const minutes = date.getMinutes()\n const sec = date.getSeconds()\n const secondsStr = seconds === 'none' ? '' : sec < 10 ? '0' + sec : sec\n const hrs = date.getHours()\n const hoursStr = hours === '24hr' ? hrs : hrs % 12 || 12\n const ampm = hours === '24hr' ? '' : hrs >= 12 ? 'PM' : 'AM'\n\n return `${formatTimestampToDate(date, opt)} \u00B7 ${hoursStr}:${\n minutes < 10 ? '0' : ''\n }${minutes}${secondsStr ? `:${secondsStr}` : ''}${ampm ? ' ' + ampm : ''}`\n}\n\n/**\n * Formats seconds to mins and seconds string\n * - seconds = 10, output = '10 seconds'\n * - seconds = 20.3, output = '21 seconds'\n * - seconds = 20.3, specifyUnderMinute=true, output = '< 1min'\n * - seconds = 60, output = '60 seconds'\n * - seconds = 61, output = '1min 1s'\n * - seconds = 300, output = '5min'\n * - seconds = 320, output = '5min 20s'\n * - seconds = 320, omitSeconds=true, output = '6min'\n * - seconds = 3600, output = '60min'\n * - seconds = 3900, output = '1h 5min'\n * - seconds = 3920, output = '1h 5min 20s'\n */\nexport function formatSecondsToReadableForm(\n seconds: number,\n specifyUnderMinute = false,\n omitSeconds = false,\n): string {\n const normalizedSeconds = Math.ceil(seconds)\n\n if (normalizedSeconds <= 60) {\n return specifyUnderMinute ? '< 1min' : `${normalizedSeconds} seconds`\n }\n\n const s = omitSeconds ? 0 : normalizedSeconds % 60\n const m = Math.ceil((normalizedSeconds - s) / 60) % 60\n const h = Math.ceil((normalizedSeconds - s - m * 60) / 60 / 60)\n\n // Special case - show '60min' instead of '1h'\n if (h === 1 && m === 0 && s === 0) {\n return '60min'\n }\n\n return [h ? `${h}h` : '', m ? `${m}min` : '', s ? `${s}s` : '']\n .filter(Boolean)\n .join(' ')\n}\n\nexport function formatSecondsToCountdownForm(seconds: number) {\n const normalizedSeconds = Math.ceil(seconds)\n const mins = Math.floor(normalizedSeconds / 60)\n const remainingSecs = normalizedSeconds % 60\n return `${(mins < 10 ? '0' : '') + mins}:${\n (remainingSecs < 10 ? '0' : '') + remainingSecs\n }`\n}\n", "export function groupBy<Item>(\n items: Item[],\n getKey: (item: Item) => string,\n): Record<string, Item[]> {\n const groupedItems: Record<string, Item[]> = {}\n\n for (const item of items) {\n const key = getKey(item)\n\n if (!key) {\n continue\n }\n\n if (!groupedItems[key]) {\n groupedItems[key] = []\n }\n\n groupedItems[key].push(item)\n }\n\n return groupedItems\n}\n", "export function indexBy<Item>(\n items: Item[],\n getKey: (item: Item) => string,\n): Record<string, Item> {\n const indexedItems: Record<string, Item> = {}\n\n for (const item of items) {\n const key = getKey(item)\n\n if (!key) {\n continue\n }\n\n indexedItems[key] = item\n }\n\n return indexedItems\n}\n", "export function isAndroid(): boolean {\n return (\n typeof navigator !== 'undefined' && /android/i.test(navigator.userAgent)\n )\n}\n\nexport function isSmallIOS(): boolean {\n return (\n typeof navigator !== 'undefined' && /iPhone|iPod/.test(navigator.userAgent)\n )\n}\n\nexport function isLargeIOS(): boolean {\n return (\n typeof navigator !== 'undefined' &&\n (/iPad/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1))\n )\n}\n\nexport function isIOS(): boolean {\n return isSmallIOS() || isLargeIOS()\n}\n\nexport function isMobile(): boolean {\n return isAndroid() || isIOS()\n}\n", "// Detect user locale from browser user agent\nexport const detectedBrowserLocale = () => {\n if (typeof window !== 'undefined' && typeof navigator !== 'undefined') {\n if (navigator.languages?.length) {\n return navigator.languages[0]\n }\n\n if (navigator.language) {\n return navigator.language\n }\n }\n}\n", "export function redirectInMobile(mobileUri: string) {\n if (typeof window !== 'undefined' && document) {\n if (mobileUri.startsWith('http')) {\n // Workaround for https://github.com/rainbow-me/rainbowkit/issues/524.\n // Using 'window.open' causes issues on iOS in non-Safari browsers and\n // WebViews where a blank tab is left behind after connecting.\n // This is especially bad in some WebView scenarios (e.g. following a\n // link from Twitter) where the user doesn't have any mechanism for\n // closing the blank tab.\n // For whatever reason, links with a target of \"_blank\" don't suffer\n // from this problem, and programmatically clicking a detached link\n // element with the same attributes also avoids the issue.\n const link = document.createElement('a')\n link.href = mobileUri\n link.target = '_blank'\n link.rel = 'noreferrer noopener'\n link.click()\n } else {\n window.location.href = mobileUri\n }\n }\n}\n", "export const noop = () => void {}\n", "export function omitUndefinedValues<T extends object>(obj: T): T {\n return Object.fromEntries(\n Object.entries(obj).filter(([, value]) => value !== undefined),\n ) as T\n}\n", "export const isRecord = (x: unknown): x is Record<string, unknown> => {\n return typeof x === 'object' && x !== null\n}\n"],
5
- "mappings": "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",
3
+ "sources": ["../src/utils/address.ts", "../src/utils/browsers.ts", "../src/utils/capitalize.ts", "../src/utils/colors.ts", "../src/utils/debounce.ts", "../src/utils/deepMerge.ts", "../src/utils/exhaustiveCheck.ts", "../src/utils/isNotNullish.ts", "../src/utils/formatNumber.ts", "../src/utils/formatFees.ts", "../src/utils/formatTimestamp.ts", "../src/utils/groupBy.ts", "../src/utils/indexBy.ts", "../src/utils/isMobile.ts", "../src/utils/json.ts", "../src/utils/locale.ts", "../src/utils/mobile.ts", "../src/utils/noop.ts", "../src/utils/omitUndefinedValues.ts", "../src/utils/type.ts"],
4
+ "sourcesContent": ["export function formatAddress(address: string): string {\n const leadingChars = 4\n const trailingChars = 4\n\n return address.length < leadingChars + trailingChars\n ? address\n : `${address.substring(0, leadingChars)}\\u2026${address.substring(\n address.length - trailingChars,\n )}`\n}\n\nexport function formatAddressLastFour(address: string): string {\n const trailingChars = 4\n return address.length < trailingChars\n ? address\n : `\\u2026${address.substring(address.length - trailingChars)}`\n}\n", "export function isSafari(): boolean {\n return (\n typeof navigator !== 'undefined' &&\n typeof navigator.userAgent !== 'undefined' &&\n /Version\\/([0-9._]+).*Safari/.test(navigator.userAgent) // Source: https://github.com/DamonOehlman/detect-browser/blob/master/src/index.ts\n )\n}\n\nexport function isArc(): boolean {\n return (\n typeof document !== 'undefined' &&\n getComputedStyle(document.body).getPropertyValue('--arc-palette-focus') !==\n ''\n )\n}\n\nexport enum BrowserType {\n Arc = 'Arc',\n Brave = 'Brave',\n Browser = 'Browser',\n Chrome = 'Chrome',\n Edge = 'Edge',\n Firefox = 'Firefox',\n Opera = 'Opera',\n Safari = 'Safari',\n}\n\nexport function getBrowser(): BrowserType {\n // bail out if `navigator` or `navigator.userAgent` is not available\n if (typeof navigator === 'undefined') return BrowserType.Browser\n const ua = navigator.userAgent?.toLowerCase()\n // @ts-expect-error - brave is not in the navigator type\n if (navigator.brave?.isBrave) return BrowserType.Brave\n if (ua?.indexOf('edg/') > -1) return BrowserType.Edge\n if (ua?.indexOf('op') > -1) return BrowserType.Opera\n if (isArc()) return BrowserType.Arc\n if (ua?.indexOf('chrome') > -1) return BrowserType.Chrome\n if (ua?.indexOf('firefox') > -1) return BrowserType.Firefox\n if (isSafari()) return BrowserType.Safari\n return BrowserType.Browser\n}\n", "export function capitalizeFirstLetter(val: string) {\n return String(val).charAt(0).toUpperCase() + String(val).slice(1)\n}\n", "export function colorToHex(color: string): string {\n // Check if the input is in RGB format\n const rgbMatch = color.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/)\n if (rgbMatch) {\n const [, r, g, b] = rgbMatch.map(Number)\n // Convert RGB to HEX\n const rHex = r.toString(16).padStart(2, '0')\n const gHex = g.toString(16).padStart(2, '0')\n const bHex = b.toString(16).padStart(2, '0')\n return `#${rHex}${gHex}${bHex}`\n }\n\n // Check if the input is in HEX format\n const hexMatch = color.match(/^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i)\n if (hexMatch) {\n return hexMatch[0].toLowerCase()\n }\n\n return color\n}\n\nexport const convertHexToRGBA = (hexCode: string, opacity = 1): string => {\n let hex = hexCode.replace('#', '')\n\n if (hex.length === 3) {\n hex = `${hex[0]}${hex[0]}${hex[1]}${hex[1]}${hex[2]}${hex[2]}`\n }\n\n const r = Number.parseInt(hex.substring(0, 2), 16)\n const g = Number.parseInt(hex.substring(2, 4), 16)\n const b = Number.parseInt(hex.substring(4, 6), 16)\n\n /* Backward compatibility for whole number based opacity values. */\n const finalOpacity = opacity > 1 && opacity <= 100 ? opacity / 100 : opacity\n\n return `rgba(${r},${g},${b},${finalOpacity})`\n}\n\nexport const isHexString = (color: string): boolean => {\n return /^#([0-9a-f]{3}){1,2}$/i.test(color)\n}\n", "export function debounce(fn: () => void, ms: number) {\n let timer: NodeJS.Timeout | null\n\n return () => {\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = setTimeout(() => {\n timer = null\n fn()\n }, ms)\n }\n}\n", "export type DeepPartial<T> = T extends\n | number\n | string\n | boolean\n | null\n | undefined\n ? T\n : {\n [P in keyof T]?: DeepPartial<T[P]>\n }\n\nfunction deepClone<T extends object>(obj: T): T {\n return JSON.parse(JSON.stringify(obj))\n}\n\n/** NOTE: merging arrays is undefined behavior */\nexport function deepMerge<T extends object>(\n origin: T,\n ...objects: DeepPartial<T>[]\n): T {\n const target = deepClone(origin) as T\n\n for (const obj of objects) {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n if (Array.isArray(value)) {\n // @ts-expect-error\n target[key] = value\n } else if (typeof value === 'object' && value !== null) {\n // @ts-expect-error\n target[key] = deepMerge(target[key], value)\n } else {\n // @ts-expect-error\n target[key] = value\n }\n }\n }\n }\n\n return target\n}\n", "export function exhaustiveCheck(_value: never): any {\n if (process.env.NODE_ENV === 'local') {\n throw new Error('exhaustiveCheck: should not reach this point')\n }\n}\n", "export function isNotNullish<T>(value: T | null | undefined): value is T {\n return value != null\n}\n", "import { isNotNullish } from './isNotNullish'\n\ninterface FormatNumberOptions {\n /** Numbers smaller than this will be converted to scientific notation */\n minBeforeUseScientific?: number\n /** If the number part for suffixed # is >= this, will use sci notation (e.g. 1,000M -> 1E3M) */\n maxNumberPartSizeForSuffix?: number\n /** The amount of decimal places to truncate to when softly truncating (to specify decimal places for suffix-truncation, e.g. 1.23M, use decimalPrecisionForSuffix) */\n softDecimalPrecision?: number\n /** Numbers >= this will have their decimals truncated aggressively */\n maxBeforeAggresiveDecimalTruncation?: number\n /** The amount of decimal places to truncate to when aggressively truncating (to specify decimal places for suffix-truncation, e.g. 1.23M, use decimalPrecisionForSuffix) */\n aggresiveDecimalPrecision?: number\n /** Numbers >= this will have a suffix added during truncation (e.g. 1.23M) */\n maxBeforeUseSuffix?: number\n /** The amount of decimal places to truncate suffix-truncated numbers to (e.g. 1.23M vs 1.2312M)*/\n decimalPrecisionForSuffix?: number\n /** The largest suffix to use (e.g. if 1000000, we will stop at M and not use the B suffix) */\n maxSuffixSize?: 1e3 | 1e6 | 1e9 | 1e12\n numberFormatOptions?: Intl.NumberFormatOptions\n /** Adds minimum significant digits value to force numbers to show decimal precision even when there are none 5 -> 5.00 */\n minimumSignificantDigits?: number\n}\n\nconst FORMAT_NUMBER_DEFAULT = {\n minBeforeUseScientific: 0.00001,\n maxBeforeAggresiveDecimalTruncation: 1,\n softDecimalPrecision: 5,\n aggresiveDecimalPrecision: 5,\n maxBeforeUseSuffix: 1000000,\n decimalPrecisionForSuffix: 5,\n maxSuffixSize: 1000000,\n maxNumberPartSizeForSuffix: 1e3,\n minimumSignificantDigits: 5,\n} satisfies FormatNumberOptions\n\n/**\n * Formats a number with conditional truncation, suffixation, and scientific notation.\n * @param number\n * @param options Customize the formatting conditions/behavior\n * @example Visualization, using default values:\n * ```\n * <--(1.23E-7)---0.00001------(0.12121)-------1-------(123,423.26)---1,000,000---(1.22M)--(100.23M)-->\n * _______<-minBeforeScientific maxBeforeAggressive-> maxBeforeUseSuffix-> ^ w/ maxSuffixSize\n * ```\n */\nexport function formatNumberAndStringify(\n number: number,\n options: FormatNumberOptions = FORMAT_NUMBER_DEFAULT,\n numberFormatOptions = {},\n) {\n const {\n minBeforeUseScientific,\n softDecimalPrecision,\n maxBeforeAggresiveDecimalTruncation,\n aggresiveDecimalPrecision,\n maxBeforeUseSuffix,\n decimalPrecisionForSuffix,\n maxSuffixSize,\n maxNumberPartSizeForSuffix,\n } = { ...FORMAT_NUMBER_DEFAULT, ...options }\n\n if (number === 0) {\n return number.toLocaleString('en', { ...numberFormatOptions })\n }\n if (!number) {\n return ''\n }\n const absoluteNumber = Math.abs(number)\n\n const roundedForSuffix = absoluteNumber.toFixed(decimalPrecisionForSuffix)\n // rounding to decimal precision may increment the number high enough to require a suffix\n if (Number(roundedForSuffix) >= maxBeforeUseSuffix) {\n return _formatTruncated(\n number,\n decimalPrecisionForSuffix,\n false,\n true,\n maxSuffixSize,\n maxNumberPartSizeForSuffix,\n numberFormatOptions,\n )\n }\n if (absoluteNumber >= maxBeforeAggresiveDecimalTruncation) {\n return number.toLocaleString('en', {\n maximumFractionDigits: aggresiveDecimalPrecision,\n ...numberFormatOptions,\n })\n }\n if (absoluteNumber < minBeforeUseScientific) {\n return number.toLocaleString('en', {\n notation: 'scientific',\n maximumFractionDigits: aggresiveDecimalPrecision,\n ...numberFormatOptions,\n })\n }\n // else, minBeforeScientific <= number < maxBeforeAggresive\n return number.toLocaleString('en', {\n maximumFractionDigits: softDecimalPrecision,\n // minimumSignificantDigits,\n // maximumSignificantDigits: minimumSignificantDigits,\n ...numberFormatOptions,\n })\n}\n\n/** Formats a number for currency (default $) display */\nexport function formatCurrencyAndStringify(\n amount: number,\n /** Options to pass `formatNumberAndStringify */\n options: FormatNumberOptions = {},\n /** Options to pass toLocaleString */\n numberFormatOptions: Intl.NumberFormatOptions = {},\n) {\n const defaultOptions: FormatNumberOptions = {\n maxSuffixSize: 1e12,\n minBeforeUseScientific: 0.000001,\n decimalPrecisionForSuffix: 2,\n aggresiveDecimalPrecision: 2,\n softDecimalPrecision: 6,\n minimumSignificantDigits: 2,\n }\n const defaultNumberFormatOptions: Intl.NumberFormatOptions = {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2, // This enforces two decimal places\n maximumFractionDigits: 2, // This limits to two decimal places, ensuring consistency\n compactDisplay: 'long',\n }\n\n const formattedAsString = formatNumberAndStringify(\n amount,\n { ...defaultOptions, ...options },\n {\n ...defaultNumberFormatOptions,\n ...numberFormatOptions,\n },\n )\n return formattedAsString\n}\n\nexport function formatPercent(percent: number, decimalPlaces = 2) {\n const maxDecimal = String(percent).split('.')[1]?.length || 2\n const finalDecimal = Math.max(Math.min(maxDecimal, decimalPlaces), 2)\n return `${percent.toFixed(finalDecimal)}%`\n}\n\n/**\n * Formats a cryptocurrency amount as a string for display.\n *\n * Can customize with options and whether to display currency abbreviation.\n */\nexport function formatCryptoAndStringify(\n /** The currency amount **/\n amount: number,\n /** The currency abbreviation e.g. ETH, USDC, ... **/\n platform = '',\n /** Displays abbreviation after amount, e.g. '1.25 ETH'; default true **/\n useCurrencyAbbreviation = true,\n /** Used to format the number, can be used to customize decimal truncation etc. **/\n options?: FormatNumberOptions,\n) {\n const defaultOptions: FormatNumberOptions = {\n minimumSignificantDigits: 5,\n }\n const defaultNumberFormatOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits: 5, // This enforces two decimal places\n maximumFractionDigits: 5, // This limits to two decimal places, ensuring consistency\n }\n const formattedAsString = formatNumberAndStringify(\n amount,\n { ...defaultOptions, ...options },\n defaultNumberFormatOptions,\n )\n // get currency\n const abbr = platform\n\n let result = formattedAsString\n if (useCurrencyAbbreviation && abbr) {\n result = `${formattedAsString} ${abbr}`\n }\n return result\n}\n\nfunction _formatTruncated(\n value: number,\n precision = 2,\n keepTrailingZeros = false,\n useComma = false,\n maxSuffixValue = 1e12,\n maxNumberPartSizeForSuffix = 1e3,\n numberFormatOptions = {},\n) {\n if (!Number.isFinite(value)) {\n throw new Error('invalid number for `value` passed in to `formatTruncated`')\n }\n\n const negative = value < 0\n const absValue = Math.abs(value)\n\n function getFormattedNumberPartAndSuffix(\n divideBy: number,\n suffixStr = '',\n nextSuffixStr = '',\n ): [formatted: string, suffix: string] {\n const dividedVal = absValue / divideBy\n const rawDividedValRounded = dividedVal.toFixed(precision)\n\n // use sci notation for large number parts\n const useScientific =\n Number(rawDividedValRounded) >= maxNumberPartSizeForSuffix ||\n (divideBy === 1e12 && Number(rawDividedValRounded) >= 1e3) // anything >= 1,000T should be sci notation\n\n // the rounding that occurs due to decimal precision can increase the suffix size, e.g. 999.999999 -> 1K\n const incrementToNextSuffix =\n maxSuffixValue > divideBy && Number(rawDividedValRounded) >= 1000\n const suffix = !incrementToNextSuffix ? suffixStr : nextSuffixStr\n const dividedValRounded = !incrementToNextSuffix\n ? rawDividedValRounded\n : (Number(rawDividedValRounded) / 1000).toFixed(precision)\n\n if (useComma || useScientific) {\n return [\n Number(dividedValRounded).toLocaleString('en', {\n // don't use sci notation if the dividedValRounded is 1 because otherwise we get \"1EB\" instead of \"1B\"\n ...(useScientific &&\n Number(dividedValRounded) !== 1 && { notation: 'scientific' }),\n maximumFractionDigits: precision,\n ...numberFormatOptions,\n }),\n suffix,\n ]\n }\n return [dividedValRounded, suffix]\n }\n\n let [formatted, suffix] = getFormattedNumberPartAndSuffix(1, '', 'K')\n if (absValue >= 1e3 && (absValue < 1e6 || maxSuffixValue === 1e3)) {\n ;[formatted, suffix] = getFormattedNumberPartAndSuffix(1e3, 'K', 'M')\n } else if (absValue >= 1e6 && (absValue < 1e9 || maxSuffixValue === 1e6)) {\n ;[formatted, suffix] = getFormattedNumberPartAndSuffix(1e6, 'M', 'B')\n } else if (absValue >= 1e9 && (absValue < 1e12 || maxSuffixValue === 1e9)) {\n ;[formatted, suffix] = getFormattedNumberPartAndSuffix(1e9, 'B', 'T')\n } else if (absValue >= 1e12) {\n ;[formatted, suffix] = getFormattedNumberPartAndSuffix(1e12, 'T')\n }\n\n if (!keepTrailingZeros && !formatted?.includes('E')) {\n const [before, after] = formatted.split('.')\n const trimmedAfter = after?.replace(/0+$/gm, '')\n formatted = before\n if (trimmedAfter?.length > 0) {\n formatted += '.' + trimmedAfter\n }\n }\n if (negative) {\n formatted = '-' + formatted\n }\n formatted += suffix\n return formatted\n}\n\nexport function parseInputToNumber(input: string | number | undefined): number {\n return Number.parseFloat((input || 0).toString())\n}\n\n// Rounds up a number to the number of specified decimal places\n// DO NOT use for display purposes (it will do 41.80 -> 41.8).\n// Use formatNumberAndStringify(amount, {}, { maximumFractionDigits: 2, minimumFractionDigits: 2 }) instead.\nexport function roundUpToXDecimalPlaces(\n inputNumber: string,\n decimalPlaces: number,\n) {\n // Using toFixed to round up to X decimal places\n const multiplier = 10 ** decimalPlaces\n const roundedString = (\n Math.ceil(Number.parseFloat(inputNumber) * multiplier) / multiplier\n ).toFixed(decimalPlaces)\n\n // Converting the rounded string back to a number\n const roundedNumber = Number.parseFloat(roundedString)\n return roundedNumber\n}\n\nconst MIN_NUMBER = 0.01\nexport function normalizeSmallUsdNumber(usdNumber: string | number | null) {\n if (!isNotNullish(usdNumber)) return 0\n const parsedNumber = Number.parseFloat(usdNumber.toString())\n if (parsedNumber > 0 && parsedNumber < MIN_NUMBER) return MIN_NUMBER\n return parsedNumber\n}\n\nexport function round(\n value: number,\n decimals: number,\n /**\n * Whether to round up ('ceil'), down ('floor'), or nearest ('round')\n *\n * Defauls to 'round'\n **/\n method: 'ceil' | 'floor' | 'round' = 'round',\n): number {\n return Math[method](value * 10 ** decimals) / 10 ** decimals\n}\n", "import { formatCurrencyAndStringify, formatPercent } from './formatNumber'\n\nexport interface FormatDynamicFeeUsdOptions {\n /**\n * Threshold in USD above which the fee should be displayed in %\n *\n * Defauls to 2.5\n *\n * Pass null to disable % format altogether\n */\n percentThreshold?: number | null\n}\n\n/**\n * For any fees, if the total fee amounts to less than $2.50, show the fee as a strict dollar value.\n * If the fee is greater than $2.50, show it as a percent.\n * If the fee is less than $0.01, show <$0.01 instead.\n */\nexport function formatDynamicFeeUsd(\n fee: number,\n total: number,\n options: FormatDynamicFeeUsdOptions = {},\n) {\n if (fee < 0.01) {\n return `<${formatCurrencyAndStringify(0.01)}`\n }\n\n const { percentThreshold = 2.5 } = options\n if (percentThreshold !== null && fee > percentThreshold) {\n return formatPercent((fee / total) * 100)\n }\n\n return formatCurrencyAndStringify(fee)\n}\n", "export const fullMonthNames = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\n\nconst shortenedMonthNames = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n]\n\nfunction getDaySuffix(day: number): string {\n if (day >= 11 && day <= 13) {\n return 'th'\n }\n const lastDigit = day % 10\n switch (lastDigit) {\n case 1:\n return 'st'\n case 2:\n return 'nd'\n case 3:\n return 'rd'\n default:\n return 'th'\n }\n}\n\ninterface FormatDateOption {\n year?: 'full' | 'short' | 'none'\n month?: 'full' | 'short'\n}\n\nexport function formatTimestampToDate(\n date: Date,\n { year = 'full', month = 'full' }: FormatDateOption = {},\n) {\n const monthIdx = date.getMonth()\n const monthStr =\n month === 'short' ? shortenedMonthNames[monthIdx] : fullMonthNames[monthIdx]\n const day = date.getDate()\n const yearStr =\n year === 'none'\n ? ''\n : date\n .getFullYear()\n .toString()\n .slice(year === 'full' ? 0 : 2)\n const daySuffix = getDaySuffix(day)\n return `${monthStr} ${day}${daySuffix}${yearStr ? `, ${yearStr}` : ''}`\n}\n\ninterface FormatTimeOption extends FormatDateOption {\n hours?: '24hr' | '12hr'\n seconds?: 'none'\n}\n\nexport function formatTimestamp(\n date: Date,\n opt: FormatTimeOption = {},\n): string {\n const { hours = '12hr', seconds } = opt\n const minutes = date.getMinutes()\n const sec = date.getSeconds()\n const secondsStr = seconds === 'none' ? '' : sec < 10 ? '0' + sec : sec\n const hrs = date.getHours()\n const hoursStr = hours === '24hr' ? hrs : hrs % 12 || 12\n const ampm = hours === '24hr' ? '' : hrs >= 12 ? 'PM' : 'AM'\n\n return `${formatTimestampToDate(date, opt)} \u00B7 ${hoursStr}:${\n minutes < 10 ? '0' : ''\n }${minutes}${secondsStr ? `:${secondsStr}` : ''}${ampm ? ' ' + ampm : ''}`\n}\n\n/**\n * Formats seconds to mins and seconds string\n * - seconds = 10, output = '10 seconds'\n * - seconds = 20.3, output = '21 seconds'\n * - seconds = 20.3, specifyUnderMinute=true, output = '< 1min'\n * - seconds = 60, output = '60 seconds'\n * - seconds = 61, output = '1min 1s'\n * - seconds = 300, output = '5min'\n * - seconds = 320, output = '5min 20s'\n * - seconds = 320, omitSeconds=true, output = '6min'\n * - seconds = 3600, output = '60min'\n * - seconds = 3900, output = '1h 5min'\n * - seconds = 3920, output = '1h 5min 20s'\n */\nexport function formatSecondsToReadableForm(\n seconds: number,\n specifyUnderMinute = false,\n omitSeconds = false,\n): string {\n const normalizedSeconds = Math.ceil(seconds)\n\n if (normalizedSeconds <= 60) {\n return specifyUnderMinute ? '< 1min' : `${normalizedSeconds} seconds`\n }\n\n const s = omitSeconds ? 0 : normalizedSeconds % 60\n const m = Math.ceil((normalizedSeconds - s) / 60) % 60\n const h = Math.ceil((normalizedSeconds - s - m * 60) / 60 / 60)\n\n // Special case - show '60min' instead of '1h'\n if (h === 1 && m === 0 && s === 0) {\n return '60min'\n }\n\n return [h ? `${h}h` : '', m ? `${m}min` : '', s ? `${s}s` : '']\n .filter(Boolean)\n .join(' ')\n}\n\nexport function formatSecondsToCountdownForm(seconds: number) {\n const normalizedSeconds = Math.ceil(seconds)\n const mins = Math.floor(normalizedSeconds / 60)\n const remainingSecs = normalizedSeconds % 60\n return `${(mins < 10 ? '0' : '') + mins}:${\n (remainingSecs < 10 ? '0' : '') + remainingSecs\n }`\n}\n", "export function groupBy<Item>(\n items: Item[],\n getKey: (item: Item) => string,\n): Record<string, Item[]> {\n const groupedItems: Record<string, Item[]> = {}\n\n for (const item of items) {\n const key = getKey(item)\n\n if (!key) {\n continue\n }\n\n if (!groupedItems[key]) {\n groupedItems[key] = []\n }\n\n groupedItems[key].push(item)\n }\n\n return groupedItems\n}\n", "export function indexBy<Item>(\n items: Item[],\n getKey: (item: Item) => string,\n): Record<string, Item> {\n const indexedItems: Record<string, Item> = {}\n\n for (const item of items) {\n const key = getKey(item)\n\n if (!key) {\n continue\n }\n\n indexedItems[key] = item\n }\n\n return indexedItems\n}\n", "export function isAndroid(): boolean {\n return (\n typeof navigator !== 'undefined' && /android/i.test(navigator.userAgent)\n )\n}\n\nexport function isSmallIOS(): boolean {\n return (\n typeof navigator !== 'undefined' && /iPhone|iPod/.test(navigator.userAgent)\n )\n}\n\nexport function isLargeIOS(): boolean {\n return (\n typeof navigator !== 'undefined' &&\n (/iPad/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1))\n )\n}\n\nexport function isIOS(): boolean {\n return isSmallIOS() || isLargeIOS()\n}\n\nexport function isMobile(): boolean {\n return isAndroid() || isIOS()\n}\n", "export function safeParseJsonArray<T>(src: string | null): T[] {\n try {\n const value = src ? JSON.parse(src) : []\n return Array.isArray(value) ? value : []\n } catch {\n return []\n }\n}\n\nexport function safeParseJson<T>(\n src?: string,\n onError?: (e: unknown) => void,\n): T | null {\n if (!src) return null\n\n try {\n return JSON.parse(src)\n } catch (e) {\n onError?.(e)\n return null\n }\n}\n", "// Detect user locale from browser user agent\nexport const detectedBrowserLocale = () => {\n if (typeof window !== 'undefined' && typeof navigator !== 'undefined') {\n if (navigator.languages?.length) {\n return navigator.languages[0]\n }\n\n if (navigator.language) {\n return navigator.language\n }\n }\n}\n", "export function redirectInMobile(mobileUri: string) {\n if (typeof window !== 'undefined' && document) {\n if (mobileUri.startsWith('http')) {\n // Workaround for https://github.com/rainbow-me/rainbowkit/issues/524.\n // Using 'window.open' causes issues on iOS in non-Safari browsers and\n // WebViews where a blank tab is left behind after connecting.\n // This is especially bad in some WebView scenarios (e.g. following a\n // link from Twitter) where the user doesn't have any mechanism for\n // closing the blank tab.\n // For whatever reason, links with a target of \"_blank\" don't suffer\n // from this problem, and programmatically clicking a detached link\n // element with the same attributes also avoids the issue.\n const link = document.createElement('a')\n link.href = mobileUri\n link.target = '_blank'\n link.rel = 'noreferrer noopener'\n link.click()\n } else {\n window.location.href = mobileUri\n }\n }\n}\n", "export const noop = () => void {}\n", "export function omitUndefinedValues<T extends object>(obj: T): T {\n return Object.fromEntries(\n Object.entries(obj).filter(([, value]) => value !== undefined),\n ) as T\n}\n", "export const isRecord = (x: unknown): x is Record<string, unknown> => {\n return typeof x === 'object' && x !== null\n}\n"],
5
+ "mappings": ";AAAO,SAAS,cAAc,SAAyB;AACrD,QAAM,eAAe;AACrB,QAAM,gBAAgB;AAEtB,SAAO,QAAQ,SAAS,eAAe,gBACnC,UACA,GAAG,QAAQ,UAAU,GAAG,YAAY,CAAC,SAAS,QAAQ;AAAA,IACpD,QAAQ,SAAS;AAAA,EACnB,CAAC;AACP;AAEO,SAAS,sBAAsB,SAAyB;AAC7D,QAAM,gBAAgB;AACtB,SAAO,QAAQ,SAAS,gBACpB,UACA,SAAS,QAAQ,UAAU,QAAQ,SAAS,aAAa,CAAC;AAChE;;;AChBO,SAAS,WAAoB;AAClC,SACE,OAAO,cAAc,eACrB,OAAO,UAAU,cAAc,eAC/B,8BAA8B,KAAK,UAAU,SAAS;AAE1D;AAEO,SAAS,QAAiB;AAC/B,SACE,OAAO,aAAa,eACpB,iBAAiB,SAAS,IAAI,EAAE,iBAAiB,qBAAqB,MACpE;AAEN;AAEO,IAAK,cAAL,kBAAKA,iBAAL;AACL,EAAAA,aAAA,SAAM;AACN,EAAAA,aAAA,WAAQ;AACR,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,YAAS;AACT,EAAAA,aAAA,UAAO;AACP,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,WAAQ;AACR,EAAAA,aAAA,YAAS;AARC,SAAAA;AAAA,GAAA;AAWL,SAAS,aAA0B;AAExC,MAAI,OAAO,cAAc,YAAa,QAAO;AAC7C,QAAM,KAAK,UAAU,WAAW,YAAY;AAE5C,MAAI,UAAU,OAAO,QAAS,QAAO;AACrC,MAAI,IAAI,QAAQ,MAAM,IAAI,GAAI,QAAO;AACrC,MAAI,IAAI,QAAQ,IAAI,IAAI,GAAI,QAAO;AACnC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,IAAI,QAAQ,QAAQ,IAAI,GAAI,QAAO;AACvC,MAAI,IAAI,QAAQ,SAAS,IAAI,GAAI,QAAO;AACxC,MAAI,SAAS,EAAG,QAAO;AACvB,SAAO;AACT;;;ACxCO,SAAS,sBAAsB,KAAa;AACjD,SAAO,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,GAAG,EAAE,MAAM,CAAC;AAClE;;;ACFO,SAAS,WAAW,OAAuB;AAEhD,QAAM,WAAW,MAAM,MAAM,kCAAkC;AAC/D,MAAI,UAAU;AACZ,UAAM,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,SAAS,IAAI,MAAM;AAEvC,UAAM,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC3C,UAAM,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC3C,UAAM,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC3C,WAAO,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI;AAAA,EAC/B;AAGA,QAAM,WAAW,MAAM,MAAM,2CAA2C;AACxE,MAAI,UAAU;AACZ,WAAO,SAAS,CAAC,EAAE,YAAY;AAAA,EACjC;AAEA,SAAO;AACT;AAEO,IAAM,mBAAmB,CAAC,SAAiB,UAAU,MAAc;AACxE,MAAI,MAAM,QAAQ,QAAQ,KAAK,EAAE;AAEjC,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAAA,EAC9D;AAEA,QAAM,IAAI,OAAO,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE;AACjD,QAAM,IAAI,OAAO,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE;AACjD,QAAM,IAAI,OAAO,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE;AAGjD,QAAM,eAAe,UAAU,KAAK,WAAW,MAAM,UAAU,MAAM;AAErE,SAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY;AAC5C;AAEO,IAAM,cAAc,CAAC,UAA2B;AACrD,SAAO,yBAAyB,KAAK,KAAK;AAC5C;;;ACxCO,SAAS,SAAS,IAAgB,IAAY;AACnD,MAAI;AAEJ,SAAO,MAAM;AACX,QAAI,OAAO;AACT,mBAAa,KAAK;AAAA,IACpB;AAEA,YAAQ,WAAW,MAAM;AACvB,cAAQ;AACR,SAAG;AAAA,IACL,GAAG,EAAE;AAAA,EACP;AACF;;;ACFA,SAAS,UAA4B,KAAW;AAC9C,SAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AACvC;AAGO,SAAS,UACd,WACG,SACA;AACH,QAAM,SAAS,UAAU,MAAM;AAE/B,aAAW,OAAO,SAAS;AACzB,eAAW,OAAO,KAAK;AACrB,UAAI,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG,GAAG;AAClD,cAAM,QAAQ,IAAI,GAAG;AACrB,YAAI,MAAM,QAAQ,KAAK,GAAG;AAExB,iBAAO,GAAG,IAAI;AAAA,QAChB,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AAEtD,iBAAO,GAAG,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK;AAAA,QAC5C,OAAO;AAEL,iBAAO,GAAG,IAAI;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACzCO,SAAS,gBAAgB,QAAoB;AAClD,MAAI,OAAkC;AACpC,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACF;;;ACJO,SAAS,aAAgB,OAAyC;AACvE,SAAO,SAAS;AAClB;;;ACsBA,IAAM,wBAAwB;AAAA,EAC5B,wBAAwB;AAAA,EACxB,qCAAqC;AAAA,EACrC,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,eAAe;AAAA,EACf,4BAA4B;AAAA,EAC5B,0BAA0B;AAC5B;AAYO,SAAS,yBACd,QACA,UAA+B,uBAC/B,sBAAsB,CAAC,GACvB;AACA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,EAAE,GAAG,uBAAuB,GAAG,QAAQ;AAE3C,MAAI,WAAW,GAAG;AAChB,WAAO,OAAO,eAAe,MAAM,EAAE,GAAG,oBAAoB,CAAC;AAAA,EAC/D;AACA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB,KAAK,IAAI,MAAM;AAEtC,QAAM,mBAAmB,eAAe,QAAQ,yBAAyB;AAEzE,MAAI,OAAO,gBAAgB,KAAK,oBAAoB;AAClD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,kBAAkB,qCAAqC;AACzD,WAAO,OAAO,eAAe,MAAM;AAAA,MACjC,uBAAuB;AAAA,MACvB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AACA,MAAI,iBAAiB,wBAAwB;AAC3C,WAAO,OAAO,eAAe,MAAM;AAAA,MACjC,UAAU;AAAA,MACV,uBAAuB;AAAA,MACvB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAEA,SAAO,OAAO,eAAe,MAAM;AAAA,IACjC,uBAAuB;AAAA;AAAA;AAAA,IAGvB,GAAG;AAAA,EACL,CAAC;AACH;AAGO,SAAS,2BACd,QAEA,UAA+B,CAAC,GAEhC,sBAAgD,CAAC,GACjD;AACA,QAAM,iBAAsC;AAAA,IAC1C,eAAe;AAAA,IACf,wBAAwB;AAAA,IACxB,2BAA2B;AAAA,IAC3B,2BAA2B;AAAA,IAC3B,sBAAsB;AAAA,IACtB,0BAA0B;AAAA,EAC5B;AACA,QAAM,6BAAuD;AAAA,IAC3D,OAAO;AAAA,IACP,UAAU;AAAA,IACV,uBAAuB;AAAA;AAAA,IACvB,uBAAuB;AAAA;AAAA,IACvB,gBAAgB;AAAA,EAClB;AAEA,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA,EAAE,GAAG,gBAAgB,GAAG,QAAQ;AAAA,IAChC;AAAA,MACE,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,cAAc,SAAiB,gBAAgB,GAAG;AAChE,QAAM,aAAa,OAAO,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,UAAU;AAC5D,QAAM,eAAe,KAAK,IAAI,KAAK,IAAI,YAAY,aAAa,GAAG,CAAC;AACpE,SAAO,GAAG,QAAQ,QAAQ,YAAY,CAAC;AACzC;AAOO,SAAS,yBAEd,QAEA,WAAW,IAEX,0BAA0B,MAE1B,SACA;AACA,QAAM,iBAAsC;AAAA,IAC1C,0BAA0B;AAAA,EAC5B;AACA,QAAM,6BAAuD;AAAA,IAC3D,uBAAuB;AAAA;AAAA,IACvB,uBAAuB;AAAA;AAAA,EACzB;AACA,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA,EAAE,GAAG,gBAAgB,GAAG,QAAQ;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,OAAO;AAEb,MAAI,SAAS;AACb,MAAI,2BAA2B,MAAM;AACnC,aAAS,GAAG,iBAAiB,IAAI,IAAI;AAAA,EACvC;AACA,SAAO;AACT;AAEA,SAAS,iBACP,OACA,YAAY,GACZ,oBAAoB,OACpB,WAAW,OACX,iBAAiB,MACjB,6BAA6B,KAC7B,sBAAsB,CAAC,GACvB;AACA,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AAEA,QAAM,WAAW,QAAQ;AACzB,QAAM,WAAW,KAAK,IAAI,KAAK;AAE/B,WAAS,gCACP,UACA,YAAY,IACZ,gBAAgB,IACqB;AACrC,UAAM,aAAa,WAAW;AAC9B,UAAM,uBAAuB,WAAW,QAAQ,SAAS;AAGzD,UAAM,gBACJ,OAAO,oBAAoB,KAAK,8BAC/B,aAAa,QAAQ,OAAO,oBAAoB,KAAK;AAGxD,UAAM,wBACJ,iBAAiB,YAAY,OAAO,oBAAoB,KAAK;AAC/D,UAAMC,UAAS,CAAC,wBAAwB,YAAY;AACpD,UAAM,oBAAoB,CAAC,wBACvB,wBACC,OAAO,oBAAoB,IAAI,KAAM,QAAQ,SAAS;AAE3D,QAAI,YAAY,eAAe;AAC7B,aAAO;AAAA,QACL,OAAO,iBAAiB,EAAE,eAAe,MAAM;AAAA;AAAA,UAE7C,GAAI,iBACF,OAAO,iBAAiB,MAAM,KAAK,EAAE,UAAU,aAAa;AAAA,UAC9D,uBAAuB;AAAA,UACvB,GAAG;AAAA,QACL,CAAC;AAAA,QACDA;AAAA,MACF;AAAA,IACF;AACA,WAAO,CAAC,mBAAmBA,OAAM;AAAA,EACnC;AAEA,MAAI,CAAC,WAAW,MAAM,IAAI,gCAAgC,GAAG,IAAI,GAAG;AACpE,MAAI,YAAY,QAAQ,WAAW,OAAO,mBAAmB,MAAM;AACjE;AAAC,KAAC,WAAW,MAAM,IAAI,gCAAgC,KAAK,KAAK,GAAG;AAAA,EACtE,WAAW,YAAY,QAAQ,WAAW,OAAO,mBAAmB,MAAM;AACxE;AAAC,KAAC,WAAW,MAAM,IAAI,gCAAgC,KAAK,KAAK,GAAG;AAAA,EACtE,WAAW,YAAY,QAAQ,WAAW,QAAQ,mBAAmB,MAAM;AACzE;AAAC,KAAC,WAAW,MAAM,IAAI,gCAAgC,KAAK,KAAK,GAAG;AAAA,EACtE,WAAW,YAAY,MAAM;AAC3B;AAAC,KAAC,WAAW,MAAM,IAAI,gCAAgC,MAAM,GAAG;AAAA,EAClE;AAEA,MAAI,CAAC,qBAAqB,CAAC,WAAW,SAAS,GAAG,GAAG;AACnD,UAAM,CAAC,QAAQ,KAAK,IAAI,UAAU,MAAM,GAAG;AAC3C,UAAM,eAAe,OAAO,QAAQ,SAAS,EAAE;AAC/C,gBAAY;AACZ,QAAI,cAAc,SAAS,GAAG;AAC5B,mBAAa,MAAM;AAAA,IACrB;AAAA,EACF;AACA,MAAI,UAAU;AACZ,gBAAY,MAAM;AAAA,EACpB;AACA,eAAa;AACb,SAAO;AACT;AAEO,SAAS,mBAAmB,OAA4C;AAC7E,SAAO,OAAO,YAAY,SAAS,GAAG,SAAS,CAAC;AAClD;AAKO,SAAS,wBACd,aACA,eACA;AAEA,QAAM,aAAa,MAAM;AACzB,QAAM,iBACJ,KAAK,KAAK,OAAO,WAAW,WAAW,IAAI,UAAU,IAAI,YACzD,QAAQ,aAAa;AAGvB,QAAM,gBAAgB,OAAO,WAAW,aAAa;AACrD,SAAO;AACT;AAEA,IAAM,aAAa;AACZ,SAAS,wBAAwB,WAAmC;AACzE,MAAI,CAAC,aAAa,SAAS,EAAG,QAAO;AACrC,QAAM,eAAe,OAAO,WAAW,UAAU,SAAS,CAAC;AAC3D,MAAI,eAAe,KAAK,eAAe,WAAY,QAAO;AAC1D,SAAO;AACT;AAEO,SAAS,MACd,OACA,UAMA,SAAqC,SAC7B;AACR,SAAO,KAAK,MAAM,EAAE,QAAQ,MAAM,QAAQ,IAAI,MAAM;AACtD;;;AC5RO,SAAS,oBACd,KACA,OACA,UAAsC,CAAC,GACvC;AACA,MAAI,MAAM,MAAM;AACd,WAAO,IAAI,2BAA2B,IAAI,CAAC;AAAA,EAC7C;AAEA,QAAM,EAAE,mBAAmB,IAAI,IAAI;AACnC,MAAI,qBAAqB,QAAQ,MAAM,kBAAkB;AACvD,WAAO,cAAe,MAAM,QAAS,GAAG;AAAA,EAC1C;AAEA,SAAO,2BAA2B,GAAG;AACvC;;;ACjCO,IAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,aAAa,KAAqB;AACzC,MAAI,OAAO,MAAM,OAAO,IAAI;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,YAAY,MAAM;AACxB,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAOO,SAAS,sBACd,MACA,EAAE,OAAO,QAAQ,QAAQ,OAAO,IAAsB,CAAC,GACvD;AACA,QAAM,WAAW,KAAK,SAAS;AAC/B,QAAM,WACJ,UAAU,UAAU,oBAAoB,QAAQ,IAAI,eAAe,QAAQ;AAC7E,QAAM,MAAM,KAAK,QAAQ;AACzB,QAAM,UACJ,SAAS,SACL,KACA,KACG,YAAY,EACZ,SAAS,EACT,MAAM,SAAS,SAAS,IAAI,CAAC;AACtC,QAAM,YAAY,aAAa,GAAG;AAClC,SAAO,GAAG,QAAQ,IAAI,GAAG,GAAG,SAAS,GAAG,UAAU,KAAK,OAAO,KAAK,EAAE;AACvE;AAOO,SAAS,gBACd,MACA,MAAwB,CAAC,GACjB;AACR,QAAM,EAAE,QAAQ,QAAQ,QAAQ,IAAI;AACpC,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,MAAM,KAAK,WAAW;AAC5B,QAAM,aAAa,YAAY,SAAS,KAAK,MAAM,KAAK,MAAM,MAAM;AACpE,QAAM,MAAM,KAAK,SAAS;AAC1B,QAAM,WAAW,UAAU,SAAS,MAAM,MAAM,MAAM;AACtD,QAAM,OAAO,UAAU,SAAS,KAAK,OAAO,KAAK,OAAO;AAExD,SAAO,GAAG,sBAAsB,MAAM,GAAG,CAAC,SAAM,QAAQ,IACtD,UAAU,KAAK,MAAM,EACvB,GAAG,OAAO,GAAG,aAAa,IAAI,UAAU,KAAK,EAAE,GAAG,OAAO,MAAM,OAAO,EAAE;AAC1E;AAgBO,SAAS,4BACd,SACA,qBAAqB,OACrB,cAAc,OACN;AACR,QAAM,oBAAoB,KAAK,KAAK,OAAO;AAE3C,MAAI,qBAAqB,IAAI;AAC3B,WAAO,qBAAqB,WAAW,GAAG,iBAAiB;AAAA,EAC7D;AAEA,QAAM,IAAI,cAAc,IAAI,oBAAoB;AAChD,QAAM,IAAI,KAAK,MAAM,oBAAoB,KAAK,EAAE,IAAI;AACpD,QAAM,IAAI,KAAK,MAAM,oBAAoB,IAAI,IAAI,MAAM,KAAK,EAAE;AAG9D,MAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,EAC3D,OAAO,OAAO,EACd,KAAK,GAAG;AACb;AAEO,SAAS,6BAA6B,SAAiB;AAC5D,QAAM,oBAAoB,KAAK,KAAK,OAAO;AAC3C,QAAM,OAAO,KAAK,MAAM,oBAAoB,EAAE;AAC9C,QAAM,gBAAgB,oBAAoB;AAC1C,SAAO,IAAI,OAAO,KAAK,MAAM,MAAM,IAAI,KACpC,gBAAgB,KAAK,MAAM,MAAM,aACpC;AACF;;;AC3IO,SAAS,QACd,OACA,QACwB;AACxB,QAAM,eAAuC,CAAC;AAE9C,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,OAAO,IAAI;AAEvB,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AAEA,QAAI,CAAC,aAAa,GAAG,GAAG;AACtB,mBAAa,GAAG,IAAI,CAAC;AAAA,IACvB;AAEA,iBAAa,GAAG,EAAE,KAAK,IAAI;AAAA,EAC7B;AAEA,SAAO;AACT;;;ACrBO,SAAS,QACd,OACA,QACsB;AACtB,QAAM,eAAqC,CAAC;AAE5C,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,OAAO,IAAI;AAEvB,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AAEA,iBAAa,GAAG,IAAI;AAAA,EACtB;AAEA,SAAO;AACT;;;ACjBO,SAAS,YAAqB;AACnC,SACE,OAAO,cAAc,eAAe,WAAW,KAAK,UAAU,SAAS;AAE3E;AAEO,SAAS,aAAsB;AACpC,SACE,OAAO,cAAc,eAAe,cAAc,KAAK,UAAU,SAAS;AAE9E;AAEO,SAAS,aAAsB;AACpC,SACE,OAAO,cAAc,gBACpB,OAAO,KAAK,UAAU,SAAS,KAC7B,UAAU,aAAa,cAAc,UAAU,iBAAiB;AAEvE;AAEO,SAAS,QAAiB;AAC/B,SAAO,WAAW,KAAK,WAAW;AACpC;AAEO,SAAS,WAAoB;AAClC,SAAO,UAAU,KAAK,MAAM;AAC9B;;;AC1BO,SAAS,mBAAsB,KAAyB;AAC7D,MAAI;AACF,UAAM,QAAQ,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;AACvC,WAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAAA,EACzC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,cACd,KACA,SACU;AACV,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,GAAG;AACV,cAAU,CAAC;AACX,WAAO;AAAA,EACT;AACF;;;ACpBO,IAAM,wBAAwB,MAAM;AACzC,MAAI,OAAO,WAAW,eAAe,OAAO,cAAc,aAAa;AACrE,QAAI,UAAU,WAAW,QAAQ;AAC/B,aAAO,UAAU,UAAU,CAAC;AAAA,IAC9B;AAEA,QAAI,UAAU,UAAU;AACtB,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AACF;;;ACXO,SAAS,iBAAiB,WAAmB;AAClD,MAAI,OAAO,WAAW,eAAe,UAAU;AAC7C,QAAI,UAAU,WAAW,MAAM,GAAG;AAUhC,YAAM,OAAO,SAAS,cAAc,GAAG;AACvC,WAAK,OAAO;AACZ,WAAK,SAAS;AACd,WAAK,MAAM;AACX,WAAK,MAAM;AAAA,IACb,OAAO;AACL,aAAO,SAAS,OAAO;AAAA,IACzB;AAAA,EACF;AACF;;;ACrBO,IAAM,OAAO,MAAM;;;ACAnB,SAAS,oBAAsC,KAAW;AAC/D,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS;AAAA,EAC/D;AACF;;;ACJO,IAAM,WAAW,CAAC,MAA6C;AACpE,SAAO,OAAO,MAAM,YAAY,MAAM;AACxC;",
6
6
  "names": ["BrowserType", "suffix"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@funkit/utils",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Funkit Utils SDK centralizes all utilities & consts for usage across all funkit apps and packages.",
5
5
  "files": [
6
6
  "dist/src",
@@ -28,7 +28,7 @@
28
28
  "@testing-library/jest-dom": "^6.2.0",
29
29
  "@testing-library/react": "^16.0.1",
30
30
  "@testing-library/user-event": "^14.5.2",
31
- "jsdom": "^23.0.1",
31
+ "jsdom": "^25.0.1",
32
32
  "react": "^18.3.0",
33
33
  "vitest": "^2.0.5"
34
34
  },