@talismn/util 0.5.1 → 0.5.4

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.
@@ -0,0 +1,25 @@
1
+ import { Observable } from "rxjs";
2
+ export type QueryStatus = "loading" | "loaded" | "error";
3
+ export type QueryResult<T, S extends QueryStatus = "loading" | "loaded" | "error"> = S extends "loading" ? {
4
+ status: "loading";
5
+ data: T | undefined;
6
+ error: undefined;
7
+ } : S extends "loaded" ? {
8
+ status: "loaded";
9
+ data: T;
10
+ error: undefined;
11
+ } : {
12
+ status: "error";
13
+ data: undefined;
14
+ error: unknown;
15
+ };
16
+ type QueryOptions<Output, Args> = {
17
+ namespace: string;
18
+ args: Args;
19
+ queryFn: (args: Args, signal: AbortSignal) => Promise<Output>;
20
+ defaultValue?: Output;
21
+ refreshInterval?: number;
22
+ serializer?: (args: Args) => string;
23
+ };
24
+ export declare const getQuery$: <Output, Args>({ namespace, args, queryFn, defaultValue, refreshInterval, serializer, }: QueryOptions<Output, Args>) => Observable<QueryResult<Output>>;
25
+ export {};
@@ -28,3 +28,4 @@ export * from "./throwAfter";
28
28
  export * from "./tokensToPlanck";
29
29
  export * from "./validateHexString";
30
30
  export * from "./getLoadable";
31
+ export * from "./getQuery";
@@ -3,6 +3,7 @@
3
3
  var tailwindMerge = require('tailwind-merge');
4
4
  var rxjs = require('rxjs');
5
5
  var BigNumber = require('bignumber.js');
6
+ var lodashEs = require('lodash-es');
6
7
 
7
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
9
 
@@ -387,6 +388,62 @@ const getGenericErrorMessage = error => {
387
388
  return String(error) || "Unknown error";
388
389
  };
389
390
 
391
+ const getQuery$ = ({
392
+ namespace,
393
+ args,
394
+ queryFn,
395
+ defaultValue,
396
+ refreshInterval,
397
+ serializer = args => JSON.stringify(args)
398
+ }) => {
399
+ return getSharedObservable(namespace, args, () => new rxjs.Observable(subscriber => {
400
+ const controller = new AbortController();
401
+ const result = new rxjs.BehaviorSubject({
402
+ status: "loading",
403
+ data: defaultValue,
404
+ error: undefined
405
+ });
406
+
407
+ // result subscription
408
+ const sub = result.pipe(rxjs.distinctUntilChanged(lodashEs.isEqual)).subscribe(subscriber);
409
+
410
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
411
+ let timeout = null;
412
+
413
+ // fetch result subscription
414
+ const run = () => {
415
+ if (controller.signal.aborted) return;
416
+ queryFn(args, controller.signal).then(data => {
417
+ if (controller.signal.aborted) return;
418
+ result.next({
419
+ status: "loaded",
420
+ data,
421
+ error: undefined
422
+ });
423
+ }).catch(error => {
424
+ if (controller.signal.aborted) return;
425
+ result.next({
426
+ status: "error",
427
+ data: undefined,
428
+ error
429
+ });
430
+ }).finally(() => {
431
+ if (controller.signal.aborted) return;
432
+ if (refreshInterval) timeout = setTimeout(run, refreshInterval);
433
+ });
434
+ };
435
+ run();
436
+ return () => {
437
+ sub.unsubscribe();
438
+ if (timeout) clearTimeout(timeout);
439
+ controller.abort(new Error("getQuery$ unsubscribed"));
440
+ };
441
+ }).pipe(rxjs.shareReplay({
442
+ refCount: true,
443
+ bufferSize: 1
444
+ })), serializer);
445
+ };
446
+
390
447
  exports.BigMath = BigMath;
391
448
  exports.Deferred = Deferred;
392
449
  exports.MAX_DECIMALS_FORMAT = MAX_DECIMALS_FORMAT;
@@ -398,6 +455,7 @@ exports.firstThenDebounce = firstThenDebounce;
398
455
  exports.formatDecimals = formatDecimals;
399
456
  exports.formatPrice = formatPrice;
400
457
  exports.getLoadable$ = getLoadable$;
458
+ exports.getQuery$ = getQuery$;
401
459
  exports.getSharedObservable = getSharedObservable;
402
460
  exports.hasOwnProperty = hasOwnProperty;
403
461
  exports.isAbortError = isAbortError;
@@ -3,6 +3,7 @@
3
3
  var tailwindMerge = require('tailwind-merge');
4
4
  var rxjs = require('rxjs');
5
5
  var BigNumber = require('bignumber.js');
6
+ var lodashEs = require('lodash-es');
6
7
 
7
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
9
 
@@ -387,6 +388,62 @@ const getGenericErrorMessage = error => {
387
388
  return String(error) || "Unknown error";
388
389
  };
389
390
 
391
+ const getQuery$ = ({
392
+ namespace,
393
+ args,
394
+ queryFn,
395
+ defaultValue,
396
+ refreshInterval,
397
+ serializer = args => JSON.stringify(args)
398
+ }) => {
399
+ return getSharedObservable(namespace, args, () => new rxjs.Observable(subscriber => {
400
+ const controller = new AbortController();
401
+ const result = new rxjs.BehaviorSubject({
402
+ status: "loading",
403
+ data: defaultValue,
404
+ error: undefined
405
+ });
406
+
407
+ // result subscription
408
+ const sub = result.pipe(rxjs.distinctUntilChanged(lodashEs.isEqual)).subscribe(subscriber);
409
+
410
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
411
+ let timeout = null;
412
+
413
+ // fetch result subscription
414
+ const run = () => {
415
+ if (controller.signal.aborted) return;
416
+ queryFn(args, controller.signal).then(data => {
417
+ if (controller.signal.aborted) return;
418
+ result.next({
419
+ status: "loaded",
420
+ data,
421
+ error: undefined
422
+ });
423
+ }).catch(error => {
424
+ if (controller.signal.aborted) return;
425
+ result.next({
426
+ status: "error",
427
+ data: undefined,
428
+ error
429
+ });
430
+ }).finally(() => {
431
+ if (controller.signal.aborted) return;
432
+ if (refreshInterval) timeout = setTimeout(run, refreshInterval);
433
+ });
434
+ };
435
+ run();
436
+ return () => {
437
+ sub.unsubscribe();
438
+ if (timeout) clearTimeout(timeout);
439
+ controller.abort(new Error("getQuery$ unsubscribed"));
440
+ };
441
+ }).pipe(rxjs.shareReplay({
442
+ refCount: true,
443
+ bufferSize: 1
444
+ })), serializer);
445
+ };
446
+
390
447
  exports.BigMath = BigMath;
391
448
  exports.Deferred = Deferred;
392
449
  exports.MAX_DECIMALS_FORMAT = MAX_DECIMALS_FORMAT;
@@ -398,6 +455,7 @@ exports.firstThenDebounce = firstThenDebounce;
398
455
  exports.formatDecimals = formatDecimals;
399
456
  exports.formatPrice = formatPrice;
400
457
  exports.getLoadable$ = getLoadable$;
458
+ exports.getQuery$ = getQuery$;
401
459
  exports.getSharedObservable = getSharedObservable;
402
460
  exports.hasOwnProperty = hasOwnProperty;
403
461
  exports.isAbortError = isAbortError;
@@ -1,6 +1,7 @@
1
1
  import { twMerge } from 'tailwind-merge';
2
- import { concat, take, skip, debounceTime, shareReplay, Subject, tap, ReplaySubject, timer, switchMap, from, startWith, map, catchError, of } from 'rxjs';
2
+ import { concat, take, skip, debounceTime, shareReplay, Subject, tap, ReplaySubject, timer, switchMap, from, startWith, map, catchError, of, Observable, BehaviorSubject, distinctUntilChanged } from 'rxjs';
3
3
  import BigNumber from 'bignumber.js';
4
+ import { isEqual } from 'lodash-es';
4
5
 
5
6
  const addTrailingSlash = url => {
6
7
  if (url.endsWith("/")) {
@@ -381,4 +382,60 @@ const getGenericErrorMessage = error => {
381
382
  return String(error) || "Unknown error";
382
383
  };
383
384
 
384
- export { BigMath, Deferred, MAX_DECIMALS_FORMAT, REGEX_HEX_STRING, addTrailingSlash, classNames, cn, firstThenDebounce, formatDecimals, formatPrice, getLoadable$, getSharedObservable, hasOwnProperty, isAbortError, isArrayOf, isAscii, isBigInt, isBooleanTrue, isHexString, isNotNil, isPromise, isSubject, isTruthy, keepAlive, planckToTokens, replaySubjectFrom, sleep, splitSubject, throwAfter, tokensToPlanck, validateHexString };
385
+ const getQuery$ = ({
386
+ namespace,
387
+ args,
388
+ queryFn,
389
+ defaultValue,
390
+ refreshInterval,
391
+ serializer = args => JSON.stringify(args)
392
+ }) => {
393
+ return getSharedObservable(namespace, args, () => new Observable(subscriber => {
394
+ const controller = new AbortController();
395
+ const result = new BehaviorSubject({
396
+ status: "loading",
397
+ data: defaultValue,
398
+ error: undefined
399
+ });
400
+
401
+ // result subscription
402
+ const sub = result.pipe(distinctUntilChanged(isEqual)).subscribe(subscriber);
403
+
404
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
405
+ let timeout = null;
406
+
407
+ // fetch result subscription
408
+ const run = () => {
409
+ if (controller.signal.aborted) return;
410
+ queryFn(args, controller.signal).then(data => {
411
+ if (controller.signal.aborted) return;
412
+ result.next({
413
+ status: "loaded",
414
+ data,
415
+ error: undefined
416
+ });
417
+ }).catch(error => {
418
+ if (controller.signal.aborted) return;
419
+ result.next({
420
+ status: "error",
421
+ data: undefined,
422
+ error
423
+ });
424
+ }).finally(() => {
425
+ if (controller.signal.aborted) return;
426
+ if (refreshInterval) timeout = setTimeout(run, refreshInterval);
427
+ });
428
+ };
429
+ run();
430
+ return () => {
431
+ sub.unsubscribe();
432
+ if (timeout) clearTimeout(timeout);
433
+ controller.abort(new Error("getQuery$ unsubscribed"));
434
+ };
435
+ }).pipe(shareReplay({
436
+ refCount: true,
437
+ bufferSize: 1
438
+ })), serializer);
439
+ };
440
+
441
+ export { BigMath, Deferred, MAX_DECIMALS_FORMAT, REGEX_HEX_STRING, addTrailingSlash, classNames, cn, firstThenDebounce, formatDecimals, formatPrice, getLoadable$, getQuery$, getSharedObservable, hasOwnProperty, isAbortError, isArrayOf, isAscii, isBigInt, isBooleanTrue, isHexString, isNotNil, isPromise, isSubject, isTruthy, keepAlive, planckToTokens, replaySubjectFrom, sleep, splitSubject, throwAfter, tokensToPlanck, validateHexString };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talismn/util",
3
- "version": "0.5.1",
3
+ "version": "0.5.4",
4
4
  "author": "Talisman",
5
5
  "homepage": "https://talisman.xyz",
6
6
  "license": "GPL-3.0-or-later",
@@ -18,21 +18,23 @@
18
18
  "/dist"
19
19
  ],
20
20
  "engines": {
21
- "node": ">=18"
21
+ "node": ">=20"
22
22
  },
23
23
  "dependencies": {
24
24
  "bignumber.js": "^9.1.2",
25
25
  "rxjs": "^7.8.1",
26
- "tailwind-merge": "^2.5.4"
26
+ "tailwind-merge": "^2.5.4",
27
+ "lodash-es": "4.17.21"
27
28
  },
28
29
  "devDependencies": {
29
30
  "@types/jest": "^29.5.14",
31
+ "@types/lodash-es": "4.17.12",
30
32
  "eslint": "^8.57.1",
31
33
  "jest": "^29.7.0",
32
34
  "ts-jest": "^29.2.5",
33
35
  "typescript": "^5.6.3",
34
- "@talismn/tsconfig": "0.0.2",
35
- "@talismn/eslint-config": "0.0.3"
36
+ "@talismn/eslint-config": "0.0.3",
37
+ "@talismn/tsconfig": "0.0.3"
36
38
  },
37
39
  "peerDependencies": {
38
40
  "rxjs": ">= 7.8.1"