@talismn/util 1.1.0 → 2.0.0
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/LICENSE +253 -674
- package/dist/index.d.mts +339 -94
- package/dist/index.d.mts.map +1 -0
- package/dist/index.d.ts +338 -93
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +894 -450
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +814 -385
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -7
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/configureBigNumber.ts","../src/addTrailingSlash.ts","../src/BigMath.ts","../src/deferred.ts","../src/firstThenDebounce.ts","../src/formatDecimals.ts","../src/formatPrice.ts","../src/getLoadable.ts","../src/getLoadableQuery.ts","../src/getQuery.ts","../src/getSharedObservable.ts","../src/hasOwnProperty.ts","../src/isAbortError.ts","../src/isArrayOf.ts","../src/isAscii.ts","../src/isBigInt.ts","../src/isBooleanTrue.ts","../src/isErrorOfName.ts","../src/isHexString.ts","../src/isNotNil.ts","../src/isPromise.ts","../src/isSubject.ts","../src/isTruthy.ts","../src/keepAlive.ts","../src/planckToTokens.ts","../src/replaySubjectFrom.ts","../src/sleep.ts","../src/splitSubject.ts","../src/stripHexPrefix.ts","../src/throwAfter.ts","../src/tokensToPlanck.ts","../src/validateHexString.ts"],"sourcesContent":["import BigNumber from \"bignumber.js\"\n\n// bignumber.js v10+ throws on invalid input by default (the STRICT option).\n// Restore the v9 behaviour of returning NaN so existing callers are unaffected.\n// The bignumber.js config is a shared singleton, so this applies process-wide.\n// Import BigNumber from here (rather than directly from \"bignumber.js\") to\n// guarantee this config has run before any value is constructed.\nBigNumber.set({ STRICT: false })\n\nexport default BigNumber\n","export const addTrailingSlash = (url: string) => {\n if (url.endsWith(\"/\")) {\n return url\n }\n\n return `${url}/`\n}\n","/**\n * Javascript's `Math` library for `BigInt`.\n * Taken from https://stackoverflow.com/questions/51867270/is-there-a-library-similar-to-math-that-supports-javascript-bigint/64953280#64953280\n */\nexport const BigMath = {\n abs(x: bigint) {\n return x < 0n ? -x : x\n },\n sign(x: bigint) {\n if (x === 0n) return 0n\n return x < 0n ? -1n : 1n\n },\n // TODO: Improve our babel/tsc config to let us use the `**` operator on bigint values.\n // Error thrown: Exponentiation cannot be performed on 'bigint' values unless the 'target' option is set to 'es2016' or later. ts(2791)\n // pow(base: bigint, exponent: bigint) {\n // return base ** exponent\n // },\n min(value: bigint, ...values: bigint[]) {\n for (const v of values) if (v < value) value = v\n return value\n },\n max(value: bigint, ...values: bigint[]) {\n for (const v of values) if (v > value) value = v\n return value\n },\n}\n","/**\n * In TypeScript, a deferred promise refers to a pattern that involves creating a promise that can be\n * resolved or rejected at a later point in time, typically by code outside of the current function scope.\n *\n * This pattern is often used when dealing with asynchronous operations that involve multiple steps or when\n * the result of an operation cannot be immediately determined.\n */\nexport function Deferred<T>(): {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (reason?: unknown) => void\n isPending: () => boolean\n isResolved: () => boolean\n isRejected: () => boolean\n} {\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (reason?: unknown) => void\n\n let isPending = true\n let isResolved = false\n let isRejected = false\n\n const promise = new Promise<T>((innerResolve, innerReject) => {\n resolve = (value) => {\n isPending = false\n isResolved = true\n innerResolve(value)\n }\n reject = (reason) => {\n isPending = false\n isRejected = true\n innerReject(reason)\n }\n })\n\n return {\n promise,\n resolve,\n reject,\n isPending: () => isPending,\n isResolved: () => isResolved,\n isRejected: () => isRejected,\n }\n}\n","import { concat, debounceTime, type Observable, type OperatorFunction, skip, take } from \"rxjs\"\n\n/**\n * An rxjs operator which:\n *\n * 1. Emits the first value it receives from the source observable, then:\n * 2. Debounces any future values by `timeout` ms.\n */\nexport const firstThenDebounce =\n <T>(timeout: number): OperatorFunction<T, T> =>\n (source: Observable<T>) =>\n concat(source.pipe(take(1)), source.pipe(skip(1)).pipe(debounceTime(timeout)))\n","import BigNumber from \"./configureBigNumber\"\n\nconst MIN_DIGITS = 4 // less truncates more than what compact formating is\nexport const MAX_DECIMALS_FORMAT = 12\n\n/**\n * Custom decimal number formatting for Talisman\n * note that the NumberFormat().format() call is the ressource heavy part, it's not worth trying to optimize other parts\n * @param num input number\n * @param digits number of significant digits to display\n * @param locale locale used to format the number\n * @param options formatting options\n * @returns the formatted value\n */\nexport const formatDecimals = (\n num?: string | number | null | BigNumber,\n digits = MIN_DIGITS,\n options: Partial<Intl.NumberFormatOptions> = {},\n locale = \"en-US\"\n): string => {\n if (num === null || num === undefined) return \"\"\n if (digits < MIN_DIGITS) digits = MIN_DIGITS\n\n const value = new BigNumber(num)\n // very small numbers should display \"< 0.0001\"\n const minDisplayVal = 1 / 10 ** digits\n\n if (value.gt(0) && value.lt(minDisplayVal)) return `< ${formatDecimals(minDisplayVal)}`\n\n // count digits\n const flooredValue = value.integerValue()\n const intDigits = flooredValue.isEqualTo(0) ? 0 : flooredValue.toString().length\n\n // we never want to display a rounded up value\n // to prevent JS default rounding, we will remove/truncate insignificant digits ourselves before formatting\n let truncatedValue = value\n //remove insignificant fraction digits\n const excessFractionDigitsPow10 = new BigNumber(10).pow(\n digits > intDigits ? digits - intDigits : 0\n )\n\n truncatedValue = truncatedValue\n .multipliedBy(excessFractionDigitsPow10)\n .integerValue()\n .dividedBy(excessFractionDigitsPow10)\n\n //remove insignificant integer digits\n const excessIntegerDigits = new BigNumber(intDigits > digits ? intDigits - digits : 0)\n const excessIntegerDigitsPow10 = new BigNumber(10).pow(excessIntegerDigits)\n if (excessIntegerDigits.gt(0))\n truncatedValue = truncatedValue\n .dividedBy(excessIntegerDigitsPow10)\n .integerValue()\n .multipliedBy(excessIntegerDigitsPow10)\n\n // format\n\n return Intl.NumberFormat(locale, {\n // compact notation (K, M, B) if above 9999\n notation: truncatedValue.abs().gt(9999) ? \"compact\" : \"standard\",\n // NOTE: possible values are from `0` to `21`\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#maximumsignificantdigits\n maximumSignificantDigits: Math.max(1, Math.min(digits + (truncatedValue.lt(1) ? 1 : 0), 21)),\n ...options,\n }).format(truncatedValue.toNumber())\n}\n","export const formatPrice = (price: number, currency: string, compact: boolean) => {\n return Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency,\n currencyDisplay: currency === \"usd\" ? \"narrowSymbol\" : \"symbol\",\n minimumSignificantDigits: 3,\n maximumSignificantDigits: compact ? (price < 1 ? 3 : 4) : undefined,\n roundingPriority: compact ? \"auto\" : \"morePrecision\",\n notation: compact ? \"compact\" : \"standard\",\n }).format(price)\n}\n","import { catchError, from, map, type Observable, of, startWith, switchMap, timer } from \"rxjs\"\n\n// Designed to be serializable as it can be sent to the frontend\ntype LoadableError = {\n name: string // can be used to identify the error type\n message: string // display message\n}\n\nexport type Loadable<T = unknown> =\n | { status: \"loading\"; data?: T; error?: undefined }\n | { status: \"success\"; data: T; error?: undefined }\n | { status: \"error\"; data?: T; error: LoadableError }\n\nexport type LoadableStatus = Loadable[\"status\"]\n\nexport type LoadableOptions = {\n getError?: (error: unknown) => LoadableError\n refreshInterval?: number\n}\n\nexport function getLoadable$<T>(\n factory: () => Promise<T>,\n options: LoadableOptions = {}\n): Observable<Loadable<T>> {\n const { getError, refreshInterval } = options\n\n const createLoadableStream = () =>\n from(factory()).pipe(\n map(\n (data): Loadable<T> => ({\n status: \"success\",\n data,\n })\n ),\n catchError((error) =>\n of<Loadable<T>>({\n status: \"error\",\n error: getError ? getError(error) : getGenericError(error),\n })\n )\n )\n\n const source$ = refreshInterval\n ? timer(0, refreshInterval).pipe(switchMap(() => createLoadableStream()))\n : createLoadableStream()\n\n return source$.pipe(\n startWith<Loadable<T>>({\n status: \"loading\",\n } as Loadable<T>)\n )\n}\n\nconst getGenericError = (error: unknown): LoadableError => ({\n name: \"Error\",\n message: getGenericErrorMessage(error),\n})\n\nconst getGenericErrorMessage = (error: unknown): string => {\n if (typeof error === \"string\") {\n return error\n } else if (error instanceof Error) {\n return error.message\n } else if (error && typeof error === \"object\" && \"message\" in error) {\n return (error as { message: string }).message\n }\n return String(error) || \"Unknown error\"\n}\n","import { map, type Observable, startWith } from \"rxjs\"\n\nimport type { Loadable } from \"./getLoadable\"\nimport { getQuery$, type QueryResult } from \"./getQuery\"\n\nexport type GetLoadableQueryParams<TArgs extends unknown[], TResult> = {\n namespace: string\n args: TArgs\n queryFn: (args: TArgs, signal: AbortSignal) => Promise<TResult>\n refreshInterval?: number\n defaultValue?: TResult\n}\n\n/**\n * Thin wrapper around getQuery$ that returns Loadable<T> and optionally\n * primes the stream with a loading state using the provided default value.\n *\n * TODO: consolidate with getQuery$\n */\nexport const getLoadableQuery$ = <TArgs extends unknown[], TResult>(\n params: GetLoadableQueryParams<TArgs, TResult>\n): Observable<Loadable<TResult>> => {\n const initial =\n params.defaultValue === undefined\n ? []\n : ([{ status: \"loading\", data: params.defaultValue }] as Loadable<TResult>[])\n\n return getQuery$(params).pipe(\n map((val: QueryResult<TResult>): Loadable<TResult> => {\n switch (val.status) {\n case \"loading\":\n return { status: \"loading\", data: val.data }\n case \"loaded\":\n return { status: \"success\", data: val.data }\n case \"error\": {\n const err = val.error as Error | undefined\n return {\n status: \"error\",\n error: {\n name: err?.name ?? \"QueryError\",\n message: err?.message ?? \"Failed to execute query\",\n },\n }\n }\n }\n }),\n startWith(...initial)\n )\n}\n","import { isEqual } from \"lodash-es\"\nimport { BehaviorSubject, distinctUntilChanged, Observable, shareReplay } from \"rxjs\"\n\nimport { getSharedObservable } from \"./getSharedObservable\"\n\nexport type QueryStatus = \"loading\" | \"loaded\" | \"error\"\n\nexport type QueryResult<\n T,\n S extends QueryStatus = \"loading\" | \"loaded\" | \"error\",\n> = S extends \"loading\"\n ? { status: \"loading\"; data: T | undefined; error: undefined }\n : S extends \"loaded\"\n ? { status: \"loaded\"; data: T; error: undefined }\n : { status: \"error\"; data: undefined; error: unknown }\n\ntype QueryOptions<Output, Args> = {\n namespace: string\n args: Args\n queryFn: (args: Args, signal: AbortSignal) => Promise<Output>\n defaultValue?: Output\n refreshInterval?: number\n serializer?: (args: Args) => string\n}\n\n/**\n * Creates a shared observable for executing queries with caching, loading states, and automatic refresh capabilities.\n *\n * @example\n * ```typescript\n * const userQuery$ = getQuery$({\n * namespace: 'users',\n * args: { userId: 123 },\n * queryFn: async ({ userId }) => fetchUser(userId),\n * defaultValue: null,\n * refreshInterval: 30000\n * });\n *\n * userQuery$.subscribe(result => {\n * if (result.status === 'loaded') {\n * console.log(result.data);\n * }\n * });\n * ```\n *\n * @deprecated use getLoadableQuery$ instead\n */\nexport const getQuery$ = <Output, Args>({\n namespace,\n args,\n queryFn,\n defaultValue,\n refreshInterval,\n serializer = (args) => JSON.stringify(args),\n}: QueryOptions<Output, Args>): Observable<QueryResult<Output>> => {\n return getSharedObservable(\n namespace,\n args,\n () =>\n new Observable<QueryResult<Output>>((subscriber) => {\n const controller = new AbortController()\n\n const result = new BehaviorSubject<QueryResult<Output>>({\n status: \"loading\",\n data: defaultValue,\n error: undefined,\n })\n\n // result subscription\n const sub = result\n .pipe(distinctUntilChanged<QueryResult<Output>>(isEqual))\n .subscribe(subscriber)\n\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n let timeout: any = null\n\n // fetch result subscription\n const run = () => {\n if (controller.signal.aborted) return\n\n queryFn(args, controller.signal)\n .then((data) => {\n if (controller.signal.aborted) return\n result.next({ status: \"loaded\", data, error: undefined })\n })\n .catch((error) => {\n if (controller.signal.aborted) return\n result.next({ status: \"error\", data: undefined, error })\n })\n .finally(() => {\n if (controller.signal.aborted) return\n if (refreshInterval) timeout = setTimeout(run, refreshInterval)\n })\n }\n\n run()\n\n return () => {\n sub.unsubscribe()\n if (timeout) clearTimeout(timeout)\n controller.abort(new Error(\"getQuery$ unsubscribed\"))\n }\n }).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n serializer\n )\n}\n","import { type Observable, shareReplay } from \"rxjs\"\n\nconst CACHE = new Map<string, unknown>()\n\n/**\n * When using react-rxjs hooks and state observables, the options are used as weak map keys.\n * This means that if the options object is recreated on each render, the observable will be recreated as well.\n * This utility function allows you to create a shared observable based on a namespace and arguments that, so react-rxjs can reuse the same observables\n *\n * @param namespace\n * @param args\n * @param createObservable\n * @param serializer\n * @returns\n */\nexport const getSharedObservable = <Args, Output, ObsOutput = Observable<Output>>(\n namespace: string,\n args: Args,\n createObservable: (args: Args) => ObsOutput,\n serializer = (args: Args): string => JSON.stringify(args)\n): ObsOutput => {\n const cacheKey = `${namespace}:${serializer(args)}`\n\n if (CACHE.has(cacheKey)) return CACHE.get(cacheKey) as ObsOutput\n\n const obs = createObservable(args) as Observable<unknown>\n const sharedObs = obs.pipe(shareReplay({ bufferSize: 1, refCount: true }))\n\n CACHE.set(cacheKey, sharedObs)\n\n return sharedObs as ObsOutput\n}\n","// biome-ignore lint/suspicious/noShadowRestrictedNames: legacy\nexport function hasOwnProperty<X, Y extends PropertyKey>(\n obj: X,\n prop: Y\n): obj is X & Record<Y, unknown> {\n if (typeof obj !== \"object\") return false\n if (obj === null) return false\n return prop in obj\n}\n","export const isAbortError = (error: unknown): boolean => {\n return error instanceof Error && error.name === \"AbortError\"\n}\n","export function isArrayOf<T, P extends Array<unknown>>(\n array: unknown[],\n func: new (...args: P) => T\n): array is T[] {\n if (array.length > 0 && array[0] instanceof func) return true\n return false\n}\n","export const isAscii = (str: string): boolean => {\n return [...str].every((char) => char.charCodeAt(0) <= 127)\n}\n","export const isBigInt = (value: unknown): value is bigint => typeof value === \"bigint\"\n","export const isBooleanTrue = <T>(x: T | null | undefined): x is T => !!x\n","/**\n * Robust replacement for `error instanceof SomeErrorClass` when the class comes from a\n * package that gets bundled into multiple chunks/contexts (e.g. viem, @solana/web3.js).\n *\n * `instanceof` returns `false` whenever the error originates from a different bundled copy of\n * the module than the imported class reference — which silently broke Solana transfers (see\n * apps/extension/src/__tests__/no-instanceof-bundled-class.test.ts). An error's `.name` is\n * stable across copies, *provided the class sets it explicitly* (viem does:\n * `super({ name: 'ContractFunctionExecutionError' })`). For classes that don't set `.name`,\n * duck-type the shape instead.\n */\nexport const isErrorOfName = (error: unknown, ...names: string[]): boolean =>\n error instanceof Error && names.includes(error.name)\n","export type HexString = `0x${string}`\n\nexport const REGEX_HEX_STRING = /^0x[0-9a-fA-F]*$/\n\nexport const isHexString = (value: unknown): value is HexString => {\n return typeof value === \"string\" && REGEX_HEX_STRING.test(value)\n}\n","/**\n * WARNING: This function only checks against null or undefined, it does not coerce the value.\n * ie: false and 0 are considered not nil\n * Use isTruthy instead for a regular coercion check.\n *\n * @param value\n * @returns whether the value is neither null nor undefined\n */\nexport const isNotNil = <T>(value: T | null | undefined): value is T =>\n value !== null && value !== undefined\n","// biome-ignore lint/suspicious/noExplicitAny: legacy\nexport const isPromise = <T = any>(value: any): value is Promise<T> =>\n !!value &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof value.then === \"function\"\n","import { Subject } from \"rxjs\"\n\n/**\n * Tests to see if an object is an RxJS {@link Subject}.\n */\nexport function isSubject<T>(object?: Subject<T> | object): object is Subject<T> {\n if (!object) return false\n if (object instanceof Subject) return true\n return (\n \"asObservable\" in object &&\n isFn(object.asObservable) &&\n \"complete\" in object &&\n isFn(object.complete) &&\n \"error\" in object &&\n isFn(object.error) &&\n \"forEach\" in object &&\n isFn(object.forEach) &&\n \"next\" in object &&\n isFn(object.next) &&\n \"pipe\" in object &&\n isFn(object.pipe) &&\n \"subscribe\" in object &&\n isFn(object.subscribe) &&\n \"unsubscribe\" in object &&\n isFn(object.unsubscribe) &&\n \"closed\" in object &&\n isBool(object.closed) &&\n \"observed\" in object &&\n isBool(object.observed)\n )\n}\n\n/**\n * Returns `true` if `value` is a function.\n */\nfunction isFn(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === \"function\"\n}\n\n/**\n * Returns `true` if `value` is a boolean.\n */\nfunction isBool(value: unknown): value is boolean {\n return typeof value === \"boolean\"\n}\n","export const isTruthy = <T>(value: T | null | undefined): value is T => Boolean(value)\n","import type { OperatorFunction } from \"rxjs\"\nimport { type Observable, shareReplay, tap } from \"rxjs\"\n\n/**\n * An RxJS operator that keeps the source observable alive for a specified duration\n * after all subscribers have unsubscribed. This prevents expensive re-subscriptions\n * when subscribers come and go frequently.\n *\n * @param keepAliveMs - Duration in milliseconds to keep the source alive after last unsubscription\n * @returns MonoTypeOperatorFunction that can be used in pipe()\n *\n * @example\n * ```typescript\n * const data$ = expensive_api_call$.pipe(\n * keepAlive(3000) // Keep alive for 3 seconds\n * );\n * ```\n */\nexport const keepAlive = <T>(timeout: number): OperatorFunction<T, T> => {\n let release: ReturnType<typeof keepSourceSubscribed> | null\n\n return (source: Observable<T>) =>\n source.pipe(\n tap({\n subscribe: () => {\n release = keepSourceSubscribed(source, timeout)\n },\n unsubscribe: () => {\n release?.()\n },\n }),\n shareReplay({ refCount: true, bufferSize: 1 })\n )\n}\n\nconst keepSourceSubscribed = (observable: Observable<unknown>, ms: number) => {\n const sub = observable.subscribe()\n return () => setTimeout(() => sub.unsubscribe(), ms)\n}\n","import BigNumber from \"./configureBigNumber\"\n\nexport function planckToTokens(planck: string, tokenDecimals: number): string\nexport function planckToTokens(planck: string, tokenDecimals?: number): string | undefined\nexport function planckToTokens(planck?: string, tokenDecimals?: number): string | undefined\nexport function planckToTokens(planck?: string, tokenDecimals?: number): string | undefined {\n if (typeof planck !== \"string\" || typeof tokenDecimals !== \"number\") return\n\n const base = 10\n const exponent = -1 * tokenDecimals\n const multiplier = base ** exponent\n\n return new BigNumber(planck).multipliedBy(multiplier).toString(10)\n}\n","import { ReplaySubject } from \"rxjs\"\n\nimport { isPromise } from \"./isPromise\"\n\n/**\n * Turns a value into a {@link ReplaySubject} of size 1.\n *\n * If the value is already a {@link ReplaySubject}, it will be returned as-is.\n *\n * If the value is a {@link Promise}, it will be awaited,\n * and the awaited value will be published into the {@link ReplaySubject} when it becomes available.\n *\n * For any other type of value, it will be immediately published into the {@link ReplaySubject}.\n */\nexport const replaySubjectFrom = <T>(\n initialValue: T | Promise<T> | ReplaySubject<T>\n): ReplaySubject<T> => {\n if (initialValue instanceof ReplaySubject) return initialValue\n\n const subject = new ReplaySubject<T>(1)\n\n // if initialValue is a promise, await it and then call `subject.next()` with the awaited value\n if (isPromise(initialValue)) {\n initialValue.then(\n (value) => subject.next(value),\n (error) => subject.error(error)\n )\n return subject\n }\n\n // if initialValue is not a promise, immediately call `subject.next()` with the value\n subject.next(initialValue)\n return subject\n}\n","export const sleep = (ms: number) =>\n new Promise<void>((resolve) => {\n if (process.env.NODE_ENV === \"test\") resolve()\n else setTimeout(resolve, ms)\n })\n","import type { Observable, Subject } from \"rxjs\"\n\n/**\n * Takes a subject and splits it into two parts:\n *\n * 1. A function to submit new values into the subject.\n * 2. An observable for subscribing to new values from the subject.\n *\n * This can be helpful when, to avoid bugs, you want to expose only one\n * of these parts to external code and keep the other part private.\n */\nexport function splitSubject<T>(subject: Subject<T>) {\n const next = (value: T) => subject.next(value)\n const observable: Observable<T> = subject.asObservable()\n\n return [next, observable] as const\n}\n","/**\n * @name stripHexPrefix\n * @description Removes a leading `0x` prefix from a string, if present.\n * @param {string} str - string to strip\n * @returns {string} - the string without its leading `0x` prefix\n * @example\n * stripHexPrefix(\"0x1234\") // \"1234\"\n * stripHexPrefix(\"1234\") // \"1234\"\n **/\nexport const stripHexPrefix = (str: string): string => (str.startsWith(\"0x\") ? str.slice(2) : str)\n","export const throwAfter = (ms: number, reason: string) =>\n new Promise<never>((_, reject) => setTimeout(() => reject(new Error(reason)), ms))\n","import BigNumber from \"./configureBigNumber\"\n\nexport function tokensToPlanck(tokens: string, tokenDecimals: number): string\nexport function tokensToPlanck(tokens: string, tokenDecimals?: number): string | undefined\nexport function tokensToPlanck(tokens?: string, tokenDecimals?: number): string | undefined\nexport function tokensToPlanck(tokens?: string, tokenDecimals?: number): string | undefined {\n if (typeof tokens !== \"string\" || typeof tokenDecimals !== \"number\") return\n\n const base = 10\n const exponent = tokenDecimals\n const multiplier = base ** exponent\n\n return new BigNumber(tokens).multipliedBy(multiplier).toString(10)\n}\n","/**\n * @name validateHexString\n * @description Checks if a string is a hex string. Required to account for type differences between different polkadot libraries\n * @param {string} str - string to check\n * @returns {`0x${string}`} - boolean\n * @example\n * validateHexString(\"0x1234\") // \"0x1234\"\n * validateHexString(\"1234\") // Error: Expected a hex string\n * validateHexString(1234) // Error: Expected a string\n **/\nexport const validateHexString = (str: string): `0x${string}` => {\n if (typeof str !== \"string\") {\n throw new Error(\"Expected a string\")\n }\n\n if (str.startsWith(\"0x\")) {\n return str as `0x${string}`\n }\n throw new Error(\"Expected a hex string\")\n}\n"],"mappings":"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","names":["map","startWith","shareReplay","args","args","shareReplay","map","startWith","shareReplay"]}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["BigNumber","#maxSize","#map","BigNumber","exponent","BigNumber"],"sources":["../src/configureBigNumber.ts","../src/addTrailingSlash.ts","../src/assert.ts","../src/BigMath.ts","../src/isHexString.ts","../src/bytes.ts","../src/jsActivityHook.ts","../src/yieldToEventLoop.ts","../src/timeSlicer.ts","../src/chunkedArray.ts","../src/deferred.ts","../src/firstThenDebounce.ts","../src/formatDecimals.ts","../src/formatPrice.ts","../src/getLoadable.ts","../src/getSharedObservable.ts","../src/getQuery.ts","../src/getLoadableQuery.ts","../src/hasOwnProperty.ts","../src/isAbortError.ts","../src/isArrayOf.ts","../src/isAscii.ts","../src/isBigInt.ts","../src/isBooleanTrue.ts","../src/isErrorOfName.ts","../src/isNotNil.ts","../src/isPromise.ts","../src/isSubject.ts","../src/isTruthy.ts","../src/keepAlive.ts","../src/lruMap.ts","../src/mapChunked.ts","../src/planckToTokens.ts","../src/replaySubjectFrom.ts","../src/sleep.ts","../src/splitSubject.ts","../src/stripHexPrefix.ts","../src/throwAfter.ts","../src/tokensToPlanck.ts","../src/validateArrayWithYield.ts","../src/validateHexString.ts"],"sourcesContent":["import BigNumber from \"bignumber.js\"\n\n// bignumber.js v10+ throws on invalid input by default (the STRICT option).\n// Restore the v9 behaviour of returning NaN so existing callers are unaffected.\n// The bignumber.js config is a shared singleton, so this applies process-wide.\n// Import BigNumber from here (rather than directly from \"bignumber.js\") to\n// guarantee this config has run before any value is constructed.\nBigNumber.set({ STRICT: false })\n\nexport default BigNumber\n","export const addTrailingSlash = (url: string) => {\n if (url.endsWith(\"/\")) {\n return url\n }\n\n return `${url}/`\n}\n","/**\n * @name assert\n * @description Throws an Error with the given message if the condition is falsy.\n * @example\n * assert(chain, \"Chain not found\")\n **/\nexport function assert(condition: unknown, message: string | (() => string)): asserts condition {\n if (condition) return\n throw new Error(typeof message === \"function\" ? message() : message)\n}\n","/**\n * Javascript's `Math` library for `BigInt`.\n * Taken from https://stackoverflow.com/questions/51867270/is-there-a-library-similar-to-math-that-supports-javascript-bigint/64953280#64953280\n */\nexport const BigMath = {\n abs(x: bigint) {\n return x < 0n ? -x : x\n },\n sign(x: bigint) {\n if (x === 0n) return 0n\n return x < 0n ? -1n : 1n\n },\n // TODO: Improve our babel/tsc config to let us use the `**` operator on bigint values.\n // Error thrown: Exponentiation cannot be performed on 'bigint' values unless the 'target' option is set to 'es2016' or later. ts(2791)\n // pow(base: bigint, exponent: bigint) {\n // return base ** exponent\n // },\n min(value: bigint, ...values: bigint[]) {\n for (const v of values) if (v < value) value = v\n return value\n },\n max(value: bigint, ...values: bigint[]) {\n for (const v of values) if (v > value) value = v\n return value\n },\n}\n","export type HexString = `0x${string}`\n\nexport const REGEX_HEX_STRING = /^0x[0-9a-fA-F]*$/\n\nexport const isHexString = (value: unknown): value is HexString => {\n return typeof value === \"string\" && REGEX_HEX_STRING.test(value)\n}\n","import { type HexString, isHexString } from \"./isHexString\"\n\n/**\n * Byte / hex primitives, drop-in equivalents of the `@polkadot/util` helpers we used to depend on.\n * Semantics intentionally match polkadot-js for migration safety.\n */\n\nexport const hexToU8a = (hex?: string | null): Uint8Array => {\n if (!hex) return new Uint8Array()\n const value = hex.startsWith(\"0x\") ? hex.slice(2) : hex\n // polkadot-js right-pads odd-length hex\n const padded = value.length % 2 ? `${value}0` : value\n const result = new Uint8Array(padded.length / 2)\n for (let i = 0; i < result.length; i++)\n result[i] = parseInt(padded.substring(i * 2, i * 2 + 2), 16)\n return result\n}\n\nexport const u8aToHex = (value?: Uint8Array | null): HexString => {\n if (!value?.length) return \"0x\"\n let hex = \"\"\n for (const byte of value) hex += byte.toString(16).padStart(2, \"0\")\n return `0x${hex}`\n}\n\nexport const stringToU8a = (value?: string | null): Uint8Array =>\n value ? new TextEncoder().encode(value) : new Uint8Array()\n\nexport const u8aToString = (value?: Uint8Array | null): string =>\n value?.length ? new TextDecoder(\"utf-8\").decode(value) : \"\"\n\nexport const hexToString = (hex?: string | null): string => u8aToString(hexToU8a(hex))\n\nexport const hexToNumber = (hex?: string | null): number => (hex ? parseInt(hex, 16) : NaN)\n\nexport const numberToU8a = (value?: number | null): Uint8Array => {\n let hex = (value ?? 0).toString(16)\n if (hex.length % 2) hex = `0${hex}`\n return hexToU8a(hex)\n}\n\n/** Coerces hex strings, utf-8 strings, number arrays and buffers to Uint8Array (polkadot-js semantics) */\nexport const u8aToU8a = (value?: string | number[] | Uint8Array | null): Uint8Array => {\n if (!value) return new Uint8Array()\n if (value instanceof Uint8Array) return value\n if (Array.isArray(value)) return new Uint8Array(value)\n return isHexString(value) ? hexToU8a(value) : stringToU8a(value)\n}\n\nexport const u8aConcat = (...items: (string | number[] | Uint8Array)[]): Uint8Array => {\n const chunks = items.map((item) => u8aToU8a(item))\n const result = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.length, 0))\n let offset = 0\n for (const chunk of chunks) {\n result.set(chunk, offset)\n offset += chunk.length\n }\n return result\n}\n\nexport const u8aEq = (a: string | Uint8Array, b: string | Uint8Array): boolean => {\n const u8aa = u8aToU8a(a)\n const u8ab = u8aToU8a(b)\n if (u8aa.length !== u8ab.length) return false\n return u8aa.every((byte, i) => byte === u8ab[i])\n}\n\nexport const u8aCmp = (a: string | Uint8Array, b: string | Uint8Array): number => {\n const u8aa = u8aToU8a(a)\n const u8ab = u8aToU8a(b)\n for (let i = 0; i < Math.max(u8aa.length, u8ab.length); i++) {\n const byteA = u8aa[i] ?? 0\n const byteB = u8ab[i] ?? 0\n if (byteA !== byteB) return byteA < byteB ? -1 : 1\n }\n return u8aa.length === u8ab.length ? 0 : u8aa.length < u8ab.length ? -1 : 1\n}\n\n/**\n * Tests if the input is printable ASCII (code points 32-126). Hex strings are decoded to bytes\n * first, other strings are checked character-wise (polkadot-js `isAscii` semantics).\n */\nexport const isAsciiPrintable = (value?: string | Uint8Array | null): boolean => {\n if (value == null) return false\n const bytes =\n typeof value === \"string\" && !isHexString(value) ? stringToU8a(value) : u8aToU8a(value)\n return bytes.every((b) => b >= 32 && b <= 126)\n}\n\nconst U8A_WRAP_PREFIX = stringToU8a(\"<Bytes>\")\nconst U8A_WRAP_POSTFIX = stringToU8a(\"</Bytes>\")\n\nconst u8aIsWrapped = (value: Uint8Array): boolean =>\n value.length >= U8A_WRAP_PREFIX.length + U8A_WRAP_POSTFIX.length &&\n u8aEq(value.subarray(0, U8A_WRAP_PREFIX.length), U8A_WRAP_PREFIX) &&\n u8aEq(value.subarray(value.length - U8A_WRAP_POSTFIX.length), U8A_WRAP_POSTFIX)\n\n/** Wraps bytes with `<Bytes>...</Bytes>` for raw-message signing, unless already wrapped */\nexport const u8aWrapBytes = (value: string | Uint8Array): Uint8Array => {\n const u8a = u8aToU8a(value)\n return u8aIsWrapped(u8a) ? u8a : u8aConcat(U8A_WRAP_PREFIX, u8a, U8A_WRAP_POSTFIX)\n}\n\nexport const u8aUnwrapBytes = (value: string | Uint8Array): Uint8Array => {\n const u8a = u8aToU8a(value)\n return u8aIsWrapped(u8a)\n ? u8a.subarray(U8A_WRAP_PREFIX.length, u8a.length - U8A_WRAP_POSTFIX.length)\n : u8a\n}\n","/**\n * Optional host-provided JS-activity hook.\n *\n * Host apps that run a JS-thread stall watchdog (e.g. talisapp's jsThreadWatchdog) can\n * install `globalThis.__recordJsActivity` to receive lightweight \"this just ran on the\n * JS thread\" markers from library code. When a stall is detected, the watchdog can then\n * attribute the blocked time to whatever activity was recorded during the stall window.\n *\n * When no hook is installed this is a no-op (a single property read), so library code\n * can call it unconditionally from hot paths.\n */\n\ntype RecordJsActivity = (label: string, durationMs?: number) => void\n\nexport const reportJsActivity = (label: string, durationMs?: number): void => {\n const record = (globalThis as { __recordJsActivity?: RecordJsActivity }).__recordJsActivity\n if (record) record(label, durationMs)\n}\n","/**\n * Returns a promise that resolves in a NEW macrotask, letting the host event loop\n * (react-native touch handling, browser rendering, node timers) run before continuing.\n *\n * Uses `MessageChannel` where available (browser/node — avoids the setTimeout nested-call\n * clamp of ~4ms, which matters when yielding every ~10ms), and falls back to `setTimeout(0)`.\n *\n * The fallback is required on react-native (Hermes), where `MessageChannel` does not exist.\n * NOTE: `setImmediate` must NOT be used for this on react-native — it flushes within the\n * same JS execution batch and does not return control to the native event loop.\n */\n// minimal structural typing: the MessagePort type differs between DOM and node type\n// libs (e.g. node's lacks `onmessage`), but both runtimes implement this shape\ntype MinimalMessagePort = {\n onmessage: ((event: unknown) => void) | null\n postMessage: (value: unknown) => void\n close: () => void\n}\n\nexport const yieldToEventLoop = (): Promise<void> => {\n if (typeof MessageChannel !== \"undefined\") {\n return new Promise((resolve) => {\n const channel = new MessageChannel()\n const port1 = channel.port1 as unknown as MinimalMessagePort\n const port2 = channel.port2 as unknown as MinimalMessagePort\n port1.onmessage = () => {\n // close both ports so the channel doesn't keep a node process alive\n port1.close()\n port2.close()\n resolve()\n }\n port2.postMessage(null)\n })\n }\n\n return new Promise((resolve) => setTimeout(resolve, 0))\n}\n","import { reportJsActivity } from \"./jsActivityHook\"\nimport { yieldToEventLoop } from \"./yieldToEventLoop\"\n\n/**\n * Default CPU budget for a single synchronous slice of chunked work.\n * ~50-60% of a 60fps frame, leaving the rest for the host (user interactions, rendering).\n */\nexport const DEFAULT_TIME_SLICE_BUDGET_MS = 10\n\nexport type TimeSlicerOptions = {\n /** max synchronous work per slice, in milliseconds (default: DEFAULT_TIME_SLICE_BUDGET_MS) */\n budgetMs?: number\n /** aborting this signal makes the slicer throw an AbortError at its next check point */\n signal?: AbortSignal\n /** injectable clock for tests; defaults to performance.now, falling back to Date.now */\n now?: () => number\n /** identifies this slicer in host JS-activity reports (see jsActivityHook) */\n label?: string\n}\n\nexport type TimeSlicer = {\n readonly signal?: AbortSignal\n /** true when the current slice has consumed its budget */\n shouldYield(): boolean\n /** unconditionally macrotask-yield, reset the slice, then throw if aborted */\n yield(): Promise<void>\n /**\n * Call between work items. Returns `undefined` (no promise, no microtask) while within\n * budget, so hot loops stay cheap:\n *\n * ```ts\n * const yielded = slicer.yieldIfNeeded()\n * if (yielded) await yielded\n * ```\n *\n * Throws synchronously if the signal is aborted.\n */\n yieldIfNeeded(): Promise<void> | undefined\n /** throws an Error with name \"AbortError\" (recognized by isAbortError) if the signal is aborted */\n throwIfAborted(): void\n}\n\n/**\n * Creates an AbortError-style error without relying on DOMException (not available on Hermes).\n * Recognized by `isAbortError` from this package.\n */\nexport const newAbortError = (): Error =>\n Object.assign(new Error(\"Aborted\"), { name: \"AbortError\" })\n\nconst defaultNow: () => number =\n typeof performance !== \"undefined\" ? () => performance.now() : () => Date.now()\n\n/**\n * Tracks a time budget for cooperative scheduling: run synchronous work until the budget\n * for the current slice is exhausted, then yield the thread back to the host event loop\n * before continuing.\n *\n * A single slicer can be shared across multiple phases of work so the budget spans them.\n */\nexport const createTimeSlicer = ({\n budgetMs = DEFAULT_TIME_SLICE_BUDGET_MS,\n signal,\n now = defaultNow,\n label,\n}: TimeSlicerOptions = {}): TimeSlicer => {\n let sliceStart = now()\n\n const throwIfAborted = () => {\n if (signal?.aborted) throw newAbortError()\n }\n\n const shouldYield = () => now() - sliceStart >= budgetMs\n\n const doYield = async () => {\n // a slice that ran way past its budget means a SINGLE work item blocked the thread\n // (yield checks only happen between items) — report it so host stall watchdogs can\n // attribute the block to this pipeline instead of showing an anonymous stall\n const elapsed = now() - sliceStart\n if (elapsed >= budgetMs * 3)\n reportJsActivity(`timeSlicer over-budget slice${label ? ` (${label})` : \"\"}`, elapsed)\n\n await yieldToEventLoop()\n sliceStart = now()\n throwIfAborted()\n }\n\n return {\n signal,\n shouldYield,\n yield: doYield,\n yieldIfNeeded: () => {\n throwIfAborted()\n return shouldYield() ? doYield() : undefined\n },\n throwIfAborted,\n }\n}\n","import { isEqual } from \"lodash-es\"\n\nimport { createTimeSlicer, type TimeSlicer } from \"./timeSlicer\"\n\nexport type ChunkedOptions = {\n /** max synchronous work per slice, in milliseconds (ignored when `slicer` is provided) */\n budgetMs?: number\n /** abort in-flight work; the returned promise rejects with an AbortError (ignored when `slicer` is provided) */\n signal?: AbortSignal\n /** share one slicer across multiple phases of work so the time budget spans them */\n slicer?: TimeSlicer\n /** identifies this work in host JS-activity reports (ignored when `slicer` is provided) */\n label?: string\n}\n\nconst getSlicer = (options?: ChunkedOptions): TimeSlicer =>\n options?.slicer ??\n createTimeSlicer({ budgetMs: options?.budgetMs, signal: options?.signal, label: options?.label })\n\n/**\n * `Array.prototype.forEach`, chunked: iterates synchronously until the time budget is\n * exhausted, then yields the thread to the host event loop before continuing.\n *\n * Errors thrown by `fn` reject the promise; aborting rejects with an AbortError at the\n * next between-items check point.\n */\nexport const forEachWithYield = async <T>(\n items: readonly T[],\n fn: (item: T, index: number) => void,\n options?: ChunkedOptions\n): Promise<void> => {\n const slicer = getSlicer(options)\n for (let i = 0; i < items.length; i++) {\n const yielded = slicer.yieldIfNeeded()\n if (yielded) await yielded\n fn(items[i], i)\n }\n // final check point: without it, a loop whose LAST item blows the budget (including\n // the common single-item case, e.g. one storage query decoding a huge map) would\n // neither report over-budget work to the host watchdog nor honor a late abort\n const yielded = slicer.yieldIfNeeded()\n if (yielded) await yielded\n}\n\n/** `Array.prototype.map`, chunked (see forEachWithYield for semantics) */\nexport const mapWithYield = async <T, R>(\n items: readonly T[],\n fn: (item: T, index: number) => R,\n options?: ChunkedOptions\n): Promise<R[]> => {\n const results: R[] = new Array(items.length)\n await forEachWithYield(items, (item, i) => (results[i] = fn(item, i)), options)\n return results\n}\n\n/** lodash `keyBy`, chunked (see forEachWithYield for semantics) */\nexport const keyByWithYield = async <T>(\n items: readonly T[],\n keyFn: (item: T, index: number) => string,\n options?: ChunkedOptions\n): Promise<Record<string, T>> => {\n const result: Record<string, T> = {}\n await forEachWithYield(items, (item, i) => (result[keyFn(item, i)] = item), options)\n return result\n}\n\n/**\n * Chunked equivalent of lodash `isEqual(a, b)` for arrays: `a === b` fast path, length\n * check, then per-item `a[i] === b[i] || isItemEqual(a[i], b[i])` within the time budget.\n * The result is identical to `isEqual(a, b)`.\n */\nexport const arrayItemsEqualWithYield = async <T>(\n a: readonly T[] | undefined,\n b: readonly T[] | undefined,\n options?: ChunkedOptions & { isItemEqual?: (x: T, y: T) => boolean }\n): Promise<boolean> => {\n if (a === b) return true\n if (!a || !b) return false\n if (a.length !== b.length) return false\n\n const isItemEqual = options?.isItemEqual ?? isEqual\n const slicer = getSlicer(options)\n for (let i = 0; i < a.length; i++) {\n const yielded = slicer.yieldIfNeeded()\n if (yielded) await yielded\n if (a[i] !== b[i] && !isItemEqual(a[i], b[i])) return false\n }\n return true\n}\n","/**\n * In TypeScript, a deferred promise refers to a pattern that involves creating a promise that can be\n * resolved or rejected at a later point in time, typically by code outside of the current function scope.\n *\n * This pattern is often used when dealing with asynchronous operations that involve multiple steps or when\n * the result of an operation cannot be immediately determined.\n */\nexport function Deferred<T>(): {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (reason?: unknown) => void\n isPending: () => boolean\n isResolved: () => boolean\n isRejected: () => boolean\n} {\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (reason?: unknown) => void\n\n let isPending = true\n let isResolved = false\n let isRejected = false\n\n const promise = new Promise<T>((innerResolve, innerReject) => {\n resolve = (value) => {\n isPending = false\n isResolved = true\n innerResolve(value)\n }\n reject = (reason) => {\n isPending = false\n isRejected = true\n innerReject(reason)\n }\n })\n\n return {\n promise,\n resolve,\n reject,\n isPending: () => isPending,\n isResolved: () => isResolved,\n isRejected: () => isRejected,\n }\n}\n","import { concat, debounceTime, type Observable, type OperatorFunction, skip, take } from \"rxjs\"\n\n/**\n * An rxjs operator which:\n *\n * 1. Emits the first value it receives from the source observable, then:\n * 2. Debounces any future values by `timeout` ms.\n */\nexport const firstThenDebounce =\n <T>(timeout: number): OperatorFunction<T, T> =>\n (source: Observable<T>) =>\n concat(source.pipe(take(1)), source.pipe(skip(1)).pipe(debounceTime(timeout)))\n","import BigNumber from \"./configureBigNumber\"\n\nconst MIN_DIGITS = 4 // less truncates more than what compact formating is\nexport const MAX_DECIMALS_FORMAT = 12\n\n/**\n * Custom decimal number formatting for Talisman\n * note that the NumberFormat().format() call is the ressource heavy part, it's not worth trying to optimize other parts\n * @param num input number\n * @param digits number of significant digits to display\n * @param locale locale used to format the number\n * @param options formatting options\n * @returns the formatted value\n */\nexport const formatDecimals = (\n num?: string | number | null | BigNumber,\n digits = MIN_DIGITS,\n options: Partial<Intl.NumberFormatOptions> = {},\n locale = \"en-US\"\n): string => {\n if (num === null || num === undefined) return \"\"\n if (digits < MIN_DIGITS) digits = MIN_DIGITS\n\n const value = new BigNumber(num)\n // very small numbers should display \"< 0.0001\"\n const minDisplayVal = 1 / 10 ** digits\n\n if (value.gt(0) && value.lt(minDisplayVal)) return `< ${formatDecimals(minDisplayVal)}`\n\n // count digits\n const flooredValue = value.integerValue()\n const intDigits = flooredValue.isEqualTo(0) ? 0 : flooredValue.toString().length\n\n // we never want to display a rounded up value\n // to prevent JS default rounding, we will remove/truncate insignificant digits ourselves before formatting\n let truncatedValue = value\n //remove insignificant fraction digits\n const excessFractionDigitsPow10 = new BigNumber(10).pow(\n digits > intDigits ? digits - intDigits : 0\n )\n\n truncatedValue = truncatedValue\n .multipliedBy(excessFractionDigitsPow10)\n .integerValue()\n .dividedBy(excessFractionDigitsPow10)\n\n //remove insignificant integer digits\n const excessIntegerDigits = new BigNumber(intDigits > digits ? intDigits - digits : 0)\n const excessIntegerDigitsPow10 = new BigNumber(10).pow(excessIntegerDigits)\n if (excessIntegerDigits.gt(0))\n truncatedValue = truncatedValue\n .dividedBy(excessIntegerDigitsPow10)\n .integerValue()\n .multipliedBy(excessIntegerDigitsPow10)\n\n // format\n\n return Intl.NumberFormat(locale, {\n // compact notation (K, M, B) if above 9999\n notation: truncatedValue.abs().gt(9999) ? \"compact\" : \"standard\",\n // NOTE: possible values are from `0` to `21`\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#maximumsignificantdigits\n maximumSignificantDigits: Math.max(1, Math.min(digits + (truncatedValue.lt(1) ? 1 : 0), 21)),\n ...options,\n }).format(truncatedValue.toNumber())\n}\n","export const formatPrice = (price: number, currency: string, compact: boolean) => {\n return Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency,\n currencyDisplay: currency === \"usd\" ? \"narrowSymbol\" : \"symbol\",\n minimumSignificantDigits: 3,\n maximumSignificantDigits: compact ? (price < 1 ? 3 : 4) : undefined,\n roundingPriority: compact ? \"auto\" : \"morePrecision\",\n notation: compact ? \"compact\" : \"standard\",\n }).format(price)\n}\n","import { catchError, from, map, type Observable, of, startWith, switchMap, timer } from \"rxjs\"\n\n// Designed to be serializable as it can be sent to the frontend\ntype LoadableError = {\n name: string // can be used to identify the error type\n message: string // display message\n}\n\nexport type Loadable<T = unknown> =\n | { status: \"loading\"; data?: T; error?: undefined }\n | { status: \"success\"; data: T; error?: undefined }\n | { status: \"error\"; data?: T; error: LoadableError }\n\nexport type LoadableStatus = Loadable[\"status\"]\n\nexport type LoadableOptions = {\n getError?: (error: unknown) => LoadableError\n refreshInterval?: number\n}\n\nexport function getLoadable$<T>(\n factory: () => Promise<T>,\n options: LoadableOptions = {}\n): Observable<Loadable<T>> {\n const { getError, refreshInterval } = options\n\n const createLoadableStream = () =>\n from(factory()).pipe(\n map(\n (data): Loadable<T> => ({\n status: \"success\",\n data,\n })\n ),\n catchError((error) =>\n of<Loadable<T>>({\n status: \"error\",\n error: getError ? getError(error) : getGenericError(error),\n })\n )\n )\n\n const source$ = refreshInterval\n ? timer(0, refreshInterval).pipe(switchMap(() => createLoadableStream()))\n : createLoadableStream()\n\n return source$.pipe(\n startWith<Loadable<T>>({\n status: \"loading\",\n } as Loadable<T>)\n )\n}\n\nconst getGenericError = (error: unknown): LoadableError => ({\n name: \"Error\",\n message: getGenericErrorMessage(error),\n})\n\nconst getGenericErrorMessage = (error: unknown): string => {\n if (typeof error === \"string\") {\n return error\n } else if (error instanceof Error) {\n return error.message\n } else if (error && typeof error === \"object\" && \"message\" in error) {\n return (error as { message: string }).message\n }\n return String(error) || \"Unknown error\"\n}\n","import { Observable, shareReplay } from \"rxjs\"\n\ntype CacheEntry = {\n observable: unknown\n refCount: number\n cleanupTimer: ReturnType<typeof setTimeout> | null\n}\n\nconst CACHE = new Map<string, CacheEntry>()\n\n/**\n * How long an entry survives with no subscribers before being dropped. Long enough\n * for quick unmount/remount cycles (navigation, react-rxjs Subscribe boundaries) to\n * reuse the entry, short enough that abandoned scopes (e.g. superseded balance\n * subscriptions after networks/accounts change) don't accumulate forever.\n */\nconst CLEANUP_DELAY_MS = 60_000\n\n/**\n * When using react-rxjs hooks and state observables, the options are used as weak map keys.\n * This means that if the options object is recreated on each render, the observable will be recreated as well.\n * This utility function allows you to create a shared observable based on a namespace and arguments that, so react-rxjs can reuse the same observables\n *\n * Entries are reference-counted: an entry with no subscribers for CLEANUP_DELAY_MS is\n * removed from the cache (its shareReplay source is already torn down by refCount at\n * that point — only the replay buffer and the entry itself are dropped).\n *\n * @param namespace\n * @param args\n * @param createObservable\n * @param serializer\n * @returns\n */\nexport const getSharedObservable = <Args, Output, ObsOutput = Observable<Output>>(\n namespace: string,\n args: Args,\n createObservable: (args: Args) => ObsOutput,\n serializer = (args: Args): string => JSON.stringify(args)\n): ObsOutput => {\n const cacheKey = `${namespace}:${serializer(args)}`\n\n const cached = CACHE.get(cacheKey)\n if (cached) return cached.observable as ObsOutput\n\n const obs = createObservable(args) as Observable<unknown>\n const sharedObs = obs.pipe(shareReplay({ bufferSize: 1, refCount: true }))\n\n const scheduleCleanup = (entry: CacheEntry) => {\n if (entry.cleanupTimer) clearTimeout(entry.cleanupTimer)\n entry.cleanupTimer = setTimeout(() => {\n if (entry.refCount === 0 && CACHE.get(cacheKey) === entry) CACHE.delete(cacheKey)\n }, CLEANUP_DELAY_MS)\n }\n\n const entry: CacheEntry = {\n observable: null,\n refCount: 0,\n cleanupTimer: null,\n }\n\n entry.observable = new Observable((subscriber) => {\n entry.refCount++\n if (entry.cleanupTimer) {\n clearTimeout(entry.cleanupTimer)\n entry.cleanupTimer = null\n }\n\n const subscription = sharedObs.subscribe(subscriber)\n\n return () => {\n subscription.unsubscribe()\n entry.refCount--\n if (entry.refCount === 0) scheduleCleanup(entry)\n }\n })\n\n CACHE.set(cacheKey, entry)\n // entries requested but never subscribed to must not linger either\n scheduleCleanup(entry)\n\n return entry.observable as ObsOutput\n}\n","import { isEqual } from \"lodash-es\"\nimport { BehaviorSubject, distinctUntilChanged, Observable, shareReplay } from \"rxjs\"\n\nimport { getSharedObservable } from \"./getSharedObservable\"\n\nexport type QueryStatus = \"loading\" | \"loaded\" | \"error\"\n\nexport type QueryResult<\n T,\n S extends QueryStatus = \"loading\" | \"loaded\" | \"error\",\n> = S extends \"loading\"\n ? { status: \"loading\"; data: T | undefined; error: undefined }\n : S extends \"loaded\"\n ? { status: \"loaded\"; data: T; error: undefined }\n : { status: \"error\"; data: undefined; error: unknown }\n\ntype QueryOptions<Output, Args> = {\n namespace: string\n args: Args\n queryFn: (args: Args, signal: AbortSignal) => Promise<Output>\n defaultValue?: Output\n refreshInterval?: number\n serializer?: (args: Args) => string\n}\n\n/**\n * Creates a shared observable for executing queries with caching, loading states, and automatic refresh capabilities.\n *\n * @example\n * ```typescript\n * const userQuery$ = getQuery$({\n * namespace: 'users',\n * args: { userId: 123 },\n * queryFn: async ({ userId }) => fetchUser(userId),\n * defaultValue: null,\n * refreshInterval: 30000\n * });\n *\n * userQuery$.subscribe(result => {\n * if (result.status === 'loaded') {\n * console.log(result.data);\n * }\n * });\n * ```\n *\n * @deprecated use getLoadableQuery$ instead\n */\nexport const getQuery$ = <Output, Args>({\n namespace,\n args,\n queryFn,\n defaultValue,\n refreshInterval,\n serializer = (args) => JSON.stringify(args),\n}: QueryOptions<Output, Args>): Observable<QueryResult<Output>> => {\n return getSharedObservable(\n namespace,\n args,\n () =>\n new Observable<QueryResult<Output>>((subscriber) => {\n const controller = new AbortController()\n\n const result = new BehaviorSubject<QueryResult<Output>>({\n status: \"loading\",\n data: defaultValue,\n error: undefined,\n })\n\n // result subscription\n const sub = result\n .pipe(distinctUntilChanged<QueryResult<Output>>(isEqual))\n .subscribe(subscriber)\n\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n let timeout: any = null\n\n // fetch result subscription\n const run = () => {\n if (controller.signal.aborted) return\n\n queryFn(args, controller.signal)\n .then((data) => {\n if (controller.signal.aborted) return\n result.next({ status: \"loaded\", data, error: undefined })\n })\n .catch((error) => {\n if (controller.signal.aborted) return\n result.next({ status: \"error\", data: undefined, error })\n })\n .finally(() => {\n if (controller.signal.aborted) return\n if (refreshInterval) timeout = setTimeout(run, refreshInterval)\n })\n }\n\n run()\n\n return () => {\n sub.unsubscribe()\n if (timeout) clearTimeout(timeout)\n controller.abort(new Error(\"getQuery$ unsubscribed\"))\n }\n }).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n serializer\n )\n}\n","import { map, type Observable, startWith } from \"rxjs\"\n\nimport type { Loadable } from \"./getLoadable\"\nimport { getQuery$, type QueryResult } from \"./getQuery\"\n\nexport type GetLoadableQueryParams<TArgs extends unknown[], TResult> = {\n namespace: string\n args: TArgs\n queryFn: (args: TArgs, signal: AbortSignal) => Promise<TResult>\n refreshInterval?: number\n defaultValue?: TResult\n}\n\n/**\n * Thin wrapper around getQuery$ that returns Loadable<T> and optionally\n * primes the stream with a loading state using the provided default value.\n *\n * TODO: consolidate with getQuery$\n */\nexport const getLoadableQuery$ = <TArgs extends unknown[], TResult>(\n params: GetLoadableQueryParams<TArgs, TResult>\n): Observable<Loadable<TResult>> => {\n const initial =\n params.defaultValue === undefined\n ? []\n : ([{ status: \"loading\", data: params.defaultValue }] as Loadable<TResult>[])\n\n return getQuery$(params).pipe(\n map((val: QueryResult<TResult>): Loadable<TResult> => {\n switch (val.status) {\n case \"loading\":\n return { status: \"loading\", data: val.data }\n case \"loaded\":\n return { status: \"success\", data: val.data }\n case \"error\": {\n const err = val.error as Error | undefined\n return {\n status: \"error\",\n error: {\n name: err?.name ?? \"QueryError\",\n message: err?.message ?? \"Failed to execute query\",\n },\n }\n }\n }\n }),\n startWith(...initial)\n )\n}\n","// biome-ignore lint/suspicious/noShadowRestrictedNames: legacy\nexport function hasOwnProperty<X, Y extends PropertyKey>(\n obj: X,\n prop: Y\n): obj is X & Record<Y, unknown> {\n if (typeof obj !== \"object\") return false\n if (obj === null) return false\n return prop in obj\n}\n","export const isAbortError = (error: unknown): boolean => {\n return error instanceof Error && error.name === \"AbortError\"\n}\n","export function isArrayOf<T, P extends Array<unknown>>(\n array: unknown[],\n func: new (...args: P) => T\n): array is T[] {\n if (array.length > 0 && array[0] instanceof func) return true\n return false\n}\n","export const isAscii = (str: string): boolean => {\n return [...str].every((char) => char.charCodeAt(0) <= 127)\n}\n","export const isBigInt = (value: unknown): value is bigint => typeof value === \"bigint\"\n","export const isBooleanTrue = <T>(x: T | null | undefined): x is T => !!x\n","/**\n * Robust replacement for `error instanceof SomeErrorClass` when the class comes from a\n * package that gets bundled into multiple chunks/contexts (e.g. viem, @solana/web3.js).\n *\n * `instanceof` returns `false` whenever the error originates from a different bundled copy of\n * the module than the imported class reference — which silently broke Solana transfers (see\n * apps/extension/src/__tests__/no-instanceof-bundled-class.test.ts). An error's `.name` is\n * stable across copies, *provided the class sets it explicitly* (viem does:\n * `super({ name: 'ContractFunctionExecutionError' })`). For classes that don't set `.name`,\n * duck-type the shape instead.\n */\nexport const isErrorOfName = (error: unknown, ...names: string[]): boolean =>\n error instanceof Error && names.includes(error.name)\n","/**\n * WARNING: This function only checks against null or undefined, it does not coerce the value.\n * ie: false and 0 are considered not nil\n * Use isTruthy instead for a regular coercion check.\n *\n * @param value\n * @returns whether the value is neither null nor undefined\n */\nexport const isNotNil = <T>(value: T | null | undefined): value is T =>\n value !== null && value !== undefined\n","// biome-ignore lint/suspicious/noExplicitAny: legacy\nexport const isPromise = <T = any>(value: any): value is Promise<T> =>\n !!value &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof value.then === \"function\"\n","import { Subject } from \"rxjs\"\n\n/**\n * Tests to see if an object is an RxJS {@link Subject}.\n */\nexport function isSubject<T>(object?: Subject<T> | object): object is Subject<T> {\n if (!object) return false\n if (object instanceof Subject) return true\n return (\n \"asObservable\" in object &&\n isFn(object.asObservable) &&\n \"complete\" in object &&\n isFn(object.complete) &&\n \"error\" in object &&\n isFn(object.error) &&\n \"forEach\" in object &&\n isFn(object.forEach) &&\n \"next\" in object &&\n isFn(object.next) &&\n \"pipe\" in object &&\n isFn(object.pipe) &&\n \"subscribe\" in object &&\n isFn(object.subscribe) &&\n \"unsubscribe\" in object &&\n isFn(object.unsubscribe) &&\n \"closed\" in object &&\n isBool(object.closed) &&\n \"observed\" in object &&\n isBool(object.observed)\n )\n}\n\n/**\n * Returns `true` if `value` is a function.\n */\nfunction isFn(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === \"function\"\n}\n\n/**\n * Returns `true` if `value` is a boolean.\n */\nfunction isBool(value: unknown): value is boolean {\n return typeof value === \"boolean\"\n}\n","export const isTruthy = <T>(value: T | null | undefined): value is T => Boolean(value)\n","import type { OperatorFunction } from \"rxjs\"\nimport { type Observable, shareReplay, tap } from \"rxjs\"\n\n/**\n * An RxJS operator that keeps the source observable alive for a specified duration\n * after all subscribers have unsubscribed. This prevents expensive re-subscriptions\n * when subscribers come and go frequently.\n *\n * @param keepAliveMs - Duration in milliseconds to keep the source alive after last unsubscription\n * @returns MonoTypeOperatorFunction that can be used in pipe()\n *\n * @example\n * ```typescript\n * const data$ = expensive_api_call$.pipe(\n * keepAlive(3000) // Keep alive for 3 seconds\n * );\n * ```\n */\nexport const keepAlive = <T>(timeout: number): OperatorFunction<T, T> => {\n let release: ReturnType<typeof keepSourceSubscribed> | null\n\n return (source: Observable<T>) =>\n source.pipe(\n tap({\n subscribe: () => {\n release = keepSourceSubscribed(source, timeout)\n },\n unsubscribe: () => {\n release?.()\n },\n }),\n shareReplay({ refCount: true, bufferSize: 1 })\n )\n}\n\nconst keepSourceSubscribed = (observable: Observable<unknown>, ms: number) => {\n const sub = observable.subscribe()\n return () => setTimeout(() => sub.unsubscribe(), ms)\n}\n","/**\n * A Map with a maximum size and least-recently-used eviction.\n *\n * Reads refresh recency; when an insert would exceed `maxSize`, the\n * least-recently-used entry is evicted. Intended for long-lived in-memory\n * caches that would otherwise grow without bound.\n */\nexport class LruMap<K, V> {\n #map = new Map<K, V>()\n #maxSize: number\n\n constructor(maxSize: number) {\n if (maxSize < 1) throw new Error(\"LruMap maxSize must be >= 1\")\n this.#maxSize = maxSize\n }\n\n get(key: K): V | undefined {\n if (!this.#map.has(key)) return undefined\n const value = this.#map.get(key) as V\n // refresh recency: Map preserves insertion order, oldest entry is first\n this.#map.delete(key)\n this.#map.set(key, value)\n return value\n }\n\n set(key: K, value: V): this {\n if (this.#map.has(key)) this.#map.delete(key)\n else if (this.#map.size >= this.#maxSize) {\n const oldest = this.#map.keys().next()\n if (!oldest.done) this.#map.delete(oldest.value)\n }\n this.#map.set(key, value)\n return this\n }\n\n has(key: K): boolean {\n return this.#map.has(key)\n }\n\n delete(key: K): boolean {\n return this.#map.delete(key)\n }\n\n clear(): void {\n this.#map.clear()\n }\n\n get size(): number {\n return this.#map.size\n }\n}\n","import type { OperatorFunction } from \"rxjs\"\nimport { concatMap, Observable, switchMap } from \"rxjs\"\n\nimport { isAbortError } from \"./isAbortError\"\nimport { createTimeSlicer, type TimeSlicer } from \"./timeSlicer\"\n\nexport type ChunkedProjectContext = {\n /** thread the slicer through chunked helpers (mapWithYield etc.) so the budget spans them */\n slicer: TimeSlicer\n /** aborted when the work is cancelled (new upstream value or unsubscription) */\n signal: AbortSignal\n}\n\nconst runChunkedProject = <T, R>(\n project: (value: T, ctx: ChunkedProjectContext, index: number) => Promise<R>,\n options: { budgetMs?: number; label?: string } | undefined,\n value: T,\n index: number\n): Observable<R> =>\n new Observable<R>((subscriber) => {\n const controller = new AbortController()\n const slicer = createTimeSlicer({\n budgetMs: options?.budgetMs,\n signal: controller.signal,\n label: options?.label,\n })\n\n project(value, { slicer, signal: controller.signal }, index).then(\n (result) => {\n if (!controller.signal.aborted) subscriber.next(result)\n subscriber.complete()\n },\n (error) => {\n // cancellation is not an error: never emit late, never error the stream\n if (isAbortError(error)) subscriber.complete()\n else subscriber.error(error)\n }\n )\n\n return () => controller.abort()\n })\n\n/**\n * `switchMap` for time-sliced (chunked) async work — latest-wins: a new upstream value or\n * an unsubscription aborts the in-flight `project` via `ctx.signal` / the shared slicer,\n * so cancelled work stops burning CPU at its next yield check point and its result is\n * never emitted.\n *\n * Non-abort errors thrown by `project` error the stream (same as a throwing sync `map`).\n *\n * Note: pipelines using this operator already emit asynchronously (macrotask), so adding\n * `observeOn(asyncScheduler)` downstream is redundant and only adds latency.\n */\nexport const switchMapChunked = <T, R>(\n project: (value: T, ctx: ChunkedProjectContext, index: number) => Promise<R>,\n options?: { budgetMs?: number; label?: string }\n): OperatorFunction<T, R> =>\n switchMap((value: T, index: number) => runChunkedProject(project, options, value, index))\n\n/**\n * `concatMap` variant of switchMapChunked — ordered: upstream values queue and are\n * processed one at a time; a new value does NOT cancel in-flight work (unsubscription\n * still aborts it).\n */\nexport const concatMapChunked = <T, R>(\n project: (value: T, ctx: ChunkedProjectContext, index: number) => Promise<R>,\n options?: { budgetMs?: number; label?: string }\n): OperatorFunction<T, R> =>\n concatMap((value: T, index: number) => runChunkedProject(project, options, value, index))\n","import BigNumber from \"./configureBigNumber\"\n\nexport function planckToTokens(planck: string, tokenDecimals: number): string\nexport function planckToTokens(planck: string, tokenDecimals?: number): string | undefined\nexport function planckToTokens(planck?: string, tokenDecimals?: number): string | undefined\nexport function planckToTokens(planck?: string, tokenDecimals?: number): string | undefined {\n if (typeof planck !== \"string\" || typeof tokenDecimals !== \"number\") return\n\n const base = 10\n const exponent = -1 * tokenDecimals\n const multiplier = base ** exponent\n\n return new BigNumber(planck).multipliedBy(multiplier).toString(10)\n}\n","import { ReplaySubject } from \"rxjs\"\n\nimport { isPromise } from \"./isPromise\"\n\n/**\n * Turns a value into a {@link ReplaySubject} of size 1.\n *\n * If the value is already a {@link ReplaySubject}, it will be returned as-is.\n *\n * If the value is a {@link Promise}, it will be awaited,\n * and the awaited value will be published into the {@link ReplaySubject} when it becomes available.\n *\n * For any other type of value, it will be immediately published into the {@link ReplaySubject}.\n */\nexport const replaySubjectFrom = <T>(\n initialValue: T | Promise<T> | ReplaySubject<T>\n): ReplaySubject<T> => {\n if (initialValue instanceof ReplaySubject) return initialValue\n\n const subject = new ReplaySubject<T>(1)\n\n // if initialValue is a promise, await it and then call `subject.next()` with the awaited value\n if (isPromise(initialValue)) {\n initialValue.then(\n (value) => subject.next(value),\n (error) => subject.error(error)\n )\n return subject\n }\n\n // if initialValue is not a promise, immediately call `subject.next()` with the value\n subject.next(initialValue)\n return subject\n}\n","export const sleep = (ms: number) =>\n new Promise<void>((resolve) => {\n if (process.env.NODE_ENV === \"test\") resolve()\n else setTimeout(resolve, ms)\n })\n","import type { Observable, Subject } from \"rxjs\"\n\n/**\n * Takes a subject and splits it into two parts:\n *\n * 1. A function to submit new values into the subject.\n * 2. An observable for subscribing to new values from the subject.\n *\n * This can be helpful when, to avoid bugs, you want to expose only one\n * of these parts to external code and keep the other part private.\n */\nexport function splitSubject<T>(subject: Subject<T>) {\n const next = (value: T) => subject.next(value)\n const observable: Observable<T> = subject.asObservable()\n\n return [next, observable] as const\n}\n","/**\n * @name stripHexPrefix\n * @description Removes a leading `0x` prefix from a string, if present.\n * @param {string} str - string to strip\n * @returns {string} - the string without its leading `0x` prefix\n * @example\n * stripHexPrefix(\"0x1234\") // \"1234\"\n * stripHexPrefix(\"1234\") // \"1234\"\n **/\nexport const stripHexPrefix = (str: string): string => (str.startsWith(\"0x\") ? str.slice(2) : str)\n","export const throwAfter = (ms: number, reason: string) =>\n new Promise<never>((_, reject) => setTimeout(() => reject(new Error(reason)), ms))\n","import BigNumber from \"./configureBigNumber\"\n\nexport function tokensToPlanck(tokens: string, tokenDecimals: number): string\nexport function tokensToPlanck(tokens: string, tokenDecimals?: number): string | undefined\nexport function tokensToPlanck(tokens?: string, tokenDecimals?: number): string | undefined\nexport function tokensToPlanck(tokens?: string, tokenDecimals?: number): string | undefined {\n if (typeof tokens !== \"string\" || typeof tokenDecimals !== \"number\") return\n\n const base = 10\n const exponent = tokenDecimals\n const multiplier = base ** exponent\n\n return new BigNumber(tokens).multipliedBy(multiplier).toString(10)\n}\n","import { type ChunkedOptions, forEachWithYield } from \"./chunkedArray\"\n\nexport type ItemParseResult<T, E> = { success: true; data: T } | { success: false; error: E }\n\nexport type ArrayValidationResult<T, E> =\n | { success: true; data: T[] }\n | { success: false; errors: { index: number; error: E }[] }\n\n/**\n * Validates every item of an array within a cooperative time budget, yielding the thread\n * to the host event loop whenever the budget for the current slice is exhausted.\n *\n * Like `z.array(schema).safeParse`, ALL items are validated and all failures collected\n * (no fail-fast) — pass e.g. `(item) => SomeSchema.safeParse(item)` as `parseItem`.\n * Zod-agnostic on purpose: this package has no zod dependency.\n */\nexport const validateArrayWithYield = async <T, E>(\n items: readonly unknown[],\n parseItem: (item: unknown, index: number) => ItemParseResult<T, E>,\n options?: ChunkedOptions\n): Promise<ArrayValidationResult<T, E>> => {\n const data: T[] = new Array(items.length)\n const errors: { index: number; error: E }[] = []\n\n await forEachWithYield(\n items,\n (item, index) => {\n const result = parseItem(item, index)\n if (result.success) data[index] = result.data\n else errors.push({ index, error: result.error })\n },\n options\n )\n\n return errors.length ? { success: false, errors } : { success: true, data }\n}\n","/**\n * @name validateHexString\n * @description Checks if a string is a hex string. Required to account for type differences between different polkadot libraries\n * @param {string} str - string to check\n * @returns {`0x${string}`} - boolean\n * @example\n * validateHexString(\"0x1234\") // \"0x1234\"\n * validateHexString(\"1234\") // Error: Expected a hex string\n * validateHexString(1234) // Error: Expected a string\n **/\nexport const validateHexString = (str: string): `0x${string}` => {\n if (typeof str !== \"string\") {\n throw new Error(\"Expected a string\")\n }\n\n if (str.startsWith(\"0x\")) {\n return str as `0x${string}`\n }\n throw new Error(\"Expected a hex string\")\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@talismn/util",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"author": "Talisman",
|
|
5
5
|
"homepage": "https://talisman.xyz",
|
|
6
|
-
"license": "
|
|
6
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
7
7
|
"publishConfig": {
|
|
8
8
|
"access": "public"
|
|
9
9
|
},
|
|
@@ -28,12 +28,9 @@
|
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/lodash-es": "4.17.12",
|
|
30
30
|
"@types/node": "^24.5.1",
|
|
31
|
-
"typescript": "^
|
|
31
|
+
"typescript": "^7.0.2",
|
|
32
32
|
"@talismn/tsconfig": "0.0.4"
|
|
33
33
|
},
|
|
34
|
-
"peerDependencies": {
|
|
35
|
-
"rxjs": ">= 7.8.1"
|
|
36
|
-
},
|
|
37
34
|
"types": "./dist/index.d.ts",
|
|
38
35
|
"exports": {
|
|
39
36
|
".": {
|
|
@@ -51,7 +48,7 @@
|
|
|
51
48
|
"scripts": {
|
|
52
49
|
"test": "vitest run",
|
|
53
50
|
"clean": "rm -rf dist .turbo node_modules",
|
|
54
|
-
"build": "
|
|
51
|
+
"build": "tsdown -l error",
|
|
55
52
|
"typecheck": "tsc --noEmit"
|
|
56
53
|
}
|
|
57
54
|
}
|